diff options
Diffstat (limited to 'drivers/hwmon')
-rw-r--r-- | drivers/hwmon/smsc47m1.c | 45 |
1 files changed, 11 insertions, 34 deletions
diff --git a/drivers/hwmon/smsc47m1.c b/drivers/hwmon/smsc47m1.c index b5aa38d..dba0c56 100644 --- a/drivers/hwmon/smsc47m1.c +++ b/drivers/hwmon/smsc47m1.c @@ -584,18 +584,17 @@ static void smsc47m1_restore(const struct smsc47m1_sio_data *sio_data) #define CHECK 1 #define REQUEST 2 -#define RELEASE 3 /* * This function can be used to: * - test for resource conflicts with ACPI * - request the resources - * - release the resources * We only allocate the I/O ports we really need, to minimize the risk of * conflicts with ACPI or with other drivers. */ -static int smsc47m1_handle_resources(unsigned short address, enum chips type, - int action, struct device *dev) +static int __init smsc47m1_handle_resources(unsigned short address, + enum chips type, int action, + struct device *dev) { static const u8 ports_m1[] = { /* register, region length */ @@ -642,21 +641,13 @@ static int smsc47m1_handle_resources(unsigned short address, enum chips type, break; case REQUEST: /* Request the resources */ - if (!request_region(start, len, DRVNAME)) { - dev_err(dev, "Region 0x%hx-0x%hx already in " - "use!\n", start, start + len); - - /* Undo all requests */ - for (i -= 2; i >= 0; i -= 2) - release_region(address + ports[i], - ports[i + 1]); + if (!devm_request_region(dev, start, len, DRVNAME)) { + dev_err(dev, + "Region 0x%hx-0x%hx already in use!\n", + start, start + len); return -EBUSY; } break; - case RELEASE: - /* Release the resources */ - release_region(start, len); - break; } } @@ -694,11 +685,9 @@ static int __init smsc47m1_probe(struct platform_device *pdev) if (err < 0) return err; - data = kzalloc(sizeof(struct smsc47m1_data), GFP_KERNEL); - if (!data) { - err = -ENOMEM; - goto error_release; - } + data = devm_kzalloc(dev, sizeof(struct smsc47m1_data), GFP_KERNEL); + if (!data) + return -ENOMEM; data->addr = res->start; data->type = sio_data->type; @@ -733,8 +722,7 @@ static int __init smsc47m1_probe(struct platform_device *pdev) } if (!(fan1 || fan2 || fan3 || pwm1 || pwm2 || pwm3)) { dev_warn(dev, "Device not configured, will not use\n"); - err = -ENODEV; - goto error_free; + return -ENODEV; } /* @@ -810,27 +798,16 @@ static int __init smsc47m1_probe(struct platform_device *pdev) error_remove_files: smsc47m1_remove_files(dev); -error_free: - platform_set_drvdata(pdev, NULL); - kfree(data); -error_release: - smsc47m1_handle_resources(res->start, sio_data->type, RELEASE, dev); return err; } static int __exit smsc47m1_remove(struct platform_device *pdev) { struct smsc47m1_data *data = platform_get_drvdata(pdev); - struct resource *res; hwmon_device_unregister(data->hwmon_dev); smsc47m1_remove_files(&pdev->dev); - res = platform_get_resource(pdev, IORESOURCE_IO, 0); - smsc47m1_handle_resources(res->start, data->type, RELEASE, &pdev->dev); - platform_set_drvdata(pdev, NULL); - kfree(data); - return 0; } |