xref: /openbmc/u-boot/drivers/phy/marvell/comphy_core.h (revision 333279af23ac08ebc8d8056c677c98964dd013b6)
1*4b8cb843SMarek Behún /* SPDX-License-Identifier: GPL-2.0+ */
2*4b8cb843SMarek Behún /*
3*4b8cb843SMarek Behún  * Copyright (C) 2015-2016 Marvell International Ltd.
4*4b8cb843SMarek Behún  */
5*4b8cb843SMarek Behún 
6*4b8cb843SMarek Behún #ifndef _COMPHY_CORE_H_
7*4b8cb843SMarek Behún #define _COMPHY_CORE_H_
8*4b8cb843SMarek Behún 
9*4b8cb843SMarek Behún #include <fdtdec.h>
10*4b8cb843SMarek Behún #include <mvebu/comphy.h>
11*4b8cb843SMarek Behún 
12*4b8cb843SMarek Behún #if defined(DEBUG)
13*4b8cb843SMarek Behún #define debug_enter()	printf("----> Enter %s\n", __func__);
14*4b8cb843SMarek Behún #define debug_exit()	printf("<---- Exit  %s\n", __func__);
15*4b8cb843SMarek Behún #else
16*4b8cb843SMarek Behún #define debug_enter()
17*4b8cb843SMarek Behún #define debug_exit()
18*4b8cb843SMarek Behún #endif
19*4b8cb843SMarek Behún 
20*4b8cb843SMarek Behún /* COMPHY registers */
21*4b8cb843SMarek Behún #define COMMON_PHY_CFG1_REG			0x0
22*4b8cb843SMarek Behún #define COMMON_PHY_CFG1_PWR_UP_OFFSET		1
23*4b8cb843SMarek Behún #define COMMON_PHY_CFG1_PWR_UP_MASK		\
24*4b8cb843SMarek Behún 	(0x1 << COMMON_PHY_CFG1_PWR_UP_OFFSET)
25*4b8cb843SMarek Behún #define COMMON_PHY_CFG1_PIPE_SELECT_OFFSET	2
26*4b8cb843SMarek Behún #define COMMON_PHY_CFG1_PIPE_SELECT_MASK	\
27*4b8cb843SMarek Behún 	(0x1 << COMMON_PHY_CFG1_PIPE_SELECT_OFFSET)
28*4b8cb843SMarek Behún #define COMMON_PHY_CFG1_PWR_ON_RESET_OFFSET	13
29*4b8cb843SMarek Behún #define COMMON_PHY_CFG1_PWR_ON_RESET_MASK	\
30*4b8cb843SMarek Behún 	(0x1 << COMMON_PHY_CFG1_PWR_ON_RESET_OFFSET)
31*4b8cb843SMarek Behún #define COMMON_PHY_CFG1_CORE_RSTN_OFFSET	14
32*4b8cb843SMarek Behún #define COMMON_PHY_CFG1_CORE_RSTN_MASK		\
33*4b8cb843SMarek Behún 	(0x1 << COMMON_PHY_CFG1_CORE_RSTN_OFFSET)
34*4b8cb843SMarek Behún #define COMMON_PHY_PHY_MODE_OFFSET		15
35*4b8cb843SMarek Behún #define COMMON_PHY_PHY_MODE_MASK		\
36*4b8cb843SMarek Behún 	(0x1 << COMMON_PHY_PHY_MODE_OFFSET)
37*4b8cb843SMarek Behún 
38*4b8cb843SMarek Behún #define COMMON_PHY_CFG6_REG			0x14
39*4b8cb843SMarek Behún #define COMMON_PHY_CFG6_IF_40_SEL_OFFSET	18
40*4b8cb843SMarek Behún #define COMMON_PHY_CFG6_IF_40_SEL_MASK		\
41*4b8cb843SMarek Behún 	(0x1 << COMMON_PHY_CFG6_IF_40_SEL_OFFSET)
42*4b8cb843SMarek Behún 
43*4b8cb843SMarek Behún #define COMMON_SELECTOR_PHY_OFFSET		0x140
44*4b8cb843SMarek Behún #define COMMON_SELECTOR_PIPE_OFFSET		0x144
45*4b8cb843SMarek Behún 
46*4b8cb843SMarek Behún #define COMMON_PHY_SD_CTRL1			0x148
47*4b8cb843SMarek Behún #define COMMON_PHY_SD_CTRL1_COMPHY_0_4_PORT_OFFSET	0
48*4b8cb843SMarek Behún #define COMMON_PHY_SD_CTRL1_COMPHY_0_4_PORT_MASK	0xFFFF
49*4b8cb843SMarek Behún #define COMMON_PHY_SD_CTRL1_PCIE_X4_EN_OFFSET	24
50*4b8cb843SMarek Behún #define COMMON_PHY_SD_CTRL1_PCIE_X4_EN_MASK	\
51*4b8cb843SMarek Behún 	(0x1 << COMMON_PHY_SD_CTRL1_PCIE_X4_EN_OFFSET)
52*4b8cb843SMarek Behún #define COMMON_PHY_SD_CTRL1_PCIE_X2_EN_OFFSET	25
53*4b8cb843SMarek Behún #define COMMON_PHY_SD_CTRL1_PCIE_X2_EN_MASK	\
54*4b8cb843SMarek Behún 	(0x1 << COMMON_PHY_SD_CTRL1_PCIE_X2_EN_OFFSET)
55*4b8cb843SMarek Behún #define COMMON_PHY_SD_CTRL1_RXAUI1_OFFSET	26
56*4b8cb843SMarek Behún #define COMMON_PHY_SD_CTRL1_RXAUI1_MASK		\
57*4b8cb843SMarek Behún 	(0x1 << COMMON_PHY_SD_CTRL1_RXAUI1_OFFSET)
58*4b8cb843SMarek Behún #define COMMON_PHY_SD_CTRL1_RXAUI0_OFFSET	27
59*4b8cb843SMarek Behún #define COMMON_PHY_SD_CTRL1_RXAUI0_MASK		\
60*4b8cb843SMarek Behún 	(0x1 << COMMON_PHY_SD_CTRL1_RXAUI0_OFFSET)
61*4b8cb843SMarek Behún 
62*4b8cb843SMarek Behún /* ToDo: Get this address via DT */
63*4b8cb843SMarek Behún #define MVEBU_CP0_REGS_BASE			0xF2000000UL
64*4b8cb843SMarek Behún 
65*4b8cb843SMarek Behún #define DFX_DEV_GEN_CTRL12			(MVEBU_CP0_REGS_BASE + 0x400280)
66*4b8cb843SMarek Behún #define DFX_DEV_GEN_PCIE_CLK_SRC_OFFSET		7
67*4b8cb843SMarek Behún #define DFX_DEV_GEN_PCIE_CLK_SRC_MASK		\
68*4b8cb843SMarek Behún 	(0x3 << DFX_DEV_GEN_PCIE_CLK_SRC_OFFSET)
69*4b8cb843SMarek Behún 
70*4b8cb843SMarek Behún #define MAX_LANE_OPTIONS			10
71*4b8cb843SMarek Behún #define MAX_UTMI_PHY_COUNT			3
72*4b8cb843SMarek Behún 
73*4b8cb843SMarek Behún struct comphy_mux_options {
74*4b8cb843SMarek Behún 	u32 type;
75*4b8cb843SMarek Behún 	u32 mux_value;
76*4b8cb843SMarek Behún };
77*4b8cb843SMarek Behún 
78*4b8cb843SMarek Behún struct comphy_mux_data {
79*4b8cb843SMarek Behún 	u32 max_lane_values;
80*4b8cb843SMarek Behún 	struct comphy_mux_options mux_values[MAX_LANE_OPTIONS];
81*4b8cb843SMarek Behún };
82*4b8cb843SMarek Behún 
83*4b8cb843SMarek Behún struct chip_serdes_phy_config {
84*4b8cb843SMarek Behún 	struct comphy_mux_data *mux_data;
85*4b8cb843SMarek Behún 	int (*ptr_comphy_chip_init)(struct chip_serdes_phy_config *,
86*4b8cb843SMarek Behún 				    struct comphy_map *);
87*4b8cb843SMarek Behún 	void __iomem *comphy_base_addr;
88*4b8cb843SMarek Behún 	void __iomem *hpipe3_base_addr;
89*4b8cb843SMarek Behún 	u32 comphy_lanes_count;
90*4b8cb843SMarek Behún 	u32 comphy_mux_bitcount;
91*4b8cb843SMarek Behún 	const fdt32_t *comphy_mux_lane_order;
92*4b8cb843SMarek Behún 	u32 cp_index;
93*4b8cb843SMarek Behún };
94*4b8cb843SMarek Behún 
95*4b8cb843SMarek Behún /* Register helper functions */
reg_set_silent(void __iomem * addr,u32 data,u32 mask)96*4b8cb843SMarek Behún static inline void reg_set_silent(void __iomem *addr, u32 data, u32 mask)
97*4b8cb843SMarek Behún {
98*4b8cb843SMarek Behún 	u32 reg_data;
99*4b8cb843SMarek Behún 
100*4b8cb843SMarek Behún 	reg_data = readl(addr);
101*4b8cb843SMarek Behún 	reg_data &= ~mask;
102*4b8cb843SMarek Behún 	reg_data |= data;
103*4b8cb843SMarek Behún 	writel(reg_data, addr);
104*4b8cb843SMarek Behún }
105*4b8cb843SMarek Behún 
reg_set(void __iomem * addr,u32 data,u32 mask)106*4b8cb843SMarek Behún static inline void reg_set(void __iomem *addr, u32 data, u32 mask)
107*4b8cb843SMarek Behún {
108*4b8cb843SMarek Behún 	debug("Write to address = %#010lx, data = %#010x (mask = %#010x) - ",
109*4b8cb843SMarek Behún 	      (unsigned long)addr, data, mask);
110*4b8cb843SMarek Behún 	debug("old value = %#010x ==> ", readl(addr));
111*4b8cb843SMarek Behún 	reg_set_silent(addr, data, mask);
112*4b8cb843SMarek Behún 	debug("new value %#010x\n", readl(addr));
113*4b8cb843SMarek Behún }
114*4b8cb843SMarek Behún 
reg_set_silent16(void __iomem * addr,u16 data,u16 mask)115*4b8cb843SMarek Behún static inline void reg_set_silent16(void __iomem *addr, u16 data, u16 mask)
116*4b8cb843SMarek Behún {
117*4b8cb843SMarek Behún 	u16 reg_data;
118*4b8cb843SMarek Behún 
119*4b8cb843SMarek Behún 	reg_data = readw(addr);
120*4b8cb843SMarek Behún 	reg_data &= ~mask;
121*4b8cb843SMarek Behún 	reg_data |= data;
122*4b8cb843SMarek Behún 	writew(reg_data, addr);
123*4b8cb843SMarek Behún }
124*4b8cb843SMarek Behún 
reg_set16(void __iomem * addr,u16 data,u16 mask)125*4b8cb843SMarek Behún static inline void reg_set16(void __iomem *addr, u16 data, u16 mask)
126*4b8cb843SMarek Behún {
127*4b8cb843SMarek Behún 	debug("Write to address = %#010lx, data = %#06x (mask = %#06x) - ",
128*4b8cb843SMarek Behún 	      (unsigned long)addr, data, mask);
129*4b8cb843SMarek Behún 	debug("old value = %#06x ==> ", readw(addr));
130*4b8cb843SMarek Behún 	reg_set_silent16(addr, data, mask);
131*4b8cb843SMarek Behún 	debug("new value %#06x\n", readw(addr));
132*4b8cb843SMarek Behún }
133*4b8cb843SMarek Behún 
134*4b8cb843SMarek Behún /* SoC specific init functions */
135*4b8cb843SMarek Behún #ifdef CONFIG_ARMADA_3700
136*4b8cb843SMarek Behún int comphy_a3700_init(struct chip_serdes_phy_config *ptr_chip_cfg,
137*4b8cb843SMarek Behún 		      struct comphy_map *serdes_map);
138*4b8cb843SMarek Behún #else
comphy_a3700_init(struct chip_serdes_phy_config * ptr_chip_cfg,struct comphy_map * serdes_map)139*4b8cb843SMarek Behún static inline int comphy_a3700_init(struct chip_serdes_phy_config *ptr_chip_cfg,
140*4b8cb843SMarek Behún 				    struct comphy_map *serdes_map)
141*4b8cb843SMarek Behún {
142*4b8cb843SMarek Behún 	/*
143*4b8cb843SMarek Behún 	 * This function should never be called in this configuration, so
144*4b8cb843SMarek Behún 	 * lets return an error here.
145*4b8cb843SMarek Behún 	 */
146*4b8cb843SMarek Behún 	return -1;
147*4b8cb843SMarek Behún }
148*4b8cb843SMarek Behún #endif
149*4b8cb843SMarek Behún 
150*4b8cb843SMarek Behún #ifdef CONFIG_ARMADA_8K
151*4b8cb843SMarek Behún int comphy_cp110_init(struct chip_serdes_phy_config *ptr_chip_cfg,
152*4b8cb843SMarek Behún 		      struct comphy_map *serdes_map);
153*4b8cb843SMarek Behún #else
comphy_cp110_init(struct chip_serdes_phy_config * ptr_chip_cfg,struct comphy_map * serdes_map)154*4b8cb843SMarek Behún static inline int comphy_cp110_init(struct chip_serdes_phy_config *ptr_chip_cfg,
155*4b8cb843SMarek Behún 		      struct comphy_map *serdes_map)
156*4b8cb843SMarek Behún {
157*4b8cb843SMarek Behún 	/*
158*4b8cb843SMarek Behún 	 * This function should never be called in this configuration, so
159*4b8cb843SMarek Behún 	 * lets return an error here.
160*4b8cb843SMarek Behún 	 */
161*4b8cb843SMarek Behún 	return -1;
162*4b8cb843SMarek Behún }
163*4b8cb843SMarek Behún #endif
164*4b8cb843SMarek Behún 
165*4b8cb843SMarek Behún void comphy_dedicated_phys_init(void);
166*4b8cb843SMarek Behún 
167*4b8cb843SMarek Behún /* MUX function */
168*4b8cb843SMarek Behún void comphy_mux_init(struct chip_serdes_phy_config *ptr_chip_cfg,
169*4b8cb843SMarek Behún 		     struct comphy_map *comphy_map_data,
170*4b8cb843SMarek Behún 		     void __iomem *selector_base);
171*4b8cb843SMarek Behún 
172*4b8cb843SMarek Behún void comphy_pcie_config_set(u32 comphy_max_count,
173*4b8cb843SMarek Behún 			    struct comphy_map *serdes_map);
174*4b8cb843SMarek Behún void comphy_pcie_config_detect(u32 comphy_max_count,
175*4b8cb843SMarek Behún 			       struct comphy_map *serdes_map);
176*4b8cb843SMarek Behún void comphy_pcie_unit_general_config(u32 pex_index);
177*4b8cb843SMarek Behún 
178*4b8cb843SMarek Behún #endif /* _COMPHY_CORE_H_ */
179*4b8cb843SMarek Behún 
180