[U-Boot] [PATCH] dm: ehci-mx6: support driver model

Support driver model for ehci mx6 driver. Consolidate code to be shared between DM and non-DM, such as introducing ehci_mx6_common_init. For simplicity, some old fasion code are keeped for DM usage, such as board_ehci_power and board_usb_phy_mode. And 'dr-mode', usbphy and vbus handling code for DM is not added now. These will be added in future patches.
Signed-off-by: Peng Fan peng.fan@nxp.com Cc: Marek Vasut marex@denx.de Cc: Mateusz Kulikowski mateusz.kulikowski@gmail.com Cc: Stefan Agner stefan@agner.ch Cc: Simon Glass sjg@chromium.org --- drivers/usb/host/ehci-mx6.c | 144 +++++++++++++++++++++++++++++++++++++++----- 1 file changed, 130 insertions(+), 14 deletions(-)
diff --git a/drivers/usb/host/ehci-mx6.c b/drivers/usb/host/ehci-mx6.c index 922ef29..83364e1 100644 --- a/drivers/usb/host/ehci-mx6.c +++ b/drivers/usb/host/ehci-mx6.c @@ -15,6 +15,7 @@ #include <asm/arch/imx-regs.h> #include <asm/arch/clock.h> #include <asm/imx-common/iomux-v3.h> +#include <dm.h>
#include "ehci.h"
@@ -303,6 +304,30 @@ int __weak board_ehci_power(int port, int on) return 0; }
+int ehci_mx6_common_init(struct usb_ehci *ehci, int index) +{ + int ret; + + enable_usboh3_clk(1); + mdelay(1); + + /* Do board specific initialization */ + ret = board_ehci_hcd_init(index); + if (ret) + return ret; + + usb_power_config(index); + usb_oc_config(index); + +#if defined(CONFIG_MX6) + usb_internal_phy_clock_gate(index, 1); + usb_phy_enable(index, ehci); +#endif + + return 0; +} + +#ifndef CONFIG_DM_USB int ehci_hcd_init(int index, enum usb_init_type init, struct ehci_hccr **hccr, struct ehci_hcor **hcor) { @@ -318,26 +343,18 @@ int ehci_hcd_init(int index, enum usb_init_type init,
if (index > 3) return -EINVAL; - enable_usboh3_clk(1); - mdelay(1);
- /* Do board specific initialization */ - ret = board_ehci_hcd_init(index); + ret = ehci_mx6_common_init(ehci, index); if (ret) return ret;
- usb_power_config(index); - usb_oc_config(index); - -#if defined(CONFIG_MX6) - usb_internal_phy_clock_gate(index, 1); - usb_phy_enable(index, ehci); -#endif type = board_usb_phy_mode(index);
- *hccr = (struct ehci_hccr *)((uint32_t)&ehci->caplength); - *hcor = (struct ehci_hcor *)((uint32_t)*hccr + - HC_LENGTH(ehci_readl(&(*hccr)->cr_capbase))); + if (hccr && hcor) { + *hccr = (struct ehci_hccr *)((uint32_t)&ehci->caplength); + *hcor = (struct ehci_hcor *)((uint32_t)*hccr + + HC_LENGTH(ehci_readl(&(*hccr)->cr_capbase))); + }
if ((type == init) || (type == USB_INIT_DEVICE)) board_ehci_power(index, (type == USB_INIT_DEVICE) ? 0 : 1); @@ -359,3 +376,102 @@ int ehci_hcd_stop(int index) { return 0; } +#else +struct ehci_mx6_priv_data { + struct ehci_ctrl ctrl; + struct usb_ehci *ehci; + enum usb_init_type init_type; + int portnr; +}; + +static int mx6_init_after_reset(struct ehci_ctrl *dev) +{ + struct ehci_mx6_priv_data *priv = dev->priv; + enum usb_init_type type = priv->init_type; + struct usb_ehci *ehci = priv->ehci; + int ret; + + ret = ehci_mx6_common_init(priv->ehci, priv->portnr); + if (ret) + return ret; + + board_ehci_power(priv->portnr, (type == USB_INIT_DEVICE) ? 0 : 1); + + if (type == USB_INIT_DEVICE) + return 0; + + setbits_le32(&ehci->usbmode, CM_HOST); + writel(CONFIG_MXC_USB_PORTSC, &ehci->portsc); + setbits_le32(&ehci->portsc, USB_EN); + + mdelay(10); + + return 0; +} + +static const struct ehci_ops mx6_ehci_ops = { + .init_after_reset = mx6_init_after_reset +}; + +static int ehci_usb_probe(struct udevice *dev) +{ + struct usb_platdata *plat = dev_get_platdata(dev); + struct usb_ehci *ehci = (struct usb_ehci *)dev_get_addr(dev); + struct ehci_mx6_priv_data *priv = dev_get_priv(dev); + struct ehci_hccr *hccr; + struct ehci_hcor *hcor; + int ret; + + priv->ehci = ehci; + priv->portnr = dev->seq; + priv->init_type = plat->init_type; + + ret = ehci_mx6_common_init(ehci, priv->portnr); + if (ret) + return ret; + + board_ehci_power(priv->portnr, (priv->init_type == USB_INIT_DEVICE) ? 0 : 1); + + if (priv->init_type == USB_INIT_HOST) { + setbits_le32(&ehci->usbmode, CM_HOST); + writel(CONFIG_MXC_USB_PORTSC, &ehci->portsc); + setbits_le32(&ehci->portsc, USB_EN); + } + + mdelay(10); + + hccr = (struct ehci_hccr *)((uint32_t)&ehci->caplength); + hcor = (struct ehci_hcor *)((uint32_t)hccr + + HC_LENGTH(ehci_readl(&(hccr)->cr_capbase))); + + return ehci_register(dev, hccr, hcor, &mx6_ehci_ops, 0, priv->init_type); +} + +static int ehci_usb_remove(struct udevice *dev) +{ + int ret; + + ret = ehci_deregister(dev); + if (ret) + return ret; + + return 0; +} + +static const struct udevice_id mx6_usb_ids[] = { + { .compatible = "fsl,imx27-usb" }, + { } +}; + +U_BOOT_DRIVER(usb_mx6) = { + .name = "ehci_mx6", + .id = UCLASS_USB, + .of_match = mx6_usb_ids, + .probe = ehci_usb_probe, + .remove = ehci_usb_remove, + .ops = &ehci_usb_ops, + .platdata_auto_alloc_size = sizeof(struct usb_platdata), + .priv_auto_alloc_size = sizeof(struct ehci_mx6_priv_data), + .flags = DM_FLAG_ALLOC_PRIV_DMA, +}; +#endif

Hi Peng,
On 17 June 2016 at 00:19, Peng Fan van.freenix@gmail.com wrote:
Support driver model for ehci mx6 driver. Consolidate code to be shared between DM and non-DM, such as introducing ehci_mx6_common_init. For simplicity, some old fasion code are keeped for DM usage, such as board_ehci_power and board_usb_phy_mode. And 'dr-mode', usbphy and vbus handling code for DM is not added now. These will be added in future patches.
Signed-off-by: Peng Fan peng.fan@nxp.com Cc: Marek Vasut marex@denx.de Cc: Mateusz Kulikowski mateusz.kulikowski@gmail.com Cc: Stefan Agner stefan@agner.ch Cc: Simon Glass sjg@chromium.org
drivers/usb/host/ehci-mx6.c | 144 +++++++++++++++++++++++++++++++++++++++----- 1 file changed, 130 insertions(+), 14 deletions(-)
Reviewed-by: Simon Glass sjg@chromium.org
Good start. Do you have a plan to drop the board_...() functions?
Regards, Simon

On 06/18/2016 12:59 AM, Simon Glass wrote:
Hi Peng,
On 17 June 2016 at 00:19, Peng Fan van.freenix@gmail.com wrote:
Support driver model for ehci mx6 driver. Consolidate code to be shared between DM and non-DM, such as introducing ehci_mx6_common_init. For simplicity, some old fasion code are keeped for DM usage, such as board_ehci_power and board_usb_phy_mode. And 'dr-mode', usbphy and vbus handling code for DM is not added now. These will be added in future patches.
Signed-off-by: Peng Fan peng.fan@nxp.com Cc: Marek Vasut marex@denx.de Cc: Mateusz Kulikowski mateusz.kulikowski@gmail.com Cc: Stefan Agner stefan@agner.ch Cc: Simon Glass sjg@chromium.org
drivers/usb/host/ehci-mx6.c | 144 +++++++++++++++++++++++++++++++++++++++----- 1 file changed, 130 insertions(+), 14 deletions(-)
Reviewed-by: Simon Glass sjg@chromium.org
Good start. Do you have a plan to drop the board_...() functions?
Applied to u-boot-usb/next, thanks

Hi Simon,
On Fri, Jun 17, 2016 at 04:59:49PM -0600, Simon Glass wrote:
Hi Peng,
On 17 June 2016 at 00:19, Peng Fan van.freenix@gmail.com wrote:
Support driver model for ehci mx6 driver. Consolidate code to be shared between DM and non-DM, such as introducing ehci_mx6_common_init. For simplicity, some old fasion code are keeped for DM usage, such as board_ehci_power and board_usb_phy_mode. And 'dr-mode', usbphy and vbus handling code for DM is not added now. These will be added in future patches.
Signed-off-by: Peng Fan peng.fan@nxp.com Cc: Marek Vasut marex@denx.de Cc: Mateusz Kulikowski mateusz.kulikowski@gmail.com Cc: Stefan Agner stefan@agner.ch Cc: Simon Glass sjg@chromium.org
drivers/usb/host/ehci-mx6.c | 144 +++++++++++++++++++++++++++++++++++++++----- 1 file changed, 130 insertions(+), 14 deletions(-)
Reviewed-by: Simon Glass sjg@chromium.org
Good start. Do you have a plan to drop the board_...() functions?
Yeah. I'll drop the board_ functions for dt+dm for ehci-mx6 in following up patches.
Thanks, Peng.
Regards, Simon

Hi Peng,
On Mon, Jun 20, 2016 at 7:15 AM, Peng Fan van.freenix@gmail.com wrote:
Hi Simon,
On Fri, Jun 17, 2016 at 04:59:49PM -0600, Simon Glass wrote:
Hi Peng,
On 17 June 2016 at 00:19, Peng Fan van.freenix@gmail.com wrote:
Support driver model for ehci mx6 driver. Consolidate code to be shared between DM and non-DM, such as introducing ehci_mx6_common_init. For simplicity, some old fasion code are keeped for DM usage, such as board_ehci_power and board_usb_phy_mode. And 'dr-mode', usbphy and vbus handling code for DM is not added now. These will be added in future patches.
Signed-off-by: Peng Fan peng.fan@nxp.com Cc: Marek Vasut marex@denx.de Cc: Mateusz Kulikowski mateusz.kulikowski@gmail.com Cc: Stefan Agner stefan@agner.ch Cc: Simon Glass sjg@chromium.org
drivers/usb/host/ehci-mx6.c | 144 +++++++++++++++++++++++++++++++++++++++----- 1 file changed, 130 insertions(+), 14 deletions(-)
Reviewed-by: Simon Glass sjg@chromium.org
Good start. Do you have a plan to drop the board_...() functions?
Yeah. I'll drop the board_ functions for dt+dm for ehci-mx6 in following up patches.
Have you tested this? Do we have any board that using this dm driver. It's not working for me may be I would have add vbus-supply or something.
thanks!

Hi Jagan, On Thu, Sep 29, 2016 at 05:38:32PM +0530, Jagan Teki wrote:
Hi Peng,
On Mon, Jun 20, 2016 at 7:15 AM, Peng Fan van.freenix@gmail.com wrote:
Hi Simon,
On Fri, Jun 17, 2016 at 04:59:49PM -0600, Simon Glass wrote:
Hi Peng,
On 17 June 2016 at 00:19, Peng Fan van.freenix@gmail.com wrote:
Support driver model for ehci mx6 driver. Consolidate code to be shared between DM and non-DM, such as introducing ehci_mx6_common_init. For simplicity, some old fasion code are keeped for DM usage, such as board_ehci_power and board_usb_phy_mode. And 'dr-mode', usbphy and vbus handling code for DM is not added now. These will be added in future patches.
Signed-off-by: Peng Fan peng.fan@nxp.com Cc: Marek Vasut marex@denx.de Cc: Mateusz Kulikowski mateusz.kulikowski@gmail.com Cc: Stefan Agner stefan@agner.ch Cc: Simon Glass sjg@chromium.org
drivers/usb/host/ehci-mx6.c | 144 +++++++++++++++++++++++++++++++++++++++----- 1 file changed, 130 insertions(+), 14 deletions(-)
Reviewed-by: Simon Glass sjg@chromium.org
Good start. Do you have a plan to drop the board_...() functions?
Yeah. I'll drop the board_ functions for dt+dm for ehci-mx6 in following up patches.
Have you tested this? Do we have any board that using this dm driver. It's not working for me may be I would have add vbus-supply or something.
Sorry for late reply. I tested it. I have not upstream any board that use this dm driver. The board_ functions are needed when you using this driver, I did not remove this.
Regards, Peng.
thanks!
Jagan Teki Free Software Engineer | www.openedev.com U-Boot, Linux | Upstream Maintainer Hyderabad, India.
participants (4)
-
Jagan Teki
-
Marek Vasut
-
Peng Fan
-
Simon Glass