[U-Boot] [u-boot 27/40] dwc3: dwc3-omap: add support for multiple dwc3-omap controllers

Lukasz Majewski
2015-02-16T11:06:29Z

Hi Kishon,

> Added support for multiple dwc3 omap controllers. This gives uboot
> the capability to control multiple dwc3 omap controllers.
>
> Signed-off-by: Kishon Vijay Abraham I <kishon@ti.com>
> ---
> drivers/usb/dwc3/dwc3-omap.c | 26 ++++++++++++++++++++------
> include/dwc3-omap-uboot.h | 3 ++-
> 2 files changed, 22 insertions(+), 7 deletions(-)
>
> diff --git a/drivers/usb/dwc3/dwc3-omap.c
> b/drivers/usb/dwc3/dwc3-omap.c index 30d7210..c8275c7 100644
> --- a/drivers/usb/dwc3/dwc3-omap.c
> +++ b/drivers/usb/dwc3/dwc3-omap.c
> @@ -119,9 +119,11 @@ struct dwc3_omap {
> u32 irq0_offset;
>
> u32 dma_status:1;
> + struct list_head list;
> + u32 index;
> };
>
> -struct dwc3_omap *omap;
> +static LIST_HEAD(dwc3_omap_list);
>
> static inline u32 dwc3_omap_readl(void __iomem *base, u32 offset)
> {
> @@ -363,12 +365,14 @@ int dwc3_omap_uboot_init(struct
> dwc3_omap_device *omap_dev) {
> u32 reg;
> struct device *dev;
> + struct dwc3_omap *omap;
>
> omap = devm_kzalloc(dev, sizeof(*omap), GFP_KERNEL);
> if (!omap)
> return -ENOMEM;
>
> omap->base = omap_dev->base;
> + omap->index = omap_dev->index;
>
> dwc3_omap_map_offset(omap);
> dwc3_omap_set_utmi_mode(omap, omap_dev->utmi_mode);
> @@ -380,6 +384,7 @@ int dwc3_omap_uboot_init(struct dwc3_omap_device
> *omap_dev) dwc3_omap_set_mailbox(omap, omap_dev->vbus_id_status);
>
> dwc3_omap_enable_irqs(omap);
> + list_add_tail(&omap->list, &dwc3_omap_list);
>
> return 0;
> }
> @@ -389,16 +394,25 @@ int dwc3_omap_uboot_init(struct
> dwc3_omap_device *omap_dev)
> * @index: index of this controller
> *
> * Performs cleanup of memory allocated in dwc3_omap_uboot_init
> - * (equivalent to dwc3_omap_remove in linux).
> + * (equivalent to dwc3_omap_remove in linux). index of _this_
> controller
> + * should be passed and should match with the index passed in
> + * dwc3_omap_device during init.
> *
> * Generally called from board file.
> */
> -void dwc3_omap_uboot_exit(void)
> +void dwc3_omap_uboot_exit(int index)
> {
> - dwc3_omap_disable_irqs(omap);
> - kfree(omap);
> + struct dwc3_omap *omap = NULL;
>
> - return 0;
> + list_for_each_entry(omap, &dwc3_omap_list, list) {
> + if (omap->index != index)
> + continue;
> +
> + dwc3_omap_disable_irqs(omap);
> + list_del(&omap->list);
> + kfree(omap);
> + break;
> + }
> }
>
> MODULE_ALIAS("platform:omap-dwc3");
> diff --git a/include/dwc3-omap-uboot.h b/include/dwc3-omap-uboot.h
> index 99f8f38..29f02f8 100644
> --- a/include/dwc3-omap-uboot.h
> +++ b/include/dwc3-omap-uboot.h
> @@ -21,10 +21,11 @@ enum omap_dwc3_vbus_id_status {
>
> struct dwc3_omap_device {
> void *base;
> + int index;
> enum dwc3_omap_utmi_mode utmi_mode;
> enum omap_dwc3_vbus_id_status vbus_id_status;
> };
>
> int dwc3_omap_uboot_init(struct dwc3_omap_device *dev);
> -void dwc3_omap_uboot_exit(void);
> +void dwc3_omap_uboot_exit(int index);
> #endif /* __DWC3_OMAP_UBOOT_H_ */

Reviewed-by: Lukasz Majewski <l.majewski@samsung.com>

--
Best regards,

Lukasz Majewski

Samsung R&D Institute Poland (SRPOL) | Linux Platform Group