mirror of
https://github.com/AsahiLinux/u-boot
synced 2024-11-25 06:00:43 +00:00
usb: Migrate to support live DT for some driver
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>
This commit is contained in:
parent
0148bbe8f3
commit
2517deafc2
11 changed files with 42 additions and 57 deletions
|
@ -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__);
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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");
|
||||
|
|
|
@ -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 */
|
||||
|
|
Loading…
Reference in a new issue