diff mbox

USB: chipidea: use OTGSC_BSV to detect vbus valid

Message ID 1347871821-14643-1-git-send-email-richard.zhao@freescale.com (mailing list archive)
State New, archived
Headers show

Commit Message

Richard Zhao Sept. 17, 2012, 8:50 a.m. UTC
OTGSC_AVVIS cannot be set when vbus voltage goes valid or invalid on
imx, so convert to use OTGSC_BSV.

OTGSC_BSVIE and OTGSC_BSVIS is not cleared when hw_device_reset, so we
don't need to call hw_enable_vbus_intr after hw_device_reset.

Signed-off-by: Richard Zhao <richard.zhao@freescale.com>
---
 drivers/usb/chipidea/udc.c |   17 ++++++++---------
 1 file changed, 8 insertions(+), 9 deletions(-)

Comments

Chen Peter-B29397 Sept. 17, 2012, 8:52 a.m. UTC | #1
> 
> OTGSC_AVVIS cannot be set when vbus voltage goes valid or invalid on
> imx, so convert to use OTGSC_BSV.
> 

Not just on imx, from the IC guys, it is chipidea's feature.
the AVVIS will not go to 1 when the vbus goes to high if ID = 1.

> OTGSC_BSVIE and OTGSC_BSVIS is not cleared when hw_device_reset, so we
> don't need to call hw_enable_vbus_intr after hw_device_reset.
> 
> Signed-off-by: Richard Zhao <richard.zhao@freescale.com>
> ---
>  drivers/usb/chipidea/udc.c |   17 ++++++++---------
>  1 file changed, 8 insertions(+), 9 deletions(-)
> 
> diff --git a/drivers/usb/chipidea/udc.c b/drivers/usb/chipidea/udc.c
> index 2f45bba..b158a04 100644
> --- a/drivers/usb/chipidea/udc.c
> +++ b/drivers/usb/chipidea/udc.c
> @@ -307,14 +307,13 @@ static u32 hw_test_and_clear_intr_active(struct
> ci13xxx *ci)
> 
>  static void hw_enable_vbus_intr(struct ci13xxx *ci)
>  {
> -	hw_write(ci, OP_OTGSC, OTGSC_AVVIS, OTGSC_AVVIS);
> -	hw_write(ci, OP_OTGSC, OTGSC_AVVIE, OTGSC_AVVIE);
> -	queue_work(ci->wq, &ci->vbus_work);
> +	hw_write(ci, OP_OTGSC, OTGSC_BSVIS, OTGSC_BSVIS);
> +	hw_write(ci, OP_OTGSC, OTGSC_BSVIE, OTGSC_BSVIE);
>  }
> 
>  static void hw_disable_vbus_intr(struct ci13xxx *ci)
>  {
> -	hw_write(ci, OP_OTGSC, OTGSC_AVVIE, 0);
> +	hw_write(ci, OP_OTGSC, OTGSC_BSVIE, 0);
>  }
> 
>  /**
> @@ -387,7 +386,7 @@ static void vbus_work(struct work_struct *work)
>  {
>  	struct ci13xxx *ci = container_of(work, struct ci13xxx, vbus_work);
> 
> -	if (hw_read(ci, OP_OTGSC, OTGSC_AVV))
> +	if (hw_read(ci, OP_OTGSC, OTGSC_BSV))
>  		usb_gadget_vbus_connect(&ci->gadget);
>  	else
>  		usb_gadget_vbus_disconnect(&ci->gadget);
> @@ -1392,7 +1391,6 @@ static int ci13xxx_vbus_session(struct usb_gadget
> *_gadget, int is_active)
>  		if (is_active) {
>  			pm_runtime_get_sync(&_gadget->dev);
>  			hw_device_reset(ci, USBMODE_CM_DC);
> -			hw_enable_vbus_intr(ci);
>  			hw_device_state(ci, ci->ep0out->qh.dma);
>  		} else {
>  			hw_device_state(ci, 0);
> @@ -1569,7 +1567,6 @@ static int ci13xxx_start(struct usb_gadget *gadget,
>  		if (ci->vbus_active) {
>  			if (ci->platdata->flags & CI13XXX_REGS_SHARED) {
>  				hw_device_reset(ci, USBMODE_CM_DC);
> -				hw_enable_vbus_intr(ci);
>  			}
>  		} else {
>  			pm_runtime_put_sync(&ci->gadget.dev);
> @@ -1680,7 +1677,7 @@ static irqreturn_t udc_irq(struct ci13xxx *ci)
>  	intr = hw_read(ci, OP_OTGSC, ~0);
>  	hw_write(ci, OP_OTGSC, ~0, intr);
> 
> -	if (intr & (OTGSC_AVVIE & OTGSC_AVVIS))
> +	if ((intr & OTGSC_BSVIE) && (intr & OTGSC_BSVIS))
>  		queue_work(ci->wq, &ci->vbus_work);
> 
>  	spin_unlock(&ci->lock);
> @@ -1758,7 +1755,6 @@ static int udc_start(struct ci13xxx *ci)
>  		retval = hw_device_reset(ci, USBMODE_CM_DC);
>  		if (retval)
>  			goto put_transceiver;
> -		hw_enable_vbus_intr(ci);
>  	}
> 
>  	retval = device_register(&ci->gadget.dev);
> @@ -1782,6 +1778,9 @@ static int udc_start(struct ci13xxx *ci)
>  	if (retval)
>  		goto remove_trans;
> 
> +	queue_work(ci->wq, &ci->vbus_work);
> +	hw_enable_vbus_intr(ci);
> +
>  	pm_runtime_no_callbacks(&ci->gadget.dev);
>  	pm_runtime_enable(&ci->gadget.dev);
> 
> --
> 1.7.9.5
Richard Zhao Sept. 19, 2012, 1:18 a.m. UTC | #2
On Mon, Sep 17, 2012 at 04:52:59PM +0800, Chen Peter-B29397 wrote:
>  
> 
>  
> > 
> > OTGSC_AVVIS cannot be set when vbus voltage goes valid or invalid on
> > imx, so convert to use OTGSC_BSV.
> > 
> 
> Not just on imx, from the IC guys, it is chipidea's feature.
> the AVVIS will not go to 1 when the vbus goes to high if ID = 1.
Alex,

Is it ok to you? If you think the commit message is ambiguous, it could
be changed.

Thanks
Richard
diff mbox

Patch

diff --git a/drivers/usb/chipidea/udc.c b/drivers/usb/chipidea/udc.c
index 2f45bba..b158a04 100644
--- a/drivers/usb/chipidea/udc.c
+++ b/drivers/usb/chipidea/udc.c
@@ -307,14 +307,13 @@  static u32 hw_test_and_clear_intr_active(struct ci13xxx *ci)
 
 static void hw_enable_vbus_intr(struct ci13xxx *ci)
 {
-	hw_write(ci, OP_OTGSC, OTGSC_AVVIS, OTGSC_AVVIS);
-	hw_write(ci, OP_OTGSC, OTGSC_AVVIE, OTGSC_AVVIE);
-	queue_work(ci->wq, &ci->vbus_work);
+	hw_write(ci, OP_OTGSC, OTGSC_BSVIS, OTGSC_BSVIS);
+	hw_write(ci, OP_OTGSC, OTGSC_BSVIE, OTGSC_BSVIE);
 }
 
 static void hw_disable_vbus_intr(struct ci13xxx *ci)
 {
-	hw_write(ci, OP_OTGSC, OTGSC_AVVIE, 0);
+	hw_write(ci, OP_OTGSC, OTGSC_BSVIE, 0);
 }
 
 /**
@@ -387,7 +386,7 @@  static void vbus_work(struct work_struct *work)
 {
 	struct ci13xxx *ci = container_of(work, struct ci13xxx, vbus_work);
 
-	if (hw_read(ci, OP_OTGSC, OTGSC_AVV))
+	if (hw_read(ci, OP_OTGSC, OTGSC_BSV))
 		usb_gadget_vbus_connect(&ci->gadget);
 	else
 		usb_gadget_vbus_disconnect(&ci->gadget);
@@ -1392,7 +1391,6 @@  static int ci13xxx_vbus_session(struct usb_gadget *_gadget, int is_active)
 		if (is_active) {
 			pm_runtime_get_sync(&_gadget->dev);
 			hw_device_reset(ci, USBMODE_CM_DC);
-			hw_enable_vbus_intr(ci);
 			hw_device_state(ci, ci->ep0out->qh.dma);
 		} else {
 			hw_device_state(ci, 0);
@@ -1569,7 +1567,6 @@  static int ci13xxx_start(struct usb_gadget *gadget,
 		if (ci->vbus_active) {
 			if (ci->platdata->flags & CI13XXX_REGS_SHARED) {
 				hw_device_reset(ci, USBMODE_CM_DC);
-				hw_enable_vbus_intr(ci);
 			}
 		} else {
 			pm_runtime_put_sync(&ci->gadget.dev);
@@ -1680,7 +1677,7 @@  static irqreturn_t udc_irq(struct ci13xxx *ci)
 	intr = hw_read(ci, OP_OTGSC, ~0);
 	hw_write(ci, OP_OTGSC, ~0, intr);
 
-	if (intr & (OTGSC_AVVIE & OTGSC_AVVIS))
+	if ((intr & OTGSC_BSVIE) && (intr & OTGSC_BSVIS))
 		queue_work(ci->wq, &ci->vbus_work);
 
 	spin_unlock(&ci->lock);
@@ -1758,7 +1755,6 @@  static int udc_start(struct ci13xxx *ci)
 		retval = hw_device_reset(ci, USBMODE_CM_DC);
 		if (retval)
 			goto put_transceiver;
-		hw_enable_vbus_intr(ci);
 	}
 
 	retval = device_register(&ci->gadget.dev);
@@ -1782,6 +1778,9 @@  static int udc_start(struct ci13xxx *ci)
 	if (retval)
 		goto remove_trans;
 
+	queue_work(ci->wq, &ci->vbus_work);
+	hw_enable_vbus_intr(ci);
+
 	pm_runtime_no_callbacks(&ci->gadget.dev);
 	pm_runtime_enable(&ci->gadget.dev);