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

Gedare Bloom gedare at rtems.org
Thu Apr 2 15:20:46 UTC 2020


On Thu, Apr 2, 2020 at 9:18 AM Christian Mauderer
<christian.mauderer at embedded-brains.de> wrote:
>
> 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.
>
OK that's fine.

It seems all the imx stuff is ok, except for the changes noted in the
shared files to address. The new imports seem straightforward and if
you need this stuff for 5.1 then once you sort out the patch order and
the unaligned access, if Sebastian is happy go for it.

New BSPs/features that can wait for 6.0 at this point should.

> >
> > 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