mmc: sdhci-pci: Convert to use managed functions pcim_* and devm_*

This makes the error handling much more simpler than open-coding everything
and in addition makes the probe function smaller an tidier.

Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Acked-by: Adrian Hunter <adrian.hunter@intel.com>
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
This commit is contained in:
Andy Shevchenko 2016-07-09 16:41:43 +03:00 коммит произвёл Ulf Hansson
Родитель 6825a60658
Коммит 52ac7acf41
1 изменённых файлов: 11 добавлений и 31 удалений

Просмотреть файл

@ -1811,15 +1811,13 @@ static int sdhci_pci_probe(struct pci_dev *pdev,
return -ENODEV; return -ENODEV;
} }
ret = pci_enable_device(pdev); ret = pcim_enable_device(pdev);
if (ret) if (ret)
return ret; return ret;
chip = kzalloc(sizeof(struct sdhci_pci_chip), GFP_KERNEL); chip = devm_kzalloc(&pdev->dev, sizeof(*chip), GFP_KERNEL);
if (!chip) { if (!chip)
ret = -ENOMEM; return -ENOMEM;
goto err;
}
chip->pdev = pdev; chip->pdev = pdev;
chip->fixes = (const struct sdhci_pci_fixes *)ent->driver_data; chip->fixes = (const struct sdhci_pci_fixes *)ent->driver_data;
@ -1835,7 +1833,7 @@ static int sdhci_pci_probe(struct pci_dev *pdev,
if (chip->fixes && chip->fixes->probe) { if (chip->fixes && chip->fixes->probe) {
ret = chip->fixes->probe(chip); ret = chip->fixes->probe(chip);
if (ret) if (ret)
goto free; return ret;
} }
slots = chip->num_slots; /* Quirk may have changed this */ slots = chip->num_slots; /* Quirk may have changed this */
@ -1845,8 +1843,7 @@ static int sdhci_pci_probe(struct pci_dev *pdev,
if (IS_ERR(slot)) { if (IS_ERR(slot)) {
for (i--; i >= 0; i--) for (i--; i >= 0; i--)
sdhci_pci_remove_slot(chip->slots[i]); sdhci_pci_remove_slot(chip->slots[i]);
ret = PTR_ERR(slot); return PTR_ERR(slot);
goto free;
} }
chip->slots[i] = slot; chip->slots[i] = slot;
@ -1856,35 +1853,18 @@ static int sdhci_pci_probe(struct pci_dev *pdev,
sdhci_pci_runtime_pm_allow(&pdev->dev); sdhci_pci_runtime_pm_allow(&pdev->dev);
return 0; return 0;
free:
pci_set_drvdata(pdev, NULL);
kfree(chip);
err:
pci_disable_device(pdev);
return ret;
} }
static void sdhci_pci_remove(struct pci_dev *pdev) static void sdhci_pci_remove(struct pci_dev *pdev)
{ {
int i; int i;
struct sdhci_pci_chip *chip; struct sdhci_pci_chip *chip = pci_get_drvdata(pdev);
chip = pci_get_drvdata(pdev); if (chip->allow_runtime_pm)
sdhci_pci_runtime_pm_forbid(&pdev->dev);
if (chip) { for (i = 0; i < chip->num_slots; i++)
if (chip->allow_runtime_pm) sdhci_pci_remove_slot(chip->slots[i]);
sdhci_pci_runtime_pm_forbid(&pdev->dev);
for (i = 0; i < chip->num_slots; i++)
sdhci_pci_remove_slot(chip->slots[i]);
pci_set_drvdata(pdev, NULL);
kfree(chip);
}
pci_disable_device(pdev);
} }
static struct pci_driver sdhci_driver = { static struct pci_driver sdhci_driver = {