usb: Migrate to support live DT for some driver
authorKever Yang <kever.yang@rock-chips.com>
Wed, 4 Mar 2020 00:59:50 +0000 (08:59 +0800)
committerMarek Vasut <marek.vasut+renesas@gmail.com>
Mon, 13 Apr 2020 11:48:30 +0000 (13:48 +0200)
Use ofnode_ instead of fdt_ APIs so that the drivers can support live DT.
This patch updates usb_get_dr_mode() and usb_get_maximum_speed() to use
ofnode as parameter instead of fdt offset. And all the drivers who use
these APIs update to use live dt APIs at the same time.

Signed-off-by: Kever Yang <kever.yang@rock-chips.com>
drivers/usb/cdns3/core.c
drivers/usb/cdns3/gadget.c
drivers/usb/common/common.c
drivers/usb/dwc3/dwc3-generic.c
drivers/usb/dwc3/dwc3-meson-g12a.c
drivers/usb/gadget/dwc2_udc_otg.c
drivers/usb/host/dwc3-sti-glue.c
drivers/usb/host/ehci-mx6.c
drivers/usb/host/xhci-dwc3.c
drivers/usb/musb-new/ti-musb.c
include/linux/usb/otg.h

index f947e6983c05d956e97d8d4405ca40be979005cc..ce846488a89c8725ea3eb10b15b16e9f9fee39d2 100644 (file)
@@ -108,7 +108,7 @@ static int cdns3_core_init_role(struct cdns3 *cdns)
        enum usb_dr_mode dr_mode;
        int ret = 0;
 
