[U-Boot] [PATCH v1 09/16] ehci: Add support for Qualcomm EHCI

Marek Vasut
2016-01-06T21:04:07Z

On Wednesday, January 06, 2016 at 07:21:21 PM, Mateusz Kulikowski wrote:
> This driver is able to reconfigure OTG controller into HOST mode.
> Board can add board-specific initialization as board_prepare_usb().
> It requires USB_ULPI_VIEWPORT enabled in board configuration.
>
> Signed-off-by: Mateusz Kulikowski <mateusz.kulikowski@gmail.com>

[...]

> +static int msm_init_after_reset(struct ehci_ctrl *dev)
> +{
> + struct msm_ehci_priv *p = container_of(dev, struct msm_ehci_priv, ctrl);
> + struct usb_ehci *ehci = p->ehci;
> +
> + /* select ULPI phy */
> + writel(0x80000000, &ehci->portsc);

Don't we have macro for this bit ?

> + setup_usb_phy(p);
> +
> + /* Enable sess_vld */
> + setbits_le32(&ehci->genconfig2, GEN2_SESS_VLD_CTRL_EN);
> +
> + /* Enable external vbus configuration in the LINK */
> + setbits_le32(&ehci->usbcmd, SESS_VLD_CTRL);
> +
> + /* USB_OTG_HS_AHB_BURST */
> + writel(0x0, &ehci->sbuscfg);
> +
> + /* USB_OTG_HS_AHB_MODE: HPROT_MODE */
> + /* Bus access related config. */
> + writel(0x08, &ehci->sbusmode);
> +
> + /* set mode to host controller */
> + writel(CM_HOST, &ehci->usbmode);
> +
> + return 0;
> +}

[...]

> +static int ehci_usb_remove(struct udevice *dev)
> +{
> + struct msm_ehci_priv *p = dev_get_priv(dev);
> + struct usb_ehci *ehci = p->ehci;
> + int ret;
> +
> + ret = ehci_deregister(dev);
> + if (ret)
> + return ret;
> +
> + /* Stop controller. */
> + clrbits_le32(&ehci->usbcmd, CMD_RUN);
> +
> + reset_usb_phy(p);
> +
> + ret = board_prepare_usb(USB_INIT_DEVICE); /* Board specific hook */
> + if (ret < 0)
> + return ret;
> +
> + /* Reset controller */
> + setbits_le32(&ehci->usbcmd, CMD_RESET);
> +
> + /* Wait for reset */
> + if (wait_for_bit(__func__, &ehci->usbcmd, CMD_RESET, false, 30,

Ad. this wait_for_bit() , you can define a macro "wait_for_bit()" in some header
file which would call the final __wait_for_bit(). The trick is, such macro will
expand in place and you wouldn't have to call it with __func__ argument. The
macro would be able to pass that __func__ argument into the final
__wait_for_bit() . But that's just an idea, it doesn't prevent this driver from
mainlining of course.

> + false)) {
> + printf("Stuck on USB reset.\n");
> + return -ETIMEDOUT;
> + }
> +
> + return 0;
> +}

Other than that portsc bit, add my

Acked-by: Marek Vasut <marex@denx.de>