phy-j721e-wiz.c 40 KB

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