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