mfd: TWL6030: USBOTG VBUS event generation on
authorHema HK <hemahk@ti.com>
Fri, 10 Dec 2010 12:25:37 +0000 (17:55 +0530)
committerFelipe Balbi <balbi@ti.com>
Fri, 10 Dec 2010 12:43:06 +0000 (14:43 +0200)
With TWL6030-usb, VBUS SESS_VLD and SESS_END events are not generated
as expected. When these interrupts are enabled, charger VBUS detection
interrupt does not get generated. So USBOTG has to be dependent on charger
VBUS interrupts.
So added one bit for USBOTG and changed the handler to call the
USBOTG handler whenever there is a charger VBUS interrpt.

VBUS SESS_VLD and SESS_END event generation issue is under debug with
HW team. This fix might not be required once after fixing the issue.

Signed-off-by: Balaji TK <balajitk@ti.com>
Signed-off-by: Hema HK <hemahk@ti.com>
Cc: Samuel Ortiz <sameo@linux.intel.com>
Signed-off-by: Felipe Balbi <balbi@ti.com>
drivers/mfd/twl6030-irq.c

index aaedb11..06c8955 100644 (file)
@@ -74,7 +74,7 @@ static int twl6030_interrupt_mapping[24] = {
        USBOTG_INTR_OFFSET,     /* Bit 16       ID_WKUP                 */
        USBOTG_INTR_OFFSET,     /* Bit 17       VBUS_WKUP               */
        USBOTG_INTR_OFFSET,     /* Bit 18       ID                      */
-       USBOTG_INTR_OFFSET,     /* Bit 19       VBUS                    */
+       USB_PRES_INTR_OFFSET,   /* Bit 19       VBUS                    */
        CHARGER_INTR_OFFSET,    /* Bit 20       CHRG_CTRL               */
        CHARGER_INTR_OFFSET,    /* Bit 21       EXT_CHRG                */
        CHARGER_INTR_OFFSET,    /* Bit 22       INT_CHRG                */
@@ -128,6 +128,13 @@ static int twl6030_irq_thread(void *data)
 
                sts.bytes[3] = 0; /* Only 24 bits are valid*/
 
+               /*
+                * Since VBUS status bit is not reliable for VBUS disconnect
+                * use CHARGER VBUS detection status bit instead.
+                */
+               if (sts.bytes[2] & 0x10)
+                       sts.bytes[2] |= 0x08;
+
                for (i = 0; sts.int_sts; sts.int_sts >>= 1, i++) {
                        local_irq_disable();
                        if (sts.int_sts & 0x1) {