diff options
author | Yauhen Kharuzhy <jekhor@gmail.com> | 2019-03-03 15:16:12 -0500 |
---|---|---|
committer | Chanwoo Choi <cw00.choi@samsung.com> | 2019-04-04 21:21:41 -0400 |
commit | 3137301b6d970219706d887eb6bdcabbf54f1f3b (patch) | |
tree | 771dcc93b295d1c7b6d1d2262711e1aa9fee7659 /drivers/extcon/extcon-intel-cht-wc.c | |
parent | 86baf800de84eb89615c138d368b14bff5ee7d8a (diff) |
extcon: intel-cht-wc: Make charger detection co-existed with OTG host mode
Whiskey Cove Cherry Trail PMIC requires disabling OTG host mode before
of charger detection procedure. Do this by manipulationg of CHGRCTRL1
register.
Source: APCI DSDT code of Lenovo Yoga Book YB1-X91L and open-sourced
Intel's drivers.
Signed-off-by: Yauhen Kharuzhy <jekhor@gmail.com>
Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
Tested-by: Hans de Goede <hdegoede@redhat.com>
Signed-off-by: Chanwoo Choi <cw00.choi@samsung.com>
Diffstat (limited to 'drivers/extcon/extcon-intel-cht-wc.c')
-rw-r--r-- | drivers/extcon/extcon-intel-cht-wc.c | 26 |
1 files changed, 25 insertions, 1 deletions
diff --git a/drivers/extcon/extcon-intel-cht-wc.c b/drivers/extcon/extcon-intel-cht-wc.c index 5ef215297101..8d20e913536f 100644 --- a/drivers/extcon/extcon-intel-cht-wc.c +++ b/drivers/extcon/extcon-intel-cht-wc.c | |||
@@ -29,7 +29,15 @@ | |||
29 | #define CHT_WC_CHGRCTRL0_DBPOFF BIT(6) | 29 | #define CHT_WC_CHGRCTRL0_DBPOFF BIT(6) |
30 | #define CHT_WC_CHGRCTRL0_CHR_WDT_NOKICK BIT(7) | 30 | #define CHT_WC_CHGRCTRL0_CHR_WDT_NOKICK BIT(7) |
31 | 31 | ||
32 | #define CHT_WC_CHGRCTRL1 0x5e17 | 32 | #define CHT_WC_CHGRCTRL1 0x5e17 |
33 | #define CHT_WC_CHGRCTRL1_FUSB_INLMT_100 BIT(0) | ||
34 | #define CHT_WC_CHGRCTRL1_FUSB_INLMT_150 BIT(1) | ||
35 | #define CHT_WC_CHGRCTRL1_FUSB_INLMT_500 BIT(2) | ||
36 | #define CHT_WC_CHGRCTRL1_FUSB_INLMT_900 BIT(3) | ||
37 | #define CHT_WC_CHGRCTRL1_FUSB_INLMT_1500 BIT(4) | ||
38 | #define CHT_WC_CHGRCTRL1_FTEMP_EVENT BIT(5) | ||
39 | #define CHT_WC_CHGRCTRL1_OTGMODE BIT(6) | ||
40 | #define CHT_WC_CHGRCTRL1_DBPEN BIT(7) | ||
33 | 41 | ||
34 | #define CHT_WC_USBSRC 0x5e29 | 42 | #define CHT_WC_USBSRC 0x5e29 |
35 | #define CHT_WC_USBSRC_STS_MASK GENMASK(1, 0) | 43 | #define CHT_WC_USBSRC_STS_MASK GENMASK(1, 0) |
@@ -198,6 +206,18 @@ static void cht_wc_extcon_set_5v_boost(struct cht_wc_extcon_data *ext, | |||
198 | dev_err(ext->dev, "Error writing Vbus GPIO CTLO: %d\n", ret); | 206 | dev_err(ext->dev, "Error writing Vbus GPIO CTLO: %d\n", ret); |
199 | } | 207 | } |
200 | 208 | ||
209 | static void cht_wc_extcon_set_otgmode(struct cht_wc_extcon_data *ext, | ||
210 | bool enable) | ||
211 | { | ||
212 | unsigned int val = enable ? CHT_WC_CHGRCTRL1_OTGMODE : 0; | ||
213 | int ret; | ||
214 | |||
215 | ret = regmap_update_bits(ext->regmap, CHT_WC_CHGRCTRL1, | ||
216 | CHT_WC_CHGRCTRL1_OTGMODE, val); | ||
217 | if (ret) | ||
218 | dev_err(ext->dev, "Error updating CHGRCTRL1 reg: %d\n", ret); | ||
219 | } | ||
220 | |||
201 | /* Small helper to sync EXTCON_CHG_USB_SDP and EXTCON_USB state */ | 221 | /* Small helper to sync EXTCON_CHG_USB_SDP and EXTCON_USB state */ |
202 | static void cht_wc_extcon_set_state(struct cht_wc_extcon_data *ext, | 222 | static void cht_wc_extcon_set_state(struct cht_wc_extcon_data *ext, |
203 | unsigned int cable, bool state) | 223 | unsigned int cable, bool state) |
@@ -222,10 +242,14 @@ static void cht_wc_extcon_pwrsrc_event(struct cht_wc_extcon_data *ext) | |||
222 | 242 | ||
223 | id = cht_wc_extcon_get_id(ext, pwrsrc_sts); | 243 | id = cht_wc_extcon_get_id(ext, pwrsrc_sts); |
224 | if (id == USB_ID_GND) { | 244 | if (id == USB_ID_GND) { |
245 | cht_wc_extcon_set_otgmode(ext, true); | ||
246 | |||
225 | /* The 5v boost causes a false VBUS / SDP detect, skip */ | 247 | /* The 5v boost causes a false VBUS / SDP detect, skip */ |
226 | goto charger_det_done; | 248 | goto charger_det_done; |
227 | } | 249 | } |
228 | 250 | ||
251 | cht_wc_extcon_set_otgmode(ext, false); | ||
252 | |||
229 | /* Plugged into a host/charger or not connected? */ | 253 | /* Plugged into a host/charger or not connected? */ |
230 | if (!(pwrsrc_sts & CHT_WC_PWRSRC_VBUS)) { | 254 | if (!(pwrsrc_sts & CHT_WC_PWRSRC_VBUS)) { |
231 | /* Route D+ and D- to PMIC for future charger detection */ | 255 | /* Route D+ and D- to PMIC for future charger detection */ |