hwmon: (gpio-fan) Convert to use devm_ functions
authorGuenter Roeck <linux@roeck-us.net>
Sat, 2 Jun 2012 16:58:07 +0000 (09:58 -0700)
committerGuenter Roeck <linux@roeck-us.net>
Sun, 22 Jul 2012 04:48:41 +0000 (21:48 -0700)
Convert to use devm_ functions to reduce code size and simplify the code.

Cc: Simon Guinot <sguinot@lacie.com>
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
Acked-by: Simon Guinot <sguinot@lacie.com>
drivers/hwmon/gpio-fan.c

index 2ce8c44a0e07b614ed60c1b1b762439e8ebf1f74..b90b3e9617b03e1cf07f34ffdd7671eb2ee707e7 100644 (file)
@@ -95,17 +95,17 @@ static int fan_alarm_init(struct gpio_fan_data *fan_data,
 
        fan_data->alarm = alarm;
 
-       err = gpio_request(alarm->gpio, "GPIO fan alarm");
+       err = devm_gpio_request(&pdev->dev, alarm->gpio, "GPIO fan alarm");
        if (err)
                return err;
 
        err = gpio_direction_input(alarm->gpio);
        if (err)
-               goto err_free_gpio;
+               return err;
 
        err = device_create_file(&pdev->dev, &dev_attr_fan1_alarm);
        if (err)
-               goto err_free_gpio;
+               return err;
 
        /*
         * If the alarm GPIO don't support interrupts, just leave
@@ -117,8 +117,8 @@ static int fan_alarm_init(struct gpio_fan_data *fan_data,
 
        INIT_WORK(&fan_data->alarm_work, fan_alarm_notify);
        irq_set_irq_type(alarm_irq, IRQ_TYPE_EDGE_BOTH);
-       err = request_irq(alarm_irq, fan_alarm_irq_handler, IRQF_SHARED,
-                         "GPIO fan alarm", fan_data);
+       err = devm_request_irq(&pdev->dev, alarm_irq, fan_alarm_irq_handler,
+                              IRQF_SHARED, "GPIO fan alarm", fan_data);
        if (err)
                goto err_free_sysfs;
 
@@ -126,21 +126,14 @@ static int fan_alarm_init(struct gpio_fan_data *fan_data,
 
 err_free_sysfs:
        device_remove_file(&pdev->dev, &dev_attr_fan1_alarm);
-err_free_gpio:
-       gpio_free(alarm->gpio);
-
        return err;
 }
 
 static void fan_alarm_free(struct gpio_fan_data *fan_data)
 {
        struct platform_device *pdev = fan_data->pdev;
-       int alarm_irq = gpio_to_irq(fan_data->alarm->gpio);
 
-       if (alarm_irq >= 0)
-               free_irq(alarm_irq, fan_data);
        device_remove_file(&pdev->dev, &dev_attr_fan1_alarm);
-       gpio_free(fan_data->alarm->gpio);
 }
 
 /*
@@ -365,15 +358,14 @@ static int fan_ctrl_init(struct gpio_fan_data *fan_data,
        int i, err;
 
        for (i = 0; i < num_ctrl; i++) {
-               err = gpio_request(ctrl[i], "GPIO fan control");
+               err = devm_gpio_request(&pdev->dev, ctrl[i],
+                                       "GPIO fan control");
                if (err)
-                       goto err_free_gpio;
+                       return err;
 
                err = gpio_direction_output(ctrl[i], gpio_get_value(ctrl[i]));
-               if (err) {
-                       gpio_free(ctrl[i]);
-                       goto err_free_gpio;
-               }
+               if (err)
+                       return err;
        }
 
        fan_data->num_ctrl = num_ctrl;
@@ -382,32 +374,18 @@ static int fan_ctrl_init(struct gpio_fan_data *fan_data,
        fan_data->speed = pdata->speed;
        fan_data->pwm_enable = true; /* Enable manual fan speed control. */
        fan_data->speed_index = get_fan_speed_index(fan_data);
-       if (fan_data->speed_index < 0) {
-               err = -ENODEV;
-               goto err_free_gpio;
-       }
+       if (fan_data->speed_index < 0)
+               return -ENODEV;
 
        err = sysfs_create_group(&pdev->dev.kobj, &gpio_fan_ctrl_group);
-       if (err)
-               goto err_free_gpio;
-
-       return 0;
-
-err_free_gpio:
-       for (i = i - 1; i >= 0; i--)
-               gpio_free(ctrl[i]);
-
        return err;
 }
 
 static void fan_ctrl_free(struct gpio_fan_data *fan_data)
 {
        struct platform_device *pdev = fan_data->pdev;
-       int i;
 
        sysfs_remove_group(&pdev->dev.kobj, &gpio_fan_ctrl_group);
-       for (i = 0; i < fan_data->num_ctrl; i++)
-               gpio_free(fan_data->ctrl[i]);
 }
 
 /*
@@ -431,7 +409,8 @@ static int __devinit gpio_fan_probe(struct platform_device *pdev)
        if (!pdata)
                return -EINVAL;
 
-       fan_data = kzalloc(sizeof(struct gpio_fan_data), GFP_KERNEL);
+       fan_data = devm_kzalloc(&pdev->dev, sizeof(struct gpio_fan_data),
+                               GFP_KERNEL);
        if (!fan_data)
                return -ENOMEM;
 
@@ -443,7 +422,7 @@ static int __devinit gpio_fan_probe(struct platform_device *pdev)
        if (pdata->alarm) {
                err = fan_alarm_init(fan_data, pdata->alarm);
                if (err)
-                       goto err_free_data;
+                       return err;
        }
 
        /* Configure control GPIOs if available. */
@@ -480,10 +459,6 @@ err_free_ctrl:
 err_free_alarm:
        if (fan_data->alarm)
                fan_alarm_free(fan_data);
-err_free_data:
-       platform_set_drvdata(pdev, NULL);
-       kfree(fan_data);
-
        return err;
 }
 
@@ -497,7 +472,6 @@ static int __devexit gpio_fan_remove(struct platform_device *pdev)
                fan_alarm_free(fan_data);
        if (fan_data->ctrl)
                fan_ctrl_free(fan_data);
-       kfree(fan_data);
 
        return 0;
 }