1 // SPDX-License-Identifier: GPL-2.0+
3 * Copyright (C) 2017-2018 Texas Instruments Incorporated - http://www.ti.com/
4 * Jean-Jacques Hiblot <jjhiblot@ti.com>
8 #include <clk-uclass.h>
10 #include <dm/device_compat.h>
13 #include <dm/device-internal.h>
15 #include <reset-uclass.h>
16 #include <dt-bindings/phy/phy.h>
18 #include <dt-bindings/phy/phy-ti.h>
20 #define WIZ_MAX_INPUT_CLOCKS 4
21 /* To include mux clocks, divider clocks and gate clocks */
22 #define WIZ_MAX_OUTPUT_CLOCKS 32
24 #define WIZ_MAX_LANES 4
25 #define WIZ_MUX_NUM_CLOCKS 3
26 #define WIZ_DIV_NUM_CLOCKS_16G 2
27 #define WIZ_DIV_NUM_CLOCKS_10G 1
29 #define WIZ_SERDES_CTRL 0x404
30 #define WIZ_SERDES_TOP_CTRL 0x408
31 #define WIZ_SERDES_RST 0x40c
32 #define WIZ_SERDES_TYPEC 0x410
33 #define WIZ_LANECTL(n) (0x480 + (0x40 * (n)))
34 #define WIZ_LANEDIV(n) (0x484 + (0x40 * (n)))
36 #define WIZ_MAX_LANES 4
37 #define WIZ_MUX_NUM_CLOCKS 3
38 #define WIZ_DIV_NUM_CLOCKS_16G 2
39 #define WIZ_DIV_NUM_CLOCKS_10G 1
41 #define WIZ_SERDES_TYPEC_LN10_SWAP BIT(30)
43 enum wiz_lane_standard_mode
{
50 enum wiz_refclk_mux_sel
{
56 enum wiz_refclk_div_sel
{
61 enum wiz_clock_input
{
68 static const struct reg_field por_en
= REG_FIELD(WIZ_SERDES_CTRL
, 31, 31);
69 static const struct reg_field phy_reset_n
= REG_FIELD(WIZ_SERDES_RST
, 31, 31);
70 static const struct reg_field pll1_refclk_mux_sel
=
71 REG_FIELD(WIZ_SERDES_RST
, 29, 29);
72 static const struct reg_field pll1_refclk_mux_sel_2
=
73 REG_FIELD(WIZ_SERDES_RST
, 22, 23);
74 static const struct reg_field pll0_refclk_mux_sel
=
75 REG_FIELD(WIZ_SERDES_RST
, 28, 28);
76 static const struct reg_field pll0_refclk_mux_sel_2
=
77 REG_FIELD(WIZ_SERDES_RST
, 28, 29);
78 static const struct reg_field refclk_dig_sel_16g
=
79 REG_FIELD(WIZ_SERDES_RST
, 24, 25);
80 static const struct reg_field refclk_dig_sel_10g
=
81 REG_FIELD(WIZ_SERDES_RST
, 24, 24);
82 static const struct reg_field pma_cmn_refclk_int_mode
=
83 REG_FIELD(WIZ_SERDES_TOP_CTRL
, 28, 29);
84 static const struct reg_field pma_cmn_refclk1_int_mode
=
85 REG_FIELD(WIZ_SERDES_TOP_CTRL
, 20, 21);
86 static const struct reg_field pma_cmn_refclk_mode
=
87 REG_FIELD(WIZ_SERDES_TOP_CTRL
, 30, 31);
88 static const struct reg_field pma_cmn_refclk_dig_div
=
89 REG_FIELD(WIZ_SERDES_TOP_CTRL
, 26, 27);
90 static const struct reg_field pma_cmn_refclk1_dig_div
=
91 REG_FIELD(WIZ_SERDES_TOP_CTRL
, 24, 25);
93 static const struct reg_field p_enable
[WIZ_MAX_LANES
] = {
94 REG_FIELD(WIZ_LANECTL(0), 30, 31),
95 REG_FIELD(WIZ_LANECTL(1), 30, 31),
96 REG_FIELD(WIZ_LANECTL(2), 30, 31),
97 REG_FIELD(WIZ_LANECTL(3), 30, 31),
100 enum p_enable
{ P_ENABLE
= 2, P_ENABLE_FORCE
= 1, P_ENABLE_DISABLE
= 0 };
102 static const struct reg_field p_align
[WIZ_MAX_LANES
] = {
103 REG_FIELD(WIZ_LANECTL(0), 29, 29),
104 REG_FIELD(WIZ_LANECTL(1), 29, 29),
105 REG_FIELD(WIZ_LANECTL(2), 29, 29),
106 REG_FIELD(WIZ_LANECTL(3), 29, 29),
109 static const struct reg_field p_raw_auto_start
[WIZ_MAX_LANES
] = {
110 REG_FIELD(WIZ_LANECTL(0), 28, 28),
111 REG_FIELD(WIZ_LANECTL(1), 28, 28),
112 REG_FIELD(WIZ_LANECTL(2), 28, 28),
113 REG_FIELD(WIZ_LANECTL(3), 28, 28),
116 static const struct reg_field p_standard_mode
[WIZ_MAX_LANES
] = {
117 REG_FIELD(WIZ_LANECTL(0), 24, 25),
118 REG_FIELD(WIZ_LANECTL(1), 24, 25),
119 REG_FIELD(WIZ_LANECTL(2), 24, 25),
120 REG_FIELD(WIZ_LANECTL(3), 24, 25),
123 static const struct reg_field p0_fullrt_div
[WIZ_MAX_LANES
] = {
124 REG_FIELD(WIZ_LANECTL(0), 22, 23),
125 REG_FIELD(WIZ_LANECTL(1), 22, 23),
126 REG_FIELD(WIZ_LANECTL(2), 22, 23),
127 REG_FIELD(WIZ_LANECTL(3), 22, 23),
130 static const struct reg_field p_mac_div_sel0
[WIZ_MAX_LANES
] = {
131 REG_FIELD(WIZ_LANEDIV(0), 16, 22),
132 REG_FIELD(WIZ_LANEDIV(1), 16, 22),
133 REG_FIELD(WIZ_LANEDIV(2), 16, 22),
134 REG_FIELD(WIZ_LANEDIV(3), 16, 22),
137 static const struct reg_field p_mac_div_sel1
[WIZ_MAX_LANES
] = {
138 REG_FIELD(WIZ_LANEDIV(0), 0, 8),
139 REG_FIELD(WIZ_LANEDIV(1), 0, 8),
140 REG_FIELD(WIZ_LANEDIV(2), 0, 8),
141 REG_FIELD(WIZ_LANEDIV(3), 0, 8),
144 struct wiz_clk_mux_sel
{
145 enum wiz_refclk_mux_sel mux_sel
;
146 u32 table
[WIZ_MAX_INPUT_CLOCKS
];
147 const char *node_name
;
149 u32 parents
[WIZ_MAX_INPUT_CLOCKS
];
152 struct wiz_clk_div_sel
{
153 enum wiz_refclk_div_sel div_sel
;
154 const char *node_name
;
157 static struct wiz_clk_mux_sel clk_mux_sel_16g
[] = {
160 * Mux value to be configured for each of the input clocks
161 * in the order populated in device tree
164 .parents
= { WIZ_CORE_REFCLK
, WIZ_EXT_REFCLK
},
165 .mux_sel
= PLL0_REFCLK
,
167 .node_name
= "pll0-refclk",
171 .parents
= { WIZ_CORE_REFCLK1
, WIZ_EXT_REFCLK1
},
172 .mux_sel
= PLL1_REFCLK
,
174 .node_name
= "pll1-refclk",
178 .parents
= { WIZ_CORE_REFCLK
, WIZ_CORE_REFCLK1
, WIZ_EXT_REFCLK
, WIZ_EXT_REFCLK1
},
179 .mux_sel
= REFCLK_DIG
,
180 .table
= { 1, 3, 0, 2 },
181 .node_name
= "refclk-dig",
185 static struct wiz_clk_mux_sel clk_mux_sel_10g
[] = {
188 * Mux value to be configured for each of the input clocks
189 * in the order populated in device tree
192 .parents
= { WIZ_CORE_REFCLK
, WIZ_EXT_REFCLK
},
193 .mux_sel
= PLL0_REFCLK
,
195 .node_name
= "pll0-refclk",
199 .parents
= { WIZ_CORE_REFCLK
, WIZ_EXT_REFCLK
},
200 .mux_sel
= PLL1_REFCLK
,
202 .node_name
= "pll1-refclk",
206 .parents
= { WIZ_CORE_REFCLK
, WIZ_EXT_REFCLK
},
207 .mux_sel
= REFCLK_DIG
,
209 .node_name
= "refclk-dig",
213 static const struct wiz_clk_mux_sel clk_mux_sel_10g_2_refclk
[] = {
216 .parents
= { WIZ_CORE_REFCLK
, WIZ_CORE_REFCLK1
, WIZ_EXT_REFCLK
},
217 .table
= { 2, 3, 0 },
218 .node_name
= "pll0-refclk",
222 .parents
= { WIZ_CORE_REFCLK
, WIZ_CORE_REFCLK1
, WIZ_EXT_REFCLK
},
223 .table
= { 2, 3, 0 },
224 .node_name
= "pll1-refclk",
228 .parents
= { WIZ_CORE_REFCLK
, WIZ_CORE_REFCLK1
, WIZ_EXT_REFCLK
},
229 .table
= { 2, 3, 0 },
230 .node_name
= "refclk-dig",
234 static struct wiz_clk_div_sel clk_div_sel
[] = {
236 .div_sel
= CMN_REFCLK
,
237 .node_name
= "cmn-refclk-dig-div",
240 .div_sel
= CMN_REFCLK1
,
241 .node_name
= "cmn-refclk1-dig-div",
254 const struct reg_field
*pll0_refclk_mux_sel
;
255 const struct reg_field
*pll1_refclk_mux_sel
;
256 const struct reg_field
*refclk_dig_sel
;
257 const struct reg_field
*pma_cmn_refclk1_dig_div
;
258 const struct reg_field
*pma_cmn_refclk1_int_mode
;
259 const struct wiz_clk_mux_sel
*clk_mux_sel
;
260 unsigned int clk_div_sel_num
;
263 static const struct wiz_data j721e_16g_data
= {
264 .type
= J721E_WIZ_16G
,
265 .pll0_refclk_mux_sel
= &pll0_refclk_mux_sel
,
266 .pll1_refclk_mux_sel
= &pll1_refclk_mux_sel
,
267 .refclk_dig_sel
= &refclk_dig_sel_16g
,
268 .pma_cmn_refclk1_dig_div
= &pma_cmn_refclk1_dig_div
,
269 .clk_mux_sel
= clk_mux_sel_16g
,
270 .clk_div_sel_num
= WIZ_DIV_NUM_CLOCKS_16G
,
273 static const struct wiz_data j721e_10g_data
= {
274 .type
= J721E_WIZ_10G
,
275 .pll0_refclk_mux_sel
= &pll0_refclk_mux_sel
,
276 .pll1_refclk_mux_sel
= &pll1_refclk_mux_sel
,
277 .refclk_dig_sel
= &refclk_dig_sel_10g
,
278 .clk_mux_sel
= clk_mux_sel_10g
,
279 .clk_div_sel_num
= WIZ_DIV_NUM_CLOCKS_10G
,
282 static struct wiz_data am64_10g_data
= {
283 .type
= AM64_WIZ_10G
,
284 .pll0_refclk_mux_sel
= &pll0_refclk_mux_sel
,
285 .pll1_refclk_mux_sel
= &pll1_refclk_mux_sel
,
286 .refclk_dig_sel
= &refclk_dig_sel_10g
,
287 .clk_mux_sel
= clk_mux_sel_10g
,
288 .clk_div_sel_num
= WIZ_DIV_NUM_CLOCKS_10G
,
291 static struct wiz_data j784s4_wiz_10g
= {
292 .type
= J784S4_WIZ_10G
,
293 .pll0_refclk_mux_sel
= &pll0_refclk_mux_sel_2
,
294 .pll1_refclk_mux_sel
= &pll1_refclk_mux_sel_2
,
295 .refclk_dig_sel
= &refclk_dig_sel_16g
,
296 .pma_cmn_refclk1_int_mode
= &pma_cmn_refclk1_int_mode
,
297 .clk_mux_sel
= clk_mux_sel_10g_2_refclk
,
298 .clk_div_sel_num
= WIZ_DIV_NUM_CLOCKS_10G
,
301 #define WIZ_TYPEC_DIR_DEBOUNCE_MIN 100 /* ms */
302 #define WIZ_TYPEC_DIR_DEBOUNCE_MAX 1000
305 struct regmap
*regmap
;
307 struct wiz_clk_mux_sel
*clk_mux_sel
;
308 struct wiz_clk_div_sel
*clk_div_sel
;
309 unsigned int clk_div_sel_num
;
310 struct regmap_field
*por_en
;
311 struct regmap_field
*phy_reset_n
;
312 struct regmap_field
*phy_en_refclk
;
313 struct regmap_field
*p_enable
[WIZ_MAX_LANES
];
314 struct regmap_field
*p_align
[WIZ_MAX_LANES
];
315 struct regmap_field
*p_raw_auto_start
[WIZ_MAX_LANES
];
316 struct regmap_field
*p_standard_mode
[WIZ_MAX_LANES
];
317 struct regmap_field
*p_mac_div_sel0
[WIZ_MAX_LANES
];
318 struct regmap_field
*p_mac_div_sel1
[WIZ_MAX_LANES
];
319 struct regmap_field
*p0_fullrt_div
[WIZ_MAX_LANES
];
320 struct regmap_field
*pma_cmn_refclk_int_mode
;
321 struct regmap_field
*pma_cmn_refclk1_int_mode
;
322 struct regmap_field
*pma_cmn_refclk_mode
;
323 struct regmap_field
*pma_cmn_refclk_dig_div
;
324 struct regmap_field
*pma_cmn_refclk1_dig_div
;
325 struct regmap_field
*div_sel_field
[WIZ_DIV_NUM_CLOCKS_16G
];
326 struct regmap_field
*mux_sel_field
[WIZ_MUX_NUM_CLOCKS
];
330 struct gpio_desc
*gpio_typec_dir
;
331 u32 lane_phy_type
[WIZ_MAX_LANES
];
332 struct clk
*input_clks
[WIZ_MAX_INPUT_CLOCKS
];
334 const struct wiz_data
*data
;
338 struct clk parent_clk
;
343 struct clk parent_clks
[4];
355 static ulong
wiz_div_clk_get_rate(struct clk
*clk
)
357 struct udevice
*dev
= clk
->dev
;
358 struct wiz_div_clk
*priv
= dev_get_priv(dev
);
359 struct wiz_clk_div_sel
*data
= dev_get_plat(dev
);
360 struct wiz
*wiz
= priv
->wiz
;
361 ulong parent_rate
= clk_get_rate(&priv
->parent_clk
);
364 regmap_field_read(wiz
->div_sel_field
[data
->div_sel
], &val
);
366 return parent_rate
>> val
;
369 static ulong
wiz_div_clk_set_rate(struct clk
*clk
, ulong rate
)
371 struct udevice
*dev
= clk
->dev
;
372 struct wiz_div_clk
*priv
= dev_get_priv(dev
);
373 struct wiz_clk_div_sel
*data
= dev_get_plat(dev
);
374 struct wiz
*wiz
= priv
->wiz
;
375 ulong parent_rate
= clk_get_rate(&priv
->parent_clk
);
376 u32 div
= parent_rate
/ rate
;
379 regmap_field_write(wiz
->div_sel_field
[data
->div_sel
], div
);
381 return parent_rate
>> div
;
384 const struct clk_ops wiz_div_clk_ops
= {
385 .get_rate
= wiz_div_clk_get_rate
,
386 .set_rate
= wiz_div_clk_set_rate
,
389 int wiz_div_clk_probe(struct udevice
*dev
)
391 struct wiz_div_clk
*priv
= dev_get_priv(dev
);
392 struct clk parent_clk
;
395 rc
= clk_get_by_index(dev
, 0, &parent_clk
);
397 dev_err(dev
, "unable to get parent clock. ret %d\n", rc
);
400 priv
->parent_clk
= parent_clk
;
401 priv
->wiz
= dev_get_priv(dev
->parent
);
405 U_BOOT_DRIVER(wiz_div_clk
) = {
406 .name
= "wiz_div_clk",
408 .priv_auto
= sizeof(struct wiz_div_clk
),
409 .ops
= &wiz_div_clk_ops
,
410 .probe
= wiz_div_clk_probe
,
413 static int wiz_clk_mux_set_parent(struct clk
*clk
, struct clk
*parent
)
415 struct udevice
*dev
= clk
->dev
;
416 struct wiz_mux_clk
*priv
= dev_get_priv(dev
);
417 struct wiz_clk_mux_sel
*data
= dev_get_plat(dev
);
418 struct wiz
*wiz
= priv
->wiz
;
421 for (i
= 0; i
< ARRAY_SIZE(priv
->parent_clks
); i
++)
422 if (parent
->dev
== priv
->parent_clks
[i
].dev
)
425 if (i
== ARRAY_SIZE(priv
->parent_clks
))
428 regmap_field_write(wiz
->mux_sel_field
[data
->mux_sel
], data
->table
[i
]);
432 static int wiz_clk_xlate(struct clk
*clk
, struct ofnode_phandle_args
*args
)
434 struct udevice
*dev
= clk
->dev
;
435 struct wiz_mux_clk
*priv
= dev_get_priv(dev
);
436 struct wiz
*wiz
= priv
->wiz
;
443 static const struct clk_ops wiz_clk_mux_ops
= {
444 .set_parent
= wiz_clk_mux_set_parent
,
445 .of_xlate
= wiz_clk_xlate
,
448 int wiz_mux_clk_probe(struct udevice
*dev
)
450 struct wiz_mux_clk
*priv
= dev_get_priv(dev
);
454 for (i
= 0; i
< ARRAY_SIZE(priv
->parent_clks
); i
++) {
455 rc
= clk_get_by_index(dev
, i
, &priv
->parent_clks
[i
]);
457 priv
->parent_clks
[i
].dev
= NULL
;
459 priv
->wiz
= dev_get_priv(dev
->parent
);
463 U_BOOT_DRIVER(wiz_mux_clk
) = {
464 .name
= "wiz_mux_clk",
466 .priv_auto
= sizeof(struct wiz_mux_clk
),
467 .ops
= &wiz_clk_mux_ops
,
468 .probe
= wiz_mux_clk_probe
,
471 static int wiz_clk_set_parent(struct clk
*clk
, struct clk
*parent
)
473 struct udevice
*dev
= clk
->dev
;
474 struct wiz_clk
*priv
= dev_get_priv(dev
);
475 const struct wiz_clk_mux_sel
*mux_sel
;
476 struct wiz
*wiz
= priv
->wiz
;
482 /* set_parent is applicable only for MUX clocks */
483 if (id
> TI_WIZ_REFCLK_DIG
)
486 for (i
= 0; i
< WIZ_MAX_INPUT_CLOCKS
; i
++)
487 if (wiz
->input_clks
[i
]->dev
== parent
->dev
)
490 if (i
== WIZ_MAX_INPUT_CLOCKS
)
493 mux_sel
= &wiz
->clk_mux_sel
[id
];
494 num_parents
= mux_sel
->num_parents
;
495 for (j
= 0; j
< num_parents
; j
++)
496 if (mux_sel
->parents
[j
] == i
)
499 if (j
== num_parents
)
502 regmap_field_write(wiz
->mux_sel_field
[id
], mux_sel
->table
[j
]);
507 static int wiz_clk_of_xlate(struct clk
*clk
, struct ofnode_phandle_args
*args
)
509 struct udevice
*dev
= clk
->dev
;
510 struct wiz_clk
*priv
= dev_get_priv(dev
);
511 struct wiz
*wiz
= priv
->wiz
;
513 clk
->id
= args
->args
[0] << 10 | wiz
->id
;
518 static const struct clk_ops wiz_clk_ops
= {
519 .set_parent
= wiz_clk_set_parent
,
520 .of_xlate
= wiz_clk_of_xlate
,
523 int wiz_clk_probe(struct udevice
*dev
)
525 struct wiz_clk
*priv
= dev_get_priv(dev
);
527 priv
->wiz
= dev_get_priv(dev
->parent
);
532 U_BOOT_DRIVER(wiz_clk
) = {
535 .priv_auto
= sizeof(struct wiz_clk
),
537 .probe
= wiz_clk_probe
,
540 static int wiz_reset_request(struct reset_ctl
*reset_ctl
)
545 static int wiz_reset_free(struct reset_ctl
*reset_ctl
)
550 static int wiz_reset_assert(struct reset_ctl
*reset_ctl
)
552 struct wiz_reset
*priv
= dev_get_priv(reset_ctl
->dev
);
553 struct wiz
*wiz
= priv
->wiz
;
555 int id
= reset_ctl
->id
;
558 ret
= regmap_field_write(wiz
->phy_reset_n
, false);
562 ret
= regmap_field_write(wiz
->p_enable
[id
- 1], P_ENABLE_DISABLE
);
566 static int wiz_phy_fullrt_div(struct wiz
*wiz
, int lane
)
568 if (wiz
->type
!= AM64_WIZ_10G
)
571 if (wiz
->lane_phy_type
[lane
] == PHY_TYPE_PCIE
)
572 return regmap_field_write(wiz
->p0_fullrt_div
[lane
], 0x1);
577 static int wiz_reset_deassert(struct reset_ctl
*reset_ctl
)
579 struct wiz_reset
*priv
= dev_get_priv(reset_ctl
->dev
);
580 struct wiz
*wiz
= priv
->wiz
;
582 int id
= reset_ctl
->id
;
584 ret
= wiz_phy_fullrt_div(wiz
, id
- 1);
588 /* if typec-dir gpio was specified, set LN10 SWAP bit based on that */
589 if (id
== 0 && wiz
->gpio_typec_dir
) {
590 if (dm_gpio_get_value(wiz
->gpio_typec_dir
)) {
591 regmap_update_bits(wiz
->regmap
, WIZ_SERDES_TYPEC
,
592 WIZ_SERDES_TYPEC_LN10_SWAP
,
593 WIZ_SERDES_TYPEC_LN10_SWAP
);
595 regmap_update_bits(wiz
->regmap
, WIZ_SERDES_TYPEC
,
596 WIZ_SERDES_TYPEC_LN10_SWAP
, 0);
601 ret
= regmap_field_write(wiz
->phy_reset_n
, true);
605 if (wiz
->lane_phy_type
[id
- 1] == PHY_TYPE_DP
)
606 ret
= regmap_field_write(wiz
->p_enable
[id
- 1], P_ENABLE
);
608 ret
= regmap_field_write(wiz
->p_enable
[id
- 1], P_ENABLE_FORCE
);
613 static struct reset_ops wiz_reset_ops
= {
614 .request
= wiz_reset_request
,
615 .rfree
= wiz_reset_free
,
616 .rst_assert
= wiz_reset_assert
,
617 .rst_deassert
= wiz_reset_deassert
,
620 int wiz_reset_probe(struct udevice
*dev
)
622 struct wiz_reset
*priv
= dev_get_priv(dev
);
624 priv
->wiz
= dev_get_priv(dev
->parent
);
629 U_BOOT_DRIVER(wiz_reset
) = {
632 .probe
= wiz_reset_probe
,
633 .ops
= &wiz_reset_ops
,
634 .flags
= DM_FLAG_LEAVE_PD_ON
,
637 static int wiz_reset(struct wiz
*wiz
)
641 ret
= regmap_field_write(wiz
->por_en
, 0x1);
647 ret
= regmap_field_write(wiz
->por_en
, 0x0);
654 static int wiz_p_mac_div_sel(struct wiz
*wiz
)
656 u32 num_lanes
= wiz
->num_lanes
;
660 for (i
= 0; i
< num_lanes
; i
++) {
661 if (wiz
->lane_phy_type
[i
] == PHY_TYPE_QSGMII
) {
662 ret
= regmap_field_write(wiz
->p_mac_div_sel0
[i
], 1);
666 ret
= regmap_field_write(wiz
->p_mac_div_sel1
[i
], 2);
675 static int wiz_mode_select(struct wiz
*wiz
)
677 u32 num_lanes
= wiz
->num_lanes
;
681 for (i
= 0; i
< num_lanes
; i
++) {
682 if (wiz
->lane_phy_type
[i
] == PHY_TYPE_QSGMII
) {
683 ret
= regmap_field_write(wiz
->p_standard_mode
[i
],
693 static int wiz_init_raw_interface(struct wiz
*wiz
, bool enable
)
695 u32 num_lanes
= wiz
->num_lanes
;
699 for (i
= 0; i
< num_lanes
; i
++) {
700 ret
= regmap_field_write(wiz
->p_align
[i
], enable
);
704 ret
= regmap_field_write(wiz
->p_raw_auto_start
[i
], enable
);
712 static int wiz_init(struct wiz
*wiz
)
714 struct udevice
*dev
= wiz
->dev
;
717 ret
= wiz_reset(wiz
);
719 dev_err(dev
, "WIZ reset failed\n");
723 ret
= wiz_mode_select(wiz
);
725 dev_err(dev
, "WIZ mode select failed\n");
729 ret
= wiz_p_mac_div_sel(wiz
);
731 dev_err(dev
, "Configuring P0 MAC DIV SEL failed\n");
735 ret
= wiz_init_raw_interface(wiz
, true);
737 dev_err(dev
, "WIZ interface initialization failed\n");
744 static int wiz_regfield_init(struct wiz
*wiz
)
746 struct regmap
*regmap
= wiz
->regmap
;
747 int num_lanes
= wiz
->num_lanes
;
748 struct udevice
*dev
= wiz
->dev
;
749 const struct wiz_data
*data
= wiz
->data
;
752 wiz
->por_en
= devm_regmap_field_alloc(dev
, regmap
, por_en
);
753 if (IS_ERR(wiz
->por_en
)) {
754 dev_err(dev
, "POR_EN reg field init failed\n");
755 return PTR_ERR(wiz
->por_en
);
758 wiz
->phy_reset_n
= devm_regmap_field_alloc(dev
, regmap
,
760 if (IS_ERR(wiz
->phy_reset_n
)) {
761 dev_err(dev
, "PHY_RESET_N reg field init failed\n");
762 return PTR_ERR(wiz
->phy_reset_n
);
765 wiz
->pma_cmn_refclk_int_mode
=
766 devm_regmap_field_alloc(dev
, regmap
, pma_cmn_refclk_int_mode
);
767 if (IS_ERR(wiz
->pma_cmn_refclk_int_mode
)) {
768 dev_err(dev
, "PMA_CMN_REFCLK_INT_MODE reg field init failed\n");
769 return PTR_ERR(wiz
->pma_cmn_refclk_int_mode
);
772 if (data
->pma_cmn_refclk1_int_mode
) {
773 wiz
->pma_cmn_refclk1_int_mode
=
774 devm_regmap_field_alloc(dev
, regmap
, *data
->pma_cmn_refclk1_int_mode
);
775 if (IS_ERR(wiz
->pma_cmn_refclk1_int_mode
)) {
776 dev_err(dev
, "PMA_CMN_REFCLK1_INT_MODE reg field init failed\n");
777 return PTR_ERR(wiz
->pma_cmn_refclk1_int_mode
);
781 wiz
->pma_cmn_refclk_mode
=
782 devm_regmap_field_alloc(dev
, regmap
, pma_cmn_refclk_mode
);
783 if (IS_ERR(wiz
->pma_cmn_refclk_mode
)) {
784 dev_err(dev
, "PMA_CMN_REFCLK_MODE reg field init failed\n");
785 return PTR_ERR(wiz
->pma_cmn_refclk_mode
);
788 wiz
->div_sel_field
[CMN_REFCLK
] =
789 devm_regmap_field_alloc(dev
, regmap
, pma_cmn_refclk_dig_div
);
790 if (IS_ERR(wiz
->div_sel_field
[CMN_REFCLK
])) {
791 dev_err(dev
, "PMA_CMN_REFCLK_DIG_DIV reg field init failed\n");
792 return PTR_ERR(wiz
->div_sel_field
[CMN_REFCLK
]);
795 if (data
->pma_cmn_refclk1_dig_div
) {
796 wiz
->div_sel_field
[CMN_REFCLK1
] =
797 devm_regmap_field_alloc(dev
, regmap
, *data
->pma_cmn_refclk1_dig_div
);
798 if (IS_ERR(wiz
->div_sel_field
[CMN_REFCLK1
])) {
799 dev_err(dev
, "PMA_CMN_REFCLK1_DIG_DIV reg field init failed\n");
800 return PTR_ERR(wiz
->div_sel_field
[CMN_REFCLK1
]);
804 wiz
->mux_sel_field
[PLL0_REFCLK
] =
805 devm_regmap_field_alloc(dev
, regmap
, *data
->pll0_refclk_mux_sel
);
806 if (IS_ERR(wiz
->mux_sel_field
[PLL0_REFCLK
])) {
807 dev_err(dev
, "PLL0_REFCLK_SEL reg field init failed\n");
808 return PTR_ERR(wiz
->mux_sel_field
[PLL0_REFCLK
]);
811 wiz
->mux_sel_field
[PLL1_REFCLK
] =
812 devm_regmap_field_alloc(dev
, regmap
, *data
->pll1_refclk_mux_sel
);
813 if (IS_ERR(wiz
->mux_sel_field
[PLL1_REFCLK
])) {
814 dev_err(dev
, "PLL1_REFCLK_SEL reg field init failed\n");
815 return PTR_ERR(wiz
->mux_sel_field
[PLL1_REFCLK
]);
818 wiz
->mux_sel_field
[REFCLK_DIG
] =
819 devm_regmap_field_alloc(dev
, regmap
, *data
->refclk_dig_sel
);
820 if (IS_ERR(wiz
->mux_sel_field
[REFCLK_DIG
])) {
821 dev_err(dev
, "REFCLK_DIG_SEL reg field init failed\n");
822 return PTR_ERR(wiz
->mux_sel_field
[REFCLK_DIG
]);
825 for (i
= 0; i
< num_lanes
; i
++) {
826 wiz
->p_enable
[i
] = devm_regmap_field_alloc(dev
, regmap
,
828 if (IS_ERR(wiz
->p_enable
[i
])) {
829 dev_err(dev
, "P%d_ENABLE reg field init failed\n", i
);
830 return PTR_ERR(wiz
->p_enable
[i
]);
833 wiz
->p_align
[i
] = devm_regmap_field_alloc(dev
, regmap
,
835 if (IS_ERR(wiz
->p_align
[i
])) {
836 dev_err(dev
, "P%d_ALIGN reg field init failed\n", i
);
837 return PTR_ERR(wiz
->p_align
[i
]);
840 wiz
->p_raw_auto_start
[i
] =
841 devm_regmap_field_alloc(dev
, regmap
, p_raw_auto_start
[i
]);
842 if (IS_ERR(wiz
->p_raw_auto_start
[i
])) {
843 dev_err(dev
, "P%d_RAW_AUTO_START reg field init fail\n",
845 return PTR_ERR(wiz
->p_raw_auto_start
[i
]);
848 wiz
->p_standard_mode
[i
] =
849 devm_regmap_field_alloc(dev
, regmap
, p_standard_mode
[i
]);
850 if (IS_ERR(wiz
->p_standard_mode
[i
])) {
851 dev_err(dev
, "P%d_STANDARD_MODE reg field init fail\n",
853 return PTR_ERR(wiz
->p_standard_mode
[i
]);
856 wiz
->p0_fullrt_div
[i
] = devm_regmap_field_alloc(dev
, regmap
, p0_fullrt_div
[i
]);
857 if (IS_ERR(wiz
->p0_fullrt_div
[i
])) {
858 dev_err(dev
, "P%d_FULLRT_DIV reg field init failed\n", i
);
859 return PTR_ERR(wiz
->p0_fullrt_div
[i
]);
862 wiz
->p_mac_div_sel0
[i
] =
863 devm_regmap_field_alloc(dev
, regmap
, p_mac_div_sel0
[i
]);
864 if (IS_ERR(wiz
->p_mac_div_sel0
[i
])) {
865 dev_err(dev
, "P%d_MAC_DIV_SEL0 reg field init fail\n",
867 return PTR_ERR(wiz
->p_mac_div_sel0
[i
]);
870 wiz
->p_mac_div_sel1
[i
] =
871 devm_regmap_field_alloc(dev
, regmap
, p_mac_div_sel1
[i
]);
872 if (IS_ERR(wiz
->p_mac_div_sel1
[i
])) {
873 dev_err(dev
, "P%d_MAC_DIV_SEL1 reg field init fail\n",
875 return PTR_ERR(wiz
->p_mac_div_sel1
[i
]);
882 static int wiz_clock_init(struct wiz
*wiz
)
884 struct udevice
*dev
= wiz
->dev
;
889 clk
= devm_clk_get(dev
, "core_ref_clk");
891 dev_err(dev
, "core_ref_clk clock not found\n");
895 wiz
->input_clks
[WIZ_CORE_REFCLK
] = clk
;
897 rate
= clk_get_rate(clk
);
898 if (rate
>= 100000000)
899 regmap_field_write(wiz
->pma_cmn_refclk_int_mode
, 0x1);
901 regmap_field_write(wiz
->pma_cmn_refclk_int_mode
, 0x3);
903 if (wiz
->data
->pma_cmn_refclk1_int_mode
) {
904 clk
= devm_clk_get(dev
, "core_ref1_clk");
906 dev_err(dev
, "core_ref1_clk clock not found\n");
910 wiz
->input_clks
[WIZ_CORE_REFCLK1
] = clk
;
912 rate
= clk_get_rate(clk
);
913 if (rate
>= 100000000)
914 regmap_field_write(wiz
->pma_cmn_refclk1_int_mode
, 0x1);
916 regmap_field_write(wiz
->pma_cmn_refclk1_int_mode
, 0x3);
918 /* Initialize CORE_REFCLK1 to the same clock reference to maintain old DT compatibility */
919 wiz
->input_clks
[WIZ_CORE_REFCLK1
] = clk
;
922 clk
= devm_clk_get(dev
, "ext_ref_clk");
924 dev_err(dev
, "ext_ref_clk clock not found\n");
929 wiz
->input_clks
[WIZ_EXT_REFCLK
] = clk
;
930 /* Initialize EXT_REFCLK1 to the same clock reference to maintain old DT compatibility */
931 wiz
->input_clks
[WIZ_EXT_REFCLK1
] = clk
;
933 rate
= clk_get_rate(clk
);
934 if (rate
>= 100000000)
935 regmap_field_write(wiz
->pma_cmn_refclk_mode
, 0x0);
937 regmap_field_write(wiz
->pma_cmn_refclk_mode
, 0x2);
942 static ofnode
get_child_by_name(struct udevice
*dev
, const char *name
)
944 int l
= strlen(name
);
945 ofnode node
= dev_read_first_subnode(dev
);
947 while (ofnode_valid(node
)) {
948 const char *child_name
= ofnode_get_name(node
);
950 if (!strncmp(child_name
, name
, l
)) {
951 if (child_name
[l
] == '\0' || child_name
[l
] == '@')
954 node
= dev_read_next_subnode(node
);
959 static int j721e_wiz_bind_clocks(struct wiz
*wiz
)
961 struct udevice
*dev
= wiz
->dev
;
962 struct driver
*wiz_clk_drv
;
965 wiz_clk_drv
= lists_driver_lookup_name("wiz_clk");
967 dev_err(dev
, "Cannot find driver 'wiz_clk'\n");
971 for (i
= 0; i
< WIZ_DIV_NUM_CLOCKS_10G
; i
++) {
972 rc
= device_bind(dev
, wiz_clk_drv
, clk_div_sel
[i
].node_name
,
973 &clk_div_sel
[i
], dev_ofnode(dev
), NULL
);
975 dev_err(dev
, "cannot bind driver for clock %s\n",
976 clk_div_sel
[i
].node_name
);
980 for (i
= 0; i
< WIZ_MUX_NUM_CLOCKS
; i
++) {
981 rc
= device_bind(dev
, wiz_clk_drv
, clk_mux_sel_10g
[i
].node_name
,
982 &clk_mux_sel_10g
[i
], dev_ofnode(dev
), NULL
);
984 dev_err(dev
, "cannot bind driver for clock %s\n",
985 clk_mux_sel_10g
[i
].node_name
);
992 static int j721e_wiz_bind_of_clocks(struct wiz
*wiz
)
994 struct wiz_clk_mux_sel
*clk_mux_sel
= wiz
->clk_mux_sel
;
995 struct udevice
*dev
= wiz
->dev
;
996 enum wiz_type type
= wiz
->type
;
997 struct driver
*div_clk_drv
;
998 struct driver
*mux_clk_drv
;
1002 if (type
== AM64_WIZ_10G
|| type
== J784S4_WIZ_10G
)
1003 return j721e_wiz_bind_clocks(wiz
);
1005 div_clk_drv
= lists_driver_lookup_name("wiz_div_clk");
1007 dev_err(dev
, "Cannot find driver 'wiz_div_clk'\n");
1011 mux_clk_drv
= lists_driver_lookup_name("wiz_mux_clk");
1013 dev_err(dev
, "Cannot find driver 'wiz_mux_clk'\n");
1017 for (i
= 0; i
< wiz
->clk_div_sel_num
; i
++) {
1018 node
= get_child_by_name(dev
, clk_div_sel
[i
].node_name
);
1019 if (!ofnode_valid(node
)) {
1020 dev_err(dev
, "cannot find node for clock %s\n",
1021 clk_div_sel
[i
].node_name
);
1024 rc
= device_bind(dev
, div_clk_drv
, clk_div_sel
[i
].node_name
,
1025 &clk_div_sel
[i
], node
, NULL
);
1027 dev_err(dev
, "cannot bind driver for clock %s\n",
1028 clk_div_sel
[i
].node_name
);
1032 for (i
= 0; i
< WIZ_MUX_NUM_CLOCKS
; i
++) {
1033 node
= get_child_by_name(dev
, clk_mux_sel
[i
].node_name
);
1034 if (!ofnode_valid(node
)) {
1035 dev_err(dev
, "cannot find node for clock %s\n",
1036 clk_mux_sel
[i
].node_name
);
1039 rc
= device_bind(dev
, mux_clk_drv
, clk_mux_sel
[i
].node_name
,
1040 &clk_mux_sel
[i
], node
, NULL
);
1042 dev_err(dev
, "cannot bind driver for clock %s\n",
1043 clk_mux_sel
[i
].node_name
);
1050 static int j721e_wiz_bind_reset(struct udevice
*dev
)
1055 drv
= lists_driver_lookup_name("wiz-reset");
1057 dev_err(dev
, "Cannot find driver 'wiz-reset'\n");
1061 rc
= device_bind(dev
, drv
, "wiz-reset", NULL
, dev_ofnode(dev
), NULL
);
1063 dev_err(dev
, "cannot bind driver for wiz-reset\n");
1070 static int j721e_wiz_bind(struct udevice
*dev
)
1072 dm_scan_fdt_dev(dev
);
1077 static int wiz_get_lane_phy_types(struct udevice
*dev
, struct wiz
*wiz
)
1079 ofnode child
, serdes
;
1081 serdes
= get_child_by_name(dev
, "serdes");
1082 if (!ofnode_valid(serdes
)) {
1083 dev_err(dev
, "%s: Getting \"serdes\"-node failed\n", __func__
);
1087 ofnode_for_each_subnode(child
, serdes
) {
1088 u32 reg
, num_lanes
= 1, phy_type
= PHY_NONE
;
1091 ret
= ofnode_read_u32(child
, "reg", ®
);
1093 dev_err(dev
, "%s: Reading \"reg\" from failed: %d\n",
1097 ofnode_read_u32(child
, "cdns,num-lanes", &num_lanes
);
1098 ofnode_read_u32(child
, "cdns,phy-type", &phy_type
);
1100 dev_dbg(dev
, "%s: Lanes %u-%u have phy-type %u\n", __func__
,
1101 reg
, reg
+ num_lanes
- 1, phy_type
);
1103 for (i
= reg
; i
< reg
+ num_lanes
; i
++)
1104 wiz
->lane_phy_type
[i
] = phy_type
;
1110 static int j721e_wiz_probe(struct udevice
*dev
)
1112 struct wiz
*wiz
= dev_get_priv(dev
);
1113 struct ofnode_phandle_args args
;
1117 struct regmap
*regmap
;
1120 node
= get_child_by_name(dev
, "serdes");
1122 if (!ofnode_valid(node
)) {
1123 dev_err(dev
, "Failed to get SERDES child DT node\n");
1127 rc
= regmap_init_mem(node
, ®map
);
1129 dev_err(dev
, "Failed to get memory resource\n");
1132 rc
= dev_read_u32(dev
, "num-lanes", &num_lanes
);
1134 dev_err(dev
, "Failed to read num-lanes property\n");
1135 goto err_addr_to_resource
;
1138 if (num_lanes
> WIZ_MAX_LANES
) {
1139 dev_err(dev
, "Cannot support %d lanes\n", num_lanes
);
1140 goto err_addr_to_resource
;
1143 wiz
->gpio_typec_dir
= devm_gpiod_get_optional(dev
, "typec-dir",
1145 if (IS_ERR(wiz
->gpio_typec_dir
)) {
1146 rc
= PTR_ERR(wiz
->gpio_typec_dir
);
1147 dev_err(dev
, "Failed to request typec-dir gpio: %d\n", rc
);
1148 goto err_addr_to_resource
;
1151 rc
= dev_read_phandle_with_args(dev
, "power-domains", "#power-domain-cells", 0, 0, &args
);
1153 dev_err(dev
, "Failed to get power domain: %d\n", rc
);
1154 goto err_addr_to_resource
;
1157 wiz
->id
= args
.args
[0];
1158 wiz
->regmap
= regmap
;
1159 wiz
->num_lanes
= num_lanes
;
1161 wiz
->clk_div_sel
= clk_div_sel
;
1163 wiz
->data
= (struct wiz_data
*)dev_get_driver_data(dev
);
1164 wiz
->type
= wiz
->data
->type
;
1166 wiz
->clk_mux_sel
= (struct wiz_clk_mux_sel
*)wiz
->data
->clk_mux_sel
;
1167 wiz
->clk_div_sel_num
= wiz
->data
->clk_div_sel_num
;
1169 rc
= wiz_get_lane_phy_types(dev
, wiz
);
1171 dev_err(dev
, "Failed to get lane PHY types\n");
1172 goto err_addr_to_resource
;
1175 rc
= wiz_regfield_init(wiz
);
1177 dev_err(dev
, "Failed to initialize regfields\n");
1178 goto err_addr_to_resource
;
1181 for (i
= 0; i
< wiz
->num_lanes
; i
++) {
1182 regmap_field_read(wiz
->p_enable
[i
], &val
);
1183 if (val
& (P_ENABLE
| P_ENABLE_FORCE
)) {
1184 dev_err(dev
, "SERDES already configured\n");
1186 goto err_addr_to_resource
;
1190 rc
= j721e_wiz_bind_of_clocks(wiz
);
1192 dev_err(dev
, "Failed to bind clocks\n");
1193 goto err_addr_to_resource
;
1196 rc
= j721e_wiz_bind_reset(dev
);
1198 dev_err(dev
, "Failed to bind reset\n");
1199 goto err_addr_to_resource
;
1202 rc
= wiz_clock_init(wiz
);
1204 dev_warn(dev
, "Failed to initialize clocks\n");
1205 goto err_addr_to_resource
;
1210 dev_err(dev
, "WIZ initialization failed\n");
1211 goto err_addr_to_resource
;
1216 err_addr_to_resource
:
1222 static int j721e_wiz_remove(struct udevice
*dev
)
1224 struct wiz
*wiz
= dev_get_priv(dev
);
1232 static const struct udevice_id j721e_wiz_ids
[] = {
1234 .compatible
= "ti,j721e-wiz-16g", .data
= (ulong
)&j721e_16g_data
,
1237 .compatible
= "ti,j721e-wiz-10g", .data
= (ulong
)&j721e_10g_data
,
1240 .compatible
= "ti,am64-wiz-10g", .data
= (ulong
)&am64_10g_data
,
1243 .compatible
= "ti,j784s4-wiz-10g", .data
= (ulong
)&j784s4_wiz_10g
,
1248 U_BOOT_DRIVER(phy_j721e_wiz
) = {
1249 .name
= "phy-j721e-wiz",
1251 .of_match
= j721e_wiz_ids
,
1252 .bind
= j721e_wiz_bind
,
1253 .probe
= j721e_wiz_probe
,
1254 .remove
= j721e_wiz_remove
,
1255 .priv_auto
= sizeof(struct wiz
),
1256 .flags
= DM_FLAG_LEAVE_PD_ON
,