Author: andrew
Date: Wed Mar 21 15:17:54 2018
New Revision: 331306
URL: https://svnweb.freebsd.org/changeset/base/331306

Log:
  Use a table to find the endpoint configuration
  
  On the Allwinner SoCs we need to set a custom endpoint configuration. To
  allow for this use a table to store the configuration so the attachment
  can override it.
  
  Reviewed by:  hselasky
  Sponsored by: DARPA, AFRL
  Differential Revision:        https://reviews.freebsd.org/D14783

Modified:
  head/sys/dev/usb/controller/musb_otg.c
  head/sys/dev/usb/controller/musb_otg.h

Modified: head/sys/dev/usb/controller/musb_otg.c
==============================================================================
--- head/sys/dev/usb/controller/musb_otg.c      Wed Mar 21 15:13:47 2018        
(r331305)
+++ head/sys/dev/usb/controller/musb_otg.c      Wed Mar 21 15:17:54 2018        
(r331306)
@@ -149,6 +149,27 @@ static const struct usb_hw_ep_profile musbotg_ep_profi
        }
 };
 
+static const struct musb_otg_ep_cfg musbotg_ep_default[] = {
+       {
+               .ep_end = 1,
+               .ep_fifosz_shift = 12,
+               .ep_fifosz_reg = MUSB2_VAL_FIFOSZ_4096 | MUSB2_MASK_FIFODB,
+       },
+       {
+               .ep_end = 7,
+               .ep_fifosz_shift = 9,
+               .ep_fifosz_reg = MUSB2_VAL_FIFOSZ_512 | MUSB2_MASK_FIFODB,
+       },
+       {
+               .ep_end = 15,
+               .ep_fifosz_shift = 7,
+               .ep_fifosz_reg = MUSB2_VAL_FIFOSZ_128,
+       },
+       {
+               .ep_end = -1,
+       },
+};
+
 static int
 musbotg_channel_alloc(struct musbotg_softc *sc, struct musbotg_td *td, uint8_t 
is_tx)
 {
@@ -3059,7 +3080,9 @@ musbotg_clear_stall(struct usb_device *udev, struct us
 usb_error_t
 musbotg_init(struct musbotg_softc *sc)
 {
+       const struct musb_otg_ep_cfg *cfg;
        struct usb_hw_ep_profile *pf;
+       int i;
        uint16_t offset;
        uint8_t nrx;
        uint8_t ntx;
@@ -3075,6 +3098,10 @@ musbotg_init(struct musbotg_softc *sc)
        sc->sc_bus.usbrev = USB_REV_2_0;
        sc->sc_bus.methods = &musbotg_bus_methods;
 
+       /* Set a default endpoint configuration */
+       if (sc->sc_ep_cfg == NULL)
+               sc->sc_ep_cfg = musbotg_ep_default;
+
        USB_BUS_LOCK(&sc->sc_bus);
 
        /* turn on clocks */
@@ -3193,20 +3220,15 @@ musbotg_init(struct musbotg_softc *sc)
 
                if (dynfifo) {
                        if (frx && (temp <= nrx)) {
-                               if (temp == 1) {
-                                       frx = 12;       /* 4K */
-                                       MUSB2_WRITE_1(sc, MUSB2_REG_RXFIFOSZ, 
-                                           MUSB2_VAL_FIFOSZ_4096 |
-                                           MUSB2_MASK_FIFODB);
-                               } else if (temp < 8) {
-                                       frx = 10;       /* 1K */
-                                       MUSB2_WRITE_1(sc, MUSB2_REG_RXFIFOSZ, 
-                                           MUSB2_VAL_FIFOSZ_512 |
-                                           MUSB2_MASK_FIFODB);
-                               } else {
-                                       frx = 7;        /* 128 bytes */
-                                       MUSB2_WRITE_1(sc, MUSB2_REG_RXFIFOSZ, 
-                                           MUSB2_VAL_FIFOSZ_128);
+                               for (i = 0; sc->sc_ep_cfg[i].ep_end >= 0; i++) {
+                                       cfg = &sc->sc_ep_cfg[i];
+                                       if (temp <= cfg->ep_end) {
+                                               frx = cfg->ep_fifosz_shift;
+                                               MUSB2_WRITE_1(sc,
+                                                   MUSB2_REG_RXFIFOSZ,
+                                                   cfg->ep_fifosz_reg);
+                                               break;
+                                       }
                                }
 
                                MUSB2_WRITE_2(sc, MUSB2_REG_RXFIFOADD,
@@ -3215,20 +3237,15 @@ musbotg_init(struct musbotg_softc *sc)
                                offset += (1 << frx);
                        }
                        if (ftx && (temp <= ntx)) {
-                               if (temp == 1) {
-                                       ftx = 12;       /* 4K */
-                                       MUSB2_WRITE_1(sc, MUSB2_REG_TXFIFOSZ,
-                                           MUSB2_VAL_FIFOSZ_4096 |
-                                           MUSB2_MASK_FIFODB);
-                               } else if (temp < 8) {
-                                       ftx = 10;       /* 1K */
-                                       MUSB2_WRITE_1(sc, MUSB2_REG_TXFIFOSZ,
-                                           MUSB2_VAL_FIFOSZ_512 |
-                                           MUSB2_MASK_FIFODB);
-                               } else {
-                                       ftx = 7;        /* 128 bytes */
-                                       MUSB2_WRITE_1(sc, MUSB2_REG_TXFIFOSZ,
-                                           MUSB2_VAL_FIFOSZ_128);
+                               for (i = 0; sc->sc_ep_cfg[i].ep_end >= 0; i++) {
+                                       cfg = &sc->sc_ep_cfg[i];
+                                       if (temp <= cfg->ep_end) {
+                                               ftx = cfg->ep_fifosz_shift;
+                                               MUSB2_WRITE_1(sc,
+                                                   MUSB2_REG_TXFIFOSZ,
+                                                   cfg->ep_fifosz_reg);
+                                               break;
+                                       }
                                }
 
                                MUSB2_WRITE_2(sc, MUSB2_REG_TXFIFOADD,

Modified: head/sys/dev/usb/controller/musb_otg.h
==============================================================================
--- head/sys/dev/usb/controller/musb_otg.h      Wed Mar 21 15:13:47 2018        
(r331305)
+++ head/sys/dev/usb/controller/musb_otg.h      Wed Mar 21 15:17:54 2018        
(r331306)
@@ -387,6 +387,12 @@ struct musbotg_flags {
        uint8_t d_pulled_up:1;
 };
 
+struct musb_otg_ep_cfg {
+       int ep_end;
+       int ep_fifosz_shift;
+       uint8_t ep_fifosz_reg;
+};
+
 struct musbotg_softc {
        struct usb_bus sc_bus;
        union musbotg_hub_temp sc_hub_temp;
@@ -423,6 +429,7 @@ struct musbotg_softc {
        uint8_t sc_id;
        uint8_t sc_mode;
        void *sc_platform_data;
+       const struct musb_otg_ep_cfg *sc_ep_cfg;
 };
 
 /* prototypes */
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to