USB: ci13xxx_udc: handle controllers with less than 16 EPs
authorMarc Kleine-Budde <mkl@pengutronix.de>
Mon, 10 Oct 2011 16:38:10 +0000 (18:38 +0200)
committerFelipe Balbi <balbi@ti.com>
Mon, 12 Dec 2011 09:44:45 +0000 (11:44 +0200)
The ci13xxx_udc driver checks the number of endpoints in the udc
controller, however some routines expect that the hardware has 16
bidirectional endpoints.

This patch improves the driver to work on controllers with less than
16 endpoints like the udc controller found on freescale's
mx23 and mx28.

Tested-by: Pavankumar Kondeti <pkondeti@codeaurora.org>
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
Signed-off-by: Felipe Balbi <balbi@ti.com>
drivers/usb/gadget/ci13xxx_udc.c
drivers/usb/gadget/ci13xxx_udc.h

index 9db7e7667c2b05e2be281d398716e0d6584983de..8956a2448b33857aed708194064946581884b36d 100644 (file)
@@ -182,6 +182,16 @@ static inline int hw_ep_bit(int num, int dir)
        return num + (dir ? 16 : 0);
 }
 
+static int ep_to_bit(int n)
+{
+       int fill = 16 - hw_ep_max / 2;
+
+       if (n >= hw_ep_max / 2)
+               n += fill;
+
+       return n;
+}
+
 /**
  * hw_aread: reads from register bitfield
  * @addr: address relative to bus map
@@ -440,12 +450,13 @@ static int hw_ep_get_halt(int num, int dir)
 /**
  * hw_test_and_clear_setup_status: test & clear setup status (execute without
  *                                 interruption)
- * @n: bit number (endpoint)
+ * @n: endpoint number
  *
  * This function returns setup status
  */
 static int hw_test_and_clear_setup_status(int n)
 {
+       n = ep_to_bit(n);
        return hw_ctest_and_clear(CAP_ENDPTSETUPSTAT, BIT(n));
 }
 
@@ -641,12 +652,13 @@ static int hw_register_write(u16 addr, u32 data)
 /**
  * hw_test_and_clear_complete: test & clear complete status (execute without
  *                             interruption)
- * @n: bit number (endpoint)
+ * @n: endpoint number
  *
  * This function returns complete status
  */
 static int hw_test_and_clear_complete(int n)
 {
+       n = ep_to_bit(n);
        return hw_ctest_and_clear(CAP_ENDPTCOMPLETE, BIT(n));
 }
 
index 23707775cb434f5ac93c2221fda10ba57804b6e4..f4871e1fac5965d13bc1a738197363a8033029ce 100644 (file)
@@ -127,7 +127,7 @@ struct ci13xxx {
        struct ci13xxx_ep          ci13xxx_ep[ENDPT_MAX]; /* extended endpts */
        u32                        ep0_dir;    /* ep0 direction */
 #define ep0out ci13xxx_ep[0]
-#define ep0in  ci13xxx_ep[16]
+#define ep0in  ci13xxx_ep[hw_ep_max / 2]
        u8                         remote_wakeup; /* Is remote wakeup feature
                                                        enabled by the host? */
        u8                         suspended;  /* suspended by the host */