[PATCH libbsd 10/11] ehci_imx: Set/clear ENHOSTDISCONNECT in USB PHY.

Christian Mauderer christian.mauderer at embedded-brains.de
Thu Apr 2 15:17:56 UTC 2020


On 02/04/2020 17:13, Gedare Bloom wrote:
> Maybe file a ticket against this for the future.

Problematic point is: I'm not sure when or if FreeBSD ever will have the
necessary functions. So that ticket would be a candidate for being open
forever.

> 
> On Thu, Apr 2, 2020 at 8:43 AM Christian Mauderer
> <christian.mauderer at embedded-brains.de> wrote:
>>
>> This is not a nice solution but it should work on all chips. As soon as
>> FreeBSD has a nice solution via the USB PHY driver, this should be
>> replaced.
>>
>> Update #3869.
>> ---
>>  freebsd/sys/dev/usb/controller/ehci_imx.c | 59 +++++++++++++++++++++++++++++++
>>  1 file changed, 59 insertions(+)
>>
>> diff --git a/freebsd/sys/dev/usb/controller/ehci_imx.c b/freebsd/sys/dev/usb/controller/ehci_imx.c
>> index d158df1d..544a63b5 100644
>> --- a/freebsd/sys/dev/usb/controller/ehci_imx.c
>> +++ b/freebsd/sys/dev/usb/controller/ehci_imx.c
>> @@ -50,6 +50,9 @@ __FBSDID("$FreeBSD$");
>>
>>  #include <dev/ofw/ofw_bus.h>
>>  #include <dev/ofw/ofw_bus_subr.h>
>> +#ifdef __rtems__
>> +#include <dev/fdt/fdt_common.h>
>> +#endif /* __rtems__ */
>>
>>  #include <dev/usb/usb.h>
>>  #include <dev/usb/usbdi.h>
>> @@ -270,6 +273,9 @@ struct imx_ehci_softc {
>>         device_t        dev;
>>         struct resource *ehci_mem_res;  /* EHCI core regs. */
>>         struct resource *ehci_irq_res;  /* EHCI core IRQ. */
>> +#ifdef __rtems__
>> +       void            *phy_regs;
>> +#endif /* __rtems__ */
>>  };
>>
>>  static struct ofw_compat_data compat_data[] = {
>> @@ -380,6 +386,32 @@ imx_ehci_disable_oc(struct imx_ehci_softc *sc)
>>         index = usbmprops[1];
>>         imx_usbmisc_set_ctrl(usbmdev, index, USBNC_OVER_CUR_DIS);
>>  }
>> +#ifdef __rtems__
>> +#define BUS_SPACE_PHYSADDR(res, offs) \
>> +       ((u_int)(rman_get_start(res)+(offs)))
>> +
>> +static uint16_t
>> +imx_ehci_get_port_speed_portsc(struct ehci_softc *sc, uint16_t index)
>> +{
>> +       uint32_t v;
>> +       struct imx_ehci_softc *isc = (struct imx_ehci_softc *)sc;
>> +
>> +       v = ehci_get_port_speed_portsc(sc, index);
>> +
>> +       /* Set/clear ENHOSTDISCONDETECT in USBPHY CTRL register */
>> +       /* FIXME: This is a very hacky method. It should be done by the phy
>> +        * driver instead. */
>> +       volatile uint32_t *ctrl_set = isc->phy_regs + 0x34;
>> +       volatile uint32_t *ctrl_clr = isc->phy_regs + 0x38;
>> +       if (v == UPS_HIGH_SPEED) {
>> +               *ctrl_set = 0x2;
>> +       } else {
>> +               *ctrl_clr = 0x2;
>> +       }
>> +
>> +       return (v);
>> +}
>> +#endif /* __rtems__ */
>>
>>  static int
>>  imx_ehci_attach(device_t dev)
>> @@ -474,6 +506,33 @@ imx_ehci_attach(device_t dev)
>>         esc->sc_flags |= EHCI_SCFLG_NORESTERM | EHCI_SCFLG_TT;
>>         esc->sc_vendor_post_reset = imx_ehci_post_reset;
>>         esc->sc_vendor_get_port_speed = ehci_get_port_speed_portsc;
>> +#ifdef __rtems__
>> +       /*
>> +        * FIXME: This is a big hack to get the PHY regs and set one bit during
>> +        * changes of the port speed.
>> +        */
>> +       sc->phy_regs = 0;
>> +       if (OF_hasprop(ofw_bus_get_node(sc->dev), "fsl,usbphy")) {
>> +               phandle_t *cells;
>> +               int len;
>> +               phandle_t phynode;
>> +
>> +               cells = NULL;
>> +               len = OF_getencprop_alloc_multi(ofw_bus_get_node(sc->dev),
>> +                   "fsl,usbphy", sizeof(*cells), (void **)&cells);
>> +               if (len > 0
>> +                   && (phynode = OF_node_from_xref(cells[0])) != -1 &&
>> +                   ofw_bus_node_is_compatible(phynode, "fsl,imx6ul-usbphy")) {
>> +                       u_long base, size;
>> +                       if (fdt_regsize(phynode, &base, &size) == 0) {
>> +                               sc->phy_regs = (void*)base;
>> +                               esc->sc_vendor_get_port_speed =
>> +                                   imx_ehci_get_port_speed_portsc;
>> +                       }
>> +               }
>> +               OF_prop_free(cells);
>> +       }
>> +#endif /* __rtems__ */
>>
>>         err = ehci_init(esc);
>>         if (err != 0) {
>> --
>> 2.16.4
>>
>> _______________________________________________
>> devel mailing list
>> devel at rtems.org
>> http://lists.rtems.org/mailman/listinfo/devel

-- 
--------------------------------------------
embedded brains GmbH
Herr Christian Mauderer
Dornierstr. 4
D-82178 Puchheim
Germany
email: christian.mauderer at embedded-brains.de
Phone: +49-89-18 94 741 - 18
Fax:   +49-89-18 94 741 - 08
PGP: Public key available on request.

Diese Nachricht ist keine geschäftliche Mitteilung im Sinne des EHUG.


More information about the devel mailing list