]> git.karo-electronics.de Git - linux-beck.git/commitdiff
usb: gadget: renesas_usbhs: add INTSTS1 interrupt support
authorKuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Tue, 11 Oct 2011 05:06:57 +0000 (22:06 -0700)
committerFelipe Balbi <balbi@ti.com>
Thu, 13 Oct 2011 17:41:50 +0000 (20:41 +0300)
mod_host use INTSTS1 interrupt

Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Signed-off-by: Felipe Balbi <balbi@ti.com>
drivers/usb/renesas_usbhs/common.h
drivers/usb/renesas_usbhs/mod.c
drivers/usb/renesas_usbhs/mod.h

index 0e867a33a46ed9dac521ab863eae11e61ed61223..dc9490d1f42f7b4bf73f987c510407fa66bfd97e 100644 (file)
@@ -172,6 +172,15 @@ struct usbhs_priv;
 #define  NODATA_STATUS_STAGE   5       /* Control write NoData status stage */
 #define  SEQUENCE_ERROR                6       /* Control transfer sequence error */
 
+/* INTSTS1 */
+#define OVRCR  (1 << 15) /* OVRCR Interrupt Status */
+#define BCHG   (1 << 14) /* USB Bus Change Interrupt Status */
+#define DTCH   (1 << 12) /* USB Disconnection Detect Interrupt Status */
+#define ATTCH  (1 << 11) /* ATTCH Interrupt Status */
+#define EOFERR (1 << 6)  /* EOF Error Detect Interrupt Status */
+#define SIGN   (1 << 5)  /* Setup Transaction Error Interrupt Status */
+#define SACK   (1 << 4)  /* Setup Transaction ACK Response Interrupt Status */
+
 /* PIPECFG */
 /* DCPCFG */
 #define TYPE_NONE      (0 << 14)       /* Transfer Type */
index 0340fb945f5b5a702dcc5e127028fea180d56aea..993c2ca4f0cae1f2b88f3c01d474778a39ce8b5c 100644 (file)
@@ -254,6 +254,8 @@ static irqreturn_t usbhs_interrupt(int irq, void *data)
         * see also
         *      usbhs_irq_setting_update
         */
+
+       /* INTSTS0 */
        if (irq_state.intsts0 & VBINT)
                usbhs_mod_info_call(priv, irq_vbus, priv, &irq_state);
 
@@ -269,12 +271,26 @@ static irqreturn_t usbhs_interrupt(int irq, void *data)
        if (irq_state.intsts0 & BRDY)
                usbhs_mod_call(priv, irq_ready, priv, &irq_state);
 
+       /* INTSTS1 */
+       if (irq_state.intsts1 & ATTCH)
+               usbhs_mod_call(priv, irq_attch, priv, &irq_state);
+
+       if (irq_state.intsts1 & DTCH)
+               usbhs_mod_call(priv, irq_dtch, priv, &irq_state);
+
+       if (irq_state.intsts1 & SIGN)
+               usbhs_mod_call(priv, irq_sign, priv, &irq_state);
+
+       if (irq_state.intsts1 & SACK)
+               usbhs_mod_call(priv, irq_sack, priv, &irq_state);
+
        return IRQ_HANDLED;
 }
 
 void usbhs_irq_callback_update(struct usbhs_priv *priv, struct usbhs_mod *mod)
 {
        u16 intenb0 = 0;
+       u16 intenb1 = 0;
        struct usbhs_mod_info *info = usbhs_priv_to_modinfo(priv);
 
        /*
@@ -286,6 +302,7 @@ void usbhs_irq_callback_update(struct usbhs_priv *priv, struct usbhs_mod *mod)
         *  - update INTSTS0
         */
        usbhs_write(priv, INTENB0, 0);
+       usbhs_write(priv, INTENB1, 0);
 
        usbhs_write(priv, BEMPENB, 0);
        usbhs_write(priv, BRDYENB, 0);
@@ -303,6 +320,9 @@ void usbhs_irq_callback_update(struct usbhs_priv *priv, struct usbhs_mod *mod)
                intenb0 |= VBSE;
 
        if (mod) {
+               /*
+                * INTSTS0
+                */
                if (mod->irq_ctrl_stage)
                        intenb0 |= CTRE;
 
@@ -315,8 +335,26 @@ void usbhs_irq_callback_update(struct usbhs_priv *priv, struct usbhs_mod *mod)
                        usbhs_write(priv, BRDYENB, mod->irq_brdysts);
                        intenb0 |= BRDYE;
                }
+
+               /*
+                * INTSTS1
+                */
+               if (mod->irq_attch)
+                       intenb1 |= ATTCHE;
+
+               if (mod->irq_attch)
+                       intenb1 |= DTCHE;
+
+               if (mod->irq_sign)
+                       intenb1 |= SIGNE;
+
+               if (mod->irq_sack)
+                       intenb1 |= SACKE;
        }
 
        if (intenb0)
                usbhs_write(priv, INTENB0, intenb0);
+
+       if (intenb1)
+               usbhs_write(priv, INTENB1, intenb1);
 }
index 0e2c5b695820838b8dbc0b9cdad325656d81ec3a..df4b61dab313130104faf42147eab518a93dd8e7 100644 (file)
@@ -41,26 +41,48 @@ struct usbhs_mod {
        int (*start)(struct usbhs_priv *priv);
        int (*stop)(struct usbhs_priv *priv);
 
-       /* INTSTS0 :: DVST (DVSQ) */
+       /*
+        * INTSTS0
+        */
+
+       /* DVST (DVSQ) */
        int (*irq_dev_state)(struct usbhs_priv *priv,
                             struct usbhs_irq_state *irq_state);
 
-       /* INTSTS0 :: CTRT (CTSQ) */
+       /* CTRT (CTSQ) */
        int (*irq_ctrl_stage)(struct usbhs_priv *priv,
                              struct usbhs_irq_state *irq_state);
 
-       /* INTSTS0 :: BEMP */
-       /* BEMPSTS */
+       /* BEMP / BEMPSTS */
        int (*irq_empty)(struct usbhs_priv *priv,
                         struct usbhs_irq_state *irq_state);
        u16 irq_bempsts;
 
-       /* INTSTS0 :: BRDY */
-       /* BRDYSTS */
+       /* BRDY / BRDYSTS */
        int (*irq_ready)(struct usbhs_priv *priv,
                         struct usbhs_irq_state *irq_state);
        u16 irq_brdysts;
 
+       /*
+        * INTSTS1
+        */
+
+       /* ATTCHE */
+       int (*irq_attch)(struct usbhs_priv *priv,
+                        struct usbhs_irq_state *irq_state);
+
+       /* DTCHE */
+       int (*irq_dtch)(struct usbhs_priv *priv,
+                       struct usbhs_irq_state *irq_state);
+
+       /* SIGN */
+       int (*irq_sign)(struct usbhs_priv *priv,
+                       struct usbhs_irq_state *irq_state);
+
+       /* SACK */
+       int (*irq_sack)(struct usbhs_priv *priv,
+                       struct usbhs_irq_state *irq_state);
+
        struct usbhs_priv *priv;
 };