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

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


On 02/04/2020 17:20, Gedare Bloom wrote:
> 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.

Thanks.

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

I'll clean it up.

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

OK.

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

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