-       dr_mode = usb_get_dr_mode(dev_of_offset(dev));
+       dr_mode = usb_get_dr_mode(dev->node);
        cdns->role = USB_ROLE_NONE;
 
        /*
@@ -384,22 +384,20 @@ static const struct udevice_id cdns3_ids[] = {
 
 int cdns3_bind(struct udevice *parent)
 {
-       int from = dev_of_offset(parent);
-       const void *fdt = gd->fdt_blob;
        enum usb_dr_mode dr_mode;
        struct udevice *dev;
        const char *driver;
        const char *name;
-       int node;
+       ofnode node;
        int ret;
 
-       node = fdt_node_offset_by_compatible(fdt, from, "cdns,usb3");
-       if (node < 0) {
+       node = ofnode_by_compatible(parent->node, "cdns,usb3");
+       if (!ofnode_valid(node)) {
                ret = -ENODEV;
                goto fail;
        }
 
-       name = fdt_get_name(fdt, node, NULL);
+       name = ofnode_get_name(node);
        dr_mode = usb_get_dr_mode(node);
 
        switch (dr_mode) {
@@ -422,8 +420,7 @@ int cdns3_bind(struct udevice *parent)
                goto fail;
        };
 
-       ret = device_bind_driver_to_node(parent, driver, name,
-                                        offset_to_ofnode(node), &dev);
+       ret = device_bind_driver_to_node(parent, driver, name, node, &dev);
        if (ret) {
                printf("%s: not able to bind usb device mode\n",
                       __func__);
index 8377eb458b6a8eeabff02d0e80eb34e018a4c880..caed27c32f9216aeba9f27f895a898cfd4a1b595 100644 (file)
@@ -2579,7 +2579,7 @@ static int cdns3_gadget_start(struct cdns3 *cdns)
        if (!priv_dev->onchip_buffers)
                priv_dev->onchip_buffers = 256;
 
-       max_speed = usb_get_maximum_speed(dev_of_offset(cdns->dev));
+       max_speed = usb_get_maximum_speed(dev_ofnode(cdns->dev));
 
        /* Check the maximum_speed parameter */
        switch (max_speed) {
index a55def5aba67466d83d829af88e8c657a886d752..0db281b970ef6913694c778868a5428d59c08156 100644 (file)
@@ -7,7 +7,7 @@
  */
 
 #include <common.h>
-#include <linux/libfdt.h>
+#include <dm.h>
 #include <linux/usb/otg.h>
 #include <linux/usb/ch9.h>
 
@@ -20,13 +20,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_read_string(node, "dr_mode");
        if (!dr_mode) {
                pr_err("usb dr_mode not found\n");
                return USB_DR_MODE_UNKNOWN;
@@ -48,13 +47,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_read_string(node, "maximum-speed");
        if (!max_speed) {
                pr_err("usb maximum-speed not found\n");
                return USB_SPEED_UNKNOWN;
index 3e116b2c5cc412c0b0e60612c65baf0823746af4..febcfc0f54c48e80ba932c351de1565ab3d7b60f 100644 (file)
@@ -88,9 +88,9 @@ static int dwc3_generic_remove(struct udevice *dev,
 static int dwc3_generic_ofdata_to_platdata(struct udevice *dev)
 {
        struct dwc3_generic_plat *plat = dev_get_platdata(dev);
-       int node = dev_of_offset(dev);
+       ofnode node = dev->node;
 
-       plat->base = devfdt_get_addr(dev);
+       plat->base = dev_read_addr(dev);
 
        plat->maximum_speed = usb_get_maximum_speed(node);
        if (plat->maximum_speed == USB_SPEED_UNKNOWN) {
@@ -284,13 +284,11 @@ struct dwc3_glue_ops ti_ops = {
 
 static int dwc3_glue_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);
+       ofnode_for_each_subnode(node, parent->node) {
+               const char *name = ofnode_get_name(node);
                enum usb_dr_mode dr_mode;
                struct udevice *dev;
                const char *driver = NULL;
@@ -322,7 +320,7 @@ static int dwc3_glue_bind(struct udevice *parent)
                        continue;
 
                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__);
@@ -400,7 +398,7 @@ static int dwc3_glue_probe(struct udevice *dev)
        while (child) {
                enum usb_dr_mode dr_mode;
 
-               dr_mode = usb_get_dr_mode(dev_of_offset(child));
+               dr_mode = usb_get_dr_mode(child->node);
                device_find_next_child(&child);
                if (ops && ops->select_dr_mode)
                        ops->select_dr_mode(dev, index, dr_mode);
index 832bcd70ff0f24847865e7a4833d93814da6695e..d4453f8784cbfdaa38196d57b6dc0bce7674c4ef 100644 (file)
@@ -393,7 +393,7 @@ static int dwc3_meson_g12a_probe(struct udevice *dev)
        }
 #endif
 
-       priv->otg_mode = usb_get_dr_mode(dev_of_offset(dev));
+       priv->otg_mode = usb_get_dr_mode(dev->node);
 
        ret = dwc3_meson_g12a_usb_init(priv);
        if (ret)
index 496abf38e7217d285d70a2d6e180220a7ddbb0f2..b9c814cf73e22832194c8f75b305a54179d62511 100644 (file)
@@ -1039,13 +1039,12 @@ void dwc2_phy_shutdown(struct udevice *dev, struct phy *usb_phys, int num_phys)
 static int dwc2_udc_otg_ofdata_to_platdata(struct udevice *dev)
 {
        struct dwc2_plat_otg_data *platdata = dev_get_platdata(dev);
-       int node = dev_of_offset(dev);
        ulong drvdata;
        void (*set_params)(struct dwc2_plat_otg_data *data);
        int ret;
 
-       if (usb_get_dr_mode(node) != USB_DR_MODE_PERIPHERAL &&
-           usb_get_dr_mode(node) != USB_DR_MODE_OTG) {
+       if (usb_get_dr_mode(dev->node) != USB_DR_MODE_PERIPHERAL &&
+           usb_get_dr_mode(dev->node) != USB_DR_MODE_OTG) {
                dev_dbg(dev, "Invalid mode\n");
                return -ENODEV;
        }
index ad7cf6e6b53d12d61928e9393feef2b317d2f396..c99a1985cca56dd49036ff3c36dae239aa165e91 100644 (file)
@@ -10,8 +10,6 @@
 #include <asm/io.h>
 #include <dm.h>
 #include <errno.h>
-#include <fdtdec.h>
-#include <linux/libfdt.h>
 #include <dm/lists.h>
 #include <regmap.h>
 #include <reset-uclass.h>
@@ -109,8 +107,7 @@ static int sti_dwc3_glue_ofdata_to_platdata(struct udevice *dev)
        int ret;
        u32 reg[4];
 
-       ret = fdtdec_get_int_array(gd->fdt_blob, dev_of_offset(dev),
-                                  "reg", reg, ARRAY_SIZE(reg));
+       ret = ofnode_read_u32_array(dev->node, "reg", reg, ARRAY_SIZE(reg));
        if (ret) {
                pr_err("unable to find st,stih407-dwc3 reg property(%d)\n", ret);
                return ret;
@@ -153,18 +150,15 @@ 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 node, dwc3_node;
 
-       /* check if one subnode is present */
-       dwc3_node = fdt_first_subnode(gd->fdt_blob, dev_of_offset(dev));
-       if (dwc3_node <= 0) {
-               pr_err("Can't find subnode for %s\n", dev->name);
-               return -ENODEV;
+       /* Find snps,dwc3 node from subnode */
+       ofnode_for_each_subnode(node, dev->node) {
+               if (ofnode_device_is_compatible(node, "snps,dwc3"))
+                       dwc3_node = node;
        }
 
-       /* 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_valid(node)) {
                pr_err("Can't find dwc3 subnode for %s\n", dev->name);
                return -ENODEV;
        }
index 1993ad620a8cc3b573f9d3e4a2e3d5b4d7ab1ad1..f2ceb5131010d36e1f1632a92b5d390917a63da7 100644 (file)
@@ -513,7 +513,7 @@ static int ehci_usb_ofdata_to_platdata(struct udevice *dev)
        struct usb_platdata *plat = dev_get_platdata(dev);
        enum usb_dr_mode dr_mode;
 
-       dr_mode = usb_get_dr_mode(dev_of_offset(dev));
+       dr_mode = usb_get_dr_mode(dev->node);
 
        switch (dr_mode) {
        case USB_DR_MODE_HOST:
index c1c681ca6cf159a77ab80560d3b1aa4a03537dc2..9fcfa39d4b5afdac9be67d91172e6b838f8b4913 100644 (file)
@@ -9,7 +9,6 @@
 
 #include <common.h>
 #include <dm.h>
-#include <fdtdec.h>
 #include <generic-phy.h>
 #include <usb.h>
 #include <dwc3-uboot.h>
@@ -155,7 +154,7 @@ static int xhci_dwc3_probe(struct udevice *dev)
 
        writel(reg, &dwc3_reg->g_usb2phycfg[0]);
 
-       dr_mode = usb_get_dr_mode(dev_of_offset(dev));
+       dr_mode = usb_get_dr_mode(dev->node);
        if (dr_mode == USB_DR_MODE_UNKNOWN)
                /* by default set dual role mode to HOST */
                dr_mode = USB_DR_MODE_HOST;
index 00759f3e832e70879819b83c70de5464b6ba90fd..608facefa3de72584aa9013e80d1542248010df3 100644 (file)
@@ -285,14 +285,12 @@ U_BOOT_DRIVER(ti_musb_peripheral) = {
 #if CONFIG_IS_ENABLED(OF_CONTROL)
 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)) {
+       ofnode_for_each_subnode(node, parent->node) {
                struct udevice *dev;
-               const char *name = fdt_get_name(fdt, node, NULL);
+               const char *name = ofnode_get_name(node);
                enum usb_dr_mode dr_mode;
                struct driver *drv;
 
@@ -306,7 +304,7 @@ static int ti_musb_wrapper_bind(struct udevice *parent)
                        ret = device_bind_driver_to_node(parent,
                                                         "ti-musb-peripheral",
                                                         name,
-                                                        offset_to_ofnode(node),
+                                                        node,
                                                         &dev);
                        if (ret)
                                pr_err("musb - not able to bind usb peripheral node\n");
@@ -316,7 +314,7 @@ static int ti_musb_wrapper_bind(struct udevice *parent)
                        ret = device_bind_driver_to_node(parent,
                                                         "ti-musb-host",
                                                         name,
-                                                        offset_to_ofnode(node),
+                                                        node,
                                                         &dev);
                        if (ret)
                                pr_err("musb - not able to bind usb host node\n");
index d2604c5cafba5f3ef03d8ec216082ea09e354284..c19b916be9d4b48ac66a6e93f66663fc409318f8 100644 (file)
@@ -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,
@@ -18,20 +20,20 @@ enum usb_dr_mode {
 
 /**
  * usb_get_dr_mode() - Get dual role mode for given device
- * @node: Node offset to the given device
+ * @node: ofnode of the given device
  *
  * 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
- * @node: Node offset to the given device
+ * @node: ofnode of the given device
  *
  * 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 */