dwc_eth_qos_qcom.c 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612
  1. // SPDX-License-Identifier: GPL-2.0+
  2. /*
  3. * (C) Copyright 2022-2023 Sumit Garg <sumit.garg@linaro.org>
  4. *
  5. * Qcom DWMAC specific glue layer
  6. */
  7. #include <common.h>
  8. #include <asm/global_data.h>
  9. #include <asm/gpio.h>
  10. #include <asm/io.h>
  11. #include <clk.h>
  12. #include <dm.h>
  13. #include <dm/device_compat.h>
  14. #include <phy.h>
  15. #include <reset.h>
  16. #include <syscon.h>
  17. #include <linux/bitops.h>
  18. #include <linux/delay.h>
  19. #include "dwc_eth_qos.h"
  20. /* RGMII_IO_MACRO_CONFIG fields */
  21. #define RGMII_CONFIG_FUNC_CLK_EN BIT(30)
  22. #define RGMII_CONFIG_POS_NEG_DATA_SEL BIT(23)
  23. #define RGMII_CONFIG_GPIO_CFG_RX_INT GENMASK(21, 20)
  24. #define RGMII_CONFIG_GPIO_CFG_TX_INT GENMASK(19, 17)
  25. #define RGMII_CONFIG_MAX_SPD_PRG_9 GENMASK(16, 8)
  26. #define RGMII_CONFIG_MAX_SPD_PRG_2 GENMASK(7, 6)
  27. #define RGMII_CONFIG_INTF_SEL GENMASK(5, 4)
  28. #define RGMII_CONFIG_BYPASS_TX_ID_EN BIT(3)
  29. #define RGMII_CONFIG_LOOPBACK_EN BIT(2)
  30. #define RGMII_CONFIG_PROG_SWAP BIT(1)
  31. #define RGMII_CONFIG_DDR_MODE BIT(0)
  32. /* SDCC_HC_REG_DLL_CONFIG fields */
  33. #define SDCC_DLL_CONFIG_DLL_RST BIT(30)
  34. #define SDCC_DLL_CONFIG_PDN BIT(29)
  35. #define SDCC_DLL_CONFIG_MCLK_FREQ GENMASK(26, 24)
  36. #define SDCC_DLL_CONFIG_CDR_SELEXT GENMASK(23, 20)
  37. #define SDCC_DLL_CONFIG_CDR_EXT_EN BIT(19)
  38. #define SDCC_DLL_CONFIG_CK_OUT_EN BIT(18)
  39. #define SDCC_DLL_CONFIG_CDR_EN BIT(17)
  40. #define SDCC_DLL_CONFIG_DLL_EN BIT(16)
  41. #define SDCC_DLL_MCLK_GATING_EN BIT(5)
  42. #define SDCC_DLL_CDR_FINE_PHASE GENMASK(3, 2)
  43. /* SDCC_HC_REG_DDR_CONFIG fields */
  44. #define SDCC_DDR_CONFIG_PRG_DLY_EN BIT(31)
  45. #define SDCC_DDR_CONFIG_EXT_PRG_RCLK_DLY GENMASK(26, 21)
  46. #define SDCC_DDR_CONFIG_EXT_PRG_RCLK_DLY_CODE GENMASK(29, 27)
  47. #define SDCC_DDR_CONFIG_EXT_PRG_RCLK_DLY_EN BIT(30)
  48. #define SDCC_DDR_CONFIG_PRG_RCLK_DLY GENMASK(8, 0)
  49. /* SDCC_HC_REG_DLL_CONFIG2 fields */
  50. #define SDCC_DLL_CONFIG2_DLL_CLOCK_DIS BIT(21)
  51. #define SDCC_DLL_CONFIG2_MCLK_FREQ_CALC GENMASK(17, 10)
  52. #define SDCC_DLL_CONFIG2_DDR_TRAFFIC_INIT_SEL GENMASK(3, 2)
  53. #define SDCC_DLL_CONFIG2_DDR_TRAFFIC_INIT_SW BIT(1)
  54. #define SDCC_DLL_CONFIG2_DDR_CAL_EN BIT(0)
  55. /* SDC4_STATUS bits */
  56. #define SDC4_STATUS_DLL_LOCK BIT(7)
  57. /* RGMII_IO_MACRO_CONFIG2 fields */
  58. #define RGMII_CONFIG2_RSVD_CONFIG15 GENMASK(31, 17)
  59. #define RGMII_CONFIG2_RGMII_CLK_SEL_CFG BIT(16)
  60. #define RGMII_CONFIG2_TX_TO_RX_LOOPBACK_EN BIT(13)
  61. #define RGMII_CONFIG2_CLK_DIVIDE_SEL BIT(12)
  62. #define RGMII_CONFIG2_RX_PROG_SWAP BIT(7)
  63. #define RGMII_CONFIG2_DATA_DIVIDE_CLK_SEL BIT(6)
  64. #define RGMII_CONFIG2_TX_CLK_PHASE_SHIFT_EN BIT(5)
  65. struct dwmac_rgmii_regs {
  66. u32 io_macro_config; /* 0x00 */
  67. u32 sdcc_hc_dll_config; /* 0x04 */
  68. u32 reserved_1; /* 0x08 */
  69. u32 sdcc_hc_ddr_config; /* 0x0c */
  70. u32 sdcc_hc_dll_config2; /* 0x10 */
  71. u32 sdc4_status; /* 0x14 */
  72. u32 sdcc_usr_ctl; /* 0x18 */
  73. u32 io_macro_config2; /* 0x1c */
  74. u32 io_macro_debug1; /* 0x20 */
  75. u32 reserved_2; /* 0x24 */
  76. u32 emac_sys_low_power_dbg; /* 0x28 */
  77. u32 reserved_3[53]; /* upto 0x100 */
  78. };
  79. static struct dwmac_rgmii_regs emac_v2_3_0_por = {
  80. .io_macro_config = 0x00C01343,
  81. .sdcc_hc_dll_config = 0x2004642C,
  82. .sdcc_hc_ddr_config = 0x00000000,
  83. .sdcc_hc_dll_config2 = 0x00200000,
  84. .sdcc_usr_ctl = 0x00010800,
  85. .io_macro_config2 = 0x00002060
  86. };
  87. static void ethqos_set_func_clk_en(struct dwmac_rgmii_regs *regs)
  88. {
  89. setbits_le32(&regs->io_macro_config, RGMII_CONFIG_FUNC_CLK_EN);
  90. }
  91. static int ethqos_dll_configure(struct udevice *dev,
  92. struct dwmac_rgmii_regs *regs)
  93. {
  94. unsigned int val;
  95. int retry = 1000;
  96. /* Set CDR_EN */
  97. setbits_le32(&regs->sdcc_hc_dll_config, SDCC_DLL_CONFIG_CDR_EN);
  98. /* Set CDR_EXT_EN */
  99. setbits_le32(&regs->sdcc_hc_dll_config, SDCC_DLL_CONFIG_CDR_EXT_EN);
  100. /* Clear CK_OUT_EN */
  101. clrbits_le32(&regs->sdcc_hc_dll_config, SDCC_DLL_CONFIG_CK_OUT_EN);
  102. /* Set DLL_EN */
  103. setbits_le32(&regs->sdcc_hc_dll_config, SDCC_DLL_CONFIG_DLL_EN);
  104. clrbits_le32(&regs->sdcc_hc_dll_config, SDCC_DLL_MCLK_GATING_EN);
  105. clrbits_le32(&regs->sdcc_hc_dll_config, SDCC_DLL_CDR_FINE_PHASE);
  106. /* Wait for CK_OUT_EN clear */
  107. do {
  108. val = readl(&regs->sdcc_hc_dll_config);
  109. val &= SDCC_DLL_CONFIG_CK_OUT_EN;
  110. if (!val)
  111. break;
  112. mdelay(1);
  113. retry--;
  114. } while (retry > 0);
  115. if (!retry)
  116. dev_err(dev, "Clear CK_OUT_EN timedout\n");
  117. /* Set CK_OUT_EN */
  118. setbits_le32(&regs->sdcc_hc_dll_config, SDCC_DLL_CONFIG_CK_OUT_EN);
  119. /* Wait for CK_OUT_EN set */
  120. retry = 1000;
  121. do {
  122. val = readl(&regs->sdcc_hc_dll_config);
  123. val &= SDCC_DLL_CONFIG_CK_OUT_EN;
  124. if (val)
  125. break;
  126. mdelay(1);
  127. retry--;
  128. } while (retry > 0);
  129. if (!retry)
  130. dev_err(dev, "Set CK_OUT_EN timedout\n");
  131. /* Set DDR_CAL_EN */
  132. setbits_le32(&regs->sdcc_hc_dll_config2, SDCC_DLL_CONFIG2_DDR_CAL_EN);
  133. clrbits_le32(&regs->sdcc_hc_dll_config2,
  134. SDCC_DLL_CONFIG2_DLL_CLOCK_DIS);
  135. clrsetbits_le32(&regs->sdcc_hc_dll_config2,
  136. SDCC_DLL_CONFIG2_MCLK_FREQ_CALC, 0x1A << 10);
  137. clrsetbits_le32(&regs->sdcc_hc_dll_config2,
  138. SDCC_DLL_CONFIG2_DDR_TRAFFIC_INIT_SEL, BIT(2));
  139. setbits_le32(&regs->sdcc_hc_dll_config2,
  140. SDCC_DLL_CONFIG2_DDR_TRAFFIC_INIT_SW);
  141. return 0;
  142. }
  143. static int ethqos_rgmii_macro_init(struct udevice *dev,
  144. struct dwmac_rgmii_regs *regs,
  145. unsigned long speed)
  146. {
  147. /* Disable loopback mode */
  148. clrbits_le32(&regs->io_macro_config2,
  149. RGMII_CONFIG2_TX_TO_RX_LOOPBACK_EN);
  150. /* Select RGMII, write 0 to interface select */
  151. clrbits_le32(&regs->io_macro_config, RGMII_CONFIG_INTF_SEL);
  152. switch (speed) {
  153. case SPEED_1000:
  154. setbits_le32(&regs->io_macro_config, RGMII_CONFIG_DDR_MODE);
  155. clrbits_le32(&regs->io_macro_config,
  156. RGMII_CONFIG_BYPASS_TX_ID_EN);
  157. setbits_le32(&regs->io_macro_config,
  158. RGMII_CONFIG_POS_NEG_DATA_SEL);
  159. setbits_le32(&regs->io_macro_config, RGMII_CONFIG_PROG_SWAP);
  160. clrbits_le32(&regs->io_macro_config2,
  161. RGMII_CONFIG2_DATA_DIVIDE_CLK_SEL);
  162. setbits_le32(&regs->io_macro_config2,
  163. RGMII_CONFIG2_TX_CLK_PHASE_SHIFT_EN);
  164. clrbits_le32(&regs->io_macro_config2,
  165. RGMII_CONFIG2_RSVD_CONFIG15);
  166. setbits_le32(&regs->io_macro_config2,
  167. RGMII_CONFIG2_RX_PROG_SWAP);
  168. /* Set PRG_RCLK_DLY to 57 for 1.8 ns delay */
  169. clrsetbits_le32(&regs->sdcc_hc_ddr_config,
  170. SDCC_DDR_CONFIG_PRG_RCLK_DLY, 57);
  171. setbits_le32(&regs->sdcc_hc_ddr_config, SDCC_DDR_CONFIG_PRG_DLY_EN);
  172. setbits_le32(&regs->io_macro_config, RGMII_CONFIG_LOOPBACK_EN);
  173. break;
  174. case SPEED_100:
  175. setbits_le32(&regs->io_macro_config, RGMII_CONFIG_DDR_MODE);
  176. setbits_le32(&regs->io_macro_config,
  177. RGMII_CONFIG_BYPASS_TX_ID_EN);
  178. clrbits_le32(&regs->io_macro_config,
  179. RGMII_CONFIG_POS_NEG_DATA_SEL);
  180. clrbits_le32(&regs->io_macro_config, RGMII_CONFIG_PROG_SWAP);
  181. clrsetbits_le32(&regs->io_macro_config,
  182. RGMII_CONFIG_MAX_SPD_PRG_2, BIT(6));
  183. clrbits_le32(&regs->io_macro_config2,
  184. RGMII_CONFIG2_DATA_DIVIDE_CLK_SEL);
  185. setbits_le32(&regs->io_macro_config2,
  186. RGMII_CONFIG2_TX_CLK_PHASE_SHIFT_EN);
  187. clrbits_le32(&regs->io_macro_config2,
  188. RGMII_CONFIG2_RSVD_CONFIG15);
  189. clrbits_le32(&regs->io_macro_config2,
  190. RGMII_CONFIG2_RX_PROG_SWAP);
  191. /* Write 0x5 to PRG_RCLK_DLY_CODE */
  192. clrsetbits_le32(&regs->sdcc_hc_ddr_config,
  193. SDCC_DDR_CONFIG_EXT_PRG_RCLK_DLY_CODE,
  194. (BIT(29) | BIT(27)));
  195. setbits_le32(&regs->sdcc_hc_ddr_config,
  196. SDCC_DDR_CONFIG_EXT_PRG_RCLK_DLY);
  197. setbits_le32(&regs->sdcc_hc_ddr_config,
  198. SDCC_DDR_CONFIG_EXT_PRG_RCLK_DLY_EN);
  199. setbits_le32(&regs->io_macro_config, RGMII_CONFIG_LOOPBACK_EN);
  200. break;
  201. case SPEED_10:
  202. setbits_le32(&regs->io_macro_config, RGMII_CONFIG_DDR_MODE);
  203. setbits_le32(&regs->io_macro_config,
  204. RGMII_CONFIG_BYPASS_TX_ID_EN);
  205. clrbits_le32(&regs->io_macro_config,
  206. RGMII_CONFIG_POS_NEG_DATA_SEL);
  207. clrbits_le32(&regs->io_macro_config, RGMII_CONFIG_PROG_SWAP);
  208. clrsetbits_le32(&regs->io_macro_config,
  209. RGMII_CONFIG_MAX_SPD_PRG_9,
  210. BIT(12) | GENMASK(9, 8));
  211. clrbits_le32(&regs->io_macro_config2,
  212. RGMII_CONFIG2_DATA_DIVIDE_CLK_SEL);
  213. clrbits_le32(&regs->io_macro_config2,
  214. RGMII_CONFIG2_TX_CLK_PHASE_SHIFT_EN);
  215. clrbits_le32(&regs->io_macro_config2,
  216. RGMII_CONFIG2_RSVD_CONFIG15);
  217. clrbits_le32(&regs->io_macro_config2,
  218. RGMII_CONFIG2_RX_PROG_SWAP);
  219. /* Write 0x5 to PRG_RCLK_DLY_CODE */
  220. clrsetbits_le32(&regs->sdcc_hc_ddr_config,
  221. SDCC_DDR_CONFIG_EXT_PRG_RCLK_DLY_CODE,
  222. (BIT(29) | BIT(27)));
  223. setbits_le32(&regs->sdcc_hc_ddr_config,
  224. SDCC_DDR_CONFIG_EXT_PRG_RCLK_DLY);
  225. setbits_le32(&regs->sdcc_hc_ddr_config,
  226. SDCC_DDR_CONFIG_EXT_PRG_RCLK_DLY_EN);
  227. setbits_le32(&regs->io_macro_config, RGMII_CONFIG_LOOPBACK_EN);
  228. break;
  229. default:
  230. dev_err(dev, "Invalid speed %ld\n", speed);
  231. return -EINVAL;
  232. }
  233. return 0;
  234. }
  235. static int ethqos_configure(struct udevice *dev,
  236. struct dwmac_rgmii_regs *regs,
  237. unsigned long speed)
  238. {
  239. unsigned int retry = 1000;
  240. /* Reset to POR values and enable clk */
  241. writel(emac_v2_3_0_por.io_macro_config, &regs->io_macro_config);
  242. writel(emac_v2_3_0_por.sdcc_hc_dll_config, &regs->sdcc_hc_dll_config);
  243. writel(emac_v2_3_0_por.sdcc_hc_ddr_config, &regs->sdcc_hc_ddr_config);
  244. writel(emac_v2_3_0_por.sdcc_hc_dll_config2, &regs->sdcc_hc_dll_config2);
  245. writel(emac_v2_3_0_por.sdcc_usr_ctl, &regs->sdcc_usr_ctl);
  246. writel(emac_v2_3_0_por.io_macro_config2, &regs->io_macro_config2);
  247. ethqos_set_func_clk_en(regs);
  248. /* Initialize the DLL first */
  249. /* Set DLL_RST */
  250. setbits_le32(&regs->sdcc_hc_dll_config, SDCC_DLL_CONFIG_DLL_RST);
  251. /* Set PDN */
  252. setbits_le32(&regs->sdcc_hc_dll_config, SDCC_DLL_CONFIG_PDN);
  253. /* Clear DLL_RST */
  254. clrbits_le32(&regs->sdcc_hc_dll_config, SDCC_DLL_CONFIG_DLL_RST);
  255. /* Clear PDN */
  256. clrbits_le32(&regs->sdcc_hc_dll_config, SDCC_DLL_CONFIG_PDN);
  257. if (speed == SPEED_1000) {
  258. /* Set DLL_EN */
  259. setbits_le32(&regs->sdcc_hc_dll_config, SDCC_DLL_CONFIG_DLL_EN);
  260. /* Set CK_OUT_EN */
  261. setbits_le32(&regs->sdcc_hc_dll_config,
  262. SDCC_DLL_CONFIG_CK_OUT_EN);
  263. /* Set USR_CTL bit 26 with mask of 3 bits */
  264. clrsetbits_le32(&regs->sdcc_usr_ctl, GENMASK(26, 24), BIT(26));
  265. /* wait for DLL LOCK */
  266. do {
  267. mdelay(1);
  268. if (readl(&regs->sdc4_status) & SDC4_STATUS_DLL_LOCK)
  269. break;
  270. retry--;
  271. } while (retry > 0);
  272. if (!retry)
  273. dev_err(dev, "Timeout while waiting for DLL lock\n");
  274. ethqos_dll_configure(dev, regs);
  275. }
  276. ethqos_rgmii_macro_init(dev, regs, speed);
  277. return 0;
  278. }
  279. static void ethqos_rgmii_dump(struct udevice *dev,
  280. struct dwmac_rgmii_regs *regs)
  281. {
  282. dev_dbg(dev, "Rgmii register dump\n");
  283. dev_dbg(dev, "RGMII_IO_MACRO_CONFIG: %08x\n",
  284. readl(&regs->io_macro_config));
  285. dev_dbg(dev, "SDCC_HC_REG_DLL_CONFIG: %08x\n",
  286. readl(&regs->sdcc_hc_dll_config));
  287. dev_dbg(dev, "SDCC_HC_REG_DDR_CONFIG: %08x\n",
  288. readl(&regs->sdcc_hc_ddr_config));
  289. dev_dbg(dev, "SDCC_HC_REG_DLL_CONFIG2: %08x\n",
  290. readl(&regs->sdcc_hc_dll_config2));
  291. dev_dbg(dev, "SDC4_STATUS: %08x\n",
  292. readl(&regs->sdc4_status));
  293. dev_dbg(dev, "SDCC_USR_CTL: %08x\n",
  294. readl(&regs->sdcc_usr_ctl));
  295. dev_dbg(dev, "RGMII_IO_MACRO_CONFIG2: %08x\n",
  296. readl(&regs->io_macro_config2));
  297. dev_dbg(dev, "RGMII_IO_MACRO_DEBUG1: %08x\n",
  298. readl(&regs->io_macro_debug1));
  299. dev_dbg(dev, "EMAC_SYSTEM_LOW_POWER_DEBUG: %08x\n",
  300. readl(&regs->emac_sys_low_power_dbg));
  301. }
  302. static int qcom_eqos_rgmii_set_speed(struct udevice *dev,
  303. void *rgmii_regs,
  304. unsigned long speed)
  305. {
  306. int ret;
  307. ethqos_rgmii_dump(dev, rgmii_regs);
  308. ret = ethqos_configure(dev, rgmii_regs, speed);
  309. if (ret)
  310. return ret;
  311. ethqos_rgmii_dump(dev, rgmii_regs);
  312. return 0;
  313. }
  314. static int qcom_eqos_rgmii_reset(struct udevice *dev, void *rgmii_regs)
  315. {
  316. ethqos_set_func_clk_en(rgmii_regs);
  317. return 0;
  318. }
  319. static int eqos_start_clks_qcom(struct udevice *dev)
  320. {
  321. if (IS_ENABLED(CONFIG_CLK)) {
  322. struct clk_bulk clocks;
  323. int ret;
  324. ret = clk_get_bulk(dev, &clocks);
  325. if (ret)
  326. return ret;
  327. ret = clk_enable_bulk(&clocks);
  328. if (ret)
  329. return ret;
  330. }
  331. debug("%s: OK\n", __func__);
  332. return 0;
  333. }
  334. static int eqos_stop_clks_qcom(struct udevice *dev)
  335. {
  336. if (IS_ENABLED(CONFIG_CLK)) {
  337. struct clk_bulk clocks;
  338. int ret;
  339. ret = clk_get_bulk(dev, &clocks);
  340. if (ret)
  341. return ret;
  342. ret = clk_disable_bulk(&clocks);
  343. if (ret)
  344. return ret;
  345. }
  346. debug("%s: OK\n", __func__);
  347. return 0;
  348. }
  349. static int eqos_start_resets_qcom(struct udevice *dev)
  350. {
  351. struct eqos_priv *eqos = dev_get_priv(dev);
  352. int ret;
  353. debug("%s(dev=%p):\n", __func__, dev);
  354. if (!eqos->phy) {
  355. ret = dm_gpio_set_value(&eqos->phy_reset_gpio, 0);
  356. if (ret < 0) {
  357. pr_err("dm_gpio_set_value(phy_reset, assert) failed: %d", ret);
  358. return ret;
  359. }
  360. udelay(eqos->reset_delays[0]);
  361. ret = dm_gpio_set_value(&eqos->phy_reset_gpio, 1);
  362. if (ret < 0) {
  363. pr_err("dm_gpio_set_value(phy_reset, deassert) failed: %d", ret);
  364. return ret;
  365. }
  366. udelay(eqos->reset_delays[1]);
  367. ret = dm_gpio_set_value(&eqos->phy_reset_gpio, 0);
  368. if (ret < 0) {
  369. pr_err("dm_gpio_set_value(phy_reset, deassert) failed: %d", ret);
  370. return ret;
  371. }
  372. udelay(eqos->reset_delays[2]);
  373. }
  374. ret = reset_deassert(&eqos->reset_ctl);
  375. if (ret < 0) {
  376. pr_err("reset_deassert() failed: %d", ret);
  377. return ret;
  378. }
  379. ret = qcom_eqos_rgmii_reset(dev, eqos->eqos_qcom_rgmii_regs);
  380. if (ret < 0) {
  381. pr_err("qcom rgmii_reset failed: %d", ret);
  382. return ret;
  383. }
  384. debug("%s: OK\n", __func__);
  385. return 0;
  386. }
  387. /* Clock rates */
  388. #define RGMII_1000_NOM_CLK_FREQ (250 * 1000 * 1000UL)
  389. #define RGMII_ID_MODE_100_LOW_SVS_CLK_FREQ (50 * 1000 * 1000UL)
  390. #define RGMII_ID_MODE_10_LOW_SVS_CLK_FREQ (5 * 1000 * 1000UL)
  391. static int eqos_set_tx_clk_speed_qcom(struct udevice *dev)
  392. {
  393. struct eqos_priv *eqos = dev_get_priv(dev);
  394. ulong rate;
  395. int ret;
  396. debug("%s(dev=%p):\n", __func__, dev);
  397. switch (eqos->phy->speed) {
  398. case SPEED_1000:
  399. rate = RGMII_1000_NOM_CLK_FREQ;
  400. break;
  401. case SPEED_100:
  402. rate = RGMII_ID_MODE_100_LOW_SVS_CLK_FREQ;
  403. break;
  404. case SPEED_10:
  405. rate = RGMII_ID_MODE_10_LOW_SVS_CLK_FREQ;
  406. break;
  407. default:
  408. pr_err("invalid speed %d", eqos->phy->speed);
  409. return -EINVAL;
  410. }
  411. ret = clk_set_rate(&eqos->clk_tx, rate);
  412. if (ret < 0) {
  413. pr_err("clk_set_rate(tx_clk, %lu) failed: %d", rate, ret);
  414. return ret;
  415. }
  416. ret = qcom_eqos_rgmii_set_speed(dev, eqos->eqos_qcom_rgmii_regs,
  417. eqos->phy->speed);
  418. if (ret < 0) {
  419. pr_err("qcom set_speed: %d, failed: %d", eqos->phy->speed, ret);
  420. return ret;
  421. }
  422. return 0;
  423. }
  424. static int eqos_probe_resources_qcom(struct udevice *dev)
  425. {
  426. struct eqos_priv *eqos = dev_get_priv(dev);
  427. phy_interface_t interface;
  428. int reset_flags = GPIOD_IS_OUT;
  429. int ret;
  430. debug("%s(dev=%p):\n", __func__, dev);
  431. interface = eqos->config->interface(dev);
  432. if (interface == PHY_INTERFACE_MODE_NA) {
  433. pr_err("Invalid PHY interface\n");
  434. return -EINVAL;
  435. }
  436. eqos->max_speed = dev_read_u32_default(dev, "max-speed", 0);
  437. eqos->tx_fifo_sz = dev_read_u32_default(dev, "tx-fifo-depth", 0);
  438. eqos->rx_fifo_sz = dev_read_u32_default(dev, "rx-fifo-depth", 0);
  439. ret = reset_get_by_name(dev, "emac", &eqos->reset_ctl);
  440. if (ret) {
  441. pr_err("reset_get_by_name(rst) failed: %d", ret);
  442. return ret;
  443. }
  444. if (dev_read_bool(dev, "snps,reset-active-low"))
  445. reset_flags |= GPIOD_ACTIVE_LOW;
  446. ret = gpio_request_by_name(dev, "snps,reset-gpio", 0,
  447. &eqos->phy_reset_gpio, reset_flags);
  448. if (ret == 0) {
  449. ret = dev_read_u32_array(dev, "snps,reset-delays-us",
  450. eqos->reset_delays, 3);
  451. } else if (ret == -ENOENT) {
  452. ret = 0;
  453. }
  454. eqos->eqos_qcom_rgmii_regs = (void *)dev_read_addr_name(dev, "rgmii");
  455. if ((fdt_addr_t)eqos->eqos_qcom_rgmii_regs == FDT_ADDR_T_NONE) {
  456. pr_err("Invalid RGMII address\n");
  457. return -EINVAL;
  458. }
  459. ret = clk_get_by_name(dev, "rgmii", &eqos->clk_tx);
  460. if (ret) {
  461. pr_err("clk_get_by_name(tx) failed: %d", ret);
  462. return -EINVAL;
  463. }
  464. debug("%s: OK\n", __func__);
  465. return 0;
  466. }
  467. static int eqos_remove_resources_qcom(struct udevice *dev)
  468. {
  469. struct eqos_priv *eqos = dev_get_priv(dev);
  470. debug("%s(dev=%p):\n", __func__, dev);
  471. clk_free(&eqos->clk_tx);
  472. dm_gpio_free(dev, &eqos->phy_reset_gpio);
  473. reset_free(&eqos->reset_ctl);
  474. debug("%s: OK\n", __func__);
  475. return 0;
  476. }
  477. static struct eqos_ops eqos_qcom_ops = {
  478. .eqos_inval_desc = eqos_inval_desc_generic,
  479. .eqos_flush_desc = eqos_flush_desc_generic,
  480. .eqos_inval_buffer = eqos_inval_buffer_generic,
  481. .eqos_flush_buffer = eqos_flush_buffer_generic,
  482. .eqos_probe_resources = eqos_probe_resources_qcom,
  483. .eqos_remove_resources = eqos_remove_resources_qcom,
  484. .eqos_stop_resets = eqos_null_ops,
  485. .eqos_start_resets = eqos_start_resets_qcom,
  486. .eqos_stop_clks = eqos_stop_clks_qcom,
  487. .eqos_start_clks = eqos_start_clks_qcom,
  488. .eqos_calibrate_pads = eqos_null_ops,
  489. .eqos_disable_calibration = eqos_null_ops,
  490. .eqos_set_tx_clk_speed = eqos_set_tx_clk_speed_qcom,
  491. .eqos_get_enetaddr = eqos_null_ops,
  492. };
  493. struct eqos_config __maybe_unused eqos_qcom_config = {
  494. .reg_access_always_ok = false,
  495. .mdio_wait = 10,
  496. .swr_wait = 50,
  497. .config_mac = EQOS_MAC_RXQ_CTRL0_RXQ0EN_ENABLED_DCB,
  498. .config_mac_mdio = EQOS_MAC_MDIO_ADDRESS_CR_250_300,
  499. .axi_bus_width = EQOS_AXI_WIDTH_64,
  500. .interface = dev_read_phy_mode,
  501. .ops = &eqos_qcom_ops
  502. };