usb: dwc3: Add phy interface for dwc3_uboot
U-Boot has two different variants of dwc3 initializations, - with dm variant gadget, so the respective dm driver would call the dwc3_init in core. - with non-dm variant gadget, so the usage board file would call dwc3_uboot_init in core. The driver probe would handle all respective gadget properties including phy interface via phy_type property and then trigger dwc3_init for dm-variant gadgets. So, to support the phy interface for non-dm variant gadgets, the better option is dwc3_uboot_init since there is no dedicated controller for non-dm variant gadgets. This patch support for adding phy interface like 8/16-bit UTMI+ code for dwc3_uboot. This change used Linux phy.h enum list, to make proper code compatibility. Cc: Marek Vasut <marex@denx.de> Tested-by: Levin Du <djw@t-chip.com.cn> Signed-off-by: Jagan Teki <jagan@amarulasolutions.com> Reviewed-by: Marek Vasut <marex@denx.de> Reviewed-by: Kever Yang <kever.yang@rock-chips.com>
This commit is contained in:
		
							parent
							
								
									35172ac02f
								
							
						
					
					
						commit
						6b7ebff001
					
				|  | @ -613,6 +613,31 @@ static void dwc3_core_exit_mode(struct dwc3 *dwc) | ||||||
| 	dwc3_gadget_run(dwc); | 	dwc3_gadget_run(dwc); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | static void dwc3_uboot_hsphy_mode(struct dwc3_device *dwc3_dev, | ||||||
|  | 				  struct dwc3 *dwc) | ||||||
|  | { | ||||||
|  | 	enum usb_phy_interface hsphy_mode = dwc3_dev->hsphy_mode; | ||||||
|  | 	u32 reg; | ||||||
|  | 
 | ||||||
|  | 	/* Set dwc3 usb2 phy config */ | ||||||
|  | 	reg = dwc3_readl(dwc->regs, DWC3_GUSB2PHYCFG(0)); | ||||||
|  | 	reg |= DWC3_GUSB2PHYCFG_PHYIF; | ||||||
|  | 	reg &= ~DWC3_GUSB2PHYCFG_USBTRDTIM_MASK; | ||||||
|  | 
 | ||||||
|  | 	switch (hsphy_mode) { | ||||||
|  | 	case USBPHY_INTERFACE_MODE_UTMI: | ||||||
|  | 		reg |= DWC3_GUSB2PHYCFG_USBTRDTIM_8BIT; | ||||||
|  | 		break; | ||||||
|  | 	case USBPHY_INTERFACE_MODE_UTMIW: | ||||||
|  | 		reg |= DWC3_GUSB2PHYCFG_USBTRDTIM_16BIT; | ||||||
|  | 		break; | ||||||
|  | 	default: | ||||||
|  | 		break; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	dwc3_writel(dwc->regs, DWC3_GUSB2PHYCFG(0), reg); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| #define DWC3_ALIGN_MASK		(16 - 1) | #define DWC3_ALIGN_MASK		(16 - 1) | ||||||
| 
 | 
 | ||||||
| /**
 | /**
 | ||||||
|  | @ -721,6 +746,8 @@ int dwc3_uboot_init(struct dwc3_device *dwc3_dev) | ||||||
| 		goto err0; | 		goto err0; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | 	dwc3_uboot_hsphy_mode(dwc3_dev, dwc); | ||||||
|  | 
 | ||||||
| 	ret = dwc3_event_buffers_setup(dwc); | 	ret = dwc3_event_buffers_setup(dwc); | ||||||
| 	if (ret) { | 	if (ret) { | ||||||
| 		dev_err(dwc->dev, "failed to setup event buffers\n"); | 		dev_err(dwc->dev, "failed to setup event buffers\n"); | ||||||
|  |  | ||||||
|  | @ -162,6 +162,18 @@ | ||||||
| /* Global USB2 PHY Configuration Register */ | /* Global USB2 PHY Configuration Register */ | ||||||
| #define DWC3_GUSB2PHYCFG_PHYSOFTRST	(1 << 31) | #define DWC3_GUSB2PHYCFG_PHYSOFTRST	(1 << 31) | ||||||
| #define DWC3_GUSB2PHYCFG_SUSPHY		(1 << 6) | #define DWC3_GUSB2PHYCFG_SUSPHY		(1 << 6) | ||||||
|  | #define DWC3_GUSB2PHYCFG_PHYIF		BIT(3) | ||||||
|  | 
 | ||||||
|  | /* Global USB2 PHY Configuration Mask */ | ||||||
|  | #define DWC3_GUSB2PHYCFG_USBTRDTIM_MASK		(0xf << 10) | ||||||
|  | 
 | ||||||
|  | /* Global USB2 PHY Configuration Offset */ | ||||||
|  | #define DWC3_GUSB2PHYCFG_USBTRDTIM_OFFSET	10 | ||||||
|  | 
 | ||||||
|  | #define DWC3_GUSB2PHYCFG_USBTRDTIM_16BIT	(0x5 << \ | ||||||
|  | 		DWC3_GUSB2PHYCFG_USBTRDTIM_OFFSET) | ||||||
|  | #define DWC3_GUSB2PHYCFG_USBTRDTIM_8BIT		(0x9 << \ | ||||||
|  | 		DWC3_GUSB2PHYCFG_USBTRDTIM_OFFSET) | ||||||
| 
 | 
 | ||||||
