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