platform/x86: intel_ips: Simplify error handling via devres API

Use devm_ and pcim_ functions to make error handling
simpler and code smaller and tidier.

Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
This commit is contained in:
Andy Shevchenko 2017-01-26 17:16:26 +02:00
Родитель 687d25a2ba
Коммит f5b33d94c1
1 изменённых файлов: 15 добавлений и 47 удалений

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

@ -296,7 +296,7 @@ static struct ips_mcp_limits ips_ulv_limits = {
struct ips_driver {
struct pci_dev *dev;
void *regmap;
void __iomem *regmap;
struct task_struct *monitor;
struct task_struct *adjust;
struct dentry *debug_root;
@ -1517,62 +1517,45 @@ static int ips_probe(struct pci_dev *dev, const struct pci_device_id *id)
if (dmi_check_system(ips_blacklist))
return -ENODEV;
ips = kzalloc(sizeof(struct ips_driver), GFP_KERNEL);
ips = devm_kzalloc(&dev->dev, sizeof(*ips), GFP_KERNEL);
if (!ips)
return -ENOMEM;
pci_set_drvdata(dev, ips);
spin_lock_init(&ips->turbo_status_lock);
ips->dev = dev;
ips->limits = ips_detect_cpu(ips);
if (!ips->limits) {
dev_info(&dev->dev, "IPS not supported on this CPU\n");
ret = -ENXIO;
goto error_free;
return -ENXIO;
}
spin_lock_init(&ips->turbo_status_lock);
ret = pci_enable_device(dev);
ret = pcim_enable_device(dev);
if (ret) {
dev_err(&dev->dev, "can't enable PCI device, aborting\n");
goto error_free;
return ret;
}
if (!pci_resource_start(dev, 0)) {
dev_err(&dev->dev, "TBAR not assigned, aborting\n");
ret = -ENXIO;
goto error_free;
}
ret = pci_request_regions(dev, "ips thermal sensor");
ret = pcim_iomap_regions(dev, 1 << 0, pci_name(dev));
if (ret) {
dev_err(&dev->dev, "thermal resource busy, aborting\n");
goto error_free;
}
ips->regmap = ioremap(pci_resource_start(dev, 0),
pci_resource_len(dev, 0));
if (!ips->regmap) {
dev_err(&dev->dev, "failed to map thermal regs, aborting\n");
ret = -EBUSY;
goto error_release;
return ret;
}
ips->regmap = pcim_iomap_table(dev)[0];
pci_set_drvdata(dev, ips);
tse = thm_readb(THM_TSE);
if (tse != TSE_EN) {
dev_err(&dev->dev, "thermal device not enabled (0x%02x), aborting\n", tse);
ret = -ENXIO;
goto error_unmap;
return -ENXIO;
}
trc = thm_readw(THM_TRC);
trc_required_mask = TRC_CORE1_EN | TRC_CORE_PWR | TRC_MCH_EN;
if ((trc & trc_required_mask) != trc_required_mask) {
dev_err(&dev->dev, "thermal reporting for required devices not enabled, aborting\n");
ret = -ENXIO;
goto error_unmap;
return -ENXIO;
}
if (trc & TRC_CORE2_EN)
@ -1602,8 +1585,7 @@ static int ips_probe(struct pci_dev *dev, const struct pci_device_id *id)
rdmsrl(PLATFORM_INFO, platform_info);
if (!(platform_info & PLATFORM_TDP)) {
dev_err(&dev->dev, "platform indicates TDP override unavailable, aborting\n");
ret = -ENODEV;
goto error_unmap;
return -ENODEV;
}
/*
@ -1615,7 +1597,7 @@ static int ips_probe(struct pci_dev *dev, const struct pci_device_id *id)
ips);
if (ret) {
dev_err(&dev->dev, "request irq failed, aborting\n");
goto error_unmap;
return ret;
}
/* Enable aux, hot & critical interrupts */
@ -1673,12 +1655,6 @@ error_thread_cleanup:
kthread_stop(ips->adjust);
error_free_irq:
free_irq(ips->dev->irq, ips);
error_unmap:
iounmap(ips->regmap);
error_release:
pci_release_regions(dev);
error_free:
kfree(ips);
return ret;
}
@ -1714,22 +1690,14 @@ static void ips_remove(struct pci_dev *dev)
kthread_stop(ips->adjust);
if (ips->monitor)
kthread_stop(ips->monitor);
iounmap(ips->regmap);
pci_release_regions(dev);
kfree(ips);
dev_dbg(&dev->dev, "IPS driver removed\n");
}
static void ips_shutdown(struct pci_dev *dev)
{
}
static struct pci_driver ips_pci_driver = {
.name = "intel ips",
.id_table = ips_id_table,
.probe = ips_probe,
.remove = ips_remove,
.shutdown = ips_shutdown,
};
module_pci_driver(ips_pci_driver);