diff options
Diffstat (limited to 'drivers/usb/otg/otgdev.c')
-rw-r--r-- | drivers/usb/otg/otgdev.c | 70 |
1 files changed, 46 insertions, 24 deletions
diff --git a/drivers/usb/otg/otgdev.c b/drivers/usb/otg/otgdev.c index 129b1cf5e1..5a86263430 100644 --- a/drivers/usb/otg/otgdev.c +++ b/drivers/usb/otg/otgdev.c @@ -2,10 +2,10 @@ #include <common.h> #include <driver.h> -#include <usb/usb.h> +#include <linux/usb/usb.h> struct otg_mode { - struct device_d dev; + struct device dev; unsigned int var_mode; unsigned int cur_mode; int (*set_mode_callback)(void *ctx, enum usb_dr_mode mode); @@ -42,21 +42,49 @@ static const char *otg_mode_names[] = { [USB_DR_MODE_OTG] = "otg", }; -static struct device_d otg_device = { - .name = "otg", - .id = DEVICE_ID_SINGLE, +static int register_otg_device(struct device *dev, struct otg_mode *otg) +{ + struct param_d *param_mode; + int ret; + + ret = register_device(dev); + if (ret) + return ret; + + param_mode = dev_add_param_enum(dev, "mode", + otg_set_mode, NULL, &otg->var_mode, + otg_mode_names, ARRAY_SIZE(otg_mode_names), otg); + + return PTR_ERR_OR_ZERO(param_mode); +} + +struct bus_type otg_bus_type = { + .name = "usbotg" /* "otg" is already taken for the alias */ }; -int usb_register_otg_device(struct device_d *parent, +int otg_device_get_mode(struct device *dev) +{ + struct otg_mode *otg; + + if (dev->bus != &otg_bus_type) + return -ENODEV; + + otg = dev->priv; + + return otg->cur_mode; +} + +int usb_register_otg_device(struct device *parent, int (*set_mode)(void *ctx, enum usb_dr_mode mode), void *ctx) { + bool first_otg = list_empty(&otg_bus_type.device_list); int ret; - struct param_d *param_mode; struct otg_mode *otg; otg = xzalloc(sizeof(*otg)); otg->dev.priv = otg; otg->dev.parent = parent; + otg->dev.bus = &otg_bus_type; otg->dev.id = DEVICE_ID_DYNAMIC; dev_set_name(&otg->dev, "otg"); @@ -65,25 +93,19 @@ int usb_register_otg_device(struct device_d *parent, otg->set_mode_callback = set_mode; otg->ctx = ctx; - /* register otg.mode as an alias of otg0.mode */ - if (otg_device.parent == NULL) { - otg_device.parent = parent; - ret = register_device(&otg_device); - if (ret) - return ret; - - param_mode = dev_add_param_enum(&otg_device, "mode", - otg_set_mode, NULL, &otg->var_mode, - otg_mode_names, ARRAY_SIZE(otg_mode_names), otg); - } - - ret = register_device(&otg->dev); + ret = register_otg_device(&otg->dev, otg); if (ret) return ret; - param_mode = dev_add_param_enum(&otg->dev, "mode", - otg_set_mode, NULL, &otg->var_mode, - otg_mode_names, ARRAY_SIZE(otg_mode_names), otg); + /* register otg.mode as an alias of otg0.mode */ + if (first_otg) + dev_add_alias(&otg->dev, "otg"); - return PTR_ERR_OR_ZERO(param_mode); + return 0; +} + +static int otg_bus_init(void) +{ + return bus_register(&otg_bus_type); } +pure_initcall(otg_bus_init); |