forked from mirrors/linux
		
	Prior to DRA74x silicon rev 1.1, pcie_pcs register bits 8-15 and bits 16-23 were used to configure RC delay count for phy1 and phy2 respectively. phyid was used as index to distinguish the phys and to configure the delay values appropriately. As of DRA74x silicon rev 1.1, pcie_pcs register definition has changed. Bits 16-23 are used to configure delay values for *both* phy1 and phy2. Hence phyid is no longer required. So, drop id field from ti_pipe3 structure and its subsequent references for configuring pcie_pcs register. Also, pcie_pcs register now needs to be configured with delay value of 0x96 at bit positions 16-23. See register description of CTRL_CORE_PCIE_PCS in ARM572x TRM, SPRUHZ6, October 2014, section 18.5.2.2, table 18-1804. This is needed to ensure Gen2 cards are enumerated consistently. DRA72x silicon behaves same way as DRA74x rev 1.1 as far as this functionality is considered. Test results on DRA74x and DRA72x EVMs: Before patch ------------ DRA74x ES 1.0: Gen1 cards work, Gen2 cards do not work (expected result due to silicon errata) DRA74x ES 1.1: Gen1 cards work, Gen2 cards do not work sometimes due to incorrect programming of register DRA72x: Gen1 cards work, Gen2 cards do not work sometimes due to incorrect programming of register After patch ----------- DRA74x ES 1.0: Gen1 cards work, Gen2 cards do not work (expected result due to silicon errata) DRA74x ES 1.1: Gen1 cards work, Gen2 cards work consistently. DRA72x: Gen1 and Gen2 cards enumerate consistently. Signed-off-by: Vignesh R <vigneshr@ti.com> Signed-off-by: Kishon Vijay Abraham I <kishon@ti.com>
		
			
				
	
	
		
			99 lines
		
	
	
	
		
			2.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			99 lines
		
	
	
	
		
			2.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/*
 | 
						|
 * omap_control_phy.h - Header file for the PHY part of control module.
 | 
						|
 *
 | 
						|
 * Copyright (C) 2013 Texas Instruments Incorporated - http://www.ti.com
 | 
						|
 * This program is free software; you can redistribute it and/or modify
 | 
						|
 * it under the terms of the GNU General Public License as published by
 | 
						|
 * the Free Software Foundation; either version 2 of the License, or
 | 
						|
 * (at your option) any later version.
 | 
						|
 *
 | 
						|
 * Author: Kishon Vijay Abraham I <kishon@ti.com>
 | 
						|
 *
 | 
						|
 * This program is distributed in the hope that it will be useful,
 | 
						|
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
						|
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
						|
 * GNU General Public License for more details.
 | 
						|
 *
 | 
						|
 */
 | 
						|
 | 
						|
#ifndef __OMAP_CONTROL_PHY_H__
 | 
						|
#define __OMAP_CONTROL_PHY_H__
 | 
						|
 | 
						|
enum omap_control_phy_type {
 | 
						|
	OMAP_CTRL_TYPE_OTGHS = 1,	/* Mailbox OTGHS_CONTROL */
 | 
						|
	OMAP_CTRL_TYPE_USB2,	/* USB2_PHY, power down in CONTROL_DEV_CONF */
 | 
						|
	OMAP_CTRL_TYPE_PIPE3,	/* PIPE3 PHY, DPLL & seperate Rx/Tx power */
 | 
						|
	OMAP_CTRL_TYPE_PCIE,	/* RX TX control of ACSPCIE */
 | 
						|
	OMAP_CTRL_TYPE_DRA7USB2, /* USB2 PHY, power and power_aux e.g. DRA7 */
 | 
						|
	OMAP_CTRL_TYPE_AM437USB2, /* USB2 PHY, power e.g. AM437x */
 | 
						|
};
 | 
						|
 | 
						|