| /* Global USB3 PIPE Control Register */ | /* Global USB3 PIPE Control Register */ | ||||||
| #define DWC3_GUSB3PIPECTL_PHYSOFTRST	(1 << 31) | #define DWC3_GUSB3PIPECTL_PHYSOFTRST	(1 << 31) | ||||||
|  |  | ||||||
|  | @ -10,10 +10,12 @@ | ||||||
| #define __DWC3_UBOOT_H_ | #define __DWC3_UBOOT_H_ | ||||||
| 
 | 
 | ||||||
| #include <linux/usb/otg.h> | #include <linux/usb/otg.h> | ||||||
|  | #include <linux/usb/phy.h> | ||||||
| 
 | 
 | ||||||
| struct dwc3_device { | struct dwc3_device { | ||||||
| 	unsigned long base; | 	unsigned long base; | ||||||
| 	enum usb_dr_mode dr_mode; | 	enum usb_dr_mode dr_mode; | ||||||
|  | 	enum usb_phy_interface hsphy_mode; | ||||||
| 	u32 maximum_speed; | 	u32 maximum_speed; | ||||||
| 	unsigned tx_fifo_resize:1; | 	unsigned tx_fifo_resize:1; | ||||||
| 	unsigned has_lpm_erratum; | 	unsigned has_lpm_erratum; | ||||||
|  |  | ||||||
|  | @ -0,0 +1,19 @@ | ||||||
|  | /* SPDX-License-Identifier: GPL-2.0 */ | ||||||
|  | /*
 | ||||||
|  |  * USB PHY defines | ||||||
|  |  * | ||||||
|  |  * These APIs may be used between USB controllers.  USB device drivers | ||||||
|  |  * (for either host or peripheral roles) don't use these calls; they | ||||||
|  |  * continue to use just usb_device and usb_gadget. | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #ifndef __LINUX_USB_PHY_H | ||||||
|  | #define __LINUX_USB_PHY_H | ||||||
|  | 
 | ||||||
|  | enum usb_phy_interface { | ||||||
|  | 	USBPHY_INTERFACE_MODE_UNKNOWN, | ||||||
|  | 	USBPHY_INTERFACE_MODE_UTMI, | ||||||
|  | 	USBPHY_INTERFACE_MODE_UTMIW, | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | #endif /* __LINUX_USB_PHY_H */ | ||||||
		Loading…
	
		Reference in New Issue