summaryrefslogtreecommitdiffstats
path: root/drivers/extcon/extcon-intel-cht-wc.c
diff options
context:
space:
mode:
authorYauhen Kharuzhy <jekhor@gmail.com>2019-03-03 15:16:12 -0500
committerChanwoo Choi <cw00.choi@samsung.com>2019-04-04 21:21:41 -0400
commit3137301b6d970219706d887eb6bdcabbf54f1f3b (patch)
tree771dcc93b295d1c7b6d1d2262711e1aa9fee7659 /drivers/extcon/extcon-intel-cht-wc.c
parent86baf800de84eb89615c138d368b14bff5ee7d8a (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.c26
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
209static 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 */
202static void cht_wc_extcon_set_state(struct cht_wc_extcon_data *ext, 222static 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 */