]> git.dujemihanovic.xyz Git - linux.git/commitdiff
power: supply: generic-adc-battery: convert to managed resources
authorSebastian Reichel <sre@kernel.org>
Fri, 17 Mar 2023 22:56:56 +0000 (23:56 +0100)
committerSebastian Reichel <sre@kernel.org>
Wed, 29 Mar 2023 20:38:56 +0000 (22:38 +0200)
Convert driver to use managed resources to simplify driver code.

Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
Reviewed-by: Matti Vaittinen <mazziesaccount@gmail.com>
Signed-off-by: Sebastian Reichel <sre@kernel.org>
drivers/power/supply/generic-adc-battery.c

index 66039c665dd1e9113a290bfa350daf9b40951eb6..917bd2a6cc5204afa6aebc4e43f1211c20ea0a02 100644 (file)
@@ -23,6 +23,7 @@
 #include <linux/iio/consumer.h>
 #include <linux/iio/types.h>
 #include <linux/power/generic-adc-battery.h>
+#include <linux/devm-helpers.h>
 
 #define JITTER_DEFAULT 10 /* hope 10ms is enough */
 
@@ -266,14 +267,13 @@ static int gab_probe(struct platform_device *pdev)
         * copying the static properties and allocating extra memory for holding
         * the extra configurable properties received from platform data.
         */
-       properties = kcalloc(ARRAY_SIZE(gab_props) +
-                            ARRAY_SIZE(gab_chan_name),
-                            sizeof(*properties),
-                            GFP_KERNEL);
-       if (!properties) {
-               ret = -ENOMEM;
-               goto first_mem_fail;
-       }
+       properties = devm_kcalloc(&pdev->dev,
+                                 ARRAY_SIZE(gab_props) +
+                                 ARRAY_SIZE(gab_chan_name),
+                                 sizeof(*properties),
+                                 GFP_KERNEL);
+       if (!properties)
+               return -ENOMEM;
 
        memcpy(properties, gab_props, sizeof(gab_props));
 
@@ -282,12 +282,13 @@ static int gab_probe(struct platform_device *pdev)
         * based on the channel supported by consumer device.
         */
        for (chan = 0; chan < ARRAY_SIZE(gab_chan_name); chan++) {
-               adc_bat->channel[chan] = iio_channel_get(&pdev->dev,
-                                                        gab_chan_name[chan]);
+               adc_bat->channel[chan] = devm_iio_channel_get(&pdev->dev, gab_chan_name[chan]);
                if (IS_ERR(adc_bat->channel[chan])) {
                        ret = PTR_ERR(adc_bat->channel[chan]);
+                       if (ret != -ENODEV)
+                               return dev_err_probe(&pdev->dev, ret, "Failed to get ADC channel %s\n", gab_chan_name[chan]);
                        adc_bat->channel[chan] = NULL;
-               } else {
+               } else if (adc_bat->channel[chan]) {
                        /* copying properties for supported channels only */
                        int index2;
 
@@ -302,10 +303,8 @@ static int gab_probe(struct platform_device *pdev)
        }
 
        /* none of the channels are supported so let's bail out */
-       if (!any) {
-               ret = -ENODEV;
-               goto second_mem_fail;
-       }
+       if (!any)
+               return dev_err_probe(&pdev->dev, -ENODEV, "Failed to get any ADC channel\n");
 
        /*
         * Total number of properties is equal to static properties
@@ -316,25 +315,24 @@ static int gab_probe(struct platform_device *pdev)
        psy_desc->properties = properties;
        psy_desc->num_properties = index;
 
-       adc_bat->psy = power_supply_register(&pdev->dev, psy_desc, &psy_cfg);
-       if (IS_ERR(adc_bat->psy)) {
-               ret = PTR_ERR(adc_bat->psy);
-               goto err_reg_fail;
-       }
+       adc_bat->psy = devm_power_supply_register(&pdev->dev, psy_desc, &psy_cfg);
+       if (IS_ERR(adc_bat->psy))
+               return dev_err_probe(&pdev->dev, PTR_ERR(adc_bat->psy), "Failed to register power-supply device\n");
 
-       INIT_DELAYED_WORK(&adc_bat->bat_work, gab_work);
+       ret = devm_delayed_work_autocancel(&pdev->dev, &adc_bat->bat_work, gab_work);
+       if (ret)
+               return dev_err_probe(&pdev->dev, ret, "Failed to register delayed work\n");
 
-       adc_bat->charge_finished = devm_gpiod_get_optional(&pdev->dev,
-                                                          "charged", GPIOD_IN);
+       adc_bat->charge_finished = devm_gpiod_get_optional(&pdev->dev, "charged", GPIOD_IN);
        if (adc_bat->charge_finished) {
                int irq;
 
                irq = gpiod_to_irq(adc_bat->charge_finished);
-               ret = request_any_context_irq(irq, gab_charged,
+               ret = devm_request_any_context_irq(&pdev->dev, irq, gab_charged,
                                IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING,
                                "battery charged", adc_bat);
                if (ret < 0)
-                       goto gpio_req_fail;
+                       return dev_err_probe(&pdev->dev, ret, "Failed to register irq\n");
        }
 
        platform_set_drvdata(pdev, adc_bat);
@@ -343,38 +341,6 @@ static int gab_probe(struct platform_device *pdev)
        schedule_delayed_work(&adc_bat->bat_work,
                        msecs_to_jiffies(0));
        return 0;
-
-gpio_req_fail:
-       power_supply_unregister(adc_bat->psy);
-err_reg_fail:
-       for (chan = 0; chan < ARRAY_SIZE(gab_chan_name); chan++) {
-               if (adc_bat->channel[chan])
-                       iio_channel_release(adc_bat->channel[chan]);
-       }
-second_mem_fail:
-       kfree(properties);
-first_mem_fail:
-       return ret;
-}
-
-static int gab_remove(struct platform_device *pdev)
-{
-       int chan;
-       struct gab *adc_bat = platform_get_drvdata(pdev);
-
-       power_supply_unregister(adc_bat->psy);
-
-       if (adc_bat->charge_finished)
-               free_irq(gpiod_to_irq(adc_bat->charge_finished), adc_bat);
-
-       for (chan = 0; chan < ARRAY_SIZE(gab_chan_name); chan++) {
-               if (adc_bat->channel[chan])
-                       iio_channel_release(adc_bat->channel[chan]);
-       }
-
-       kfree(adc_bat->psy_desc.properties);
-       cancel_delayed_work_sync(&adc_bat->bat_work);
-       return 0;
 }
 
 static int __maybe_unused gab_suspend(struct device *dev)
@@ -408,7 +374,6 @@ static struct platform_driver gab_driver = {
                .pm     = &gab_pm_ops,
        },
        .probe          = gab_probe,
-       .remove         = gab_remove,
 };
 module_platform_driver(gab_driver);