cadence_master.c 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751
  1. // SPDX-License-Identifier: (GPL-2.0 OR BSD-3-Clause)
  2. // Copyright(c) 2015-17 Intel Corporation.
  3. /*
  4. * Cadence SoundWire Master module
  5. * Used by Master driver
  6. */
  7. #include <linux/delay.h>
  8. #include <linux/device.h>
  9. #include <linux/interrupt.h>
  10. #include <linux/module.h>
  11. #include <linux/mod_devicetable.h>
  12. #include <linux/soundwire/sdw_registers.h>
  13. #include <linux/soundwire/sdw.h>
  14. #include "bus.h"
  15. #include "cadence_master.h"
  16. #define CDNS_MCP_CONFIG 0x0
  17. #define CDNS_MCP_CONFIG_MCMD_RETRY GENMASK(27, 24)
  18. #define CDNS_MCP_CONFIG_MPREQ_DELAY GENMASK(20, 16)
  19. #define CDNS_MCP_CONFIG_MMASTER BIT(7)
  20. #define CDNS_MCP_CONFIG_BUS_REL BIT(6)
  21. #define CDNS_MCP_CONFIG_SNIFFER BIT(5)
  22. #define CDNS_MCP_CONFIG_SSPMOD BIT(4)
  23. #define CDNS_MCP_CONFIG_CMD BIT(3)
  24. #define CDNS_MCP_CONFIG_OP GENMASK(2, 0)
  25. #define CDNS_MCP_CONFIG_OP_NORMAL 0
  26. #define CDNS_MCP_CONTROL 0x4
  27. #define CDNS_MCP_CONTROL_RST_DELAY GENMASK(10, 8)
  28. #define CDNS_MCP_CONTROL_CMD_RST BIT(7)
  29. #define CDNS_MCP_CONTROL_SOFT_RST BIT(6)
  30. #define CDNS_MCP_CONTROL_SW_RST BIT(5)
  31. #define CDNS_MCP_CONTROL_HW_RST BIT(4)
  32. #define CDNS_MCP_CONTROL_CLK_PAUSE BIT(3)
  33. #define CDNS_MCP_CONTROL_CLK_STOP_CLR BIT(2)
  34. #define CDNS_MCP_CONTROL_CMD_ACCEPT BIT(1)
  35. #define CDNS_MCP_CONTROL_BLOCK_WAKEUP BIT(0)
  36. #define CDNS_MCP_CMDCTRL 0x8
  37. #define CDNS_MCP_SSPSTAT 0xC
  38. #define CDNS_MCP_FRAME_SHAPE 0x10
  39. #define CDNS_MCP_FRAME_SHAPE_INIT 0x14
  40. #define CDNS_MCP_CONFIG_UPDATE 0x18
  41. #define CDNS_MCP_CONFIG_UPDATE_BIT BIT(0)
  42. #define CDNS_MCP_PHYCTRL 0x1C
  43. #define CDNS_MCP_SSP_CTRL0 0x20
  44. #define CDNS_MCP_SSP_CTRL1 0x28
  45. #define CDNS_MCP_CLK_CTRL0 0x30
  46. #define CDNS_MCP_CLK_CTRL1 0x38
  47. #define CDNS_MCP_STAT 0x40
  48. #define CDNS_MCP_STAT_ACTIVE_BANK BIT(20)
  49. #define CDNS_MCP_STAT_CLK_STOP BIT(16)
  50. #define CDNS_MCP_INTSTAT 0x44
  51. #define CDNS_MCP_INTMASK 0x48
  52. #define CDNS_MCP_INT_IRQ BIT(31)
  53. #define CDNS_MCP_INT_WAKEUP BIT(16)
  54. #define CDNS_MCP_INT_SLAVE_RSVD BIT(15)
  55. #define CDNS_MCP_INT_SLAVE_ALERT BIT(14)
  56. #define CDNS_MCP_INT_SLAVE_ATTACH BIT(13)
  57. #define CDNS_MCP_INT_SLAVE_NATTACH BIT(12)
  58. #define CDNS_MCP_INT_SLAVE_MASK GENMASK(15, 12)
  59. #define CDNS_MCP_INT_DPINT BIT(11)
  60. #define CDNS_MCP_INT_CTRL_CLASH BIT(10)
  61. #define CDNS_MCP_INT_DATA_CLASH BIT(9)
  62. #define CDNS_MCP_INT_CMD_ERR BIT(7)
  63. #define CDNS_MCP_INT_RX_WL BIT(2)
  64. #define CDNS_MCP_INT_TXE BIT(1)
  65. #define CDNS_MCP_INTSET 0x4C
  66. #define CDNS_SDW_SLAVE_STAT 0x50
  67. #define CDNS_MCP_SLAVE_STAT_MASK BIT(1, 0)
  68. #define CDNS_MCP_SLAVE_INTSTAT0 0x54
  69. #define CDNS_MCP_SLAVE_INTSTAT1 0x58
  70. #define CDNS_MCP_SLAVE_INTSTAT_NPRESENT BIT(0)
  71. #define CDNS_MCP_SLAVE_INTSTAT_ATTACHED BIT(1)
  72. #define CDNS_MCP_SLAVE_INTSTAT_ALERT BIT(2)
  73. #define CDNS_MCP_SLAVE_INTSTAT_RESERVED BIT(3)
  74. #define CDNS_MCP_SLAVE_STATUS_BITS GENMASK(3, 0)
  75. #define CDNS_MCP_SLAVE_STATUS_NUM 4
  76. #define CDNS_MCP_SLAVE_INTMASK0 0x5C
  77. #define CDNS_MCP_SLAVE_INTMASK1 0x60
  78. #define CDNS_MCP_SLAVE_INTMASK0_MASK GENMASK(30, 0)
  79. #define CDNS_MCP_SLAVE_INTMASK1_MASK GENMASK(16, 0)
  80. #define CDNS_MCP_PORT_INTSTAT 0x64
  81. #define CDNS_MCP_PDI_STAT 0x6C
  82. #define CDNS_MCP_FIFOLEVEL 0x78
  83. #define CDNS_MCP_FIFOSTAT 0x7C
  84. #define CDNS_MCP_RX_FIFO_AVAIL GENMASK(5, 0)
  85. #define CDNS_MCP_CMD_BASE 0x80
  86. #define CDNS_MCP_RESP_BASE 0x80
  87. #define CDNS_MCP_CMD_LEN 0x20
  88. #define CDNS_MCP_CMD_WORD_LEN 0x4
  89. #define CDNS_MCP_CMD_SSP_TAG BIT(31)
  90. #define CDNS_MCP_CMD_COMMAND GENMASK(30, 28)
  91. #define CDNS_MCP_CMD_DEV_ADDR GENMASK(27, 24)
  92. #define CDNS_MCP_CMD_REG_ADDR_H GENMASK(23, 16)
  93. #define CDNS_MCP_CMD_REG_ADDR_L GENMASK(15, 8)
  94. #define CDNS_MCP_CMD_REG_DATA GENMASK(7, 0)
  95. #define CDNS_MCP_CMD_READ 2
  96. #define CDNS_MCP_CMD_WRITE 3
  97. #define CDNS_MCP_RESP_RDATA GENMASK(15, 8)
  98. #define CDNS_MCP_RESP_ACK BIT(0)
  99. #define CDNS_MCP_RESP_NACK BIT(1)
  100. #define CDNS_DP_SIZE 128
  101. #define CDNS_DPN_B0_CONFIG(n) (0x100 + CDNS_DP_SIZE * (n))
  102. #define CDNS_DPN_B0_CH_EN(n) (0x104 + CDNS_DP_SIZE * (n))
  103. #define CDNS_DPN_B0_SAMPLE_CTRL(n) (0x108 + CDNS_DP_SIZE * (n))
  104. #define CDNS_DPN_B0_OFFSET_CTRL(n) (0x10C + CDNS_DP_SIZE * (n))
  105. #define CDNS_DPN_B0_HCTRL(n) (0x110 + CDNS_DP_SIZE * (n))
  106. #define CDNS_DPN_B0_ASYNC_CTRL(n) (0x114 + CDNS_DP_SIZE * (n))
  107. #define CDNS_DPN_B1_CONFIG(n) (0x118 + CDNS_DP_SIZE * (n))
  108. #define CDNS_DPN_B1_CH_EN(n) (0x11C + CDNS_DP_SIZE * (n))
  109. #define CDNS_DPN_B1_SAMPLE_CTRL(n) (0x120 + CDNS_DP_SIZE * (n))
  110. #define CDNS_DPN_B1_OFFSET_CTRL(n) (0x124 + CDNS_DP_SIZE * (n))
  111. #define CDNS_DPN_B1_HCTRL(n) (0x128 + CDNS_DP_SIZE * (n))
  112. #define CDNS_DPN_B1_ASYNC_CTRL(n) (0x12C + CDNS_DP_SIZE * (n))
  113. #define CDNS_DPN_CONFIG_BPM BIT(18)
  114. #define CDNS_DPN_CONFIG_BGC GENMASK(17, 16)
  115. #define CDNS_DPN_CONFIG_WL GENMASK(12, 8)
  116. #define CDNS_DPN_CONFIG_PORT_DAT GENMASK(3, 2)
  117. #define CDNS_DPN_CONFIG_PORT_FLOW GENMASK(1, 0)
  118. #define CDNS_DPN_SAMPLE_CTRL_SI GENMASK(15, 0)
  119. #define CDNS_DPN_OFFSET_CTRL_1 GENMASK(7, 0)
  120. #define CDNS_DPN_OFFSET_CTRL_2 GENMASK(15, 8)
  121. #define CDNS_DPN_HCTRL_HSTOP GENMASK(3, 0)
  122. #define CDNS_DPN_HCTRL_HSTART GENMASK(7, 4)
  123. #define CDNS_DPN_HCTRL_LCTRL GENMASK(10, 8)
  124. #define CDNS_PORTCTRL 0x130
  125. #define CDNS_PORTCTRL_DIRN BIT(7)
  126. #define CDNS_PORTCTRL_BANK_INVERT BIT(8)
  127. #define CDNS_PORT_OFFSET 0x80
  128. #define CDNS_PDI_CONFIG(n) (0x1100 + (n) * 16)
  129. #define CDNS_PDI_CONFIG_SOFT_RESET BIT(24)
  130. #define CDNS_PDI_CONFIG_CHANNEL GENMASK(15, 8)
  131. #define CDNS_PDI_CONFIG_PORT GENMASK(4, 0)
  132. /* Driver defaults */
  133. #define CDNS_DEFAULT_CLK_DIVIDER 0
  134. #define CDNS_DEFAULT_FRAME_SHAPE 0x30
  135. #define CDNS_DEFAULT_SSP_INTERVAL 0x18
  136. #define CDNS_TX_TIMEOUT 2000
  137. #define CDNS_PCM_PDI_OFFSET 0x2
  138. #define CDNS_PDM_PDI_OFFSET 0x6
  139. #define CDNS_SCP_RX_FIFOLEVEL 0x2
  140. /*
  141. * register accessor helpers
  142. */
  143. static inline u32 cdns_readl(struct sdw_cdns *cdns, int offset)
  144. {
  145. return readl(cdns->registers + offset);
  146. }
  147. static inline void cdns_writel(struct sdw_cdns *cdns, int offset, u32 value)
  148. {
  149. writel(value, cdns->registers + offset);
  150. }
  151. static inline void cdns_updatel(struct sdw_cdns *cdns,
  152. int offset, u32 mask, u32 val)
  153. {
  154. u32 tmp;
  155. tmp = cdns_readl(cdns, offset);
  156. tmp = (tmp & ~mask) | val;
  157. cdns_writel(cdns, offset, tmp);
  158. }
  159. static int cdns_clear_bit(struct sdw_cdns *cdns, int offset, u32 value)
  160. {
  161. int timeout = 10;
  162. u32 reg_read;
  163. writel(value, cdns->registers + offset);
  164. /* Wait for bit to be self cleared */
  165. do {
  166. reg_read = readl(cdns->registers + offset);
  167. if ((reg_read & value) == 0)
  168. return 0;
  169. timeout--;
  170. udelay(50);
  171. } while (timeout != 0);
  172. return -EAGAIN;
  173. }
  174. /*
  175. * IO Calls
  176. */
  177. static enum sdw_command_response cdns_fill_msg_resp(
  178. struct sdw_cdns *cdns,
  179. struct sdw_msg *msg, int count, int offset)
  180. {
  181. int nack = 0, no_ack = 0;
  182. int i;
  183. /* check message response */
  184. for (i = 0; i < count; i++) {
  185. if (!(cdns->response_buf[i] & CDNS_MCP_RESP_ACK)) {
  186. no_ack = 1;
  187. dev_dbg(cdns->dev, "Msg Ack not received\n");
  188. if (cdns->response_buf[i] & CDNS_MCP_RESP_NACK) {
  189. nack = 1;
  190. dev_err(cdns->dev, "Msg NACK received\n");
  191. }
  192. }
  193. }
  194. if (nack) {
  195. dev_err(cdns->dev, "Msg NACKed for Slave %d\n", msg->dev_num);
  196. return SDW_CMD_FAIL;
  197. } else if (no_ack) {
  198. dev_dbg(cdns->dev, "Msg ignored for Slave %d\n", msg->dev_num);
  199. return SDW_CMD_IGNORED;
  200. }
  201. /* fill response */
  202. for (i = 0; i < count; i++)
  203. msg->buf[i + offset] = cdns->response_buf[i] >>
  204. SDW_REG_SHIFT(CDNS_MCP_RESP_RDATA);
  205. return SDW_CMD_OK;
  206. }
  207. static enum sdw_command_response
  208. _cdns_xfer_msg(struct sdw_cdns *cdns, struct sdw_msg *msg, int cmd,
  209. int offset, int count, bool defer)
  210. {
  211. unsigned long time;
  212. u32 base, i, data;
  213. u16 addr;
  214. /* Program the watermark level for RX FIFO */
  215. if (cdns->msg_count != count) {
  216. cdns_writel(cdns, CDNS_MCP_FIFOLEVEL, count);
  217. cdns->msg_count = count;
  218. }
  219. base = CDNS_MCP_CMD_BASE;
  220. addr = msg->addr;
  221. for (i = 0; i < count; i++) {
  222. data = msg->dev_num << SDW_REG_SHIFT(CDNS_MCP_CMD_DEV_ADDR);
  223. data |= cmd << SDW_REG_SHIFT(CDNS_MCP_CMD_COMMAND);
  224. data |= addr++ << SDW_REG_SHIFT(CDNS_MCP_CMD_REG_ADDR_L);
  225. if (msg->flags == SDW_MSG_FLAG_WRITE)
  226. data |= msg->buf[i + offset];
  227. data |= msg->ssp_sync << SDW_REG_SHIFT(CDNS_MCP_CMD_SSP_TAG);
  228. cdns_writel(cdns, base, data);
  229. base += CDNS_MCP_CMD_WORD_LEN;
  230. }
  231. if (defer)
  232. return SDW_CMD_OK;
  233. /* wait for timeout or response */
  234. time = wait_for_completion_timeout(&cdns->tx_complete,
  235. msecs_to_jiffies(CDNS_TX_TIMEOUT));
  236. if (!time) {
  237. dev_err(cdns->dev, "IO transfer timed out\n");
  238. msg->len = 0;
  239. return SDW_CMD_TIMEOUT;
  240. }
  241. return cdns_fill_msg_resp(cdns, msg, count, offset);
  242. }
  243. static enum sdw_command_response cdns_program_scp_addr(
  244. struct sdw_cdns *cdns, struct sdw_msg *msg)
  245. {
  246. int nack = 0, no_ack = 0;
  247. unsigned long time;
  248. u32 data[2], base;
  249. int i;
  250. /* Program the watermark level for RX FIFO */
  251. if (cdns->msg_count != CDNS_SCP_RX_FIFOLEVEL) {
  252. cdns_writel(cdns, CDNS_MCP_FIFOLEVEL, CDNS_SCP_RX_FIFOLEVEL);
  253. cdns->msg_count = CDNS_SCP_RX_FIFOLEVEL;
  254. }
  255. data[0] = msg->dev_num << SDW_REG_SHIFT(CDNS_MCP_CMD_DEV_ADDR);
  256. data[0] |= 0x3 << SDW_REG_SHIFT(CDNS_MCP_CMD_COMMAND);
  257. data[1] = data[0];
  258. data[0] |= SDW_SCP_ADDRPAGE1 << SDW_REG_SHIFT(CDNS_MCP_CMD_REG_ADDR_L);
  259. data[1] |= SDW_SCP_ADDRPAGE2 << SDW_REG_SHIFT(CDNS_MCP_CMD_REG_ADDR_L);
  260. data[0] |= msg->addr_page1;
  261. data[1] |= msg->addr_page2;
  262. base = CDNS_MCP_CMD_BASE;
  263. cdns_writel(cdns, base, data[0]);
  264. base += CDNS_MCP_CMD_WORD_LEN;
  265. cdns_writel(cdns, base, data[1]);
  266. time = wait_for_completion_timeout(&cdns->tx_complete,
  267. msecs_to_jiffies(CDNS_TX_TIMEOUT));
  268. if (!time) {
  269. dev_err(cdns->dev, "SCP Msg trf timed out\n");
  270. msg->len = 0;
  271. return SDW_CMD_TIMEOUT;
  272. }
  273. /* check response the writes */
  274. for (i = 0; i < 2; i++) {
  275. if (!(cdns->response_buf[i] & CDNS_MCP_RESP_ACK)) {
  276. no_ack = 1;
  277. dev_err(cdns->dev, "Program SCP Ack not received");
  278. if (cdns->response_buf[i] & CDNS_MCP_RESP_NACK) {
  279. nack = 1;
  280. dev_err(cdns->dev, "Program SCP NACK received");
  281. }
  282. }
  283. }
  284. /* For NACK, NO ack, don't return err if we are in Broadcast mode */
  285. if (nack) {
  286. dev_err(cdns->dev,
  287. "SCP_addrpage NACKed for Slave %d", msg->dev_num);
  288. return SDW_CMD_FAIL;
  289. } else if (no_ack) {
  290. dev_dbg(cdns->dev,
  291. "SCP_addrpage ignored for Slave %d", msg->dev_num);
  292. return SDW_CMD_IGNORED;
  293. }
  294. return SDW_CMD_OK;
  295. }
  296. static int cdns_prep_msg(struct sdw_cdns *cdns, struct sdw_msg *msg, int *cmd)
  297. {
  298. int ret;
  299. if (msg->page) {
  300. ret = cdns_program_scp_addr(cdns, msg);
  301. if (ret) {
  302. msg->len = 0;
  303. return ret;
  304. }
  305. }
  306. switch (msg->flags) {
  307. case SDW_MSG_FLAG_READ:
  308. *cmd = CDNS_MCP_CMD_READ;
  309. break;
  310. case SDW_MSG_FLAG_WRITE:
  311. *cmd = CDNS_MCP_CMD_WRITE;
  312. break;
  313. default:
  314. dev_err(cdns->dev, "Invalid msg cmd: %d\n", msg->flags);
  315. return -EINVAL;
  316. }
  317. return 0;
  318. }
  319. static enum sdw_command_response
  320. cdns_xfer_msg(struct sdw_bus *bus, struct sdw_msg *msg)
  321. {
  322. struct sdw_cdns *cdns = bus_to_cdns(bus);
  323. int cmd = 0, ret, i;
  324. ret = cdns_prep_msg(cdns, msg, &cmd);
  325. if (ret)
  326. return SDW_CMD_FAIL_OTHER;
  327. for (i = 0; i < msg->len / CDNS_MCP_CMD_LEN; i++) {
  328. ret = _cdns_xfer_msg(cdns, msg, cmd, i * CDNS_MCP_CMD_LEN,
  329. CDNS_MCP_CMD_LEN, false);
  330. if (ret < 0)
  331. goto exit;
  332. }
  333. if (!(msg->len % CDNS_MCP_CMD_LEN))
  334. goto exit;
  335. ret = _cdns_xfer_msg(cdns, msg, cmd, i * CDNS_MCP_CMD_LEN,
  336. msg->len % CDNS_MCP_CMD_LEN, false);
  337. exit:
  338. return ret;
  339. }
  340. static enum sdw_command_response
  341. cdns_xfer_msg_defer(struct sdw_bus *bus,
  342. struct sdw_msg *msg, struct sdw_defer *defer)
  343. {
  344. struct sdw_cdns *cdns = bus_to_cdns(bus);
  345. int cmd = 0, ret;
  346. /* for defer only 1 message is supported */
  347. if (msg->len > 1)
  348. return -ENOTSUPP;
  349. ret = cdns_prep_msg(cdns, msg, &cmd);
  350. if (ret)
  351. return SDW_CMD_FAIL_OTHER;
  352. cdns->defer = defer;
  353. cdns->defer->length = msg->len;
  354. return _cdns_xfer_msg(cdns, msg, cmd, 0, msg->len, true);
  355. }
  356. static enum sdw_command_response
  357. cdns_reset_page_addr(struct sdw_bus *bus, unsigned int dev_num)
  358. {
  359. struct sdw_cdns *cdns = bus_to_cdns(bus);
  360. struct sdw_msg msg;
  361. /* Create dummy message with valid device number */
  362. memset(&msg, 0, sizeof(msg));
  363. msg.dev_num = dev_num;
  364. return cdns_program_scp_addr(cdns, &msg);
  365. }
  366. /*
  367. * IRQ handling
  368. */
  369. static void cdns_read_response(struct sdw_cdns *cdns)
  370. {
  371. u32 num_resp, cmd_base;
  372. int i;
  373. num_resp = cdns_readl(cdns, CDNS_MCP_FIFOSTAT);
  374. num_resp &= CDNS_MCP_RX_FIFO_AVAIL;
  375. cmd_base = CDNS_MCP_CMD_BASE;
  376. for (i = 0; i < num_resp; i++) {
  377. cdns->response_buf[i] = cdns_readl(cdns, cmd_base);
  378. cmd_base += CDNS_MCP_CMD_WORD_LEN;
  379. }
  380. }
  381. static int cdns_update_slave_status(struct sdw_cdns *cdns,
  382. u32 slave0, u32 slave1)
  383. {
  384. enum sdw_slave_status status[SDW_MAX_DEVICES + 1];
  385. bool is_slave = false;
  386. u64 slave, mask;
  387. int i, set_status;
  388. /* combine the two status */
  389. slave = ((u64)slave1 << 32) | slave0;
  390. memset(status, 0, sizeof(status));
  391. for (i = 0; i <= SDW_MAX_DEVICES; i++) {
  392. mask = (slave >> (i * CDNS_MCP_SLAVE_STATUS_NUM)) &
  393. CDNS_MCP_SLAVE_STATUS_BITS;
  394. if (!mask)
  395. continue;
  396. is_slave = true;
  397. set_status = 0;
  398. if (mask & CDNS_MCP_SLAVE_INTSTAT_RESERVED) {
  399. status[i] = SDW_SLAVE_RESERVED;
  400. set_status++;
  401. }
  402. if (mask & CDNS_MCP_SLAVE_INTSTAT_ATTACHED) {
  403. status[i] = SDW_SLAVE_ATTACHED;
  404. set_status++;
  405. }
  406. if (mask & CDNS_MCP_SLAVE_INTSTAT_ALERT) {
  407. status[i] = SDW_SLAVE_ALERT;
  408. set_status++;
  409. }
  410. if (mask & CDNS_MCP_SLAVE_INTSTAT_NPRESENT) {
  411. status[i] = SDW_SLAVE_UNATTACHED;
  412. set_status++;
  413. }
  414. /* first check if Slave reported multiple status */
  415. if (set_status > 1) {
  416. dev_warn(cdns->dev,
  417. "Slave reported multiple Status: %d\n",
  418. status[i]);
  419. /*
  420. * TODO: we need to reread the status here by
  421. * issuing a PING cmd
  422. */
  423. }
  424. }
  425. if (is_slave)
  426. return sdw_handle_slave_status(&cdns->bus, status);
  427. return 0;
  428. }
  429. /**
  430. * sdw_cdns_irq() - Cadence interrupt handler
  431. * @irq: irq number
  432. * @dev_id: irq context
  433. */
  434. irqreturn_t sdw_cdns_irq(int irq, void *dev_id)
  435. {
  436. struct sdw_cdns *cdns = dev_id;
  437. u32 int_status;
  438. int ret = IRQ_HANDLED;
  439. /* Check if the link is up */
  440. if (!cdns->link_up)
  441. return IRQ_NONE;
  442. int_status = cdns_readl(cdns, CDNS_MCP_INTSTAT);
  443. if (!(int_status & CDNS_MCP_INT_IRQ))
  444. return IRQ_NONE;
  445. if (int_status & CDNS_MCP_INT_RX_WL) {
  446. cdns_read_response(cdns);
  447. if (cdns->defer) {
  448. cdns_fill_msg_resp(cdns, cdns->defer->msg,
  449. cdns->defer->length, 0);
  450. complete(&cdns->defer->complete);
  451. cdns->defer = NULL;
  452. } else
  453. complete(&cdns->tx_complete);
  454. }
  455. if (int_status & CDNS_MCP_INT_CTRL_CLASH) {
  456. /* Slave is driving bit slot during control word */
  457. dev_err_ratelimited(cdns->dev, "Bus clash for control word\n");
  458. int_status |= CDNS_MCP_INT_CTRL_CLASH;
  459. }
  460. if (int_status & CDNS_MCP_INT_DATA_CLASH) {
  461. /*
  462. * Multiple slaves trying to drive bit slot, or issue with
  463. * ownership of data bits or Slave gone bonkers
  464. */
  465. dev_err_ratelimited(cdns->dev, "Bus clash for data word\n");
  466. int_status |= CDNS_MCP_INT_DATA_CLASH;
  467. }
  468. if (int_status & CDNS_MCP_INT_SLAVE_MASK) {
  469. /* Mask the Slave interrupt and wake thread */
  470. cdns_updatel(cdns, CDNS_MCP_INTMASK,
  471. CDNS_MCP_INT_SLAVE_MASK, 0);
  472. int_status &= ~CDNS_MCP_INT_SLAVE_MASK;
  473. ret = IRQ_WAKE_THREAD;
  474. }
  475. cdns_writel(cdns, CDNS_MCP_INTSTAT, int_status);
  476. return ret;
  477. }
  478. EXPORT_SYMBOL(sdw_cdns_irq);
  479. /**
  480. * sdw_cdns_thread() - Cadence irq thread handler
  481. * @irq: irq number
  482. * @dev_id: irq context
  483. */
  484. irqreturn_t sdw_cdns_thread(int irq, void *dev_id)
  485. {
  486. struct sdw_cdns *cdns = dev_id;
  487. u32 slave0, slave1;
  488. dev_dbg(cdns->dev, "Slave status change\n");
  489. slave0 = cdns_readl(cdns, CDNS_MCP_SLAVE_INTSTAT0);
  490. slave1 = cdns_readl(cdns, CDNS_MCP_SLAVE_INTSTAT1);
  491. cdns_update_slave_status(cdns, slave0, slave1);
  492. cdns_writel(cdns, CDNS_MCP_SLAVE_INTSTAT0, slave0);
  493. cdns_writel(cdns, CDNS_MCP_SLAVE_INTSTAT1, slave1);
  494. /* clear and unmask Slave interrupt now */
  495. cdns_writel(cdns, CDNS_MCP_INTSTAT, CDNS_MCP_INT_SLAVE_MASK);
  496. cdns_updatel(cdns, CDNS_MCP_INTMASK,
  497. CDNS_MCP_INT_SLAVE_MASK, CDNS_MCP_INT_SLAVE_MASK);
  498. return IRQ_HANDLED;
  499. }
  500. EXPORT_SYMBOL(sdw_cdns_thread);
  501. /*
  502. * init routines
  503. */
  504. static int _cdns_enable_interrupt(struct sdw_cdns *cdns)
  505. {
  506. u32 mask;
  507. cdns_writel(cdns, CDNS_MCP_SLAVE_INTMASK0,
  508. CDNS_MCP_SLAVE_INTMASK0_MASK);
  509. cdns_writel(cdns, CDNS_MCP_SLAVE_INTMASK1,
  510. CDNS_MCP_SLAVE_INTMASK1_MASK);
  511. mask = CDNS_MCP_INT_SLAVE_RSVD | CDNS_MCP_INT_SLAVE_ALERT |
  512. CDNS_MCP_INT_SLAVE_ATTACH | CDNS_MCP_INT_SLAVE_NATTACH |
  513. CDNS_MCP_INT_CTRL_CLASH | CDNS_MCP_INT_DATA_CLASH |
  514. CDNS_MCP_INT_RX_WL | CDNS_MCP_INT_IRQ | CDNS_MCP_INT_DPINT;
  515. cdns_writel(cdns, CDNS_MCP_INTMASK, mask);
  516. return 0;
  517. }
  518. /**
  519. * sdw_cdns_enable_interrupt() - Enable SDW interrupts and update config
  520. * @cdns: Cadence instance
  521. */
  522. int sdw_cdns_enable_interrupt(struct sdw_cdns *cdns)
  523. {
  524. int ret;
  525. _cdns_enable_interrupt(cdns);
  526. ret = cdns_clear_bit(cdns, CDNS_MCP_CONFIG_UPDATE,
  527. CDNS_MCP_CONFIG_UPDATE_BIT);
  528. if (ret < 0)
  529. dev_err(cdns->dev, "Config update timedout");
  530. return ret;
  531. }
  532. EXPORT_SYMBOL(sdw_cdns_enable_interrupt);
  533. /**
  534. * sdw_cdns_init() - Cadence initialization
  535. * @cdns: Cadence instance
  536. */
  537. int sdw_cdns_init(struct sdw_cdns *cdns)
  538. {
  539. u32 val;
  540. int ret;
  541. /* Exit clock stop */
  542. ret = cdns_clear_bit(cdns, CDNS_MCP_CONTROL,
  543. CDNS_MCP_CONTROL_CLK_STOP_CLR);
  544. if (ret < 0) {
  545. dev_err(cdns->dev, "Couldn't exit from clock stop\n");
  546. return ret;
  547. }
  548. /* Set clock divider */
  549. val = cdns_readl(cdns, CDNS_MCP_CLK_CTRL0);
  550. val |= CDNS_DEFAULT_CLK_DIVIDER;
  551. cdns_writel(cdns, CDNS_MCP_CLK_CTRL0, val);
  552. /* Set the default frame shape */
  553. cdns_writel(cdns, CDNS_MCP_FRAME_SHAPE_INIT, CDNS_DEFAULT_FRAME_SHAPE);
  554. /* Set SSP interval to default value */
  555. cdns_writel(cdns, CDNS_MCP_SSP_CTRL0, CDNS_DEFAULT_SSP_INTERVAL);
  556. cdns_writel(cdns, CDNS_MCP_SSP_CTRL1, CDNS_DEFAULT_SSP_INTERVAL);
  557. /* Set cmd accept mode */
  558. cdns_updatel(cdns, CDNS_MCP_CONTROL, CDNS_MCP_CONTROL_CMD_ACCEPT,
  559. CDNS_MCP_CONTROL_CMD_ACCEPT);
  560. /* Configure mcp config */
  561. val = cdns_readl(cdns, CDNS_MCP_CONFIG);
  562. /* Set Max cmd retry to 15 */
  563. val |= CDNS_MCP_CONFIG_MCMD_RETRY;
  564. /* Set frame delay between PREQ and ping frame to 15 frames */
  565. val |= 0xF << SDW_REG_SHIFT(CDNS_MCP_CONFIG_MPREQ_DELAY);
  566. /* Disable auto bus release */
  567. val &= ~CDNS_MCP_CONFIG_BUS_REL;
  568. /* Disable sniffer mode */
  569. val &= ~CDNS_MCP_CONFIG_SNIFFER;
  570. /* Set cmd mode for Tx and Rx cmds */
  571. val &= ~CDNS_MCP_CONFIG_CMD;
  572. /* Set operation to normal */
  573. val &= ~CDNS_MCP_CONFIG_OP;
  574. val |= CDNS_MCP_CONFIG_OP_NORMAL;
  575. cdns_writel(cdns, CDNS_MCP_CONFIG, val);
  576. return 0;
  577. }
  578. EXPORT_SYMBOL(sdw_cdns_init);
  579. struct sdw_master_ops sdw_cdns_master_ops = {
  580. .read_prop = sdw_master_read_prop,
  581. .xfer_msg = cdns_xfer_msg,
  582. .xfer_msg_defer = cdns_xfer_msg_defer,
  583. .reset_page_addr = cdns_reset_page_addr,
  584. };
  585. EXPORT_SYMBOL(sdw_cdns_master_ops);
  586. /**
  587. * sdw_cdns_probe() - Cadence probe routine
  588. * @cdns: Cadence instance
  589. */
  590. int sdw_cdns_probe(struct sdw_cdns *cdns)
  591. {
  592. init_completion(&cdns->tx_complete);
  593. return 0;
  594. }
  595. EXPORT_SYMBOL(sdw_cdns_probe);
  596. MODULE_LICENSE("Dual BSD/GPL");
  597. MODULE_DESCRIPTION("Cadence Soundwire Library");