mirror of
https://github.com/torvalds/linux
synced 2024-10-07 20:05:15 +00:00
power: supply: generic-adc-battery: convert to managed resources
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>
This commit is contained in:
parent
27a2195efa
commit
93297ef692
|
@ -23,6 +23,7 @@
|
||||||
#include <linux/iio/consumer.h>
|
#include <linux/iio/consumer.h>
|
||||||
#include <linux/iio/types.h>
|
#include <linux/iio/types.h>
|
||||||
#include <linux/power/generic-adc-battery.h>
|
#include <linux/power/generic-adc-battery.h>
|
||||||
|
#include <linux/devm-helpers.h>
|
||||||
|
|
||||||
#define JITTER_DEFAULT 10 /* hope 10ms is enough */
|
#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
|
* copying the static properties and allocating extra memory for holding
|
||||||
* the extra configurable properties received from platform data.
|
* the extra configurable properties received from platform data.
|
||||||
*/
|
*/
|
||||||
properties = kcalloc(ARRAY_SIZE(gab_props) +
|
properties = devm_kcalloc(&pdev->dev,
|
||||||
ARRAY_SIZE(gab_chan_name),
|
ARRAY_SIZE(gab_props) +
|
||||||
sizeof(*properties),
|
ARRAY_SIZE(gab_chan_name),
|
||||||
GFP_KERNEL);
|
sizeof(*properties),
|
||||||
if (!properties) {
|
GFP_KERNEL);
|
||||||
ret = -ENOMEM;
|
if (!properties)
|
||||||
goto first_mem_fail;
|
return -ENOMEM;
|
||||||
}
|
|
||||||
|
|
||||||
memcpy(properties, gab_props, sizeof(gab_props));
|
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.
|
* based on the channel supported by consumer device.
|
||||||
*/
|
*/
|
||||||
for (chan = 0; chan < ARRAY_SIZE(gab_chan_name); chan++) {
|
for (chan = 0; chan < ARRAY_SIZE(gab_chan_name); chan++) {
|
||||||
adc_bat->channel[chan] = iio_channel_get(&pdev->dev,
|
adc_bat->channel[chan] = devm_iio_channel_get(&pdev->dev, gab_chan_name[chan]);
|
||||||
gab_chan_name[chan]);
|
|
||||||
if (IS_ERR(adc_bat->channel[chan])) {
|
if (IS_ERR(adc_bat->channel[chan])) {
|
||||||
ret = PTR_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;
|
adc_bat->channel[chan] = NULL;
|
||||||
} else {
|
} else if (adc_bat->channel[chan]) {
|
||||||
/* copying properties for supported channels only */
|
/* copying properties for supported channels only */
|
||||||
int index2;
|
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 */
|
/* none of the channels are supported so let's bail out */
|
||||||
if (!any) {
|
if (!any)
|
||||||
ret = -ENODEV;
|
return dev_err_probe(&pdev->dev, -ENODEV, "Failed to get any ADC channel\n");
|
||||||
goto second_mem_fail;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Total number of properties is equal to static properties
|
* 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->properties = properties;
|
||||||
psy_desc->num_properties = index;
|
psy_desc->num_properties = index;
|
||||||
|
|
||||||
adc_bat->psy = power_supply_register(&pdev->dev, psy_desc, &psy_cfg);
|
adc_bat->psy = devm_power_supply_register(&pdev->dev, psy_desc, &psy_cfg);
|
||||||
if (IS_ERR(adc_bat->psy)) {
|
if (IS_ERR(adc_bat->psy))
|
||||||
ret = PTR_ERR(adc_bat->psy);
|
return dev_err_probe(&pdev->dev, PTR_ERR(adc_bat->psy), "Failed to register power-supply device\n");
|
||||||
goto err_reg_fail;
|
|
||||||
}
|
|
||||||
|
|
||||||
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,
|
adc_bat->charge_finished = devm_gpiod_get_optional(&pdev->dev, "charged", GPIOD_IN);
|
||||||
"charged", GPIOD_IN);
|
|
||||||
if (adc_bat->charge_finished) {
|
if (adc_bat->charge_finished) {
|
||||||
int irq;
|
int irq;
|
||||||
|
|
||||||
irq = gpiod_to_irq(adc_bat->charge_finished);
|
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,
|
IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING,
|
||||||
"battery charged", adc_bat);
|
"battery charged", adc_bat);
|
||||||
if (ret < 0)
|
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);
|
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,
|
schedule_delayed_work(&adc_bat->bat_work,
|
||||||
msecs_to_jiffies(0));
|
msecs_to_jiffies(0));
|
||||||
return 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)
|
static int __maybe_unused gab_suspend(struct device *dev)
|
||||||
|
@ -408,7 +374,6 @@ static struct platform_driver gab_driver = {
|
||||||
.pm = &gab_pm_ops,
|
.pm = &gab_pm_ops,
|
||||||
},
|
},
|
||||||
.probe = gab_probe,
|
.probe = gab_probe,
|
||||||
.remove = gab_remove,
|
|
||||||
};
|
};
|
||||||
module_platform_driver(gab_driver);
|
module_platform_driver(gab_driver);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue