diff mbox series

[U-Boot,RFC] usb: ehci-mx6: Create MISC USB device wrapper

Message ID 20190403151743.21097-1-aford173@gmail.com
State Deferred
Delegated to: Marek Vasut
Headers show
Series [U-Boot,RFC] usb: ehci-mx6: Create MISC USB device wrapper | expand

Commit Message

Adam Ford April 3, 2019, 3:17 p.m. UTC
In preparation to support DM_USB_GADGET, this creates a misc
device which binds the host.  This is necessary because
U_BOOT_DRIVER(usb_mx6) is currently hard coded to UCLASS_USB
and if we want to support UCLASS_USB_GADGET_GENERIC we'll need
to bind a separate device in the future.

Signed-off-by: Adam Ford <aford173@gmail.com>

Comments

Adam Ford April 3, 2019, 3:28 p.m. UTC | #1
On Wed, Apr 3, 2019 at 10:17 AM Adam Ford <aford173@gmail.com> wrote:
>
> In preparation to support DM_USB_GADGET, this creates a misc
> device which binds the host.  This is necessary because
> U_BOOT_DRIVER(usb_mx6) is currently hard coded to UCLASS_USB
> and if we want to support UCLASS_USB_GADGET_GENERIC we'll need
> to bind a separate device in the future.
>
> Signed-off-by: Adam Ford <aford173@gmail.com>
>
> diff --git a/drivers/usb/host/Kconfig b/drivers/usb/host/Kconfig
> index ba1e6bfa43..25c7e2d6a1 100644
> --- a/drivers/usb/host/Kconfig
> +++ b/drivers/usb/host/Kconfig
> @@ -134,6 +134,7 @@ config USB_EHCI_MARVELL
>
>  config USB_EHCI_MX6
>         bool "Support for i.MX6 on-chip EHCI USB controller"
> +       select MISC
>         depends on ARCH_MX6
>         default y
>         ---help---
> diff --git a/drivers/usb/host/ehci-mx6.c b/drivers/usb/host/ehci-mx6.c
> index 16abeef3b2..4003b8616f 100644
> --- a/drivers/usb/host/ehci-mx6.c
> +++ b/drivers/usb/host/ehci-mx6.c
> @@ -19,6 +19,7 @@
>  #include <asm/mach-types.h>
>  #include <power/regulator.h>
>  #include <linux/usb/otg.h>
> +#include <dm/lists.h>
>
>  #include "ehci.h"
>
> @@ -567,7 +568,6 @@ static const struct udevice_id mx6_usb_ids[] = {
>  U_BOOT_DRIVER(usb_mx6) = {
>         .name   = "ehci_mx6",
>         .id     = UCLASS_USB,
> -       .of_match = mx6_usb_ids,
>         .ofdata_to_platdata = ehci_usb_ofdata_to_platdata,
>         .probe  = ehci_usb_probe,
>         .remove = ehci_deregister,
> @@ -576,4 +576,30 @@ U_BOOT_DRIVER(usb_mx6) = {
>         .priv_auto_alloc_size = sizeof(struct ehci_mx6_priv_data),
>         .flags  = DM_FLAG_ALLOC_PRIV_DMA,
>  };
> +
> +static int mx6_usb_wrapper_bind(struct udevice *dev)
> +{
> +       const void *fdt = gd->fdt_blob;
> +       int node = dev_of_offset(dev);
> +       const char *name = fdt_get_name(fdt, node, NULL);
> +       int ret;
> +
For clarification, this patch, this patch should behave just like it
has been in the past.  The idea we'd check the dr_mode and/or ID pin
inside mx6_usb_wrapper_bind.  Instead of binding the ehci_mx6 with
UCLASS_USB all the time, we'd bind something with the
UCLASS_USB_GADGET_GENERIC based on dr_mode and/or ID pin status.
Before I go down a rabit hole, I thought I'd send out the RFC to see
what people's thoughts are.  If someone else has this driver already
updated to support DM_USB_GADGET or is working on it, I'll back off.

> +       ret = device_bind_driver_to_node(dev,
> +                                       "ehci_mx6",
> +                                       name,
> +                                       offset_to_ofnode(node),
> +                                       &dev);
> +       if (ret)
> +               pr_err("mx6_usb - Unable to bind USB host node\n");
> +
> +       return ret;
> +}
> +
> +U_BOOT_DRIVER(usb_mx6_wrapper) = {
> +       .name   = "mx6-usb-wrapper",
> +       .id     = UCLASS_MISC,
> +       .of_match = mx6_usb_ids,
> +       .bind = mx6_usb_wrapper_bind,
> +};
> +
>  #endif
> --
> 2.17.1
>
Simon Glass Aug. 13, 2019, 9:34 a.m. UTC | #2
Hi Adam,

On Wed, 3 Apr 2019 at 09:28, Adam Ford <aford173@gmail.com> wrote:
>
> On Wed, Apr 3, 2019 at 10:17 AM Adam Ford <aford173@gmail.com> wrote:
> >
> > In preparation to support DM_USB_GADGET, this creates a misc
> > device which binds the host.  This is necessary because
> > U_BOOT_DRIVER(usb_mx6) is currently hard coded to UCLASS_USB
> > and if we want to support UCLASS_USB_GADGET_GENERIC we'll need
> > to bind a separate device in the future.
> >
> > Signed-off-by: Adam Ford <aford173@gmail.com>
> >
> > diff --git a/drivers/usb/host/Kconfig b/drivers/usb/host/Kconfig
> > index ba1e6bfa43..25c7e2d6a1 100644
> > --- a/drivers/usb/host/Kconfig
> > +++ b/drivers/usb/host/Kconfig
> > @@ -134,6 +134,7 @@ config USB_EHCI_MARVELL
> >
> >  config USB_EHCI_MX6
> >         bool "Support for i.MX6 on-chip EHCI USB controller"
> > +       select MISC
> >         depends on ARCH_MX6
> >         default y
> >         ---help---
> > diff --git a/drivers/usb/host/ehci-mx6.c b/drivers/usb/host/ehci-mx6.c
> > index 16abeef3b2..4003b8616f 100644
> > --- a/drivers/usb/host/ehci-mx6.c
> > +++ b/drivers/usb/host/ehci-mx6.c
> > @@ -19,6 +19,7 @@
> >  #include <asm/mach-types.h>
> >  #include <power/regulator.h>
> >  #include <linux/usb/otg.h>
> > +#include <dm/lists.h>
> >
> >  #include "ehci.h"
> >
> > @@ -567,7 +568,6 @@ static const struct udevice_id mx6_usb_ids[] = {
> >  U_BOOT_DRIVER(usb_mx6) = {
> >         .name   = "ehci_mx6",
> >         .id     = UCLASS_USB,
> > -       .of_match = mx6_usb_ids,
> >         .ofdata_to_platdata = ehci_usb_ofdata_to_platdata,
> >         .probe  = ehci_usb_probe,
> >         .remove = ehci_deregister,
> > @@ -576,4 +576,30 @@ U_BOOT_DRIVER(usb_mx6) = {
> >         .priv_auto_alloc_size = sizeof(struct ehci_mx6_priv_data),
> >         .flags  = DM_FLAG_ALLOC_PRIV_DMA,
> >  };
> > +
> > +static int mx6_usb_wrapper_bind(struct udevice *dev)
> > +{
> > +       const void *fdt = gd->fdt_blob;
> > +       int node = dev_of_offset(dev);
> > +       const char *name = fdt_get_name(fdt, node, NULL);
> > +       int ret;
> > +
> For clarification, this patch, this patch should behave just like it
> has been in the past.  The idea we'd check the dr_mode and/or ID pin
> inside mx6_usb_wrapper_bind.  Instead of binding the ehci_mx6 with
> UCLASS_USB all the time, we'd bind something with the
> UCLASS_USB_GADGET_GENERIC based on dr_mode and/or ID pin status.
> Before I go down a rabit hole, I thought I'd send out the RFC to see
> what people's thoughts are.  If someone else has this driver already
> updated to support DM_USB_GADGET or is working on it, I'll back off.

It looks reasonable to me, but Marek is the USB expert.

>
> > +       ret = device_bind_driver_to_node(dev,
> > +                                       "ehci_mx6",
> > +                                       name,
> > +                                       offset_to_ofnode(node),
> > +                                       &dev);
> > +       if (ret)
> > +               pr_err("mx6_usb - Unable to bind USB host node\n");
> > +
> > +       return ret;
> > +}
> > +
> > +U_BOOT_DRIVER(usb_mx6_wrapper) = {
> > +       .name   = "mx6-usb-wrapper",
> > +       .id     = UCLASS_MISC,
> > +       .of_match = mx6_usb_ids,
> > +       .bind = mx6_usb_wrapper_bind,
> > +};
> > +
> >  #endif
> > --
> > 2.17.1
> >

Regards,
SImon
diff mbox series

Patch

diff --git a/drivers/usb/host/Kconfig b/drivers/usb/host/Kconfig
index ba1e6bfa43..25c7e2d6a1 100644
--- a/drivers/usb/host/Kconfig
+++ b/drivers/usb/host/Kconfig
@@ -134,6 +134,7 @@  config USB_EHCI_MARVELL
 
 config USB_EHCI_MX6
 	bool "Support for i.MX6 on-chip EHCI USB controller"
+	select MISC
 	depends on ARCH_MX6
 	default y
 	---help---
diff --git a/drivers/usb/host/ehci-mx6.c b/drivers/usb/host/ehci-mx6.c
index 16abeef3b2..4003b8616f 100644
--- a/drivers/usb/host/ehci-mx6.c
+++ b/drivers/usb/host/ehci-mx6.c
@@ -19,6 +19,7 @@ 
 #include <asm/mach-types.h>
 #include <power/regulator.h>
 #include <linux/usb/otg.h>
+#include <dm/lists.h>
 
 #include "ehci.h"
 
@@ -567,7 +568,6 @@  static const struct udevice_id mx6_usb_ids[] = {
 U_BOOT_DRIVER(usb_mx6) = {
 	.name	= "ehci_mx6",
 	.id	= UCLASS_USB,
-	.of_match = mx6_usb_ids,
 	.ofdata_to_platdata = ehci_usb_ofdata_to_platdata,
 	.probe	= ehci_usb_probe,
 	.remove = ehci_deregister,
@@ -576,4 +576,30 @@  U_BOOT_DRIVER(usb_mx6) = {
 	.priv_auto_alloc_size = sizeof(struct ehci_mx6_priv_data),
 	.flags	= DM_FLAG_ALLOC_PRIV_DMA,
 };
+
+static int mx6_usb_wrapper_bind(struct udevice *dev)
+{
+	const void *fdt = gd->fdt_blob;
+	int node = dev_of_offset(dev);
+	const char *name = fdt_get_name(fdt, node, NULL);
+	int ret;
+
+	ret = device_bind_driver_to_node(dev,
+					"ehci_mx6",
+					name,
+					offset_to_ofnode(node),
+					&dev);
+	if (ret)
+		pr_err("mx6_usb - Unable to bind USB host node\n");
+
+	return ret;
+}
+
+U_BOOT_DRIVER(usb_mx6_wrapper) = {
+	.name	= "mx6-usb-wrapper",
+	.id	= UCLASS_MISC,
+	.of_match = mx6_usb_ids,
+	.bind = mx6_usb_wrapper_bind,
+};
+
 #endif