* [U-Boot] [PATCH v1 1/7] usb: gadget: Do not call board_usb_xxx() directly in USB gadget drivers
2018-05-25 9:32 [U-Boot] [PATCH v1 0/7] Improvements for the dwc3_generic driver Jean-Jacques Hiblot
@ 2018-05-25 9:32 ` Jean-Jacques Hiblot
2018-05-28 8:35 ` Michal Simek
2018-05-25 9:32 ` [U-Boot] [PATCH v1 2/7] usb: introduce a separate config option for DM USB device Jean-Jacques Hiblot
` (6 subsequent siblings)
7 siblings, 1 reply; 18+ messages in thread
From: Jean-Jacques Hiblot @ 2018-05-25 9:32 UTC (permalink / raw)
To: u-boot
Add 2 functions to wrap the calls to board_usb_init() and
board_usb_cleanup().
Signed-off-by: Jean-Jacques Hiblot <jjhiblot@ti.com>
---
cmd/fastboot.c | 4 ++--
cmd/rockusb.c | 4 ++--
cmd/thordown.c | 4 ++--
cmd/usb_gadget_sdp.c | 4 ++--
cmd/usb_mass_storage.c | 4 ++--
common/dfu.c | 6 +++---
drivers/usb/gadget/ether.c | 38 +++++---------------------------------
include/linux/usb/gadget.h | 10 ++++++++++
8 files changed, 28 insertions(+), 46 deletions(-)
diff --git a/cmd/fastboot.c b/cmd/fastboot.c
index a5ec5f4..93f97fd 100644
--- a/cmd/fastboot.c
+++ b/cmd/fastboot.c
@@ -24,7 +24,7 @@ static int do_fastboot(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
usb_controller = argv[1];
controller_index = simple_strtoul(usb_controller, NULL, 0);
- ret = board_usb_init(controller_index, USB_INIT_DEVICE);
+ ret = usb_gadget_initialize(controller_index);
if (ret) {
pr_err("USB init failed: %d", ret);
return CMD_RET_FAILURE;
@@ -55,7 +55,7 @@ static int do_fastboot(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
exit:
g_dnl_unregister();
g_dnl_clear_detach();
- board_usb_cleanup(controller_index, USB_INIT_DEVICE);
+ usb_gadget_release(controller_index);
return ret;
}
diff --git a/cmd/rockusb.c b/cmd/rockusb.c
index 8206643..e0c1480 100644
--- a/cmd/rockusb.c
+++ b/cmd/rockusb.c
@@ -33,7 +33,7 @@ static int do_rockusb(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
dev_index = simple_strtoul(devnum, NULL, 0);
rockusb_dev_init(devtype, dev_index);
- ret = board_usb_init(controller_index, USB_INIT_DEVICE);
+ ret = usb_gadget_initialize(controller_index);
if (ret) {
printf("USB init failed: %d\n", ret);
return CMD_RET_FAILURE;
@@ -62,7 +62,7 @@ static int do_rockusb(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
exit:
g_dnl_unregister();
g_dnl_clear_detach();
- board_usb_cleanup(controller_index, USB_INIT_DEVICE);
+ usb_gadget_release(controller_index);
return ret;
}
diff --git a/cmd/thordown.c b/cmd/thordown.c
index e297de2..b7866d1 100644
--- a/cmd/thordown.c
+++ b/cmd/thordown.c
@@ -30,7 +30,7 @@ int do_thor_down(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
goto done;
int controller_index = simple_strtoul(usb_controller, NULL, 0);
- ret = board_usb_init(controller_index, USB_INIT_DEVICE);
+ ret = usb_gadget_initialize(controller_index);
if (ret) {
pr_err("USB init failed: %d", ret);
ret = CMD_RET_FAILURE;
@@ -55,7 +55,7 @@ int do_thor_down(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
exit:
g_dnl_unregister();
- board_usb_cleanup(controller_index, USB_INIT_DEVICE);
+ usb_gadget_realease(controller_index);
done:
dfu_free_entities();
diff --git a/cmd/usb_gadget_sdp.c b/cmd/usb_gadget_sdp.c
index ba1f66a..808ed97 100644
--- a/cmd/usb_gadget_sdp.c
+++ b/cmd/usb_gadget_sdp.c
@@ -20,7 +20,7 @@ static int do_sdp(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
char *usb_controller = argv[1];
int controller_index = simple_strtoul(usb_controller, NULL, 0);
- board_usb_init(controller_index, USB_INIT_DEVICE);
+ usb_gadget_initialize(controller_index);
g_dnl_clear_detach();
g_dnl_register("usb_dnl_sdp");
@@ -37,7 +37,7 @@ static int do_sdp(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
exit:
g_dnl_unregister();
- board_usb_cleanup(controller_index, USB_INIT_DEVICE);
+ usb_gadget_release(controller_index);
return ret;
}
diff --git a/cmd/usb_mass_storage.c b/cmd/usb_mass_storage.c
index 89b9ddf..7c6d0c6 100644
--- a/cmd/usb_mass_storage.c
+++ b/cmd/usb_mass_storage.c
@@ -160,7 +160,7 @@ static int do_usb_mass_storage(cmd_tbl_t *cmdtp, int flag,
controller_index = (unsigned int)(simple_strtoul(
usb_controller, NULL, 0));
- if (board_usb_init(controller_index, USB_INIT_DEVICE)) {
+ if (usb_gadget_initialize(controller_index)) {
pr_err("Couldn't init USB controller.");
rc = CMD_RET_FAILURE;
goto cleanup_ums_init;
@@ -231,7 +231,7 @@ static int do_usb_mass_storage(cmd_tbl_t *cmdtp, int flag,
cleanup_register:
g_dnl_unregister();
cleanup_board:
- board_usb_cleanup(controller_index, USB_INIT_DEVICE);
+ usb_gadget_release(controller_index);
cleanup_ums_init:
ums_fini();
diff --git a/common/dfu.c b/common/dfu.c
index 2620d32..44d1484 100644
--- a/common/dfu.c
+++ b/common/dfu.c
@@ -23,9 +23,9 @@ int run_usb_dnl_gadget(int usbctrl_index, char *usb_dnl_gadget)
bool dfu_reset = false;
int ret, i = 0;
- ret = board_usb_init(usbctrl_index, USB_INIT_DEVICE);
+ ret = usb_gadget_initialize(usbctrl_index);
if (ret) {
- pr_err("board usb init failed\n");
+ pr_err("usb_gadget_initialize failed\n");
return CMD_RET_FAILURE;
}
g_dnl_clear_detach();
@@ -84,7 +84,7 @@ int run_usb_dnl_gadget(int usbctrl_index, char *usb_dnl_gadget)
}
exit:
g_dnl_unregister();
- board_usb_cleanup(usbctrl_index, USB_INIT_DEVICE);
+ usb_gadget_release(usbctrl_index);
if (dfu_reset)
do_reset(NULL, 0, 0, NULL);
diff --git a/drivers/usb/gadget/ether.c b/drivers/usb/gadget/ether.c
index 8ab9b9f..1c438c3 100644
--- a/drivers/usb/gadget/ether.c
+++ b/drivers/usb/gadget/ether.c
@@ -105,9 +105,6 @@ struct eth_dev {
struct usb_gadget *gadget;
struct usb_request *req; /* for control responses */
struct usb_request *stat_req; /* for cdc & rndis status */
-#ifdef CONFIG_DM_USB
- struct udevice *usb_udev;
-#endif
u8 config;
struct usb_ep *in_ep, *out_ep, *status_ep;
@@ -2341,40 +2338,17 @@ fail:
}
/*-------------------------------------------------------------------------*/
-
-#ifdef CONFIG_DM_USB
-int dm_usb_init(struct eth_dev *e_dev)
-{
- struct udevice *dev = NULL;
- int ret;
-
- ret = uclass_first_device(UCLASS_USB_DEV_GENERIC, &dev);
- if (!dev || ret) {
- pr_err("No USB device found\n");
- return -ENODEV;
- }
-
- e_dev->usb_udev = dev;
-
- return ret;
-}
-#endif
-
static int _usb_eth_init(struct ether_priv *priv)
{
struct eth_dev *dev = &priv->ethdev;
struct usb_gadget *gadget;
unsigned long ts;
+ int ret;
unsigned long timeout = USB_CONNECT_TIMEOUT;
-#ifdef CONFIG_DM_USB
- if (dm_usb_init(dev)) {
- pr_err("USB ether not found\n");
- return -ENODEV;
- }
-#else
- board_usb_init(0, USB_INIT_DEVICE);
-#endif
+ ret = usb_gadget_initialize(0);
+ if (ret)
+ return ret;
/* Configure default mac-addresses for the USB ethernet device */
#ifdef CONFIG_USBNET_DEV_ADDR
@@ -2546,9 +2520,7 @@ void _usb_eth_halt(struct ether_priv *priv)
}
usb_gadget_unregister_driver(&priv->eth_driver);
-#ifndef CONFIG_DM_USB
- board_usb_cleanup(0, USB_INIT_DEVICE);
-#endif
+ usb_gadget_release(0);
}
#ifndef CONFIG_DM_ETH
diff --git a/include/linux/usb/gadget.h b/include/linux/usb/gadget.h
index b824f13..40ca2d3 100644
--- a/include/linux/usb/gadget.h
+++ b/include/linux/usb/gadget.h
@@ -19,6 +19,7 @@
#define __LINUX_USB_GADGET_H
#include <errno.h>
+#include <usb.h>
#include <linux/compat.h>
#include <linux/list.h>
@@ -926,4 +927,13 @@ extern void usb_ep_autoconfig_reset(struct usb_gadget *);
extern int usb_gadget_handle_interrupts(int index);
+static inline int usb_gadget_initialize(int index)
+{
+ return board_usb_init(index, USB_INIT_DEVICE);
+}
+
+static inline int usb_gadget_release(int index)
+{
+ return board_usb_cleanup(index, USB_INIT_DEVICE);
+}
#endif /* __LINUX_USB_GADGET_H */
--
2.7.4
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [U-Boot] [PATCH v1 1/7] usb: gadget: Do not call board_usb_xxx() directly in USB gadget drivers
2018-05-25 9:32 ` [U-Boot] [PATCH v1 1/7] usb: gadget: Do not call board_usb_xxx() directly in USB gadget drivers Jean-Jacques Hiblot
@ 2018-05-28 8:35 ` Michal Simek
2018-05-29 7:41 ` Jean-Jacques Hiblot
0 siblings, 1 reply; 18+ messages in thread
From: Michal Simek @ 2018-05-28 8:35 UTC (permalink / raw)
To: u-boot
On 25.5.2018 11:32, Jean-Jacques Hiblot wrote:
> Add 2 functions to wrap the calls to board_usb_init() and
> board_usb_cleanup().
Here should be written why you need this change.
M
>
> Signed-off-by: Jean-Jacques Hiblot <jjhiblot@ti.com>
> ---
>
> cmd/fastboot.c | 4 ++--
> cmd/rockusb.c | 4 ++--
> cmd/thordown.c | 4 ++--
> cmd/usb_gadget_sdp.c | 4 ++--
> cmd/usb_mass_storage.c | 4 ++--
> common/dfu.c | 6 +++---
> drivers/usb/gadget/ether.c | 38 +++++---------------------------------
> include/linux/usb/gadget.h | 10 ++++++++++
> 8 files changed, 28 insertions(+), 46 deletions(-)
>
> diff --git a/cmd/fastboot.c b/cmd/fastboot.c
> index a5ec5f4..93f97fd 100644
> --- a/cmd/fastboot.c
> +++ b/cmd/fastboot.c
> @@ -24,7 +24,7 @@ static int do_fastboot(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
> usb_controller = argv[1];
> controller_index = simple_strtoul(usb_controller, NULL, 0);
>
> - ret = board_usb_init(controller_index, USB_INIT_DEVICE);
> + ret = usb_gadget_initialize(controller_index);
> if (ret) {
> pr_err("USB init failed: %d", ret);
> return CMD_RET_FAILURE;
> @@ -55,7 +55,7 @@ static int do_fastboot(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
> exit:
> g_dnl_unregister();
> g_dnl_clear_detach();
> - board_usb_cleanup(controller_index, USB_INIT_DEVICE);
> + usb_gadget_release(controller_index);
>
> return ret;
> }
> diff --git a/cmd/rockusb.c b/cmd/rockusb.c
> index 8206643..e0c1480 100644
> --- a/cmd/rockusb.c
> +++ b/cmd/rockusb.c
> @@ -33,7 +33,7 @@ static int do_rockusb(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
> dev_index = simple_strtoul(devnum, NULL, 0);
> rockusb_dev_init(devtype, dev_index);
>
> - ret = board_usb_init(controller_index, USB_INIT_DEVICE);
> + ret = usb_gadget_initialize(controller_index);
> if (ret) {
> printf("USB init failed: %d\n", ret);
> return CMD_RET_FAILURE;
> @@ -62,7 +62,7 @@ static int do_rockusb(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
> exit:
> g_dnl_unregister();
> g_dnl_clear_detach();
> - board_usb_cleanup(controller_index, USB_INIT_DEVICE);
> + usb_gadget_release(controller_index);
>
> return ret;
> }
> diff --git a/cmd/thordown.c b/cmd/thordown.c
> index e297de2..b7866d1 100644
> --- a/cmd/thordown.c
> +++ b/cmd/thordown.c
> @@ -30,7 +30,7 @@ int do_thor_down(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
> goto done;
>
> int controller_index = simple_strtoul(usb_controller, NULL, 0);
> - ret = board_usb_init(controller_index, USB_INIT_DEVICE);
> + ret = usb_gadget_initialize(controller_index);
> if (ret) {
> pr_err("USB init failed: %d", ret);
> ret = CMD_RET_FAILURE;
> @@ -55,7 +55,7 @@ int do_thor_down(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
>
> exit:
> g_dnl_unregister();
> - board_usb_cleanup(controller_index, USB_INIT_DEVICE);
> + usb_gadget_realease(controller_index);
> done:
> dfu_free_entities();
>
> diff --git a/cmd/usb_gadget_sdp.c b/cmd/usb_gadget_sdp.c
> index ba1f66a..808ed97 100644
> --- a/cmd/usb_gadget_sdp.c
> +++ b/cmd/usb_gadget_sdp.c
> @@ -20,7 +20,7 @@ static int do_sdp(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
>
> char *usb_controller = argv[1];
> int controller_index = simple_strtoul(usb_controller, NULL, 0);
> - board_usb_init(controller_index, USB_INIT_DEVICE);
> + usb_gadget_initialize(controller_index);
>
> g_dnl_clear_detach();
> g_dnl_register("usb_dnl_sdp");
> @@ -37,7 +37,7 @@ static int do_sdp(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
>
> exit:
> g_dnl_unregister();
> - board_usb_cleanup(controller_index, USB_INIT_DEVICE);
> + usb_gadget_release(controller_index);
>
> return ret;
> }
> diff --git a/cmd/usb_mass_storage.c b/cmd/usb_mass_storage.c
> index 89b9ddf..7c6d0c6 100644
> --- a/cmd/usb_mass_storage.c
> +++ b/cmd/usb_mass_storage.c
> @@ -160,7 +160,7 @@ static int do_usb_mass_storage(cmd_tbl_t *cmdtp, int flag,
>
> controller_index = (unsigned int)(simple_strtoul(
> usb_controller, NULL, 0));
> - if (board_usb_init(controller_index, USB_INIT_DEVICE)) {
> + if (usb_gadget_initialize(controller_index)) {
> pr_err("Couldn't init USB controller.");
> rc = CMD_RET_FAILURE;
> goto cleanup_ums_init;
> @@ -231,7 +231,7 @@ static int do_usb_mass_storage(cmd_tbl_t *cmdtp, int flag,
> cleanup_register:
> g_dnl_unregister();
> cleanup_board:
> - board_usb_cleanup(controller_index, USB_INIT_DEVICE);
> + usb_gadget_release(controller_index);
> cleanup_ums_init:
> ums_fini();
>
> diff --git a/common/dfu.c b/common/dfu.c
> index 2620d32..44d1484 100644
> --- a/common/dfu.c
> +++ b/common/dfu.c
> @@ -23,9 +23,9 @@ int run_usb_dnl_gadget(int usbctrl_index, char *usb_dnl_gadget)
> bool dfu_reset = false;
> int ret, i = 0;
>
> - ret = board_usb_init(usbctrl_index, USB_INIT_DEVICE);
> + ret = usb_gadget_initialize(usbctrl_index);
> if (ret) {
> - pr_err("board usb init failed\n");
> + pr_err("usb_gadget_initialize failed\n");
> return CMD_RET_FAILURE;
> }
> g_dnl_clear_detach();
> @@ -84,7 +84,7 @@ int run_usb_dnl_gadget(int usbctrl_index, char *usb_dnl_gadget)
> }
> exit:
> g_dnl_unregister();
> - board_usb_cleanup(usbctrl_index, USB_INIT_DEVICE);
> + usb_gadget_release(usbctrl_index);
>
> if (dfu_reset)
> do_reset(NULL, 0, 0, NULL);
> diff --git a/drivers/usb/gadget/ether.c b/drivers/usb/gadget/ether.c
> index 8ab9b9f..1c438c3 100644
> --- a/drivers/usb/gadget/ether.c
> +++ b/drivers/usb/gadget/ether.c
> @@ -105,9 +105,6 @@ struct eth_dev {
> struct usb_gadget *gadget;
> struct usb_request *req; /* for control responses */
> struct usb_request *stat_req; /* for cdc & rndis status */
> -#ifdef CONFIG_DM_USB
> - struct udevice *usb_udev;
> -#endif
>
> u8 config;
> struct usb_ep *in_ep, *out_ep, *status_ep;
> @@ -2341,40 +2338,17 @@ fail:
> }
>
> /*-------------------------------------------------------------------------*/
> -
> -#ifdef CONFIG_DM_USB
> -int dm_usb_init(struct eth_dev *e_dev)
> -{
> - struct udevice *dev = NULL;
> - int ret;
> -
> - ret = uclass_first_device(UCLASS_USB_DEV_GENERIC, &dev);
> - if (!dev || ret) {
> - pr_err("No USB device found\n");
> - return -ENODEV;
> - }
> -
> - e_dev->usb_udev = dev;
> -
> - return ret;
> -}
> -#endif
> -
> static int _usb_eth_init(struct ether_priv *priv)
> {
> struct eth_dev *dev = &priv->ethdev;
> struct usb_gadget *gadget;
> unsigned long ts;
> + int ret;
> unsigned long timeout = USB_CONNECT_TIMEOUT;
>
> -#ifdef CONFIG_DM_USB
> - if (dm_usb_init(dev)) {
> - pr_err("USB ether not found\n");
> - return -ENODEV;
> - }
> -#else
> - board_usb_init(0, USB_INIT_DEVICE);
> -#endif
> + ret = usb_gadget_initialize(0);
> + if (ret)
> + return ret;
>
> /* Configure default mac-addresses for the USB ethernet device */
> #ifdef CONFIG_USBNET_DEV_ADDR
> @@ -2546,9 +2520,7 @@ void _usb_eth_halt(struct ether_priv *priv)
> }
>
> usb_gadget_unregister_driver(&priv->eth_driver);
> -#ifndef CONFIG_DM_USB
> - board_usb_cleanup(0, USB_INIT_DEVICE);
> -#endif
> + usb_gadget_release(0);
> }
>
> #ifndef CONFIG_DM_ETH
> diff --git a/include/linux/usb/gadget.h b/include/linux/usb/gadget.h
> index b824f13..40ca2d3 100644
> --- a/include/linux/usb/gadget.h
> +++ b/include/linux/usb/gadget.h
> @@ -19,6 +19,7 @@
> #define __LINUX_USB_GADGET_H
>
> #include <errno.h>
> +#include <usb.h>
> #include <linux/compat.h>
> #include <linux/list.h>
>
> @@ -926,4 +927,13 @@ extern void usb_ep_autoconfig_reset(struct usb_gadget *);
>
> extern int usb_gadget_handle_interrupts(int index);
>
> +static inline int usb_gadget_initialize(int index)
> +{
> + return board_usb_init(index, USB_INIT_DEVICE);
> +}
> +
> +static inline int usb_gadget_release(int index)
> +{
> + return board_usb_cleanup(index, USB_INIT_DEVICE);
> +}
> #endif /* __LINUX_USB_GADGET_H */
>
^ permalink raw reply [flat|nested] 18+ messages in thread
* [U-Boot] [PATCH v1 1/7] usb: gadget: Do not call board_usb_xxx() directly in USB gadget drivers
2018-05-28 8:35 ` Michal Simek
@ 2018-05-29 7:41 ` Jean-Jacques Hiblot
0 siblings, 0 replies; 18+ messages in thread
From: Jean-Jacques Hiblot @ 2018-05-29 7:41 UTC (permalink / raw)
To: u-boot
On 28/05/2018 10:35, Michal Simek wrote:
> On 25.5.2018 11:32, Jean-Jacques Hiblot wrote:
>> Add 2 functions to wrap the calls to board_usb_init() and
>> board_usb_cleanup().
> Here should be written why you need this change.
>
> M
I'll update the commit log.
It's a preparatory work for DM support for UDC drivers.
>
>> Signed-off-by: Jean-Jacques Hiblot <jjhiblot@ti.com>
>> ---
>>
>> cmd/fastboot.c | 4 ++--
>> cmd/rockusb.c | 4 ++--
>> cmd/thordown.c | 4 ++--
>> cmd/usb_gadget_sdp.c | 4 ++--
>> cmd/usb_mass_storage.c | 4 ++--
>> common/dfu.c | 6 +++---
>> drivers/usb/gadget/ether.c | 38 +++++---------------------------------
>> include/linux/usb/gadget.h | 10 ++++++++++
>> 8 files changed, 28 insertions(+), 46 deletions(-)
>>
>> diff --git a/cmd/fastboot.c b/cmd/fastboot.c
>> index a5ec5f4..93f97fd 100644
>> --- a/cmd/fastboot.c
>> +++ b/cmd/fastboot.c
>> @@ -24,7 +24,7 @@ static int do_fastboot(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
>> usb_controller = argv[1];
>> controller_index = simple_strtoul(usb_controller, NULL, 0);
>>
>> - ret = board_usb_init(controller_index, USB_INIT_DEVICE);
>> + ret = usb_gadget_initialize(controller_index);
>> if (ret) {
>> pr_err("USB init failed: %d", ret);
>> return CMD_RET_FAILURE;
>> @@ -55,7 +55,7 @@ static int do_fastboot(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
>> exit:
>> g_dnl_unregister();
>> g_dnl_clear_detach();
>> - board_usb_cleanup(controller_index, USB_INIT_DEVICE);
>> + usb_gadget_release(controller_index);
>>
>> return ret;
>> }
>> diff --git a/cmd/rockusb.c b/cmd/rockusb.c
>> index 8206643..e0c1480 100644
>> --- a/cmd/rockusb.c
>> +++ b/cmd/rockusb.c
>> @@ -33,7 +33,7 @@ static int do_rockusb(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
>> dev_index = simple_strtoul(devnum, NULL, 0);
>> rockusb_dev_init(devtype, dev_index);
>>
>> - ret = board_usb_init(controller_index, USB_INIT_DEVICE);
>> + ret = usb_gadget_initialize(controller_index);
>> if (ret) {
>> printf("USB init failed: %d\n", ret);
>> return CMD_RET_FAILURE;
>> @@ -62,7 +62,7 @@ static int do_rockusb(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
>> exit:
>> g_dnl_unregister();
>> g_dnl_clear_detach();
>> - board_usb_cleanup(controller_index, USB_INIT_DEVICE);
>> + usb_gadget_release(controller_index);
>>
>> return ret;
>> }
>> diff --git a/cmd/thordown.c b/cmd/thordown.c
>> index e297de2..b7866d1 100644
>> --- a/cmd/thordown.c
>> +++ b/cmd/thordown.c
>> @@ -30,7 +30,7 @@ int do_thor_down(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
>> goto done;
>>
>> int controller_index = simple_strtoul(usb_controller, NULL, 0);
>> - ret = board_usb_init(controller_index, USB_INIT_DEVICE);
>> + ret = usb_gadget_initialize(controller_index);
>> if (ret) {
>> pr_err("USB init failed: %d", ret);
>> ret = CMD_RET_FAILURE;
>> @@ -55,7 +55,7 @@ int do_thor_down(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
>>
>> exit:
>> g_dnl_unregister();
>> - board_usb_cleanup(controller_index, USB_INIT_DEVICE);
>> + usb_gadget_realease(controller_index);
>> done:
>> dfu_free_entities();
>>
>> diff --git a/cmd/usb_gadget_sdp.c b/cmd/usb_gadget_sdp.c
>> index ba1f66a..808ed97 100644
>> --- a/cmd/usb_gadget_sdp.c
>> +++ b/cmd/usb_gadget_sdp.c
>> @@ -20,7 +20,7 @@ static int do_sdp(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
>>
>> char *usb_controller = argv[1];
>> int controller_index = simple_strtoul(usb_controller, NULL, 0);
>> - board_usb_init(controller_index, USB_INIT_DEVICE);
>> + usb_gadget_initialize(controller_index);
>>
>> g_dnl_clear_detach();
>> g_dnl_register("usb_dnl_sdp");
>> @@ -37,7 +37,7 @@ static int do_sdp(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
>>
>> exit:
>> g_dnl_unregister();
>> - board_usb_cleanup(controller_index, USB_INIT_DEVICE);
>> + usb_gadget_release(controller_index);
>>
>> return ret;
>> }
>> diff --git a/cmd/usb_mass_storage.c b/cmd/usb_mass_storage.c
>> index 89b9ddf..7c6d0c6 100644
>> --- a/cmd/usb_mass_storage.c
>> +++ b/cmd/usb_mass_storage.c
>> @@ -160,7 +160,7 @@ static int do_usb_mass_storage(cmd_tbl_t *cmdtp, int flag,
>>
>> controller_index = (unsigned int)(simple_strtoul(
>> usb_controller, NULL, 0));
>> - if (board_usb_init(controller_index, USB_INIT_DEVICE)) {
>> + if (usb_gadget_initialize(controller_index)) {
>> pr_err("Couldn't init USB controller.");
>> rc = CMD_RET_FAILURE;
>> goto cleanup_ums_init;
>> @@ -231,7 +231,7 @@ static int do_usb_mass_storage(cmd_tbl_t *cmdtp, int flag,
>> cleanup_register:
>> g_dnl_unregister();
>> cleanup_board:
>> - board_usb_cleanup(controller_index, USB_INIT_DEVICE);
>> + usb_gadget_release(controller_index);
>> cleanup_ums_init:
>> ums_fini();
>>
>> diff --git a/common/dfu.c b/common/dfu.c
>> index 2620d32..44d1484 100644
>> --- a/common/dfu.c
>> +++ b/common/dfu.c
>> @@ -23,9 +23,9 @@ int run_usb_dnl_gadget(int usbctrl_index, char *usb_dnl_gadget)
>> bool dfu_reset = false;
>> int ret, i = 0;
>>
>> - ret = board_usb_init(usbctrl_index, USB_INIT_DEVICE);
>> + ret = usb_gadget_initialize(usbctrl_index);
>> if (ret) {
>> - pr_err("board usb init failed\n");
>> + pr_err("usb_gadget_initialize failed\n");
>> return CMD_RET_FAILURE;
>> }
>> g_dnl_clear_detach();
>> @@ -84,7 +84,7 @@ int run_usb_dnl_gadget(int usbctrl_index, char *usb_dnl_gadget)
>> }
>> exit:
>> g_dnl_unregister();
>> - board_usb_cleanup(usbctrl_index, USB_INIT_DEVICE);
>> + usb_gadget_release(usbctrl_index);
>>
>> if (dfu_reset)
>> do_reset(NULL, 0, 0, NULL);
>> diff --git a/drivers/usb/gadget/ether.c b/drivers/usb/gadget/ether.c
>> index 8ab9b9f..1c438c3 100644
>> --- a/drivers/usb/gadget/ether.c
>> +++ b/drivers/usb/gadget/ether.c
>> @@ -105,9 +105,6 @@ struct eth_dev {
>> struct usb_gadget *gadget;
>> struct usb_request *req; /* for control responses */
>> struct usb_request *stat_req; /* for cdc & rndis status */
>> -#ifdef CONFIG_DM_USB
>> - struct udevice *usb_udev;
>> -#endif
>>
>> u8 config;
>> struct usb_ep *in_ep, *out_ep, *status_ep;
>> @@ -2341,40 +2338,17 @@ fail:
>> }
>>
>> /*-------------------------------------------------------------------------*/
>> -
>> -#ifdef CONFIG_DM_USB
>> -int dm_usb_init(struct eth_dev *e_dev)
>> -{
>> - struct udevice *dev = NULL;
>> - int ret;
>> -
>> - ret = uclass_first_device(UCLASS_USB_DEV_GENERIC, &dev);
>> - if (!dev || ret) {
>> - pr_err("No USB device found\n");
>> - return -ENODEV;
>> - }
>> -
>> - e_dev->usb_udev = dev;
>> -
>> - return ret;
>> -}
>> -#endif
>> -
>> static int _usb_eth_init(struct ether_priv *priv)
>> {
>> struct eth_dev *dev = &priv->ethdev;
>> struct usb_gadget *gadget;
>> unsigned long ts;
>> + int ret;
>> unsigned long timeout = USB_CONNECT_TIMEOUT;
>>
>> -#ifdef CONFIG_DM_USB
>> - if (dm_usb_init(dev)) {
>> - pr_err("USB ether not found\n");
>> - return -ENODEV;
>> - }
>> -#else
>> - board_usb_init(0, USB_INIT_DEVICE);
>> -#endif
>> + ret = usb_gadget_initialize(0);
>> + if (ret)
>> + return ret;
>>
>> /* Configure default mac-addresses for the USB ethernet device */
>> #ifdef CONFIG_USBNET_DEV_ADDR
>> @@ -2546,9 +2520,7 @@ void _usb_eth_halt(struct ether_priv *priv)
>> }
>>
>> usb_gadget_unregister_driver(&priv->eth_driver);
>> -#ifndef CONFIG_DM_USB
>> - board_usb_cleanup(0, USB_INIT_DEVICE);
>> -#endif
>> + usb_gadget_release(0);
>> }
>>
>> #ifndef CONFIG_DM_ETH
>> diff --git a/include/linux/usb/gadget.h b/include/linux/usb/gadget.h
>> index b824f13..40ca2d3 100644
>> --- a/include/linux/usb/gadget.h
>> +++ b/include/linux/usb/gadget.h
>> @@ -19,6 +19,7 @@
>> #define __LINUX_USB_GADGET_H
>>
>> #include <errno.h>
>> +#include <usb.h>
>> #include <linux/compat.h>
>> #include <linux/list.h>
>>
>> @@ -926,4 +927,13 @@ extern void usb_ep_autoconfig_reset(struct usb_gadget *);
>>
>> extern int usb_gadget_handle_interrupts(int index);
>>
>> +static inline int usb_gadget_initialize(int index)
>> +{
>> + return board_usb_init(index, USB_INIT_DEVICE);
>> +}
>> +
>> +static inline int usb_gadget_release(int index)
>> +{
>> + return board_usb_cleanup(index, USB_INIT_DEVICE);
>> +}
>> #endif /* __LINUX_USB_GADGET_H */
>>
>
^ permalink raw reply [flat|nested] 18+ messages in thread
* [U-Boot] [PATCH v1 2/7] usb: introduce a separate config option for DM USB device
2018-05-25 9:32 [U-Boot] [PATCH v1 0/7] Improvements for the dwc3_generic driver Jean-Jacques Hiblot
2018-05-25 9:32 ` [U-Boot] [PATCH v1 1/7] usb: gadget: Do not call board_usb_xxx() directly in USB gadget drivers Jean-Jacques Hiblot
@ 2018-05-25 9:32 ` Jean-Jacques Hiblot
2018-05-28 8:37 ` Michal Simek
2018-05-25 9:32 ` [U-Boot] [PATCH v1 3/7] usb: udc: implement DM versions of usb_gadget_initialize()/_release()/_handle_interrupt() Jean-Jacques Hiblot
` (5 subsequent siblings)
7 siblings, 1 reply; 18+ messages in thread
From: Jean-Jacques Hiblot @ 2018-05-25 9:32 UTC (permalink / raw)
To: u-boot
Using CONFIG_DM_USB for this purpose prevents using DM_USB for host and not
for device.
Signed-off-by: Jean-Jacques Hiblot <jjhiblot@ti.com>
---
drivers/usb/Kconfig | 6 ++++++
drivers/usb/dwc3/core.c | 2 +-
drivers/usb/dwc3/dwc3-generic.c | 4 +++-
3 files changed, 10 insertions(+), 2 deletions(-)
diff --git a/drivers/usb/Kconfig b/drivers/usb/Kconfig
index 4fbe172..3587ba4 100644
--- a/drivers/usb/Kconfig
+++ b/drivers/usb/Kconfig
@@ -47,6 +47,12 @@ config DM_USB
declared with the U_BOOT_USB_DEVICE() macro and will be
automatically probed when found on the bus.
+config DM_USB_DEV
+ bool "Enable driver model for USB (Peripheral mode)"
+ depends on DM_USB
+ help
+ Enable driver model for USB (Peripheral mode).
+
source "drivers/usb/host/Kconfig"
source "drivers/usb/dwc3/Kconfig"
diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c
index 1ab5cee..d5ee6d9 100644
--- a/drivers/usb/dwc3/core.c
+++ b/drivers/usb/dwc3/core.c
@@ -789,7 +789,7 @@ MODULE_AUTHOR("Felipe Balbi <balbi@ti.com>");
MODULE_LICENSE("GPL v2");
MODULE_DESCRIPTION("DesignWare USB3 DRD Controller Driver");
-#ifdef CONFIG_DM_USB
+#ifdef CONFIG_DM_USB_DEV
int dwc3_init(struct dwc3 *dwc)
{
diff --git a/drivers/usb/dwc3/dwc3-generic.c b/drivers/usb/dwc3/dwc3-generic.c
index ca63eac..2c1e696 100644
--- a/drivers/usb/dwc3/dwc3-generic.c
+++ b/drivers/usb/dwc3/dwc3-generic.c
@@ -21,7 +21,7 @@
#include "gadget.h"
#include "linux-compat.h"
-DECLARE_GLOBAL_DATA_PTR;
+#ifdef CONFIG_DM_USB_DEV
int usb_gadget_handle_interrupts(int index)
{
@@ -98,6 +98,8 @@ U_BOOT_DRIVER(dwc3_generic_peripheral) = {
.flags = DM_FLAG_ALLOC_PRIV_DMA,
};
+#endif
+
static int dwc3_generic_bind(struct udevice *parent)
{
const void *fdt = gd->fdt_blob;
--
2.7.4
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [U-Boot] [PATCH v1 2/7] usb: introduce a separate config option for DM USB device
2018-05-25 9:32 ` [U-Boot] [PATCH v1 2/7] usb: introduce a separate config option for DM USB device Jean-Jacques Hiblot
@ 2018-05-28 8:37 ` Michal Simek
2018-05-29 7:40 ` Jean-Jacques Hiblot
0 siblings, 1 reply; 18+ messages in thread
From: Michal Simek @ 2018-05-28 8:37 UTC (permalink / raw)
To: u-boot
On 25.5.2018 11:32, Jean-Jacques Hiblot wrote:
> Using CONFIG_DM_USB for this purpose prevents using DM_USB for host and not
> for device.
>
> Signed-off-by: Jean-Jacques Hiblot <jjhiblot@ti.com>
> ---
>
> drivers/usb/Kconfig | 6 ++++++
> drivers/usb/dwc3/core.c | 2 +-
> drivers/usb/dwc3/dwc3-generic.c | 4 +++-
> 3 files changed, 10 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/usb/Kconfig b/drivers/usb/Kconfig
> index 4fbe172..3587ba4 100644
> --- a/drivers/usb/Kconfig
> +++ b/drivers/usb/Kconfig
> @@ -47,6 +47,12 @@ config DM_USB
> declared with the U_BOOT_USB_DEVICE() macro and will be
> automatically probed when found on the bus.
>
> +config DM_USB_DEV
> + bool "Enable driver model for USB (Peripheral mode)"
> + depends on DM_USB
> + help
> + Enable driver model for USB (Peripheral mode).
> +
> source "drivers/usb/host/Kconfig"
>
> source "drivers/usb/dwc3/Kconfig"
> diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c
> index 1ab5cee..d5ee6d9 100644
> --- a/drivers/usb/dwc3/core.c
> +++ b/drivers/usb/dwc3/core.c
> @@ -789,7 +789,7 @@ MODULE_AUTHOR("Felipe Balbi <balbi@ti.com>");
> MODULE_LICENSE("GPL v2");
> MODULE_DESCRIPTION("DesignWare USB3 DRD Controller Driver");
>
> -#ifdef CONFIG_DM_USB
> +#ifdef CONFIG_DM_USB_DEV
>
> int dwc3_init(struct dwc3 *dwc)
> {
> diff --git a/drivers/usb/dwc3/dwc3-generic.c b/drivers/usb/dwc3/dwc3-generic.c
> index ca63eac..2c1e696 100644
> --- a/drivers/usb/dwc3/dwc3-generic.c
> +++ b/drivers/usb/dwc3/dwc3-generic.c
> @@ -21,7 +21,7 @@
> #include "gadget.h"
> #include "linux-compat.h"
>
> -DECLARE_GLOBAL_DATA_PTR;
Removing this looks weird. I would expect that there will be new
error/warning when you compile it because gd is used in bind function.
M
> +#ifdef CONFIG_DM_USB_DEV
>
> int usb_gadget_handle_interrupts(int index)
> {
> @@ -98,6 +98,8 @@ U_BOOT_DRIVER(dwc3_generic_peripheral) = {
> .flags = DM_FLAG_ALLOC_PRIV_DMA,
> };
>
> +#endif
> +
> static int dwc3_generic_bind(struct udevice *parent)
> {
> const void *fdt = gd->fdt_blob;
>
^ permalink raw reply [flat|nested] 18+ messages in thread
* [U-Boot] [PATCH v1 2/7] usb: introduce a separate config option for DM USB device
2018-05-28 8:37 ` Michal Simek
@ 2018-05-29 7:40 ` Jean-Jacques Hiblot
0 siblings, 0 replies; 18+ messages in thread
From: Jean-Jacques Hiblot @ 2018-05-29 7:40 UTC (permalink / raw)
To: u-boot
On 28/05/2018 10:37, Michal Simek wrote:
> On 25.5.2018 11:32, Jean-Jacques Hiblot wrote:
>> Using CONFIG_DM_USB for this purpose prevents using DM_USB for host and not
>> for device.
>>
>> Signed-off-by: Jean-Jacques Hiblot <jjhiblot@ti.com>
>> ---
>>
>> drivers/usb/Kconfig | 6 ++++++
>> drivers/usb/dwc3/core.c | 2 +-
>> drivers/usb/dwc3/dwc3-generic.c | 4 +++-
>> 3 files changed, 10 insertions(+), 2 deletions(-)
>>
>> diff --git a/drivers/usb/Kconfig b/drivers/usb/Kconfig
>> index 4fbe172..3587ba4 100644
>> --- a/drivers/usb/Kconfig
>> +++ b/drivers/usb/Kconfig
>> @@ -47,6 +47,12 @@ config DM_USB
>> declared with the U_BOOT_USB_DEVICE() macro and will be
>> automatically probed when found on the bus.
>>
>> +config DM_USB_DEV
>> + bool "Enable driver model for USB (Peripheral mode)"
>> + depends on DM_USB
>> + help
>> + Enable driver model for USB (Peripheral mode).
>> +
>> source "drivers/usb/host/Kconfig"
>>
>> source "drivers/usb/dwc3/Kconfig"
>> diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c
>> index 1ab5cee..d5ee6d9 100644
>> --- a/drivers/usb/dwc3/core.c
>> +++ b/drivers/usb/dwc3/core.c
>> @@ -789,7 +789,7 @@ MODULE_AUTHOR("Felipe Balbi <balbi@ti.com>");
>> MODULE_LICENSE("GPL v2");
>> MODULE_DESCRIPTION("DesignWare USB3 DRD Controller Driver");
>>
>> -#ifdef CONFIG_DM_USB
>> +#ifdef CONFIG_DM_USB_DEV
>>
>> int dwc3_init(struct dwc3 *dwc)
>> {
>> diff --git a/drivers/usb/dwc3/dwc3-generic.c b/drivers/usb/dwc3/dwc3-generic.c
>> index ca63eac..2c1e696 100644
>> --- a/drivers/usb/dwc3/dwc3-generic.c
>> +++ b/drivers/usb/dwc3/dwc3-generic.c
>> @@ -21,7 +21,7 @@
>> #include "gadget.h"
>> #include "linux-compat.h"
>>
>> -DECLARE_GLOBAL_DATA_PTR;
> Removing this looks weird. I would expect that there will be new
> error/warning when you compile it because gd is used in bind function.
It must be declared somewhere else in the included headers, there is no
complain from the compiler.
>
> M
>
>> +#ifdef CONFIG_DM_USB_DEV
>>
>> int usb_gadget_handle_interrupts(int index)
>> {
>> @@ -98,6 +98,8 @@ U_BOOT_DRIVER(dwc3_generic_peripheral) = {
>> .flags = DM_FLAG_ALLOC_PRIV_DMA,
>> };
>>
>> +#endif
>> +
>> static int dwc3_generic_bind(struct udevice *parent)
>> {
>> const void *fdt = gd->fdt_blob;
>>
>
^ permalink raw reply [flat|nested] 18+ messages in thread
* [U-Boot] [PATCH v1 3/7] usb: udc: implement DM versions of usb_gadget_initialize()/_release()/_handle_interrupt()
2018-05-25 9:32 [U-Boot] [PATCH v1 0/7] Improvements for the dwc3_generic driver Jean-Jacques Hiblot
2018-05-25 9:32 ` [U-Boot] [PATCH v1 1/7] usb: gadget: Do not call board_usb_xxx() directly in USB gadget drivers Jean-Jacques Hiblot
2018-05-25 9:32 ` [U-Boot] [PATCH v1 2/7] usb: introduce a separate config option for DM USB device Jean-Jacques Hiblot
@ 2018-05-25 9:32 ` Jean-Jacques Hiblot
2018-05-28 7:29 ` Lukasz Majewski
2018-05-25 9:32 ` [U-Boot] [PATCH v1 4/7] dwc3_generic: do not probe the USB device driver when it's bound Jean-Jacques Hiblot
` (4 subsequent siblings)
7 siblings, 1 reply; 18+ messages in thread
From: Jean-Jacques Hiblot @ 2018-05-25 9:32 UTC (permalink / raw)
To: u-boot
When DM_USB_DEV the platform code for the USB device must be replaced by
calls to a USB device driver.
usb_gadget_initialize() probes the USB device driver.
usb_gadget_release() removes the USB device driver.
Signed-off-by: Jean-Jacques Hiblot <jjhiblot@ti.com>
---
drivers/usb/dwc3/dwc3-generic.c | 14 ++-----------
drivers/usb/gadget/udc/udc-core.c | 44 ++++++++++++++++++++++++++++++++++++++-
include/linux/usb/gadget.h | 8 +++++++
3 files changed, 53 insertions(+), 13 deletions(-)
diff --git a/drivers/usb/dwc3/dwc3-generic.c b/drivers/usb/dwc3/dwc3-generic.c
index 2c1e696..43e97be 100644
--- a/drivers/usb/dwc3/dwc3-generic.c
+++ b/drivers/usb/dwc3/dwc3-generic.c
@@ -23,19 +23,9 @@
#ifdef CONFIG_DM_USB_DEV
-int usb_gadget_handle_interrupts(int index)
+int dm_usb_gadget_handle_interrupts(struct udevice *dev)
{
- struct dwc3 *priv;
- struct udevice *dev;
- int ret;
-
- ret = uclass_first_device(UCLASS_USB_DEV_GENERIC, &dev);
- if (!dev || ret) {
- pr_err("No USB device found\n");
- return -ENODEV;
- }
-
- priv = dev_get_priv(dev);
+ struct dwc3 *priv = dev_get_priv(dev);
dwc3_gadget_uboot_handle_interrupt(priv);
diff --git a/drivers/usb/gadget/udc/udc-core.c b/drivers/usb/gadget/udc/udc-core.c
index f5c30dd..42c9ea9 100644
--- a/drivers/usb/gadget/udc/udc-core.c
+++ b/drivers/usb/gadget/udc/udc-core.c
@@ -18,7 +18,8 @@
#include <asm/cache.h>
#include <asm/dma-mapping.h>
#include <common.h>
-
+#include <dm.h>
+#include <dm/device-internal.h>
#include <linux/usb/ch9.h>
#include <linux/usb/gadget.h>
@@ -351,3 +352,44 @@ EXPORT_SYMBOL_GPL(usb_gadget_unregister_driver);
MODULE_DESCRIPTION("UDC Framework");
MODULE_AUTHOR("Felipe Balbi <balbi@ti.com>");
MODULE_LICENSE("GPL v2");
+
+#ifdef CONFIG_DM_USB_DEV
+#define MAX_UDC_DEVICES 4
+static struct udevice *dev_array[MAX_UDC_DEVICES];
+int usb_gadget_initialize(int index)
+{
+ int ret;
+ struct udevice *dev = NULL;
+
+ if (index < 0 || index >= ARRAY_SIZE(dev_array))
+ return -EINVAL;
+ if (dev_array[index])
+ return 0;
+ ret = uclass_get_device(UCLASS_USB_DEV_GENERIC, index, &dev);
+ if (!dev || ret) {
+ pr_err("No USB device found\n");
+ return -ENODEV;
+ }
+ dev_array[index] = dev;
+ return 0;
+}
+
+int usb_gadget_release(int index)
+{
+ int ret;
+
+ if (index < 0 || index >= ARRAY_SIZE(dev_array))
+ return -EINVAL;
+ ret = device_remove(dev_array[index], DM_REMOVE_NORMAL);
+ if (!ret)
+ dev_array[index] = NULL;
+ return ret;
+}
+
+int usb_gadget_handle_interrupts(int index)
+{
+ if (index < 0 || index >= ARRAY_SIZE(dev_array))
+ return -EINVAL;
+ return dm_usb_gadget_handle_interrupts(dev_array[index]);
+}
+#endif
diff --git a/include/linux/usb/gadget.h b/include/linux/usb/gadget.h
index 40ca2d3..a094e31 100644
--- a/include/linux/usb/gadget.h
+++ b/include/linux/usb/gadget.h
@@ -927,6 +927,12 @@ extern void usb_ep_autoconfig_reset(struct usb_gadget *);
extern int usb_gadget_handle_interrupts(int index);
+#ifdef CONFIG_DM_USB_DEV
+int usb_gadget_initialize(int index);
+int usb_gadget_release(int index);
+int dm_usb_gadget_handle_interrupts(struct udevice *dev);
+#else
+#include <usb.h>
static inline int usb_gadget_initialize(int index)
{
return board_usb_init(index, USB_INIT_DEVICE);
@@ -936,4 +942,6 @@ static inline int usb_gadget_release(int index)
{
return board_usb_cleanup(index, USB_INIT_DEVICE);
}
+#endif
+
#endif /* __LINUX_USB_GADGET_H */
--
2.7.4
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [U-Boot] [PATCH v1 4/7] dwc3_generic: do not probe the USB device driver when it's bound
2018-05-25 9:32 [U-Boot] [PATCH v1 0/7] Improvements for the dwc3_generic driver Jean-Jacques Hiblot
` (2 preceding siblings ...)
2018-05-25 9:32 ` [U-Boot] [PATCH v1 3/7] usb: udc: implement DM versions of usb_gadget_initialize()/_release()/_handle_interrupt() Jean-Jacques Hiblot
@ 2018-05-25 9:32 ` Jean-Jacques Hiblot
2018-05-25 9:32 ` [U-Boot] [PATCH v1 5/7] dwc3: move phy operation to core.c Jean-Jacques Hiblot
` (3 subsequent siblings)
7 siblings, 0 replies; 18+ messages in thread
From: Jean-Jacques Hiblot @ 2018-05-25 9:32 UTC (permalink / raw)
To: u-boot
The driver will be probed when usb_gadget_initialize() is called.
Signed-off-by: Jean-Jacques Hiblot <jjhiblot@ti.com>
---
drivers/usb/dwc3/dwc3-generic.c | 7 -------
1 file changed, 7 deletions(-)
diff --git a/drivers/usb/dwc3/dwc3-generic.c b/drivers/usb/dwc3/dwc3-generic.c
index 43e97be..3ec0c0e 100644
--- a/drivers/usb/dwc3/dwc3-generic.c
+++ b/drivers/usb/dwc3/dwc3-generic.c
@@ -71,21 +71,14 @@ static int dwc3_generic_peripheral_ofdata_to_platdata(struct udevice *dev)
return 0;
}
-static int dwc3_generic_peripheral_bind(struct udevice *dev)
-{
- return device_probe(dev);
-}
-
U_BOOT_DRIVER(dwc3_generic_peripheral) = {
.name = "dwc3-generic-peripheral",
.id = UCLASS_USB_DEV_GENERIC,
.ofdata_to_platdata = dwc3_generic_peripheral_ofdata_to_platdata,
.probe = dwc3_generic_peripheral_probe,
.remove = dwc3_generic_peripheral_remove,
- .bind = dwc3_generic_peripheral_bind,
.platdata_auto_alloc_size = sizeof(struct usb_platdata),
.priv_auto_alloc_size = sizeof(struct dwc3),
- .flags = DM_FLAG_ALLOC_PRIV_DMA,
};
#endif
--
2.7.4
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [U-Boot] [PATCH v1 5/7] dwc3: move phy operation to core.c
2018-05-25 9:32 [U-Boot] [PATCH v1 0/7] Improvements for the dwc3_generic driver Jean-Jacques Hiblot
` (3 preceding siblings ...)
2018-05-25 9:32 ` [U-Boot] [PATCH v1 4/7] dwc3_generic: do not probe the USB device driver when it's bound Jean-Jacques Hiblot
@ 2018-05-25 9:32 ` Jean-Jacques Hiblot
2018-05-25 9:32 ` [U-Boot] [PATCH v1 6/7] dwc3-generic: Handle the PHYs, the clocks and the reset lines Jean-Jacques Hiblot
` (2 subsequent siblings)
7 siblings, 0 replies; 18+ messages in thread
From: Jean-Jacques Hiblot @ 2018-05-25 9:32 UTC (permalink / raw)
To: u-boot
Those operations can be used for peripheral operation as well as host
operation.
Signed-off-by: Jean-Jacques Hiblot <jjhiblot@ti.com>
---
drivers/usb/dwc3/core.c | 88 ++++++++++++++++++++++++++++++++++++++++-
drivers/usb/dwc3/ep0.c | 1 -
drivers/usb/host/xhci-dwc3.c | 93 +++-----------------------------------------
include/dwc3-uboot.h | 7 ++++
4 files changed, 99 insertions(+), 90 deletions(-)
diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c
index d5ee6d9..538c603 100644
--- a/drivers/usb/dwc3/core.c
+++ b/drivers/usb/dwc3/core.c
@@ -19,7 +19,7 @@
#include <asm/dma-mapping.h>
#include <linux/ioport.h>
#include <dm.h>
-
+#include <generic-phy.h>
#include <linux/usb/ch9.h>
#include <linux/usb/gadget.h>
@@ -789,8 +789,92 @@ MODULE_AUTHOR("Felipe Balbi <balbi@ti.com>");
MODULE_LICENSE("GPL v2");
MODULE_DESCRIPTION("DesignWare USB3 DRD Controller Driver");
-#ifdef CONFIG_DM_USB_DEV
+#ifdef CONFIG_DM_USB
+int dwc3_setup_phy(struct udevice *dev, struct phy **array, int *num_phys)
+{
+ int i, ret, count;
+ struct phy *usb_phys;
+
+ /* Return if no phy declared */
+ if (!dev_read_prop(dev, "phys", NULL))
+ return 0;
+
+ count = dev_count_phandle_with_args(dev, "phys", "#phy-cells");
+ if (count <= 0)
+ return count;
+
+ usb_phys = devm_kcalloc(dev, count, sizeof(struct phy),
+ GFP_KERNEL);
+ if (!usb_phys)
+ return -ENOMEM;
+
+ for (i = 0; i < count; i++) {
+ ret = generic_phy_get_by_index(dev, i, &usb_phys[i]);
+ if (ret && ret != -ENOENT) {
+ pr_err("Failed to get USB PHY%d for %s\n",
+ i, dev->name);
+ return ret;
+ }
+ }
+
+ for (i = 0; i < count; i++) {
+ ret = generic_phy_init(&usb_phys[i]);
+ if (ret) {
+ pr_err("Can't init USB PHY%d for %s\n",
+ i, dev->name);
+ goto phys_init_err;
+ }
+ }
+
+ for (i = 0; i < count; i++) {
+ ret = generic_phy_power_on(&usb_phys[i]);
+ if (ret) {
+ pr_err("Can't power USB PHY%d for %s\n",
+ i, dev->name);
+ goto phys_poweron_err;
+ }
+ }
+
+ *num_phys = count;
+ return 0;
+phys_poweron_err:
+ for (i = count - 1; i >= 0; i--)
+ generic_phy_power_off(&usb_phys[i]);
+
+ for (i = 0; i < count; i++)
+ generic_phy_exit(&usb_phys[i]);
+
+ return ret;
+
+phys_init_err:
+ for (; i >= 0; i--)
+ generic_phy_exit(&usb_phys[i]);
+
+ return ret;
+}
+
+int dwc3_shutdown_phy(struct udevice *dev, struct phy *usb_phys, int num_phys)
+{
+ int i, ret;
+
+ for (i = 0; i < num_phys; i++) {
+ if (!generic_phy_valid(&usb_phys[i]))
+ continue;
+
+ ret = generic_phy_power_off(&usb_phys[i]);
+ ret |= generic_phy_exit(&usb_phys[i]);
+ if (ret) {
+ pr_err("Can't shutdown USB PHY%d for %s\n",
+ i, dev->name);
+ }
+ }
+
+ return 0;
+}
+#endif
+
+#ifdef CONFIG_DM_USB_DEV
int dwc3_init(struct dwc3 *dwc)
{
int ret;
diff --git a/drivers/usb/dwc3/ep0.c b/drivers/usb/dwc3/ep0.c
index 4f68887..433e5f6 100644
--- a/drivers/usb/dwc3/ep0.c
+++ b/drivers/usb/dwc3/ep0.c
@@ -19,7 +19,6 @@
#include <linux/usb/ch9.h>
#include <linux/usb/gadget.h>
#include <linux/usb/composite.h>
-
#include "core.h"
#include "gadget.h"
#include "io.h"
diff --git a/drivers/usb/host/xhci-dwc3.c b/drivers/usb/host/xhci-dwc3.c
index 80754d7..052e704 100644
--- a/drivers/usb/host/xhci-dwc3.c
+++ b/drivers/usb/host/xhci-dwc3.c
@@ -12,6 +12,7 @@
#include <fdtdec.h>
#include <generic-phy.h>
#include <usb.h>
+#include <dwc3-uboot.h>
#include "xhci.h"
#include <asm/io.h>
@@ -110,104 +111,20 @@ void dwc3_set_fladj(struct dwc3 *dwc3_reg, u32 val)
}
#ifdef CONFIG_DM_USB
-static int xhci_dwc3_setup_phy(struct udevice *dev)
-{
- struct xhci_dwc3_platdata *plat = dev_get_platdata(dev);
- int i, ret, count;
-
- /* Return if no phy declared */
- if (!dev_read_prop(dev, "phys", NULL))
- return 0;
-
- count = dev_count_phandle_with_args(dev, "phys", "#phy-cells");
- if (count <= 0)
- return count;
-
- plat->usb_phys = devm_kcalloc(dev, count, sizeof(struct phy),
- GFP_KERNEL);
- if (!plat->usb_phys)
- return -ENOMEM;
-
- for (i = 0; i < count; i++) {
- ret = generic_phy_get_by_index(dev, i, &plat->usb_phys[i]);
- if (ret && ret != -ENOENT) {
- pr_err("Failed to get USB PHY%d for %s\n",
- i, dev->name);
- return ret;
- }
-
- ++plat->num_phys;
- }
-
- for (i = 0; i < plat->num_phys; i++) {
- ret = generic_phy_init(&plat->usb_phys[i]);
- if (ret) {
- pr_err("Can't init USB PHY%d for %s\n",
- i, dev->name);
- goto phys_init_err;
- }
- }
-
- for (i = 0; i < plat->num_phys; i++) {
- ret = generic_phy_power_on(&plat->usb_phys[i]);
- if (ret) {
- pr_err("Can't power USB PHY%d for %s\n",
- i, dev->name);
- goto phys_poweron_err;
- }
- }
-
- return 0;
-
-phys_poweron_err:
- for (; i >= 0; i--)
- generic_phy_power_off(&plat->usb_phys[i]);
-
- for (i = 0; i < plat->num_phys; i++)
- generic_phy_exit(&plat->usb_phys[i]);
-
- return ret;
-
-phys_init_err:
- for (; i >= 0; i--)
- generic_phy_exit(&plat->usb_phys[i]);
-
- return ret;
-}
-
-static int xhci_dwc3_shutdown_phy(struct udevice *dev)
-{
- struct xhci_dwc3_platdata *plat = dev_get_platdata(dev);
- int i, ret;
-
- for (i = 0; i < plat->num_phys; i++) {
- if (!generic_phy_valid(&plat->usb_phys[i]))
- continue;
-
- ret = generic_phy_power_off(&plat->usb_phys[i]);
- ret |= generic_phy_exit(&plat->usb_phys[i]);
- if (ret) {
- pr_err("Can't shutdown USB PHY%d for %s\n",
- i, dev->name);
- }
- }
-
- return 0;
-}
-
static int xhci_dwc3_probe(struct udevice *dev)
{
struct xhci_hcor *hcor;
struct xhci_hccr *hccr;
struct dwc3 *dwc3_reg;
enum usb_dr_mode dr_mode;
+ struct xhci_dwc3_platdata *plat = dev_get_platdata(dev);
int ret;
hccr = (struct xhci_hccr *)((uintptr_t)dev_read_addr(dev));
hcor = (struct xhci_hcor *)((uintptr_t)hccr +
HC_LENGTH(xhci_readl(&(hccr)->cr_capbase)));
- ret = xhci_dwc3_setup_phy(dev);
+ ret = dwc3_setup_phy(dev, &plat->usb_phys, &plat->num_phys);
if (ret)
return ret;
@@ -227,7 +144,9 @@ static int xhci_dwc3_probe(struct udevice *dev)
static int xhci_dwc3_remove(struct udevice *dev)
{
- xhci_dwc3_shutdown_phy(dev);
+ struct xhci_dwc3_platdata *plat = dev_get_platdata(dev);
+
+ dwc3_shutdown_phy(dev, plat->usb_phys, plat->num_phys);
return xhci_deregister(dev);
}
diff --git a/include/dwc3-uboot.h b/include/dwc3-uboot.h
index 228ab3b..a2da081 100644
--- a/include/dwc3-uboot.h
+++ b/include/dwc3-uboot.h
@@ -38,4 +38,11 @@ struct dwc3_device {
int dwc3_uboot_init(struct dwc3_device *dev);
void dwc3_uboot_exit(int index);
void dwc3_uboot_handle_interrupt(int index);
+
+#ifdef CONFIG_DM_USB
+struct phy;
+int dwc3_setup_phy(struct udevice *dev, struct phy **array, int *num_phys);
+int dwc3_shutdown_phy(struct udevice *dev, struct phy *usb_phys, int num_phys);
+#endif
+
#endif /* __DWC3_UBOOT_H_ */
--
2.7.4
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [U-Boot] [PATCH v1 6/7] dwc3-generic: Handle the PHYs, the clocks and the reset lines
2018-05-25 9:32 [U-Boot] [PATCH v1 0/7] Improvements for the dwc3_generic driver Jean-Jacques Hiblot
` (4 preceding siblings ...)
2018-05-25 9:32 ` [U-Boot] [PATCH v1 5/7] dwc3: move phy operation to core.c Jean-Jacques Hiblot
@ 2018-05-25 9:32 ` Jean-Jacques Hiblot
2018-05-25 9:32 ` [U-Boot] [PATCH v1 7/7] dwc3-generic: Add select_dr_mode operation Jean-Jacques Hiblot
2018-05-28 8:32 ` [U-Boot] [PATCH v1 0/7] Improvements for the dwc3_generic driver Michal Simek
7 siblings, 0 replies; 18+ messages in thread
From: Jean-Jacques Hiblot @ 2018-05-25 9:32 UTC (permalink / raw)
To: u-boot
This make the driver more generic. At this point this driver can replace
the dwc3-of-simple implementation.
Make the description in the Kconfig more generic too.
Signed-off-by: Jean-Jacques Hiblot <jjhiblot@ti.com>
---
drivers/usb/dwc3/Kconfig | 7 +-
drivers/usb/dwc3/dwc3-generic.c | 159 +++++++++++++++++++++++++++++++++-------
2 files changed, 136 insertions(+), 30 deletions(-)
diff --git a/drivers/usb/dwc3/Kconfig b/drivers/usb/dwc3/Kconfig
index 943b763..bbd8105 100644
--- a/drivers/usb/dwc3/Kconfig
+++ b/drivers/usb/dwc3/Kconfig
@@ -38,10 +38,11 @@ config USB_DWC3_OMAP
Say 'Y' here if you have one such device
config USB_DWC3_GENERIC
- bool "Xilinx ZynqMP and similar Platforms"
- depends on DM_USB && USB_DWC3
+ bool "Generic implementation of a DWC3 wrapper (aka dwc3 glue)"
+ depends on DM_USB && USB_DWC3 && MISC
help
- Some platforms can reuse this DWC3 generic implementation.
+ Select this for Xilinx ZynqMP and similar Platforms.
+ This wrapper supports Host and Peripheral operation modes.
config USB_DWC3_UNIPHIER
bool "DesignWare USB3 Host Support on UniPhier Platforms"
diff --git a/drivers/usb/dwc3/dwc3-generic.c b/drivers/usb/dwc3/dwc3-generic.c
index 3ec0c0e..977f310 100644
--- a/drivers/usb/dwc3/dwc3-generic.c
+++ b/drivers/usb/dwc3/dwc3-generic.c
@@ -11,59 +11,85 @@
#include <dm.h>
#include <dm/device-internal.h>
#include <dm/lists.h>
-#include <linux/usb/otg.h>
-#include <linux/compat.h>
+#include <dwc3-uboot.h>
#include <linux/usb/ch9.h>
#include <linux/usb/gadget.h>
#include <malloc.h>
#include <usb.h>
#include "core.h"
#include "gadget.h"
-#include "linux-compat.h"
+#include <reset.h>
+#include <clk.h>
#ifdef CONFIG_DM_USB_DEV
+struct dwc3_generic_peripheral {
+ struct dwc3 dwc3;
+ struct phy *phys;
+ int num_phys;
+};
+
int dm_usb_gadget_handle_interrupts(struct udevice *dev)
{
- struct dwc3 *priv = dev_get_priv(dev);
+ struct dwc3_generic_peripheral *priv = dev_get_priv(dev);
+ struct dwc3 *dwc3 = &priv->dwc3;
- dwc3_gadget_uboot_handle_interrupt(priv);
+ dwc3_gadget_uboot_handle_interrupt(dwc3);
return 0;
}
static int dwc3_generic_peripheral_probe(struct udevice *dev)
{
- struct dwc3 *priv = dev_get_priv(dev);
+ int rc;
+ struct dwc3_generic_peripheral *priv = dev_get_priv(dev);
+ struct dwc3 *dwc3 = &priv->dwc3;
+
+ rc = dwc3_setup_phy(dev, &priv->phys, &priv->num_phys);
+ if (rc)
+ return rc;
+
+ dwc3->regs = map_physmem(priv->base, DWC3_OTG_REGS_END, MAP_NOCACHE);
+ dwc3->regs += DWC3_GLOBALS_REGS_START;
+ dwc3->dev = dev;
+
+ rc = dwc3_init(dwc3);
+ if (rc) {
+ unmap_physmem(dwc3->regs, MAP_NOCACHE);
+ return rc;
+ }
- return dwc3_init(priv);
+ return 0;
}
static int dwc3_generic_peripheral_remove(struct udevice *dev)
{
- struct dwc3 *priv = dev_get_priv(dev);
+ struct dwc3_generic_peripheral *priv = dev_get_priv(dev);
+ struct dwc3 *dwc3 = &priv->dwc3;
- dwc3_remove(priv);
+ dwc3_remove(dwc3);
+ dwc3_shutdown_phy(dev, priv->phys, priv->num_phys);
+ unmap_physmem(dwc3->regs, MAP_NOCACHE);
return 0;
}
static int dwc3_generic_peripheral_ofdata_to_platdata(struct udevice *dev)
{
- struct dwc3 *priv = dev_get_priv(dev);
+ struct dwc3_generic_peripheral *priv = dev_get_priv(dev);
+ struct dwc3 *dwc3 = &priv->dwc3;
int node = dev_of_offset(dev);
- priv->regs = (void *)devfdt_get_addr(dev);
- priv->regs += DWC3_GLOBALS_REGS_START;
+ priv->base = devfdt_get_addr(dev);
- priv->maximum_speed = usb_get_maximum_speed(node);
- if (priv->maximum_speed == USB_SPEED_UNKNOWN) {
+ dwc3->maximum_speed = usb_get_maximum_speed(node);
+ if (dwc3->maximum_speed == USB_SPEED_UNKNOWN) {
pr_err("Invalid usb maximum speed\n");
return -ENODEV;
}
- priv->dr_mode = usb_get_dr_mode(node);
- if (priv->dr_mode == USB_DR_MODE_UNKNOWN) {
+ dwc3->dr_mode = usb_get_dr_mode(node);
+ if (dwc3->dr_mode == USB_DR_MODE_UNKNOWN) {
pr_err("Invalid usb mode setup\n");
return -ENODEV;
}
@@ -77,13 +103,16 @@ U_BOOT_DRIVER(dwc3_generic_peripheral) = {
.ofdata_to_platdata = dwc3_generic_peripheral_ofdata_to_platdata,
.probe = dwc3_generic_peripheral_probe,
.remove = dwc3_generic_peripheral_remove,
- .platdata_auto_alloc_size = sizeof(struct usb_platdata),
- .priv_auto_alloc_size = sizeof(struct dwc3),
+ .priv_auto_alloc_size = sizeof(struct dwc3_generic_peripheral),
};
-
#endif
-static int dwc3_generic_bind(struct udevice *parent)
+struct dwc3_glue_data {
+ struct clk_bulk clks;
+ struct reset_ctl_bulk resets;
+};
+
+static int dwc3_glue_bind(struct udevice *parent)
{
const void *fdt = gd->fdt_blob;
int node;
@@ -94,29 +123,32 @@ static int dwc3_generic_bind(struct udevice *parent)
const char *name = fdt_get_name(fdt, node, NULL);
enum usb_dr_mode dr_mode;
struct udevice *dev;
- const char *driver;
+ const char *driver = NULL;
debug("%s: subnode name: %s\n", __func__, name);
- if (strncmp(name, "dwc3@", 4))
- continue;
dr_mode = usb_get_dr_mode(node);
switch (dr_mode) {
case USB_DR_MODE_PERIPHERAL:
case USB_DR_MODE_OTG:
+#ifdef CONFIG_DM_USB_DEV
debug("%s: dr_mode: OTG or Peripheral\n", __func__);
driver = "dwc3-generic-peripheral";
+#endif
break;
case USB_DR_MODE_HOST:
debug("%s: dr_mode: HOST\n", __func__);
- driver = "dwc3-generic-host";
+ driver = "xhci-dwc3";
break;
default:
debug("%s: unsupported dr_mode\n", __func__);
return -ENODEV;
};
+ if (!driver)
+ continue;
+
ret = device_bind_driver_to_node(parent, driver, name,
offset_to_ofnode(node), &dev);
if (ret) {
@@ -129,7 +161,76 @@ static int dwc3_generic_bind(struct udevice *parent)
return 0;
}
-static const struct udevice_id dwc3_generic_ids[] = {
+static int dwc3_glue_reset_init(struct udevice *dev,
+ struct dwc3_glue_data *glue)
+{
+ int ret;
+
+ ret = reset_get_bulk(dev, &glue->resets);
+ if (ret == -ENOTSUPP)
+ return 0;
+ else if (ret)
+ return ret;
+
+ ret = reset_deassert_bulk(&glue->resets);
+ if (ret) {
+ reset_release_bulk(&glue->resets);
+ return ret;
+ }
+
+ return 0;
+}
+
+static int dwc3_glue_clk_init(struct udevice *dev,
+ struct dwc3_glue_data *glue)
+{
+ int ret;
+
+ ret = clk_get_bulk(dev, &glue->clks);
+ if (ret == -ENOSYS)
+ return 0;
+ if (ret)
+ return ret;
+
+#if CONFIG_IS_ENABLED(CLK)
+ ret = clk_enable_bulk(&glue->clks);
+ if (ret) {
+ clk_release_bulk(&glue->clks);
+ return ret;
+ }
+#endif
+
+ return 0;
+}
+
+static int dwc3_glue_probe(struct udevice *dev)
+{
+ struct dwc3_glue_data *glue = dev_get_platdata(dev);
+ int ret;
+
+ ret = dwc3_glue_clk_init(dev, glue);
+ if (ret)
+ return ret;
+
+ ret = dwc3_glue_reset_init(dev, glue);
+ if (ret)
+ return ret;
+
+ return 0;
+}
+
+static int dwc3_glue_remove(struct udevice *dev)
+{
+ struct dwc3_glue_data *glue = dev_get_platdata(dev);
+
+ reset_release_bulk(&glue->resets);
+
+ clk_release_bulk(&glue->clks);
+
+ return dm_scan_fdt_dev(dev);
+}
+
+static const struct udevice_id dwc3_glue_ids[] = {
{ .compatible = "xlnx,zynqmp-dwc3" },
{ }
};
@@ -137,6 +238,10 @@ static const struct udevice_id dwc3_generic_ids[] = {
U_BOOT_DRIVER(dwc3_generic_wrapper) = {
.name = "dwc3-generic-wrapper",
.id = UCLASS_MISC,
- .of_match = dwc3_generic_ids,
- .bind = dwc3_generic_bind,
+ .of_match = dwc3_glue_ids,
+ .bind = dwc3_glue_bind,
+ .probe = dwc3_glue_probe,
+ .remove = dwc3_glue_remove,
+ .platdata_auto_alloc_size = sizeof(struct dwc3_glue_data),
+
};
--
2.7.4
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [U-Boot] [PATCH v1 7/7] dwc3-generic: Add select_dr_mode operation
2018-05-25 9:32 [U-Boot] [PATCH v1 0/7] Improvements for the dwc3_generic driver Jean-Jacques Hiblot
` (5 preceding siblings ...)
2018-05-25 9:32 ` [U-Boot] [PATCH v1 6/7] dwc3-generic: Handle the PHYs, the clocks and the reset lines Jean-Jacques Hiblot
@ 2018-05-25 9:32 ` Jean-Jacques Hiblot
2018-05-28 8:32 ` [U-Boot] [PATCH v1 0/7] Improvements for the dwc3_generic driver Michal Simek
7 siblings, 0 replies; 18+ messages in thread
From: Jean-Jacques Hiblot @ 2018-05-25 9:32 UTC (permalink / raw)
To: u-boot
The select_dr_mode operation is executed when the glue driver is probed.
The role of this optional function is to configure the operating mode
of the controller at the glue level.
Signed-off-by: Jean-Jacques Hiblot <jjhiblot@ti.com>
---
drivers/usb/dwc3/dwc3-generic.c | 26 ++++++++++++++++++++++++++
1 file changed, 26 insertions(+)
diff --git a/drivers/usb/dwc3/dwc3-generic.c b/drivers/usb/dwc3/dwc3-generic.c
index 977f310..9227501 100644
--- a/drivers/usb/dwc3/dwc3-generic.c
+++ b/drivers/usb/dwc3/dwc3-generic.c
@@ -8,6 +8,7 @@
*/
#include <common.h>
+#include <asm-generic/io.h>
#include <dm.h>
#include <dm/device-internal.h>
#include <dm/lists.h>
@@ -110,6 +111,12 @@ U_BOOT_DRIVER(dwc3_generic_peripheral) = {
struct dwc3_glue_data {
struct clk_bulk clks;
struct reset_ctl_bulk resets;
+ fdt_addr_t regs;
+};
+
+struct dwc3_glue_ops {
+ void (*select_dr_mode)(struct udevice *dev, int index,
+ enum usb_dr_mode mode);
};
static int dwc3_glue_bind(struct udevice *parent)
@@ -205,9 +212,14 @@ static int dwc3_glue_clk_init(struct udevice *dev,
static int dwc3_glue_probe(struct udevice *dev)
{
+ struct dwc3_glue_ops *ops = (struct dwc3_glue_ops *)dev_get_driver_data(dev);
struct dwc3_glue_data *glue = dev_get_platdata(dev);
+ struct udevice *child = NULL;
+ int index = 0;
int ret;
+ glue->regs = dev_read_addr(dev);
+
ret = dwc3_glue_clk_init(dev, glue);
if (ret)
return ret;
@@ -216,6 +228,20 @@ static int dwc3_glue_probe(struct udevice *dev)
if (ret)
return ret;
+ ret = device_find_first_child(dev, &child);
+ if (ret)
+ return ret;
+
+ while (child) {
+ enum usb_dr_mode dr_mode;
+
+ dr_mode = usb_get_dr_mode(dev_of_offset(child));
+ device_find_next_child(&child);
+ if (ops && ops->select_dr_mode)
+ ops->select_dr_mode(dev, index, dr_mode);
+ index++;
+ }
+
return 0;
}
--
2.7.4
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [U-Boot] [PATCH v1 0/7] Improvements for the dwc3_generic driver
2018-05-25 9:32 [U-Boot] [PATCH v1 0/7] Improvements for the dwc3_generic driver Jean-Jacques Hiblot
` (6 preceding siblings ...)
2018-05-25 9:32 ` [U-Boot] [PATCH v1 7/7] dwc3-generic: Add select_dr_mode operation Jean-Jacques Hiblot
@ 2018-05-28 8:32 ` Michal Simek
2018-05-28 9:47 ` Jean-Jacques Hiblot
7 siblings, 1 reply; 18+ messages in thread
From: Michal Simek @ 2018-05-28 8:32 UTC (permalink / raw)
To: u-boot
Hi Jean,
On 25.5.2018 11:32, Jean-Jacques Hiblot wrote:
> This series aims at bringing improvements to the dwc3_generic driver so
> that it can be used by most of the platforms using the dwc3 controller.
>
> I tested this on with DRA7 and AM57x platforms for both Peripheral and Host
> operations. The code to enable DM USB host & dev support for those
> platforms will be submitted in a separate series.
>
> Enhancements:
> - use separate Kconfig option for DM USB Periphal and DM USB Host. This
> allow platforms to keep their non-DM USB peripheral code and use the DM
> USB host.
> - fixes the bind/probe confusion in dwc3_generic. The probe is done when
> the USB device is first needed.
> - handles PHYs when in the peripheral mode. The code to handle the PHYs is
> shared with the host side
> - handles clock and reset
> - bind host controller to the more generic driver 'xhci-dwc3'
I see two series which were sent recently without any description of
dependencies.
Will be good to push these patches somewhere to git and send a link that
I can easily test.
Thanks,
Michal
>
>
>
> Jean-Jacques Hiblot (7):
> usb: gadget: Do not call board_usb_xxx() directly in USB gadget
> drivers
> usb: introduce a separate config option for DM USB device
> usb: udc: implement DM versions of
> usb_gadget_initialize()/_release()/_handle_interrupt()
> dwc3_generic: do not probe the USB device driver when it's bound
> dwc3: move phy operation to core.c
> dwc3-generic: Handle the PHYs, the clocks and the reset lines
> dwc3-generic: Add select_dr_mode operation
>
> cmd/fastboot.c | 4 +-
> cmd/rockusb.c | 4 +-
> cmd/thordown.c | 4 +-
> cmd/usb_gadget_sdp.c | 4 +-
> cmd/usb_mass_storage.c | 4 +-
> common/dfu.c | 6 +-
> drivers/usb/Kconfig | 6 ++
> drivers/usb/dwc3/Kconfig | 7 +-
> drivers/usb/dwc3/core.c | 86 +++++++++++++++-
> drivers/usb/dwc3/dwc3-generic.c | 206 +++++++++++++++++++++++++++++---------
> drivers/usb/dwc3/ep0.c | 1 -
> drivers/usb/gadget/ether.c | 38 +------
> drivers/usb/gadget/udc/udc-core.c | 44 +++++++-
> drivers/usb/host/xhci-dwc3.c | 93 ++---------------
> include/dwc3-uboot.h | 7 ++
> include/linux/usb/gadget.h | 18 ++++
> 16 files changed, 348 insertions(+), 184 deletions(-)
>
^ permalink raw reply [flat|nested] 18+ messages in thread
* [U-Boot] [PATCH v1 0/7] Improvements for the dwc3_generic driver
2018-05-28 8:32 ` [U-Boot] [PATCH v1 0/7] Improvements for the dwc3_generic driver Michal Simek
@ 2018-05-28 9:47 ` Jean-Jacques Hiblot
2018-05-28 10:25 ` Michal Simek
0 siblings, 1 reply; 18+ messages in thread
From: Jean-Jacques Hiblot @ 2018-05-28 9:47 UTC (permalink / raw)
To: u-boot
Hi Michal
On 28/05/2018 10:32, Michal Simek wrote:
> Hi Jean,
>
> On 25.5.2018 11:32, Jean-Jacques Hiblot wrote:
>> This series aims at bringing improvements to the dwc3_generic driver so
>> that it can be used by most of the platforms using the dwc3 controller.
>>
>> I tested this on with DRA7 and AM57x platforms for both Peripheral and Host
>> operations. The code to enable DM USB host & dev support for those
>> platforms will be submitted in a separate series.
>>
>> Enhancements:
>> - use separate Kconfig option for DM USB Periphal and DM USB Host. This
>> allow platforms to keep their non-DM USB peripheral code and use the DM
>> USB host.
>> - fixes the bind/probe confusion in dwc3_generic. The probe is done when
>> the USB device is first needed.
>> - handles PHYs when in the peripheral mode. The code to handle the PHYs is
>> shared with the host side
>> - handles clock and reset
>> - bind host controller to the more generic driver 'xhci-dwc3'
> I see two series which were sent recently without any description of
> dependencies.
Right I forgot. This series applies on to of the master branch of the
USB tree
> Will be good to push these patches somewhere to git and send a link that
> I can easily test.
I pushed all on github : https://github.com/jjhiblot/u-boot
JJ
>
> Thanks,
> Michal
>
>>
>>
>> Jean-Jacques Hiblot (7):
>> usb: gadget: Do not call board_usb_xxx() directly in USB gadget
>> drivers
>> usb: introduce a separate config option for DM USB device
>> usb: udc: implement DM versions of
>> usb_gadget_initialize()/_release()/_handle_interrupt()
>> dwc3_generic: do not probe the USB device driver when it's bound
>> dwc3: move phy operation to core.c
>> dwc3-generic: Handle the PHYs, the clocks and the reset lines
>> dwc3-generic: Add select_dr_mode operation
>>
>> cmd/fastboot.c | 4 +-
>> cmd/rockusb.c | 4 +-
>> cmd/thordown.c | 4 +-
>> cmd/usb_gadget_sdp.c | 4 +-
>> cmd/usb_mass_storage.c | 4 +-
>> common/dfu.c | 6 +-
>> drivers/usb/Kconfig | 6 ++
>> drivers/usb/dwc3/Kconfig | 7 +-
>> drivers/usb/dwc3/core.c | 86 +++++++++++++++-
>> drivers/usb/dwc3/dwc3-generic.c | 206 +++++++++++++++++++++++++++++---------
>> drivers/usb/dwc3/ep0.c | 1 -
>> drivers/usb/gadget/ether.c | 38 +------
>> drivers/usb/gadget/udc/udc-core.c | 44 +++++++-
>> drivers/usb/host/xhci-dwc3.c | 93 ++---------------
>> include/dwc3-uboot.h | 7 ++
>> include/linux/usb/gadget.h | 18 ++++
>> 16 files changed, 348 insertions(+), 184 deletions(-)
>>
>
^ permalink raw reply [flat|nested] 18+ messages in thread
* [U-Boot] [PATCH v1 0/7] Improvements for the dwc3_generic driver
2018-05-28 9:47 ` Jean-Jacques Hiblot
@ 2018-05-28 10:25 ` Michal Simek
2018-05-29 11:03 ` Jean-Jacques Hiblot
0 siblings, 1 reply; 18+ messages in thread
From: Michal Simek @ 2018-05-28 10:25 UTC (permalink / raw)
To: u-boot
Hi,
On 28.5.2018 11:47, Jean-Jacques Hiblot wrote:
> Hi Michal
>
>
> On 28/05/2018 10:32, Michal Simek wrote:
>> Hi Jean,
>>
>> On 25.5.2018 11:32, Jean-Jacques Hiblot wrote:
>>> This series aims at bringing improvements to the dwc3_generic driver so
>>> that it can be used by most of the platforms using the dwc3 controller.
>>>
>>> I tested this on with DRA7 and AM57x platforms for both Peripheral
>>> and Host
>>> operations. The code to enable DM USB host & dev support for those
>>> platforms will be submitted in a separate series.
>>>
>>> Enhancements:
>>> - use separate Kconfig option for DM USB Periphal and DM USB Host. This
>>> allow platforms to keep their non-DM USB peripheral code and use the DM
>>> USB host.
>>> - fixes the bind/probe confusion in dwc3_generic. The probe is done when
>>> the USB device is first needed.
>>> - handles PHYs when in the peripheral mode. The code to handle the
>>> PHYs is
>>> shared with the host side
>>> - handles clock and reset
>>> - bind host controller to the more generic driver 'xhci-dwc3'
>> I see two series which were sent recently without any description of
>> dependencies.
> Right I forgot. This series applies on to of the master branch of the
> USB tree
>> Will be good to push these patches somewhere to git and send a link that
>> I can easily test.
> I pushed all on github : https://github.com/jjhiblot/u-boot
I didn't build all patches to identify which one is introducing the
issue. But look below at issues and please fix them. Then I will test.
Thanks,
Michal
[u-boot](dwc3)$ nice -n 19 ./tools/buildman/buildman -b dwc3 zynqmp -o
../tmp/ -C -I -c 1 -sSed
boards.cfg is up to date. Nothing to do.
Summary of 1 commit for 20 boards (8 threads, 1 job per thread)
01: board: ti: am57xx: remove USB platform code
aarch64: + xilinx_zynqmp_zc1751_xm016_dc2
xilinx_zynqmp_zcu102_revA xilinx_zynqmp_zcu100_revC
xilinx_zynqmp_zcu104_revA xilinx_zynqmp_zc1751_xm017_dc3
xilinx_zynqmp_zcu102_revB xilinx_zynqmp_zcu106_revA
xilinx_zynqmp_zc1751_xm015_dc1 xilinx_zynqmp_zcu111_revA
xilinx_zynqmp_zcu102_rev1_0 xilinx_zynqmp_zcu104_revC
+common/built-in.o: In function `run_usb_dnl_gadget':
+build/../common/dfu.c:73: undefined reference to
`usb_gadget_handle_interrupts'
+build/../common/dfu.c:83: undefined reference to
`usb_gadget_handle_interrupts'
+make[1]: *** [u-boot] Error 139
+make: *** [sub-make] Error 2
+ usb_gadget_realease(controller_index);
+ ^~~~~~~~~~~~~~~~~~~
+cmd/built-in.o: In function `do_fastboot':
+build/../cmd/fastboot.c:50: undefined reference to
`usb_gadget_handle_interrupts'
+cmd/built-in.o: In function `do_thor_down':
+build/../cmd/thordown.c:58: undefined reference to `usb_gadget_realease'
+drivers/usb/gadget/built-in.o: In function `thor_rx_data':
+build/../drivers/usb/gadget/f_thor.c:555: undefined reference to
`usb_gadget_handle_interrupts'
+drivers/usb/gadget/built-in.o: In function `thor_tx_data':
+build/../drivers/usb/gadget/f_thor.c:589: undefined reference to
`usb_gadget_handle_interrupts'
+drivers/usb/gadget/built-in.o: In function `thor_init':
+build/../drivers/usb/gadget/f_thor.c:706: undefined reference to
`usb_gadget_handle_interrupts'
w+../cmd/thordown.c: In function ?do_thor_down?:
w+../cmd/thordown.c:58:2: warning: implicit declaration of function
?usb_gadget_realease? [-Wimplicit-function-declaration]
^ permalink raw reply [flat|nested] 18+ messages in thread
* [U-Boot] [PATCH v1 0/7] Improvements for the dwc3_generic driver
2018-05-28 10:25 ` Michal Simek
@ 2018-05-29 11:03 ` Jean-Jacques Hiblot
2018-05-29 11:08 ` Michal Simek
0 siblings, 1 reply; 18+ messages in thread
From: Jean-Jacques Hiblot @ 2018-05-29 11:03 UTC (permalink / raw)
To: u-boot
On 28/05/2018 12:25, Michal Simek wrote:
> Hi,
>
> On 28.5.2018 11:47, Jean-Jacques Hiblot wrote:
>> Hi Michal
>>
>>
>> On 28/05/2018 10:32, Michal Simek wrote:
>>> Hi Jean,
>>>
>>> On 25.5.2018 11:32, Jean-Jacques Hiblot wrote:
>>>> This series aims at bringing improvements to the dwc3_generic driver so
>>>> that it can be used by most of the platforms using the dwc3 controller.
>>>>
>>>> I tested this on with DRA7 and AM57x platforms for both Peripheral
>>>> and Host
>>>> operations. The code to enable DM USB host & dev support for those
>>>> platforms will be submitted in a separate series.
>>>>
>>>> Enhancements:
>>>> - use separate Kconfig option for DM USB Periphal and DM USB Host. This
>>>> allow platforms to keep their non-DM USB peripheral code and use the DM
>>>> USB host.
>>>> - fixes the bind/probe confusion in dwc3_generic. The probe is done when
>>>> the USB device is first needed.
>>>> - handles PHYs when in the peripheral mode. The code to handle the
>>>> PHYs is
>>>> shared with the host side
>>>> - handles clock and reset
>>>> - bind host controller to the more generic driver 'xhci-dwc3'
>>> I see two series which were sent recently without any description of
>>> dependencies.
>> Right I forgot. This series applies on to of the master branch of the
>> USB tree
>>> Will be good to push these patches somewhere to git and send a link that
>>> I can easily test.
>> I pushed all on github : https://github.com/jjhiblot/u-boot
> I didn't build all patches to identify which one is introducing the
> issue. But look below at issues and please fix them. Then I will test.
The CONFIG_DM_USB_DEV is missing from configuration.
This will be fixed in v2
>
> Thanks,
> Michal
>
> [u-boot](dwc3)$ nice -n 19 ./tools/buildman/buildman -b dwc3 zynqmp -o
> ../tmp/ -C -I -c 1 -sSed
> boards.cfg is up to date. Nothing to do.
> Summary of 1 commit for 20 boards (8 threads, 1 job per thread)
> 01: board: ti: am57xx: remove USB platform code
> aarch64: + xilinx_zynqmp_zc1751_xm016_dc2
> xilinx_zynqmp_zcu102_revA xilinx_zynqmp_zcu100_revC
> xilinx_zynqmp_zcu104_revA xilinx_zynqmp_zc1751_xm017_dc3
> xilinx_zynqmp_zcu102_revB xilinx_zynqmp_zcu106_revA
> xilinx_zynqmp_zc1751_xm015_dc1 xilinx_zynqmp_zcu111_revA
> xilinx_zynqmp_zcu102_rev1_0 xilinx_zynqmp_zcu104_revC
> +common/built-in.o: In function `run_usb_dnl_gadget':
> +build/../common/dfu.c:73: undefined reference to
> `usb_gadget_handle_interrupts'
> +build/../common/dfu.c:83: undefined reference to
> `usb_gadget_handle_interrupts'
> +make[1]: *** [u-boot] Error 139
> +make: *** [sub-make] Error 2
> + usb_gadget_realease(controller_index);
> + ^~~~~~~~~~~~~~~~~~~
> +cmd/built-in.o: In function `do_fastboot':
> +build/../cmd/fastboot.c:50: undefined reference to
> `usb_gadget_handle_interrupts'
> +cmd/built-in.o: In function `do_thor_down':
> +build/../cmd/thordown.c:58: undefined reference to `usb_gadget_realease'
> +drivers/usb/gadget/built-in.o: In function `thor_rx_data':
> +build/../drivers/usb/gadget/f_thor.c:555: undefined reference to
> `usb_gadget_handle_interrupts'
> +drivers/usb/gadget/built-in.o: In function `thor_tx_data':
> +build/../drivers/usb/gadget/f_thor.c:589: undefined reference to
> `usb_gadget_handle_interrupts'
> +drivers/usb/gadget/built-in.o: In function `thor_init':
> +build/../drivers/usb/gadget/f_thor.c:706: undefined reference to
> `usb_gadget_handle_interrupts'
> w+../cmd/thordown.c: In function ?do_thor_down?:
> w+../cmd/thordown.c:58:2: warning: implicit declaration of function
> ?usb_gadget_realease? [-Wimplicit-function-declaration]
>
>
^ permalink raw reply [flat|nested] 18+ messages in thread
* [U-Boot] [PATCH v1 0/7] Improvements for the dwc3_generic driver
2018-05-29 11:03 ` Jean-Jacques Hiblot
@ 2018-05-29 11:08 ` Michal Simek
0 siblings, 0 replies; 18+ messages in thread
From: Michal Simek @ 2018-05-29 11:08 UTC (permalink / raw)
To: u-boot
On 29.5.2018 13:03, Jean-Jacques Hiblot wrote:
>
>
> On 28/05/2018 12:25, Michal Simek wrote:
>> Hi,
>>
>> On 28.5.2018 11:47, Jean-Jacques Hiblot wrote:
>>> Hi Michal
>>>
>>>
>>> On 28/05/2018 10:32, Michal Simek wrote:
>>>> Hi Jean,
>>>>
>>>> On 25.5.2018 11:32, Jean-Jacques Hiblot wrote:
>>>>> This series aims at bringing improvements to the dwc3_generic
>>>>> driver so
>>>>> that it can be used by most of the platforms using the dwc3
>>>>> controller.
>>>>>
>>>>> I tested this on with DRA7 and AM57x platforms for both Peripheral
>>>>> and Host
>>>>> operations. The code to enable DM USB host & dev support for those
>>>>> platforms will be submitted in a separate series.
>>>>>
>>>>> Enhancements:
>>>>> - use separate Kconfig option for DM USB Periphal and DM USB Host.
>>>>> This
>>>>> allow platforms to keep their non-DM USB peripheral code and use
>>>>> the DM
>>>>> USB host.
>>>>> - fixes the bind/probe confusion in dwc3_generic. The probe is done
>>>>> when
>>>>> the USB device is first needed.
>>>>> - handles PHYs when in the peripheral mode. The code to handle the
>>>>> PHYs is
>>>>> shared with the host side
>>>>> - handles clock and reset
>>>>> - bind host controller to the more generic driver 'xhci-dwc3'
>>>> I see two series which were sent recently without any description of
>>>> dependencies.
>>> Right I forgot. This series applies on to of the master branch of the
>>> USB tree
>>>> Will be good to push these patches somewhere to git and send a link
>>>> that
>>>> I can easily test.
>>> I pushed all on github : https://github.com/jjhiblot/u-boot
>> I didn't build all patches to identify which one is introducing the
>> issue. But look below at issues and please fix them. Then I will test.
> The CONFIG_DM_USB_DEV is missing from configuration.
> This will be fixed in v2
ok. Please send it with another link to git repo.
Thanks,
Michal
^ permalink raw reply [flat|nested] 18+ messages in thread