struct omap_control_phy {
 | 
						|
	struct device *dev;
 | 
						|
 | 
						|
	u32 __iomem *otghs_control;
 | 
						|
	u32 __iomem *power;
 | 
						|
	u32 __iomem *power_aux;
 | 
						|
	u32 __iomem *pcie_pcs;
 | 
						|
 | 
						|
	struct clk *sys_clk;
 | 
						|
 | 
						|
	enum omap_control_phy_type type;
 | 
						|
};
 | 
						|
 | 
						|
enum omap_control_usb_mode {
 | 
						|
	USB_MODE_UNDEFINED = 0,
 | 
						|
	USB_MODE_HOST,
 | 
						|
	USB_MODE_DEVICE,
 | 
						|
	USB_MODE_DISCONNECT,
 | 
						|
};
 | 
						|
 | 
						|
#define	OMAP_CTRL_DEV_PHY_PD		BIT(0)
 | 
						|
 | 
						|
#define	OMAP_CTRL_DEV_AVALID		BIT(0)
 | 
						|
#define	OMAP_CTRL_DEV_BVALID		BIT(1)
 | 
						|
#define	OMAP_CTRL_DEV_VBUSVALID		BIT(2)
 | 
						|
#define	OMAP_CTRL_DEV_SESSEND		BIT(3)
 | 
						|
#define	OMAP_CTRL_DEV_IDDIG		BIT(4)
 | 
						|
 | 
						|
#define	OMAP_CTRL_PIPE3_PHY_PWRCTL_CLK_CMD_MASK		0x003FC000
 | 
						|
#define	OMAP_CTRL_PIPE3_PHY_PWRCTL_CLK_CMD_SHIFT	0xE
 | 
						|
 | 
						|
#define	OMAP_CTRL_PIPE3_PHY_PWRCTL_CLK_FREQ_MASK	0xFFC00000
 | 
						|
#define	OMAP_CTRL_PIPE3_PHY_PWRCTL_CLK_FREQ_SHIFT	0x16
 | 
						|
 | 
						|
#define	OMAP_CTRL_PIPE3_PHY_TX_RX_POWERON	0x3
 | 
						|
#define	OMAP_CTRL_PIPE3_PHY_TX_RX_POWEROFF	0x0
 | 
						|
 | 
						|
#define	OMAP_CTRL_PCIE_PCS_MASK			0xff
 | 
						|
#define	OMAP_CTRL_PCIE_PCS_DELAY_COUNT_SHIFT	16
 | 
						|
 | 
						|
#define OMAP_CTRL_USB2_PHY_PD		BIT(28)
 | 
						|
 | 
						|
#define AM437X_CTRL_USB2_PHY_PD		BIT(0)
 | 
						|
#define AM437X_CTRL_USB2_OTG_PD		BIT(1)
 | 
						|
#define AM437X_CTRL_USB2_OTGVDET_EN	BIT(19)
 | 
						|
#define AM437X_CTRL_USB2_OTGSESSEND_EN	BIT(20)
 | 
						|
 | 
						|
#if IS_ENABLED(CONFIG_OMAP_CONTROL_PHY)
 | 
						|
void omap_control_phy_power(struct device *dev, int on);
 | 
						|
void omap_control_usb_set_mode(struct device *dev,
 | 
						|
			       enum omap_control_usb_mode mode);
 | 
						|
void omap_control_pcie_pcs(struct device *dev, u8 delay);
 | 
						|
#else
 | 
						|
 | 
						|
static inline void omap_control_phy_power(struct device *dev, int on)
 | 
						|
{
 | 
						|
}
 | 
						|
 | 
						|
static inline void omap_control_usb_set_mode(struct device *dev,
 | 
						|
	enum omap_control_usb_mode mode)
 | 
						|
{
 | 
						|
}
 | 
						|
 | 
						|
static inline void omap_control_pcie_pcs(struct device *dev, u8 delay)
 | 
						|
{
 | 
						|
}
 | 
						|
#endif
 | 
						|
 | 
						|
#endif	/* __OMAP_CONTROL_PHY_H__ */
 |