xref: /openbmc/linux/drivers/phy/ti/phy-j721e-wiz.c (revision 8dd3cdea)
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * Wrapper driver for SERDES used in J721E
4  *
5  * Copyright (C) 2019 Texas Instruments Incorporated - http://www.ti.com/
6  * Author: Kishon Vijay Abraham I <kishon@ti.com>
7  */
8 
9 #include <dt-bindings/phy/phy.h>
10 #include <dt-bindings/phy/phy-ti.h>
11 #include <linux/slab.h>
12 #include <linux/clk.h>
13 #include <linux/clk-provider.h>
14 #include <linux/gpio.h>
15 #include <linux/gpio/consumer.h>
16 #include <linux/io.h>
17 #include <linux/module.h>
18 #include <linux/mux/consumer.h>
19 #include <linux/of_address.h>
20 #include <linux/of_platform.h>
21 #include <linux/platform_device.h>
22 #include <linux/pm_runtime.h>
23 #include <linux/regmap.h>
24 #include <linux/reset-controller.h>
25 
26 #define WIZ_SERDES_CTRL		0x404
27 #define WIZ_SERDES_TOP_CTRL	0x408
28 #define WIZ_SERDES_RST		0x40c
29 #define WIZ_SERDES_TYPEC	0x410
30 #define WIZ_LANECTL(n)		(0x480 + (0x40 * (n)))
31 #define WIZ_LANEDIV(n)		(0x484 + (0x40 * (n)))
32 
33 #define WIZ_MAX_INPUT_CLOCKS	4
34 /* To include mux clocks, divider clocks and gate clocks */
35 #define WIZ_MAX_OUTPUT_CLOCKS	32
36 
37 #define WIZ_MAX_LANES		4
38 #define WIZ_MUX_NUM_CLOCKS	3
39 #define WIZ_DIV_NUM_CLOCKS_16G	2
40 #define WIZ_DIV_NUM_CLOCKS_10G	1
41 
42 #define WIZ_SERDES_TYPEC_LN10_SWAP	BIT(30)
43 
44 enum wiz_lane_standard_mode {
45 	LANE_MODE_GEN1,
46 	LANE_MODE_GEN2,
47 	LANE_MODE_GEN3,
48 	LANE_MODE_GEN4,
49 };
50 
51 enum wiz_refclk_mux_sel {
52 	PLL0_REFCLK,
53 	PLL1_REFCLK,
54 	REFCLK_DIG,
55 };
56 
57 enum wiz_refclk_div_sel {
58 	CMN_REFCLK_DIG_DIV,
59 	CMN_REFCLK1_DIG_DIV,
60 };
61 
62 enum wiz_clock_input {
63 	WIZ_CORE_REFCLK,
64 	WIZ_EXT_REFCLK,
65 	WIZ_CORE_REFCLK1,
66 	WIZ_EXT_REFCLK1,
67 };
68 
69 static const struct reg_field por_en = REG_FIELD(WIZ_SERDES_CTRL, 31, 31);
70 static const struct reg_field phy_reset_n = REG_FIELD(WIZ_SERDES_RST, 31, 31);
71 static const struct reg_field phy_en_refclk = REG_FIELD(WIZ_SERDES_RST, 30, 30);
72 static const struct reg_field pll1_refclk_mux_sel =
73 					REG_FIELD(WIZ_SERDES_RST, 29, 29);
74 static const struct reg_field pll0_refclk_mux_sel =
75 					REG_FIELD(WIZ_SERDES_RST, 28, 28);
76 static const struct reg_field refclk_dig_sel_16g =
77 					REG_FIELD(WIZ_SERDES_RST, 24, 25);
78 static const struct reg_field refclk_dig_sel_10g =
79 					REG_FIELD(WIZ_SERDES_RST, 24, 24);
80 static const struct reg_field pma_cmn_refclk_int_mode =
81 					REG_FIELD(WIZ_SERDES_TOP_CTRL, 28, 29);
82 static const struct reg_field pma_cmn_refclk_mode =
83 					REG_FIELD(WIZ_SERDES_TOP_CTRL, 30, 31);
84 static const struct reg_field pma_cmn_refclk_dig_div =
85 					REG_FIELD(WIZ_SERDES_TOP_CTRL, 26, 27);
86 static const struct reg_field pma_cmn_refclk1_dig_div =
87 					REG_FIELD(WIZ_SERDES_TOP_CTRL, 24, 25);
88 static const char * const output_clk_names[] = {
89 	[TI_WIZ_PLL0_REFCLK] = "pll0-refclk",
90 	[TI_WIZ_PLL1_REFCLK] = "pll1-refclk",
91 	[TI_WIZ_REFCLK_DIG] = "refclk-dig",
92 	[TI_WIZ_PHY_EN_REFCLK] = "phy-en-refclk",
93 };
94 
95 static const struct reg_field p_enable[WIZ_MAX_LANES] = {
96 	REG_FIELD(WIZ_LANECTL(0), 30, 31),
97 	REG_FIELD(WIZ_LANECTL(1), 30, 31),
98 	REG_FIELD(WIZ_LANECTL(2), 30, 31),
99 	REG_FIELD(WIZ_LANECTL(3), 30, 31),
100 };
101 
102 enum p_enable { P_ENABLE = 2, P_ENABLE_FORCE = 1, P_ENABLE_DISABLE = 0 };
103 
104 static const struct reg_field p_align[WIZ_MAX_LANES] = {
105 	REG_FIELD(WIZ_LANECTL(0), 29, 29),
106 	REG_FIELD(WIZ_LANECTL(1), 29, 29),
107 	REG_FIELD(WIZ_LANECTL(2), 29, 29),
108 	REG_FIELD(WIZ_LANECTL(3), 29, 29),
109 };
110 
111 static const struct reg_field p_raw_auto_start[WIZ_MAX_LANES] = {
112 	REG_FIELD(WIZ_LANECTL(0), 28, 28),
113 	REG_FIELD(WIZ_LANECTL(1), 28, 28),
114 	REG_FIELD(WIZ_LANECTL(2), 28, 28),
115 	REG_FIELD(WIZ_LANECTL(3), 28, 28),
116 };
117 
118 static const struct reg_field p_standard_mode[WIZ_MAX_LANES] = {
119 	REG_FIELD(WIZ_LANECTL(0), 24, 25),
120 	REG_FIELD(WIZ_LANECTL(1), 24, 25),
121 	REG_FIELD(WIZ_LANECTL(2), 24, 25),
122 	REG_FIELD(WIZ_LANECTL(3), 24, 25),
123 };
124 
125 static const struct reg_field p0_fullrt_div[WIZ_MAX_LANES] = {
126 	REG_FIELD(WIZ_LANECTL(0), 22, 23),
127 	REG_FIELD(WIZ_LANECTL(1), 22, 23),
128 	REG_FIELD(WIZ_LANECTL(2), 22, 23),
129 	REG_FIELD(WIZ_LANECTL(3), 22, 23),
130 };
131 
132 static const struct reg_field p_mac_div_sel0[WIZ_MAX_LANES] = {
133 	REG_FIELD(WIZ_LANEDIV(0), 16, 22),
134 	REG_FIELD(WIZ_LANEDIV(1), 16, 22),
135 	REG_FIELD(WIZ_LANEDIV(2), 16, 22),
136 	REG_FIELD(WIZ_LANEDIV(3), 16, 22),
137 };
138 
139 static const struct reg_field p_mac_div_sel1[WIZ_MAX_LANES] = {
140 	REG_FIELD(WIZ_LANEDIV(0), 0, 8),
141 	REG_FIELD(WIZ_LANEDIV(1), 0, 8),
142 	REG_FIELD(WIZ_LANEDIV(2), 0, 8),
143 	REG_FIELD(WIZ_LANEDIV(3), 0, 8),
144 };
145 
146 static const struct reg_field typec_ln10_swap =
147 					REG_FIELD(WIZ_SERDES_TYPEC, 30, 30);
148 
149 struct wiz_clk_mux {
150 	struct clk_hw		hw;
151 	struct regmap_field	*field;
152 	const u32		*table;
153 	struct clk_init_data	clk_data;
154 };
155 
156 #define to_wiz_clk_mux(_hw) container_of(_hw, struct wiz_clk_mux, hw)
157 
158 struct wiz_clk_divider {
159 	struct clk_hw		hw;
160 	struct regmap_field	*field;
161 	const struct clk_div_table	*table;
162 	struct clk_init_data	clk_data;
163 };
164 
165 #define to_wiz_clk_div(_hw) container_of(_hw, struct wiz_clk_divider, hw)
166 
167 struct wiz_clk_mux_sel {
168 	u32			table[WIZ_MAX_INPUT_CLOCKS];
169 	const char		*node_name;
170 	u32			num_parents;
171 	u32			parents[WIZ_MAX_INPUT_CLOCKS];
172 };
173 
174 struct wiz_clk_div_sel {
175 	const struct clk_div_table *table;
176 	const char		*node_name;
177 };
178 
179 struct wiz_phy_en_refclk {
180 	struct clk_hw		hw;
181 	struct regmap_field	*phy_en_refclk;
182 	struct clk_init_data	clk_data;
183 };
184 
185 #define to_wiz_phy_en_refclk(_hw) container_of(_hw, struct wiz_phy_en_refclk, hw)
186 
187 static const struct wiz_clk_mux_sel clk_mux_sel_16g[] = {
188 	{
189 		/*
190 		 * Mux value to be configured for each of the input clocks
191 		 * in the order populated in device tree
192 		 */
193 		.table = { 1, 0 },
194 		.node_name = "pll0-refclk",
195 	},
196 	{
197 		.table = { 1, 0 },
198 		.node_name = "pll1-refclk",
199 	},
200 	{
201 		.table = { 1, 3, 0, 2 },
202 		.node_name = "refclk-dig",
203 	},
204 };
205 
206 static const struct wiz_clk_mux_sel clk_mux_sel_10g[] = {
207 	{
208 		/*
209 		 * Mux value to be configured for each of the input clocks
210 		 * in the order populated in device tree
211 		 */
212 		.num_parents = 2,
213 		.parents = { WIZ_CORE_REFCLK, WIZ_EXT_REFCLK },
214 		.table = { 1, 0 },
215 		.node_name = "pll0-refclk",
216 	},
217 	{
218 		.num_parents = 2,
219 		.parents = { WIZ_CORE_REFCLK, WIZ_EXT_REFCLK },
220 		.table = { 1, 0 },
221 		.node_name = "pll1-refclk",
222 	},
223 	{
224 		.num_parents = 2,
225 		.parents = { WIZ_CORE_REFCLK, WIZ_EXT_REFCLK },
226 		.table = { 1, 0 },
227 		.node_name = "refclk-dig",
228 	},
229 };
230 
231 static const struct clk_div_table clk_div_table[] = {
232 	{ .val = 0, .div = 1, },
233 	{ .val = 1, .div = 2, },
234 	{ .val = 2, .div = 4, },
235 	{ .val = 3, .div = 8, },
236 	{ /* sentinel */ },
237 };
238 
239 static const struct wiz_clk_div_sel clk_div_sel[] = {
240 	{
241 		.table = clk_div_table,
242 		.node_name = "cmn-refclk-dig-div",
243 	},
244 	{
245 		.table = clk_div_table,
246 		.node_name = "cmn-refclk1-dig-div",
247 	},
248 };
249 
250 enum wiz_type {
251 	J721E_WIZ_16G,
252 	J721E_WIZ_10G,
253 	AM64_WIZ_10G,
254 };
255 
256 #define WIZ_TYPEC_DIR_DEBOUNCE_MIN	100	/* ms */
257 #define WIZ_TYPEC_DIR_DEBOUNCE_MAX	1000
258 
259 struct wiz {
260 	struct regmap		*regmap;
261 	enum wiz_type		type;
262 	const struct wiz_clk_mux_sel *clk_mux_sel;
263 	const struct wiz_clk_div_sel *clk_div_sel;
264 	unsigned int		clk_div_sel_num;
265 	struct regmap_field	*por_en;
266 	struct regmap_field	*phy_reset_n;
267 	struct regmap_field	*phy_en_refclk;
268 	struct regmap_field	*p_enable[WIZ_MAX_LANES];
269 	struct regmap_field	*p_align[WIZ_MAX_LANES];
270 	struct regmap_field	*p_raw_auto_start[WIZ_MAX_LANES];
271 	struct regmap_field	*p_standard_mode[WIZ_MAX_LANES];
272 	struct regmap_field	*p_mac_div_sel0[WIZ_MAX_LANES];
273 	struct regmap_field	*p_mac_div_sel1[WIZ_MAX_LANES];
274 	struct regmap_field	*p0_fullrt_div[WIZ_MAX_LANES];
275 	struct regmap_field	*pma_cmn_refclk_int_mode;
276 	struct regmap_field	*pma_cmn_refclk_mode;
277 	struct regmap_field	*pma_cmn_refclk_dig_div;
278 	struct regmap_field	*pma_cmn_refclk1_dig_div;
279 	struct regmap_field	*mux_sel_field[WIZ_MUX_NUM_CLOCKS];
280 	struct regmap_field	*div_sel_field[WIZ_DIV_NUM_CLOCKS_16G];
281 	struct regmap_field	*typec_ln10_swap;
282 
283 	struct device		*dev;
284 	u32			num_lanes;
285 	struct platform_device	*serdes_pdev;
286 	struct reset_controller_dev wiz_phy_reset_dev;
287 	struct gpio_desc	*gpio_typec_dir;
288 	int			typec_dir_delay;
289 	u32 lane_phy_type[WIZ_MAX_LANES];
290 	struct clk		*input_clks[WIZ_MAX_INPUT_CLOCKS];
291 	struct clk		*output_clks[WIZ_MAX_OUTPUT_CLOCKS];
292 	struct clk_onecell_data	clk_data;
293 };
294 
295 static int wiz_reset(struct wiz *wiz)
296 {
297 	int ret;
298 
299 	ret = regmap_field_write(wiz->por_en, 0x1);
300 	if (ret)
301 		return ret;
302 
303 	mdelay(1);
304 
305 	ret = regmap_field_write(wiz->por_en, 0x0);
306 	if (ret)
307 		return ret;
308 
309 	return 0;
310 }
311 
312 static int wiz_p_mac_div_sel(struct wiz *wiz)
313 {
314 	u32 num_lanes = wiz->num_lanes;
315 	int ret;
316 	int i;
317 
318 	for (i = 0; i < num_lanes; i++) {
319 		if (wiz->lane_phy_type[i] == PHY_TYPE_QSGMII) {
320 			ret = regmap_field_write(wiz->p_mac_div_sel0[i], 1);
321 			if (ret)
322 				return ret;
323 
324 			ret = regmap_field_write(wiz->p_mac_div_sel1[i], 2);
325 			if (ret)
326 				return ret;
327 		}
328 	}
329 
330 	return 0;
331 }
332 
333 static int wiz_mode_select(struct wiz *wiz)
334 {
335 	u32 num_lanes = wiz->num_lanes;
336 	enum wiz_lane_standard_mode mode;
337 	int ret;
338 	int i;
339 
340 	for (i = 0; i < num_lanes; i++) {
341 		if (wiz->lane_phy_type[i] == PHY_TYPE_DP)
342 			mode = LANE_MODE_GEN1;
343 		else if (wiz->lane_phy_type[i] == PHY_TYPE_QSGMII)
344 			mode = LANE_MODE_GEN2;
345 		else
346 			continue;
347 
348 		ret = regmap_field_write(wiz->p_standard_mode[i], mode);
349 		if (ret)
350 			return ret;
351 	}
352 
353 	return 0;
354 }
355 
356 static int wiz_init_raw_interface(struct wiz *wiz, bool enable)
357 {
358 	u32 num_lanes = wiz->num_lanes;
359 	int i;
360 	int ret;
361 
362 	for (i = 0; i < num_lanes; i++) {
363 		ret = regmap_field_write(wiz->p_align[i], enable);
364 		if (ret)
365 			return ret;
366 
367 		ret = regmap_field_write(wiz->p_raw_auto_start[i], enable);
368 		if (ret)
369 			return ret;
370 	}
371 
372 	return 0;
373 }
374 
375 static int wiz_init(struct wiz *wiz)
376 {
377 	struct device *dev = wiz->dev;
378 	int ret;
379 
380 	ret = wiz_reset(wiz);
381 	if (ret) {
382 		dev_err(dev, "WIZ reset failed\n");
383 		return ret;
384 	}
385 
386 	ret = wiz_mode_select(wiz);
387 	if (ret) {
388 		dev_err(dev, "WIZ mode select failed\n");
389 		return ret;
390 	}
391 
392 	ret = wiz_p_mac_div_sel(wiz);
393 	if (ret) {
394 		dev_err(dev, "Configuring P0 MAC DIV SEL failed\n");
395 		return ret;
396 	}
397 
398 	ret = wiz_init_raw_interface(wiz, true);
399 	if (ret) {
400 		dev_err(dev, "WIZ interface initialization failed\n");
401 		return ret;
402 	}
403 
404 	return 0;
405 }
406 
407 static int wiz_regfield_init(struct wiz *wiz)
408 {
409 	struct regmap *regmap = wiz->regmap;
410 	int num_lanes = wiz->num_lanes;
411 	struct device *dev = wiz->dev;
412 	int i;
413 
414 	wiz->por_en = devm_regmap_field_alloc(dev, regmap, por_en);
415 	if (IS_ERR(wiz->por_en)) {
416 		dev_err(dev, "POR_EN reg field init failed\n");
417 		return PTR_ERR(wiz->por_en);
418 	}
419 
420 	wiz->phy_reset_n = devm_regmap_field_alloc(dev, regmap,
421 						   phy_reset_n);
422 	if (IS_ERR(wiz->phy_reset_n)) {
423 		dev_err(dev, "PHY_RESET_N reg field init failed\n");
424 		return PTR_ERR(wiz->phy_reset_n);
425 	}
426 
427 	wiz->pma_cmn_refclk_int_mode =
428 		devm_regmap_field_alloc(dev, regmap, pma_cmn_refclk_int_mode);
429 	if (IS_ERR(wiz->pma_cmn_refclk_int_mode)) {
430 		dev_err(dev, "PMA_CMN_REFCLK_INT_MODE reg field init failed\n");
431 		return PTR_ERR(wiz->pma_cmn_refclk_int_mode);
432 	}
433 
434 	wiz->pma_cmn_refclk_mode =
435 		devm_regmap_field_alloc(dev, regmap, pma_cmn_refclk_mode);
436 	if (IS_ERR(wiz->pma_cmn_refclk_mode)) {
437 		dev_err(dev, "PMA_CMN_REFCLK_MODE reg field init failed\n");
438 		return PTR_ERR(wiz->pma_cmn_refclk_mode);
439 	}
440 
441 	wiz->div_sel_field[CMN_REFCLK_DIG_DIV] =
442 		devm_regmap_field_alloc(dev, regmap, pma_cmn_refclk_dig_div);
443 	if (IS_ERR(wiz->div_sel_field[CMN_REFCLK_DIG_DIV])) {
444 		dev_err(dev, "PMA_CMN_REFCLK_DIG_DIV reg field init failed\n");
445 		return PTR_ERR(wiz->div_sel_field[CMN_REFCLK_DIG_DIV]);
446 	}
447 
448 	if (wiz->type == J721E_WIZ_16G) {
449 		wiz->div_sel_field[CMN_REFCLK1_DIG_DIV] =
450 			devm_regmap_field_alloc(dev, regmap,
451 						pma_cmn_refclk1_dig_div);
452 		if (IS_ERR(wiz->div_sel_field[CMN_REFCLK1_DIG_DIV])) {
453 			dev_err(dev, "PMA_CMN_REFCLK1_DIG_DIV reg field init failed\n");
454 			return PTR_ERR(wiz->div_sel_field[CMN_REFCLK1_DIG_DIV]);
455 		}
456 	}
457 
458 	wiz->mux_sel_field[PLL0_REFCLK] =
459 		devm_regmap_field_alloc(dev, regmap, pll0_refclk_mux_sel);
460 	if (IS_ERR(wiz->mux_sel_field[PLL0_REFCLK])) {
461 		dev_err(dev, "PLL0_REFCLK_SEL reg field init failed\n");
462 		return PTR_ERR(wiz->mux_sel_field[PLL0_REFCLK]);
463 	}
464 
465 	wiz->mux_sel_field[PLL1_REFCLK] =
466 		devm_regmap_field_alloc(dev, regmap, pll1_refclk_mux_sel);
467 	if (IS_ERR(wiz->mux_sel_field[PLL1_REFCLK])) {
468 		dev_err(dev, "PLL1_REFCLK_SEL reg field init failed\n");
469 		return PTR_ERR(wiz->mux_sel_field[PLL1_REFCLK]);
470 	}
471 
472 	if (wiz->type == J721E_WIZ_10G || wiz->type == AM64_WIZ_10G)
473 		wiz->mux_sel_field[REFCLK_DIG] =
474 			devm_regmap_field_alloc(dev, regmap,
475 						refclk_dig_sel_10g);
476 	else
477 		wiz->mux_sel_field[REFCLK_DIG] =
478 			devm_regmap_field_alloc(dev, regmap,
479 						refclk_dig_sel_16g);
480 
481 	if (IS_ERR(wiz->mux_sel_field[REFCLK_DIG])) {
482 		dev_err(dev, "REFCLK_DIG_SEL reg field init failed\n");
483 		return PTR_ERR(wiz->mux_sel_field[REFCLK_DIG]);
484 	}
485 
486 	for (i = 0; i < num_lanes; i++) {
487 		wiz->p_enable[i] = devm_regmap_field_alloc(dev, regmap,
488 							   p_enable[i]);
489 		if (IS_ERR(wiz->p_enable[i])) {
490 			dev_err(dev, "P%d_ENABLE reg field init failed\n", i);
491 			return PTR_ERR(wiz->p_enable[i]);
492 		}
493 
494 		wiz->p_align[i] = devm_regmap_field_alloc(dev, regmap,
495 							  p_align[i]);
496 		if (IS_ERR(wiz->p_align[i])) {
497 			dev_err(dev, "P%d_ALIGN reg field init failed\n", i);
498 			return PTR_ERR(wiz->p_align[i]);
499 		}
500 
501 		wiz->p_raw_auto_start[i] =
502 		  devm_regmap_field_alloc(dev, regmap, p_raw_auto_start[i]);
503 		if (IS_ERR(wiz->p_raw_auto_start[i])) {
504 			dev_err(dev, "P%d_RAW_AUTO_START reg field init fail\n",
505 				i);
506 			return PTR_ERR(wiz->p_raw_auto_start[i]);
507 		}
508 
509 		wiz->p_standard_mode[i] =
510 		  devm_regmap_field_alloc(dev, regmap, p_standard_mode[i]);
511 		if (IS_ERR(wiz->p_standard_mode[i])) {
512 			dev_err(dev, "P%d_STANDARD_MODE reg field init fail\n",
513 				i);
514 			return PTR_ERR(wiz->p_standard_mode[i]);
515 		}
516 
517 		wiz->p0_fullrt_div[i] = devm_regmap_field_alloc(dev, regmap, p0_fullrt_div[i]);
518 		if (IS_ERR(wiz->p0_fullrt_div[i])) {
519 			dev_err(dev, "P%d_FULLRT_DIV reg field init failed\n", i);
520 			return PTR_ERR(wiz->p0_fullrt_div[i]);
521 		}
522 
523 		wiz->p_mac_div_sel0[i] =
524 		  devm_regmap_field_alloc(dev, regmap, p_mac_div_sel0[i]);
525 		if (IS_ERR(wiz->p_mac_div_sel0[i])) {
526 			dev_err(dev, "P%d_MAC_DIV_SEL0 reg field init fail\n",
527 				i);
528 			return PTR_ERR(wiz->p_mac_div_sel0[i]);
529 		}
530 
531 		wiz->p_mac_div_sel1[i] =
532 		  devm_regmap_field_alloc(dev, regmap, p_mac_div_sel1[i]);
533 		if (IS_ERR(wiz->p_mac_div_sel1[i])) {
534 			dev_err(dev, "P%d_MAC_DIV_SEL1 reg field init fail\n",
535 				i);
536 			return PTR_ERR(wiz->p_mac_div_sel1[i]);
537 		}
538 	}
539 
540 	wiz->typec_ln10_swap = devm_regmap_field_alloc(dev, regmap,
541 						       typec_ln10_swap);
542 	if (IS_ERR(wiz->typec_ln10_swap)) {
543 		dev_err(dev, "LN10_SWAP reg field init failed\n");
544 		return PTR_ERR(wiz->typec_ln10_swap);
545 	}
546 
547 	wiz->phy_en_refclk = devm_regmap_field_alloc(dev, regmap, phy_en_refclk);
548 	if (IS_ERR(wiz->phy_en_refclk)) {
549 		dev_err(dev, "PHY_EN_REFCLK reg field init failed\n");
550 		return PTR_ERR(wiz->phy_en_refclk);
551 	}
552 
553 	return 0;
554 }
555 
556 static int wiz_phy_en_refclk_enable(struct clk_hw *hw)
557 {
558 	struct wiz_phy_en_refclk *wiz_phy_en_refclk = to_wiz_phy_en_refclk(hw);
559 	struct regmap_field *phy_en_refclk = wiz_phy_en_refclk->phy_en_refclk;
560 
561 	regmap_field_write(phy_en_refclk, 1);
562 
563 	return 0;
564 }
565 
566 static void wiz_phy_en_refclk_disable(struct clk_hw *hw)
567 {
568 	struct wiz_phy_en_refclk *wiz_phy_en_refclk = to_wiz_phy_en_refclk(hw);
569 	struct regmap_field *phy_en_refclk = wiz_phy_en_refclk->phy_en_refclk;
570 
571 	regmap_field_write(phy_en_refclk, 0);
572 }
573 
574 static int wiz_phy_en_refclk_is_enabled(struct clk_hw *hw)
575 {
576 	struct wiz_phy_en_refclk *wiz_phy_en_refclk = to_wiz_phy_en_refclk(hw);
577 	struct regmap_field *phy_en_refclk = wiz_phy_en_refclk->phy_en_refclk;
578 	int val;
579 
580 	regmap_field_read(phy_en_refclk, &val);
581 
582 	return !!val;
583 }
584 
585 static const struct clk_ops wiz_phy_en_refclk_ops = {
586 	.enable = wiz_phy_en_refclk_enable,
587 	.disable = wiz_phy_en_refclk_disable,
588 	.is_enabled = wiz_phy_en_refclk_is_enabled,
589 };
590 
591 static int wiz_phy_en_refclk_register(struct wiz *wiz)
592 {
593 	struct wiz_phy_en_refclk *wiz_phy_en_refclk;
594 	struct device *dev = wiz->dev;
595 	struct clk_init_data *init;
596 	struct clk *clk;
597 
598 	wiz_phy_en_refclk = devm_kzalloc(dev, sizeof(*wiz_phy_en_refclk), GFP_KERNEL);
599 	if (!wiz_phy_en_refclk)
600 		return -ENOMEM;
601 
602 	init = &wiz_phy_en_refclk->clk_data;
603 
604 	init->ops = &wiz_phy_en_refclk_ops;
605 	init->flags = 0;
606 	init->name = output_clk_names[TI_WIZ_PHY_EN_REFCLK];
607 
608 	wiz_phy_en_refclk->phy_en_refclk = wiz->phy_en_refclk;
609 	wiz_phy_en_refclk->hw.init = init;
610 
611 	clk = devm_clk_register(dev, &wiz_phy_en_refclk->hw);
612 	if (IS_ERR(clk))
613 		return PTR_ERR(clk);
614 
615 	wiz->output_clks[TI_WIZ_PHY_EN_REFCLK] = clk;
616 
617 	return 0;
618 }
619 
620 static u8 wiz_clk_mux_get_parent(struct clk_hw *hw)
621 {
622 	struct wiz_clk_mux *mux = to_wiz_clk_mux(hw);
623 	struct regmap_field *field = mux->field;
624 	unsigned int val;
625 
626 	regmap_field_read(field, &val);
627 	return clk_mux_val_to_index(hw, (u32 *)mux->table, 0, val);
628 }
629 
630 static int wiz_clk_mux_set_parent(struct clk_hw *hw, u8 index)
631 {
632 	struct wiz_clk_mux *mux = to_wiz_clk_mux(hw);
633 	struct regmap_field *field = mux->field;
634 	int val;
635 
636 	val = mux->table[index];
637 	return regmap_field_write(field, val);
638 }
639 
640 static const struct clk_ops wiz_clk_mux_ops = {
641 	.set_parent = wiz_clk_mux_set_parent,
642 	.get_parent = wiz_clk_mux_get_parent,
643 };
644 
645 static int wiz_mux_clk_register(struct wiz *wiz, struct regmap_field *field,
646 				const struct wiz_clk_mux_sel *mux_sel, int clk_index)
647 {
648 	struct device *dev = wiz->dev;
649 	struct clk_init_data *init;
650 	const char **parent_names;
651 	unsigned int num_parents;
652 	struct wiz_clk_mux *mux;
653 	char clk_name[100];
654 	struct clk *clk;
655 	int ret = 0, i;
656 
657 	mux = devm_kzalloc(dev, sizeof(*mux), GFP_KERNEL);
658 	if (!mux)
659 		return -ENOMEM;
660 
661 	num_parents = mux_sel->num_parents;
662 
663 	parent_names = kzalloc((sizeof(char *) * num_parents), GFP_KERNEL);
664 	if (!parent_names)
665 		return -ENOMEM;
666 
667 	for (i = 0; i < num_parents; i++) {
668 		clk = wiz->input_clks[mux_sel->parents[i]];
669 		if (IS_ERR_OR_NULL(clk)) {
670 			dev_err(dev, "Failed to get parent clk for %s\n",
671 				output_clk_names[clk_index]);
672 			ret = -EINVAL;
673 			goto err;
674 		}
675 		parent_names[i] = __clk_get_name(clk);
676 	}
677 
678 	snprintf(clk_name, sizeof(clk_name), "%s_%s", dev_name(dev), output_clk_names[clk_index]);
679 
680 	init = &mux->clk_data;
681 
682 	init->ops = &wiz_clk_mux_ops;
683 	init->flags = CLK_SET_RATE_NO_REPARENT;
684 	init->parent_names = parent_names;
685 	init->num_parents = num_parents;
686 	init->name = clk_name;
687 
688 	mux->field = field;
689 	mux->table = mux_sel->table;
690 	mux->hw.init = init;
691 
692 	clk = devm_clk_register(dev, &mux->hw);
693 	if (IS_ERR(clk)) {
694 		ret = PTR_ERR(clk);
695 		goto err;
696 	}
697 
698 	wiz->output_clks[clk_index] = clk;
699 
700 err:
701 	kfree(parent_names);
702 
703 	return ret;
704 }
705 
706 static int wiz_mux_of_clk_register(struct wiz *wiz, struct device_node *node,
707 				   struct regmap_field *field, const u32 *table)
708 {
709 	struct device *dev = wiz->dev;
710 	struct clk_init_data *init;
711 	const char **parent_names;
712 	unsigned int num_parents;
713 	struct wiz_clk_mux *mux;
714 	char clk_name[100];
715 	struct clk *clk;
716 	int ret;
717 
718 	mux = devm_kzalloc(dev, sizeof(*mux), GFP_KERNEL);
719 	if (!mux)
720 		return -ENOMEM;
721 
722 	num_parents = of_clk_get_parent_count(node);
723 	if (num_parents < 2) {
724 		dev_err(dev, "SERDES clock must have parents\n");
725 		return -EINVAL;
726 	}
727 
728 	parent_names = devm_kzalloc(dev, (sizeof(char *) * num_parents),
729 				    GFP_KERNEL);
730 	if (!parent_names)
731 		return -ENOMEM;
732 
733 	of_clk_parent_fill(node, parent_names, num_parents);
734 
735 	snprintf(clk_name, sizeof(clk_name), "%s_%s", dev_name(dev),
736 		 node->name);
737 
738 	init = &mux->clk_data;
739 
740 	init->ops = &wiz_clk_mux_ops;
741 	init->flags = CLK_SET_RATE_NO_REPARENT;
742 	init->parent_names = parent_names;
743 	init->num_parents = num_parents;
744 	init->name = clk_name;
745 
746 	mux->field = field;
747 	mux->table = table;
748 	mux->hw.init = init;
749 
750 	clk = devm_clk_register(dev, &mux->hw);
751 	if (IS_ERR(clk))
752 		return PTR_ERR(clk);
753 
754 	ret = of_clk_add_provider(node, of_clk_src_simple_get, clk);
755 	if (ret)
756 		dev_err(dev, "Failed to add clock provider: %s\n", clk_name);
757 
758 	return ret;
759 }
760 
761 static unsigned long wiz_clk_div_recalc_rate(struct clk_hw *hw,
762 					     unsigned long parent_rate)
763 {
764 	struct wiz_clk_divider *div = to_wiz_clk_div(hw);
765 	struct regmap_field *field = div->field;
766 	int val;
767 
768 	regmap_field_read(field, &val);
769 
770 	return divider_recalc_rate(hw, parent_rate, val, div->table, 0x0, 2);
771 }
772 
773 static long wiz_clk_div_round_rate(struct clk_hw *hw, unsigned long rate,
774 				   unsigned long *prate)
775 {
776 	struct wiz_clk_divider *div = to_wiz_clk_div(hw);
777 
778 	return divider_round_rate(hw, rate, prate, div->table, 2, 0x0);
779 }
780 
781 static int wiz_clk_div_set_rate(struct clk_hw *hw, unsigned long rate,
782 				unsigned long parent_rate)
783 {
784 	struct wiz_clk_divider *div = to_wiz_clk_div(hw);
785 	struct regmap_field *field = div->field;
786 	int val;
787 
788 	val = divider_get_val(rate, parent_rate, div->table, 2, 0x0);
789 	if (val < 0)
790 		return val;
791 
792 	return regmap_field_write(field, val);
793 }
794 
795 static const struct clk_ops wiz_clk_div_ops = {
796 	.recalc_rate = wiz_clk_div_recalc_rate,
797 	.round_rate = wiz_clk_div_round_rate,
798 	.set_rate = wiz_clk_div_set_rate,
799 };
800 
801 static int wiz_div_clk_register(struct wiz *wiz, struct device_node *node,
802 				struct regmap_field *field,
803 				const struct clk_div_table *table)
804 {
805 	struct device *dev = wiz->dev;
806 	struct wiz_clk_divider *div;
807 	struct clk_init_data *init;
808 	const char **parent_names;
809 	char clk_name[100];
810 	struct clk *clk;
811 	int ret;
812 
813 	div = devm_kzalloc(dev, sizeof(*div), GFP_KERNEL);
814 	if (!div)
815 		return -ENOMEM;
816 
817 	snprintf(clk_name, sizeof(clk_name), "%s_%s", dev_name(dev),
818 		 node->name);
819 
820 	parent_names = devm_kzalloc(dev, sizeof(char *), GFP_KERNEL);
821 	if (!parent_names)
822 		return -ENOMEM;
823 
824 	of_clk_parent_fill(node, parent_names, 1);
825 
826 	init = &div->clk_data;
827 
828 	init->ops = &wiz_clk_div_ops;
829 	init->flags = 0;
830 	init->parent_names = parent_names;
831 	init->num_parents = 1;
832 	init->name = clk_name;
833 
834 	div->field = field;
835 	div->table = table;
836 	div->hw.init = init;
837 
838 	clk = devm_clk_register(dev, &div->hw);
839 	if (IS_ERR(clk))
840 		return PTR_ERR(clk);
841 
842 	ret = of_clk_add_provider(node, of_clk_src_simple_get, clk);
843 	if (ret)
844 		dev_err(dev, "Failed to add clock provider: %s\n", clk_name);
845 
846 	return ret;
847 }
848 
849 static void wiz_clock_cleanup(struct wiz *wiz, struct device_node *node)
850 {
851 	const struct wiz_clk_mux_sel *clk_mux_sel = wiz->clk_mux_sel;
852 	struct device *dev = wiz->dev;
853 	struct device_node *clk_node;
854 	int i;
855 
856 	if (wiz->type == AM64_WIZ_10G) {
857 		of_clk_del_provider(dev->of_node);
858 		return;
859 	}
860 
861 	for (i = 0; i < WIZ_MUX_NUM_CLOCKS; i++) {
862 		clk_node = of_get_child_by_name(node, clk_mux_sel[i].node_name);
863 		of_clk_del_provider(clk_node);
864 		of_node_put(clk_node);
865 	}
866 
867 	for (i = 0; i < wiz->clk_div_sel_num; i++) {
868 		clk_node = of_get_child_by_name(node, clk_div_sel[i].node_name);
869 		of_clk_del_provider(clk_node);
870 		of_node_put(clk_node);
871 	}
872 
873 	of_clk_del_provider(wiz->dev->of_node);
874 }
875 
876 static int wiz_clock_register(struct wiz *wiz)
877 {
878 	const struct wiz_clk_mux_sel *clk_mux_sel = wiz->clk_mux_sel;
879 	struct device *dev = wiz->dev;
880 	struct device_node *node = dev->of_node;
881 	int clk_index;
882 	int ret;
883 	int i;
884 
885 	if (wiz->type != AM64_WIZ_10G)
886 		return 0;
887 
888 	clk_index = TI_WIZ_PLL0_REFCLK;
889 	for (i = 0; i < WIZ_MUX_NUM_CLOCKS; i++, clk_index++) {
890 		ret = wiz_mux_clk_register(wiz, wiz->mux_sel_field[i], &clk_mux_sel[i], clk_index);
891 		if (ret) {
892 			dev_err(dev, "Failed to register clk: %s\n", output_clk_names[clk_index]);
893 			return ret;
894 		}
895 	}
896 
897 	ret = wiz_phy_en_refclk_register(wiz);
898 	if (ret) {
899 		dev_err(dev, "Failed to add phy-en-refclk\n");
900 		return ret;
901 	}
902 
903 	wiz->clk_data.clks = wiz->output_clks;
904 	wiz->clk_data.clk_num = WIZ_MAX_OUTPUT_CLOCKS;
905 	ret = of_clk_add_provider(node, of_clk_src_onecell_get, &wiz->clk_data);
906 	if (ret)
907 		dev_err(dev, "Failed to add clock provider: %s\n", node->name);
908 
909 	return ret;
910 }
911 
912 static int wiz_clock_init(struct wiz *wiz, struct device_node *node)
913 {
914 	const struct wiz_clk_mux_sel *clk_mux_sel = wiz->clk_mux_sel;
915 	struct device *dev = wiz->dev;
916 	struct device_node *clk_node;
917 	const char *node_name;
918 	unsigned long rate;
919 	struct clk *clk;
920 	int ret;
921 	int i;
922 
923 	clk = devm_clk_get(dev, "core_ref_clk");
924 	if (IS_ERR(clk)) {
925 		dev_err(dev, "core_ref_clk clock not found\n");
926 		ret = PTR_ERR(clk);
927 		return ret;
928 	}
929 	wiz->input_clks[WIZ_CORE_REFCLK] = clk;
930 
931 	rate = clk_get_rate(clk);
932 	if (rate >= 100000000)
933 		regmap_field_write(wiz->pma_cmn_refclk_int_mode, 0x1);
934 	else
935 		regmap_field_write(wiz->pma_cmn_refclk_int_mode, 0x3);
936 
937 	clk = devm_clk_get(dev, "ext_ref_clk");
938 	if (IS_ERR(clk)) {
939 		dev_err(dev, "ext_ref_clk clock not found\n");
940 		ret = PTR_ERR(clk);
941 		return ret;
942 	}
943 	wiz->input_clks[WIZ_EXT_REFCLK] = clk;
944 
945 	rate = clk_get_rate(clk);
946 	if (rate >= 100000000)
947 		regmap_field_write(wiz->pma_cmn_refclk_mode, 0x0);
948 	else
949 		regmap_field_write(wiz->pma_cmn_refclk_mode, 0x2);
950 
951 	if (wiz->type == AM64_WIZ_10G) {
952 		ret = wiz_clock_register(wiz);
953 		if (ret)
954 			dev_err(dev, "Failed to register wiz clocks\n");
955 		return ret;
956 	}
957 
958 	for (i = 0; i < WIZ_MUX_NUM_CLOCKS; i++) {
959 		node_name = clk_mux_sel[i].node_name;
960 		clk_node = of_get_child_by_name(node, node_name);
961 		if (!clk_node) {
962 			dev_err(dev, "Unable to get %s node\n", node_name);
963 			ret = -EINVAL;
964 			goto err;
965 		}
966 
967 		ret = wiz_mux_of_clk_register(wiz, clk_node, wiz->mux_sel_field[i],
968 					      clk_mux_sel[i].table);
969 		if (ret) {
970 			dev_err(dev, "Failed to register %s clock\n",
971 				node_name);
972 			of_node_put(clk_node);
973 			goto err;
974 		}
975 
976 		of_node_put(clk_node);
977 	}
978 
979 	for (i = 0; i < wiz->clk_div_sel_num; i++) {
980 		node_name = clk_div_sel[i].node_name;
981 		clk_node = of_get_child_by_name(node, node_name);
982 		if (!clk_node) {
983 			dev_err(dev, "Unable to get %s node\n", node_name);
984 			ret = -EINVAL;
985 			goto err;
986 		}
987 
988 		ret = wiz_div_clk_register(wiz, clk_node, wiz->div_sel_field[i],
989 					   clk_div_sel[i].table);
990 		if (ret) {
991 			dev_err(dev, "Failed to register %s clock\n",
992 				node_name);
993 			of_node_put(clk_node);
994 			goto err;
995 		}
996 
997 		of_node_put(clk_node);
998 	}
999 
1000 	return 0;
1001 err:
1002 	wiz_clock_cleanup(wiz, node);
1003 
1004 	return ret;
1005 }
1006 
1007 static int wiz_phy_reset_assert(struct reset_controller_dev *rcdev,
1008 				unsigned long id)
1009 {
1010 	struct device *dev = rcdev->dev;
1011 	struct wiz *wiz = dev_get_drvdata(dev);
1012 	int ret = 0;
1013 
1014 	if (id == 0) {
1015 		ret = regmap_field_write(wiz->phy_reset_n, false);
1016 		return ret;
1017 	}
1018 
1019 	ret = regmap_field_write(wiz->p_enable[id - 1], P_ENABLE_DISABLE);
1020 	return ret;
1021 }
1022 
1023 static int wiz_phy_fullrt_div(struct wiz *wiz, int lane)
1024 {
1025 	if (wiz->type != AM64_WIZ_10G)
1026 		return 0;
1027 
1028 	if (wiz->lane_phy_type[lane] == PHY_TYPE_PCIE)
1029 		return regmap_field_write(wiz->p0_fullrt_div[lane], 0x1);
1030 
1031 	return 0;
1032 }
1033 
1034 static int wiz_phy_reset_deassert(struct reset_controller_dev *rcdev,
1035 				  unsigned long id)
1036 {
1037 	struct device *dev = rcdev->dev;
1038 	struct wiz *wiz = dev_get_drvdata(dev);
1039 	int ret;
1040 
1041 	/* if typec-dir gpio was specified, set LN10 SWAP bit based on that */
1042 	if (id == 0 && wiz->gpio_typec_dir) {
1043 		if (wiz->typec_dir_delay)
1044 			msleep_interruptible(wiz->typec_dir_delay);
1045 
1046 		if (gpiod_get_value_cansleep(wiz->gpio_typec_dir))
1047 			regmap_field_write(wiz->typec_ln10_swap, 1);
1048 		else
1049 			regmap_field_write(wiz->typec_ln10_swap, 0);
1050 	}
1051 
1052 	if (id == 0) {
1053 		ret = regmap_field_write(wiz->phy_reset_n, true);
1054 		return ret;
1055 	}
1056 
1057 	ret = wiz_phy_fullrt_div(wiz, id - 1);
1058 	if (ret)
1059 		return ret;
1060 
1061 	if (wiz->lane_phy_type[id - 1] == PHY_TYPE_DP)
1062 		ret = regmap_field_write(wiz->p_enable[id - 1], P_ENABLE);
1063 	else
1064 		ret = regmap_field_write(wiz->p_enable[id - 1], P_ENABLE_FORCE);
1065 
1066 	return ret;
1067 }
1068 
1069 static const struct reset_control_ops wiz_phy_reset_ops = {
1070 	.assert = wiz_phy_reset_assert,
1071 	.deassert = wiz_phy_reset_deassert,
1072 };
1073 
1074 static const struct regmap_config wiz_regmap_config = {
1075 	.reg_bits = 32,
1076 	.val_bits = 32,
1077 	.reg_stride = 4,
1078 	.fast_io = true,
1079 };
1080 
1081 static const struct of_device_id wiz_id_table[] = {
1082 	{
1083 		.compatible = "ti,j721e-wiz-16g", .data = (void *)J721E_WIZ_16G
1084 	},
1085 	{
1086 		.compatible = "ti,j721e-wiz-10g", .data = (void *)J721E_WIZ_10G
1087 	},
1088 	{
1089 		.compatible = "ti,am64-wiz-10g", .data = (void *)AM64_WIZ_10G
1090 	},
1091 	{}
1092 };
1093 MODULE_DEVICE_TABLE(of, wiz_id_table);
1094 
1095 static int wiz_get_lane_phy_types(struct device *dev, struct wiz *wiz)
1096 {
1097 	struct device_node *serdes, *subnode;
1098 
1099 	serdes = of_get_child_by_name(dev->of_node, "serdes");
1100 	if (!serdes) {
1101 		dev_err(dev, "%s: Getting \"serdes\"-node failed\n", __func__);
1102 		return -EINVAL;
1103 	}
1104 
1105 	for_each_child_of_node(serdes, subnode) {
1106 		u32 reg, num_lanes = 1, phy_type = PHY_NONE;
1107 		int ret, i;
1108 
1109 		if (!(of_node_name_eq(subnode, "phy") ||
1110 		      of_node_name_eq(subnode, "link")))
1111 			continue;
1112 
1113 		ret = of_property_read_u32(subnode, "reg", &reg);
1114 		if (ret) {
1115 			of_node_put(subnode);
1116 			dev_err(dev,
1117 				"%s: Reading \"reg\" from \"%s\" failed: %d\n",
1118 				__func__, subnode->name, ret);
1119 			return ret;
1120 		}
1121 		of_property_read_u32(subnode, "cdns,num-lanes", &num_lanes);
1122 		of_property_read_u32(subnode, "cdns,phy-type", &phy_type);
1123 
1124 		dev_dbg(dev, "%s: Lanes %u-%u have phy-type %u\n", __func__,
1125 			reg, reg + num_lanes - 1, phy_type);
1126 
1127 		for (i = reg; i < reg + num_lanes; i++)
1128 			wiz->lane_phy_type[i] = phy_type;
1129 	}
1130 
1131 	return 0;
1132 }
1133 
1134 static int wiz_probe(struct platform_device *pdev)
1135 {
1136 	struct reset_controller_dev *phy_reset_dev;
1137 	struct device *dev = &pdev->dev;
1138 	struct device_node *node = dev->of_node;
1139 	struct platform_device *serdes_pdev;
1140 	bool already_configured = false;
1141 	struct device_node *child_node;
1142 	struct regmap *regmap;
1143 	struct resource res;
1144 	void __iomem *base;
1145 	struct wiz *wiz;
1146 	int ret, val, i;
1147 	u32 num_lanes;
1148 
1149 	wiz = devm_kzalloc(dev, sizeof(*wiz), GFP_KERNEL);
1150 	if (!wiz)
1151 		return -ENOMEM;
1152 
1153 	wiz->type = (enum wiz_type)of_device_get_match_data(dev);
1154 
1155 	child_node = of_get_child_by_name(node, "serdes");
1156 	if (!child_node) {
1157 		dev_err(dev, "Failed to get SERDES child DT node\n");
1158 		return -ENODEV;
1159 	}
1160 
1161 	ret = of_address_to_resource(child_node, 0, &res);
1162 	if (ret) {
1163 		dev_err(dev, "Failed to get memory resource\n");
1164 		goto err_addr_to_resource;
1165 	}
1166 
1167 	base = devm_ioremap(dev, res.start, resource_size(&res));
1168 	if (!base) {
1169 		ret = -ENOMEM;
1170 		goto err_addr_to_resource;
1171 	}
1172 
1173 	regmap = devm_regmap_init_mmio(dev, base, &wiz_regmap_config);
1174 	if (IS_ERR(regmap)) {
1175 		dev_err(dev, "Failed to initialize regmap\n");
1176 		ret = PTR_ERR(regmap);
1177 		goto err_addr_to_resource;
1178 	}
1179 
1180 	ret = of_property_read_u32(node, "num-lanes", &num_lanes);
1181 	if (ret) {
1182 		dev_err(dev, "Failed to read num-lanes property\n");
1183 		goto err_addr_to_resource;
1184 	}
1185 
1186 	if (num_lanes > WIZ_MAX_LANES) {
1187 		dev_err(dev, "Cannot support %d lanes\n", num_lanes);
1188 		ret = -ENODEV;
1189 		goto err_addr_to_resource;
1190 	}
1191 
1192 	wiz->gpio_typec_dir = devm_gpiod_get_optional(dev, "typec-dir",
1193 						      GPIOD_IN);
1194 	if (IS_ERR(wiz->gpio_typec_dir)) {
1195 		ret = PTR_ERR(wiz->gpio_typec_dir);
1196 		if (ret != -EPROBE_DEFER)
1197 			dev_err(dev, "Failed to request typec-dir gpio: %d\n",
1198 				ret);
1199 		goto err_addr_to_resource;
1200 	}
1201 
1202 	if (wiz->gpio_typec_dir) {
1203 		ret = of_property_read_u32(node, "typec-dir-debounce-ms",
1204 					   &wiz->typec_dir_delay);
1205 		if (ret && ret != -EINVAL) {
1206 			dev_err(dev, "Invalid typec-dir-debounce property\n");
1207 			goto err_addr_to_resource;
1208 		}
1209 
1210 		/* use min. debounce from Type-C spec if not provided in DT  */
1211 		if (ret == -EINVAL)
1212 			wiz->typec_dir_delay = WIZ_TYPEC_DIR_DEBOUNCE_MIN;
1213 
1214 		if (wiz->typec_dir_delay < WIZ_TYPEC_DIR_DEBOUNCE_MIN ||
1215 		    wiz->typec_dir_delay > WIZ_TYPEC_DIR_DEBOUNCE_MAX) {
1216 			ret = -EINVAL;
1217 			dev_err(dev, "Invalid typec-dir-debounce property\n");
1218 			goto err_addr_to_resource;
1219 		}
1220 	}
1221 
1222 	ret = wiz_get_lane_phy_types(dev, wiz);
1223 	if (ret)
1224 		return ret;
1225 
1226 	wiz->dev = dev;
1227 	wiz->regmap = regmap;
1228 	wiz->num_lanes = num_lanes;
1229 	if (wiz->type == J721E_WIZ_10G || wiz->type == AM64_WIZ_10G)
1230 		wiz->clk_mux_sel = clk_mux_sel_10g;
1231 	else
1232 		wiz->clk_mux_sel = clk_mux_sel_16g;
1233 
1234 	wiz->clk_div_sel = clk_div_sel;
1235 
1236 	if (wiz->type == J721E_WIZ_10G || wiz->type == AM64_WIZ_10G)
1237 		wiz->clk_div_sel_num = WIZ_DIV_NUM_CLOCKS_10G;
1238 	else
1239 		wiz->clk_div_sel_num = WIZ_DIV_NUM_CLOCKS_16G;
1240 
1241 	platform_set_drvdata(pdev, wiz);
1242 
1243 	ret = wiz_regfield_init(wiz);
1244 	if (ret) {
1245 		dev_err(dev, "Failed to initialize regfields\n");
1246 		goto err_addr_to_resource;
1247 	}
1248 
1249 	phy_reset_dev = &wiz->wiz_phy_reset_dev;
1250 	phy_reset_dev->dev = dev;
1251 	phy_reset_dev->ops = &wiz_phy_reset_ops,
1252 	phy_reset_dev->owner = THIS_MODULE,
1253 	phy_reset_dev->of_node = node;
1254 	/* Reset for each of the lane and one for the entire SERDES */
1255 	phy_reset_dev->nr_resets = num_lanes + 1;
1256 
1257 	ret = devm_reset_controller_register(dev, phy_reset_dev);
1258 	if (ret < 0) {
1259 		dev_warn(dev, "Failed to register reset controller\n");
1260 		goto err_addr_to_resource;
1261 	}
1262 
1263 	pm_runtime_enable(dev);
1264 	ret = pm_runtime_get_sync(dev);
1265 	if (ret < 0) {
1266 		dev_err(dev, "pm_runtime_get_sync failed\n");
1267 		goto err_get_sync;
1268 	}
1269 
1270 	ret = wiz_clock_init(wiz, node);
1271 	if (ret < 0) {
1272 		dev_warn(dev, "Failed to initialize clocks\n");
1273 		goto err_get_sync;
1274 	}
1275 
1276 	for (i = 0; i < wiz->num_lanes; i++) {
1277 		regmap_field_read(wiz->p_enable[i], &val);
1278 		if (val & (P_ENABLE | P_ENABLE_FORCE)) {
1279 			already_configured = true;
1280 			break;
1281 		}
1282 	}
1283 
1284 	if (!already_configured) {
1285 		ret = wiz_init(wiz);
1286 		if (ret) {
1287 			dev_err(dev, "WIZ initialization failed\n");
1288 			goto err_wiz_init;
1289 		}
1290 	}
1291 
1292 	serdes_pdev = of_platform_device_create(child_node, NULL, dev);
1293 	if (!serdes_pdev) {
1294 		dev_WARN(dev, "Unable to create SERDES platform device\n");
1295 		ret = -ENOMEM;
1296 		goto err_wiz_init;
1297 	}
1298 	wiz->serdes_pdev = serdes_pdev;
1299 
1300 	of_node_put(child_node);
1301 	return 0;
1302 
1303 err_wiz_init:
1304 	wiz_clock_cleanup(wiz, node);
1305 
1306 err_get_sync:
1307 	pm_runtime_put(dev);
1308 	pm_runtime_disable(dev);
1309 
1310 err_addr_to_resource:
1311 	of_node_put(child_node);
1312 
1313 	return ret;
1314 }
1315 
1316 static int wiz_remove(struct platform_device *pdev)
1317 {
1318 	struct device *dev = &pdev->dev;
1319 	struct device_node *node = dev->of_node;
1320 	struct platform_device *serdes_pdev;
1321 	struct wiz *wiz;
1322 
1323 	wiz = dev_get_drvdata(dev);
1324 	serdes_pdev = wiz->serdes_pdev;
1325 
1326 	of_platform_device_destroy(&serdes_pdev->dev, NULL);
1327 	wiz_clock_cleanup(wiz, node);
1328 	pm_runtime_put(dev);
1329 	pm_runtime_disable(dev);
1330 
1331 	return 0;
1332 }
1333 
1334 static struct platform_driver wiz_driver = {
1335 	.probe		= wiz_probe,
1336 	.remove		= wiz_remove,
1337 	.driver		= {
1338 		.name	= "wiz",
1339 		.of_match_table = wiz_id_table,
1340 	},
1341 };
1342 module_platform_driver(wiz_driver);
1343 
1344 MODULE_AUTHOR("Texas Instruments Inc.");
1345 MODULE_DESCRIPTION("TI J721E WIZ driver");
1346 MODULE_LICENSE("GPL v2");
1347