cadence_master.c 50 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926
  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/cleanup.h>
  8. #include <linux/delay.h>
  9. #include <linux/device.h>
  10. #include <linux/debugfs.h>
  11. #include <linux/interrupt.h>
  12. #include <linux/io.h>
  13. #include <linux/module.h>
  14. #include <linux/mod_devicetable.h>
  15. #include <linux/pm_runtime.h>
  16. #include <linux/soundwire/sdw_registers.h>
  17. #include <linux/soundwire/sdw.h>
  18. #include <sound/pcm_params.h>
  19. #include <sound/soc.h>
  20. #include <linux/workqueue.h>
  21. #include "bus.h"
  22. #include "cadence_master.h"
  23. static int interrupt_mask;
  24. module_param_named(cnds_mcp_int_mask, interrupt_mask, int, 0444);
  25. MODULE_PARM_DESC(cdns_mcp_int_mask, "Cadence MCP IntMask");
  26. #define CDNS_MCP_CONFIG 0x0
  27. #define CDNS_MCP_CONFIG_BUS_REL BIT(6)
  28. #define CDNS_IP_MCP_CONFIG 0x0 /* IP offset added at run-time */
  29. #define CDNS_IP_MCP_CONFIG_MCMD_RETRY GENMASK(27, 24)
  30. #define CDNS_IP_MCP_CONFIG_MPREQ_DELAY GENMASK(20, 16)
  31. #define CDNS_IP_MCP_CONFIG_MMASTER BIT(7)
  32. #define CDNS_IP_MCP_CONFIG_SNIFFER BIT(5)
  33. #define CDNS_IP_MCP_CONFIG_CMD BIT(3)
  34. #define CDNS_IP_MCP_CONFIG_OP GENMASK(2, 0)
  35. #define CDNS_IP_MCP_CONFIG_OP_NORMAL 0
  36. #define CDNS_MCP_CONTROL 0x4
  37. #define CDNS_MCP_CONTROL_CMD_RST BIT(7)
  38. #define CDNS_MCP_CONTROL_SOFT_RST BIT(6)
  39. #define CDNS_MCP_CONTROL_HW_RST BIT(4)
  40. #define CDNS_MCP_CONTROL_CLK_STOP_CLR BIT(2)
  41. #define CDNS_IP_MCP_CONTROL 0x4 /* IP offset added at run-time */
  42. #define CDNS_IP_MCP_CONTROL_RST_DELAY GENMASK(10, 8)
  43. #define CDNS_IP_MCP_CONTROL_SW_RST BIT(5)
  44. #define CDNS_IP_MCP_CONTROL_CLK_PAUSE BIT(3)
  45. #define CDNS_IP_MCP_CONTROL_CMD_ACCEPT BIT(1)
  46. #define CDNS_IP_MCP_CONTROL_BLOCK_WAKEUP BIT(0)
  47. #define CDNS_IP_MCP_CMDCTRL 0x8 /* IP offset added at run-time */
  48. #define CDNS_IP_MCP_CMDCTRL_INSERT_PARITY_ERR BIT(2)
  49. #define CDNS_MCP_SSPSTAT 0xC
  50. #define CDNS_MCP_FRAME_SHAPE 0x10
  51. #define CDNS_MCP_FRAME_SHAPE_INIT 0x14
  52. #define CDNS_MCP_FRAME_SHAPE_COL_MASK GENMASK(2, 0)
  53. #define CDNS_MCP_FRAME_SHAPE_ROW_MASK GENMASK(7, 3)
  54. #define CDNS_MCP_CONFIG_UPDATE 0x18
  55. #define CDNS_MCP_CONFIG_UPDATE_BIT BIT(0)
  56. #define CDNS_MCP_PHYCTRL 0x1C
  57. #define CDNS_MCP_SSP_CTRL0 0x20
  58. #define CDNS_MCP_SSP_CTRL1 0x28
  59. #define CDNS_MCP_CLK_CTRL0 0x30
  60. #define CDNS_MCP_CLK_CTRL1 0x38
  61. #define CDNS_MCP_CLK_MCLKD_MASK GENMASK(7, 0)
  62. #define CDNS_MCP_STAT 0x40
  63. #define CDNS_MCP_STAT_ACTIVE_BANK BIT(20)
  64. #define CDNS_MCP_STAT_CLK_STOP BIT(16)
  65. #define CDNS_MCP_INTSTAT 0x44
  66. #define CDNS_MCP_INTMASK 0x48
  67. #define CDNS_MCP_INT_IRQ BIT(31)
  68. #define CDNS_MCP_INT_RESERVED1 GENMASK(30, 17)
  69. #define CDNS_MCP_INT_WAKEUP BIT(16)
  70. #define CDNS_MCP_INT_SLAVE_RSVD BIT(15)
  71. #define CDNS_MCP_INT_SLAVE_ALERT BIT(14)
  72. #define CDNS_MCP_INT_SLAVE_ATTACH BIT(13)
  73. #define CDNS_MCP_INT_SLAVE_NATTACH BIT(12)
  74. #define CDNS_MCP_INT_SLAVE_MASK GENMASK(15, 12)
  75. #define CDNS_MCP_INT_DPINT BIT(11)
  76. #define CDNS_MCP_INT_CTRL_CLASH BIT(10)
  77. #define CDNS_MCP_INT_DATA_CLASH BIT(9)
  78. #define CDNS_MCP_INT_PARITY BIT(8)
  79. #define CDNS_MCP_INT_CMD_ERR BIT(7)
  80. #define CDNS_MCP_INT_RESERVED2 GENMASK(6, 4)
  81. #define CDNS_MCP_INT_RX_NE BIT(3)
  82. #define CDNS_MCP_INT_RX_WL BIT(2)
  83. #define CDNS_MCP_INT_TXE BIT(1)
  84. #define CDNS_MCP_INT_TXF BIT(0)
  85. #define CDNS_MCP_INT_RESERVED (CDNS_MCP_INT_RESERVED1 | CDNS_MCP_INT_RESERVED2)
  86. #define CDNS_MCP_INTSET 0x4C
  87. #define CDNS_MCP_SLAVE_STAT 0x50
  88. #define CDNS_MCP_SLAVE_STAT_MASK GENMASK(1, 0)
  89. #define CDNS_MCP_SLAVE_INTSTAT0 0x54
  90. #define CDNS_MCP_SLAVE_INTSTAT1 0x58
  91. #define CDNS_MCP_SLAVE_INTSTAT_NPRESENT BIT(0)
  92. #define CDNS_MCP_SLAVE_INTSTAT_ATTACHED BIT(1)
  93. #define CDNS_MCP_SLAVE_INTSTAT_ALERT BIT(2)
  94. #define CDNS_MCP_SLAVE_INTSTAT_RESERVED BIT(3)
  95. #define CDNS_MCP_SLAVE_STATUS_BITS GENMASK(3, 0)
  96. #define CDNS_MCP_SLAVE_STATUS_NUM 4
  97. #define CDNS_MCP_SLAVE_INTMASK0 0x5C
  98. #define CDNS_MCP_SLAVE_INTMASK1 0x60
  99. #define CDNS_MCP_SLAVE_INTMASK0_MASK GENMASK(31, 0)
  100. #define CDNS_MCP_SLAVE_INTMASK1_MASK GENMASK(15, 0)
  101. #define CDNS_MCP_PORT_INTSTAT 0x64
  102. #define CDNS_MCP_PDI_STAT 0x6C
  103. #define CDNS_MCP_FIFOLEVEL 0x78
  104. #define CDNS_MCP_FIFOSTAT 0x7C
  105. #define CDNS_MCP_RX_FIFO_AVAIL GENMASK(5, 0)
  106. #define CDNS_IP_MCP_CMD_BASE 0x80 /* IP offset added at run-time */
  107. #define CDNS_IP_MCP_RESP_BASE 0x80 /* IP offset added at run-time */
  108. /* FIFO can hold 8 commands */
  109. #define CDNS_MCP_CMD_LEN 8
  110. #define CDNS_MCP_CMD_WORD_LEN 0x4
  111. #define CDNS_MCP_CMD_SSP_TAG BIT(31)
  112. #define CDNS_MCP_CMD_COMMAND GENMASK(30, 28)
  113. #define CDNS_MCP_CMD_DEV_ADDR GENMASK(27, 24)
  114. #define CDNS_MCP_CMD_REG_ADDR GENMASK(23, 8)
  115. #define CDNS_MCP_CMD_REG_DATA GENMASK(7, 0)
  116. #define CDNS_MCP_CMD_READ 2
  117. #define CDNS_MCP_CMD_WRITE 3
  118. #define CDNS_MCP_RESP_RDATA GENMASK(15, 8)
  119. #define CDNS_MCP_RESP_ACK BIT(0)
  120. #define CDNS_MCP_RESP_NACK BIT(1)
  121. #define CDNS_DP_SIZE 128
  122. #define CDNS_DPN_B0_CONFIG(n) (0x100 + CDNS_DP_SIZE * (n))
  123. #define CDNS_DPN_B0_CH_EN(n) (0x104 + CDNS_DP_SIZE * (n))
  124. #define CDNS_DPN_B0_SAMPLE_CTRL(n) (0x108 + CDNS_DP_SIZE * (n))
  125. #define CDNS_DPN_B0_OFFSET_CTRL(n) (0x10C + CDNS_DP_SIZE * (n))
  126. #define CDNS_DPN_B0_HCTRL(n) (0x110 + CDNS_DP_SIZE * (n))
  127. #define CDNS_DPN_B0_ASYNC_CTRL(n) (0x114 + CDNS_DP_SIZE * (n))
  128. #define CDNS_DPN_B1_CONFIG(n) (0x118 + CDNS_DP_SIZE * (n))
  129. #define CDNS_DPN_B1_CH_EN(n) (0x11C + CDNS_DP_SIZE * (n))
  130. #define CDNS_DPN_B1_SAMPLE_CTRL(n) (0x120 + CDNS_DP_SIZE * (n))
  131. #define CDNS_DPN_B1_OFFSET_CTRL(n) (0x124 + CDNS_DP_SIZE * (n))
  132. #define CDNS_DPN_B1_HCTRL(n) (0x128 + CDNS_DP_SIZE * (n))
  133. #define CDNS_DPN_B1_ASYNC_CTRL(n) (0x12C + CDNS_DP_SIZE * (n))
  134. #define CDNS_DPN_CONFIG_BPM BIT(18)
  135. #define CDNS_DPN_CONFIG_BGC GENMASK(17, 16)
  136. #define CDNS_DPN_CONFIG_WL GENMASK(12, 8)
  137. #define CDNS_DPN_CONFIG_PORT_DAT GENMASK(3, 2)
  138. #define CDNS_DPN_CONFIG_PORT_FLOW GENMASK(1, 0)
  139. #define CDNS_DPN_SAMPLE_CTRL_SI GENMASK(15, 0)
  140. #define CDNS_DPN_OFFSET_CTRL_1 GENMASK(7, 0)
  141. #define CDNS_DPN_OFFSET_CTRL_2 GENMASK(15, 8)
  142. #define CDNS_DPN_HCTRL_HSTOP GENMASK(3, 0)
  143. #define CDNS_DPN_HCTRL_HSTART GENMASK(7, 4)
  144. #define CDNS_DPN_HCTRL_LCTRL GENMASK(10, 8)
  145. #define CDNS_PORTCTRL 0x130
  146. #define CDNS_PORTCTRL_TEST_FAILED BIT(1)
  147. #define CDNS_PORTCTRL_DIRN BIT(7)
  148. #define CDNS_PORTCTRL_BANK_INVERT BIT(8)
  149. #define CDNS_PORT_OFFSET 0x80
  150. #define CDNS_PDI_CONFIG(n) (0x1100 + (n) * 16)
  151. #define CDNS_PDI_CONFIG_SOFT_RESET BIT(24)
  152. #define CDNS_PDI_CONFIG_CHANNEL GENMASK(15, 8)
  153. #define CDNS_PDI_CONFIG_PORT GENMASK(4, 0)
  154. /* Driver defaults */
  155. #define CDNS_TX_TIMEOUT 500
  156. #define CDNS_SCP_RX_FIFOLEVEL 0x2
  157. /*
  158. * register accessor helpers
  159. */
  160. static inline u32 cdns_readl(struct sdw_cdns *cdns, int offset)
  161. {
  162. return readl(cdns->registers + offset);
  163. }
  164. static inline void cdns_writel(struct sdw_cdns *cdns, int offset, u32 value)
  165. {
  166. writel(value, cdns->registers + offset);
  167. }
  168. static inline u32 cdns_ip_readl(struct sdw_cdns *cdns, int offset)
  169. {
  170. return cdns_readl(cdns, cdns->ip_offset + offset);
  171. }
  172. static inline void cdns_ip_writel(struct sdw_cdns *cdns, int offset, u32 value)
  173. {
  174. return cdns_writel(cdns, cdns->ip_offset + offset, value);
  175. }
  176. static inline void cdns_updatel(struct sdw_cdns *cdns,
  177. int offset, u32 mask, u32 val)
  178. {
  179. u32 tmp;
  180. tmp = cdns_readl(cdns, offset);
  181. tmp = (tmp & ~mask) | val;
  182. cdns_writel(cdns, offset, tmp);
  183. }
  184. static inline void cdns_ip_updatel(struct sdw_cdns *cdns,
  185. int offset, u32 mask, u32 val)
  186. {
  187. cdns_updatel(cdns, cdns->ip_offset + offset, mask, val);
  188. }
  189. static int cdns_set_wait(struct sdw_cdns *cdns, int offset, u32 mask, u32 value)
  190. {
  191. int timeout = 10;
  192. u32 reg_read;
  193. /* Wait for bit to be set */
  194. do {
  195. reg_read = readl(cdns->registers + offset);
  196. if ((reg_read & mask) == value)
  197. return 0;
  198. timeout--;
  199. usleep_range(50, 100);
  200. } while (timeout != 0);
  201. return -ETIMEDOUT;
  202. }
  203. static int cdns_clear_bit(struct sdw_cdns *cdns, int offset, u32 value)
  204. {
  205. writel(value, cdns->registers + offset);
  206. /* Wait for bit to be self cleared */
  207. return cdns_set_wait(cdns, offset, value, 0);
  208. }
  209. /*
  210. * all changes to the MCP_CONFIG, MCP_CONTROL, MCP_CMDCTRL and MCP_PHYCTRL
  211. * need to be confirmed with a write to MCP_CONFIG_UPDATE
  212. */
  213. static int cdns_config_update(struct sdw_cdns *cdns)
  214. {
  215. int ret;
  216. if (sdw_cdns_is_clock_stop(cdns)) {
  217. dev_err(cdns->dev, "Cannot program MCP_CONFIG_UPDATE in ClockStopMode\n");
  218. return -EINVAL;
  219. }
  220. ret = cdns_clear_bit(cdns, CDNS_MCP_CONFIG_UPDATE,
  221. CDNS_MCP_CONFIG_UPDATE_BIT);
  222. if (ret < 0)
  223. dev_err(cdns->dev, "Config update timedout\n");
  224. return ret;
  225. }
  226. /**
  227. * sdw_cdns_config_update() - Update configurations
  228. * @cdns: Cadence instance
  229. */
  230. void sdw_cdns_config_update(struct sdw_cdns *cdns)
  231. {
  232. /* commit changes */
  233. cdns_writel(cdns, CDNS_MCP_CONFIG_UPDATE, CDNS_MCP_CONFIG_UPDATE_BIT);
  234. }
  235. EXPORT_SYMBOL(sdw_cdns_config_update);
  236. /**
  237. * sdw_cdns_config_update_set_wait() - wait until configuration update bit is self-cleared
  238. * @cdns: Cadence instance
  239. */
  240. int sdw_cdns_config_update_set_wait(struct sdw_cdns *cdns)
  241. {
  242. /* the hardware recommendation is to wait at least 300us */
  243. return cdns_set_wait(cdns, CDNS_MCP_CONFIG_UPDATE,
  244. CDNS_MCP_CONFIG_UPDATE_BIT, 0);
  245. }
  246. EXPORT_SYMBOL(sdw_cdns_config_update_set_wait);
  247. /*
  248. * debugfs
  249. */
  250. #ifdef CONFIG_DEBUG_FS
  251. #define RD_BUF (2 * PAGE_SIZE)
  252. static ssize_t cdns_sprintf(struct sdw_cdns *cdns,
  253. char *buf, size_t pos, unsigned int reg)
  254. {
  255. return scnprintf(buf + pos, RD_BUF - pos,
  256. "%4x\t%8x\n", reg, cdns_readl(cdns, reg));
  257. }
  258. static int cdns_reg_show(struct seq_file *s, void *data)
  259. {
  260. struct sdw_cdns *cdns = s->private;
  261. ssize_t ret;
  262. int num_ports;
  263. int i, j;
  264. char *buf __free(kfree) = kzalloc(RD_BUF, GFP_KERNEL);
  265. if (!buf)
  266. return -ENOMEM;
  267. ret = scnprintf(buf, RD_BUF, "Register Value\n");
  268. ret += scnprintf(buf + ret, RD_BUF - ret, "\nMCP Registers\n");
  269. /* 8 MCP registers */
  270. for (i = CDNS_MCP_CONFIG; i <= CDNS_MCP_PHYCTRL; i += sizeof(u32))
  271. ret += cdns_sprintf(cdns, buf, ret, i);
  272. ret += scnprintf(buf + ret, RD_BUF - ret,
  273. "\nStatus & Intr Registers\n");
  274. /* 13 Status & Intr registers (offsets 0x70 and 0x74 not defined) */
  275. for (i = CDNS_MCP_STAT; i <= CDNS_MCP_FIFOSTAT; i += sizeof(u32))
  276. ret += cdns_sprintf(cdns, buf, ret, i);
  277. ret += scnprintf(buf + ret, RD_BUF - ret,
  278. "\nSSP & Clk ctrl Registers\n");
  279. ret += cdns_sprintf(cdns, buf, ret, CDNS_MCP_SSP_CTRL0);
  280. ret += cdns_sprintf(cdns, buf, ret, CDNS_MCP_SSP_CTRL1);
  281. ret += cdns_sprintf(cdns, buf, ret, CDNS_MCP_CLK_CTRL0);
  282. ret += cdns_sprintf(cdns, buf, ret, CDNS_MCP_CLK_CTRL1);
  283. ret += scnprintf(buf + ret, RD_BUF - ret,
  284. "\nDPn B0 Registers\n");
  285. num_ports = cdns->num_ports;
  286. for (i = 0; i < num_ports; i++) {
  287. ret += scnprintf(buf + ret, RD_BUF - ret,
  288. "\nDP-%d\n", i);
  289. for (j = CDNS_DPN_B0_CONFIG(i);
  290. j < CDNS_DPN_B0_ASYNC_CTRL(i); j += sizeof(u32))
  291. ret += cdns_sprintf(cdns, buf, ret, j);
  292. }
  293. ret += scnprintf(buf + ret, RD_BUF - ret,
  294. "\nDPn B1 Registers\n");
  295. for (i = 0; i < num_ports; i++) {
  296. ret += scnprintf(buf + ret, RD_BUF - ret,
  297. "\nDP-%d\n", i);
  298. for (j = CDNS_DPN_B1_CONFIG(i);
  299. j < CDNS_DPN_B1_ASYNC_CTRL(i); j += sizeof(u32))
  300. ret += cdns_sprintf(cdns, buf, ret, j);
  301. }
  302. ret += scnprintf(buf + ret, RD_BUF - ret,
  303. "\nDPn Control Registers\n");
  304. for (i = 0; i < num_ports; i++)
  305. ret += cdns_sprintf(cdns, buf, ret,
  306. CDNS_PORTCTRL + i * CDNS_PORT_OFFSET);
  307. ret += scnprintf(buf + ret, RD_BUF - ret,
  308. "\nPDIn Config Registers\n");
  309. /* number of PDI and ports is interchangeable */
  310. for (i = 0; i < num_ports; i++)
  311. ret += cdns_sprintf(cdns, buf, ret, CDNS_PDI_CONFIG(i));
  312. seq_printf(s, "%s", buf);
  313. return 0;
  314. }
  315. DEFINE_SHOW_ATTRIBUTE(cdns_reg);
  316. static int cdns_hw_reset(void *data, u64 value)
  317. {
  318. struct sdw_cdns *cdns = data;
  319. int ret;
  320. if (value != 1)
  321. return -EINVAL;
  322. /* Userspace changed the hardware state behind the kernel's back */
  323. add_taint(TAINT_USER, LOCKDEP_STILL_OK);
  324. ret = sdw_cdns_exit_reset(cdns);
  325. dev_dbg(cdns->dev, "link hw_reset done: %d\n", ret);
  326. return ret;
  327. }
  328. DEFINE_DEBUGFS_ATTRIBUTE(cdns_hw_reset_fops, NULL, cdns_hw_reset, "%llu\n");
  329. static int cdns_parity_error_injection(void *data, u64 value)
  330. {
  331. struct sdw_cdns *cdns = data;
  332. struct sdw_bus *bus;
  333. int ret;
  334. if (value != 1)
  335. return -EINVAL;
  336. bus = &cdns->bus;
  337. /*
  338. * Resume Master device. If this results in a bus reset, the
  339. * Slave devices will re-attach and be re-enumerated.
  340. */
  341. ret = pm_runtime_resume_and_get(bus->dev);
  342. if (ret < 0 && ret != -EACCES) {
  343. dev_err_ratelimited(cdns->dev,
  344. "pm_runtime_resume_and_get failed in %s, ret %d\n",
  345. __func__, ret);
  346. return ret;
  347. }
  348. /*
  349. * wait long enough for Slave(s) to be in steady state. This
  350. * does not need to be super precise.
  351. */
  352. msleep(200);
  353. /*
  354. * Take the bus lock here to make sure that any bus transactions
  355. * will be queued while we inject a parity error on a dummy read
  356. */
  357. mutex_lock(&bus->bus_lock);
  358. /* program hardware to inject parity error */
  359. cdns_ip_updatel(cdns, CDNS_IP_MCP_CMDCTRL,
  360. CDNS_IP_MCP_CMDCTRL_INSERT_PARITY_ERR,
  361. CDNS_IP_MCP_CMDCTRL_INSERT_PARITY_ERR);
  362. /* commit changes */
  363. ret = cdns_clear_bit(cdns, CDNS_MCP_CONFIG_UPDATE, CDNS_MCP_CONFIG_UPDATE_BIT);
  364. if (ret < 0)
  365. goto unlock;
  366. /* do a broadcast dummy read to avoid bus clashes */
  367. ret = sdw_bread_no_pm_unlocked(&cdns->bus, 0xf, SDW_SCP_DEVID_0);
  368. dev_info(cdns->dev, "parity error injection, read: %d\n", ret);
  369. /* program hardware to disable parity error */
  370. cdns_ip_updatel(cdns, CDNS_IP_MCP_CMDCTRL,
  371. CDNS_IP_MCP_CMDCTRL_INSERT_PARITY_ERR,
  372. 0);
  373. /* commit changes */
  374. ret = cdns_clear_bit(cdns, CDNS_MCP_CONFIG_UPDATE, CDNS_MCP_CONFIG_UPDATE_BIT);
  375. if (ret < 0)
  376. goto unlock;
  377. /* Userspace changed the hardware state behind the kernel's back */
  378. add_taint(TAINT_USER, LOCKDEP_STILL_OK);
  379. unlock:
  380. /* Continue bus operation with parity error injection disabled */
  381. mutex_unlock(&bus->bus_lock);
  382. /*
  383. * allow Master device to enter pm_runtime suspend. This may
  384. * also result in Slave devices suspending.
  385. */
  386. pm_runtime_mark_last_busy(bus->dev);
  387. pm_runtime_put_autosuspend(bus->dev);
  388. return 0;
  389. }
  390. DEFINE_DEBUGFS_ATTRIBUTE(cdns_parity_error_fops, NULL,
  391. cdns_parity_error_injection, "%llu\n");
  392. static int cdns_set_pdi_loopback_source(void *data, u64 value)
  393. {
  394. struct sdw_cdns *cdns = data;
  395. unsigned int pdi_out_num = cdns->pcm.num_bd + cdns->pcm.num_out;
  396. if (value > pdi_out_num)
  397. return -EINVAL;
  398. /* Userspace changed the hardware state behind the kernel's back */
  399. add_taint(TAINT_USER, LOCKDEP_STILL_OK);
  400. cdns->pdi_loopback_source = value;
  401. return 0;
  402. }
  403. DEFINE_DEBUGFS_ATTRIBUTE(cdns_pdi_loopback_source_fops, NULL, cdns_set_pdi_loopback_source, "%llu\n");
  404. static int cdns_set_pdi_loopback_target(void *data, u64 value)
  405. {
  406. struct sdw_cdns *cdns = data;
  407. unsigned int pdi_in_num = cdns->pcm.num_bd + cdns->pcm.num_in;
  408. if (value > pdi_in_num)
  409. return -EINVAL;
  410. /* Userspace changed the hardware state behind the kernel's back */
  411. add_taint(TAINT_USER, LOCKDEP_STILL_OK);
  412. cdns->pdi_loopback_target = value;
  413. return 0;
  414. }
  415. DEFINE_DEBUGFS_ATTRIBUTE(cdns_pdi_loopback_target_fops, NULL, cdns_set_pdi_loopback_target, "%llu\n");
  416. /**
  417. * sdw_cdns_debugfs_init() - Cadence debugfs init
  418. * @cdns: Cadence instance
  419. * @root: debugfs root
  420. */
  421. void sdw_cdns_debugfs_init(struct sdw_cdns *cdns, struct dentry *root)
  422. {
  423. debugfs_create_file("cdns-registers", 0400, root, cdns, &cdns_reg_fops);
  424. debugfs_create_file("cdns-hw-reset", 0200, root, cdns,
  425. &cdns_hw_reset_fops);
  426. debugfs_create_file("cdns-parity-error-injection", 0200, root, cdns,
  427. &cdns_parity_error_fops);
  428. cdns->pdi_loopback_source = -1;
  429. cdns->pdi_loopback_target = -1;
  430. debugfs_create_file("cdns-pdi-loopback-source", 0200, root, cdns,
  431. &cdns_pdi_loopback_source_fops);
  432. debugfs_create_file("cdns-pdi-loopback-target", 0200, root, cdns,
  433. &cdns_pdi_loopback_target_fops);
  434. }
  435. EXPORT_SYMBOL_GPL(sdw_cdns_debugfs_init);
  436. #endif /* CONFIG_DEBUG_FS */
  437. /*
  438. * IO Calls
  439. */
  440. static enum sdw_command_response
  441. cdns_fill_msg_resp(struct sdw_cdns *cdns,
  442. struct sdw_msg *msg, int count, int offset)
  443. {
  444. int nack = 0, no_ack = 0;
  445. int i;
  446. /* check message response */
  447. for (i = 0; i < count; i++) {
  448. if (!(cdns->response_buf[i] & CDNS_MCP_RESP_ACK)) {
  449. no_ack = 1;
  450. dev_vdbg(cdns->dev, "Msg Ack not received, cmd %d\n", i);
  451. }
  452. if (cdns->response_buf[i] & CDNS_MCP_RESP_NACK) {
  453. nack = 1;
  454. dev_err_ratelimited(cdns->dev, "Msg NACK received, cmd %d\n", i);
  455. }
  456. }
  457. if (nack) {
  458. dev_err_ratelimited(cdns->dev, "Msg NACKed for Slave %d\n", msg->dev_num);
  459. return SDW_CMD_FAIL;
  460. }
  461. if (no_ack) {
  462. dev_dbg_ratelimited(cdns->dev, "Msg ignored for Slave %d\n", msg->dev_num);
  463. return SDW_CMD_IGNORED;
  464. }
  465. if (msg->flags == SDW_MSG_FLAG_READ) {
  466. /* fill response */
  467. for (i = 0; i < count; i++)
  468. msg->buf[i + offset] = FIELD_GET(CDNS_MCP_RESP_RDATA,
  469. cdns->response_buf[i]);
  470. }
  471. return SDW_CMD_OK;
  472. }
  473. static void cdns_read_response(struct sdw_cdns *cdns)
  474. {
  475. u32 num_resp, cmd_base;
  476. int i;
  477. /* RX_FIFO_AVAIL can be 2 entries more than the FIFO size */
  478. BUILD_BUG_ON(ARRAY_SIZE(cdns->response_buf) < CDNS_MCP_CMD_LEN + 2);
  479. num_resp = cdns_readl(cdns, CDNS_MCP_FIFOSTAT);
  480. num_resp &= CDNS_MCP_RX_FIFO_AVAIL;
  481. if (num_resp > ARRAY_SIZE(cdns->response_buf)) {
  482. dev_warn(cdns->dev, "RX AVAIL %d too long\n", num_resp);
  483. num_resp = ARRAY_SIZE(cdns->response_buf);
  484. }
  485. cmd_base = CDNS_IP_MCP_CMD_BASE;
  486. for (i = 0; i < num_resp; i++) {
  487. cdns->response_buf[i] = cdns_ip_readl(cdns, cmd_base);
  488. cmd_base += CDNS_MCP_CMD_WORD_LEN;
  489. }
  490. }
  491. static enum sdw_command_response
  492. _cdns_xfer_msg(struct sdw_cdns *cdns, struct sdw_msg *msg, int cmd,
  493. int offset, int count, bool defer)
  494. {
  495. unsigned long time;
  496. u32 base, i, data;
  497. u16 addr;
  498. /* Program the watermark level for RX FIFO */
  499. if (cdns->msg_count != count) {
  500. cdns_writel(cdns, CDNS_MCP_FIFOLEVEL, count);
  501. cdns->msg_count = count;
  502. }
  503. base = CDNS_IP_MCP_CMD_BASE;
  504. addr = msg->addr + offset;
  505. for (i = 0; i < count; i++) {
  506. data = FIELD_PREP(CDNS_MCP_CMD_DEV_ADDR, msg->dev_num);
  507. data |= FIELD_PREP(CDNS_MCP_CMD_COMMAND, cmd);
  508. data |= FIELD_PREP(CDNS_MCP_CMD_REG_ADDR, addr);
  509. addr++;
  510. if (msg->flags == SDW_MSG_FLAG_WRITE)
  511. data |= msg->buf[i + offset];
  512. data |= FIELD_PREP(CDNS_MCP_CMD_SSP_TAG, msg->ssp_sync);
  513. cdns_ip_writel(cdns, base, data);
  514. base += CDNS_MCP_CMD_WORD_LEN;
  515. }
  516. if (defer)
  517. return SDW_CMD_OK;
  518. /* wait for timeout or response */
  519. time = wait_for_completion_timeout(&cdns->tx_complete,
  520. msecs_to_jiffies(CDNS_TX_TIMEOUT));
  521. if (!time) {
  522. dev_err(cdns->dev, "IO transfer timed out, cmd %d device %d addr %x len %d\n",
  523. cmd, msg->dev_num, msg->addr, msg->len);
  524. msg->len = 0;
  525. /* Drain anything in the RX_FIFO */
  526. cdns_read_response(cdns);
  527. return SDW_CMD_TIMEOUT;
  528. }
  529. return cdns_fill_msg_resp(cdns, msg, count, offset);
  530. }
  531. static enum sdw_command_response
  532. cdns_program_scp_addr(struct sdw_cdns *cdns, struct sdw_msg *msg)
  533. {
  534. int nack = 0, no_ack = 0;
  535. unsigned long time;
  536. u32 data[2], base;
  537. int i;
  538. /* Program the watermark level for RX FIFO */
  539. if (cdns->msg_count != CDNS_SCP_RX_FIFOLEVEL) {
  540. cdns_writel(cdns, CDNS_MCP_FIFOLEVEL, CDNS_SCP_RX_FIFOLEVEL);
  541. cdns->msg_count = CDNS_SCP_RX_FIFOLEVEL;
  542. }
  543. data[0] = FIELD_PREP(CDNS_MCP_CMD_DEV_ADDR, msg->dev_num);
  544. data[0] |= FIELD_PREP(CDNS_MCP_CMD_COMMAND, 0x3);
  545. data[1] = data[0];
  546. data[0] |= FIELD_PREP(CDNS_MCP_CMD_REG_ADDR, SDW_SCP_ADDRPAGE1);
  547. data[1] |= FIELD_PREP(CDNS_MCP_CMD_REG_ADDR, SDW_SCP_ADDRPAGE2);
  548. data[0] |= msg->addr_page1;
  549. data[1] |= msg->addr_page2;
  550. base = CDNS_IP_MCP_CMD_BASE;
  551. cdns_ip_writel(cdns, base, data[0]);
  552. base += CDNS_MCP_CMD_WORD_LEN;
  553. cdns_ip_writel(cdns, base, data[1]);
  554. time = wait_for_completion_timeout(&cdns->tx_complete,
  555. msecs_to_jiffies(CDNS_TX_TIMEOUT));
  556. if (!time) {
  557. dev_err(cdns->dev, "SCP Msg trf timed out\n");
  558. msg->len = 0;
  559. return SDW_CMD_TIMEOUT;
  560. }
  561. /* check response the writes */
  562. for (i = 0; i < 2; i++) {
  563. if (!(cdns->response_buf[i] & CDNS_MCP_RESP_ACK)) {
  564. no_ack = 1;
  565. dev_err(cdns->dev, "Program SCP Ack not received\n");
  566. if (cdns->response_buf[i] & CDNS_MCP_RESP_NACK) {
  567. nack = 1;
  568. dev_err(cdns->dev, "Program SCP NACK received\n");
  569. }
  570. }
  571. }
  572. /* For NACK, NO ack, don't return err if we are in Broadcast mode */
  573. if (nack) {
  574. dev_err_ratelimited(cdns->dev,
  575. "SCP_addrpage NACKed for Slave %d\n", msg->dev_num);
  576. return SDW_CMD_FAIL;
  577. }
  578. if (no_ack) {
  579. dev_dbg_ratelimited(cdns->dev,
  580. "SCP_addrpage ignored for Slave %d\n", msg->dev_num);
  581. return SDW_CMD_IGNORED;
  582. }
  583. return SDW_CMD_OK;
  584. }
  585. static int cdns_prep_msg(struct sdw_cdns *cdns, struct sdw_msg *msg, int *cmd)
  586. {
  587. int ret;
  588. if (msg->page) {
  589. ret = cdns_program_scp_addr(cdns, msg);
  590. if (ret) {
  591. msg->len = 0;
  592. return ret;
  593. }
  594. }
  595. switch (msg->flags) {
  596. case SDW_MSG_FLAG_READ:
  597. *cmd = CDNS_MCP_CMD_READ;
  598. break;
  599. case SDW_MSG_FLAG_WRITE:
  600. *cmd = CDNS_MCP_CMD_WRITE;
  601. break;
  602. default:
  603. dev_err(cdns->dev, "Invalid msg cmd: %d\n", msg->flags);
  604. return -EINVAL;
  605. }
  606. return 0;
  607. }
  608. enum sdw_command_response
  609. cdns_xfer_msg(struct sdw_bus *bus, struct sdw_msg *msg)
  610. {
  611. struct sdw_cdns *cdns = bus_to_cdns(bus);
  612. int cmd = 0, ret, i;
  613. ret = cdns_prep_msg(cdns, msg, &cmd);
  614. if (ret)
  615. return SDW_CMD_FAIL_OTHER;
  616. for (i = 0; i < msg->len / CDNS_MCP_CMD_LEN; i++) {
  617. ret = _cdns_xfer_msg(cdns, msg, cmd, i * CDNS_MCP_CMD_LEN,
  618. CDNS_MCP_CMD_LEN, false);
  619. if (ret != SDW_CMD_OK)
  620. return ret;
  621. }
  622. if (!(msg->len % CDNS_MCP_CMD_LEN))
  623. return SDW_CMD_OK;
  624. return _cdns_xfer_msg(cdns, msg, cmd, i * CDNS_MCP_CMD_LEN,
  625. msg->len % CDNS_MCP_CMD_LEN, false);
  626. }
  627. EXPORT_SYMBOL(cdns_xfer_msg);
  628. enum sdw_command_response
  629. cdns_xfer_msg_defer(struct sdw_bus *bus)
  630. {
  631. struct sdw_cdns *cdns = bus_to_cdns(bus);
  632. struct sdw_defer *defer = &bus->defer_msg;
  633. struct sdw_msg *msg = defer->msg;
  634. int cmd = 0, ret;
  635. /* for defer only 1 message is supported */
  636. if (msg->len > 1)
  637. return -ENOTSUPP;
  638. ret = cdns_prep_msg(cdns, msg, &cmd);
  639. if (ret)
  640. return SDW_CMD_FAIL_OTHER;
  641. return _cdns_xfer_msg(cdns, msg, cmd, 0, msg->len, true);
  642. }
  643. EXPORT_SYMBOL(cdns_xfer_msg_defer);
  644. u32 cdns_read_ping_status(struct sdw_bus *bus)
  645. {
  646. struct sdw_cdns *cdns = bus_to_cdns(bus);
  647. return cdns_readl(cdns, CDNS_MCP_SLAVE_STAT);
  648. }
  649. EXPORT_SYMBOL(cdns_read_ping_status);
  650. /*
  651. * IRQ handling
  652. */
  653. static int cdns_update_slave_status(struct sdw_cdns *cdns,
  654. u64 slave_intstat)
  655. {
  656. enum sdw_slave_status status[SDW_MAX_DEVICES + 1];
  657. bool is_slave = false;
  658. u32 mask;
  659. u32 val;
  660. int i, set_status;
  661. memset(status, 0, sizeof(status));
  662. for (i = 0; i <= SDW_MAX_DEVICES; i++) {
  663. mask = (slave_intstat >> (i * CDNS_MCP_SLAVE_STATUS_NUM)) &
  664. CDNS_MCP_SLAVE_STATUS_BITS;
  665. set_status = 0;
  666. if (mask) {
  667. is_slave = true;
  668. if (mask & CDNS_MCP_SLAVE_INTSTAT_RESERVED) {
  669. status[i] = SDW_SLAVE_RESERVED;
  670. set_status++;
  671. }
  672. if (mask & CDNS_MCP_SLAVE_INTSTAT_ATTACHED) {
  673. status[i] = SDW_SLAVE_ATTACHED;
  674. set_status++;
  675. }
  676. if (mask & CDNS_MCP_SLAVE_INTSTAT_ALERT) {
  677. status[i] = SDW_SLAVE_ALERT;
  678. set_status++;
  679. }
  680. if (mask & CDNS_MCP_SLAVE_INTSTAT_NPRESENT) {
  681. status[i] = SDW_SLAVE_UNATTACHED;
  682. set_status++;
  683. }
  684. }
  685. /*
  686. * check that there was a single reported Slave status and when
  687. * there is not use the latest status extracted from PING commands
  688. */
  689. if (set_status != 1) {
  690. val = cdns_readl(cdns, CDNS_MCP_SLAVE_STAT);
  691. val >>= (i * 2);
  692. switch (val & 0x3) {
  693. case 0:
  694. status[i] = SDW_SLAVE_UNATTACHED;
  695. break;
  696. case 1:
  697. status[i] = SDW_SLAVE_ATTACHED;
  698. break;
  699. case 2:
  700. status[i] = SDW_SLAVE_ALERT;
  701. break;
  702. case 3:
  703. default:
  704. status[i] = SDW_SLAVE_RESERVED;
  705. break;
  706. }
  707. }
  708. }
  709. if (is_slave) {
  710. int ret;
  711. mutex_lock(&cdns->status_update_lock);
  712. ret = sdw_handle_slave_status(&cdns->bus, status);
  713. mutex_unlock(&cdns->status_update_lock);
  714. return ret;
  715. }
  716. return 0;
  717. }
  718. /**
  719. * sdw_cdns_irq() - Cadence interrupt handler
  720. * @irq: irq number
  721. * @dev_id: irq context
  722. */
  723. irqreturn_t sdw_cdns_irq(int irq, void *dev_id)
  724. {
  725. struct sdw_cdns *cdns = dev_id;
  726. u32 int_status;
  727. /* Check if the link is up */
  728. if (!cdns->link_up)
  729. return IRQ_NONE;
  730. int_status = cdns_readl(cdns, CDNS_MCP_INTSTAT);
  731. /* check for reserved values read as zero */
  732. if (int_status & CDNS_MCP_INT_RESERVED)
  733. return IRQ_NONE;
  734. if (!(int_status & CDNS_MCP_INT_IRQ))
  735. return IRQ_NONE;
  736. if (int_status & CDNS_MCP_INT_RX_WL) {
  737. struct sdw_bus *bus = &cdns->bus;
  738. struct sdw_defer *defer = &bus->defer_msg;
  739. cdns_read_response(cdns);
  740. if (defer && defer->msg) {
  741. cdns_fill_msg_resp(cdns, defer->msg,
  742. defer->length, 0);
  743. complete(&defer->complete);
  744. } else {
  745. complete(&cdns->tx_complete);
  746. }
  747. }
  748. if (int_status & CDNS_MCP_INT_PARITY) {
  749. /* Parity error detected by Master */
  750. dev_err_ratelimited(cdns->dev, "Parity error\n");
  751. }
  752. if (int_status & CDNS_MCP_INT_CTRL_CLASH) {
  753. /* Slave is driving bit slot during control word */
  754. dev_err_ratelimited(cdns->dev, "Bus clash for control word\n");
  755. }
  756. if (int_status & CDNS_MCP_INT_DATA_CLASH) {
  757. /*
  758. * Multiple slaves trying to drive bit slot, or issue with
  759. * ownership of data bits or Slave gone bonkers
  760. */
  761. dev_err_ratelimited(cdns->dev, "Bus clash for data word\n");
  762. }
  763. if (cdns->bus.params.m_data_mode != SDW_PORT_DATA_MODE_NORMAL &&
  764. int_status & CDNS_MCP_INT_DPINT) {
  765. u32 port_intstat;
  766. /* just log which ports report an error */
  767. port_intstat = cdns_readl(cdns, CDNS_MCP_PORT_INTSTAT);
  768. dev_err_ratelimited(cdns->dev, "DP interrupt: PortIntStat %8x\n",
  769. port_intstat);
  770. /* clear status w/ write1 */
  771. cdns_writel(cdns, CDNS_MCP_PORT_INTSTAT, port_intstat);
  772. }
  773. if (int_status & CDNS_MCP_INT_SLAVE_MASK) {
  774. /* Mask the Slave interrupt and wake thread */
  775. cdns_updatel(cdns, CDNS_MCP_INTMASK,
  776. CDNS_MCP_INT_SLAVE_MASK, 0);
  777. int_status &= ~CDNS_MCP_INT_SLAVE_MASK;
  778. /*
  779. * Deal with possible race condition between interrupt
  780. * handling and disabling interrupts on suspend.
  781. *
  782. * If the master is in the process of disabling
  783. * interrupts, don't schedule a workqueue
  784. */
  785. if (cdns->interrupt_enabled)
  786. schedule_work(&cdns->work);
  787. }
  788. cdns_writel(cdns, CDNS_MCP_INTSTAT, int_status);
  789. return IRQ_HANDLED;
  790. }
  791. EXPORT_SYMBOL(sdw_cdns_irq);
  792. static void cdns_check_attached_status_dwork(struct work_struct *work)
  793. {
  794. struct sdw_cdns *cdns =
  795. container_of(work, struct sdw_cdns, attach_dwork.work);
  796. enum sdw_slave_status status[SDW_MAX_DEVICES + 1];
  797. u32 val;
  798. int ret;
  799. int i;
  800. val = cdns_readl(cdns, CDNS_MCP_SLAVE_STAT);
  801. for (i = 0; i <= SDW_MAX_DEVICES; i++) {
  802. status[i] = val & 0x3;
  803. if (status[i])
  804. dev_dbg(cdns->dev, "Peripheral %d status: %d\n", i, status[i]);
  805. val >>= 2;
  806. }
  807. mutex_lock(&cdns->status_update_lock);
  808. ret = sdw_handle_slave_status(&cdns->bus, status);
  809. mutex_unlock(&cdns->status_update_lock);
  810. if (ret < 0)
  811. dev_err(cdns->dev, "%s: sdw_handle_slave_status failed: %d\n", __func__, ret);
  812. }
  813. /**
  814. * cdns_update_slave_status_work - update slave status in a work since we will need to handle
  815. * other interrupts eg. CDNS_MCP_INT_RX_WL during the update slave
  816. * process.
  817. * @work: cdns worker thread
  818. */
  819. static void cdns_update_slave_status_work(struct work_struct *work)
  820. {
  821. struct sdw_cdns *cdns =
  822. container_of(work, struct sdw_cdns, work);
  823. u32 slave0, slave1;
  824. u64 slave_intstat;
  825. u32 device0_status;
  826. int retry_count = 0;
  827. /*
  828. * Clear main interrupt first so we don't lose any assertions
  829. * that happen during this function.
  830. */
  831. cdns_writel(cdns, CDNS_MCP_INTSTAT, CDNS_MCP_INT_SLAVE_MASK);
  832. slave0 = cdns_readl(cdns, CDNS_MCP_SLAVE_INTSTAT0);
  833. slave1 = cdns_readl(cdns, CDNS_MCP_SLAVE_INTSTAT1);
  834. /*
  835. * Clear the bits before handling so we don't lose any
  836. * bits that re-assert.
  837. */
  838. cdns_writel(cdns, CDNS_MCP_SLAVE_INTSTAT0, slave0);
  839. cdns_writel(cdns, CDNS_MCP_SLAVE_INTSTAT1, slave1);
  840. /* combine the two status */
  841. slave_intstat = ((u64)slave1 << 32) | slave0;
  842. dev_dbg_ratelimited(cdns->dev, "Slave status change: 0x%llx\n", slave_intstat);
  843. update_status:
  844. cdns_update_slave_status(cdns, slave_intstat);
  845. /*
  846. * When there is more than one peripheral per link, it's
  847. * possible that a deviceB becomes attached after we deal with
  848. * the attachment of deviceA. Since the hardware does a
  849. * logical AND, the attachment of the second device does not
  850. * change the status seen by the driver.
  851. *
  852. * In that case, clearing the registers above would result in
  853. * the deviceB never being detected - until a change of status
  854. * is observed on the bus.
  855. *
  856. * To avoid this race condition, re-check if any device0 needs
  857. * attention with PING commands. There is no need to check for
  858. * ALERTS since they are not allowed until a non-zero
  859. * device_number is assigned.
  860. *
  861. * Do not clear the INTSTAT0/1. While looping to enumerate devices on
  862. * #0 there could be status changes on other devices - these must
  863. * be kept in the INTSTAT so they can be handled when all #0 devices
  864. * have been handled.
  865. */
  866. device0_status = cdns_readl(cdns, CDNS_MCP_SLAVE_STAT);
  867. device0_status &= 3;
  868. if (device0_status == SDW_SLAVE_ATTACHED) {
  869. if (retry_count++ < SDW_MAX_DEVICES) {
  870. dev_dbg_ratelimited(cdns->dev,
  871. "Device0 detected after clearing status, iteration %d\n",
  872. retry_count);
  873. slave_intstat = CDNS_MCP_SLAVE_INTSTAT_ATTACHED;
  874. goto update_status;
  875. } else {
  876. dev_err_ratelimited(cdns->dev,
  877. "Device0 detected after %d iterations\n",
  878. retry_count);
  879. }
  880. }
  881. /* unmask Slave interrupt now */
  882. cdns_updatel(cdns, CDNS_MCP_INTMASK,
  883. CDNS_MCP_INT_SLAVE_MASK, CDNS_MCP_INT_SLAVE_MASK);
  884. }
  885. /* paranoia check to make sure self-cleared bits are indeed cleared */
  886. void sdw_cdns_check_self_clearing_bits(struct sdw_cdns *cdns, const char *string,
  887. bool initial_delay, int reset_iterations)
  888. {
  889. u32 ip_mcp_control;
  890. u32 mcp_control;
  891. u32 mcp_config_update;
  892. int i;
  893. if (initial_delay)
  894. usleep_range(1000, 1500);
  895. ip_mcp_control = cdns_ip_readl(cdns, CDNS_IP_MCP_CONTROL);
  896. /* the following bits should be cleared immediately */
  897. if (ip_mcp_control & CDNS_IP_MCP_CONTROL_SW_RST)
  898. dev_err(cdns->dev, "%s failed: IP_MCP_CONTROL_SW_RST is not cleared\n", string);
  899. mcp_control = cdns_readl(cdns, CDNS_MCP_CONTROL);
  900. /* the following bits should be cleared immediately */
  901. if (mcp_control & CDNS_MCP_CONTROL_CMD_RST)
  902. dev_err(cdns->dev, "%s failed: MCP_CONTROL_CMD_RST is not cleared\n", string);
  903. if (mcp_control & CDNS_MCP_CONTROL_SOFT_RST)
  904. dev_err(cdns->dev, "%s failed: MCP_CONTROL_SOFT_RST is not cleared\n", string);
  905. if (mcp_control & CDNS_MCP_CONTROL_CLK_STOP_CLR)
  906. dev_err(cdns->dev, "%s failed: MCP_CONTROL_CLK_STOP_CLR is not cleared\n", string);
  907. mcp_config_update = cdns_readl(cdns, CDNS_MCP_CONFIG_UPDATE);
  908. if (mcp_config_update & CDNS_MCP_CONFIG_UPDATE_BIT)
  909. dev_err(cdns->dev, "%s failed: MCP_CONFIG_UPDATE_BIT is not cleared\n", string);
  910. i = 0;
  911. while (mcp_control & CDNS_MCP_CONTROL_HW_RST) {
  912. if (i == reset_iterations) {
  913. dev_err(cdns->dev, "%s failed: MCP_CONTROL_HW_RST is not cleared\n", string);
  914. break;
  915. }
  916. dev_dbg(cdns->dev, "%s: MCP_CONTROL_HW_RST is not cleared at iteration %d\n", string, i);
  917. i++;
  918. usleep_range(1000, 1500);
  919. mcp_control = cdns_readl(cdns, CDNS_MCP_CONTROL);
  920. }
  921. }
  922. EXPORT_SYMBOL(sdw_cdns_check_self_clearing_bits);
  923. /*
  924. * init routines
  925. */
  926. /**
  927. * sdw_cdns_exit_reset() - Program reset parameters and start bus operations
  928. * @cdns: Cadence instance
  929. */
  930. int sdw_cdns_exit_reset(struct sdw_cdns *cdns)
  931. {
  932. /* keep reset delay unchanged to 4096 cycles */
  933. /* use hardware generated reset */
  934. cdns_updatel(cdns, CDNS_MCP_CONTROL,
  935. CDNS_MCP_CONTROL_HW_RST,
  936. CDNS_MCP_CONTROL_HW_RST);
  937. /* commit changes */
  938. return cdns_config_update(cdns);
  939. }
  940. EXPORT_SYMBOL(sdw_cdns_exit_reset);
  941. /**
  942. * cdns_enable_slave_interrupts() - Enable SDW slave interrupts
  943. * @cdns: Cadence instance
  944. * @state: boolean for true/false
  945. */
  946. static void cdns_enable_slave_interrupts(struct sdw_cdns *cdns, bool state)
  947. {
  948. u32 mask;
  949. mask = cdns_readl(cdns, CDNS_MCP_INTMASK);
  950. if (state)
  951. mask |= CDNS_MCP_INT_SLAVE_MASK;
  952. else
  953. mask &= ~CDNS_MCP_INT_SLAVE_MASK;
  954. cdns_writel(cdns, CDNS_MCP_INTMASK, mask);
  955. }
  956. /**
  957. * sdw_cdns_enable_interrupt() - Enable SDW interrupts
  958. * @cdns: Cadence instance
  959. * @state: True if we are trying to enable interrupt.
  960. */
  961. int sdw_cdns_enable_interrupt(struct sdw_cdns *cdns, bool state)
  962. {
  963. u32 slave_intmask0 = 0;
  964. u32 slave_intmask1 = 0;
  965. u32 mask = 0;
  966. if (!state)
  967. goto update_masks;
  968. slave_intmask0 = CDNS_MCP_SLAVE_INTMASK0_MASK;
  969. slave_intmask1 = CDNS_MCP_SLAVE_INTMASK1_MASK;
  970. /* enable detection of all slave state changes */
  971. mask = CDNS_MCP_INT_SLAVE_MASK;
  972. /* enable detection of bus issues */
  973. mask |= CDNS_MCP_INT_CTRL_CLASH | CDNS_MCP_INT_DATA_CLASH |
  974. CDNS_MCP_INT_PARITY;
  975. /* port interrupt limited to test modes for now */
  976. if (cdns->bus.params.m_data_mode != SDW_PORT_DATA_MODE_NORMAL)
  977. mask |= CDNS_MCP_INT_DPINT;
  978. /* enable detection of RX fifo level */
  979. mask |= CDNS_MCP_INT_RX_WL;
  980. /*
  981. * CDNS_MCP_INT_IRQ needs to be set otherwise all previous
  982. * settings are irrelevant
  983. */
  984. mask |= CDNS_MCP_INT_IRQ;
  985. if (interrupt_mask) /* parameter override */
  986. mask = interrupt_mask;
  987. update_masks:
  988. /* clear slave interrupt status before enabling interrupt */
  989. if (state) {
  990. u32 slave_state;
  991. slave_state = cdns_readl(cdns, CDNS_MCP_SLAVE_INTSTAT0);
  992. cdns_writel(cdns, CDNS_MCP_SLAVE_INTSTAT0, slave_state);
  993. slave_state = cdns_readl(cdns, CDNS_MCP_SLAVE_INTSTAT1);
  994. cdns_writel(cdns, CDNS_MCP_SLAVE_INTSTAT1, slave_state);
  995. }
  996. cdns->interrupt_enabled = state;
  997. /*
  998. * Complete any on-going status updates before updating masks,
  999. * and cancel queued status updates.
  1000. *
  1001. * There could be a race with a new interrupt thrown before
  1002. * the 3 mask updates below are complete, so in the interrupt
  1003. * we use the 'interrupt_enabled' status to prevent new work
  1004. * from being queued.
  1005. */
  1006. if (!state)
  1007. cancel_work_sync(&cdns->work);
  1008. cdns_writel(cdns, CDNS_MCP_SLAVE_INTMASK0, slave_intmask0);
  1009. cdns_writel(cdns, CDNS_MCP_SLAVE_INTMASK1, slave_intmask1);
  1010. cdns_writel(cdns, CDNS_MCP_INTMASK, mask);
  1011. return 0;
  1012. }
  1013. EXPORT_SYMBOL(sdw_cdns_enable_interrupt);
  1014. static int cdns_allocate_pdi(struct sdw_cdns *cdns,
  1015. struct sdw_cdns_pdi **stream,
  1016. u32 num)
  1017. {
  1018. struct sdw_cdns_pdi *pdi;
  1019. int i;
  1020. if (!num)
  1021. return 0;
  1022. pdi = devm_kcalloc(cdns->dev, num, sizeof(*pdi), GFP_KERNEL);
  1023. if (!pdi)
  1024. return -ENOMEM;
  1025. for (i = 0; i < num; i++) {
  1026. pdi[i].num = i;
  1027. }
  1028. *stream = pdi;
  1029. return 0;
  1030. }
  1031. /**
  1032. * sdw_cdns_pdi_init() - PDI initialization routine
  1033. *
  1034. * @cdns: Cadence instance
  1035. * @config: Stream configurations
  1036. */
  1037. int sdw_cdns_pdi_init(struct sdw_cdns *cdns,
  1038. struct sdw_cdns_stream_config config)
  1039. {
  1040. struct sdw_cdns_streams *stream;
  1041. int ret;
  1042. cdns->pcm.num_bd = config.pcm_bd;
  1043. cdns->pcm.num_in = config.pcm_in;
  1044. cdns->pcm.num_out = config.pcm_out;
  1045. /* Allocate PDIs for PCMs */
  1046. stream = &cdns->pcm;
  1047. /* we allocate PDI0 and PDI1 which are used for Bulk */
  1048. ret = cdns_allocate_pdi(cdns, &stream->bd, stream->num_bd);
  1049. if (ret)
  1050. return ret;
  1051. ret = cdns_allocate_pdi(cdns, &stream->in, stream->num_in);
  1052. if (ret)
  1053. return ret;
  1054. ret = cdns_allocate_pdi(cdns, &stream->out, stream->num_out);
  1055. if (ret)
  1056. return ret;
  1057. /* Update total number of PCM PDIs */
  1058. stream->num_pdi = stream->num_bd + stream->num_in + stream->num_out;
  1059. cdns->num_ports = stream->num_pdi;
  1060. return 0;
  1061. }
  1062. EXPORT_SYMBOL(sdw_cdns_pdi_init);
  1063. static u32 cdns_set_initial_frame_shape(int n_rows, int n_cols)
  1064. {
  1065. u32 val;
  1066. int c;
  1067. int r;
  1068. r = sdw_find_row_index(n_rows);
  1069. c = sdw_find_col_index(n_cols);
  1070. val = FIELD_PREP(CDNS_MCP_FRAME_SHAPE_ROW_MASK, r);
  1071. val |= FIELD_PREP(CDNS_MCP_FRAME_SHAPE_COL_MASK, c);
  1072. return val;
  1073. }
  1074. static void cdns_init_clock_ctrl(struct sdw_cdns *cdns)
  1075. {
  1076. struct sdw_bus *bus = &cdns->bus;
  1077. struct sdw_master_prop *prop = &bus->prop;
  1078. u32 val;
  1079. u32 ssp_interval;
  1080. int divider;
  1081. dev_dbg(cdns->dev, "mclk %d max %d row %d col %d\n",
  1082. prop->mclk_freq,
  1083. prop->max_clk_freq,
  1084. prop->default_row,
  1085. prop->default_col);
  1086. /* Set clock divider */
  1087. divider = (prop->mclk_freq / prop->max_clk_freq) - 1;
  1088. cdns_updatel(cdns, CDNS_MCP_CLK_CTRL0,
  1089. CDNS_MCP_CLK_MCLKD_MASK, divider);
  1090. cdns_updatel(cdns, CDNS_MCP_CLK_CTRL1,
  1091. CDNS_MCP_CLK_MCLKD_MASK, divider);
  1092. /*
  1093. * Frame shape changes after initialization have to be done
  1094. * with the bank switch mechanism
  1095. */
  1096. val = cdns_set_initial_frame_shape(prop->default_row,
  1097. prop->default_col);
  1098. cdns_writel(cdns, CDNS_MCP_FRAME_SHAPE_INIT, val);
  1099. /* Set SSP interval to default value */
  1100. ssp_interval = prop->default_frame_rate / SDW_CADENCE_GSYNC_HZ;
  1101. cdns_writel(cdns, CDNS_MCP_SSP_CTRL0, ssp_interval);
  1102. cdns_writel(cdns, CDNS_MCP_SSP_CTRL1, ssp_interval);
  1103. }
  1104. /**
  1105. * sdw_cdns_init() - Cadence initialization
  1106. * @cdns: Cadence instance
  1107. */
  1108. int sdw_cdns_init(struct sdw_cdns *cdns)
  1109. {
  1110. u32 val;
  1111. cdns_init_clock_ctrl(cdns);
  1112. sdw_cdns_check_self_clearing_bits(cdns, __func__, false, 0);
  1113. /* reset msg_count to default value of FIFOLEVEL */
  1114. cdns->msg_count = cdns_readl(cdns, CDNS_MCP_FIFOLEVEL);
  1115. /* flush command FIFOs */
  1116. cdns_updatel(cdns, CDNS_MCP_CONTROL, CDNS_MCP_CONTROL_CMD_RST,
  1117. CDNS_MCP_CONTROL_CMD_RST);
  1118. /* Set cmd accept mode */
  1119. cdns_ip_updatel(cdns, CDNS_IP_MCP_CONTROL, CDNS_IP_MCP_CONTROL_CMD_ACCEPT,
  1120. CDNS_IP_MCP_CONTROL_CMD_ACCEPT);
  1121. /* Configure mcp config */
  1122. val = cdns_readl(cdns, CDNS_MCP_CONFIG);
  1123. /* Disable auto bus release */
  1124. val &= ~CDNS_MCP_CONFIG_BUS_REL;
  1125. cdns_writel(cdns, CDNS_MCP_CONFIG, val);
  1126. /* Configure IP mcp config */
  1127. val = cdns_ip_readl(cdns, CDNS_IP_MCP_CONFIG);
  1128. /* enable bus operations with clock and data */
  1129. val &= ~CDNS_IP_MCP_CONFIG_OP;
  1130. val |= CDNS_IP_MCP_CONFIG_OP_NORMAL;
  1131. /* Set cmd mode for Tx and Rx cmds */
  1132. val &= ~CDNS_IP_MCP_CONFIG_CMD;
  1133. /* Disable sniffer mode */
  1134. val &= ~CDNS_IP_MCP_CONFIG_SNIFFER;
  1135. if (cdns->bus.multi_link)
  1136. /* Set Multi-master mode to take gsync into account */
  1137. val |= CDNS_IP_MCP_CONFIG_MMASTER;
  1138. /* leave frame delay to hardware default of 0x1F */
  1139. /* leave command retry to hardware default of 0 */
  1140. cdns_ip_writel(cdns, CDNS_IP_MCP_CONFIG, val);
  1141. /* changes will be committed later */
  1142. return 0;
  1143. }
  1144. EXPORT_SYMBOL(sdw_cdns_init);
  1145. int cdns_bus_conf(struct sdw_bus *bus, struct sdw_bus_params *params)
  1146. {
  1147. struct sdw_master_prop *prop = &bus->prop;
  1148. struct sdw_cdns *cdns = bus_to_cdns(bus);
  1149. int mcp_clkctrl_off;
  1150. int divider;
  1151. if (!params->curr_dr_freq) {
  1152. dev_err(cdns->dev, "NULL curr_dr_freq\n");
  1153. return -EINVAL;
  1154. }
  1155. divider = prop->mclk_freq * SDW_DOUBLE_RATE_FACTOR /
  1156. params->curr_dr_freq;
  1157. divider--; /* divider is 1/(N+1) */
  1158. if (params->next_bank)
  1159. mcp_clkctrl_off = CDNS_MCP_CLK_CTRL1;
  1160. else
  1161. mcp_clkctrl_off = CDNS_MCP_CLK_CTRL0;
  1162. cdns_updatel(cdns, mcp_clkctrl_off, CDNS_MCP_CLK_MCLKD_MASK, divider);
  1163. return 0;
  1164. }
  1165. EXPORT_SYMBOL(cdns_bus_conf);
  1166. static int cdns_port_params(struct sdw_bus *bus,
  1167. struct sdw_port_params *p_params, unsigned int bank)
  1168. {
  1169. struct sdw_cdns *cdns = bus_to_cdns(bus);
  1170. int dpn_config_off_source;
  1171. int dpn_config_off_target;
  1172. int target_num = p_params->num;
  1173. int source_num = p_params->num;
  1174. bool override = false;
  1175. int dpn_config;
  1176. if (target_num == cdns->pdi_loopback_target &&
  1177. cdns->pdi_loopback_source != -1) {
  1178. source_num = cdns->pdi_loopback_source;
  1179. override = true;
  1180. }
  1181. if (bank) {
  1182. dpn_config_off_source = CDNS_DPN_B1_CONFIG(source_num);
  1183. dpn_config_off_target = CDNS_DPN_B1_CONFIG(target_num);
  1184. } else {
  1185. dpn_config_off_source = CDNS_DPN_B0_CONFIG(source_num);
  1186. dpn_config_off_target = CDNS_DPN_B0_CONFIG(target_num);
  1187. }
  1188. dpn_config = cdns_readl(cdns, dpn_config_off_source);
  1189. /* use port params if there is no loopback, otherwise use source as is */
  1190. if (!override) {
  1191. u32p_replace_bits(&dpn_config, p_params->bps - 1, CDNS_DPN_CONFIG_WL);
  1192. u32p_replace_bits(&dpn_config, p_params->flow_mode, CDNS_DPN_CONFIG_PORT_FLOW);
  1193. u32p_replace_bits(&dpn_config, p_params->data_mode, CDNS_DPN_CONFIG_PORT_DAT);
  1194. }
  1195. cdns_writel(cdns, dpn_config_off_target, dpn_config);
  1196. return 0;
  1197. }
  1198. static int cdns_transport_params(struct sdw_bus *bus,
  1199. struct sdw_transport_params *t_params,
  1200. enum sdw_reg_bank bank)
  1201. {
  1202. struct sdw_cdns *cdns = bus_to_cdns(bus);
  1203. int dpn_config;
  1204. int dpn_config_off_source;
  1205. int dpn_config_off_target;
  1206. int dpn_hctrl;
  1207. int dpn_hctrl_off_source;
  1208. int dpn_hctrl_off_target;
  1209. int dpn_offsetctrl;
  1210. int dpn_offsetctrl_off_source;
  1211. int dpn_offsetctrl_off_target;
  1212. int dpn_samplectrl;
  1213. int dpn_samplectrl_off_source;
  1214. int dpn_samplectrl_off_target;
  1215. int source_num = t_params->port_num;
  1216. int target_num = t_params->port_num;
  1217. bool override = false;
  1218. if (target_num == cdns->pdi_loopback_target &&
  1219. cdns->pdi_loopback_source != -1) {
  1220. source_num = cdns->pdi_loopback_source;
  1221. override = true;
  1222. }
  1223. /*
  1224. * Note: Only full data port is supported on the Master side for
  1225. * both PCM and PDM ports.
  1226. */
  1227. if (bank) {
  1228. dpn_config_off_source = CDNS_DPN_B1_CONFIG(source_num);
  1229. dpn_hctrl_off_source = CDNS_DPN_B1_HCTRL(source_num);
  1230. dpn_offsetctrl_off_source = CDNS_DPN_B1_OFFSET_CTRL(source_num);
  1231. dpn_samplectrl_off_source = CDNS_DPN_B1_SAMPLE_CTRL(source_num);
  1232. dpn_config_off_target = CDNS_DPN_B1_CONFIG(target_num);
  1233. dpn_hctrl_off_target = CDNS_DPN_B1_HCTRL(target_num);
  1234. dpn_offsetctrl_off_target = CDNS_DPN_B1_OFFSET_CTRL(target_num);
  1235. dpn_samplectrl_off_target = CDNS_DPN_B1_SAMPLE_CTRL(target_num);
  1236. } else {
  1237. dpn_config_off_source = CDNS_DPN_B0_CONFIG(source_num);
  1238. dpn_hctrl_off_source = CDNS_DPN_B0_HCTRL(source_num);
  1239. dpn_offsetctrl_off_source = CDNS_DPN_B0_OFFSET_CTRL(source_num);
  1240. dpn_samplectrl_off_source = CDNS_DPN_B0_SAMPLE_CTRL(source_num);
  1241. dpn_config_off_target = CDNS_DPN_B0_CONFIG(target_num);
  1242. dpn_hctrl_off_target = CDNS_DPN_B0_HCTRL(target_num);
  1243. dpn_offsetctrl_off_target = CDNS_DPN_B0_OFFSET_CTRL(target_num);
  1244. dpn_samplectrl_off_target = CDNS_DPN_B0_SAMPLE_CTRL(target_num);
  1245. }
  1246. dpn_config = cdns_readl(cdns, dpn_config_off_source);
  1247. if (!override) {
  1248. u32p_replace_bits(&dpn_config, t_params->blk_grp_ctrl, CDNS_DPN_CONFIG_BGC);
  1249. u32p_replace_bits(&dpn_config, t_params->blk_pkg_mode, CDNS_DPN_CONFIG_BPM);
  1250. }
  1251. cdns_writel(cdns, dpn_config_off_target, dpn_config);
  1252. if (!override) {
  1253. dpn_offsetctrl = 0;
  1254. u32p_replace_bits(&dpn_offsetctrl, t_params->offset1, CDNS_DPN_OFFSET_CTRL_1);
  1255. u32p_replace_bits(&dpn_offsetctrl, t_params->offset2, CDNS_DPN_OFFSET_CTRL_2);
  1256. } else {
  1257. dpn_offsetctrl = cdns_readl(cdns, dpn_offsetctrl_off_source);
  1258. }
  1259. cdns_writel(cdns, dpn_offsetctrl_off_target, dpn_offsetctrl);
  1260. if (!override) {
  1261. dpn_hctrl = 0;
  1262. u32p_replace_bits(&dpn_hctrl, t_params->hstart, CDNS_DPN_HCTRL_HSTART);
  1263. u32p_replace_bits(&dpn_hctrl, t_params->hstop, CDNS_DPN_HCTRL_HSTOP);
  1264. u32p_replace_bits(&dpn_hctrl, t_params->lane_ctrl, CDNS_DPN_HCTRL_LCTRL);
  1265. } else {
  1266. dpn_hctrl = cdns_readl(cdns, dpn_hctrl_off_source);
  1267. }
  1268. cdns_writel(cdns, dpn_hctrl_off_target, dpn_hctrl);
  1269. if (!override)
  1270. dpn_samplectrl = t_params->sample_interval - 1;
  1271. else
  1272. dpn_samplectrl = cdns_readl(cdns, dpn_samplectrl_off_source);
  1273. cdns_writel(cdns, dpn_samplectrl_off_target, dpn_samplectrl);
  1274. return 0;
  1275. }
  1276. static int cdns_port_enable(struct sdw_bus *bus,
  1277. struct sdw_enable_ch *enable_ch, unsigned int bank)
  1278. {
  1279. struct sdw_cdns *cdns = bus_to_cdns(bus);
  1280. int dpn_chnen_off, ch_mask;
  1281. if (bank)
  1282. dpn_chnen_off = CDNS_DPN_B1_CH_EN(enable_ch->port_num);
  1283. else
  1284. dpn_chnen_off = CDNS_DPN_B0_CH_EN(enable_ch->port_num);
  1285. ch_mask = enable_ch->ch_mask * enable_ch->enable;
  1286. cdns_writel(cdns, dpn_chnen_off, ch_mask);
  1287. return 0;
  1288. }
  1289. static const struct sdw_master_port_ops cdns_port_ops = {
  1290. .dpn_set_port_params = cdns_port_params,
  1291. .dpn_set_port_transport_params = cdns_transport_params,
  1292. .dpn_port_enable_ch = cdns_port_enable,
  1293. };
  1294. /**
  1295. * sdw_cdns_is_clock_stop: Check clock status
  1296. *
  1297. * @cdns: Cadence instance
  1298. */
  1299. bool sdw_cdns_is_clock_stop(struct sdw_cdns *cdns)
  1300. {
  1301. return !!(cdns_readl(cdns, CDNS_MCP_STAT) & CDNS_MCP_STAT_CLK_STOP);
  1302. }
  1303. EXPORT_SYMBOL(sdw_cdns_is_clock_stop);
  1304. /**
  1305. * sdw_cdns_clock_stop: Cadence clock stop configuration routine
  1306. *
  1307. * @cdns: Cadence instance
  1308. * @block_wake: prevent wakes if required by the platform
  1309. */
  1310. int sdw_cdns_clock_stop(struct sdw_cdns *cdns, bool block_wake)
  1311. {
  1312. bool slave_present = false;
  1313. struct sdw_slave *slave;
  1314. int ret;
  1315. sdw_cdns_check_self_clearing_bits(cdns, __func__, false, 0);
  1316. /* Check suspend status */
  1317. if (sdw_cdns_is_clock_stop(cdns)) {
  1318. dev_dbg(cdns->dev, "Clock is already stopped\n");
  1319. return 0;
  1320. }
  1321. /*
  1322. * Before entering clock stop we mask the Slave
  1323. * interrupts. This helps avoid having to deal with e.g. a
  1324. * Slave becoming UNATTACHED while the clock is being stopped
  1325. */
  1326. cdns_enable_slave_interrupts(cdns, false);
  1327. /*
  1328. * For specific platforms, it is required to be able to put
  1329. * master into a state in which it ignores wake-up trials
  1330. * in clock stop state
  1331. */
  1332. if (block_wake)
  1333. cdns_ip_updatel(cdns, CDNS_IP_MCP_CONTROL,
  1334. CDNS_IP_MCP_CONTROL_BLOCK_WAKEUP,
  1335. CDNS_IP_MCP_CONTROL_BLOCK_WAKEUP);
  1336. list_for_each_entry(slave, &cdns->bus.slaves, node) {
  1337. if (slave->status == SDW_SLAVE_ATTACHED ||
  1338. slave->status == SDW_SLAVE_ALERT) {
  1339. slave_present = true;
  1340. break;
  1341. }
  1342. }
  1343. /* commit changes */
  1344. ret = cdns_config_update(cdns);
  1345. if (ret < 0) {
  1346. dev_err(cdns->dev, "%s: config_update failed\n", __func__);
  1347. return ret;
  1348. }
  1349. /* Prepare slaves for clock stop */
  1350. if (slave_present) {
  1351. ret = sdw_bus_prep_clk_stop(&cdns->bus);
  1352. if (ret < 0 && ret != -ENODATA) {
  1353. dev_err(cdns->dev, "prepare clock stop failed %d\n", ret);
  1354. return ret;
  1355. }
  1356. }
  1357. /*
  1358. * Enter clock stop mode and only report errors if there are
  1359. * Slave devices present (ALERT or ATTACHED)
  1360. */
  1361. ret = sdw_bus_clk_stop(&cdns->bus);
  1362. if (ret < 0 && slave_present && ret != -ENODATA) {
  1363. dev_err(cdns->dev, "bus clock stop failed %d\n", ret);
  1364. return ret;
  1365. }
  1366. ret = cdns_set_wait(cdns, CDNS_MCP_STAT,
  1367. CDNS_MCP_STAT_CLK_STOP,
  1368. CDNS_MCP_STAT_CLK_STOP);
  1369. if (ret < 0)
  1370. dev_err(cdns->dev, "Clock stop failed %d\n", ret);
  1371. return ret;
  1372. }
  1373. EXPORT_SYMBOL(sdw_cdns_clock_stop);
  1374. /**
  1375. * sdw_cdns_clock_restart: Cadence PM clock restart configuration routine
  1376. *
  1377. * @cdns: Cadence instance
  1378. * @bus_reset: context may be lost while in low power modes and the bus
  1379. * may require a Severe Reset and re-enumeration after a wake.
  1380. */
  1381. int sdw_cdns_clock_restart(struct sdw_cdns *cdns, bool bus_reset)
  1382. {
  1383. int ret;
  1384. /* unmask Slave interrupts that were masked when stopping the clock */
  1385. cdns_enable_slave_interrupts(cdns, true);
  1386. ret = cdns_clear_bit(cdns, CDNS_MCP_CONTROL,
  1387. CDNS_MCP_CONTROL_CLK_STOP_CLR);
  1388. if (ret < 0) {
  1389. dev_err(cdns->dev, "Couldn't exit from clock stop\n");
  1390. return ret;
  1391. }
  1392. ret = cdns_set_wait(cdns, CDNS_MCP_STAT, CDNS_MCP_STAT_CLK_STOP, 0);
  1393. if (ret < 0) {
  1394. dev_err(cdns->dev, "clock stop exit failed %d\n", ret);
  1395. return ret;
  1396. }
  1397. cdns_ip_updatel(cdns, CDNS_IP_MCP_CONTROL,
  1398. CDNS_IP_MCP_CONTROL_BLOCK_WAKEUP, 0);
  1399. cdns_ip_updatel(cdns, CDNS_IP_MCP_CONTROL, CDNS_IP_MCP_CONTROL_CMD_ACCEPT,
  1400. CDNS_IP_MCP_CONTROL_CMD_ACCEPT);
  1401. if (!bus_reset) {
  1402. /* enable bus operations with clock and data */
  1403. cdns_ip_updatel(cdns, CDNS_IP_MCP_CONFIG,
  1404. CDNS_IP_MCP_CONFIG_OP,
  1405. CDNS_IP_MCP_CONFIG_OP_NORMAL);
  1406. ret = cdns_config_update(cdns);
  1407. if (ret < 0) {
  1408. dev_err(cdns->dev, "%s: config_update failed\n", __func__);
  1409. return ret;
  1410. }
  1411. ret = sdw_bus_exit_clk_stop(&cdns->bus);
  1412. if (ret < 0)
  1413. dev_err(cdns->dev, "bus failed to exit clock stop %d\n", ret);
  1414. }
  1415. return ret;
  1416. }
  1417. EXPORT_SYMBOL(sdw_cdns_clock_restart);
  1418. /**
  1419. * sdw_cdns_probe() - Cadence probe routine
  1420. * @cdns: Cadence instance
  1421. */
  1422. int sdw_cdns_probe(struct sdw_cdns *cdns)
  1423. {
  1424. init_completion(&cdns->tx_complete);
  1425. cdns->bus.port_ops = &cdns_port_ops;
  1426. mutex_init(&cdns->status_update_lock);
  1427. INIT_WORK(&cdns->work, cdns_update_slave_status_work);
  1428. INIT_DELAYED_WORK(&cdns->attach_dwork, cdns_check_attached_status_dwork);
  1429. return 0;
  1430. }
  1431. EXPORT_SYMBOL(sdw_cdns_probe);
  1432. int cdns_set_sdw_stream(struct snd_soc_dai *dai,
  1433. void *stream, int direction)
  1434. {
  1435. struct sdw_cdns *cdns = snd_soc_dai_get_drvdata(dai);
  1436. struct sdw_cdns_dai_runtime *dai_runtime;
  1437. dai_runtime = cdns->dai_runtime_array[dai->id];
  1438. if (stream) {
  1439. /* first paranoia check */
  1440. if (dai_runtime) {
  1441. dev_err(dai->dev,
  1442. "dai_runtime already allocated for dai %s\n",
  1443. dai->name);
  1444. return -EINVAL;
  1445. }
  1446. /* allocate and set dai_runtime info */
  1447. dai_runtime = kzalloc(sizeof(*dai_runtime), GFP_KERNEL);
  1448. if (!dai_runtime)
  1449. return -ENOMEM;
  1450. dai_runtime->stream_type = SDW_STREAM_PCM;
  1451. dai_runtime->bus = &cdns->bus;
  1452. dai_runtime->link_id = cdns->instance;
  1453. dai_runtime->stream = stream;
  1454. dai_runtime->direction = direction;
  1455. cdns->dai_runtime_array[dai->id] = dai_runtime;
  1456. } else {
  1457. /* second paranoia check */
  1458. if (!dai_runtime) {
  1459. dev_err(dai->dev,
  1460. "dai_runtime not allocated for dai %s\n",
  1461. dai->name);
  1462. return -EINVAL;
  1463. }
  1464. /* for NULL stream we release allocated dai_runtime */
  1465. kfree(dai_runtime);
  1466. cdns->dai_runtime_array[dai->id] = NULL;
  1467. }
  1468. return 0;
  1469. }
  1470. EXPORT_SYMBOL(cdns_set_sdw_stream);
  1471. /**
  1472. * cdns_find_pdi() - Find a free PDI
  1473. *
  1474. * @cdns: Cadence instance
  1475. * @num: Number of PDIs
  1476. * @pdi: PDI instances
  1477. * @dai_id: DAI id
  1478. *
  1479. * Find a PDI for a given PDI array. The PDI num and dai_id are
  1480. * expected to match, return NULL otherwise.
  1481. */
  1482. static struct sdw_cdns_pdi *cdns_find_pdi(struct sdw_cdns *cdns,
  1483. unsigned int num,
  1484. struct sdw_cdns_pdi *pdi,
  1485. int dai_id)
  1486. {
  1487. int i;
  1488. for (i = 0; i < num; i++)
  1489. if (pdi[i].num == dai_id)
  1490. return &pdi[i];
  1491. return NULL;
  1492. }
  1493. /**
  1494. * sdw_cdns_config_stream: Configure a stream
  1495. *
  1496. * @cdns: Cadence instance
  1497. * @ch: Channel count
  1498. * @dir: Data direction
  1499. * @pdi: PDI to be used
  1500. */
  1501. void sdw_cdns_config_stream(struct sdw_cdns *cdns,
  1502. u32 ch, u32 dir, struct sdw_cdns_pdi *pdi)
  1503. {
  1504. u32 offset, val = 0;
  1505. if (dir == SDW_DATA_DIR_RX) {
  1506. val = CDNS_PORTCTRL_DIRN;
  1507. if (cdns->bus.params.m_data_mode != SDW_PORT_DATA_MODE_NORMAL)
  1508. val |= CDNS_PORTCTRL_TEST_FAILED;
  1509. }
  1510. offset = CDNS_PORTCTRL + pdi->num * CDNS_PORT_OFFSET;
  1511. cdns_updatel(cdns, offset,
  1512. CDNS_PORTCTRL_DIRN | CDNS_PORTCTRL_TEST_FAILED,
  1513. val);
  1514. val = pdi->num;
  1515. val |= CDNS_PDI_CONFIG_SOFT_RESET;
  1516. val |= FIELD_PREP(CDNS_PDI_CONFIG_CHANNEL, (1 << ch) - 1);
  1517. cdns_writel(cdns, CDNS_PDI_CONFIG(pdi->num), val);
  1518. }
  1519. EXPORT_SYMBOL(sdw_cdns_config_stream);
  1520. /**
  1521. * sdw_cdns_alloc_pdi() - Allocate a PDI
  1522. *
  1523. * @cdns: Cadence instance
  1524. * @stream: Stream to be allocated
  1525. * @ch: Channel count
  1526. * @dir: Data direction
  1527. * @dai_id: DAI id
  1528. */
  1529. struct sdw_cdns_pdi *sdw_cdns_alloc_pdi(struct sdw_cdns *cdns,
  1530. struct sdw_cdns_streams *stream,
  1531. u32 ch, u32 dir, int dai_id)
  1532. {
  1533. struct sdw_cdns_pdi *pdi = NULL;
  1534. if (dir == SDW_DATA_DIR_RX)
  1535. pdi = cdns_find_pdi(cdns, stream->num_in, stream->in,
  1536. dai_id);
  1537. else
  1538. pdi = cdns_find_pdi(cdns, stream->num_out, stream->out,
  1539. dai_id);
  1540. /* check if we found a PDI, else find in bi-directional */
  1541. if (!pdi)
  1542. pdi = cdns_find_pdi(cdns, stream->num_bd, stream->bd,
  1543. dai_id);
  1544. if (pdi) {
  1545. pdi->l_ch_num = 0;
  1546. pdi->h_ch_num = ch - 1;
  1547. pdi->dir = dir;
  1548. pdi->ch_count = ch;
  1549. }
  1550. return pdi;
  1551. }
  1552. EXPORT_SYMBOL(sdw_cdns_alloc_pdi);
  1553. MODULE_LICENSE("Dual BSD/GPL");
  1554. MODULE_DESCRIPTION("Cadence Soundwire Library");