[U-Boot] [PATCH v2 06/13] drivers: usb: dwc3: add ti dwc3 peripheral driver with driver model support

Vignesh R vigneshr at ti.com
Wed Jun 14 12:25:06 UTC 2017



On Tuesday 13 June 2017 07:33 PM, Marek Vasut wrote:
> On 06/13/2017 02:10 PM, Vignesh R wrote:
>> From: Mugunthan V N <mugunthanvnm at ti.com>
>>
>> Add a TI DWC3 peripheral driver with driver model support and the
>> driver will be bound by the DWC3 wrapper driver based on the
>> dr_mode device tree entry.
>>
>> Signed-off-by: Mugunthan V N <mugunthanvnm at ti.com>
>> Signed-off-by: Vignesh R <vigneshr at ti.com>
>> ---
>>  drivers/usb/dwc3/core.c      |  57 +++++++++++++++
>>  drivers/usb/dwc3/core.h      |   6 ++
>>  drivers/usb/dwc3/dwc3-omap.c | 167 +++++++++++++++++++++++++++++++++++++++++++
>>  3 files changed, 230 insertions(+)
>>
>> diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c
>> index 98102bd6b00a..a895f8fbddd3 100644
>> --- a/drivers/usb/dwc3/core.c
>> +++ b/drivers/usb/dwc3/core.c
>> @@ -603,6 +603,8 @@ static void dwc3_core_exit_mode(struct dwc3 *dwc)
>>  
>>  #define DWC3_ALIGN_MASK		(16 - 1)
>>  
>> +#ifndef CONFIG_DM_USB
>> +
>>  /**
>>   * dwc3_uboot_init - dwc3 core uboot initialization code
>>   * @dwc3_dev: struct dwc3_device containing initialization data
>> @@ -789,3 +791,58 @@ MODULE_ALIAS("platform:dwc3");
>>  MODULE_AUTHOR("Felipe Balbi <balbi at ti.com>");
>>  MODULE_LICENSE("GPL v2");
>>  MODULE_DESCRIPTION("DesignWare USB3 DRD Controller Driver");
>> +
>> +#else
>> +
>> +int dwc3_init(struct dwc3 *dwc)
>> +{
>> +	int ret;
>> +
>> +	dwc3_cache_hwparams(dwc);
>> +
>> +	ret = dwc3_alloc_event_buffers(dwc, DWC3_EVENT_BUFFERS_SIZE);
>> +	if (ret) {
>> +		dev_err(dwc->dev, "failed to allocate event buffers\n");
>> +		return -ENOMEM;
>> +	}
>> +
>> +	ret = dwc3_core_init(dwc);
>> +	if (ret) {
>> +		dev_err(dev, "failed to initialize core\n");
>> +		goto err0;
>> +	}
>> +
>> +	ret = dwc3_event_buffers_setup(dwc);
>> +	if (ret) {
>> +		dev_err(dwc->dev, "failed to setup event buffers\n");
>> +		goto err1;
>> +	}
>> +
>> +	ret = dwc3_core_init_mode(dwc);
>> +	if (ret)
>> +		goto err2;
>> +
>> +	return 0;
>> +
>> +err2:
> 
> Use more descriptive label names please ...

Ok, will do in next version.

> 
>> +	dwc3_event_buffers_cleanup(dwc);
>> +
>> +err1:
>> +	dwc3_core_exit(dwc);
>> +
>> +err0:
>> +	dwc3_free_event_buffers(dwc);
>> +
>> +	return ret;
>> +}
>> +
>> +void dwc3_remove(struct dwc3 *dwc)
>> +{
>> +	dwc3_core_exit_mode(dwc);
>> +	dwc3_event_buffers_cleanup(dwc);
>> +	dwc3_free_event_buffers(dwc);
>> +	dwc3_core_exit(dwc);
>> +	kfree(dwc->mem);
>> +}
>> +
>> +#endif
>> diff --git a/drivers/usb/dwc3/core.h b/drivers/usb/dwc3/core.h
>> index 72d2fcdd3f42..972628751697 100644
>> --- a/drivers/usb/dwc3/core.h
>> +++ b/drivers/usb/dwc3/core.h
>> @@ -713,7 +713,11 @@ struct dwc3 {
>>  	/* device lock */
>>  	spinlock_t		lock;
>>  
>> +#ifndef CONFIG_DM_USB
>>  	struct device		*dev;
>> +#else
>> +	struct udevice		*dev;
>> +#endif
>>  
>>  	struct platform_device	*xhci;
>>  	struct resource		xhci_resources[DWC3_XHCI_RESOURCES_NUM];
>> @@ -988,6 +992,8 @@ struct dwc3_gadget_ep_cmd_params {
>>  
>>  /* prototypes */
>>  int dwc3_gadget_resize_tx_fifos(struct dwc3 *dwc);
>> +int dwc3_init(struct dwc3 *dwc);
>> +void dwc3_remove(struct dwc3 *dwc);
>>  
>>  #ifdef CONFIG_USB_DWC3_HOST
>>  int dwc3_host_init(struct dwc3 *dwc);
>> diff --git a/drivers/usb/dwc3/dwc3-omap.c b/drivers/usb/dwc3/dwc3-omap.c
>> index f18884f13392..b4dde726c6f3 100644
>> --- a/drivers/usb/dwc3/dwc3-omap.c
>> +++ b/drivers/usb/dwc3/dwc3-omap.c
>> @@ -27,6 +27,23 @@
>>  #include <dwc3-uboot.h>
>>  
>>  #include "linux-compat.h"
>> +#include <linux/usb/ch9.h>
>> +#include <linux/usb/gadget.h>
>> +#include <ti-usb-phy-uboot.h>
>> +#include <usb.h>
>> +
>> +#include "core.h"
>> +
>> +#include <libfdt.h>
>> +#include <dm/device.h>
>> +#include <dm/uclass.h>
>> +#include <dm/lists.h>
>> +#include <dwc3-uboot.h>
>> +
>> +#include <asm/omap_common.h>
>> +#include "gadget.h"
>> +
>> +DECLARE_GLOBAL_DATA_PTR;
>>  
>>  /*
>>   * All these registers belong to OMAP's Wrapper around the
>> @@ -135,6 +152,12 @@ struct dwc3_omap {
>>  	u32			index;
>>  };
>>  
>> +struct omap_dwc3_priv {
>> +	struct dwc3_omap omap;
>> +	struct dwc3 dwc3;
>> +	struct ti_usb_phy_device phy_device;
>> +};
>> +
>>  static LIST_HEAD(dwc3_omap_list);
>>  
>>  static inline u32 dwc3_omap_readl(void __iomem *base, u32 offset)
>> @@ -362,6 +385,8 @@ static void dwc3_omap_set_utmi_mode(struct dwc3_omap *omap, int utmi_mode)
>>  	dwc3_omap_write_utmi_status(omap, reg);
>>  }
>>  
>> +#ifndef CONFIG_DM_USB
>> +
>>  /**
>>   * dwc3_omap_uboot_init - dwc3 omap uboot initialization code
>>   * @dev: struct dwc3_omap_device containing initialization data
>> @@ -462,3 +487,145 @@ MODULE_ALIAS("platform:omap-dwc3");
>>  MODULE_AUTHOR("Felipe Balbi <balbi at ti.com>");
>>  MODULE_LICENSE("GPL v2");
>>  MODULE_DESCRIPTION("DesignWare USB3 OMAP Glue Layer");
>> +
>> +#else
>> +
>> +int usb_gadget_handle_interrupts(int index)
> 
> Can this be made somehow more generic , so that the core code would
> contain the basic interrupt handling and probe routines and the various
> SoC-specific drivers would add their specific bits to it ?
> 

How about moving this to drivers/usb/dwc3/gadget.c and then provide a
callback to each of SoC specific drivers?

>> +{
>> +	struct omap_dwc3_priv *priv;
>> +	struct dwc3_omap *omap;
>> +	struct dwc3 *dwc;
>> +	struct udevice *dev;
>> +	u32 status;
>> +	int ret;
>> +
>> +	ret = uclass_first_device(UCLASS_USB_DEV_GENERIC, &dev);
>> +	if (!dev || ret) {
>> +		error("No USB device found\n");
>> +		return -ENODEV;
>> +	}
>> +
>> +	priv = dev_get_priv(dev);
>> +	omap = &priv->omap;
>> +	dwc = &priv->dwc3;
>> +
>> +	status = dwc3_omap_interrupt(-1, omap);
>> +	if (status)
>> +		dwc3_gadget_uboot_handle_interrupt(dwc);
>> +
>> +	return 0;
>> +}

Thanks for the review!

-- 
Regards
Vignesh


More information about the U-Boot mailing list