Commit 89c1d2e7 authored by Kuninori Morimoto's avatar Kuninori Morimoto Committed by Felipe Balbi

usb: gadget: renesas_usbhs: add INTSTS1 interrupt support

mod_host use INTSTS1 interrupt
Signed-off-by: default avatarKuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Signed-off-by: default avatarFelipe Balbi <balbi@ti.com>
parent eb05191f
...@@ -172,6 +172,15 @@ struct usbhs_priv; ...@@ -172,6 +172,15 @@ struct usbhs_priv;
#define NODATA_STATUS_STAGE 5 /* Control write NoData status stage */ #define NODATA_STATUS_STAGE 5 /* Control write NoData status stage */
#define SEQUENCE_ERROR 6 /* Control transfer sequence error */ #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 */ /* PIPECFG */
/* DCPCFG */ /* DCPCFG */
#define TYPE_NONE (0 << 14) /* Transfer Type */ #define TYPE_NONE (0 << 14) /* Transfer Type */
......
...@@ -254,6 +254,8 @@ static irqreturn_t usbhs_interrupt(int irq, void *data) ...@@ -254,6 +254,8 @@ static irqreturn_t usbhs_interrupt(int irq, void *data)
* see also * see also
* usbhs_irq_setting_update * usbhs_irq_setting_update
*/ */
/* INTSTS0 */
if (irq_state.intsts0 & VBINT) if (irq_state.intsts0 & VBINT)
usbhs_mod_info_call(priv, irq_vbus, priv, &irq_state); usbhs_mod_info_call(priv, irq_vbus, priv, &irq_state);
...@@ -269,12 +271,26 @@ static irqreturn_t usbhs_interrupt(int irq, void *data) ...@@ -269,12 +271,26 @@ static irqreturn_t usbhs_interrupt(int irq, void *data)
if (irq_state.intsts0 & BRDY) if (irq_state.intsts0 & BRDY)
usbhs_mod_call(priv, irq_ready, priv, &irq_state); 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; return IRQ_HANDLED;
} }
void usbhs_irq_callback_update(struct usbhs_priv *priv, struct usbhs_mod *mod) void usbhs_irq_callback_update(struct usbhs_priv *priv, struct usbhs_mod *mod)
{ {
u16 intenb0 = 0; u16 intenb0 = 0;
u16 intenb1 = 0;
struct usbhs_mod_info *info = usbhs_priv_to_modinfo(priv); 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) ...@@ -286,6 +302,7 @@ void usbhs_irq_callback_update(struct usbhs_priv *priv, struct usbhs_mod *mod)
* - update INTSTS0 * - update INTSTS0
*/ */
usbhs_write(priv, INTENB0, 0); usbhs_write(priv, INTENB0, 0);
usbhs_write(priv, INTENB1, 0);
usbhs_write(priv, BEMPENB, 0); usbhs_write(priv, BEMPENB, 0);
usbhs_write(priv, BRDYENB, 0); usbhs_write(priv, BRDYENB, 0);
...@@ -303,6 +320,9 @@ void usbhs_irq_callback_update(struct usbhs_priv *priv, struct usbhs_mod *mod) ...@@ -303,6 +320,9 @@ void usbhs_irq_callback_update(struct usbhs_priv *priv, struct usbhs_mod *mod)
intenb0 |= VBSE; intenb0 |= VBSE;
if (mod) { if (mod) {
/*
* INTSTS0
*/
if (mod->irq_ctrl_stage) if (mod->irq_ctrl_stage)
intenb0 |= CTRE; intenb0 |= CTRE;
...@@ -315,8 +335,26 @@ void usbhs_irq_callback_update(struct usbhs_priv *priv, struct usbhs_mod *mod) ...@@ -315,8 +335,26 @@ void usbhs_irq_callback_update(struct usbhs_priv *priv, struct usbhs_mod *mod)
usbhs_write(priv, BRDYENB, mod->irq_brdysts); usbhs_write(priv, BRDYENB, mod->irq_brdysts);
intenb0 |= BRDYE; 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) if (intenb0)
usbhs_write(priv, INTENB0, intenb0); usbhs_write(priv, INTENB0, intenb0);
if (intenb1)
usbhs_write(priv, INTENB1, intenb1);
} }
...@@ -41,26 +41,48 @@ struct usbhs_mod { ...@@ -41,26 +41,48 @@ struct usbhs_mod {
int (*start)(struct usbhs_priv *priv); int (*start)(struct usbhs_priv *priv);
int (*stop)(struct usbhs_priv *priv); int (*stop)(struct usbhs_priv *priv);
/* INTSTS0 :: DVST (DVSQ) */ /*
* INTSTS0
*/
/* DVST (DVSQ) */
int (*irq_dev_state)(struct usbhs_priv *priv, int (*irq_dev_state)(struct usbhs_priv *priv,
struct usbhs_irq_state *irq_state); struct usbhs_irq_state *irq_state);
/* INTSTS0 :: CTRT (CTSQ) */ /* CTRT (CTSQ) */
int (*irq_ctrl_stage)(struct usbhs_priv *priv, int (*irq_ctrl_stage)(struct usbhs_priv *priv,
struct usbhs_irq_state *irq_state); struct usbhs_irq_state *irq_state);
/* INTSTS0 :: BEMP */ /* BEMP / BEMPSTS */
/* BEMPSTS */
int (*irq_empty)(struct usbhs_priv *priv, int (*irq_empty)(struct usbhs_priv *priv,
struct usbhs_irq_state *irq_state); struct usbhs_irq_state *irq_state);
u16 irq_bempsts; u16 irq_bempsts;
/* INTSTS0 :: BRDY */ /* BRDY / BRDYSTS */
/* BRDYSTS */
int (*irq_ready)(struct usbhs_priv *priv, int (*irq_ready)(struct usbhs_priv *priv,
struct usbhs_irq_state *irq_state); struct usbhs_irq_state *irq_state);
u16 irq_brdysts; 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; struct usbhs_priv *priv;
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment