clk-en7523.c 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. #include <linux/delay.h>
  3. #include <linux/clk-provider.h>
  4. #include <linux/io.h>
  5. #include <linux/mfd/syscon.h>
  6. #include <linux/platform_device.h>
  7. #include <linux/property.h>
  8. #include <linux/regmap.h>
  9. #include <linux/reset-controller.h>
  10. #include <dt-bindings/clock/en7523-clk.h>
  11. #include <dt-bindings/reset/airoha,en7581-reset.h>
  12. #define RST_NR_PER_BANK 32
  13. #define REG_PCI_CONTROL 0x88
  14. #define REG_PCI_CONTROL_PERSTOUT BIT(29)
  15. #define REG_PCI_CONTROL_PERSTOUT1 BIT(26)
  16. #define REG_PCI_CONTROL_REFCLK_EN0 BIT(23)
  17. #define REG_PCI_CONTROL_REFCLK_EN1 BIT(22)
  18. #define REG_PCI_CONTROL_PERSTOUT2 BIT(16)
  19. #define REG_GSW_CLK_DIV_SEL 0x1b4
  20. #define REG_EMI_CLK_DIV_SEL 0x1b8
  21. #define REG_BUS_CLK_DIV_SEL 0x1bc
  22. #define REG_SPI_CLK_DIV_SEL 0x1c4
  23. #define REG_SPI_CLK_FREQ_SEL 0x1c8
  24. #define REG_NPU_CLK_DIV_SEL 0x1fc
  25. #define REG_CRYPTO_CLKSRC 0x200
  26. #define REG_RESET_CONTROL2 0x830
  27. #define REG_RESET2_CONTROL_PCIE2 BIT(27)
  28. #define REG_RESET_CONTROL1 0x834
  29. #define REG_RESET_CONTROL_PCIEHB BIT(29)
  30. #define REG_RESET_CONTROL_PCIE1 BIT(27)
  31. #define REG_RESET_CONTROL_PCIE2 BIT(26)
  32. /* EN7581 */
  33. #define REG_NP_SCU_PCIC 0x88
  34. #define REG_NP_SCU_SSTR 0x9c
  35. #define REG_PCIE_XSI0_SEL_MASK GENMASK(14, 13)
  36. #define REG_PCIE_XSI1_SEL_MASK GENMASK(12, 11)
  37. #define REG_CRYPTO_CLKSRC2 0x20c
  38. #define REG_RST_CTRL2 0x00
  39. #define REG_RST_CTRL1 0x04
  40. struct en_clk_desc {
  41. int id;
  42. const char *name;
  43. u32 base_reg;
  44. u8 base_bits;
  45. u8 base_shift;
  46. union {
  47. const unsigned int *base_values;
  48. unsigned int base_value;
  49. };
  50. size_t n_base_values;
  51. u16 div_reg;
  52. u8 div_bits;
  53. u8 div_shift;
  54. u16 div_val0;
  55. u8 div_step;
  56. u8 div_offset;
  57. };
  58. struct en_clk_gate {
  59. void __iomem *base;
  60. struct clk_hw hw;
  61. };
  62. struct en_rst_data {
  63. const u16 *bank_ofs;
  64. const u16 *idx_map;
  65. void __iomem *base;
  66. struct reset_controller_dev rcdev;
  67. };
  68. struct en_clk_soc_data {
  69. const struct clk_ops pcie_ops;
  70. struct {
  71. const u16 *bank_ofs;
  72. const u16 *idx_map;
  73. u16 idx_map_nr;
  74. } reset;
  75. int (*hw_init)(struct platform_device *pdev,
  76. struct clk_hw_onecell_data *clk_data);
  77. };
  78. static const u32 gsw_base[] = { 400000000, 500000000 };
  79. static const u32 emi_base[] = { 333000000, 400000000 };
  80. static const u32 bus_base[] = { 500000000, 540000000 };
  81. static const u32 slic_base[] = { 100000000, 3125000 };
  82. static const u32 npu_base[] = { 333000000, 400000000, 500000000 };
  83. /* EN7581 */
  84. static const u32 emi7581_base[] = { 540000000, 480000000, 400000000, 300000000 };
  85. static const u32 bus7581_base[] = { 600000000, 540000000 };
  86. static const u32 npu7581_base[] = { 800000000, 750000000, 720000000, 600000000 };
  87. static const u32 crypto_base[] = { 540000000, 480000000 };
  88. static const struct en_clk_desc en7523_base_clks[] = {
  89. {
  90. .id = EN7523_CLK_GSW,
  91. .name = "gsw",
  92. .base_reg = REG_GSW_CLK_DIV_SEL,
  93. .base_bits = 1,
  94. .base_shift = 8,
  95. .base_values = gsw_base,
  96. .n_base_values = ARRAY_SIZE(gsw_base),
  97. .div_bits = 3,
  98. .div_shift = 0,
  99. .div_step = 1,
  100. .div_offset = 1,
  101. }, {
  102. .id = EN7523_CLK_EMI,
  103. .name = "emi",
  104. .base_reg = REG_EMI_CLK_DIV_SEL,
  105. .base_bits = 1,
  106. .base_shift = 8,
  107. .base_values = emi_base,
  108. .n_base_values = ARRAY_SIZE(emi_base),
  109. .div_bits = 3,
  110. .div_shift = 0,
  111. .div_step = 1,
  112. .div_offset = 1,
  113. }, {
  114. .id = EN7523_CLK_BUS,
  115. .name = "bus",
  116. .base_reg = REG_BUS_CLK_DIV_SEL,
  117. .base_bits = 1,
  118. .base_shift = 8,
  119. .base_values = bus_base,
  120. .n_base_values = ARRAY_SIZE(bus_base),
  121. .div_bits = 3,
  122. .div_shift = 0,
  123. .div_step = 1,
  124. .div_offset = 1,
  125. }, {
  126. .id = EN7523_CLK_SLIC,
  127. .name = "slic",
  128. .base_reg = REG_SPI_CLK_FREQ_SEL,
  129. .base_bits = 1,
  130. .base_shift = 0,
  131. .base_values = slic_base,
  132. .n_base_values = ARRAY_SIZE(slic_base),
  133. .div_reg = REG_SPI_CLK_DIV_SEL,
  134. .div_bits = 5,
  135. .div_shift = 24,
  136. .div_val0 = 20,
  137. .div_step = 2,
  138. }, {
  139. .id = EN7523_CLK_SPI,
  140. .name = "spi",
  141. .base_reg = REG_SPI_CLK_DIV_SEL,
  142. .base_value = 400000000,
  143. .div_bits = 5,
  144. .div_shift = 8,
  145. .div_val0 = 40,
  146. .div_step = 2,
  147. }, {
  148. .id = EN7523_CLK_NPU,
  149. .name = "npu",
  150. .base_reg = REG_NPU_CLK_DIV_SEL,
  151. .base_bits = 2,
  152. .base_shift = 8,
  153. .base_values = npu_base,
  154. .n_base_values = ARRAY_SIZE(npu_base),
  155. .div_bits = 3,
  156. .div_shift = 0,
  157. .div_step = 1,
  158. .div_offset = 1,
  159. }, {
  160. .id = EN7523_CLK_CRYPTO,
  161. .name = "crypto",
  162. .base_reg = REG_CRYPTO_CLKSRC,
  163. .base_bits = 1,
  164. .base_shift = 0,
  165. .base_values = emi_base,
  166. .n_base_values = ARRAY_SIZE(emi_base),
  167. }
  168. };
  169. static const struct en_clk_desc en7581_base_clks[] = {
  170. {
  171. .id = EN7523_CLK_GSW,
  172. .name = "gsw",
  173. .base_reg = REG_GSW_CLK_DIV_SEL,
  174. .base_bits = 1,
  175. .base_shift = 8,
  176. .base_values = gsw_base,
  177. .n_base_values = ARRAY_SIZE(gsw_base),
  178. .div_bits = 3,
  179. .div_shift = 0,
  180. .div_step = 1,
  181. .div_offset = 1,
  182. }, {
  183. .id = EN7523_CLK_EMI,
  184. .name = "emi",
  185. .base_reg = REG_EMI_CLK_DIV_SEL,
  186. .base_bits = 2,
  187. .base_shift = 8,
  188. .base_values = emi7581_base,
  189. .n_base_values = ARRAY_SIZE(emi7581_base),
  190. .div_bits = 3,
  191. .div_shift = 0,
  192. .div_step = 1,
  193. .div_offset = 1,
  194. }, {
  195. .id = EN7523_CLK_BUS,
  196. .name = "bus",
  197. .base_reg = REG_BUS_CLK_DIV_SEL,
  198. .base_bits = 1,
  199. .base_shift = 8,
  200. .base_values = bus7581_base,
  201. .n_base_values = ARRAY_SIZE(bus7581_base),
  202. .div_bits = 3,
  203. .div_shift = 0,
  204. .div_step = 1,
  205. .div_offset = 1,
  206. }, {
  207. .id = EN7523_CLK_SLIC,
  208. .name = "slic",
  209. .base_reg = REG_SPI_CLK_FREQ_SEL,
  210. .base_bits = 1,
  211. .base_shift = 0,
  212. .base_values = slic_base,
  213. .n_base_values = ARRAY_SIZE(slic_base),
  214. .div_reg = REG_SPI_CLK_DIV_SEL,
  215. .div_bits = 5,
  216. .div_shift = 24,
  217. .div_val0 = 20,
  218. .div_step = 2,
  219. }, {
  220. .id = EN7523_CLK_SPI,
  221. .name = "spi",
  222. .base_reg = REG_SPI_CLK_DIV_SEL,
  223. .base_value = 400000000,
  224. .div_bits = 5,
  225. .div_shift = 8,
  226. .div_val0 = 40,
  227. .div_step = 2,
  228. }, {
  229. .id = EN7523_CLK_NPU,
  230. .name = "npu",
  231. .base_reg = REG_NPU_CLK_DIV_SEL,
  232. .base_bits = 2,
  233. .base_shift = 8,
  234. .base_values = npu7581_base,
  235. .n_base_values = ARRAY_SIZE(npu7581_base),
  236. .div_bits = 3,
  237. .div_shift = 0,
  238. .div_step = 1,
  239. .div_offset = 1,
  240. }, {
  241. .id = EN7523_CLK_CRYPTO,
  242. .name = "crypto",
  243. .base_reg = REG_CRYPTO_CLKSRC2,
  244. .base_bits = 1,
  245. .base_shift = 0,
  246. .base_values = crypto_base,
  247. .n_base_values = ARRAY_SIZE(crypto_base),
  248. }
  249. };
  250. static const u16 en7581_rst_ofs[] = {
  251. REG_RST_CTRL2,
  252. REG_RST_CTRL1,
  253. };
  254. static const u16 en7581_rst_map[] = {
  255. /* RST_CTRL2 */
  256. [EN7581_XPON_PHY_RST] = 0,
  257. [EN7581_CPU_TIMER2_RST] = 2,
  258. [EN7581_HSUART_RST] = 3,
  259. [EN7581_UART4_RST] = 4,
  260. [EN7581_UART5_RST] = 5,
  261. [EN7581_I2C2_RST] = 6,
  262. [EN7581_XSI_MAC_RST] = 7,
  263. [EN7581_XSI_PHY_RST] = 8,
  264. [EN7581_NPU_RST] = 9,
  265. [EN7581_I2S_RST] = 10,
  266. [EN7581_TRNG_RST] = 11,
  267. [EN7581_TRNG_MSTART_RST] = 12,
  268. [EN7581_DUAL_HSI0_RST] = 13,
  269. [EN7581_DUAL_HSI1_RST] = 14,
  270. [EN7581_HSI_RST] = 15,
  271. [EN7581_DUAL_HSI0_MAC_RST] = 16,
  272. [EN7581_DUAL_HSI1_MAC_RST] = 17,
  273. [EN7581_HSI_MAC_RST] = 18,
  274. [EN7581_WDMA_RST] = 19,
  275. [EN7581_WOE0_RST] = 20,
  276. [EN7581_WOE1_RST] = 21,
  277. [EN7581_HSDMA_RST] = 22,
  278. [EN7581_TDMA_RST] = 24,
  279. [EN7581_EMMC_RST] = 25,
  280. [EN7581_SOE_RST] = 26,
  281. [EN7581_PCIE2_RST] = 27,
  282. [EN7581_XFP_MAC_RST] = 28,
  283. [EN7581_USB_HOST_P1_RST] = 29,
  284. [EN7581_USB_HOST_P1_U3_PHY_RST] = 30,
  285. /* RST_CTRL1 */
  286. [EN7581_PCM1_ZSI_ISI_RST] = RST_NR_PER_BANK + 0,
  287. [EN7581_FE_PDMA_RST] = RST_NR_PER_BANK + 1,
  288. [EN7581_FE_QDMA_RST] = RST_NR_PER_BANK + 2,
  289. [EN7581_PCM_SPIWP_RST] = RST_NR_PER_BANK + 4,
  290. [EN7581_CRYPTO_RST] = RST_NR_PER_BANK + 6,
  291. [EN7581_TIMER_RST] = RST_NR_PER_BANK + 8,
  292. [EN7581_PCM1_RST] = RST_NR_PER_BANK + 11,
  293. [EN7581_UART_RST] = RST_NR_PER_BANK + 12,
  294. [EN7581_GPIO_RST] = RST_NR_PER_BANK + 13,
  295. [EN7581_GDMA_RST] = RST_NR_PER_BANK + 14,
  296. [EN7581_I2C_MASTER_RST] = RST_NR_PER_BANK + 16,
  297. [EN7581_PCM2_ZSI_ISI_RST] = RST_NR_PER_BANK + 17,
  298. [EN7581_SFC_RST] = RST_NR_PER_BANK + 18,
  299. [EN7581_UART2_RST] = RST_NR_PER_BANK + 19,
  300. [EN7581_GDMP_RST] = RST_NR_PER_BANK + 20,
  301. [EN7581_FE_RST] = RST_NR_PER_BANK + 21,
  302. [EN7581_USB_HOST_P0_RST] = RST_NR_PER_BANK + 22,
  303. [EN7581_GSW_RST] = RST_NR_PER_BANK + 23,
  304. [EN7581_SFC2_PCM_RST] = RST_NR_PER_BANK + 25,
  305. [EN7581_PCIE0_RST] = RST_NR_PER_BANK + 26,
  306. [EN7581_PCIE1_RST] = RST_NR_PER_BANK + 27,
  307. [EN7581_CPU_TIMER_RST] = RST_NR_PER_BANK + 28,
  308. [EN7581_PCIE_HB_RST] = RST_NR_PER_BANK + 29,
  309. [EN7581_XPON_MAC_RST] = RST_NR_PER_BANK + 31,
  310. };
  311. static u32 en7523_get_base_rate(const struct en_clk_desc *desc, u32 val)
  312. {
  313. if (!desc->base_bits)
  314. return desc->base_value;
  315. val >>= desc->base_shift;
  316. val &= (1 << desc->base_bits) - 1;
  317. if (val >= desc->n_base_values)
  318. return 0;
  319. return desc->base_values[val];
  320. }
  321. static u32 en7523_get_div(const struct en_clk_desc *desc, u32 val)
  322. {
  323. if (!desc->div_bits)
  324. return 1;
  325. val >>= desc->div_shift;
  326. val &= (1 << desc->div_bits) - 1;
  327. if (!val && desc->div_val0)
  328. return desc->div_val0;
  329. return (val + desc->div_offset) * desc->div_step;
  330. }
  331. static int en7523_pci_is_enabled(struct clk_hw *hw)
  332. {
  333. struct en_clk_gate *cg = container_of(hw, struct en_clk_gate, hw);
  334. return !!(readl(cg->base + REG_PCI_CONTROL) & REG_PCI_CONTROL_REFCLK_EN1);
  335. }
  336. static int en7523_pci_prepare(struct clk_hw *hw)
  337. {
  338. struct en_clk_gate *cg = container_of(hw, struct en_clk_gate, hw);
  339. void __iomem *np_base = cg->base;
  340. u32 val, mask;
  341. /* Need to pull device low before reset */
  342. val = readl(np_base + REG_PCI_CONTROL);
  343. val &= ~(REG_PCI_CONTROL_PERSTOUT1 | REG_PCI_CONTROL_PERSTOUT);
  344. writel(val, np_base + REG_PCI_CONTROL);
  345. usleep_range(1000, 2000);
  346. /* Enable PCIe port 1 */
  347. val |= REG_PCI_CONTROL_REFCLK_EN1;
  348. writel(val, np_base + REG_PCI_CONTROL);
  349. usleep_range(1000, 2000);
  350. /* Reset to default */
  351. val = readl(np_base + REG_RESET_CONTROL1);
  352. mask = REG_RESET_CONTROL_PCIE1 | REG_RESET_CONTROL_PCIE2 |
  353. REG_RESET_CONTROL_PCIEHB;
  354. writel(val & ~mask, np_base + REG_RESET_CONTROL1);
  355. usleep_range(1000, 2000);
  356. writel(val | mask, np_base + REG_RESET_CONTROL1);
  357. msleep(100);
  358. writel(val & ~mask, np_base + REG_RESET_CONTROL1);
  359. usleep_range(5000, 10000);
  360. /* Release device */
  361. mask = REG_PCI_CONTROL_PERSTOUT1 | REG_PCI_CONTROL_PERSTOUT;
  362. val = readl(np_base + REG_PCI_CONTROL);
  363. writel(val & ~mask, np_base + REG_PCI_CONTROL);
  364. usleep_range(1000, 2000);
  365. writel(val | mask, np_base + REG_PCI_CONTROL);
  366. msleep(250);
  367. return 0;
  368. }
  369. static void en7523_pci_unprepare(struct clk_hw *hw)
  370. {
  371. struct en_clk_gate *cg = container_of(hw, struct en_clk_gate, hw);
  372. void __iomem *np_base = cg->base;
  373. u32 val;
  374. val = readl(np_base + REG_PCI_CONTROL);
  375. val &= ~REG_PCI_CONTROL_REFCLK_EN1;
  376. writel(val, np_base + REG_PCI_CONTROL);
  377. }
  378. static struct clk_hw *en7523_register_pcie_clk(struct device *dev,
  379. void __iomem *np_base)
  380. {
  381. const struct en_clk_soc_data *soc_data = device_get_match_data(dev);
  382. struct clk_init_data init = {
  383. .name = "pcie",
  384. .ops = &soc_data->pcie_ops,
  385. };
  386. struct en_clk_gate *cg;
  387. cg = devm_kzalloc(dev, sizeof(*cg), GFP_KERNEL);
  388. if (!cg)
  389. return NULL;
  390. cg->base = np_base;
  391. cg->hw.init = &init;
  392. if (init.ops->unprepare)
  393. init.ops->unprepare(&cg->hw);
  394. if (clk_hw_register(dev, &cg->hw))
  395. return NULL;
  396. return &cg->hw;
  397. }
  398. static int en7581_pci_is_enabled(struct clk_hw *hw)
  399. {
  400. struct en_clk_gate *cg = container_of(hw, struct en_clk_gate, hw);
  401. u32 val, mask;
  402. mask = REG_PCI_CONTROL_REFCLK_EN0 | REG_PCI_CONTROL_REFCLK_EN1;
  403. val = readl(cg->base + REG_PCI_CONTROL);
  404. return (val & mask) == mask;
  405. }
  406. static int en7581_pci_enable(struct clk_hw *hw)
  407. {
  408. struct en_clk_gate *cg = container_of(hw, struct en_clk_gate, hw);
  409. void __iomem *np_base = cg->base;
  410. u32 val, mask;
  411. mask = REG_PCI_CONTROL_REFCLK_EN0 | REG_PCI_CONTROL_REFCLK_EN1 |
  412. REG_PCI_CONTROL_PERSTOUT1 | REG_PCI_CONTROL_PERSTOUT2 |
  413. REG_PCI_CONTROL_PERSTOUT;
  414. val = readl(np_base + REG_PCI_CONTROL);
  415. writel(val | mask, np_base + REG_PCI_CONTROL);
  416. msleep(250);
  417. return 0;
  418. }
  419. static void en7581_pci_disable(struct clk_hw *hw)
  420. {
  421. struct en_clk_gate *cg = container_of(hw, struct en_clk_gate, hw);
  422. void __iomem *np_base = cg->base;
  423. u32 val, mask;
  424. mask = REG_PCI_CONTROL_REFCLK_EN0 | REG_PCI_CONTROL_REFCLK_EN1 |
  425. REG_PCI_CONTROL_PERSTOUT1 | REG_PCI_CONTROL_PERSTOUT2 |
  426. REG_PCI_CONTROL_PERSTOUT;
  427. val = readl(np_base + REG_PCI_CONTROL);
  428. writel(val & ~mask, np_base + REG_PCI_CONTROL);
  429. usleep_range(1000, 2000);
  430. }
  431. static void en7523_register_clocks(struct device *dev, struct clk_hw_onecell_data *clk_data,
  432. void __iomem *base, void __iomem *np_base)
  433. {
  434. struct clk_hw *hw;
  435. u32 rate;
  436. int i;
  437. clk_data->num = EN7523_NUM_CLOCKS;
  438. for (i = 0; i < ARRAY_SIZE(en7523_base_clks); i++) {
  439. const struct en_clk_desc *desc = &en7523_base_clks[i];
  440. u32 reg = desc->div_reg ? desc->div_reg : desc->base_reg;
  441. u32 val = readl(base + desc->base_reg);
  442. rate = en7523_get_base_rate(desc, val);
  443. val = readl(base + reg);
  444. rate /= en7523_get_div(desc, val);
  445. hw = clk_hw_register_fixed_rate(dev, desc->name, NULL, 0, rate);
  446. if (IS_ERR(hw)) {
  447. pr_err("Failed to register clk %s: %ld\n",
  448. desc->name, PTR_ERR(hw));
  449. continue;
  450. }
  451. clk_data->hws[desc->id] = hw;
  452. }
  453. hw = en7523_register_pcie_clk(dev, np_base);
  454. clk_data->hws[EN7523_CLK_PCIE] = hw;
  455. }
  456. static int en7523_clk_hw_init(struct platform_device *pdev,
  457. struct clk_hw_onecell_data *clk_data)
  458. {
  459. void __iomem *base, *np_base;
  460. base = devm_platform_ioremap_resource(pdev, 0);
  461. if (IS_ERR(base))
  462. return PTR_ERR(base);
  463. np_base = devm_platform_ioremap_resource(pdev, 1);
  464. if (IS_ERR(np_base))
  465. return PTR_ERR(np_base);
  466. en7523_register_clocks(&pdev->dev, clk_data, base, np_base);
  467. return 0;
  468. }
  469. static void en7581_register_clocks(struct device *dev, struct clk_hw_onecell_data *clk_data,
  470. struct regmap *map, void __iomem *base)
  471. {
  472. struct clk_hw *hw;
  473. u32 rate;
  474. int i;
  475. for (i = 0; i < ARRAY_SIZE(en7581_base_clks); i++) {
  476. const struct en_clk_desc *desc = &en7581_base_clks[i];
  477. u32 val, reg = desc->div_reg ? desc->div_reg : desc->base_reg;
  478. int err;
  479. err = regmap_read(map, desc->base_reg, &val);
  480. if (err) {
  481. pr_err("Failed reading fixed clk rate %s: %d\n",
  482. desc->name, err);
  483. continue;
  484. }
  485. rate = en7523_get_base_rate(desc, val);
  486. err = regmap_read(map, reg, &val);
  487. if (err) {
  488. pr_err("Failed reading fixed clk div %s: %d\n",
  489. desc->name, err);
  490. continue;
  491. }
  492. rate /= en7523_get_div(desc, val);
  493. hw = clk_hw_register_fixed_rate(dev, desc->name, NULL, 0, rate);
  494. if (IS_ERR(hw)) {
  495. pr_err("Failed to register clk %s: %ld\n",
  496. desc->name, PTR_ERR(hw));
  497. continue;
  498. }
  499. clk_data->hws[desc->id] = hw;
  500. }
  501. hw = en7523_register_pcie_clk(dev, base);
  502. clk_data->hws[EN7523_CLK_PCIE] = hw;
  503. clk_data->num = EN7523_NUM_CLOCKS;
  504. }
  505. static int en7581_clk_hw_init(struct platform_device *pdev,
  506. struct clk_hw_onecell_data *clk_data)
  507. {
  508. void __iomem *np_base;
  509. struct regmap *map;
  510. u32 val;
  511. map = syscon_regmap_lookup_by_compatible("airoha,en7581-chip-scu");
  512. if (IS_ERR(map))
  513. return PTR_ERR(map);
  514. np_base = devm_platform_ioremap_resource(pdev, 0);
  515. if (IS_ERR(np_base))
  516. return PTR_ERR(np_base);
  517. en7581_register_clocks(&pdev->dev, clk_data, map, np_base);
  518. val = readl(np_base + REG_NP_SCU_SSTR);
  519. val &= ~(REG_PCIE_XSI0_SEL_MASK | REG_PCIE_XSI1_SEL_MASK);
  520. writel(val, np_base + REG_NP_SCU_SSTR);
  521. val = readl(np_base + REG_NP_SCU_PCIC);
  522. writel(val | 3, np_base + REG_NP_SCU_PCIC);
  523. return 0;
  524. }
  525. static int en7523_reset_update(struct reset_controller_dev *rcdev,
  526. unsigned long id, bool assert)
  527. {
  528. struct en_rst_data *rst_data = container_of(rcdev, struct en_rst_data, rcdev);
  529. void __iomem *addr = rst_data->base + rst_data->bank_ofs[id / RST_NR_PER_BANK];
  530. u32 val;
  531. val = readl(addr);
  532. if (assert)
  533. val |= BIT(id % RST_NR_PER_BANK);
  534. else
  535. val &= ~BIT(id % RST_NR_PER_BANK);
  536. writel(val, addr);
  537. return 0;
  538. }
  539. static int en7523_reset_assert(struct reset_controller_dev *rcdev,
  540. unsigned long id)
  541. {
  542. return en7523_reset_update(rcdev, id, true);
  543. }
  544. static int en7523_reset_deassert(struct reset_controller_dev *rcdev,
  545. unsigned long id)
  546. {
  547. return en7523_reset_update(rcdev, id, false);
  548. }
  549. static int en7523_reset_status(struct reset_controller_dev *rcdev,
  550. unsigned long id)
  551. {
  552. struct en_rst_data *rst_data = container_of(rcdev, struct en_rst_data, rcdev);
  553. void __iomem *addr = rst_data->base + rst_data->bank_ofs[id / RST_NR_PER_BANK];
  554. return !!(readl(addr) & BIT(id % RST_NR_PER_BANK));
  555. }
  556. static int en7523_reset_xlate(struct reset_controller_dev *rcdev,
  557. const struct of_phandle_args *reset_spec)
  558. {
  559. struct en_rst_data *rst_data = container_of(rcdev, struct en_rst_data, rcdev);
  560. if (reset_spec->args[0] >= rcdev->nr_resets)
  561. return -EINVAL;
  562. return rst_data->idx_map[reset_spec->args[0]];
  563. }
  564. static const struct reset_control_ops en7523_reset_ops = {
  565. .assert = en7523_reset_assert,
  566. .deassert = en7523_reset_deassert,
  567. .status = en7523_reset_status,
  568. };
  569. static int en7523_reset_register(struct platform_device *pdev,
  570. const struct en_clk_soc_data *soc_data)
  571. {
  572. struct device *dev = &pdev->dev;
  573. struct en_rst_data *rst_data;
  574. void __iomem *base;
  575. /* no reset lines available */
  576. if (!soc_data->reset.idx_map_nr)
  577. return 0;
  578. base = devm_platform_ioremap_resource(pdev, 1);
  579. if (IS_ERR(base))
  580. return PTR_ERR(base);
  581. rst_data = devm_kzalloc(dev, sizeof(*rst_data), GFP_KERNEL);
  582. if (!rst_data)
  583. return -ENOMEM;
  584. rst_data->bank_ofs = soc_data->reset.bank_ofs;
  585. rst_data->idx_map = soc_data->reset.idx_map;
  586. rst_data->base = base;
  587. rst_data->rcdev.nr_resets = soc_data->reset.idx_map_nr;
  588. rst_data->rcdev.of_xlate = en7523_reset_xlate;
  589. rst_data->rcdev.ops = &en7523_reset_ops;
  590. rst_data->rcdev.of_node = dev->of_node;
  591. rst_data->rcdev.of_reset_n_cells = 1;
  592. rst_data->rcdev.owner = THIS_MODULE;
  593. rst_data->rcdev.dev = dev;
  594. return devm_reset_controller_register(dev, &rst_data->rcdev);
  595. }
  596. static int en7523_clk_probe(struct platform_device *pdev)
  597. {
  598. struct device_node *node = pdev->dev.of_node;
  599. const struct en_clk_soc_data *soc_data;
  600. struct clk_hw_onecell_data *clk_data;
  601. int r;
  602. clk_data = devm_kzalloc(&pdev->dev,
  603. struct_size(clk_data, hws, EN7523_NUM_CLOCKS),
  604. GFP_KERNEL);
  605. if (!clk_data)
  606. return -ENOMEM;
  607. soc_data = device_get_match_data(&pdev->dev);
  608. r = soc_data->hw_init(pdev, clk_data);
  609. if (r)
  610. return r;
  611. r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
  612. if (r)
  613. return dev_err_probe(&pdev->dev, r, "Could not register clock provider: %s\n",
  614. pdev->name);
  615. r = en7523_reset_register(pdev, soc_data);
  616. if (r) {
  617. of_clk_del_provider(node);
  618. return dev_err_probe(&pdev->dev, r, "Could not register reset controller: %s\n",
  619. pdev->name);
  620. }
  621. return 0;
  622. }
  623. static const struct en_clk_soc_data en7523_data = {
  624. .pcie_ops = {
  625. .is_enabled = en7523_pci_is_enabled,
  626. .prepare = en7523_pci_prepare,
  627. .unprepare = en7523_pci_unprepare,
  628. },
  629. .hw_init = en7523_clk_hw_init,
  630. };
  631. static const struct en_clk_soc_data en7581_data = {
  632. .pcie_ops = {
  633. .is_enabled = en7581_pci_is_enabled,
  634. .enable = en7581_pci_enable,
  635. .disable = en7581_pci_disable,
  636. },
  637. .reset = {
  638. .bank_ofs = en7581_rst_ofs,
  639. .idx_map = en7581_rst_map,
  640. .idx_map_nr = ARRAY_SIZE(en7581_rst_map),
  641. },
  642. .hw_init = en7581_clk_hw_init,
  643. };
  644. static const struct of_device_id of_match_clk_en7523[] = {
  645. { .compatible = "airoha,en7523-scu", .data = &en7523_data },
  646. { .compatible = "airoha,en7581-scu", .data = &en7581_data },
  647. { /* sentinel */ }
  648. };
  649. static struct platform_driver clk_en7523_drv = {
  650. .probe = en7523_clk_probe,
  651. .driver = {
  652. .name = "clk-en7523",
  653. .of_match_table = of_match_clk_en7523,
  654. .suppress_bind_attrs = true,
  655. },
  656. };
  657. static int __init clk_en7523_init(void)
  658. {
  659. return platform_driver_register(&clk_en7523_drv);
  660. }
  661. arch_initcall(clk_en7523_init);