1a00ee452SLuo Wei // SPDX-License-Identifier: GPL-2.0-or-later
2a00ee452SLuo Wei /*
3a00ee452SLuo Wei * maxim-max96755.c -- I2C register interface access for max96755 serdes chip
4a00ee452SLuo Wei *
5a00ee452SLuo Wei * Copyright (c) 2023-2028 Rockchip Electronics Co. Ltd.
6a00ee452SLuo Wei *
7a00ee452SLuo Wei * Author: luowei <lw@rock-chips.com>
8a00ee452SLuo Wei */
9fb0c3269SLuo Wei
10fb0c3269SLuo Wei #include "../core.h"
11a00ee452SLuo Wei #include "maxim-max96755.h"
12a00ee452SLuo Wei
13fb0c3269SLuo Wei struct serdes_function_data {
14fb0c3269SLuo Wei u8 gpio_out_dis:1;
15fb0c3269SLuo Wei u8 gpio_tx_en:1;
16fb0c3269SLuo Wei u8 gpio_rx_en:1;
17fb0c3269SLuo Wei u8 gpio_tx_id;
18fb0c3269SLuo Wei u8 gpio_rx_id;
19fb0c3269SLuo Wei u16 mdelay;
20fb0c3269SLuo Wei };
21fb0c3269SLuo Wei
22fb0c3269SLuo Wei struct config_desc {
23fb0c3269SLuo Wei u16 reg;
24fb0c3269SLuo Wei u8 mask;
25fb0c3269SLuo Wei u8 val;
26fb0c3269SLuo Wei };
27fb0c3269SLuo Wei
28fb0c3269SLuo Wei struct serdes_group_data {
29fb0c3269SLuo Wei const struct config_desc *configs;
30fb0c3269SLuo Wei int num_configs;
31fb0c3269SLuo Wei };
32fb0c3269SLuo Wei
33fb0c3269SLuo Wei static int MAX96755_MFP0_pins[] = {0};
34fb0c3269SLuo Wei static int MAX96755_MFP1_pins[] = {1};
35fb0c3269SLuo Wei static int MAX96755_MFP2_pins[] = {2};
36fb0c3269SLuo Wei static int MAX96755_MFP3_pins[] = {3};
37fb0c3269SLuo Wei static int MAX96755_MFP4_pins[] = {4};
38fb0c3269SLuo Wei static int MAX96755_MFP5_pins[] = {5};
39fb0c3269SLuo Wei static int MAX96755_MFP6_pins[] = {6};
40fb0c3269SLuo Wei static int MAX96755_MFP7_pins[] = {7};
41fb0c3269SLuo Wei
42fb0c3269SLuo Wei static int MAX96755_MFP8_pins[] = {8};
43fb0c3269SLuo Wei static int MAX96755_MFP9_pins[] = {9};
44fb0c3269SLuo Wei static int MAX96755_MFP10_pins[] = {10};
45fb0c3269SLuo Wei static int MAX96755_MFP11_pins[] = {11};
46fb0c3269SLuo Wei static int MAX96755_MFP12_pins[] = {12};
47fb0c3269SLuo Wei static int MAX96755_MFP13_pins[] = {13};
48fb0c3269SLuo Wei static int MAX96755_MFP14_pins[] = {14};
49fb0c3269SLuo Wei static int MAX96755_MFP15_pins[] = {15};
50fb0c3269SLuo Wei
51fb0c3269SLuo Wei static int MAX96755_MFP16_pins[] = {16};
52fb0c3269SLuo Wei static int MAX96755_MFP17_pins[] = {17};
53fb0c3269SLuo Wei static int MAX96755_MFP18_pins[] = {18};
54fb0c3269SLuo Wei static int MAX96755_MFP19_pins[] = {19};
55fb0c3269SLuo Wei static int MAX96755_MFP20_pins[] = {20};
56fb0c3269SLuo Wei static int MAX96755_I2C_pins[] = {19, 20};
57fb0c3269SLuo Wei static int MAX96755_UART_pins[] = {19, 20};
58fb0c3269SLuo Wei
59fb0c3269SLuo Wei #define GROUP_DESC(nm) \
60fb0c3269SLuo Wei { \
61fb0c3269SLuo Wei .name = #nm, \
62fb0c3269SLuo Wei .pins = nm ## _pins, \
63fb0c3269SLuo Wei .num_pins = ARRAY_SIZE(nm ## _pins), \
64a00ee452SLuo Wei }
65a00ee452SLuo Wei
66fb0c3269SLuo Wei #define GROUP_DESC_CONFIG(nm) \
67fb0c3269SLuo Wei { \
68fb0c3269SLuo Wei .name = #nm, \
69fb0c3269SLuo Wei .pins = nm ## _pins, \
70fb0c3269SLuo Wei .num_pins = ARRAY_SIZE(nm ## _pins), \
71fb0c3269SLuo Wei .data = (void *)(const struct serdes_group_data []) { \
72fb0c3269SLuo Wei { \
73fb0c3269SLuo Wei .configs = nm ## _configs, \
74fb0c3269SLuo Wei .num_configs = ARRAY_SIZE(nm ## _configs), \
75fb0c3269SLuo Wei } \
76fb0c3269SLuo Wei }, \
77fb0c3269SLuo Wei }
78fb0c3269SLuo Wei
79fb0c3269SLuo Wei static const struct config_desc MAX96755_MFP0_configs[] = {
80fb0c3269SLuo Wei { 0x0005, LOCK_EN, 0 },
81fb0c3269SLuo Wei { 0x0048, LOC_MS_EN, 0 },
82fb0c3269SLuo Wei };
83fb0c3269SLuo Wei
84fb0c3269SLuo Wei static const struct config_desc MAX96755_MFP1_configs[] = {
85fb0c3269SLuo Wei { 0x0005, ERRB_EN, 0 },
86fb0c3269SLuo Wei };
87fb0c3269SLuo Wei
88fb0c3269SLuo Wei static const struct config_desc MAX96755_MFP4_configs[] = {
89fb0c3269SLuo Wei { 0x070, SPI_EN, 0 },
90fb0c3269SLuo Wei };
91fb0c3269SLuo Wei
92fb0c3269SLuo Wei static const struct config_desc MAX96755_MFP5_configs[] = {
93fb0c3269SLuo Wei { 0x006, RCLKEN, 0 },
94fb0c3269SLuo Wei };
95fb0c3269SLuo Wei
96fb0c3269SLuo Wei static const struct config_desc MAX96755_MFP7_configs[] = {
97fb0c3269SLuo Wei { 0x0002, AUD_TX_EN_X, 0 },
98fb0c3269SLuo Wei { 0x0002, AUD_TX_EN_Y, 0 }
99fb0c3269SLuo Wei };
100fb0c3269SLuo Wei
101fb0c3269SLuo Wei static const struct config_desc MAX96755_MFP8_configs[] = {
102fb0c3269SLuo Wei { 0x0002, AUD_TX_EN_X, 0 },
103fb0c3269SLuo Wei { 0x0002, AUD_TX_EN_Y, 0 }
104fb0c3269SLuo Wei };
105fb0c3269SLuo Wei
106fb0c3269SLuo Wei static const struct config_desc MAX96755_MFP9_configs[] = {
107fb0c3269SLuo Wei { 0x0002, AUD_TX_EN_X, 0 },
108fb0c3269SLuo Wei { 0x0002, AUD_TX_EN_Y, 0 }
109fb0c3269SLuo Wei };
110fb0c3269SLuo Wei
111fb0c3269SLuo Wei static const struct config_desc MAX96755_MFP10_configs[] = {
112fb0c3269SLuo Wei { 0x0001, IIC_2_EN, 0 },
113fb0c3269SLuo Wei { 0x0003, UART_2_EN, 0 },
114fb0c3269SLuo Wei { 0x0140, AUD_RX_EN, 0 },
115fb0c3269SLuo Wei };
116fb0c3269SLuo Wei
117fb0c3269SLuo Wei static const struct config_desc MAX96755_MFP11_configs[] = {
118fb0c3269SLuo Wei { 0x0001, IIC_2_EN, 0 },
119fb0c3269SLuo Wei { 0x0003, UART_2_EN, 0 },
120fb0c3269SLuo Wei { 0x0140, AUD_RX_EN, 0 },
121fb0c3269SLuo Wei };
122fb0c3269SLuo Wei
123fb0c3269SLuo Wei static const struct config_desc MAX96755_MFP12_configs[] = {
124fb0c3269SLuo Wei { 0x0140, AUD_RX_EN, 0 },
125fb0c3269SLuo Wei };
126fb0c3269SLuo Wei
127fb0c3269SLuo Wei static const struct config_desc MAX96755_MFP13_configs[] = {
128fb0c3269SLuo Wei { 0x0005, PU_LF0, 0 },
129fb0c3269SLuo Wei };
130fb0c3269SLuo Wei
131fb0c3269SLuo Wei static const struct config_desc MAX96755_MFP14_configs[] = {
132fb0c3269SLuo Wei { 0x0005, PU_LF1, 0 },
133fb0c3269SLuo Wei };
134fb0c3269SLuo Wei
135fb0c3269SLuo Wei static const struct config_desc MAX96755_MFP15_configs[] = {
136fb0c3269SLuo Wei { 0x0005, PU_LF2, 0 },
137fb0c3269SLuo Wei };
138fb0c3269SLuo Wei
139fb0c3269SLuo Wei static const struct config_desc MAX96755_MFP16_configs[] = {
140fb0c3269SLuo Wei { 0x0005, PU_LF3, 0 },
141fb0c3269SLuo Wei };
142fb0c3269SLuo Wei
143fb0c3269SLuo Wei static const struct config_desc MAX96755_MFP17_configs[] = {
144fb0c3269SLuo Wei { 0x0001, IIC_1_EN, 0 },
145fb0c3269SLuo Wei { 0x0003, UART_1_EN, 0 },
146fb0c3269SLuo Wei };
147fb0c3269SLuo Wei
148fb0c3269SLuo Wei static const struct config_desc MAX96755_MFP18_configs[] = {
149fb0c3269SLuo Wei { 0x0001, IIC_1_EN, 0 },
150fb0c3269SLuo Wei { 0x0003, UART_1_EN, 0 },
151fb0c3269SLuo Wei };
152fb0c3269SLuo Wei
153fb0c3269SLuo Wei static const char *serdes_gpio_groups[] = {
154fb0c3269SLuo Wei "MAX96755_MFP0", "MAX96755_MFP1", "MAX96755_MFP2", "MAX96755_MFP3",
155fb0c3269SLuo Wei "MAX96755_MFP4", "MAX96755_MFP5", "MAX96755_MFP6", "MAX96755_MFP7",
156fb0c3269SLuo Wei
157fb0c3269SLuo Wei "MAX96755_MFP8", "MAX96755_MFP9", "MAX96755_MFP10", "MAX96755_MFP11",
158fb0c3269SLuo Wei "MAX96755_MFP12", "MAX96755_MFP13", "MAX96755_MFP14", "MAX96755_MFP15",
159fb0c3269SLuo Wei
160fb0c3269SLuo Wei "MAX96755_MFP16", "MAX96755_MFP17", "MAX96755_MFP18", "MAX96755_MFP19",
161fb0c3269SLuo Wei "MAX96755_MFP20",
162fb0c3269SLuo Wei };
163fb0c3269SLuo Wei
164fb0c3269SLuo Wei static const char *MAX96755_I2C_groups[] = { "MAX96755_I2C" };
165fb0c3269SLuo Wei static const char *MAX96755_UART_groups[] = { "MAX96755_UART" };
166fb0c3269SLuo Wei
167fb0c3269SLuo Wei #define FUNCTION_DESC(nm) \
168fb0c3269SLuo Wei { \
169fb0c3269SLuo Wei .name = #nm, \
170fb0c3269SLuo Wei .group_names = nm##_groups, \
171fb0c3269SLuo Wei .num_group_names = ARRAY_SIZE(nm##_groups), \
172fb0c3269SLuo Wei } \
173fb0c3269SLuo Wei
174fb0c3269SLuo Wei #define FUNCTION_DESC_GPIO_INPUT(id) \
175fb0c3269SLuo Wei { \
176fb0c3269SLuo Wei .name = "DES_RXID"#id"_TO_SER", \
177fb0c3269SLuo Wei .group_names = serdes_gpio_groups, \
178fb0c3269SLuo Wei .num_group_names = ARRAY_SIZE(serdes_gpio_groups), \
179fb0c3269SLuo Wei .data = (void *)(const struct serdes_function_data []) { \
180fb0c3269SLuo Wei { .gpio_out_dis = 0, .gpio_rx_en = 1, .gpio_rx_id = id } \
181fb0c3269SLuo Wei }, \
182fb0c3269SLuo Wei } \
183fb0c3269SLuo Wei
184fb0c3269SLuo Wei #define FUNCTION_DESC_GPIO_OUTPUT(id) \
185fb0c3269SLuo Wei { \
186fb0c3269SLuo Wei .name = "SER_TXID"#id"_TO_DES", \
187fb0c3269SLuo Wei .group_names = serdes_gpio_groups, \
188fb0c3269SLuo Wei .num_group_names = ARRAY_SIZE(serdes_gpio_groups), \
189fb0c3269SLuo Wei .data = (void *)(const struct serdes_function_data []) { \
190fb0c3269SLuo Wei { .gpio_out_dis = 1, .gpio_tx_en = 1, .gpio_tx_id = id } \
191fb0c3269SLuo Wei }, \
192fb0c3269SLuo Wei } \
193fb0c3269SLuo Wei
194fb0c3269SLuo Wei static struct pinctrl_pin_desc max96755_pins_desc[] = {
195fb0c3269SLuo Wei PINCTRL_PIN(MAXIM_MAX96755_MFP0, "MAX96755_MFP0"),
196fb0c3269SLuo Wei PINCTRL_PIN(MAXIM_MAX96755_MFP1, "MAX96755_MFP1"),
197fb0c3269SLuo Wei PINCTRL_PIN(MAXIM_MAX96755_MFP2, "MAX96755_MFP2"),
198fb0c3269SLuo Wei PINCTRL_PIN(MAXIM_MAX96755_MFP3, "MAX96755_MFP3"),
199fb0c3269SLuo Wei PINCTRL_PIN(MAXIM_MAX96755_MFP4, "MAX96755_MFP4"),
200fb0c3269SLuo Wei PINCTRL_PIN(MAXIM_MAX96755_MFP5, "MAX96755_MFP5"),
201fb0c3269SLuo Wei PINCTRL_PIN(MAXIM_MAX96755_MFP6, "MAX96755_MFP6"),
202fb0c3269SLuo Wei PINCTRL_PIN(MAXIM_MAX96755_MFP7, "MAX96755_MFP7"),
203fb0c3269SLuo Wei
204fb0c3269SLuo Wei PINCTRL_PIN(MAXIM_MAX96755_MFP8, "MAX96755_MFP8"),
205fb0c3269SLuo Wei PINCTRL_PIN(MAXIM_MAX96755_MFP9, "MAX96755_MFP9"),
206fb0c3269SLuo Wei PINCTRL_PIN(MAXIM_MAX96755_MFP10, "MAX96755_MFP10"),
207fb0c3269SLuo Wei PINCTRL_PIN(MAXIM_MAX96755_MFP11, "MAX96755_MFP11"),
208fb0c3269SLuo Wei PINCTRL_PIN(MAXIM_MAX96755_MFP12, "MAX96755_MFP12"),
209fb0c3269SLuo Wei PINCTRL_PIN(MAXIM_MAX96755_MFP13, "MAX96755_MFP13"),
210fb0c3269SLuo Wei PINCTRL_PIN(MAXIM_MAX96755_MFP14, "MAX96755_MFP14"),
211fb0c3269SLuo Wei PINCTRL_PIN(MAXIM_MAX96755_MFP15, "MAX96755_MFP15"),
212fb0c3269SLuo Wei
213fb0c3269SLuo Wei PINCTRL_PIN(MAXIM_MAX96755_MFP16, "MAX96755_MFP16"),
214fb0c3269SLuo Wei PINCTRL_PIN(MAXIM_MAX96755_MFP17, "MAX96755_MFP17"),
215fb0c3269SLuo Wei PINCTRL_PIN(MAXIM_MAX96755_MFP18, "MAX96755_MFP18"),
216fb0c3269SLuo Wei PINCTRL_PIN(MAXIM_MAX96755_MFP19, "MAX96755_MFP19"),
217fb0c3269SLuo Wei PINCTRL_PIN(MAXIM_MAX96755_MFP20, "MAX96755_MFP20"),
218fb0c3269SLuo Wei };
219fb0c3269SLuo Wei
220fb0c3269SLuo Wei static struct group_desc max96755_groups_desc[] = {
221fb0c3269SLuo Wei GROUP_DESC_CONFIG(MAX96755_MFP0),
222fb0c3269SLuo Wei GROUP_DESC_CONFIG(MAX96755_MFP1),
223fb0c3269SLuo Wei GROUP_DESC(MAX96755_MFP2),
224fb0c3269SLuo Wei GROUP_DESC(MAX96755_MFP3),
225fb0c3269SLuo Wei GROUP_DESC_CONFIG(MAX96755_MFP4),
226fb0c3269SLuo Wei GROUP_DESC_CONFIG(MAX96755_MFP5),
227fb0c3269SLuo Wei GROUP_DESC(MAX96755_MFP6),
228fb0c3269SLuo Wei GROUP_DESC_CONFIG(MAX96755_MFP7),
229fb0c3269SLuo Wei
230fb0c3269SLuo Wei GROUP_DESC_CONFIG(MAX96755_MFP8),
231fb0c3269SLuo Wei GROUP_DESC_CONFIG(MAX96755_MFP9),
232fb0c3269SLuo Wei GROUP_DESC_CONFIG(MAX96755_MFP10),
233fb0c3269SLuo Wei GROUP_DESC_CONFIG(MAX96755_MFP11),
234fb0c3269SLuo Wei GROUP_DESC_CONFIG(MAX96755_MFP12),
235fb0c3269SLuo Wei GROUP_DESC_CONFIG(MAX96755_MFP13),
236fb0c3269SLuo Wei GROUP_DESC_CONFIG(MAX96755_MFP14),
237fb0c3269SLuo Wei GROUP_DESC_CONFIG(MAX96755_MFP15),
238fb0c3269SLuo Wei
239fb0c3269SLuo Wei GROUP_DESC_CONFIG(MAX96755_MFP16),
240fb0c3269SLuo Wei GROUP_DESC_CONFIG(MAX96755_MFP17),
241fb0c3269SLuo Wei GROUP_DESC_CONFIG(MAX96755_MFP18),
242fb0c3269SLuo Wei GROUP_DESC(MAX96755_MFP19),
243fb0c3269SLuo Wei GROUP_DESC(MAX96755_MFP20),
244fb0c3269SLuo Wei GROUP_DESC(MAX96755_I2C),
245fb0c3269SLuo Wei GROUP_DESC(MAX96755_UART),
246fb0c3269SLuo Wei };
247fb0c3269SLuo Wei
248fb0c3269SLuo Wei static struct function_desc max96755_functions_desc[] = {
249fb0c3269SLuo Wei FUNCTION_DESC_GPIO_INPUT(0),
250fb0c3269SLuo Wei FUNCTION_DESC_GPIO_INPUT(1),
251fb0c3269SLuo Wei FUNCTION_DESC_GPIO_INPUT(2),
252fb0c3269SLuo Wei FUNCTION_DESC_GPIO_INPUT(3),
253fb0c3269SLuo Wei FUNCTION_DESC_GPIO_INPUT(4),
254fb0c3269SLuo Wei FUNCTION_DESC_GPIO_INPUT(5),
255fb0c3269SLuo Wei FUNCTION_DESC_GPIO_INPUT(6),
256fb0c3269SLuo Wei FUNCTION_DESC_GPIO_INPUT(7),
257fb0c3269SLuo Wei
258fb0c3269SLuo Wei FUNCTION_DESC_GPIO_INPUT(8),
259fb0c3269SLuo Wei FUNCTION_DESC_GPIO_INPUT(9),
260fb0c3269SLuo Wei FUNCTION_DESC_GPIO_INPUT(10),
261fb0c3269SLuo Wei FUNCTION_DESC_GPIO_INPUT(11),
262fb0c3269SLuo Wei FUNCTION_DESC_GPIO_INPUT(12),
263fb0c3269SLuo Wei FUNCTION_DESC_GPIO_INPUT(13),
264fb0c3269SLuo Wei FUNCTION_DESC_GPIO_INPUT(14),
265fb0c3269SLuo Wei FUNCTION_DESC_GPIO_INPUT(15),
266fb0c3269SLuo Wei
267fb0c3269SLuo Wei FUNCTION_DESC_GPIO_INPUT(16),
268fb0c3269SLuo Wei FUNCTION_DESC_GPIO_INPUT(17),
269fb0c3269SLuo Wei FUNCTION_DESC_GPIO_INPUT(18),
270fb0c3269SLuo Wei FUNCTION_DESC_GPIO_INPUT(19),
271fb0c3269SLuo Wei FUNCTION_DESC_GPIO_INPUT(20),
272fb0c3269SLuo Wei
273fb0c3269SLuo Wei FUNCTION_DESC_GPIO_OUTPUT(0),
274fb0c3269SLuo Wei FUNCTION_DESC_GPIO_OUTPUT(1),
275fb0c3269SLuo Wei FUNCTION_DESC_GPIO_OUTPUT(2),
276fb0c3269SLuo Wei FUNCTION_DESC_GPIO_OUTPUT(3),
277fb0c3269SLuo Wei FUNCTION_DESC_GPIO_OUTPUT(4),
278fb0c3269SLuo Wei FUNCTION_DESC_GPIO_OUTPUT(5),
279fb0c3269SLuo Wei FUNCTION_DESC_GPIO_OUTPUT(6),
280fb0c3269SLuo Wei FUNCTION_DESC_GPIO_OUTPUT(7),
281fb0c3269SLuo Wei
282fb0c3269SLuo Wei FUNCTION_DESC_GPIO_OUTPUT(8),
283fb0c3269SLuo Wei FUNCTION_DESC_GPIO_OUTPUT(9),
284fb0c3269SLuo Wei FUNCTION_DESC_GPIO_OUTPUT(10),
285fb0c3269SLuo Wei FUNCTION_DESC_GPIO_OUTPUT(11),
286fb0c3269SLuo Wei FUNCTION_DESC_GPIO_OUTPUT(12),
287fb0c3269SLuo Wei FUNCTION_DESC_GPIO_OUTPUT(13),
288fb0c3269SLuo Wei FUNCTION_DESC_GPIO_OUTPUT(14),
289fb0c3269SLuo Wei FUNCTION_DESC_GPIO_OUTPUT(15),
290fb0c3269SLuo Wei
291fb0c3269SLuo Wei FUNCTION_DESC_GPIO_OUTPUT(16),
292fb0c3269SLuo Wei FUNCTION_DESC_GPIO_OUTPUT(17),
293fb0c3269SLuo Wei FUNCTION_DESC_GPIO_OUTPUT(18),
294fb0c3269SLuo Wei FUNCTION_DESC_GPIO_OUTPUT(19),
295fb0c3269SLuo Wei FUNCTION_DESC_GPIO_OUTPUT(20),
296fb0c3269SLuo Wei
297fb0c3269SLuo Wei FUNCTION_DESC(MAX96755_I2C),
298fb0c3269SLuo Wei FUNCTION_DESC(MAX96755_UART),
299fb0c3269SLuo Wei };
300fb0c3269SLuo Wei
301fb0c3269SLuo Wei static struct serdes_chip_pinctrl_info max96755_pinctrl_info = {
302fb0c3269SLuo Wei .pins = max96755_pins_desc,
303fb0c3269SLuo Wei .num_pins = ARRAY_SIZE(max96755_pins_desc),
304fb0c3269SLuo Wei .groups = max96755_groups_desc,
305fb0c3269SLuo Wei .num_groups = ARRAY_SIZE(max96755_groups_desc),
306fb0c3269SLuo Wei .functions = max96755_functions_desc,
307fb0c3269SLuo Wei .num_functions = ARRAY_SIZE(max96755_functions_desc),
308fb0c3269SLuo Wei };
309fb0c3269SLuo Wei
max96755_bridge_linka_locked(struct serdes * serdes)310*d1fd9c74SLuo Wei static bool max96755_bridge_linka_locked(struct serdes *serdes)
311a00ee452SLuo Wei {
312a00ee452SLuo Wei u32 val;
313a00ee452SLuo Wei
314a00ee452SLuo Wei if (dm_gpio_is_valid(&serdes->lock_gpio)) {
315fb0c3269SLuo Wei val = dm_gpio_get_value(&serdes->lock_gpio);
316fb0c3269SLuo Wei SERDES_DBG_CHIP("serdes %s:val=%d\n", __func__, val);
317fb0c3269SLuo Wei return val;
318fb0c3269SLuo Wei }
319fb0c3269SLuo Wei
320fb0c3269SLuo Wei if (serdes_reg_read(serdes, 0x0013, &val)) {
321fb0c3269SLuo Wei SERDES_DBG_CHIP("serdes %s: false val=%d\n", __func__, val);
322a00ee452SLuo Wei return false;
323a00ee452SLuo Wei }
324a00ee452SLuo Wei
325fb0c3269SLuo Wei if (!FIELD_GET(LOCKED, val)) {
326fb0c3269SLuo Wei SERDES_DBG_CHIP("serdes %s: false val=%d\n", __func__, val);
327a00ee452SLuo Wei return false;
328fb0c3269SLuo Wei }
329a00ee452SLuo Wei
330a00ee452SLuo Wei return true;
331a00ee452SLuo Wei }
332a00ee452SLuo Wei
max96755_bridge_linkb_locked(struct serdes * serdes)333*d1fd9c74SLuo Wei static bool max96755_bridge_linkb_locked(struct serdes *serdes)
334fb0c3269SLuo Wei {
335*d1fd9c74SLuo Wei u32 val;
336*d1fd9c74SLuo Wei
337*d1fd9c74SLuo Wei if (dm_gpio_is_valid(&serdes->lock_gpio)) {
338*d1fd9c74SLuo Wei val = dm_gpio_get_value(&serdes->lock_gpio);
339*d1fd9c74SLuo Wei SERDES_DBG_CHIP("serdes %s:val=%d\n", __func__, val);
340*d1fd9c74SLuo Wei return val;
341*d1fd9c74SLuo Wei }
342*d1fd9c74SLuo Wei
343*d1fd9c74SLuo Wei if (serdes_reg_read(serdes, 0x0013, &val)) {
344*d1fd9c74SLuo Wei SERDES_DBG_CHIP("serdes %s: false val=%d\n", __func__, val);
345*d1fd9c74SLuo Wei return false;
346*d1fd9c74SLuo Wei }
347*d1fd9c74SLuo Wei
348*d1fd9c74SLuo Wei if (!FIELD_GET(LOCKED, val)) {
349*d1fd9c74SLuo Wei SERDES_DBG_CHIP("serdes %s: false val=%d\n", __func__, val);
350*d1fd9c74SLuo Wei return false;
351*d1fd9c74SLuo Wei }
352*d1fd9c74SLuo Wei
353*d1fd9c74SLuo Wei return true;
354*d1fd9c74SLuo Wei }
355*d1fd9c74SLuo Wei
max96755_bridge_detect(struct serdes * serdes,int link)356*d1fd9c74SLuo Wei static bool max96755_bridge_detect(struct serdes *serdes, int link)
357*d1fd9c74SLuo Wei {
358*d1fd9c74SLuo Wei if (link == LINKA)
359*d1fd9c74SLuo Wei return max96755_bridge_linka_locked(serdes);
360*d1fd9c74SLuo Wei else
361*d1fd9c74SLuo Wei return max96755_bridge_linkb_locked(serdes);
362fb0c3269SLuo Wei }
363fb0c3269SLuo Wei
max96755_bridge_enable(struct serdes * serdes)364a00ee452SLuo Wei static int max96755_bridge_enable(struct serdes *serdes)
365a00ee452SLuo Wei {
366a00ee452SLuo Wei int ret = 0;
367a00ee452SLuo Wei
368a00ee452SLuo Wei SERDES_DBG_CHIP("%s: serdes chip %s ret=%d\n",
369a00ee452SLuo Wei __func__, serdes->chip_data->name, ret);
370a00ee452SLuo Wei return ret;
371a00ee452SLuo Wei }
372a00ee452SLuo Wei
max96755_bridge_disable(struct serdes * serdes)373a00ee452SLuo Wei static int max96755_bridge_disable(struct serdes *serdes)
374a00ee452SLuo Wei {
375a00ee452SLuo Wei int ret = 0;
376a00ee452SLuo Wei
377a00ee452SLuo Wei ret = serdes_set_bits(serdes, 0x0002, VID_TX_EN_X,
378a00ee452SLuo Wei FIELD_PREP(VID_TX_EN_X, 0));
379a00ee452SLuo Wei
380a00ee452SLuo Wei return ret;
381a00ee452SLuo Wei }
382a00ee452SLuo Wei
383a00ee452SLuo Wei static struct serdes_chip_bridge_ops max96755_bridge_ops = {
384a00ee452SLuo Wei .detect = max96755_bridge_detect,
385a00ee452SLuo Wei .enable = max96755_bridge_enable,
386a00ee452SLuo Wei .disable = max96755_bridge_disable,
387a00ee452SLuo Wei };
388a00ee452SLuo Wei
max96755_pinctrl_set_pin_mux(struct serdes * serdes,unsigned int pin_selector,unsigned int func_selector)389fb0c3269SLuo Wei static int max96755_pinctrl_set_pin_mux(struct serdes *serdes,
390fb0c3269SLuo Wei unsigned int pin_selector,
391fb0c3269SLuo Wei unsigned int func_selector)
392fb0c3269SLuo Wei {
393fb0c3269SLuo Wei struct function_desc *func;
394fb0c3269SLuo Wei struct pinctrl_pin_desc *pin;
395fb0c3269SLuo Wei int offset;
396fb0c3269SLuo Wei u16 ms;
397fb0c3269SLuo Wei
398fb0c3269SLuo Wei func = &serdes->chip_data->pinctrl_info->functions[func_selector];
399fb0c3269SLuo Wei if (!func) {
400fb0c3269SLuo Wei printf("%s: func is null\n", __func__);
401fb0c3269SLuo Wei return -EINVAL;
402fb0c3269SLuo Wei }
403fb0c3269SLuo Wei
404fb0c3269SLuo Wei pin = &serdes->chip_data->pinctrl_info->pins[pin_selector];
405fb0c3269SLuo Wei if (!pin) {
406fb0c3269SLuo Wei printf("%s: pin is null\n", __func__);
407fb0c3269SLuo Wei return -EINVAL;
408fb0c3269SLuo Wei }
409fb0c3269SLuo Wei
410fb0c3269SLuo Wei SERDES_DBG_CHIP("%s: serdes %s func=%s data=%p pin=%s num=%d\n",
411fb0c3269SLuo Wei __func__, serdes->dev->name,
412fb0c3269SLuo Wei func->name, func->data,
413fb0c3269SLuo Wei pin->name, pin->number);
414fb0c3269SLuo Wei
415fb0c3269SLuo Wei if (func->data) {
416fb0c3269SLuo Wei struct serdes_function_data *fdata = func->data;
417fb0c3269SLuo Wei
418fb0c3269SLuo Wei ms = fdata->mdelay;
419fb0c3269SLuo Wei offset = pin->number;
420fb0c3269SLuo Wei if (offset > 32)
421fb0c3269SLuo Wei dev_err(serdes->dev, "%s offset=%d > 32\n",
422fb0c3269SLuo Wei serdes->dev->name, offset);
423fb0c3269SLuo Wei else
424fb0c3269SLuo Wei SERDES_DBG_CHIP("%s: serdes %s txid=%d rxid=%d off=%d\n",
425fb0c3269SLuo Wei __func__, serdes->dev->name,
426fb0c3269SLuo Wei fdata->gpio_tx_id, fdata->gpio_rx_id, offset);
427fb0c3269SLuo Wei
428fb0c3269SLuo Wei if (!ms) {
429fb0c3269SLuo Wei serdes_set_bits(serdes, GPIO_A_REG(offset),
430fb0c3269SLuo Wei GPIO_OUT_DIS | GPIO_RX_EN | GPIO_TX_EN,
431fb0c3269SLuo Wei FIELD_PREP(GPIO_OUT_DIS, fdata->gpio_out_dis) |
432fb0c3269SLuo Wei FIELD_PREP(GPIO_RX_EN, fdata->gpio_rx_en) |
433fb0c3269SLuo Wei FIELD_PREP(GPIO_TX_EN, fdata->gpio_tx_en));
434fb0c3269SLuo Wei
435fb0c3269SLuo Wei if (fdata->gpio_tx_en)
436fb0c3269SLuo Wei serdes_set_bits(serdes,
437fb0c3269SLuo Wei GPIO_B_REG(offset),
438fb0c3269SLuo Wei GPIO_TX_ID,
439fb0c3269SLuo Wei FIELD_PREP(GPIO_TX_ID, fdata->gpio_tx_id));
440fb0c3269SLuo Wei if (fdata->gpio_rx_en)
441fb0c3269SLuo Wei serdes_set_bits(serdes,
442fb0c3269SLuo Wei GPIO_C_REG(offset),
443fb0c3269SLuo Wei GPIO_RX_ID,
444fb0c3269SLuo Wei FIELD_PREP(GPIO_RX_ID, fdata->gpio_rx_id));
445fb0c3269SLuo Wei } else {
446fb0c3269SLuo Wei mdelay(ms);
447fb0c3269SLuo Wei SERDES_DBG_CHIP("%s: delay %dms\n", __func__, ms);
448fb0c3269SLuo Wei }
449fb0c3269SLuo Wei }
450fb0c3269SLuo Wei
451fb0c3269SLuo Wei return 0;
452fb0c3269SLuo Wei }
453fb0c3269SLuo Wei
max96755_pinctrl_set_grp_mux(struct serdes * serdes,unsigned int group_selector,unsigned int func_selector)454fb0c3269SLuo Wei static int max96755_pinctrl_set_grp_mux(struct serdes *serdes,
455fb0c3269SLuo Wei unsigned int group_selector,
456fb0c3269SLuo Wei unsigned int func_selector)
457fb0c3269SLuo Wei {
458fb0c3269SLuo Wei struct serdes_pinctrl *pinctrl = serdes->serdes_pinctrl;
459fb0c3269SLuo Wei struct function_desc *func;
460fb0c3269SLuo Wei struct group_desc *grp;
461fb0c3269SLuo Wei int i, offset;
462fb0c3269SLuo Wei u16 ms;
463fb0c3269SLuo Wei
464fb0c3269SLuo Wei func = &serdes->chip_data->pinctrl_info->functions[func_selector];
465fb0c3269SLuo Wei if (!func) {
466fb0c3269SLuo Wei printf("%s: func is null\n", __func__);
467fb0c3269SLuo Wei return -EINVAL;
468fb0c3269SLuo Wei }
469fb0c3269SLuo Wei
470fb0c3269SLuo Wei grp = &serdes->chip_data->pinctrl_info->groups[group_selector];
471fb0c3269SLuo Wei if (!grp) {
472fb0c3269SLuo Wei printf("%s: grp is null\n", __func__);
473fb0c3269SLuo Wei return -EINVAL;
474fb0c3269SLuo Wei }
475fb0c3269SLuo Wei
476fb0c3269SLuo Wei SERDES_DBG_CHIP("%s: serdes %s func=%s data=%p grp=%s data=%p, num=%d\n",
477fb0c3269SLuo Wei __func__, serdes->chip_data->name, func->name,
478fb0c3269SLuo Wei func->data, grp->name, grp->data, grp->num_pins);
479fb0c3269SLuo Wei
480fb0c3269SLuo Wei if (func->data) {
481fb0c3269SLuo Wei struct serdes_function_data *fdata = func->data;
482fb0c3269SLuo Wei
483fb0c3269SLuo Wei ms = fdata->mdelay;
484fb0c3269SLuo Wei for (i = 0; i < grp->num_pins; i++) {
485fb0c3269SLuo Wei offset = grp->pins[i] - pinctrl->pin_base;
486fb0c3269SLuo Wei if (offset > 32)
487fb0c3269SLuo Wei dev_err(serdes->dev, "%s offset=%d > 32\n",
488fb0c3269SLuo Wei serdes->dev->name, offset);
489fb0c3269SLuo Wei else
490fb0c3269SLuo Wei SERDES_DBG_CHIP("%s: serdes %s txid=%d rxid=%d off=%d\n",
491fb0c3269SLuo Wei __func__, serdes->dev->name,
492fb0c3269SLuo Wei fdata->gpio_tx_id, fdata->gpio_rx_id, offset);
493fb0c3269SLuo Wei
494fb0c3269SLuo Wei if (!ms) {
495fb0c3269SLuo Wei serdes_set_bits(serdes, GPIO_A_REG(offset),
496fb0c3269SLuo Wei GPIO_OUT_DIS | GPIO_RX_EN | GPIO_TX_EN,
497fb0c3269SLuo Wei FIELD_PREP(GPIO_OUT_DIS, fdata->gpio_out_dis) |
498fb0c3269SLuo Wei FIELD_PREP(GPIO_RX_EN, fdata->gpio_rx_en) |
499fb0c3269SLuo Wei FIELD_PREP(GPIO_TX_EN, fdata->gpio_tx_en));
500fb0c3269SLuo Wei if (fdata->gpio_tx_en)
501fb0c3269SLuo Wei serdes_set_bits(serdes,
502fb0c3269SLuo Wei GPIO_B_REG(offset),
503fb0c3269SLuo Wei GPIO_TX_ID,
504fb0c3269SLuo Wei FIELD_PREP(GPIO_TX_ID, fdata->gpio_tx_id));
505fb0c3269SLuo Wei if (fdata->gpio_rx_en)
506fb0c3269SLuo Wei serdes_set_bits(serdes,
507fb0c3269SLuo Wei GPIO_C_REG(offset),
508fb0c3269SLuo Wei GPIO_RX_ID,
509fb0c3269SLuo Wei FIELD_PREP(GPIO_RX_ID, fdata->gpio_rx_id));
510fb0c3269SLuo Wei } else {
511fb0c3269SLuo Wei mdelay(ms);
512fb0c3269SLuo Wei SERDES_DBG_CHIP("%s: delay %dms\n", __func__, ms);
513fb0c3269SLuo Wei }
514fb0c3269SLuo Wei }
515fb0c3269SLuo Wei }
516fb0c3269SLuo Wei
517fb0c3269SLuo Wei if (grp->data) {
518fb0c3269SLuo Wei struct serdes_group_data *gdata = grp->data;
519fb0c3269SLuo Wei
520fb0c3269SLuo Wei for (i = 0; i < gdata->num_configs; i++) {
521fb0c3269SLuo Wei const struct config_desc *config = &gdata->configs[i];
522fb0c3269SLuo Wei serdes_set_bits(serdes, config->reg,
523fb0c3269SLuo Wei config->mask, config->val);
524fb0c3269SLuo Wei }
525fb0c3269SLuo Wei }
526fb0c3269SLuo Wei
527fb0c3269SLuo Wei return 0;
528fb0c3269SLuo Wei }
529fb0c3269SLuo Wei
max96755_pinctrl_config_set(struct serdes * serdes,unsigned int pin_selector,unsigned int param,unsigned int argument)530fb0c3269SLuo Wei static int max96755_pinctrl_config_set(struct serdes *serdes,
531fb0c3269SLuo Wei unsigned int pin_selector,
532fb0c3269SLuo Wei unsigned int param, unsigned int argument)
533fb0c3269SLuo Wei {
534fb0c3269SLuo Wei u8 res_cfg;
535fb0c3269SLuo Wei
536fb0c3269SLuo Wei switch (param) {
537fb0c3269SLuo Wei case PIN_CONFIG_DRIVE_OPEN_DRAIN:
538fb0c3269SLuo Wei serdes_set_bits(serdes, GPIO_B_REG(pin_selector),
539fb0c3269SLuo Wei OUT_TYPE, FIELD_PREP(OUT_TYPE, 0));
540fb0c3269SLuo Wei break;
541fb0c3269SLuo Wei case PIN_CONFIG_DRIVE_PUSH_PULL:
542fb0c3269SLuo Wei serdes_set_bits(serdes, GPIO_B_REG(pin_selector),
543fb0c3269SLuo Wei OUT_TYPE, FIELD_PREP(OUT_TYPE, 1));
544fb0c3269SLuo Wei break;
545fb0c3269SLuo Wei case PIN_CONFIG_BIAS_DISABLE:
546fb0c3269SLuo Wei serdes_set_bits(serdes, GPIO_C_REG(pin_selector),
547fb0c3269SLuo Wei PULL_UPDN_SEL,
548fb0c3269SLuo Wei FIELD_PREP(PULL_UPDN_SEL, 0));
549fb0c3269SLuo Wei break;
550fb0c3269SLuo Wei case PIN_CONFIG_BIAS_PULL_UP:
551fb0c3269SLuo Wei switch (argument) {
552fb0c3269SLuo Wei case 40000:
553fb0c3269SLuo Wei res_cfg = 0;
554fb0c3269SLuo Wei break;
555fb0c3269SLuo Wei case 1000000:
556fb0c3269SLuo Wei res_cfg = 1;
557fb0c3269SLuo Wei break;
558fb0c3269SLuo Wei default:
559fb0c3269SLuo Wei return -EINVAL;
560fb0c3269SLuo Wei }
561fb0c3269SLuo Wei
562fb0c3269SLuo Wei serdes_set_bits(serdes, GPIO_A_REG(pin_selector),
563fb0c3269SLuo Wei RES_CFG, FIELD_PREP(RES_CFG, res_cfg));
564fb0c3269SLuo Wei serdes_set_bits(serdes, GPIO_C_REG(pin_selector),
565fb0c3269SLuo Wei PULL_UPDN_SEL,
566fb0c3269SLuo Wei FIELD_PREP(PULL_UPDN_SEL, 1));
567fb0c3269SLuo Wei break;
568fb0c3269SLuo Wei case PIN_CONFIG_BIAS_PULL_DOWN:
569fb0c3269SLuo Wei switch (argument) {
570fb0c3269SLuo Wei case 40000:
571fb0c3269SLuo Wei res_cfg = 0;
572fb0c3269SLuo Wei break;
573fb0c3269SLuo Wei case 1000000:
574fb0c3269SLuo Wei res_cfg = 1;
575fb0c3269SLuo Wei break;
576fb0c3269SLuo Wei default:
577fb0c3269SLuo Wei return -EINVAL;
578fb0c3269SLuo Wei }
579fb0c3269SLuo Wei
580fb0c3269SLuo Wei serdes_set_bits(serdes, GPIO_A_REG(pin_selector),
581fb0c3269SLuo Wei RES_CFG, FIELD_PREP(RES_CFG, res_cfg));
582fb0c3269SLuo Wei serdes_set_bits(serdes, GPIO_C_REG(pin_selector),
583fb0c3269SLuo Wei PULL_UPDN_SEL,
584fb0c3269SLuo Wei FIELD_PREP(PULL_UPDN_SEL, 2));
585fb0c3269SLuo Wei break;
586fb0c3269SLuo Wei case PIN_CONFIG_OUTPUT:
587fb0c3269SLuo Wei serdes_set_bits(serdes, GPIO_A_REG(pin_selector),
588fb0c3269SLuo Wei GPIO_OUT_DIS | GPIO_OUT,
589fb0c3269SLuo Wei FIELD_PREP(GPIO_OUT_DIS, 0) |
590fb0c3269SLuo Wei FIELD_PREP(GPIO_OUT, argument));
591fb0c3269SLuo Wei break;
592fb0c3269SLuo Wei default:
593fb0c3269SLuo Wei return -EOPNOTSUPP;
594fb0c3269SLuo Wei }
595fb0c3269SLuo Wei
596fb0c3269SLuo Wei return 0;
597fb0c3269SLuo Wei }
598fb0c3269SLuo Wei
599fb0c3269SLuo Wei static struct serdes_chip_pinctrl_ops max96755_pinctrl_ops = {
600fb0c3269SLuo Wei .pinconf_set = max96755_pinctrl_config_set,
601fb0c3269SLuo Wei .pinmux_set = max96755_pinctrl_set_pin_mux,
602fb0c3269SLuo Wei .pinmux_group_set = max96755_pinctrl_set_grp_mux,
603fb0c3269SLuo Wei };
604fb0c3269SLuo Wei
max96755_gpio_direction_input(struct serdes * serdes,int gpio)605fb0c3269SLuo Wei static int max96755_gpio_direction_input(struct serdes *serdes, int gpio)
606fb0c3269SLuo Wei {
607fb0c3269SLuo Wei return 0;
608fb0c3269SLuo Wei }
609fb0c3269SLuo Wei
max96755_gpio_direction_output(struct serdes * serdes,int gpio,int value)610fb0c3269SLuo Wei static int max96755_gpio_direction_output(struct serdes *serdes,
611fb0c3269SLuo Wei int gpio, int value)
612fb0c3269SLuo Wei {
613fb0c3269SLuo Wei return 0;
614fb0c3269SLuo Wei }
615fb0c3269SLuo Wei
max96755_gpio_get_level(struct serdes * serdes,int gpio)616fb0c3269SLuo Wei static int max96755_gpio_get_level(struct serdes *serdes, int gpio)
617fb0c3269SLuo Wei {
618fb0c3269SLuo Wei return 0;
619fb0c3269SLuo Wei }
620fb0c3269SLuo Wei
max96755_gpio_set_level(struct serdes * serdes,int gpio,int value)621fb0c3269SLuo Wei static int max96755_gpio_set_level(struct serdes *serdes, int gpio, int value)
622fb0c3269SLuo Wei {
623fb0c3269SLuo Wei return 0;
624fb0c3269SLuo Wei }
625fb0c3269SLuo Wei
max96755_gpio_set_config(struct serdes * serdes,int gpio,unsigned long config)626fb0c3269SLuo Wei static int max96755_gpio_set_config(struct serdes *serdes,
627fb0c3269SLuo Wei int gpio, unsigned long config)
628fb0c3269SLuo Wei {
629fb0c3269SLuo Wei return 0;
630fb0c3269SLuo Wei }
631fb0c3269SLuo Wei
max96755_gpio_to_irq(struct serdes * serdes,int gpio)632fb0c3269SLuo Wei static int max96755_gpio_to_irq(struct serdes *serdes, int gpio)
633fb0c3269SLuo Wei {
634fb0c3269SLuo Wei return 0;
635fb0c3269SLuo Wei }
636fb0c3269SLuo Wei
637fb0c3269SLuo Wei static struct serdes_chip_gpio_ops max96755_gpio_ops = {
638fb0c3269SLuo Wei .direction_input = max96755_gpio_direction_input,
639fb0c3269SLuo Wei .direction_output = max96755_gpio_direction_output,
640fb0c3269SLuo Wei .get_level = max96755_gpio_get_level,
641fb0c3269SLuo Wei .set_level = max96755_gpio_set_level,
642fb0c3269SLuo Wei .set_config = max96755_gpio_set_config,
643fb0c3269SLuo Wei .to_irq = max96755_gpio_to_irq,
644fb0c3269SLuo Wei };
645fb0c3269SLuo Wei
max96755_select(struct serdes * serdes,int chan)646fb0c3269SLuo Wei static int max96755_select(struct serdes *serdes, int chan)
647fb0c3269SLuo Wei {
648fb0c3269SLuo Wei u32 link_cfg;
649fb0c3269SLuo Wei int ret = 0;
650fb0c3269SLuo Wei
651fb0c3269SLuo Wei serdes_set_bits(serdes, 0x0001, DIS_REM_CC,
652fb0c3269SLuo Wei FIELD_PREP(DIS_REM_CC, 0));
653fb0c3269SLuo Wei
654fb0c3269SLuo Wei serdes_reg_read(serdes, 0x0010, &link_cfg);
655fb0c3269SLuo Wei if ((link_cfg & LINK_CFG) == SPLITTER_MODE)
656fb0c3269SLuo Wei SERDES_DBG_CHIP("%s: serdes %s is split mode cfg=0x%x\n",
657fb0c3269SLuo Wei __func__,
658fb0c3269SLuo Wei serdes->chip_data->name, link_cfg);
659fb0c3269SLuo Wei
660fb0c3269SLuo Wei if (chan == 0 && (link_cfg & LINK_CFG) != DUAL_LINK) {
661fb0c3269SLuo Wei ret = serdes_set_bits(serdes, 0x0004,
662fb0c3269SLuo Wei LINK_EN_B | LINK_EN_A,
663fb0c3269SLuo Wei FIELD_PREP(LINK_EN_A, 1) |
664fb0c3269SLuo Wei FIELD_PREP(LINK_EN_B, 1));
665fb0c3269SLuo Wei ret = serdes_set_bits(serdes, 0x0010,
666fb0c3269SLuo Wei RESET_ONESHOT | AUTO_LINK | LINK_CFG,
667fb0c3269SLuo Wei FIELD_PREP(RESET_ONESHOT, 1) |
668fb0c3269SLuo Wei FIELD_PREP(AUTO_LINK, 0) |
669fb0c3269SLuo Wei FIELD_PREP(LINK_CFG, DUAL_LINK));
670fb0c3269SLuo Wei SERDES_DBG_CHIP("%s: change to use dual link\n", __func__);
671fb0c3269SLuo Wei } else if (chan == 1 && (link_cfg & LINK_CFG) != LINKA) {
672fb0c3269SLuo Wei ret = serdes_set_bits(serdes, 0x0004,
673fb0c3269SLuo Wei LINK_EN_B | LINK_EN_A,
674fb0c3269SLuo Wei FIELD_PREP(LINK_EN_A, 1) |
675fb0c3269SLuo Wei FIELD_PREP(LINK_EN_B, 0));
676fb0c3269SLuo Wei ret = serdes_set_bits(serdes, 0x0010,
677fb0c3269SLuo Wei RESET_ONESHOT | AUTO_LINK | LINK_CFG,
678fb0c3269SLuo Wei FIELD_PREP(RESET_ONESHOT, 1) |
679fb0c3269SLuo Wei FIELD_PREP(AUTO_LINK, 0) |
680fb0c3269SLuo Wei FIELD_PREP(LINK_CFG, LINKA));
681fb0c3269SLuo Wei SERDES_DBG_CHIP("%s: change to use linkA\n", __func__);
682fb0c3269SLuo Wei } else if (chan == 2 && (link_cfg & LINK_CFG) != LINKB) {
683fb0c3269SLuo Wei ret = serdes_set_bits(serdes, 0x0004,
684fb0c3269SLuo Wei LINK_EN_B | LINK_EN_A,
685fb0c3269SLuo Wei FIELD_PREP(LINK_EN_A, 0) |
686fb0c3269SLuo Wei FIELD_PREP(LINK_EN_B, 1));
687fb0c3269SLuo Wei ret = serdes_set_bits(serdes, 0x0010,
688fb0c3269SLuo Wei RESET_ONESHOT | AUTO_LINK | LINK_CFG,
689fb0c3269SLuo Wei FIELD_PREP(RESET_ONESHOT, 1) |
690fb0c3269SLuo Wei FIELD_PREP(AUTO_LINK, 0) |
691fb0c3269SLuo Wei FIELD_PREP(LINK_CFG, LINKB));
692fb0c3269SLuo Wei SERDES_DBG_CHIP("%s: change to use linkB\n", __func__);
693fb0c3269SLuo Wei } else if (chan == 3 && (link_cfg & LINK_CFG) != SPLITTER_MODE) {
694fb0c3269SLuo Wei ret = serdes_set_bits(serdes, 0x0004,
695fb0c3269SLuo Wei LINK_EN_B | LINK_EN_A,
696fb0c3269SLuo Wei FIELD_PREP(LINK_EN_A, 1) |
697fb0c3269SLuo Wei FIELD_PREP(LINK_EN_B, 1));
698fb0c3269SLuo Wei ret = serdes_set_bits(serdes, 0x0010,
699fb0c3269SLuo Wei RESET_ONESHOT | AUTO_LINK | LINK_CFG,
700fb0c3269SLuo Wei FIELD_PREP(RESET_ONESHOT, 1) |
701fb0c3269SLuo Wei FIELD_PREP(AUTO_LINK, 0) |
702fb0c3269SLuo Wei FIELD_PREP(LINK_CFG, SPLITTER_MODE));
703fb0c3269SLuo Wei SERDES_DBG_CHIP("%s: change to use split mode\n", __func__);
704fb0c3269SLuo Wei }
705fb0c3269SLuo Wei
706fb0c3269SLuo Wei return ret;
707fb0c3269SLuo Wei }
708fb0c3269SLuo Wei
max96755_deselect(struct serdes * serdes,int chan)709fb0c3269SLuo Wei static int max96755_deselect(struct serdes *serdes, int chan)
710fb0c3269SLuo Wei {
711fb0c3269SLuo Wei //serdes_set_bits(serdes, 0x0001, DIS_REM_CC,
712fb0c3269SLuo Wei // FIELD_PREP(DIS_REM_CC, 1));
713fb0c3269SLuo Wei
714fb0c3269SLuo Wei return 0;
715fb0c3269SLuo Wei }
716fb0c3269SLuo Wei
717fb0c3269SLuo Wei static struct serdes_chip_split_ops max96755_split_ops = {
718fb0c3269SLuo Wei .select = max96755_select,
719fb0c3269SLuo Wei .deselect = max96755_deselect,
720fb0c3269SLuo Wei };
721fb0c3269SLuo Wei
722a00ee452SLuo Wei struct serdes_chip_data serdes_max96755_data = {
723a00ee452SLuo Wei .name = "max96755",
724a00ee452SLuo Wei .serdes_type = TYPE_SER,
725a00ee452SLuo Wei .serdes_id = MAXIM_ID_MAX96755,
726fb0c3269SLuo Wei .connector_type = DRM_MODE_CONNECTOR_DSI,
727fb0c3269SLuo Wei .pinctrl_info = &max96755_pinctrl_info,
728a00ee452SLuo Wei .bridge_ops = &max96755_bridge_ops,
729fb0c3269SLuo Wei .pinctrl_ops = &max96755_pinctrl_ops,
730fb0c3269SLuo Wei .gpio_ops = &max96755_gpio_ops,
731fb0c3269SLuo Wei .split_ops = &max96755_split_ops,
732a00ee452SLuo Wei };
733a00ee452SLuo Wei EXPORT_SYMBOL_GPL(serdes_max96755_data);
734fb0c3269SLuo Wei
735fb0c3269SLuo Wei MODULE_LICENSE("GPL");
736