Re: [PATCH] extcon: palmas: Handle ID interrupt properly using USB_ID_INT_SRC

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Laxman/Chanwoo/Kishon,

Any comments on this!!
Regards
-George
On 10/11/2013 12:18 AM, George Cherian wrote:
Always cross check with the ID state and the source of interrupt.
Also add a case in which ID Source is ID_GND but LATCH state is set
wrongly. This uses the previous Link stat to determine the new state.

Signed-off-by: George Cherian <george.cherian@xxxxxx>
---
  drivers/extcon/extcon-palmas.c | 15 ++++++++++++---
  1 file changed, 12 insertions(+), 3 deletions(-)

diff --git a/drivers/extcon/extcon-palmas.c b/drivers/extcon/extcon-palmas.c
index 6e83e9a..2aea4bc 100644
--- a/drivers/extcon/extcon-palmas.c
+++ b/drivers/extcon/extcon-palmas.c
@@ -78,20 +78,24 @@ static irqreturn_t palmas_vbus_irq_handler(int irq, void *_palmas_usb)
static irqreturn_t palmas_id_irq_handler(int irq, void *_palmas_usb)
  {
-	unsigned int set;
+	unsigned int set, id_src;
  	struct palmas_usb *palmas_usb = _palmas_usb;
palmas_read(palmas_usb->palmas, PALMAS_USB_OTG_BASE,
  		PALMAS_USB_ID_INT_LATCH_SET, &set);
+	palmas_read(palmas_usb->palmas, PALMAS_USB_OTG_BASE,
+		PALMAS_USB_ID_INT_SRC, &id_src);
- if (set & PALMAS_USB_ID_INT_SRC_ID_GND) {
+	if ((set & PALMAS_USB_ID_INT_SRC_ID_GND) &&
+				(id_src & PALMAS_USB_ID_INT_SRC_ID_GND)) {
  		palmas_write(palmas_usb->palmas, PALMAS_USB_OTG_BASE,
  			PALMAS_USB_ID_INT_LATCH_CLR,
  			PALMAS_USB_ID_INT_EN_HI_CLR_ID_GND);
  		palmas_usb->linkstat = PALMAS_USB_STATE_ID;
  		extcon_set_cable_state(&palmas_usb->edev, "USB-HOST", true);
  		dev_info(palmas_usb->dev, "USB-HOST cable is attached\n");
-	} else if (set & PALMAS_USB_ID_INT_SRC_ID_FLOAT) {
+	} else if ((set & PALMAS_USB_ID_INT_SRC_ID_FLOAT) &&
+				(id_src & PALMAS_USB_ID_INT_SRC_ID_FLOAT)) {
  		palmas_write(palmas_usb->palmas, PALMAS_USB_OTG_BASE,
  			PALMAS_USB_ID_INT_LATCH_CLR,
  			PALMAS_USB_ID_INT_EN_HI_CLR_ID_FLOAT);
@@ -103,6 +107,11 @@ static irqreturn_t palmas_id_irq_handler(int irq, void *_palmas_usb)
  		palmas_usb->linkstat = PALMAS_USB_STATE_DISCONNECT;
  		extcon_set_cable_state(&palmas_usb->edev, "USB-HOST", false);
  		dev_info(palmas_usb->dev, "USB-HOST cable is detached\n");
+	} else if ((palmas_usb->linkstat == PALMAS_USB_STATE_DISCONNECT) &&
+				(id_src & PALMAS_USB_ID_INT_SRC_ID_GND)) {
+		palmas_usb->linkstat = PALMAS_USB_STATE_ID;
+		extcon_set_cable_state(&palmas_usb->edev, "USB-HOST", true);
+		dev_info(palmas_usb->dev, " USB-HOST cable is attached\n");
  	}
return IRQ_HANDLED;


--
-George

--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Linux Media]     [Linux Input]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Old Linux USB Devel Archive]

  Powered by Linux