svn commit: r331306 - head/sys/dev/usb/controller
Andrew Turner
andrew at FreeBSD.org
Wed Mar 21 15:17:55 UTC 2018
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 */
More information about the svn-src-all
mailing list