From 2458ddd952a6a2d2304dfe7ea34e4192cd1d5ed4 Mon Sep 17 00:00:00 2001 From: Sherry Sun Date: Tue, 30 Jul 2019 20:42:02 -0400 Subject: [PATCH] MLK-22357-1 usb: Add handle_interrupts function pointer for UCLASS_USB_GADGET_GENERIC Since the orginal way to call interrupts handle function of DM usb gadget driver is through dm_usb_gadget_handle_interrupts(), when we want to use two or more different gadget drivers at the same time, it will cause error of duplicate names. So here add a handle_interrupts function pointer instead of driectly call dm_usb_gadget_handle_interrupts(), then the error can be avoided. Signed-off-by: Sherry Sun --- drivers/usb/cdns3/cdns3-generic.c | 3 ++- drivers/usb/dwc3/dwc3-generic.c | 3 ++- drivers/usb/gadget/ci_udc.c | 3 ++- drivers/usb/gadget/udc/udc-uclass.c | 13 ++++++++++++- drivers/usb/musb-new/ti-musb.c | 3 ++- include/dm/device.h | 1 + include/linux/usb/gadget.h | 1 - 7 files changed, 21 insertions(+), 6 deletions(-) diff --git a/drivers/usb/cdns3/cdns3-generic.c b/drivers/usb/cdns3/cdns3-generic.c index 0ecb7bf857..fced56ee77 100644 --- a/drivers/usb/cdns3/cdns3-generic.c +++ b/drivers/usb/cdns3/cdns3-generic.c @@ -100,7 +100,7 @@ static int cdns3_generic_peripheral_clk_init(struct udevice *dev, return 0; } -int dm_usb_gadget_handle_interrupts(struct udevice *dev) +static int cdns3_generic_handle_interrupts(struct udevice *dev) { struct cdns3_generic_peripheral *priv = dev_get_priv(dev); struct cdns3 *cdns3 = &priv->cdns3; @@ -178,6 +178,7 @@ U_BOOT_DRIVER(cdns3_generic_peripheral) = { .ofdata_to_platdata = cdns3_generic_peripheral_ofdata_to_platdata, .probe = cdns3_generic_peripheral_probe, .remove = cdns3_generic_peripheral_remove, + .handle_interrupts = cdns3_generic_handle_interrupts, .priv_auto_alloc_size = sizeof(struct cdns3_generic_peripheral), }; #endif diff --git a/drivers/usb/dwc3/dwc3-generic.c b/drivers/usb/dwc3/dwc3-generic.c index 3e6c494dc6..07a9757012 100644 --- a/drivers/usb/dwc3/dwc3-generic.c +++ b/drivers/usb/dwc3/dwc3-generic.c @@ -30,7 +30,7 @@ struct dwc3_generic_peripheral { fdt_addr_t base; }; -int dm_usb_gadget_handle_interrupts(struct udevice *dev) +static int dwc3_generic_peripheral_handle_interrupts(struct udevice *dev) { struct dwc3_generic_peripheral *priv = dev_get_priv(dev); struct dwc3 *dwc3 = &priv->dwc3; @@ -104,6 +104,7 @@ U_BOOT_DRIVER(dwc3_generic_peripheral) = { .ofdata_to_platdata = dwc3_generic_peripheral_ofdata_to_platdata, .probe = dwc3_generic_peripheral_probe, .remove = dwc3_generic_peripheral_remove, + .handle_interrupts = dwc3_generic_peripheral_handle_interrupts, .priv_auto_alloc_size = sizeof(struct dwc3_generic_peripheral), }; #endif diff --git a/drivers/usb/gadget/ci_udc.c b/drivers/usb/gadget/ci_udc.c index ef590de8fe..1df99325a5 100644 --- a/drivers/usb/gadget/ci_udc.c +++ b/drivers/usb/gadget/ci_udc.c @@ -1125,7 +1125,7 @@ struct ci_udc_priv_data { struct power_domain phy_pd; }; -int dm_usb_gadget_handle_interrupts(struct udevice *dev) +static int ci_udc_gadget_handle_interrupts(struct udevice *dev) { return ci_udc_handle_interrupts(); } @@ -1364,6 +1364,7 @@ U_BOOT_DRIVER(ci_udc_otg) = { .ofdata_to_platdata = ci_udc_otg_ofdata_to_platdata, .probe = ci_udc_otg_probe, .remove = ci_udc_otg_remove, + .handle_interrupts = ci_udc_gadget_handle_interrupts, .priv_auto_alloc_size = sizeof(struct ci_udc_priv_data), }; diff --git a/drivers/usb/gadget/udc/udc-uclass.c b/drivers/usb/gadget/udc/udc-uclass.c index 3053ccf7d9..f117a42a65 100644 --- a/drivers/usb/gadget/udc/udc-uclass.c +++ b/drivers/usb/gadget/udc/udc-uclass.c @@ -51,9 +51,20 @@ int usb_gadget_release(int index) int usb_gadget_handle_interrupts(int index) { + const struct driver *drv; + if (index < 0 || index >= ARRAY_SIZE(dev_array)) return -EINVAL; - return dm_usb_gadget_handle_interrupts(dev_array[index]); + + drv = dev_array[index]->driver; + assert(drv); + + if (drv->handle_interrupts) + return drv->handle_interrupts(dev_array[index]); + else + pr_err("No handle_interrupts function found\n"); + + return -EINVAL; } #endif diff --git a/drivers/usb/musb-new/ti-musb.c b/drivers/usb/musb-new/ti-musb.c index 20ca2731b4..2b0da4ac6d 100644 --- a/drivers/usb/musb-new/ti-musb.c +++ b/drivers/usb/musb-new/ti-musb.c @@ -230,7 +230,7 @@ static int ti_musb_peripheral_ofdata_to_platdata(struct udevice *dev) } #endif -int dm_usb_gadget_handle_interrupts(struct udevice *dev) +static int ti_musb_peripheral_handle_interrupts(struct udevice *dev) { struct ti_musb_peripheral *priv = dev_get_priv(dev); @@ -275,6 +275,7 @@ U_BOOT_DRIVER(ti_musb_peripheral) = { .probe = ti_musb_peripheral_probe, .remove = ti_musb_peripheral_remove, .ops = &musb_usb_ops, + .handle_interrupts = ti_musb_peripheral_handle_interrupts, .platdata_auto_alloc_size = sizeof(struct ti_musb_platdata), .priv_auto_alloc_size = sizeof(struct ti_musb_peripheral), .flags = DM_FLAG_PRE_RELOC, diff --git a/include/dm/device.h b/include/dm/device.h index f2b7c2a816..815dd0451f 100644 --- a/include/dm/device.h +++ b/include/dm/device.h @@ -252,6 +252,7 @@ struct driver { int (*child_post_bind)(struct udevice *dev); int (*child_pre_probe)(struct udevice *dev); int (*child_post_remove)(struct udevice *dev); + int (*handle_interrupts)(struct udevice *dev); int priv_auto_alloc_size; int platdata_auto_alloc_size; int per_child_auto_alloc_size; diff --git a/include/linux/usb/gadget.h b/include/linux/usb/gadget.h index 87e89d8e0c..4c44eeb7e7 100644 --- a/include/linux/usb/gadget.h +++ b/include/linux/usb/gadget.h @@ -950,7 +950,6 @@ extern int usb_gadget_handle_interrupts(int index); #if CONFIG_IS_ENABLED(DM_USB_GADGET) int usb_gadget_initialize(int index); int usb_gadget_release(int index); -int dm_usb_gadget_handle_interrupts(struct udevice *dev); #else #include static inline int usb_gadget_initialize(int index) -- 2.17.1