diff options
author | NeilBrown <neil@brown.name> | 2015-07-29 20:11:24 -0400 |
---|---|---|
committer | Sebastian Reichel <sre@kernel.org> | 2015-08-04 23:10:06 -0400 |
commit | e57c4a67d71275e4a15b9f0f92a322ea27b26a6e (patch) | |
tree | 2ff7e2e870547fc9de5c4a143331357b95e683da /drivers/power | |
parent | b5e578631e5c1d77f58727ea0769dd55c462b572 (diff) |
twl4030_charger: use runtime_pm to keep usb phy active while charging.
The twl4030 usb phy needs to be active while we are using
the USB VBUS as a current source for charging.
In particular, the usb3v1 regulator must be enabled and the
PHY_PWR_PHYPWD bit must be set to keep the phy powered.
commit ab37813f4093a5f59cb8e083cde277289dc72ed3
twl4030_charger: Allow charger to control the regulator that feeds it
gave the charger control over the regulator, but didn't resolve
the PHY_PWR_PHYPWD issue.
Now that both of these are controlled by runtime_pm in
phy-twl4030-usb, we can simply take a runtime_pm reference to the USB
phy whenever the charger wants to use it as a current source.
So this patch reverts the above commit, and adds the necessary
runtime_pm calls.
Acked-by: Lee Jones <lee.jones@linaro.org>
Signed-off-by: NeilBrown <neil@brown.name>
Signed-off-by: Sebastian Reichel <sre@kernel.org>
Diffstat (limited to 'drivers/power')
-rw-r--r-- | drivers/power/twl4030_charger.c | 18 |
1 files changed, 5 insertions, 13 deletions
diff --git a/drivers/power/twl4030_charger.c b/drivers/power/twl4030_charger.c index 709d90dc75f1..fe71c61109f5 100644 --- a/drivers/power/twl4030_charger.c +++ b/drivers/power/twl4030_charger.c | |||
@@ -22,7 +22,6 @@ | |||
22 | #include <linux/power_supply.h> | 22 | #include <linux/power_supply.h> |
23 | #include <linux/notifier.h> | 23 | #include <linux/notifier.h> |
24 | #include <linux/usb/otg.h> | 24 | #include <linux/usb/otg.h> |
25 | #include <linux/regulator/machine.h> | ||
26 | 25 | ||
27 | #define TWL4030_BCIMSTATEC 0x02 | 26 | #define TWL4030_BCIMSTATEC 0x02 |
28 | #define TWL4030_BCIICHG 0x08 | 27 | #define TWL4030_BCIICHG 0x08 |
@@ -94,7 +93,6 @@ struct twl4030_bci { | |||
94 | struct work_struct work; | 93 | struct work_struct work; |
95 | int irq_chg; | 94 | int irq_chg; |
96 | int irq_bci; | 95 | int irq_bci; |
97 | struct regulator *usb_reg; | ||
98 | int usb_enabled; | 96 | int usb_enabled; |
99 | 97 | ||
100 | unsigned long event; | 98 | unsigned long event; |
@@ -208,7 +206,7 @@ static int twl4030_charger_enable_usb(struct twl4030_bci *bci, bool enable) | |||
208 | { | 206 | { |
209 | int ret; | 207 | int ret; |
210 | 208 | ||
211 | if (enable) { | 209 | if (enable && !IS_ERR_OR_NULL(bci->transceiver)) { |
212 | /* Check for USB charger connected */ | 210 | /* Check for USB charger connected */ |
213 | if (!twl4030_bci_have_vbus(bci)) | 211 | if (!twl4030_bci_have_vbus(bci)) |
214 | return -ENODEV; | 212 | return -ENODEV; |
@@ -222,14 +220,9 @@ static int twl4030_charger_enable_usb(struct twl4030_bci *bci, bool enable) | |||
222 | return -EACCES; | 220 | return -EACCES; |
223 | } | 221 | } |
224 | 222 | ||
225 | /* Need to keep regulator on */ | 223 | /* Need to keep phy powered */ |
226 | if (!bci->usb_enabled) { | 224 | if (!bci->usb_enabled) { |
227 | ret = regulator_enable(bci->usb_reg); | 225 | pm_runtime_get_sync(bci->transceiver->dev); |
228 | if (ret) { | ||
229 | dev_err(bci->dev, | ||
230 | "Failed to enable regulator\n"); | ||
231 | return ret; | ||
232 | } | ||
233 | bci->usb_enabled = 1; | 226 | bci->usb_enabled = 1; |
234 | } | 227 | } |
235 | 228 | ||
@@ -244,7 +237,8 @@ static int twl4030_charger_enable_usb(struct twl4030_bci *bci, bool enable) | |||
244 | } else { | 237 | } else { |
245 | ret = twl4030_clear_set_boot_bci(TWL4030_BCIAUTOUSB, 0); | 238 | ret = twl4030_clear_set_boot_bci(TWL4030_BCIAUTOUSB, 0); |
246 | if (bci->usb_enabled) { | 239 | if (bci->usb_enabled) { |
247 | regulator_disable(bci->usb_reg); | 240 | pm_runtime_mark_last_busy(bci->transceiver->dev); |
241 | pm_runtime_put_autosuspend(bci->transceiver->dev); | ||
248 | bci->usb_enabled = 0; | 242 | bci->usb_enabled = 0; |
249 | } | 243 | } |
250 | } | 244 | } |
@@ -609,8 +603,6 @@ static int __init twl4030_bci_probe(struct platform_device *pdev) | |||
609 | return ret; | 603 | return ret; |
610 | } | 604 | } |
611 | 605 | ||
612 | bci->usb_reg = regulator_get(bci->dev, "bci3v1"); | ||
613 | |||
614 | bci->usb = devm_power_supply_register(&pdev->dev, &twl4030_bci_usb_desc, | 606 | bci->usb = devm_power_supply_register(&pdev->dev, &twl4030_bci_usb_desc, |
615 | NULL); | 607 | NULL); |
616 | if (IS_ERR(bci->usb)) { | 608 | if (IS_ERR(bci->usb)) { |