[U-Boot] [PATCH v3] usb: dwc3: convert to livetree

From: Vipul Kumar vipul.kumar@xilinx.com
Update the DWC3 USB driver to support a live tree.
Signed-off-by: Vipul Kumar vipul.kumar@xilinx.com Signed-off-by: Siva Durga Prasad Paladugu siva.durga.paladugu@xilinx.com Tested-by: Michal Simek michal.simek@xilinx.com --- Changes in v3: - Used ofnode_valid() to check for node validity This fixes the below compilation failure for stih410-b2260_defconfig LD cmd/built-in.o drivers/usb/host/dwc3-sti-glue.c: In function ‘sti_dwc3_glue_bind’: drivers/usb/host/dwc3-sti-glue.c:160:16: error: invalid operands to binary <= (have ‘ofnode {aka union ofnode_union}’ and ‘int’) if (dwc3_node <= 0) { ^~ make[1]: *** [drivers/usb/host/dwc3-sti-glue.o] Error 1
Changes in v2: - compilation failures for am335x_hs_evm_uart platform during travis ci as v1 didn’t made corresponding changes to drivers/usb/musb-new/ti-musb.c as per live tree conversion. Now it is fixed in v2 by moving this driver to support live tree. Also fixed dwc3-sti-glue.c to support live tree. --- drivers/usb/common/common.c | 11 +++++------ drivers/usb/dwc3/dwc3-generic.c | 17 +++++++---------- drivers/usb/host/dwc3-sti-glue.c | 9 ++++----- drivers/usb/host/xhci-dwc3.c | 3 ++- drivers/usb/host/xhci-zynqmp.c | 3 +-- drivers/usb/musb-new/ti-musb.c | 11 ++++------- include/linux/usb/otg.h | 6 ++++-- 7 files changed, 27 insertions(+), 33 deletions(-)
diff --git a/drivers/usb/common/common.c b/drivers/usb/common/common.c index a55def5..3dea79b 100644 --- a/drivers/usb/common/common.c +++ b/drivers/usb/common/common.c @@ -10,6 +10,7 @@ #include <linux/libfdt.h> #include <linux/usb/otg.h> #include <linux/usb/ch9.h> +#include <dm.h>
DECLARE_GLOBAL_DATA_PTR;
@@ -20,13 +21,12 @@ static const char *const usb_dr_modes[] = { [USB_DR_MODE_OTG] = "otg", };
-enum usb_dr_mode usb_get_dr_mode(int node) +enum usb_dr_mode usb_get_dr_mode(ofnode node) { - const void *fdt = gd->fdt_blob; const char *dr_mode; int i;
- dr_mode = fdt_getprop(fdt, node, "dr_mode", NULL); + dr_mode = ofnode_get_property(node, "dr_mode", NULL); if (!dr_mode) { pr_err("usb dr_mode not found\n"); return USB_DR_MODE_UNKNOWN; @@ -48,13 +48,12 @@ static const char *const speed_names[] = { [USB_SPEED_SUPER] = "super-speed", };
-enum usb_device_speed usb_get_maximum_speed(int node) +enum usb_device_speed usb_get_maximum_speed(ofnode node) { - const void *fdt = gd->fdt_blob; const char *max_speed; int i;
- max_speed = fdt_getprop(fdt, node, "maximum-speed", NULL); + max_speed = ofnode_get_property(node, "maximum-speed", NULL); if (!max_speed) { pr_err("usb maximum-speed not found\n"); return USB_SPEED_UNKNOWN; diff --git a/drivers/usb/dwc3/dwc3-generic.c b/drivers/usb/dwc3/dwc3-generic.c index ca63eac..ef72c8c 100644 --- a/drivers/usb/dwc3/dwc3-generic.c +++ b/drivers/usb/dwc3/dwc3-generic.c @@ -61,18 +61,17 @@ static int dwc3_generic_peripheral_remove(struct udevice *dev) static int dwc3_generic_peripheral_ofdata_to_platdata(struct udevice *dev) { struct dwc3 *priv = dev_get_priv(dev); - int node = dev_of_offset(dev);
- priv->regs = (void *)devfdt_get_addr(dev); + priv->regs = (void *)dev_read_addr(dev); priv->regs += DWC3_GLOBALS_REGS_START;
- priv->maximum_speed = usb_get_maximum_speed(node); + priv->maximum_speed = usb_get_maximum_speed(dev->node); if (priv->maximum_speed == USB_SPEED_UNKNOWN) { pr_err("Invalid usb maximum speed\n"); return -ENODEV; }
- priv->dr_mode = usb_get_dr_mode(node); + priv->dr_mode = usb_get_dr_mode(dev->node); if (priv->dr_mode == USB_DR_MODE_UNKNOWN) { pr_err("Invalid usb mode setup\n"); return -ENODEV; @@ -100,13 +99,11 @@ U_BOOT_DRIVER(dwc3_generic_peripheral) = {
static int dwc3_generic_bind(struct udevice *parent) { - const void *fdt = gd->fdt_blob; - int node; + ofnode node; int ret;
- for (node = fdt_first_subnode(fdt, dev_of_offset(parent)); node > 0; - node = fdt_next_subnode(fdt, node)) { - const char *name = fdt_get_name(fdt, node, NULL); + dev_for_each_subnode(node, parent) { + const char *name = (char *)ofnode_get_name(node); enum usb_dr_mode dr_mode; struct udevice *dev; const char *driver; @@ -133,7 +130,7 @@ static int dwc3_generic_bind(struct udevice *parent) };
ret = device_bind_driver_to_node(parent, driver, name, - offset_to_ofnode(node), &dev); + node, &dev); if (ret) { debug("%s: not able to bind usb device mode\n", __func__); diff --git a/drivers/usb/host/dwc3-sti-glue.c b/drivers/usb/host/dwc3-sti-glue.c index ad7cf6e..88d9b54 100644 --- a/drivers/usb/host/dwc3-sti-glue.c +++ b/drivers/usb/host/dwc3-sti-glue.c @@ -153,18 +153,17 @@ static int sti_dwc3_glue_ofdata_to_platdata(struct udevice *dev) static int sti_dwc3_glue_bind(struct udevice *dev) { struct sti_dwc3_glue_platdata *plat = dev_get_platdata(dev); - int dwc3_node; + ofnode dwc3_node;
/* check if one subnode is present */ - dwc3_node = fdt_first_subnode(gd->fdt_blob, dev_of_offset(dev)); - if (dwc3_node <= 0) { + dwc3_node = dev_read_first_subnode(dev); + if (!ofnode_valid(dwc3_node)) { pr_err("Can't find subnode for %s\n", dev->name); return -ENODEV; }
/* check if the subnode compatible string is the dwc3 one*/ - if (fdt_node_check_compatible(gd->fdt_blob, dwc3_node, - "snps,dwc3") != 0) { + if (ofnode_device_is_compatible(dwc3_node, "snps,dwc3") != 0) { pr_err("Can't find dwc3 subnode for %s\n", dev->name); return -ENODEV; } diff --git a/drivers/usb/host/xhci-dwc3.c b/drivers/usb/host/xhci-dwc3.c index 80754d7..cbab436 100644 --- a/drivers/usb/host/xhci-dwc3.c +++ b/drivers/usb/host/xhci-dwc3.c @@ -202,6 +202,7 @@ static int xhci_dwc3_probe(struct udevice *dev) struct dwc3 *dwc3_reg; enum usb_dr_mode dr_mode; int ret; + ofnode node;
hccr = (struct xhci_hccr *)((uintptr_t)dev_read_addr(dev)); hcor = (struct xhci_hcor *)((uintptr_t)hccr + @@ -215,7 +216,7 @@ static int xhci_dwc3_probe(struct udevice *dev)
dwc3_core_init(dwc3_reg);
- dr_mode = usb_get_dr_mode(dev_of_offset(dev)); + dr_mode = usb_get_dr_mode(node); if (dr_mode == USB_DR_MODE_UNKNOWN) /* by default set dual role mode to HOST */ dr_mode = USB_DR_MODE_HOST; diff --git a/drivers/usb/host/xhci-zynqmp.c b/drivers/usb/host/xhci-zynqmp.c index e44e1ae..5a5b870 100644 --- a/drivers/usb/host/xhci-zynqmp.c +++ b/drivers/usb/host/xhci-zynqmp.c @@ -121,10 +121,9 @@ static int xhci_usb_remove(struct udevice *dev) static int xhci_usb_ofdata_to_platdata(struct udevice *dev) { struct zynqmp_xhci_platdata *plat = dev_get_platdata(dev); - const void *blob = gd->fdt_blob;
/* Get the base address for XHCI controller from the device node */ - plat->hcd_base = fdtdec_get_addr(blob, dev_of_offset(dev), "reg"); + plat->hcd_base = dev_read_addr(dev); if (plat->hcd_base == FDT_ADDR_T_NONE) { debug("Can't get the XHCI register base address\n"); return -ENXIO; diff --git a/drivers/usb/musb-new/ti-musb.c b/drivers/usb/musb-new/ti-musb.c index 9fbe2d6..bdb5985 100644 --- a/drivers/usb/musb-new/ti-musb.c +++ b/drivers/usb/musb-new/ti-musb.c @@ -177,7 +177,6 @@ static int ti_musb_host_ofdata_to_platdata(struct udevice *dev) { struct ti_musb_platdata *platdata = dev_get_platdata(dev); const void *fdt = gd->fdt_blob; - int node = dev_of_offset(dev); int ret;
ret = ti_musb_ofdata_to_platdata(dev); @@ -204,14 +203,12 @@ U_BOOT_DRIVER(ti_musb_host) = {
static int ti_musb_wrapper_bind(struct udevice *parent) { - const void *fdt = gd->fdt_blob; - int node; + ofnode node; int ret;
- for (node = fdt_first_subnode(fdt, dev_of_offset(parent)); node > 0; - node = fdt_next_subnode(fdt, node)) { + dev_for_each_subnode(node, parent) { struct udevice *dev; - const char *name = fdt_get_name(fdt, node, NULL); + const char *name = (char *)ofnode_get_name(node); enum usb_dr_mode dr_mode; struct driver *drv;
@@ -226,7 +223,7 @@ static int ti_musb_wrapper_bind(struct udevice *parent) case USB_DR_MODE_HOST: /* Bind MUSB host */ ret = device_bind_driver_to_node(parent, "ti-musb-host", - name, offset_to_ofnode(node), &dev); + name, node, &dev); if (ret) { pr_err("musb - not able to bind usb host node\n"); return ret; diff --git a/include/linux/usb/otg.h b/include/linux/usb/otg.h index d2604c5..baf4d91 100644 --- a/include/linux/usb/otg.h +++ b/include/linux/usb/otg.h @@ -9,6 +9,8 @@ #ifndef __LINUX_USB_OTG_H #define __LINUX_USB_OTG_H
+#include <dm/ofnode.h> + enum usb_dr_mode { USB_DR_MODE_UNKNOWN, USB_DR_MODE_HOST, @@ -23,7 +25,7 @@ enum usb_dr_mode { * The function gets phy interface string from property 'dr_mode', * and returns the correspondig enum usb_dr_mode */ -enum usb_dr_mode usb_get_dr_mode(int node); +enum usb_dr_mode usb_get_dr_mode(ofnode node);
/** * usb_get_maximum_speed() - Get maximum speed for given device @@ -32,6 +34,6 @@ enum usb_dr_mode usb_get_dr_mode(int node); * The function gets phy interface string from property 'maximum-speed', * and returns the correspondig enum usb_device_speed */ -enum usb_device_speed usb_get_maximum_speed(int node); +enum usb_device_speed usb_get_maximum_speed(ofnode node);
#endif /* __LINUX_USB_OTG_H */

Hi Marek/Michal,
Can you please review and let me know if any comments otherwise, please take it up.
Thanks, Siva
-----Original Message----- From: Siva Durga Prasad Paladugu [mailto:siva.durga.paladugu@xilinx.com] Sent: Friday, September 07, 2018 4:27 PM To: u-boot@lists.denx.de Cc: Michal Simek michals@xilinx.com; marex@denx.de; bmeng.cn@gmail.com; sjg@chromium.org; yamada.masahiro@socionext.com; Vipul Kumar vipulk@xilinx.com; Siva Durga Prasad Paladugu sivadur@xilinx.com Subject: [PATCH v3] usb: dwc3: convert to livetree
From: Vipul Kumar vipul.kumar@xilinx.com
Update the DWC3 USB driver to support a live tree.
Signed-off-by: Vipul Kumar vipul.kumar@xilinx.com Signed-off-by: Siva Durga Prasad Paladugu siva.durga.paladugu@xilinx.com Tested-by: Michal Simek michal.simek@xilinx.com
Changes in v3:
- Used ofnode_valid() to check for node validity This fixes the below compilation failure for stih410-b2260_defconfig LD cmd/built-in.o
drivers/usb/host/dwc3-sti-glue.c: In function ‘sti_dwc3_glue_bind’: drivers/usb/host/dwc3-sti-glue.c:160:16: error: invalid operands to binary <= (have ‘ofnode {aka union ofnode_union}’ and ‘int’) if (dwc3_node <= 0) { ^~ make[1]: *** [drivers/usb/host/dwc3-sti-glue.o] Error 1
Changes in v2:
- compilation failures for am335x_hs_evm_uart platform during travis ci as v1 didn’t made corresponding changes to drivers/usb/musb-new/ti-
musb.c as per live tree conversion. Now it is fixed in v2 by moving this driver to support live tree. Also fixed dwc3-sti-glue.c to support live tree.
drivers/usb/common/common.c | 11 +++++------ drivers/usb/dwc3/dwc3-generic.c | 17 +++++++---------- drivers/usb/host/dwc3-sti-glue.c | 9 ++++----- drivers/usb/host/xhci-dwc3.c | 3 ++- drivers/usb/host/xhci-zynqmp.c | 3 +-- drivers/usb/musb-new/ti-musb.c | 11 ++++------- include/linux/usb/otg.h | 6 ++++-- 7 files changed, 27 insertions(+), 33 deletions(-)
diff --git a/drivers/usb/common/common.c b/drivers/usb/common/common.c index a55def5..3dea79b 100644 --- a/drivers/usb/common/common.c +++ b/drivers/usb/common/common.c @@ -10,6 +10,7 @@ #include <linux/libfdt.h> #include <linux/usb/otg.h> #include <linux/usb/ch9.h> +#include <dm.h>
DECLARE_GLOBAL_DATA_PTR;
@@ -20,13 +21,12 @@ static const char *const usb_dr_modes[] = { [USB_DR_MODE_OTG] = "otg", };
-enum usb_dr_mode usb_get_dr_mode(int node) +enum usb_dr_mode usb_get_dr_mode(ofnode node) {
const void *fdt = gd->fdt_blob; const char *dr_mode; int i;
dr_mode = fdt_getprop(fdt, node, "dr_mode", NULL);
- dr_mode = ofnode_get_property(node, "dr_mode", NULL); if (!dr_mode) { pr_err("usb dr_mode not found\n"); return USB_DR_MODE_UNKNOWN;
@@ -48,13 +48,12 @@ static const char *const speed_names[] = { [USB_SPEED_SUPER] = "super-speed", };
-enum usb_device_speed usb_get_maximum_speed(int node) +enum usb_device_speed usb_get_maximum_speed(ofnode node) {
const void *fdt = gd->fdt_blob; const char *max_speed; int i;
max_speed = fdt_getprop(fdt, node, "maximum-speed", NULL);
- max_speed = ofnode_get_property(node, "maximum-speed",
NULL); if (!max_speed) { pr_err("usb maximum-speed not found\n"); return USB_SPEED_UNKNOWN; diff --git a/drivers/usb/dwc3/dwc3-generic.c b/drivers/usb/dwc3/dwc3- generic.c index ca63eac..ef72c8c 100644 --- a/drivers/usb/dwc3/dwc3-generic.c +++ b/drivers/usb/dwc3/dwc3-generic.c @@ -61,18 +61,17 @@ static int dwc3_generic_peripheral_remove(struct udevice *dev) static int dwc3_generic_peripheral_ofdata_to_platdata(struct udevice *dev) { struct dwc3 *priv = dev_get_priv(dev);
int node = dev_of_offset(dev);
priv->regs = (void *)devfdt_get_addr(dev);
- priv->regs = (void *)dev_read_addr(dev); priv->regs += DWC3_GLOBALS_REGS_START;
- priv->maximum_speed = usb_get_maximum_speed(node);
- priv->maximum_speed = usb_get_maximum_speed(dev->node); if (priv->maximum_speed == USB_SPEED_UNKNOWN) { pr_err("Invalid usb maximum speed\n"); return -ENODEV; }
- priv->dr_mode = usb_get_dr_mode(node);
- priv->dr_mode = usb_get_dr_mode(dev->node); if (priv->dr_mode == USB_DR_MODE_UNKNOWN) { pr_err("Invalid usb mode setup\n"); return -ENODEV;
@@ -100,13 +99,11 @@ U_BOOT_DRIVER(dwc3_generic_peripheral) = {
static int dwc3_generic_bind(struct udevice *parent) {
- const void *fdt = gd->fdt_blob;
- int node;
- ofnode node; int ret;
- for (node = fdt_first_subnode(fdt, dev_of_offset(parent)); node > 0;
node = fdt_next_subnode(fdt, node)) {
const char *name = fdt_get_name(fdt, node, NULL);
- dev_for_each_subnode(node, parent) {
enum usb_dr_mode dr_mode; struct udevice *dev; const char *driver;const char *name = (char *)ofnode_get_name(node);
@@ -133,7 +130,7 @@ static int dwc3_generic_bind(struct udevice *parent) };
ret = device_bind_driver_to_node(parent, driver, name,
offset_to_ofnode(node),
&dev);
if (ret) { debug("%s: not able to bind usb device mode\n", __func__);node, &dev);
diff --git a/drivers/usb/host/dwc3-sti-glue.c b/drivers/usb/host/dwc3-sti- glue.c index ad7cf6e..88d9b54 100644 --- a/drivers/usb/host/dwc3-sti-glue.c +++ b/drivers/usb/host/dwc3-sti-glue.c @@ -153,18 +153,17 @@ static int sti_dwc3_glue_ofdata_to_platdata(struct udevice *dev) static int sti_dwc3_glue_bind(struct udevice *dev) { struct sti_dwc3_glue_platdata *plat = dev_get_platdata(dev);
- int dwc3_node;
ofnode dwc3_node;
/* check if one subnode is present */
- dwc3_node = fdt_first_subnode(gd->fdt_blob, dev_of_offset(dev));
- if (dwc3_node <= 0) {
dwc3_node = dev_read_first_subnode(dev);
if (!ofnode_valid(dwc3_node)) { pr_err("Can't find subnode for %s\n", dev->name); return -ENODEV; }
/* check if the subnode compatible string is the dwc3 one*/
- if (fdt_node_check_compatible(gd->fdt_blob, dwc3_node,
"snps,dwc3") != 0) {
- if (ofnode_device_is_compatible(dwc3_node, "snps,dwc3") != 0) { pr_err("Can't find dwc3 subnode for %s\n", dev->name); return -ENODEV; }
diff --git a/drivers/usb/host/xhci-dwc3.c b/drivers/usb/host/xhci-dwc3.c index 80754d7..cbab436 100644 --- a/drivers/usb/host/xhci-dwc3.c +++ b/drivers/usb/host/xhci-dwc3.c @@ -202,6 +202,7 @@ static int xhci_dwc3_probe(struct udevice *dev) struct dwc3 *dwc3_reg; enum usb_dr_mode dr_mode; int ret;
ofnode node;
hccr = (struct xhci_hccr *)((uintptr_t)dev_read_addr(dev)); hcor = (struct xhci_hcor *)((uintptr_t)hccr + @@ -215,7 +216,7 @@
static int xhci_dwc3_probe(struct udevice *dev)
dwc3_core_init(dwc3_reg);
- dr_mode = usb_get_dr_mode(dev_of_offset(dev));
- dr_mode = usb_get_dr_mode(node); if (dr_mode == USB_DR_MODE_UNKNOWN) /* by default set dual role mode to HOST */ dr_mode = USB_DR_MODE_HOST;
diff --git a/drivers/usb/host/xhci-zynqmp.c b/drivers/usb/host/xhci- zynqmp.c index e44e1ae..5a5b870 100644 --- a/drivers/usb/host/xhci-zynqmp.c +++ b/drivers/usb/host/xhci-zynqmp.c @@ -121,10 +121,9 @@ static int xhci_usb_remove(struct udevice *dev) static int xhci_usb_ofdata_to_platdata(struct udevice *dev) { struct zynqmp_xhci_platdata *plat = dev_get_platdata(dev);
const void *blob = gd->fdt_blob;
/* Get the base address for XHCI controller from the device node */
plat->hcd_base = fdtdec_get_addr(blob, dev_of_offset(dev), "reg");
- plat->hcd_base = dev_read_addr(dev); if (plat->hcd_base == FDT_ADDR_T_NONE) { debug("Can't get the XHCI register base address\n"); return -ENXIO;
diff --git a/drivers/usb/musb-new/ti-musb.c b/drivers/usb/musb-new/ti- musb.c index 9fbe2d6..bdb5985 100644 --- a/drivers/usb/musb-new/ti-musb.c +++ b/drivers/usb/musb-new/ti-musb.c @@ -177,7 +177,6 @@ static int ti_musb_host_ofdata_to_platdata(struct udevice *dev) { struct ti_musb_platdata *platdata = dev_get_platdata(dev); const void *fdt = gd->fdt_blob;
int node = dev_of_offset(dev); int ret;
ret = ti_musb_ofdata_to_platdata(dev); @@ -204,14 +203,12 @@
U_BOOT_DRIVER(ti_musb_host) = {
static int ti_musb_wrapper_bind(struct udevice *parent) {
- const void *fdt = gd->fdt_blob;
- int node;
- ofnode node; int ret;
- for (node = fdt_first_subnode(fdt, dev_of_offset(parent)); node > 0;
node = fdt_next_subnode(fdt, node)) {
- dev_for_each_subnode(node, parent) { struct udevice *dev;
const char *name = fdt_get_name(fdt, node, NULL);
enum usb_dr_mode dr_mode; struct driver *drv;const char *name = (char *)ofnode_get_name(node);
@@ -226,7 +223,7 @@ static int ti_musb_wrapper_bind(struct udevice *parent) case USB_DR_MODE_HOST: /* Bind MUSB host */ ret = device_bind_driver_to_node(parent, "ti-musb- host",
name, offset_to_ofnode(node),
&dev);
name, node, &dev); if (ret) { pr_err("musb - not able to bind usb host
node\n"); return ret; diff --git a/include/linux/usb/otg.h b/include/linux/usb/otg.h index d2604c5..baf4d91 100644 --- a/include/linux/usb/otg.h +++ b/include/linux/usb/otg.h @@ -9,6 +9,8 @@ #ifndef __LINUX_USB_OTG_H #define __LINUX_USB_OTG_H
+#include <dm/ofnode.h>
enum usb_dr_mode { USB_DR_MODE_UNKNOWN, USB_DR_MODE_HOST, @@ -23,7 +25,7 @@ enum usb_dr_mode {
- The function gets phy interface string from property 'dr_mode',
- and returns the correspondig enum usb_dr_mode
*/ -enum usb_dr_mode usb_get_dr_mode(int node); +enum usb_dr_mode usb_get_dr_mode(ofnode node);
/**
- usb_get_maximum_speed() - Get maximum speed for given device @@ -
32,6 +34,6 @@ enum usb_dr_mode usb_get_dr_mode(int node);
- The function gets phy interface string from property 'maximum-speed',
- and returns the correspondig enum usb_device_speed
*/ -enum usb_device_speed usb_get_maximum_speed(int node); +enum usb_device_speed usb_get_maximum_speed(ofnode node);
#endif /* __LINUX_USB_OTG_H */
2.7.4

Hi,
On 21.9.2018 07:57, Siva Durga Prasad Paladugu wrote:
Hi Marek/Michal,
Can you please review and let me know if any comments otherwise, please take it up.
Thanks, Siva
-----Original Message----- From: Siva Durga Prasad Paladugu [mailto:siva.durga.paladugu@xilinx.com] Sent: Friday, September 07, 2018 4:27 PM To: u-boot@lists.denx.de Cc: Michal Simek michals@xilinx.com; marex@denx.de; bmeng.cn@gmail.com; sjg@chromium.org; yamada.masahiro@socionext.com; Vipul Kumar vipulk@xilinx.com; Siva Durga Prasad Paladugu sivadur@xilinx.com Subject: [PATCH v3] usb: dwc3: convert to livetree
From: Vipul Kumar vipul.kumar@xilinx.com
Update the DWC3 USB driver to support a live tree.
Signed-off-by: Vipul Kumar vipul.kumar@xilinx.com Signed-off-by: Siva Durga Prasad Paladugu siva.durga.paladugu@xilinx.com Tested-by: Michal Simek michal.simek@xilinx.com
Changes in v3:
- Used ofnode_valid() to check for node validity This fixes the below compilation failure for stih410-b2260_defconfig LD cmd/built-in.o
drivers/usb/host/dwc3-sti-glue.c: In function ‘sti_dwc3_glue_bind’: drivers/usb/host/dwc3-sti-glue.c:160:16: error: invalid operands to binary <= (have ‘ofnode {aka union ofnode_union}’ and ‘int’) if (dwc3_node <= 0) { ^~ make[1]: *** [drivers/usb/host/dwc3-sti-glue.o] Error 1
Changes in v2:
- compilation failures for am335x_hs_evm_uart platform during travis ci as v1 didn’t made corresponding changes to drivers/usb/musb-new/ti-
musb.c as per live tree conversion. Now it is fixed in v2 by moving this driver to support live tree. Also fixed dwc3-sti-glue.c to support live tree.
drivers/usb/common/common.c | 11 +++++------ drivers/usb/dwc3/dwc3-generic.c | 17 +++++++---------- drivers/usb/host/dwc3-sti-glue.c | 9 ++++----- drivers/usb/host/xhci-dwc3.c | 3 ++- drivers/usb/host/xhci-zynqmp.c | 3 +-- drivers/usb/musb-new/ti-musb.c | 11 ++++------- include/linux/usb/otg.h | 6 ++++-- 7 files changed, 27 insertions(+), 33 deletions(-)
diff --git a/drivers/usb/common/common.c b/drivers/usb/common/common.c index a55def5..3dea79b 100644 --- a/drivers/usb/common/common.c +++ b/drivers/usb/common/common.c @@ -10,6 +10,7 @@ #include <linux/libfdt.h> #include <linux/usb/otg.h> #include <linux/usb/ch9.h> +#include <dm.h>
DECLARE_GLOBAL_DATA_PTR;
@@ -20,13 +21,12 @@ static const char *const usb_dr_modes[] = { [USB_DR_MODE_OTG] = "otg", };
-enum usb_dr_mode usb_get_dr_mode(int node) +enum usb_dr_mode usb_get_dr_mode(ofnode node) {
const void *fdt = gd->fdt_blob; const char *dr_mode; int i;
dr_mode = fdt_getprop(fdt, node, "dr_mode", NULL);
- dr_mode = ofnode_get_property(node, "dr_mode", NULL); if (!dr_mode) { pr_err("usb dr_mode not found\n"); return USB_DR_MODE_UNKNOWN;
@@ -48,13 +48,12 @@ static const char *const speed_names[] = { [USB_SPEED_SUPER] = "super-speed", };
-enum usb_device_speed usb_get_maximum_speed(int node) +enum usb_device_speed usb_get_maximum_speed(ofnode node) {
const void *fdt = gd->fdt_blob; const char *max_speed; int i;
max_speed = fdt_getprop(fdt, node, "maximum-speed", NULL);
- max_speed = ofnode_get_property(node, "maximum-speed",
NULL); if (!max_speed) { pr_err("usb maximum-speed not found\n"); return USB_SPEED_UNKNOWN; diff --git a/drivers/usb/dwc3/dwc3-generic.c b/drivers/usb/dwc3/dwc3- generic.c index ca63eac..ef72c8c 100644 --- a/drivers/usb/dwc3/dwc3-generic.c +++ b/drivers/usb/dwc3/dwc3-generic.c @@ -61,18 +61,17 @@ static int dwc3_generic_peripheral_remove(struct udevice *dev) static int dwc3_generic_peripheral_ofdata_to_platdata(struct udevice *dev) { struct dwc3 *priv = dev_get_priv(dev);
int node = dev_of_offset(dev);
priv->regs = (void *)devfdt_get_addr(dev);
- priv->regs = (void *)dev_read_addr(dev); priv->regs += DWC3_GLOBALS_REGS_START;
- priv->maximum_speed = usb_get_maximum_speed(node);
- priv->maximum_speed = usb_get_maximum_speed(dev->node); if (priv->maximum_speed == USB_SPEED_UNKNOWN) { pr_err("Invalid usb maximum speed\n"); return -ENODEV; }
- priv->dr_mode = usb_get_dr_mode(node);
- priv->dr_mode = usb_get_dr_mode(dev->node); if (priv->dr_mode == USB_DR_MODE_UNKNOWN) { pr_err("Invalid usb mode setup\n"); return -ENODEV;
@@ -100,13 +99,11 @@ U_BOOT_DRIVER(dwc3_generic_peripheral) = {
static int dwc3_generic_bind(struct udevice *parent) {
- const void *fdt = gd->fdt_blob;
- int node;
- ofnode node; int ret;
- for (node = fdt_first_subnode(fdt, dev_of_offset(parent)); node > 0;
node = fdt_next_subnode(fdt, node)) {
const char *name = fdt_get_name(fdt, node, NULL);
- dev_for_each_subnode(node, parent) {
enum usb_dr_mode dr_mode; struct udevice *dev; const char *driver;const char *name = (char *)ofnode_get_name(node);
@@ -133,7 +130,7 @@ static int dwc3_generic_bind(struct udevice *parent) };
ret = device_bind_driver_to_node(parent, driver, name,
offset_to_ofnode(node),
&dev);
if (ret) { debug("%s: not able to bind usb device mode\n", __func__);node, &dev);
diff --git a/drivers/usb/host/dwc3-sti-glue.c b/drivers/usb/host/dwc3-sti- glue.c index ad7cf6e..88d9b54 100644 --- a/drivers/usb/host/dwc3-sti-glue.c +++ b/drivers/usb/host/dwc3-sti-glue.c @@ -153,18 +153,17 @@ static int sti_dwc3_glue_ofdata_to_platdata(struct udevice *dev) static int sti_dwc3_glue_bind(struct udevice *dev) { struct sti_dwc3_glue_platdata *plat = dev_get_platdata(dev);
- int dwc3_node;
ofnode dwc3_node;
/* check if one subnode is present */
- dwc3_node = fdt_first_subnode(gd->fdt_blob, dev_of_offset(dev));
- if (dwc3_node <= 0) {
dwc3_node = dev_read_first_subnode(dev);
if (!ofnode_valid(dwc3_node)) { pr_err("Can't find subnode for %s\n", dev->name); return -ENODEV; }
/* check if the subnode compatible string is the dwc3 one*/
- if (fdt_node_check_compatible(gd->fdt_blob, dwc3_node,
"snps,dwc3") != 0) {
- if (ofnode_device_is_compatible(dwc3_node, "snps,dwc3") != 0) { pr_err("Can't find dwc3 subnode for %s\n", dev->name); return -ENODEV; }
diff --git a/drivers/usb/host/xhci-dwc3.c b/drivers/usb/host/xhci-dwc3.c index 80754d7..cbab436 100644 --- a/drivers/usb/host/xhci-dwc3.c +++ b/drivers/usb/host/xhci-dwc3.c @@ -202,6 +202,7 @@ static int xhci_dwc3_probe(struct udevice *dev) struct dwc3 *dwc3_reg; enum usb_dr_mode dr_mode; int ret;
ofnode node;
hccr = (struct xhci_hccr *)((uintptr_t)dev_read_addr(dev)); hcor = (struct xhci_hcor *)((uintptr_t)hccr + @@ -215,7 +216,7 @@
static int xhci_dwc3_probe(struct udevice *dev)
dwc3_core_init(dwc3_reg);
- dr_mode = usb_get_dr_mode(dev_of_offset(dev));
- dr_mode = usb_get_dr_mode(node); if (dr_mode == USB_DR_MODE_UNKNOWN) /* by default set dual role mode to HOST */ dr_mode = USB_DR_MODE_HOST;
diff --git a/drivers/usb/host/xhci-zynqmp.c b/drivers/usb/host/xhci- zynqmp.c index e44e1ae..5a5b870 100644 --- a/drivers/usb/host/xhci-zynqmp.c +++ b/drivers/usb/host/xhci-zynqmp.c @@ -121,10 +121,9 @@ static int xhci_usb_remove(struct udevice *dev) static int xhci_usb_ofdata_to_platdata(struct udevice *dev) { struct zynqmp_xhci_platdata *plat = dev_get_platdata(dev);
const void *blob = gd->fdt_blob;
/* Get the base address for XHCI controller from the device node */
plat->hcd_base = fdtdec_get_addr(blob, dev_of_offset(dev), "reg");
- plat->hcd_base = dev_read_addr(dev); if (plat->hcd_base == FDT_ADDR_T_NONE) { debug("Can't get the XHCI register base address\n"); return -ENXIO;
diff --git a/drivers/usb/musb-new/ti-musb.c b/drivers/usb/musb-new/ti- musb.c index 9fbe2d6..bdb5985 100644 --- a/drivers/usb/musb-new/ti-musb.c +++ b/drivers/usb/musb-new/ti-musb.c @@ -177,7 +177,6 @@ static int ti_musb_host_ofdata_to_platdata(struct udevice *dev) { struct ti_musb_platdata *platdata = dev_get_platdata(dev); const void *fdt = gd->fdt_blob;
int node = dev_of_offset(dev); int ret;
ret = ti_musb_ofdata_to_platdata(dev); @@ -204,14 +203,12 @@
U_BOOT_DRIVER(ti_musb_host) = {
static int ti_musb_wrapper_bind(struct udevice *parent) {
- const void *fdt = gd->fdt_blob;
- int node;
- ofnode node; int ret;
- for (node = fdt_first_subnode(fdt, dev_of_offset(parent)); node > 0;
node = fdt_next_subnode(fdt, node)) {
- dev_for_each_subnode(node, parent) { struct udevice *dev;
const char *name = fdt_get_name(fdt, node, NULL);
enum usb_dr_mode dr_mode; struct driver *drv;const char *name = (char *)ofnode_get_name(node);
@@ -226,7 +223,7 @@ static int ti_musb_wrapper_bind(struct udevice *parent) case USB_DR_MODE_HOST: /* Bind MUSB host */ ret = device_bind_driver_to_node(parent, "ti-musb- host",
name, offset_to_ofnode(node),
&dev);
name, node, &dev); if (ret) { pr_err("musb - not able to bind usb host
node\n"); return ret; diff --git a/include/linux/usb/otg.h b/include/linux/usb/otg.h index d2604c5..baf4d91 100644 --- a/include/linux/usb/otg.h +++ b/include/linux/usb/otg.h @@ -9,6 +9,8 @@ #ifndef __LINUX_USB_OTG_H #define __LINUX_USB_OTG_H
+#include <dm/ofnode.h>
enum usb_dr_mode { USB_DR_MODE_UNKNOWN, USB_DR_MODE_HOST, @@ -23,7 +25,7 @@ enum usb_dr_mode {
- The function gets phy interface string from property 'dr_mode',
- and returns the correspondig enum usb_dr_mode
*/ -enum usb_dr_mode usb_get_dr_mode(int node); +enum usb_dr_mode usb_get_dr_mode(ofnode node);
/**
- usb_get_maximum_speed() - Get maximum speed for given device @@ -
32,6 +34,6 @@ enum usb_dr_mode usb_get_dr_mode(int node);
- The function gets phy interface string from property 'maximum-speed',
- and returns the correspondig enum usb_device_speed
*/ -enum usb_device_speed usb_get_maximum_speed(int node); +enum usb_device_speed usb_get_maximum_speed(ofnode node);
#endif /* __LINUX_USB_OTG_H */
2.7.4
I have build manually all targets which Tom reported: am335x_hs_evm am335x_hs_evm_uart brppt1_spi brppt1_mmc am335x_evm brppt1_nand and stih410-b2260
Travis is also clean.
Marek: Can you please put it to your queue?
Thanks, Michal
participants (3)
-
Michal Simek
-
Siva Durga Prasad Paladugu
-
Siva Durga Prasad Paladugu