diff options
-rw-r--r-- | drivers/power/supply/gpio-charger.c | 43 |
1 files changed, 7 insertions, 36 deletions
diff --git a/drivers/power/supply/gpio-charger.c b/drivers/power/supply/gpio-charger.c index 001731e88718..666abc23e2ee 100644 --- a/drivers/power/supply/gpio-charger.c +++ b/drivers/power/supply/gpio-charger.c | |||
@@ -35,7 +35,6 @@ struct gpio_charger { | |||
35 | struct power_supply *charger; | 35 | struct power_supply *charger; |
36 | struct power_supply_desc charger_desc; | 36 | struct power_supply_desc charger_desc; |
37 | struct gpio_desc *gpiod; | 37 | struct gpio_desc *gpiod; |
38 | bool legacy_gpio_requested; | ||
39 | }; | 38 | }; |
40 | 39 | ||
41 | static irqreturn_t gpio_charger_irq(int irq, void *devid) | 40 | static irqreturn_t gpio_charger_irq(int irq, void *devid) |
@@ -159,19 +158,13 @@ static int gpio_charger_probe(struct platform_device *pdev) | |||
159 | dev_err(&pdev->dev, "Invalid gpio pin in pdata\n"); | 158 | dev_err(&pdev->dev, "Invalid gpio pin in pdata\n"); |
160 | return -EINVAL; | 159 | return -EINVAL; |
161 | } | 160 | } |
162 | ret = gpio_request(pdata->gpio, dev_name(&pdev->dev)); | 161 | ret = devm_gpio_request_one(&pdev->dev, pdata->gpio, GPIOF_IN, |
162 | dev_name(&pdev->dev)); | ||
163 | if (ret) { | 163 | if (ret) { |
164 | dev_err(&pdev->dev, "Failed to request gpio pin: %d\n", | 164 | dev_err(&pdev->dev, "Failed to request gpio pin: %d\n", |
165 | ret); | 165 | ret); |
166 | return ret; | 166 | return ret; |
167 | } | 167 | } |
168 | gpio_charger->legacy_gpio_requested = true; | ||
169 | ret = gpio_direction_input(pdata->gpio); | ||
170 | if (ret) { | ||
171 | dev_err(&pdev->dev, "Failed to set gpio to input: %d\n", | ||
172 | ret); | ||
173 | goto err_gpio_free; | ||
174 | } | ||
175 | /* Then convert this to gpiod for now */ | 168 | /* Then convert this to gpiod for now */ |
176 | gpio_charger->gpiod = gpio_to_desc(pdata->gpio); | 169 | gpio_charger->gpiod = gpio_to_desc(pdata->gpio); |
177 | } else if (IS_ERR(gpio_charger->gpiod)) { | 170 | } else if (IS_ERR(gpio_charger->gpiod)) { |
@@ -195,20 +188,19 @@ static int gpio_charger_probe(struct platform_device *pdev) | |||
195 | psy_cfg.of_node = pdev->dev.of_node; | 188 | psy_cfg.of_node = pdev->dev.of_node; |
196 | psy_cfg.drv_data = gpio_charger; | 189 | psy_cfg.drv_data = gpio_charger; |
197 | 190 | ||
198 | gpio_charger->pdata = pdata; | 191 | gpio_charger->charger = devm_power_supply_register(&pdev->dev, |
199 | 192 | charger_desc, &psy_cfg); | |
200 | gpio_charger->charger = power_supply_register(&pdev->dev, | ||
201 | charger_desc, &psy_cfg); | ||
202 | if (IS_ERR(gpio_charger->charger)) { | 193 | if (IS_ERR(gpio_charger->charger)) { |
203 | ret = PTR_ERR(gpio_charger->charger); | 194 | ret = PTR_ERR(gpio_charger->charger); |
204 | dev_err(&pdev->dev, "Failed to register power supply: %d\n", | 195 | dev_err(&pdev->dev, "Failed to register power supply: %d\n", |
205 | ret); | 196 | ret); |
206 | goto err_gpio_free; | 197 | return ret; |
207 | } | 198 | } |
208 | 199 | ||
209 | irq = gpiod_to_irq(gpio_charger->gpiod); | 200 | irq = gpiod_to_irq(gpio_charger->gpiod); |
210 | if (irq > 0) { | 201 | if (irq > 0) { |
211 | ret = request_any_context_irq(irq, gpio_charger_irq, | 202 | ret = devm_request_any_context_irq(&pdev->dev, irq, |
203 | gpio_charger_irq, | ||
212 | IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING, | 204 | IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING, |
213 | dev_name(&pdev->dev), gpio_charger->charger); | 205 | dev_name(&pdev->dev), gpio_charger->charger); |
214 | if (ret < 0) | 206 | if (ret < 0) |
@@ -222,26 +214,6 @@ static int gpio_charger_probe(struct platform_device *pdev) | |||
222 | device_init_wakeup(&pdev->dev, 1); | 214 | device_init_wakeup(&pdev->dev, 1); |
223 | 215 | ||
224 | return 0; | 216 | return 0; |
225 | |||
226 | err_gpio_free: | ||
227 | if (gpio_charger->legacy_gpio_requested) | ||
228 | gpio_free(pdata->gpio); | ||
229 | return ret; | ||
230 | } | ||
231 | |||
232 | static int gpio_charger_remove(struct platform_device *pdev) | ||
233 | { | ||
234 | struct gpio_charger *gpio_charger = platform_get_drvdata(pdev); | ||
235 | |||
236 | if (gpio_charger->irq) | ||
237 | free_irq(gpio_charger->irq, gpio_charger->charger); | ||
238 | |||
239 | power_supply_unregister(gpio_charger->charger); | ||
240 | |||
241 | if (gpio_charger->legacy_gpio_requested) | ||
242 | gpio_free(gpio_charger->pdata->gpio); | ||
243 | |||
244 | return 0; | ||
245 | } | 217 | } |
246 | 218 | ||
247 | #ifdef CONFIG_PM_SLEEP | 219 | #ifdef CONFIG_PM_SLEEP |
@@ -280,7 +252,6 @@ MODULE_DEVICE_TABLE(of, gpio_charger_match); | |||
280 | 252 | ||
281 | static struct platform_driver gpio_charger_driver = { | 253 | static struct platform_driver gpio_charger_driver = { |
282 | .probe = gpio_charger_probe, | 254 | .probe = gpio_charger_probe, |
283 | .remove = gpio_charger_remove, | ||
284 | .driver = { | 255 | .driver = { |
285 | .name = "gpio-charger", | 256 | .name = "gpio-charger", |
286 | .pm = &gpio_charger_pm_ops, | 257 | .pm = &gpio_charger_pm_ops, |