forked from mirrors/linux
		
	usb: chipidea: imx: add two samsung picophy parameters tuning implementation
These two parameters are used to improve USB signal for board level, in this commit, we read it from the dtb, and write to related register during the initialization. Signed-off-by: Peter Chen <peter.chen@nxp.com>
This commit is contained in:
		
							parent
							
								
									8977c947b3
								
							
						
					
					
						commit
						58a3cefb38
					
				
					 3 changed files with 28 additions and 0 deletions
				
			
		| 
						 | 
					@ -165,6 +165,11 @@ static struct imx_usbmisc_data *usbmisc_get_init_data(struct device *dev)
 | 
				
			||||||
	if (of_usb_get_phy_mode(np) == USBPHY_INTERFACE_MODE_ULPI)
 | 
						if (of_usb_get_phy_mode(np) == USBPHY_INTERFACE_MODE_ULPI)
 | 
				
			||||||
		data->ulpi = 1;
 | 
							data->ulpi = 1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						of_property_read_u32(np, "samsung,picophy-pre-emp-curr-control",
 | 
				
			||||||
 | 
								&data->emp_curr_control);
 | 
				
			||||||
 | 
						of_property_read_u32(np, "samsung,picophy-dc-vol-level-adjust",
 | 
				
			||||||
 | 
								&data->dc_vol_level_adjust);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return data;
 | 
						return data;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -26,6 +26,8 @@ struct imx_usbmisc_data {
 | 
				
			||||||
	unsigned int ext_vbus:1; /* Vbus from exteranl event */
 | 
						unsigned int ext_vbus:1; /* Vbus from exteranl event */
 | 
				
			||||||
	struct usb_phy *usb_phy;
 | 
						struct usb_phy *usb_phy;
 | 
				
			||||||
	enum usb_dr_mode available_role; /* runtime usb dr mode */
 | 
						enum usb_dr_mode available_role; /* runtime usb dr mode */
 | 
				
			||||||
 | 
						int emp_curr_control;
 | 
				
			||||||
 | 
						int dc_vol_level_adjust;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int imx_usbmisc_init(struct imx_usbmisc_data *data);
 | 
					int imx_usbmisc_init(struct imx_usbmisc_data *data);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -128,6 +128,12 @@
 | 
				
			||||||
#define MX7D_USB_OTG_PHY_STATUS_VBUS_VLD	BIT(3)
 | 
					#define MX7D_USB_OTG_PHY_STATUS_VBUS_VLD	BIT(3)
 | 
				
			||||||
#define MX7D_USB_OTG_PHY_STATUS_CHRGDET		BIT(29)
 | 
					#define MX7D_USB_OTG_PHY_STATUS_CHRGDET		BIT(29)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define MX7D_USB_OTG_PHY_CFG1		0x30
 | 
				
			||||||
 | 
					#define TXPREEMPAMPTUNE0_BIT		28
 | 
				
			||||||
 | 
					#define TXPREEMPAMPTUNE0_MASK		(3 << 28)
 | 
				
			||||||
 | 
					#define TXVREFTUNE0_BIT			20
 | 
				
			||||||
 | 
					#define TXVREFTUNE0_MASK		(0xf << 20)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define MX6_USB_OTG_WAKEUP_BITS (MX6_BM_WAKEUP_ENABLE | MX6_BM_VBUS_WAKEUP | \
 | 
					#define MX6_USB_OTG_WAKEUP_BITS (MX6_BM_WAKEUP_ENABLE | MX6_BM_VBUS_WAKEUP | \
 | 
				
			||||||
				 MX6_BM_ID_WAKEUP)
 | 
									 MX6_BM_ID_WAKEUP)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -649,6 +655,21 @@ static int usbmisc_imx7d_init(struct imx_usbmisc_data *data)
 | 
				
			||||||
		writel(reg | MX7D_USB_VBUS_WAKEUP_SOURCE_BVALID
 | 
							writel(reg | MX7D_USB_VBUS_WAKEUP_SOURCE_BVALID
 | 
				
			||||||
			| MX7D_USBNC_AUTO_RESUME,
 | 
								| MX7D_USBNC_AUTO_RESUME,
 | 
				
			||||||
			usbmisc->base + MX7D_USBNC_USB_CTRL2);
 | 
								usbmisc->base + MX7D_USBNC_USB_CTRL2);
 | 
				
			||||||
 | 
							/* PHY tuning for signal quality */
 | 
				
			||||||
 | 
							reg = readl(usbmisc->base + MX7D_USB_OTG_PHY_CFG1);
 | 
				
			||||||
 | 
							if (data->emp_curr_control && data->emp_curr_control <=
 | 
				
			||||||
 | 
								(TXPREEMPAMPTUNE0_MASK >> TXPREEMPAMPTUNE0_BIT)) {
 | 
				
			||||||
 | 
								reg &= ~TXPREEMPAMPTUNE0_MASK;
 | 
				
			||||||
 | 
								reg |= (data->emp_curr_control << TXPREEMPAMPTUNE0_BIT);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (data->dc_vol_level_adjust && data->dc_vol_level_adjust <=
 | 
				
			||||||
 | 
								(TXVREFTUNE0_MASK >> TXVREFTUNE0_BIT)) {
 | 
				
			||||||
 | 
								reg &= ~TXVREFTUNE0_MASK;
 | 
				
			||||||
 | 
								reg |= (data->dc_vol_level_adjust << TXVREFTUNE0_BIT);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							writel(reg, usbmisc->base + MX7D_USB_OTG_PHY_CFG1);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	spin_unlock_irqrestore(&usbmisc->lock, flags);
 | 
						spin_unlock_irqrestore(&usbmisc->lock, flags);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue