From: Nikita Travkin <nikitos...@gmail.com>

In it's curent state this driver ignores OTG adapters with ID pin
connected to ground. This commit adds a check to set extcon into
host mode when such OTG adapter is connected.

Signed-off-by: Nikita Travkin <nikitos...@gmail.com>

---

This issue was already reported in [1] and this behaviour appears
for both Samsung Galaxy A5 (2015) mentioned there and A3 that I was
working on. This patch allows OTG detection on A3.

[1]: https://lore.kernel.org/lkml/20191011145015.ga127...@gerhold.net/
---
 drivers/extcon/extcon-sm5502.c | 22 ++++++++++++++++++++--
 1 file changed, 20 insertions(+), 2 deletions(-)

diff --git a/drivers/extcon/extcon-sm5502.c b/drivers/extcon/extcon-sm5502.c
index 106d4da647bd..db41d1c58efd 100644
--- a/drivers/extcon/extcon-sm5502.c
+++ b/drivers/extcon/extcon-sm5502.c
@@ -144,6 +144,7 @@ enum sm5502_muic_acc_type {
        SM5502_MUIC_ADC_AUDIO_TYPE1_FULL_REMOTE = 0x3e, /* |      001|11110| */
        SM5502_MUIC_ADC_AUDIO_TYPE1_SEND_END = 0x5e,    /* |      010|11110| */
                                                        /* |Dev Type1|--ADC| */
+       SM5502_MUIC_ADC_GROUND_USB_OTG = 0x80,          /* |      100|00000| */
        SM5502_MUIC_ADC_OPEN_USB = 0x5f,                /* |      010|11111| */
        SM5502_MUIC_ADC_OPEN_TA = 0xdf,                 /* |      110|11111| */
        SM5502_MUIC_ADC_OPEN_USB_OTG = 0xff,            /* |      111|11111| */
@@ -291,11 +292,27 @@ static unsigned int sm5502_muic_get_cable_type(struct 
sm5502_muic_info *info)
         * connected with to MUIC device.
         */
        cable_type = adc & SM5502_REG_ADC_MASK;
-       if (cable_type == SM5502_MUIC_ADC_GROUND)
-               return SM5502_MUIC_ADC_GROUND;
 
        switch (cable_type) {
        case SM5502_MUIC_ADC_GROUND:
+               ret = regmap_read(info->regmap, SM5502_REG_DEV_TYPE1,
+                                 &dev_type1);
+               if (ret) {
+                       dev_err(info->dev, "failed to read DEV_TYPE1 reg\n");
+                       return ret;
+               }
+
+               switch (dev_type1) {
+               case SM5502_REG_DEV_TYPE1_USB_OTG_MASK:
+                       cable_type = SM5502_MUIC_ADC_GROUND_USB_OTG;
+                       break;
+               default:
+                       dev_dbg(info->dev,
+                               "cannot identify the cable type: adc(0x%x), 
dev_type1(0x%x)\n",
+                               adc, dev_type1);
+                       return -EINVAL;
+               }
+               break;
        case SM5502_MUIC_ADC_SEND_END_BUTTON:
        case SM5502_MUIC_ADC_REMOTE_S1_BUTTON:
        case SM5502_MUIC_ADC_REMOTE_S2_BUTTON:
@@ -396,6 +413,7 @@ static int sm5502_muic_cable_handler(struct 
sm5502_muic_info *info,
                con_sw  = DM_DP_SWITCH_OPEN;
                vbus_sw = VBUSIN_SWITCH_VBUSOUT;
                break;
+       case SM5502_MUIC_ADC_GROUND_USB_OTG:
        case SM5502_MUIC_ADC_OPEN_USB_OTG:
                id      = EXTCON_USB_HOST;
                con_sw  = DM_DP_SWITCH_USB;
-- 
2.25.1

Reply via email to