spmi-mtk-pmif.c 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866
  1. // SPDX-License-Identifier: GPL-2.0
  2. //
  3. // Copyright (c) 2021 MediaTek Inc.
  4. // Copyright (c) 2025 Collabora Ltd
  5. // AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
  6. #include <linux/clk.h>
  7. #include <linux/interrupt.h>
  8. #include <linux/iopoll.h>
  9. #include <linux/irq.h>
  10. #include <linux/irqdomain.h>
  11. #include <linux/module.h>
  12. #include <linux/of.h>
  13. #include <linux/of_irq.h>
  14. #include <linux/platform_device.h>
  15. #include <linux/property.h>
  16. #include <linux/spmi.h>
  17. #include <linux/irqchip/chained_irq.h>
  18. #define SWINF_IDLE 0x00
  19. #define SWINF_WFVLDCLR 0x06
  20. #define GET_SWINF(x) (((x) >> 1) & 0x7)
  21. #define PMIF_CMD_REG_0 0
  22. #define PMIF_CMD_REG 1
  23. #define PMIF_CMD_EXT_REG 2
  24. #define PMIF_CMD_EXT_REG_LONG 3
  25. #define PMIF_DELAY_US 2
  26. #define PMIF_TIMEOUT_US (10 * 1000)
  27. #define PMIF_CHAN_OFFSET 0x5
  28. #define PMIF_RCS_IRQ_MASK GENMASK(7, 0)
  29. #define PMIF_MAX_BUSES 2
  30. #define PMIF_MAX_CLKS 3
  31. #define SPMI_OP_ST_BUSY 1
  32. struct ch_reg {
  33. u32 ch_sta;
  34. u32 wdata;
  35. u32 rdata;
  36. u32 ch_send;
  37. u32 ch_rdy;
  38. };
  39. struct pmif_data {
  40. const u32 *regs;
  41. const u32 *spmimst_regs;
  42. u32 soc_chan;
  43. u8 spmi_ver;
  44. u32 num_spmi_buses;
  45. };
  46. struct pmif_bus {
  47. void __iomem *base;
  48. void __iomem *spmimst_base;
  49. struct spmi_controller *ctrl;
  50. struct irq_domain *dom;
  51. int irq;
  52. struct clk_bulk_data clks[PMIF_MAX_CLKS];
  53. size_t nclks;
  54. u8 irq_min_sid;
  55. u8 irq_max_sid;
  56. u16 irq_en;
  57. raw_spinlock_t lock;
  58. };
  59. struct pmif {
  60. struct pmif_bus bus[PMIF_MAX_BUSES];
  61. struct ch_reg chan;
  62. const struct pmif_data *data;
  63. };
  64. static const char * const pmif_clock_names[] = {
  65. "pmif_sys_ck", "pmif_tmr_ck", "spmimst_clk_mux",
  66. };
  67. enum pmif_regs {
  68. PMIF_INIT_DONE,
  69. PMIF_INF_EN,
  70. PMIF_ARB_EN,
  71. PMIF_CMDISSUE_EN,
  72. PMIF_TIMER_CTRL,
  73. PMIF_SPI_MODE_CTRL,
  74. PMIF_IRQ_EVENT_EN_0,
  75. PMIF_IRQ_FLAG_0,
  76. PMIF_IRQ_CLR_0,
  77. PMIF_IRQ_EVENT_EN_1,
  78. PMIF_IRQ_FLAG_1,
  79. PMIF_IRQ_CLR_1,
  80. PMIF_IRQ_EVENT_EN_2,
  81. PMIF_IRQ_FLAG_2,
  82. PMIF_IRQ_CLR_2,
  83. PMIF_IRQ_EVENT_EN_3,
  84. PMIF_IRQ_FLAG_3,
  85. PMIF_IRQ_CLR_3,
  86. PMIF_IRQ_EVENT_EN_4,
  87. PMIF_IRQ_FLAG_4,
  88. PMIF_IRQ_CLR_4,
  89. PMIF_WDT_EVENT_EN_0,
  90. PMIF_WDT_FLAG_0,
  91. PMIF_WDT_EVENT_EN_1,
  92. PMIF_WDT_FLAG_1,
  93. PMIF_SWINF_0_STA,
  94. PMIF_SWINF_0_WDATA_31_0,
  95. PMIF_SWINF_0_RDATA_31_0,
  96. PMIF_SWINF_0_ACC,
  97. PMIF_SWINF_0_VLD_CLR,
  98. PMIF_SWINF_1_STA,
  99. PMIF_SWINF_1_WDATA_31_0,
  100. PMIF_SWINF_1_RDATA_31_0,
  101. PMIF_SWINF_1_ACC,
  102. PMIF_SWINF_1_VLD_CLR,
  103. PMIF_SWINF_2_STA,
  104. PMIF_SWINF_2_WDATA_31_0,
  105. PMIF_SWINF_2_RDATA_31_0,
  106. PMIF_SWINF_2_ACC,
  107. PMIF_SWINF_2_VLD_CLR,
  108. PMIF_SWINF_3_STA,
  109. PMIF_SWINF_3_WDATA_31_0,
  110. PMIF_SWINF_3_RDATA_31_0,
  111. PMIF_SWINF_3_ACC,
  112. PMIF_SWINF_3_VLD_CLR,
  113. };
  114. static const u32 mt6873_regs[] = {
  115. [PMIF_INIT_DONE] = 0x0000,
  116. [PMIF_INF_EN] = 0x0024,
  117. [PMIF_ARB_EN] = 0x0150,
  118. [PMIF_CMDISSUE_EN] = 0x03B4,
  119. [PMIF_TIMER_CTRL] = 0x03E0,
  120. [PMIF_SPI_MODE_CTRL] = 0x0400,
  121. [PMIF_IRQ_EVENT_EN_0] = 0x0418,
  122. [PMIF_IRQ_FLAG_0] = 0x0420,
  123. [PMIF_IRQ_CLR_0] = 0x0424,
  124. [PMIF_IRQ_EVENT_EN_1] = 0x0428,
  125. [PMIF_IRQ_FLAG_1] = 0x0430,
  126. [PMIF_IRQ_CLR_1] = 0x0434,
  127. [PMIF_IRQ_EVENT_EN_2] = 0x0438,
  128. [PMIF_IRQ_FLAG_2] = 0x0440,
  129. [PMIF_IRQ_CLR_2] = 0x0444,
  130. [PMIF_IRQ_EVENT_EN_3] = 0x0448,
  131. [PMIF_IRQ_FLAG_3] = 0x0450,
  132. [PMIF_IRQ_CLR_3] = 0x0454,
  133. [PMIF_IRQ_EVENT_EN_4] = 0x0458,
  134. [PMIF_IRQ_FLAG_4] = 0x0460,
  135. [PMIF_IRQ_CLR_4] = 0x0464,
  136. [PMIF_WDT_EVENT_EN_0] = 0x046C,
  137. [PMIF_WDT_FLAG_0] = 0x0470,
  138. [PMIF_WDT_EVENT_EN_1] = 0x0474,
  139. [PMIF_WDT_FLAG_1] = 0x0478,
  140. [PMIF_SWINF_0_ACC] = 0x0C00,
  141. [PMIF_SWINF_0_WDATA_31_0] = 0x0C04,
  142. [PMIF_SWINF_0_RDATA_31_0] = 0x0C14,
  143. [PMIF_SWINF_0_VLD_CLR] = 0x0C24,
  144. [PMIF_SWINF_0_STA] = 0x0C28,
  145. [PMIF_SWINF_1_ACC] = 0x0C40,
  146. [PMIF_SWINF_1_WDATA_31_0] = 0x0C44,
  147. [PMIF_SWINF_1_RDATA_31_0] = 0x0C54,
  148. [PMIF_SWINF_1_VLD_CLR] = 0x0C64,
  149. [PMIF_SWINF_1_STA] = 0x0C68,
  150. [PMIF_SWINF_2_ACC] = 0x0C80,
  151. [PMIF_SWINF_2_WDATA_31_0] = 0x0C84,
  152. [PMIF_SWINF_2_RDATA_31_0] = 0x0C94,
  153. [PMIF_SWINF_2_VLD_CLR] = 0x0CA4,
  154. [PMIF_SWINF_2_STA] = 0x0CA8,
  155. [PMIF_SWINF_3_ACC] = 0x0CC0,
  156. [PMIF_SWINF_3_WDATA_31_0] = 0x0CC4,
  157. [PMIF_SWINF_3_RDATA_31_0] = 0x0CD4,
  158. [PMIF_SWINF_3_VLD_CLR] = 0x0CE4,
  159. [PMIF_SWINF_3_STA] = 0x0CE8,
  160. };
  161. static const u32 mt8195_regs[] = {
  162. [PMIF_INIT_DONE] = 0x0000,
  163. [PMIF_INF_EN] = 0x0024,
  164. [PMIF_ARB_EN] = 0x0150,
  165. [PMIF_CMDISSUE_EN] = 0x03B8,
  166. [PMIF_TIMER_CTRL] = 0x03E4,
  167. [PMIF_SPI_MODE_CTRL] = 0x0408,
  168. [PMIF_IRQ_EVENT_EN_0] = 0x0420,
  169. [PMIF_IRQ_FLAG_0] = 0x0428,
  170. [PMIF_IRQ_CLR_0] = 0x042C,
  171. [PMIF_IRQ_EVENT_EN_1] = 0x0430,
  172. [PMIF_IRQ_FLAG_1] = 0x0438,
  173. [PMIF_IRQ_CLR_1] = 0x043C,
  174. [PMIF_IRQ_EVENT_EN_2] = 0x0440,
  175. [PMIF_IRQ_FLAG_2] = 0x0448,
  176. [PMIF_IRQ_CLR_2] = 0x044C,
  177. [PMIF_IRQ_EVENT_EN_3] = 0x0450,
  178. [PMIF_IRQ_FLAG_3] = 0x0458,
  179. [PMIF_IRQ_CLR_3] = 0x045C,
  180. [PMIF_IRQ_EVENT_EN_4] = 0x0460,
  181. [PMIF_IRQ_FLAG_4] = 0x0468,
  182. [PMIF_IRQ_CLR_4] = 0x046C,
  183. [PMIF_WDT_EVENT_EN_0] = 0x0474,
  184. [PMIF_WDT_FLAG_0] = 0x0478,
  185. [PMIF_WDT_EVENT_EN_1] = 0x047C,
  186. [PMIF_WDT_FLAG_1] = 0x0480,
  187. [PMIF_SWINF_0_ACC] = 0x0800,
  188. [PMIF_SWINF_0_WDATA_31_0] = 0x0804,
  189. [PMIF_SWINF_0_RDATA_31_0] = 0x0814,
  190. [PMIF_SWINF_0_VLD_CLR] = 0x0824,
  191. [PMIF_SWINF_0_STA] = 0x0828,
  192. [PMIF_SWINF_1_ACC] = 0x0840,
  193. [PMIF_SWINF_1_WDATA_31_0] = 0x0844,
  194. [PMIF_SWINF_1_RDATA_31_0] = 0x0854,
  195. [PMIF_SWINF_1_VLD_CLR] = 0x0864,
  196. [PMIF_SWINF_1_STA] = 0x0868,
  197. [PMIF_SWINF_2_ACC] = 0x0880,
  198. [PMIF_SWINF_2_WDATA_31_0] = 0x0884,
  199. [PMIF_SWINF_2_RDATA_31_0] = 0x0894,
  200. [PMIF_SWINF_2_VLD_CLR] = 0x08A4,
  201. [PMIF_SWINF_2_STA] = 0x08A8,
  202. [PMIF_SWINF_3_ACC] = 0x08C0,
  203. [PMIF_SWINF_3_WDATA_31_0] = 0x08C4,
  204. [PMIF_SWINF_3_RDATA_31_0] = 0x08D4,
  205. [PMIF_SWINF_3_VLD_CLR] = 0x08E4,
  206. [PMIF_SWINF_3_STA] = 0x08E8,
  207. };
  208. enum spmi_regs {
  209. SPMI_OP_ST_CTRL,
  210. SPMI_GRP_ID_EN,
  211. SPMI_OP_ST_STA,
  212. SPMI_MST_SAMPL,
  213. SPMI_MST_REQ_EN,
  214. SPMI_REC_CTRL,
  215. SPMI_REC0,
  216. SPMI_REC1,
  217. SPMI_REC2,
  218. SPMI_REC3,
  219. SPMI_REC4,
  220. SPMI_MST_DBG,
  221. /* MT8195 spmi regs */
  222. SPMI_MST_RCS_CTRL,
  223. SPMI_SLV_3_0_EINT,
  224. SPMI_SLV_7_4_EINT,
  225. SPMI_SLV_B_8_EINT,
  226. SPMI_SLV_F_C_EINT,
  227. SPMI_REC_CMD_DEC,
  228. SPMI_DEC_DBG,
  229. };
  230. static const u32 mt6873_spmi_regs[] = {
  231. [SPMI_OP_ST_CTRL] = 0x0000,
  232. [SPMI_GRP_ID_EN] = 0x0004,
  233. [SPMI_OP_ST_STA] = 0x0008,
  234. [SPMI_MST_SAMPL] = 0x000c,
  235. [SPMI_MST_REQ_EN] = 0x0010,
  236. [SPMI_REC_CTRL] = 0x0040,
  237. [SPMI_REC0] = 0x0044,
  238. [SPMI_REC1] = 0x0048,
  239. [SPMI_REC2] = 0x004c,
  240. [SPMI_REC3] = 0x0050,
  241. [SPMI_REC4] = 0x0054,
  242. [SPMI_MST_DBG] = 0x00fc,
  243. };
  244. static const u32 mt8195_spmi_regs[] = {
  245. [SPMI_OP_ST_CTRL] = 0x0000,
  246. [SPMI_GRP_ID_EN] = 0x0004,
  247. [SPMI_OP_ST_STA] = 0x0008,
  248. [SPMI_MST_SAMPL] = 0x000C,
  249. [SPMI_MST_REQ_EN] = 0x0010,
  250. [SPMI_MST_RCS_CTRL] = 0x0014,
  251. [SPMI_SLV_3_0_EINT] = 0x0020,
  252. [SPMI_SLV_7_4_EINT] = 0x0024,
  253. [SPMI_SLV_B_8_EINT] = 0x0028,
  254. [SPMI_SLV_F_C_EINT] = 0x002C,
  255. [SPMI_REC_CTRL] = 0x0040,
  256. [SPMI_REC0] = 0x0044,
  257. [SPMI_REC1] = 0x0048,
  258. [SPMI_REC2] = 0x004C,
  259. [SPMI_REC3] = 0x0050,
  260. [SPMI_REC4] = 0x0054,
  261. [SPMI_REC_CMD_DEC] = 0x005C,
  262. [SPMI_DEC_DBG] = 0x00F8,
  263. [SPMI_MST_DBG] = 0x00FC,
  264. };
  265. static inline struct pmif *to_mtk_pmif(struct spmi_controller *ctrl)
  266. {
  267. return dev_get_drvdata(ctrl->dev.parent);
  268. }
  269. static u32 pmif_readl(struct pmif *arb, struct pmif_bus *pbus, enum pmif_regs reg)
  270. {
  271. return readl(pbus->base + arb->data->regs[reg]);
  272. }
  273. static void pmif_writel(struct pmif *arb, struct pmif_bus *pbus,
  274. u32 val, enum pmif_regs reg)
  275. {
  276. writel(val, pbus->base + arb->data->regs[reg]);
  277. }
  278. static u32 mtk_spmi_readl(struct pmif *arb, struct pmif_bus *pbus, enum spmi_regs reg)
  279. {
  280. return readl(pbus->spmimst_base + arb->data->spmimst_regs[reg]);
  281. }
  282. static void mtk_spmi_writel(struct pmif *arb, struct pmif_bus *pbus,
  283. u32 val, enum spmi_regs reg)
  284. {
  285. writel(val, pbus->spmimst_base + arb->data->spmimst_regs[reg]);
  286. }
  287. static bool pmif_is_fsm_vldclr(struct pmif *arb, struct pmif_bus *pbus)
  288. {
  289. u32 reg_rdata;
  290. reg_rdata = pmif_readl(arb, pbus, arb->chan.ch_sta);
  291. return GET_SWINF(reg_rdata) == SWINF_WFVLDCLR;
  292. }
  293. static int pmif_arb_cmd(struct spmi_controller *ctrl, u8 opc, u8 sid)
  294. {
  295. struct pmif_bus *pbus = spmi_controller_get_drvdata(ctrl);
  296. struct pmif *arb = to_mtk_pmif(ctrl);
  297. u32 rdata, cmd;
  298. int ret;
  299. /* Check the opcode */
  300. if (opc < SPMI_CMD_RESET || opc > SPMI_CMD_WAKEUP)
  301. return -EINVAL;
  302. cmd = opc - SPMI_CMD_RESET;
  303. mtk_spmi_writel(arb, pbus, (cmd << 0x4) | sid, SPMI_OP_ST_CTRL);
  304. ret = readl_poll_timeout_atomic(pbus->spmimst_base + arb->data->spmimst_regs[SPMI_OP_ST_STA],
  305. rdata, (rdata & SPMI_OP_ST_BUSY) == SPMI_OP_ST_BUSY,
  306. PMIF_DELAY_US, PMIF_TIMEOUT_US);
  307. if (ret < 0)
  308. dev_err(&ctrl->dev, "timeout, err = %d\n", ret);
  309. return ret;
  310. }
  311. static int pmif_spmi_read_cmd(struct spmi_controller *ctrl, u8 opc, u8 sid,
  312. u16 addr, u8 *buf, size_t len)
  313. {
  314. struct pmif_bus *pbus = spmi_controller_get_drvdata(ctrl);
  315. struct pmif *arb = to_mtk_pmif(ctrl);
  316. struct ch_reg *inf_reg;
  317. int ret;
  318. u32 data, cmd;
  319. unsigned long flags;
  320. /* Check for argument validation. */
  321. if (sid & ~0xf) {
  322. dev_err(&ctrl->dev, "exceed the max slv id\n");
  323. return -EINVAL;
  324. }
  325. if (len > 4) {
  326. dev_err(&ctrl->dev, "pmif supports 1..4 bytes per trans, but:%zu requested", len);
  327. return -EINVAL;
  328. }
  329. if (opc >= 0x60 && opc <= 0x7f)
  330. opc = PMIF_CMD_REG;
  331. else if ((opc >= 0x20 && opc <= 0x2f) || (opc >= 0x38 && opc <= 0x3f))
  332. opc = PMIF_CMD_EXT_REG_LONG;
  333. else
  334. return -EINVAL;
  335. raw_spin_lock_irqsave(&pbus->lock, flags);
  336. /* Wait for Software Interface FSM state to be IDLE. */
  337. inf_reg = &arb->chan;
  338. ret = readl_poll_timeout_atomic(pbus->base + arb->data->regs[inf_reg->ch_sta],
  339. data, GET_SWINF(data) == SWINF_IDLE,
  340. PMIF_DELAY_US, PMIF_TIMEOUT_US);
  341. if (ret < 0) {
  342. /* set channel ready if the data has transferred */
  343. if (pmif_is_fsm_vldclr(arb, pbus))
  344. pmif_writel(arb, pbus, 1, inf_reg->ch_rdy);
  345. raw_spin_unlock_irqrestore(&pbus->lock, flags);
  346. dev_err(&ctrl->dev, "failed to wait for SWINF_IDLE\n");
  347. return ret;
  348. }
  349. /* Send the command. */
  350. cmd = (opc << 30) | (sid << 24) | ((len - 1) << 16) | addr;
  351. pmif_writel(arb, pbus, cmd, inf_reg->ch_send);
  352. /*
  353. * Wait for Software Interface FSM state to be WFVLDCLR,
  354. * read the data and clear the valid flag.
  355. */
  356. ret = readl_poll_timeout_atomic(pbus->base + arb->data->regs[inf_reg->ch_sta],
  357. data, GET_SWINF(data) == SWINF_WFVLDCLR,
  358. PMIF_DELAY_US, PMIF_TIMEOUT_US);
  359. if (ret < 0) {
  360. raw_spin_unlock_irqrestore(&pbus->lock, flags);
  361. dev_err(&ctrl->dev, "failed to wait for SWINF_WFVLDCLR\n");
  362. return ret;
  363. }
  364. data = pmif_readl(arb, pbus, inf_reg->rdata);
  365. pmif_writel(arb, pbus, 1, inf_reg->ch_rdy);
  366. raw_spin_unlock_irqrestore(&pbus->lock, flags);
  367. memcpy(buf, &data, len);
  368. return 0;
  369. }
  370. static int pmif_spmi_write_cmd(struct spmi_controller *ctrl, u8 opc, u8 sid,
  371. u16 addr, const u8 *buf, size_t len)
  372. {
  373. struct pmif_bus *pbus = spmi_controller_get_drvdata(ctrl);
  374. struct pmif *arb = to_mtk_pmif(ctrl);
  375. struct ch_reg *inf_reg;
  376. int ret;
  377. u32 data, wdata, cmd;
  378. unsigned long flags;
  379. /* Check for argument validation. */
  380. if (unlikely(sid & ~0xf)) {
  381. dev_err(&ctrl->dev, "exceed the max slv id\n");
  382. return -EINVAL;
  383. }
  384. if (len > 4) {
  385. dev_err(&ctrl->dev, "pmif supports 1..4 bytes per trans, but:%zu requested", len);
  386. return -EINVAL;
  387. }
  388. /* Check the opcode */
  389. if (opc >= 0x40 && opc <= 0x5F)
  390. opc = PMIF_CMD_REG;
  391. else if ((opc <= 0xF) || (opc >= 0x30 && opc <= 0x37))
  392. opc = PMIF_CMD_EXT_REG_LONG;
  393. else if (opc >= 0x80)
  394. opc = PMIF_CMD_REG_0;
  395. else
  396. return -EINVAL;
  397. /* Set the write data. */
  398. memcpy(&wdata, buf, len);
  399. raw_spin_lock_irqsave(&pbus->lock, flags);
  400. /* Wait for Software Interface FSM state to be IDLE. */
  401. inf_reg = &arb->chan;
  402. ret = readl_poll_timeout_atomic(pbus->base + arb->data->regs[inf_reg->ch_sta],
  403. data, GET_SWINF(data) == SWINF_IDLE,
  404. PMIF_DELAY_US, PMIF_TIMEOUT_US);
  405. if (ret < 0) {
  406. /* set channel ready if the data has transferred */
  407. if (pmif_is_fsm_vldclr(arb, pbus))
  408. pmif_writel(arb, pbus, 1, inf_reg->ch_rdy);
  409. raw_spin_unlock_irqrestore(&pbus->lock, flags);
  410. dev_err(&ctrl->dev, "failed to wait for SWINF_IDLE\n");
  411. return ret;
  412. }
  413. pmif_writel(arb, pbus, wdata, inf_reg->wdata);
  414. /* Send the command. */
  415. cmd = (opc << 30) | BIT(29) | (sid << 24) | ((len - 1) << 16) | addr;
  416. pmif_writel(arb, pbus, cmd, inf_reg->ch_send);
  417. raw_spin_unlock_irqrestore(&pbus->lock, flags);
  418. return 0;
  419. }
  420. static void mtk_spmi_handle_chained_irq(struct irq_desc *desc)
  421. {
  422. struct pmif_bus *pbus = irq_desc_get_handler_data(desc);
  423. struct irq_chip *chip = irq_desc_get_chip(desc);
  424. struct pmif *arb = to_mtk_pmif(pbus->ctrl);
  425. u8 regidx_min, regidx_max;
  426. bool irq_handled = false;
  427. unsigned int i;
  428. regidx_min = pbus->irq_min_sid / 4;
  429. regidx_min += SPMI_SLV_3_0_EINT;
  430. regidx_max = pbus->irq_max_sid / 4;
  431. regidx_max += SPMI_SLV_3_0_EINT;
  432. chained_irq_enter(chip, desc);
  433. for (i = regidx_min; i <= regidx_max; i++) {
  434. u32 val = mtk_spmi_readl(arb, pbus, i);
  435. while (val) {
  436. u8 bit = __ffs(val);
  437. u8 bank = bit / 7;
  438. u8 sid = ((i - SPMI_SLV_3_0_EINT) * 4) + bank;
  439. val &= ~(PMIF_RCS_IRQ_MASK << (8 * bank));
  440. /* Check if IRQs for this SID are enabled */
  441. if (!(pbus->irq_en & BIT(sid)))
  442. continue;
  443. generic_handle_domain_irq_safe(pbus->dom, sid);
  444. irq_handled = true;
  445. }
  446. }
  447. if (!irq_handled)
  448. handle_bad_irq(desc);
  449. chained_irq_exit(chip, desc);
  450. }
  451. static void mtk_spmi_rcs_irq_eoi(struct irq_data *d)
  452. {
  453. struct pmif_bus *pbus = irq_data_get_irq_chip_data(d);
  454. struct pmif *arb = to_mtk_pmif(pbus->ctrl);
  455. irq_hw_number_t irq = irqd_to_hwirq(d);
  456. unsigned int reg, shift;
  457. /* There are four interrupts (8 bits each) per register */
  458. reg = SPMI_SLV_3_0_EINT + d->hwirq / 4;
  459. shift = (irq % 4) * 8;
  460. mtk_spmi_writel(arb, pbus, PMIF_RCS_IRQ_MASK << shift, reg);
  461. }
  462. static void mtk_spmi_rcs_irq_enable(struct irq_data *d)
  463. {
  464. struct pmif_bus *pbus = irq_data_get_irq_chip_data(d);
  465. irq_hw_number_t irq = irqd_to_hwirq(d);
  466. pbus->irq_en |= BIT(irq);
  467. }
  468. static void mtk_spmi_rcs_irq_disable(struct irq_data *d)
  469. {
  470. struct pmif_bus *pbus = irq_data_get_irq_chip_data(d);
  471. irq_hw_number_t irq = irqd_to_hwirq(d);
  472. pbus->irq_en &= ~BIT(irq);
  473. }
  474. static int mtk_spmi_rcs_irq_set_wake(struct irq_data *d, unsigned int on)
  475. {
  476. struct pmif_bus *pbus = irq_data_get_irq_chip_data(d);
  477. return irq_set_irq_wake(pbus->irq, on);
  478. }
  479. static const struct irq_chip mtk_spmi_rcs_irq_chip = {
  480. .name = "spmi_rcs",
  481. .irq_eoi = mtk_spmi_rcs_irq_eoi,
  482. .irq_enable = mtk_spmi_rcs_irq_enable,
  483. .irq_disable = mtk_spmi_rcs_irq_disable,
  484. .irq_set_wake = mtk_spmi_rcs_irq_set_wake,
  485. };
  486. static int mtk_spmi_rcs_irq_translate(struct irq_domain *d, struct irq_fwspec *fwspec,
  487. unsigned long *out_hwirq, unsigned int *out_type)
  488. {
  489. struct pmif_bus *pbus = d->host_data;
  490. struct device *dev = &pbus->ctrl->dev;
  491. u32 *intspec = fwspec->param;
  492. if (intspec[0] > SPMI_MAX_SLAVE_ID)
  493. return -EINVAL;
  494. /*
  495. * The IRQ number in intspec[1] is ignored on purpose here!
  496. *
  497. * The controller only has knowledge of which SID raised an interrupt
  498. * and the type of irq, but doesn't know about any device irq number,
  499. * hence that must be read from the SPMI device's registers.
  500. */
  501. *out_hwirq = intspec[0];
  502. *out_type = intspec[2] & IRQ_TYPE_SENSE_MASK;
  503. if (pbus->irq_min_sid > intspec[0])
  504. pbus->irq_min_sid = intspec[0];
  505. if (pbus->irq_max_sid < intspec[0])
  506. pbus->irq_max_sid = intspec[0];
  507. dev_dbg(dev, "Found SPMI IRQ %u (map: 0x%lx)\n", intspec[0], *out_hwirq);
  508. return 0;
  509. }
  510. static struct lock_class_key mtk_spmi_rcs_irqlock_class, mtk_spmi_rcs_irqreq_class;
  511. static int mtk_spmi_rcs_irq_alloc(struct irq_domain *d, unsigned int virq,
  512. unsigned int nr_irqs, void *data)
  513. {
  514. struct pmif_bus *pbus = d->host_data;
  515. struct device *dev = &pbus->ctrl->dev;
  516. struct irq_fwspec *fwspec = data;
  517. irq_hw_number_t hwirq;
  518. unsigned int irqtype;
  519. int i, ret;
  520. ret = mtk_spmi_rcs_irq_translate(d, fwspec, &hwirq, &irqtype);
  521. if (ret)
  522. return ret;
  523. for (i = 0; i < nr_irqs; i++) {
  524. dev_dbg(dev, "Mapping IRQ%u (hwirq %lu) with type %u\n",
  525. virq, hwirq, irqtype);
  526. irq_set_lockdep_class(virq, &mtk_spmi_rcs_irqlock_class,
  527. &mtk_spmi_rcs_irqreq_class);
  528. irq_domain_set_info(d, virq, hwirq, &mtk_spmi_rcs_irq_chip,
  529. pbus, handle_level_irq, NULL, NULL);
  530. }
  531. return 0;
  532. }
  533. static const struct irq_domain_ops mtk_spmi_rcs_irq_domain_ops = {
  534. .alloc = mtk_spmi_rcs_irq_alloc,
  535. .free = irq_domain_free_irqs_common,
  536. .translate = mtk_spmi_rcs_irq_translate,
  537. };
  538. static const struct pmif_data mt6873_pmif_arb = {
  539. .regs = mt6873_regs,
  540. .spmimst_regs = mt6873_spmi_regs,
  541. .soc_chan = 2,
  542. };
  543. static const struct pmif_data mt8195_pmif_arb = {
  544. .regs = mt8195_regs,
  545. .spmimst_regs = mt8195_spmi_regs,
  546. .soc_chan = 2,
  547. };
  548. static const struct pmif_data mt8196_pmif_arb = {
  549. .regs = mt8195_regs,
  550. .spmimst_regs = mt8195_spmi_regs,
  551. .soc_chan = 2,
  552. .spmi_ver = 2,
  553. .num_spmi_buses = 2,
  554. };
  555. static int mtk_spmi_irq_init(struct device_node *node,
  556. const struct pmif_data *pdata,
  557. struct pmif_bus *pbus)
  558. {
  559. struct pmif *arb = to_mtk_pmif(pbus->ctrl);
  560. unsigned int i;
  561. /* No interrupts required for SPMI 1.x controller */
  562. if (pdata->spmi_ver < 2) {
  563. pbus->dom = NULL;
  564. return 0;
  565. }
  566. pbus->irq = of_irq_get_byname(node, "rcs");
  567. if (pbus->irq <= 0)
  568. return pbus->irq ? : -ENXIO;
  569. pbus->dom = irq_domain_create_tree(of_fwnode_handle(node),
  570. &mtk_spmi_rcs_irq_domain_ops, pbus);
  571. if (!pbus->dom)
  572. return -ENOMEM;
  573. /* Clear possible unhandled interrupts coming from bootloader SPMI init */
  574. for (i = SPMI_SLV_3_0_EINT; i <= SPMI_SLV_F_C_EINT; i++)
  575. mtk_spmi_writel(arb, pbus, GENMASK(31, 0), i);
  576. return 0;
  577. }
  578. static void mtk_spmi_irq_remove(struct pmif_bus *pbus)
  579. {
  580. if (!pbus->dom)
  581. return;
  582. irq_set_chained_handler_and_data(pbus->irq, NULL, NULL);
  583. irq_domain_remove(pbus->dom);
  584. }
  585. static int mtk_spmi_bus_probe(struct platform_device *pdev,
  586. struct device_node *node,
  587. const struct pmif_data *pdata,
  588. struct pmif_bus *pbus)
  589. {
  590. struct spmi_controller *ctrl;
  591. int err, idx, bus_id, i;
  592. if (pdata->num_spmi_buses > 1)
  593. bus_id = of_alias_get_id(node, "spmi");
  594. else
  595. bus_id = 0;
  596. if (bus_id < 0)
  597. return dev_err_probe(&pdev->dev, bus_id,
  598. "Cannot find SPMI Bus alias ID\n");
  599. ctrl = devm_spmi_controller_alloc(&pdev->dev, sizeof(*pbus));
  600. if (IS_ERR(ctrl))
  601. return PTR_ERR(ctrl);
  602. pbus = spmi_controller_get_drvdata(ctrl);
  603. pbus->ctrl = ctrl;
  604. idx = of_property_match_string(node, "reg-names", "pmif");
  605. if (idx < 0)
  606. return -EINVAL;
  607. pbus->base = devm_of_iomap(&pdev->dev, node, idx, NULL);
  608. if (IS_ERR(pbus->base))
  609. return PTR_ERR(pbus->base);
  610. idx = of_property_match_string(node, "reg-names", "spmimst");
  611. if (idx < 0)
  612. return -EINVAL;
  613. pbus->spmimst_base = devm_of_iomap(&pdev->dev, node, idx, NULL);
  614. if (IS_ERR(pbus->spmimst_base))
  615. return PTR_ERR(pbus->spmimst_base);
  616. pbus->nclks = ARRAY_SIZE(pmif_clock_names);
  617. for (i = 0; i < pbus->nclks; i++) {
  618. pbus->clks[i].id = pmif_clock_names[i];
  619. pbus->clks[i].clk = of_clk_get_by_name(node, pbus->clks[i].id);
  620. if (IS_ERR(pbus->clks[i].clk))
  621. return dev_err_probe(&pdev->dev, PTR_ERR(pbus->clks[i].clk),
  622. "Failed to get clocks\n");
  623. }
  624. err = clk_bulk_prepare_enable(pbus->nclks, pbus->clks);
  625. if (err) {
  626. dev_err_probe(&pdev->dev, err, "Failed to enable clocks\n");
  627. goto err_put_clks;
  628. }
  629. err = mtk_spmi_irq_init(node, pdata, pbus);
  630. if (err) {
  631. dev_err_probe(&pdev->dev, err, "Cannot initialize SPMI IRQs\n");
  632. goto err_disable_clks;
  633. }
  634. ctrl->cmd = pmif_arb_cmd;
  635. ctrl->read_cmd = pmif_spmi_read_cmd;
  636. ctrl->write_cmd = pmif_spmi_write_cmd;
  637. ctrl->dev.of_node = node;
  638. dev_set_name(&ctrl->dev, "spmi-%d", bus_id);
  639. raw_spin_lock_init(&pbus->lock);
  640. err = spmi_controller_add(ctrl);
  641. if (err)
  642. goto err_remove_irq;
  643. if (pbus->dom)
  644. irq_set_chained_handler_and_data(pbus->irq, mtk_spmi_handle_chained_irq, pbus);
  645. return 0;
  646. err_remove_irq:
  647. mtk_spmi_irq_remove(pbus);
  648. err_disable_clks:
  649. clk_bulk_disable_unprepare(pbus->nclks, pbus->clks);
  650. err_put_clks:
  651. clk_bulk_put(pbus->nclks, pbus->clks);
  652. return err;
  653. }
  654. static int mtk_spmi_probe(struct platform_device *pdev)
  655. {
  656. struct device_node *node = pdev->dev.of_node;
  657. struct pmif *arb;
  658. u32 chan_offset;
  659. u8 cur_bus = 0;
  660. int ret;
  661. arb = devm_kzalloc(&pdev->dev, sizeof(*arb), GFP_KERNEL);
  662. if (!arb)
  663. return -ENOMEM;
  664. arb->data = device_get_match_data(&pdev->dev);
  665. if (!arb->data) {
  666. dev_err(&pdev->dev, "Cannot get drv_data\n");
  667. return -EINVAL;
  668. }
  669. platform_set_drvdata(pdev, arb);
  670. if (!arb->data->num_spmi_buses) {
  671. ret = mtk_spmi_bus_probe(pdev, node, arb->data, &arb->bus[cur_bus]);
  672. if (ret)
  673. return ret;
  674. } else {
  675. for_each_available_child_of_node_scoped(node, child) {
  676. if (!of_node_name_eq(child, "spmi"))
  677. continue;
  678. ret = mtk_spmi_bus_probe(pdev, child, arb->data,
  679. &arb->bus[cur_bus]);
  680. if (ret)
  681. return ret;
  682. cur_bus++;
  683. }
  684. }
  685. chan_offset = PMIF_CHAN_OFFSET * arb->data->soc_chan;
  686. arb->chan.ch_sta = PMIF_SWINF_0_STA + chan_offset;
  687. arb->chan.wdata = PMIF_SWINF_0_WDATA_31_0 + chan_offset;
  688. arb->chan.rdata = PMIF_SWINF_0_RDATA_31_0 + chan_offset;
  689. arb->chan.ch_send = PMIF_SWINF_0_ACC + chan_offset;
  690. arb->chan.ch_rdy = PMIF_SWINF_0_VLD_CLR + chan_offset;
  691. return 0;
  692. }
  693. static void mtk_spmi_remove(struct platform_device *pdev)
  694. {
  695. struct pmif *arb = platform_get_drvdata(pdev);
  696. int i;
  697. for (i = 0; i < PMIF_MAX_BUSES; i++) {
  698. struct pmif_bus *pbus = &arb->bus[i];
  699. if (!pbus->ctrl)
  700. continue;
  701. mtk_spmi_irq_remove(pbus);
  702. spmi_controller_remove(pbus->ctrl);
  703. clk_bulk_disable_unprepare(pbus->nclks, pbus->clks);
  704. clk_bulk_put(pbus->nclks, pbus->clks);
  705. }
  706. }
  707. static const struct of_device_id mtk_spmi_match_table[] = {
  708. {
  709. .compatible = "mediatek,mt6873-spmi",
  710. .data = &mt6873_pmif_arb,
  711. }, {
  712. .compatible = "mediatek,mt8195-spmi",
  713. .data = &mt8195_pmif_arb,
  714. }, {
  715. .compatible = "mediatek,mt8196-spmi",
  716. .data = &mt8196_pmif_arb,
  717. }, {
  718. /* sentinel */
  719. },
  720. };
  721. MODULE_DEVICE_TABLE(of, mtk_spmi_match_table);
  722. static struct platform_driver mtk_spmi_driver = {
  723. .driver = {
  724. .name = "spmi-mtk",
  725. .of_match_table = mtk_spmi_match_table,
  726. },
  727. .probe = mtk_spmi_probe,
  728. .remove = mtk_spmi_remove,
  729. };
  730. module_platform_driver(mtk_spmi_driver);
  731. MODULE_AUTHOR("AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>");
  732. MODULE_AUTHOR("Hsin-Hsiung Wang <hsin-hsiung.wang@mediatek.com>");
  733. MODULE_DESCRIPTION("MediaTek SPMI Driver");
  734. MODULE_LICENSE("GPL");