qcom.c 52 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838
  1. // SPDX-License-Identifier: GPL-2.0
  2. // Copyright (c) 2019, Linaro Limited
  3. #include <linux/clk.h>
  4. #include <linux/completion.h>
  5. #include <linux/interrupt.h>
  6. #include <linux/io.h>
  7. #include <linux/kernel.h>
  8. #include <linux/module.h>
  9. #include <linux/debugfs.h>
  10. #include <linux/of.h>
  11. #include <linux/of_irq.h>
  12. #include <linux/pm_runtime.h>
  13. #include <linux/regmap.h>
  14. #include <linux/reset.h>
  15. #include <linux/slab.h>
  16. #include <linux/pm_wakeirq.h>
  17. #include <linux/slimbus.h>
  18. #include <linux/soundwire/sdw.h>
  19. #include <linux/soundwire/sdw_registers.h>
  20. #include <sound/pcm_params.h>
  21. #include <sound/soc.h>
  22. #include "bus.h"
  23. #define SWRM_COMP_SW_RESET 0x008
  24. #define SWRM_COMP_STATUS 0x014
  25. #define SWRM_LINK_MANAGER_EE 0x018
  26. #define SWRM_EE_CPU 1
  27. #define SWRM_FRM_GEN_ENABLED BIT(0)
  28. #define SWRM_VERSION_1_3_0 0x01030000
  29. #define SWRM_VERSION_1_5_1 0x01050001
  30. #define SWRM_VERSION_1_7_0 0x01070000
  31. #define SWRM_VERSION_2_0_0 0x02000000
  32. #define SWRM_VERSION_3_1_0 0x03010000
  33. #define SWRM_COMP_HW_VERSION 0x00
  34. #define SWRM_COMP_CFG_ADDR 0x04
  35. #define SWRM_COMP_CFG_IRQ_LEVEL_OR_PULSE_MSK BIT(1)
  36. #define SWRM_COMP_CFG_ENABLE_MSK BIT(0)
  37. #define SWRM_COMP_PARAMS 0x100
  38. #define SWRM_COMP_PARAMS_WR_FIFO_DEPTH GENMASK(14, 10)
  39. #define SWRM_COMP_PARAMS_RD_FIFO_DEPTH GENMASK(19, 15)
  40. #define SWRM_COMP_PARAMS_DOUT_PORTS_MASK GENMASK(4, 0)
  41. #define SWRM_COMP_PARAMS_DIN_PORTS_MASK GENMASK(9, 5)
  42. #define SWRM_V3_COMP_PARAMS_WR_FIFO_DEPTH GENMASK(17, 10)
  43. #define SWRM_V3_COMP_PARAMS_RD_FIFO_DEPTH GENMASK(23, 18)
  44. #define SWRM_COMP_MASTER_ID 0x104
  45. #define SWRM_V1_3_INTERRUPT_STATUS 0x200
  46. #define SWRM_V2_0_INTERRUPT_STATUS 0x5000
  47. #define SWRM_INTERRUPT_STATUS_RMSK GENMASK(16, 0)
  48. #define SWRM_INTERRUPT_STATUS_SLAVE_PEND_IRQ BIT(0)
  49. #define SWRM_INTERRUPT_STATUS_NEW_SLAVE_ATTACHED BIT(1)
  50. #define SWRM_INTERRUPT_STATUS_CHANGE_ENUM_SLAVE_STATUS BIT(2)
  51. #define SWRM_INTERRUPT_STATUS_MASTER_CLASH_DET BIT(3)
  52. #define SWRM_INTERRUPT_STATUS_RD_FIFO_OVERFLOW BIT(4)
  53. #define SWRM_INTERRUPT_STATUS_RD_FIFO_UNDERFLOW BIT(5)
  54. #define SWRM_INTERRUPT_STATUS_WR_CMD_FIFO_OVERFLOW BIT(6)
  55. #define SWRM_INTERRUPT_STATUS_CMD_ERROR BIT(7)
  56. #define SWRM_INTERRUPT_STATUS_DOUT_PORT_COLLISION BIT(8)
  57. #define SWRM_INTERRUPT_STATUS_READ_EN_RD_VALID_MISMATCH BIT(9)
  58. #define SWRM_INTERRUPT_STATUS_SPECIAL_CMD_ID_FINISHED BIT(10)
  59. #define SWRM_INTERRUPT_STATUS_AUTO_ENUM_FAILED BIT(11)
  60. #define SWRM_INTERRUPT_STATUS_AUTO_ENUM_TABLE_IS_FULL BIT(12)
  61. #define SWRM_INTERRUPT_STATUS_BUS_RESET_FINISHED_V2 BIT(13)
  62. #define SWRM_INTERRUPT_STATUS_CLK_STOP_FINISHED_V2 BIT(14)
  63. #define SWRM_INTERRUPT_STATUS_EXT_CLK_STOP_WAKEUP BIT(16)
  64. #define SWRM_INTERRUPT_STATUS_CMD_IGNORED_AND_EXEC_CONTINUED BIT(19)
  65. #define SWRM_INTERRUPT_MAX 17
  66. #define SWRM_V1_3_INTERRUPT_MASK_ADDR 0x204
  67. #define SWRM_V1_3_INTERRUPT_CLEAR 0x208
  68. #define SWRM_V2_0_INTERRUPT_CLEAR 0x5008
  69. #define SWRM_V1_3_INTERRUPT_CPU_EN 0x210
  70. #define SWRM_V2_0_INTERRUPT_CPU_EN 0x5004
  71. #define SWRM_V1_3_CMD_FIFO_WR_CMD 0x300
  72. #define SWRM_V2_0_CMD_FIFO_WR_CMD 0x5020
  73. #define SWRM_V1_3_CMD_FIFO_RD_CMD 0x304
  74. #define SWRM_V2_0_CMD_FIFO_RD_CMD 0x5024
  75. #define SWRM_CMD_FIFO_CMD 0x308
  76. #define SWRM_CMD_FIFO_FLUSH 0x1
  77. #define SWRM_V1_3_CMD_FIFO_STATUS 0x30C
  78. #define SWRM_V2_0_CMD_FIFO_STATUS 0x5050
  79. #define SWRM_RD_CMD_FIFO_CNT_MASK GENMASK(20, 16)
  80. #define SWRM_WR_CMD_FIFO_CNT_MASK GENMASK(12, 8)
  81. #define SWRM_CMD_FIFO_CFG_ADDR 0x314
  82. #define SWRM_CONTINUE_EXEC_ON_CMD_IGNORE BIT(31)
  83. #define SWRM_RD_WR_CMD_RETRIES 0x7
  84. #define SWRM_V1_3_CMD_FIFO_RD_FIFO_ADDR 0x318
  85. #define SWRM_V2_0_CMD_FIFO_RD_FIFO_ADDR 0x5040
  86. #define SWRM_RD_FIFO_CMD_ID_MASK GENMASK(11, 8)
  87. #define SWRM_ENUMERATOR_CFG_ADDR 0x500
  88. #define SWRM_ENUMERATOR_SLAVE_DEV_ID_1(m) (0x530 + 0x8 * (m))
  89. #define SWRM_ENUMERATOR_SLAVE_DEV_ID_2(m) (0x534 + 0x8 * (m))
  90. #define SWRM_MCP_FRAME_CTRL_BANK_ADDR(m) (0x101C + 0x40 * (m))
  91. #define SWRM_MCP_FRAME_CTRL_BANK_COL_CTRL_BMSK GENMASK(2, 0)
  92. #define SWRM_MCP_FRAME_CTRL_BANK_ROW_CTRL_BMSK GENMASK(7, 3)
  93. #define SWRM_MCP_BUS_CTRL 0x1044
  94. #define SWRM_MCP_BUS_CLK_START BIT(1)
  95. #define SWRM_MCP_CFG_ADDR 0x1048
  96. #define SWRM_MCP_CFG_MAX_NUM_OF_CMD_NO_PINGS_BMSK GENMASK(21, 17)
  97. #define SWRM_DEF_CMD_NO_PINGS 0x1f
  98. #define SWRM_MCP_STATUS 0x104C
  99. #define SWRM_MCP_STATUS_BANK_NUM_MASK BIT(0)
  100. #define SWRM_MCP_SLV_STATUS 0x1090
  101. #define SWRM_MCP_SLV_STATUS_MASK GENMASK(1, 0)
  102. #define SWRM_MCP_SLV_STATUS_SZ 2
  103. #define SWRM_DPn_PORT_CTRL_BANK(offset, n, m) (offset + 0x100 * (n - 1) + 0x40 * m)
  104. #define SWRM_DPn_PORT_CTRL_2_BANK(offset, n, m) (offset + 0x100 * (n - 1) + 0x40 * m)
  105. #define SWRM_DPn_BLOCK_CTRL_1(offset, n) (offset + 0x100 * (n - 1))
  106. #define SWRM_DPn_BLOCK_CTRL2_BANK(offset, n, m) (offset + 0x100 * (n - 1) + 0x40 * m)
  107. #define SWRM_DPn_PORT_HCTRL_BANK(offset, n, m) (offset + 0x100 * (n - 1) + 0x40 * m)
  108. #define SWRM_DPn_BLOCK_CTRL3_BANK(offset, n, m) (offset + 0x100 * (n - 1) + 0x40 * m)
  109. #define SWRM_DPn_SAMPLECTRL2_BANK(offset, n, m) (offset + 0x100 * (n - 1) + 0x40 * m)
  110. #define SWR_V1_3_MSTR_MAX_REG_ADDR 0x1740
  111. #define SWR_V2_0_MSTR_MAX_REG_ADDR 0x50ac
  112. #define SWRM_V2_0_CLK_CTRL 0x5060
  113. #define SWRM_V2_0_CLK_CTRL_CLK_START BIT(0)
  114. #define SWRM_V2_0_LINK_STATUS 0x5064
  115. #define SWRM_DP_PORT_CTRL_EN_CHAN_SHFT 0x18
  116. #define SWRM_DP_PORT_CTRL_OFFSET2_SHFT 0x10
  117. #define SWRM_DP_PORT_CTRL_OFFSET1_SHFT 0x08
  118. #define SWRM_AHB_BRIDGE_WR_DATA_0 0xc85
  119. #define SWRM_AHB_BRIDGE_WR_ADDR_0 0xc89
  120. #define SWRM_AHB_BRIDGE_RD_ADDR_0 0xc8d
  121. #define SWRM_AHB_BRIDGE_RD_DATA_0 0xc91
  122. #define SWRM_REG_VAL_PACK(data, dev, id, reg) \
  123. ((reg) | ((id) << 16) | ((dev) << 20) | ((data) << 24))
  124. #define MAX_FREQ_NUM 1
  125. #define TIMEOUT_MS 100
  126. #define QCOM_SWRM_MAX_RD_LEN 0x1
  127. #define DEFAULT_CLK_FREQ 9600000
  128. #define SWRM_MAX_DAIS 0xF
  129. #define SWR_INVALID_PARAM 0xFF
  130. #define SWR_HSTOP_MAX_VAL 0xF
  131. #define SWR_HSTART_MIN_VAL 0x0
  132. #define SWR_BROADCAST_CMD_ID 0x0F
  133. #define SWR_MAX_CMD_ID 14
  134. #define MAX_FIFO_RD_RETRY 3
  135. #define SWR_OVERFLOW_RETRY_COUNT 30
  136. #define SWRM_LINK_STATUS_RETRY_CNT 100
  137. enum {
  138. MASTER_ID_WSA = 1,
  139. MASTER_ID_RX,
  140. MASTER_ID_TX
  141. };
  142. struct qcom_swrm_port_config {
  143. u16 si;
  144. u8 off1;
  145. u8 off2;
  146. u8 bp_mode;
  147. u8 hstart;
  148. u8 hstop;
  149. u8 word_length;
  150. u8 blk_group_count;
  151. u8 lane_control;
  152. };
  153. /*
  154. * Internal IDs for different register layouts. Only few registers differ per
  155. * each variant, so the list of IDs below does not include all of registers.
  156. */
  157. enum {
  158. SWRM_REG_FRAME_GEN_ENABLED,
  159. SWRM_REG_INTERRUPT_STATUS,
  160. SWRM_REG_INTERRUPT_MASK_ADDR,
  161. SWRM_REG_INTERRUPT_CLEAR,
  162. SWRM_REG_INTERRUPT_CPU_EN,
  163. SWRM_REG_CMD_FIFO_WR_CMD,
  164. SWRM_REG_CMD_FIFO_RD_CMD,
  165. SWRM_REG_CMD_FIFO_STATUS,
  166. SWRM_REG_CMD_FIFO_RD_FIFO_ADDR,
  167. SWRM_OFFSET_DP_PORT_CTRL_BANK,
  168. SWRM_OFFSET_DP_PORT_CTRL_2_BANK,
  169. SWRM_OFFSET_DP_BLOCK_CTRL_1,
  170. SWRM_OFFSET_DP_BLOCK_CTRL2_BANK,
  171. SWRM_OFFSET_DP_PORT_HCTRL_BANK,
  172. SWRM_OFFSET_DP_BLOCK_CTRL3_BANK,
  173. SWRM_OFFSET_DP_SAMPLECTRL2_BANK,
  174. };
  175. struct qcom_swrm_ctrl {
  176. struct sdw_bus bus;
  177. struct device *dev;
  178. struct regmap *regmap;
  179. u32 max_reg;
  180. const unsigned int *reg_layout;
  181. void __iomem *mmio;
  182. struct reset_control *audio_cgcr;
  183. #ifdef CONFIG_DEBUG_FS
  184. struct dentry *debugfs;
  185. #endif
  186. struct completion broadcast;
  187. struct completion enumeration;
  188. /* Port alloc/free lock */
  189. struct mutex port_lock;
  190. struct clk *hclk;
  191. int irq;
  192. unsigned int version;
  193. int wake_irq;
  194. int num_din_ports;
  195. int num_dout_ports;
  196. int nports;
  197. int cols_index;
  198. int rows_index;
  199. unsigned long port_mask;
  200. u32 intr_mask;
  201. u8 rcmd_id;
  202. u8 wcmd_id;
  203. /* Port numbers are 1 - 14 */
  204. struct qcom_swrm_port_config *pconfig;
  205. struct sdw_stream_runtime *sruntime[SWRM_MAX_DAIS];
  206. enum sdw_slave_status status[SDW_MAX_DEVICES + 1];
  207. int (*reg_read)(struct qcom_swrm_ctrl *ctrl, int reg, u32 *val);
  208. int (*reg_write)(struct qcom_swrm_ctrl *ctrl, int reg, int val);
  209. u32 slave_status;
  210. u32 wr_fifo_depth;
  211. bool clock_stop_not_supported;
  212. };
  213. struct qcom_swrm_data {
  214. u32 default_cols;
  215. u32 default_rows;
  216. bool sw_clk_gate_required;
  217. u32 max_reg;
  218. const unsigned int *reg_layout;
  219. };
  220. static const unsigned int swrm_v1_3_reg_layout[] = {
  221. [SWRM_REG_FRAME_GEN_ENABLED] = SWRM_COMP_STATUS,
  222. [SWRM_REG_INTERRUPT_STATUS] = SWRM_V1_3_INTERRUPT_STATUS,
  223. [SWRM_REG_INTERRUPT_MASK_ADDR] = SWRM_V1_3_INTERRUPT_MASK_ADDR,
  224. [SWRM_REG_INTERRUPT_CLEAR] = SWRM_V1_3_INTERRUPT_CLEAR,
  225. [SWRM_REG_INTERRUPT_CPU_EN] = SWRM_V1_3_INTERRUPT_CPU_EN,
  226. [SWRM_REG_CMD_FIFO_WR_CMD] = SWRM_V1_3_CMD_FIFO_WR_CMD,
  227. [SWRM_REG_CMD_FIFO_RD_CMD] = SWRM_V1_3_CMD_FIFO_RD_CMD,
  228. [SWRM_REG_CMD_FIFO_STATUS] = SWRM_V1_3_CMD_FIFO_STATUS,
  229. [SWRM_REG_CMD_FIFO_RD_FIFO_ADDR] = SWRM_V1_3_CMD_FIFO_RD_FIFO_ADDR,
  230. [SWRM_OFFSET_DP_PORT_CTRL_BANK] = 0x1124,
  231. [SWRM_OFFSET_DP_PORT_CTRL_2_BANK] = 0x1128,
  232. [SWRM_OFFSET_DP_BLOCK_CTRL_1] = 0x112c,
  233. [SWRM_OFFSET_DP_BLOCK_CTRL2_BANK] = 0x1130,
  234. [SWRM_OFFSET_DP_PORT_HCTRL_BANK] = 0x1134,
  235. [SWRM_OFFSET_DP_BLOCK_CTRL3_BANK] = 0x1138,
  236. [SWRM_OFFSET_DP_SAMPLECTRL2_BANK] = 0x113c,
  237. };
  238. static const struct qcom_swrm_data swrm_v1_3_data = {
  239. .default_rows = 48,
  240. .default_cols = 16,
  241. .max_reg = SWR_V1_3_MSTR_MAX_REG_ADDR,
  242. .reg_layout = swrm_v1_3_reg_layout,
  243. };
  244. static const struct qcom_swrm_data swrm_v1_5_data = {
  245. .default_rows = 50,
  246. .default_cols = 16,
  247. .max_reg = SWR_V1_3_MSTR_MAX_REG_ADDR,
  248. .reg_layout = swrm_v1_3_reg_layout,
  249. };
  250. static const struct qcom_swrm_data swrm_v1_6_data = {
  251. .default_rows = 50,
  252. .default_cols = 16,
  253. .sw_clk_gate_required = true,
  254. .max_reg = SWR_V1_3_MSTR_MAX_REG_ADDR,
  255. .reg_layout = swrm_v1_3_reg_layout,
  256. };
  257. static const unsigned int swrm_v2_0_reg_layout[] = {
  258. [SWRM_REG_FRAME_GEN_ENABLED] = SWRM_V2_0_LINK_STATUS,
  259. [SWRM_REG_INTERRUPT_STATUS] = SWRM_V2_0_INTERRUPT_STATUS,
  260. [SWRM_REG_INTERRUPT_MASK_ADDR] = 0, /* Not present */
  261. [SWRM_REG_INTERRUPT_CLEAR] = SWRM_V2_0_INTERRUPT_CLEAR,
  262. [SWRM_REG_INTERRUPT_CPU_EN] = SWRM_V2_0_INTERRUPT_CPU_EN,
  263. [SWRM_REG_CMD_FIFO_WR_CMD] = SWRM_V2_0_CMD_FIFO_WR_CMD,
  264. [SWRM_REG_CMD_FIFO_RD_CMD] = SWRM_V2_0_CMD_FIFO_RD_CMD,
  265. [SWRM_REG_CMD_FIFO_STATUS] = SWRM_V2_0_CMD_FIFO_STATUS,
  266. [SWRM_REG_CMD_FIFO_RD_FIFO_ADDR] = SWRM_V2_0_CMD_FIFO_RD_FIFO_ADDR,
  267. [SWRM_OFFSET_DP_PORT_CTRL_BANK] = 0x1124,
  268. [SWRM_OFFSET_DP_PORT_CTRL_2_BANK] = 0x1128,
  269. [SWRM_OFFSET_DP_BLOCK_CTRL_1] = 0x112c,
  270. [SWRM_OFFSET_DP_BLOCK_CTRL2_BANK] = 0x1130,
  271. [SWRM_OFFSET_DP_PORT_HCTRL_BANK] = 0x1134,
  272. [SWRM_OFFSET_DP_BLOCK_CTRL3_BANK] = 0x1138,
  273. [SWRM_OFFSET_DP_SAMPLECTRL2_BANK] = 0x113c,
  274. };
  275. static const struct qcom_swrm_data swrm_v2_0_data = {
  276. .default_rows = 50,
  277. .default_cols = 16,
  278. .sw_clk_gate_required = true,
  279. .max_reg = SWR_V2_0_MSTR_MAX_REG_ADDR,
  280. .reg_layout = swrm_v2_0_reg_layout,
  281. };
  282. static const unsigned int swrm_v3_0_reg_layout[] = {
  283. [SWRM_REG_FRAME_GEN_ENABLED] = SWRM_V2_0_LINK_STATUS,
  284. [SWRM_REG_INTERRUPT_STATUS] = SWRM_V2_0_INTERRUPT_STATUS,
  285. [SWRM_REG_INTERRUPT_MASK_ADDR] = 0, /* Not present */
  286. [SWRM_REG_INTERRUPT_CLEAR] = SWRM_V2_0_INTERRUPT_CLEAR,
  287. [SWRM_REG_INTERRUPT_CPU_EN] = SWRM_V2_0_INTERRUPT_CPU_EN,
  288. [SWRM_REG_CMD_FIFO_WR_CMD] = SWRM_V2_0_CMD_FIFO_WR_CMD,
  289. [SWRM_REG_CMD_FIFO_RD_CMD] = SWRM_V2_0_CMD_FIFO_RD_CMD,
  290. [SWRM_REG_CMD_FIFO_STATUS] = SWRM_V2_0_CMD_FIFO_STATUS,
  291. [SWRM_REG_CMD_FIFO_RD_FIFO_ADDR] = SWRM_V2_0_CMD_FIFO_RD_FIFO_ADDR,
  292. [SWRM_OFFSET_DP_PORT_CTRL_BANK] = 0x1224,
  293. [SWRM_OFFSET_DP_PORT_CTRL_2_BANK] = 0x1228,
  294. [SWRM_OFFSET_DP_BLOCK_CTRL_1] = 0x122c,
  295. [SWRM_OFFSET_DP_BLOCK_CTRL2_BANK] = 0x1230,
  296. [SWRM_OFFSET_DP_PORT_HCTRL_BANK] = 0x1234,
  297. [SWRM_OFFSET_DP_BLOCK_CTRL3_BANK] = 0x1238,
  298. [SWRM_OFFSET_DP_SAMPLECTRL2_BANK] = 0x123c,
  299. };
  300. static const struct qcom_swrm_data swrm_v3_0_data = {
  301. .default_rows = 50,
  302. .default_cols = 16,
  303. .sw_clk_gate_required = true,
  304. .max_reg = SWR_V2_0_MSTR_MAX_REG_ADDR,
  305. .reg_layout = swrm_v3_0_reg_layout,
  306. };
  307. #define to_qcom_sdw(b) container_of(b, struct qcom_swrm_ctrl, bus)
  308. static int qcom_swrm_ahb_reg_read(struct qcom_swrm_ctrl *ctrl, int reg,
  309. u32 *val)
  310. {
  311. struct regmap *wcd_regmap = ctrl->regmap;
  312. int ret;
  313. /* pg register + offset */
  314. ret = regmap_bulk_write(wcd_regmap, SWRM_AHB_BRIDGE_RD_ADDR_0,
  315. (u8 *)&reg, 4);
  316. if (ret < 0)
  317. return SDW_CMD_FAIL;
  318. ret = regmap_bulk_read(wcd_regmap, SWRM_AHB_BRIDGE_RD_DATA_0,
  319. val, 4);
  320. if (ret < 0)
  321. return SDW_CMD_FAIL;
  322. return SDW_CMD_OK;
  323. }
  324. static int qcom_swrm_ahb_reg_write(struct qcom_swrm_ctrl *ctrl,
  325. int reg, int val)
  326. {
  327. struct regmap *wcd_regmap = ctrl->regmap;
  328. int ret;
  329. /* pg register + offset */
  330. ret = regmap_bulk_write(wcd_regmap, SWRM_AHB_BRIDGE_WR_DATA_0,
  331. (u8 *)&val, 4);
  332. if (ret)
  333. return SDW_CMD_FAIL;
  334. /* write address register */
  335. ret = regmap_bulk_write(wcd_regmap, SWRM_AHB_BRIDGE_WR_ADDR_0,
  336. (u8 *)&reg, 4);
  337. if (ret)
  338. return SDW_CMD_FAIL;
  339. return SDW_CMD_OK;
  340. }
  341. static int qcom_swrm_cpu_reg_read(struct qcom_swrm_ctrl *ctrl, int reg,
  342. u32 *val)
  343. {
  344. *val = readl(ctrl->mmio + reg);
  345. return SDW_CMD_OK;
  346. }
  347. static int qcom_swrm_cpu_reg_write(struct qcom_swrm_ctrl *ctrl, int reg,
  348. int val)
  349. {
  350. writel(val, ctrl->mmio + reg);
  351. return SDW_CMD_OK;
  352. }
  353. static u32 swrm_get_packed_reg_val(u8 *cmd_id, u8 cmd_data,
  354. u8 dev_addr, u16 reg_addr)
  355. {
  356. u32 val;
  357. u8 id = *cmd_id;
  358. if (id != SWR_BROADCAST_CMD_ID) {
  359. if (id < SWR_MAX_CMD_ID)
  360. id += 1;
  361. else
  362. id = 0;
  363. *cmd_id = id;
  364. }
  365. val = SWRM_REG_VAL_PACK(cmd_data, dev_addr, id, reg_addr);
  366. return val;
  367. }
  368. static int swrm_wait_for_rd_fifo_avail(struct qcom_swrm_ctrl *ctrl)
  369. {
  370. u32 fifo_outstanding_data, value;
  371. int fifo_retry_count = SWR_OVERFLOW_RETRY_COUNT;
  372. do {
  373. /* Check for fifo underflow during read */
  374. ctrl->reg_read(ctrl, ctrl->reg_layout[SWRM_REG_CMD_FIFO_STATUS],
  375. &value);
  376. fifo_outstanding_data = FIELD_GET(SWRM_RD_CMD_FIFO_CNT_MASK, value);
  377. /* Check if read data is available in read fifo */
  378. if (fifo_outstanding_data > 0)
  379. return 0;
  380. usleep_range(500, 510);
  381. } while (fifo_retry_count--);
  382. if (fifo_outstanding_data == 0) {
  383. dev_err_ratelimited(ctrl->dev, "%s err read underflow\n", __func__);
  384. return -EIO;
  385. }
  386. return 0;
  387. }
  388. static int swrm_wait_for_wr_fifo_avail(struct qcom_swrm_ctrl *ctrl)
  389. {
  390. u32 fifo_outstanding_cmds, value;
  391. int fifo_retry_count = SWR_OVERFLOW_RETRY_COUNT;
  392. do {
  393. /* Check for fifo overflow during write */
  394. ctrl->reg_read(ctrl, ctrl->reg_layout[SWRM_REG_CMD_FIFO_STATUS],
  395. &value);
  396. fifo_outstanding_cmds = FIELD_GET(SWRM_WR_CMD_FIFO_CNT_MASK, value);
  397. /* Check for space in write fifo before writing */
  398. if (fifo_outstanding_cmds < ctrl->wr_fifo_depth)
  399. return 0;
  400. usleep_range(500, 510);
  401. } while (fifo_retry_count--);
  402. if (fifo_outstanding_cmds == ctrl->wr_fifo_depth) {
  403. dev_err_ratelimited(ctrl->dev, "%s err write overflow\n", __func__);
  404. return -EIO;
  405. }
  406. return 0;
  407. }
  408. static bool swrm_wait_for_wr_fifo_done(struct qcom_swrm_ctrl *ctrl)
  409. {
  410. u32 fifo_outstanding_cmds, value;
  411. int fifo_retry_count = SWR_OVERFLOW_RETRY_COUNT;
  412. /* Check for fifo overflow during write */
  413. ctrl->reg_read(ctrl, ctrl->reg_layout[SWRM_REG_CMD_FIFO_STATUS], &value);
  414. fifo_outstanding_cmds = FIELD_GET(SWRM_WR_CMD_FIFO_CNT_MASK, value);
  415. if (fifo_outstanding_cmds) {
  416. while (fifo_retry_count) {
  417. usleep_range(500, 510);
  418. ctrl->reg_read(ctrl, ctrl->reg_layout[SWRM_REG_CMD_FIFO_STATUS], &value);
  419. fifo_outstanding_cmds = FIELD_GET(SWRM_WR_CMD_FIFO_CNT_MASK, value);
  420. fifo_retry_count--;
  421. if (fifo_outstanding_cmds == 0)
  422. return true;
  423. }
  424. } else {
  425. return true;
  426. }
  427. return false;
  428. }
  429. static int qcom_swrm_cmd_fifo_wr_cmd(struct qcom_swrm_ctrl *ctrl, u8 cmd_data,
  430. u8 dev_addr, u16 reg_addr)
  431. {
  432. u32 val;
  433. int ret = 0;
  434. u8 cmd_id = 0x0;
  435. if (dev_addr == SDW_BROADCAST_DEV_NUM) {
  436. cmd_id = SWR_BROADCAST_CMD_ID;
  437. val = swrm_get_packed_reg_val(&cmd_id, cmd_data,
  438. dev_addr, reg_addr);
  439. } else {
  440. val = swrm_get_packed_reg_val(&ctrl->wcmd_id, cmd_data,
  441. dev_addr, reg_addr);
  442. }
  443. if (swrm_wait_for_wr_fifo_avail(ctrl))
  444. return SDW_CMD_FAIL_OTHER;
  445. if (cmd_id == SWR_BROADCAST_CMD_ID)
  446. reinit_completion(&ctrl->broadcast);
  447. /* Its assumed that write is okay as we do not get any status back */
  448. ctrl->reg_write(ctrl, ctrl->reg_layout[SWRM_REG_CMD_FIFO_WR_CMD], val);
  449. if (ctrl->version <= SWRM_VERSION_1_3_0)
  450. usleep_range(150, 155);
  451. if (cmd_id == SWR_BROADCAST_CMD_ID) {
  452. swrm_wait_for_wr_fifo_done(ctrl);
  453. /*
  454. * sleep for 10ms for MSM soundwire variant to allow broadcast
  455. * command to complete.
  456. */
  457. ret = wait_for_completion_timeout(&ctrl->broadcast,
  458. msecs_to_jiffies(TIMEOUT_MS));
  459. if (!ret)
  460. ret = SDW_CMD_IGNORED;
  461. else
  462. ret = SDW_CMD_OK;
  463. } else {
  464. ret = SDW_CMD_OK;
  465. }
  466. return ret;
  467. }
  468. static int qcom_swrm_cmd_fifo_rd_cmd(struct qcom_swrm_ctrl *ctrl,
  469. u8 dev_addr, u16 reg_addr,
  470. u32 len, u8 *rval)
  471. {
  472. u32 cmd_data, cmd_id, val, retry_attempt = 0;
  473. val = swrm_get_packed_reg_val(&ctrl->rcmd_id, len, dev_addr, reg_addr);
  474. /*
  475. * Check for outstanding cmd wrt. write fifo depth to avoid
  476. * overflow as read will also increase write fifo cnt.
  477. */
  478. swrm_wait_for_wr_fifo_avail(ctrl);
  479. /* wait for FIFO RD to complete to avoid overflow */
  480. usleep_range(100, 105);
  481. ctrl->reg_write(ctrl, ctrl->reg_layout[SWRM_REG_CMD_FIFO_RD_CMD], val);
  482. /* wait for FIFO RD CMD complete to avoid overflow */
  483. usleep_range(250, 255);
  484. if (swrm_wait_for_rd_fifo_avail(ctrl))
  485. return SDW_CMD_FAIL_OTHER;
  486. do {
  487. ctrl->reg_read(ctrl, ctrl->reg_layout[SWRM_REG_CMD_FIFO_RD_FIFO_ADDR],
  488. &cmd_data);
  489. rval[0] = cmd_data & 0xFF;
  490. cmd_id = FIELD_GET(SWRM_RD_FIFO_CMD_ID_MASK, cmd_data);
  491. if (cmd_id != ctrl->rcmd_id) {
  492. if (retry_attempt < (MAX_FIFO_RD_RETRY - 1)) {
  493. /* wait 500 us before retry on fifo read failure */
  494. usleep_range(500, 505);
  495. ctrl->reg_write(ctrl, SWRM_CMD_FIFO_CMD,
  496. SWRM_CMD_FIFO_FLUSH);
  497. ctrl->reg_write(ctrl,
  498. ctrl->reg_layout[SWRM_REG_CMD_FIFO_RD_CMD],
  499. val);
  500. }
  501. retry_attempt++;
  502. } else {
  503. return SDW_CMD_OK;
  504. }
  505. } while (retry_attempt < MAX_FIFO_RD_RETRY);
  506. dev_err(ctrl->dev, "failed to read fifo: reg: 0x%x, rcmd_id: 0x%x,\
  507. dev_num: 0x%x, cmd_data: 0x%x\n",
  508. reg_addr, ctrl->rcmd_id, dev_addr, cmd_data);
  509. return SDW_CMD_IGNORED;
  510. }
  511. static int qcom_swrm_get_alert_slave_dev_num(struct qcom_swrm_ctrl *ctrl)
  512. {
  513. u32 val, status;
  514. int dev_num;
  515. ctrl->reg_read(ctrl, SWRM_MCP_SLV_STATUS, &val);
  516. for (dev_num = 1; dev_num <= SDW_MAX_DEVICES; dev_num++) {
  517. status = (val >> (dev_num * SWRM_MCP_SLV_STATUS_SZ));
  518. if ((status & SWRM_MCP_SLV_STATUS_MASK) == SDW_SLAVE_ALERT) {
  519. ctrl->status[dev_num] = status & SWRM_MCP_SLV_STATUS_MASK;
  520. return dev_num;
  521. }
  522. }
  523. return -EINVAL;
  524. }
  525. static void qcom_swrm_get_device_status(struct qcom_swrm_ctrl *ctrl)
  526. {
  527. u32 val;
  528. int i;
  529. ctrl->reg_read(ctrl, SWRM_MCP_SLV_STATUS, &val);
  530. ctrl->slave_status = val;
  531. for (i = 1; i <= SDW_MAX_DEVICES; i++) {
  532. u32 s;
  533. s = (val >> (i * 2));
  534. s &= SWRM_MCP_SLV_STATUS_MASK;
  535. ctrl->status[i] = s;
  536. }
  537. }
  538. static void qcom_swrm_set_slave_dev_num(struct sdw_bus *bus,
  539. struct sdw_slave *slave, int devnum)
  540. {
  541. struct qcom_swrm_ctrl *ctrl = to_qcom_sdw(bus);
  542. u32 status;
  543. ctrl->reg_read(ctrl, SWRM_MCP_SLV_STATUS, &status);
  544. status = (status >> (devnum * SWRM_MCP_SLV_STATUS_SZ));
  545. status &= SWRM_MCP_SLV_STATUS_MASK;
  546. if (status == SDW_SLAVE_ATTACHED) {
  547. if (slave)
  548. slave->dev_num = devnum;
  549. mutex_lock(&bus->bus_lock);
  550. set_bit(devnum, bus->assigned);
  551. mutex_unlock(&bus->bus_lock);
  552. }
  553. }
  554. static int qcom_swrm_enumerate(struct sdw_bus *bus)
  555. {
  556. struct qcom_swrm_ctrl *ctrl = to_qcom_sdw(bus);
  557. struct sdw_slave *slave, *_s;
  558. struct sdw_slave_id id;
  559. u32 val1, val2;
  560. bool found;
  561. u64 addr;
  562. int i;
  563. char *buf1 = (char *)&val1, *buf2 = (char *)&val2;
  564. for (i = 1; i <= SDW_MAX_DEVICES; i++) {
  565. /* do not continue if the status is Not Present */
  566. if (!ctrl->status[i])
  567. continue;
  568. /*SCP_Devid5 - Devid 4*/
  569. ctrl->reg_read(ctrl, SWRM_ENUMERATOR_SLAVE_DEV_ID_1(i), &val1);
  570. /*SCP_Devid3 - DevId 2 Devid 1 Devid 0*/
  571. ctrl->reg_read(ctrl, SWRM_ENUMERATOR_SLAVE_DEV_ID_2(i), &val2);
  572. if (!val1 && !val2)
  573. break;
  574. addr = buf2[1] | (buf2[0] << 8) | (buf1[3] << 16) |
  575. ((u64)buf1[2] << 24) | ((u64)buf1[1] << 32) |
  576. ((u64)buf1[0] << 40);
  577. sdw_extract_slave_id(bus, addr, &id);
  578. found = false;
  579. ctrl->clock_stop_not_supported = false;
  580. /* Now compare with entries */
  581. list_for_each_entry_safe(slave, _s, &bus->slaves, node) {
  582. if (sdw_compare_devid(slave, id) == 0) {
  583. qcom_swrm_set_slave_dev_num(bus, slave, i);
  584. if (slave->prop.clk_stop_mode1)
  585. ctrl->clock_stop_not_supported = true;
  586. found = true;
  587. break;
  588. }
  589. }
  590. if (!found) {
  591. qcom_swrm_set_slave_dev_num(bus, NULL, i);
  592. sdw_slave_add(bus, &id, NULL);
  593. }
  594. }
  595. complete(&ctrl->enumeration);
  596. return 0;
  597. }
  598. static irqreturn_t qcom_swrm_wake_irq_handler(int irq, void *dev_id)
  599. {
  600. struct qcom_swrm_ctrl *ctrl = dev_id;
  601. int ret;
  602. ret = pm_runtime_get_sync(ctrl->dev);
  603. if (ret < 0 && ret != -EACCES) {
  604. dev_err_ratelimited(ctrl->dev,
  605. "pm_runtime_get_sync failed in %s, ret %d\n",
  606. __func__, ret);
  607. pm_runtime_put_noidle(ctrl->dev);
  608. return ret;
  609. }
  610. if (ctrl->wake_irq > 0) {
  611. if (!irqd_irq_disabled(irq_get_irq_data(ctrl->wake_irq)))
  612. disable_irq_nosync(ctrl->wake_irq);
  613. }
  614. pm_runtime_mark_last_busy(ctrl->dev);
  615. pm_runtime_put_autosuspend(ctrl->dev);
  616. return IRQ_HANDLED;
  617. }
  618. static irqreturn_t qcom_swrm_irq_handler(int irq, void *dev_id)
  619. {
  620. struct qcom_swrm_ctrl *ctrl = dev_id;
  621. u32 value, intr_sts, intr_sts_masked, slave_status;
  622. u32 i;
  623. int devnum;
  624. int ret = IRQ_HANDLED;
  625. clk_prepare_enable(ctrl->hclk);
  626. ctrl->reg_read(ctrl, ctrl->reg_layout[SWRM_REG_INTERRUPT_STATUS],
  627. &intr_sts);
  628. intr_sts_masked = intr_sts & ctrl->intr_mask;
  629. do {
  630. for (i = 0; i < SWRM_INTERRUPT_MAX; i++) {
  631. value = intr_sts_masked & BIT(i);
  632. if (!value)
  633. continue;
  634. switch (value) {
  635. case SWRM_INTERRUPT_STATUS_SLAVE_PEND_IRQ:
  636. devnum = qcom_swrm_get_alert_slave_dev_num(ctrl);
  637. if (devnum < 0) {
  638. dev_err_ratelimited(ctrl->dev,
  639. "no slave alert found.spurious interrupt\n");
  640. } else {
  641. sdw_handle_slave_status(&ctrl->bus, ctrl->status);
  642. }
  643. break;
  644. case SWRM_INTERRUPT_STATUS_NEW_SLAVE_ATTACHED:
  645. case SWRM_INTERRUPT_STATUS_CHANGE_ENUM_SLAVE_STATUS:
  646. dev_dbg_ratelimited(ctrl->dev, "SWR new slave attached\n");
  647. ctrl->reg_read(ctrl, SWRM_MCP_SLV_STATUS, &slave_status);
  648. if (ctrl->slave_status == slave_status) {
  649. dev_dbg(ctrl->dev, "Slave status not changed %x\n",
  650. slave_status);
  651. } else {
  652. qcom_swrm_get_device_status(ctrl);
  653. qcom_swrm_enumerate(&ctrl->bus);
  654. sdw_handle_slave_status(&ctrl->bus, ctrl->status);
  655. }
  656. break;
  657. case SWRM_INTERRUPT_STATUS_MASTER_CLASH_DET:
  658. dev_err_ratelimited(ctrl->dev,
  659. "%s: SWR bus clsh detected\n",
  660. __func__);
  661. ctrl->intr_mask &= ~SWRM_INTERRUPT_STATUS_MASTER_CLASH_DET;
  662. ctrl->reg_write(ctrl,
  663. ctrl->reg_layout[SWRM_REG_INTERRUPT_CPU_EN],
  664. ctrl->intr_mask);
  665. break;
  666. case SWRM_INTERRUPT_STATUS_RD_FIFO_OVERFLOW:
  667. ctrl->reg_read(ctrl,
  668. ctrl->reg_layout[SWRM_REG_CMD_FIFO_STATUS],
  669. &value);
  670. dev_err_ratelimited(ctrl->dev,
  671. "%s: SWR read FIFO overflow fifo status 0x%x\n",
  672. __func__, value);
  673. break;
  674. case SWRM_INTERRUPT_STATUS_RD_FIFO_UNDERFLOW:
  675. ctrl->reg_read(ctrl,
  676. ctrl->reg_layout[SWRM_REG_CMD_FIFO_STATUS],
  677. &value);
  678. dev_err_ratelimited(ctrl->dev,
  679. "%s: SWR read FIFO underflow fifo status 0x%x\n",
  680. __func__, value);
  681. break;
  682. case SWRM_INTERRUPT_STATUS_WR_CMD_FIFO_OVERFLOW:
  683. ctrl->reg_read(ctrl,
  684. ctrl->reg_layout[SWRM_REG_CMD_FIFO_STATUS],
  685. &value);
  686. dev_err(ctrl->dev,
  687. "%s: SWR write FIFO overflow fifo status %x\n",
  688. __func__, value);
  689. ctrl->reg_write(ctrl, SWRM_CMD_FIFO_CMD, 0x1);
  690. break;
  691. case SWRM_INTERRUPT_STATUS_CMD_ERROR:
  692. ctrl->reg_read(ctrl,
  693. ctrl->reg_layout[SWRM_REG_CMD_FIFO_STATUS],
  694. &value);
  695. dev_err_ratelimited(ctrl->dev,
  696. "%s: SWR CMD error, fifo status 0x%x, flushing fifo\n",
  697. __func__, value);
  698. ctrl->reg_write(ctrl, SWRM_CMD_FIFO_CMD, 0x1);
  699. break;
  700. case SWRM_INTERRUPT_STATUS_DOUT_PORT_COLLISION:
  701. dev_err_ratelimited(ctrl->dev,
  702. "%s: SWR Port collision detected\n",
  703. __func__);
  704. ctrl->intr_mask &= ~SWRM_INTERRUPT_STATUS_DOUT_PORT_COLLISION;
  705. ctrl->reg_write(ctrl,
  706. ctrl->reg_layout[SWRM_REG_INTERRUPT_CPU_EN],
  707. ctrl->intr_mask);
  708. break;
  709. case SWRM_INTERRUPT_STATUS_READ_EN_RD_VALID_MISMATCH:
  710. dev_err_ratelimited(ctrl->dev,
  711. "%s: SWR read enable valid mismatch\n",
  712. __func__);
  713. ctrl->intr_mask &=
  714. ~SWRM_INTERRUPT_STATUS_READ_EN_RD_VALID_MISMATCH;
  715. ctrl->reg_write(ctrl,
  716. ctrl->reg_layout[SWRM_REG_INTERRUPT_CPU_EN],
  717. ctrl->intr_mask);
  718. break;
  719. case SWRM_INTERRUPT_STATUS_SPECIAL_CMD_ID_FINISHED:
  720. complete(&ctrl->broadcast);
  721. break;
  722. case SWRM_INTERRUPT_STATUS_BUS_RESET_FINISHED_V2:
  723. break;
  724. case SWRM_INTERRUPT_STATUS_CLK_STOP_FINISHED_V2:
  725. break;
  726. case SWRM_INTERRUPT_STATUS_EXT_CLK_STOP_WAKEUP:
  727. break;
  728. case SWRM_INTERRUPT_STATUS_CMD_IGNORED_AND_EXEC_CONTINUED:
  729. ctrl->reg_read(ctrl,
  730. ctrl->reg_layout[SWRM_REG_CMD_FIFO_STATUS],
  731. &value);
  732. dev_err(ctrl->dev,
  733. "%s: SWR CMD ignored, fifo status %x\n",
  734. __func__, value);
  735. /* Wait 3.5ms to clear */
  736. usleep_range(3500, 3505);
  737. break;
  738. default:
  739. dev_err_ratelimited(ctrl->dev,
  740. "%s: SWR unknown interrupt value: %d\n",
  741. __func__, value);
  742. ret = IRQ_NONE;
  743. break;
  744. }
  745. }
  746. ctrl->reg_write(ctrl, ctrl->reg_layout[SWRM_REG_INTERRUPT_CLEAR],
  747. intr_sts);
  748. ctrl->reg_read(ctrl, ctrl->reg_layout[SWRM_REG_INTERRUPT_STATUS],
  749. &intr_sts);
  750. intr_sts_masked = intr_sts & ctrl->intr_mask;
  751. } while (intr_sts_masked);
  752. clk_disable_unprepare(ctrl->hclk);
  753. return ret;
  754. }
  755. static bool swrm_wait_for_frame_gen_enabled(struct qcom_swrm_ctrl *ctrl)
  756. {
  757. int retry = SWRM_LINK_STATUS_RETRY_CNT;
  758. int comp_sts;
  759. do {
  760. ctrl->reg_read(ctrl, ctrl->reg_layout[SWRM_REG_FRAME_GEN_ENABLED],
  761. &comp_sts);
  762. if (comp_sts & SWRM_FRM_GEN_ENABLED)
  763. return true;
  764. usleep_range(500, 510);
  765. } while (retry--);
  766. dev_err(ctrl->dev, "%s: link status not %s\n", __func__,
  767. comp_sts & SWRM_FRM_GEN_ENABLED ? "connected" : "disconnected");
  768. return false;
  769. }
  770. static int qcom_swrm_init(struct qcom_swrm_ctrl *ctrl)
  771. {
  772. u32 val;
  773. /* Clear Rows and Cols */
  774. val = FIELD_PREP(SWRM_MCP_FRAME_CTRL_BANK_ROW_CTRL_BMSK, ctrl->rows_index);
  775. val |= FIELD_PREP(SWRM_MCP_FRAME_CTRL_BANK_COL_CTRL_BMSK, ctrl->cols_index);
  776. reset_control_reset(ctrl->audio_cgcr);
  777. ctrl->reg_write(ctrl, SWRM_MCP_FRAME_CTRL_BANK_ADDR(0), val);
  778. /* Enable Auto enumeration */
  779. ctrl->reg_write(ctrl, SWRM_ENUMERATOR_CFG_ADDR, 1);
  780. ctrl->intr_mask = SWRM_INTERRUPT_STATUS_RMSK;
  781. /* Mask soundwire interrupts */
  782. if (ctrl->version < SWRM_VERSION_2_0_0)
  783. ctrl->reg_write(ctrl, ctrl->reg_layout[SWRM_REG_INTERRUPT_MASK_ADDR],
  784. SWRM_INTERRUPT_STATUS_RMSK);
  785. /* Configure No pings */
  786. ctrl->reg_read(ctrl, SWRM_MCP_CFG_ADDR, &val);
  787. u32p_replace_bits(&val, SWRM_DEF_CMD_NO_PINGS, SWRM_MCP_CFG_MAX_NUM_OF_CMD_NO_PINGS_BMSK);
  788. ctrl->reg_write(ctrl, SWRM_MCP_CFG_ADDR, val);
  789. if (ctrl->version == SWRM_VERSION_1_7_0) {
  790. ctrl->reg_write(ctrl, SWRM_LINK_MANAGER_EE, SWRM_EE_CPU);
  791. ctrl->reg_write(ctrl, SWRM_MCP_BUS_CTRL,
  792. SWRM_MCP_BUS_CLK_START << SWRM_EE_CPU);
  793. } else if (ctrl->version >= SWRM_VERSION_2_0_0) {
  794. ctrl->reg_write(ctrl, SWRM_LINK_MANAGER_EE, SWRM_EE_CPU);
  795. ctrl->reg_write(ctrl, SWRM_V2_0_CLK_CTRL,
  796. SWRM_V2_0_CLK_CTRL_CLK_START);
  797. } else {
  798. ctrl->reg_write(ctrl, SWRM_MCP_BUS_CTRL, SWRM_MCP_BUS_CLK_START);
  799. }
  800. /* Configure number of retries of a read/write cmd */
  801. if (ctrl->version >= SWRM_VERSION_1_5_1) {
  802. ctrl->reg_write(ctrl, SWRM_CMD_FIFO_CFG_ADDR,
  803. SWRM_RD_WR_CMD_RETRIES |
  804. SWRM_CONTINUE_EXEC_ON_CMD_IGNORE);
  805. } else {
  806. ctrl->reg_write(ctrl, SWRM_CMD_FIFO_CFG_ADDR,
  807. SWRM_RD_WR_CMD_RETRIES);
  808. }
  809. /* COMP Enable */
  810. ctrl->reg_write(ctrl, SWRM_COMP_CFG_ADDR, SWRM_COMP_CFG_ENABLE_MSK);
  811. /* Set IRQ to PULSE */
  812. ctrl->reg_write(ctrl, SWRM_COMP_CFG_ADDR,
  813. SWRM_COMP_CFG_IRQ_LEVEL_OR_PULSE_MSK);
  814. ctrl->reg_write(ctrl, ctrl->reg_layout[SWRM_REG_INTERRUPT_CLEAR],
  815. 0xFFFFFFFF);
  816. /* enable CPU IRQs */
  817. if (ctrl->mmio) {
  818. ctrl->reg_write(ctrl, ctrl->reg_layout[SWRM_REG_INTERRUPT_CPU_EN],
  819. SWRM_INTERRUPT_STATUS_RMSK);
  820. }
  821. /* Set IRQ to PULSE */
  822. ctrl->reg_write(ctrl, SWRM_COMP_CFG_ADDR,
  823. SWRM_COMP_CFG_IRQ_LEVEL_OR_PULSE_MSK |
  824. SWRM_COMP_CFG_ENABLE_MSK);
  825. swrm_wait_for_frame_gen_enabled(ctrl);
  826. ctrl->slave_status = 0;
  827. ctrl->reg_read(ctrl, SWRM_COMP_PARAMS, &val);
  828. if (ctrl->version >= SWRM_VERSION_3_1_0)
  829. ctrl->wr_fifo_depth = FIELD_GET(SWRM_V3_COMP_PARAMS_WR_FIFO_DEPTH, val);
  830. else
  831. ctrl->wr_fifo_depth = FIELD_GET(SWRM_COMP_PARAMS_WR_FIFO_DEPTH, val);
  832. return 0;
  833. }
  834. static int qcom_swrm_read_prop(struct sdw_bus *bus)
  835. {
  836. struct qcom_swrm_ctrl *ctrl = to_qcom_sdw(bus);
  837. if (ctrl->version >= SWRM_VERSION_2_0_0) {
  838. bus->multi_link = true;
  839. bus->hw_sync_min_links = 3;
  840. }
  841. return 0;
  842. }
  843. static enum sdw_command_response qcom_swrm_xfer_msg(struct sdw_bus *bus,
  844. struct sdw_msg *msg)
  845. {
  846. struct qcom_swrm_ctrl *ctrl = to_qcom_sdw(bus);
  847. int ret, i, len;
  848. if (msg->flags == SDW_MSG_FLAG_READ) {
  849. for (i = 0; i < msg->len;) {
  850. len = min(msg->len - i, QCOM_SWRM_MAX_RD_LEN);
  851. ret = qcom_swrm_cmd_fifo_rd_cmd(ctrl, msg->dev_num,
  852. msg->addr + i, len,
  853. &msg->buf[i]);
  854. if (ret)
  855. return ret;
  856. i = i + len;
  857. }
  858. } else if (msg->flags == SDW_MSG_FLAG_WRITE) {
  859. for (i = 0; i < msg->len; i++) {
  860. ret = qcom_swrm_cmd_fifo_wr_cmd(ctrl, msg->buf[i],
  861. msg->dev_num,
  862. msg->addr + i);
  863. if (ret)
  864. return SDW_CMD_IGNORED;
  865. }
  866. }
  867. return SDW_CMD_OK;
  868. }
  869. static int qcom_swrm_pre_bank_switch(struct sdw_bus *bus)
  870. {
  871. u32 reg = SWRM_MCP_FRAME_CTRL_BANK_ADDR(bus->params.next_bank);
  872. struct qcom_swrm_ctrl *ctrl = to_qcom_sdw(bus);
  873. u32 val;
  874. ctrl->reg_read(ctrl, reg, &val);
  875. u32p_replace_bits(&val, ctrl->cols_index, SWRM_MCP_FRAME_CTRL_BANK_COL_CTRL_BMSK);
  876. u32p_replace_bits(&val, ctrl->rows_index, SWRM_MCP_FRAME_CTRL_BANK_ROW_CTRL_BMSK);
  877. return ctrl->reg_write(ctrl, reg, val);
  878. }
  879. static int qcom_swrm_port_params(struct sdw_bus *bus,
  880. struct sdw_port_params *p_params,
  881. unsigned int bank)
  882. {
  883. struct qcom_swrm_ctrl *ctrl = to_qcom_sdw(bus);
  884. u32 offset = ctrl->reg_layout[SWRM_OFFSET_DP_BLOCK_CTRL_1];
  885. return ctrl->reg_write(ctrl, SWRM_DPn_BLOCK_CTRL_1(offset, p_params->num),
  886. p_params->bps - 1);
  887. }
  888. static int qcom_swrm_transport_params(struct sdw_bus *bus,
  889. struct sdw_transport_params *params,
  890. enum sdw_reg_bank bank)
  891. {
  892. struct qcom_swrm_ctrl *ctrl = to_qcom_sdw(bus);
  893. struct qcom_swrm_port_config *pcfg;
  894. u32 value;
  895. int reg, offset = ctrl->reg_layout[SWRM_OFFSET_DP_PORT_CTRL_BANK];
  896. int ret;
  897. reg = SWRM_DPn_PORT_CTRL_BANK(offset, params->port_num, bank);
  898. pcfg = &ctrl->pconfig[params->port_num];
  899. value = pcfg->off1 << SWRM_DP_PORT_CTRL_OFFSET1_SHFT;
  900. value |= pcfg->off2 << SWRM_DP_PORT_CTRL_OFFSET2_SHFT;
  901. value |= pcfg->si & 0xff;
  902. ret = ctrl->reg_write(ctrl, reg, value);
  903. if (ret)
  904. goto err;
  905. if (pcfg->si > 0xff) {
  906. offset = ctrl->reg_layout[SWRM_OFFSET_DP_SAMPLECTRL2_BANK];
  907. value = (pcfg->si >> 8) & 0xff;
  908. reg = SWRM_DPn_SAMPLECTRL2_BANK(offset, params->port_num, bank);
  909. ret = ctrl->reg_write(ctrl, reg, value);
  910. if (ret)
  911. goto err;
  912. }
  913. if (pcfg->lane_control != SWR_INVALID_PARAM) {
  914. offset = ctrl->reg_layout[SWRM_OFFSET_DP_PORT_CTRL_2_BANK];
  915. reg = SWRM_DPn_PORT_CTRL_2_BANK(offset, params->port_num, bank);
  916. value = pcfg->lane_control;
  917. ret = ctrl->reg_write(ctrl, reg, value);
  918. if (ret)
  919. goto err;
  920. }
  921. if (pcfg->blk_group_count != SWR_INVALID_PARAM) {
  922. offset = ctrl->reg_layout[SWRM_OFFSET_DP_BLOCK_CTRL2_BANK];
  923. reg = SWRM_DPn_BLOCK_CTRL2_BANK(offset, params->port_num, bank);
  924. value = pcfg->blk_group_count;
  925. ret = ctrl->reg_write(ctrl, reg, value);
  926. if (ret)
  927. goto err;
  928. }
  929. offset = ctrl->reg_layout[SWRM_OFFSET_DP_PORT_HCTRL_BANK];
  930. reg = SWRM_DPn_PORT_HCTRL_BANK(offset, params->port_num, bank);
  931. if (pcfg->hstart != SWR_INVALID_PARAM && pcfg->hstop != SWR_INVALID_PARAM) {
  932. value = (pcfg->hstop << 4) | pcfg->hstart;
  933. ret = ctrl->reg_write(ctrl, reg, value);
  934. } else {
  935. value = (SWR_HSTOP_MAX_VAL << 4) | SWR_HSTART_MIN_VAL;
  936. ret = ctrl->reg_write(ctrl, reg, value);
  937. }
  938. if (ret)
  939. goto err;
  940. if (pcfg->bp_mode != SWR_INVALID_PARAM) {
  941. offset = ctrl->reg_layout[SWRM_OFFSET_DP_BLOCK_CTRL3_BANK];
  942. reg = SWRM_DPn_BLOCK_CTRL3_BANK(offset, params->port_num, bank);
  943. ret = ctrl->reg_write(ctrl, reg, pcfg->bp_mode);
  944. }
  945. err:
  946. return ret;
  947. }
  948. static int qcom_swrm_port_enable(struct sdw_bus *bus,
  949. struct sdw_enable_ch *enable_ch,
  950. unsigned int bank)
  951. {
  952. u32 reg;
  953. struct qcom_swrm_ctrl *ctrl = to_qcom_sdw(bus);
  954. u32 val;
  955. u32 offset = ctrl->reg_layout[SWRM_OFFSET_DP_PORT_CTRL_BANK];
  956. reg = SWRM_DPn_PORT_CTRL_BANK(offset, enable_ch->port_num, bank);
  957. ctrl->reg_read(ctrl, reg, &val);
  958. if (enable_ch->enable)
  959. val |= (enable_ch->ch_mask << SWRM_DP_PORT_CTRL_EN_CHAN_SHFT);
  960. else
  961. val &= ~(0xff << SWRM_DP_PORT_CTRL_EN_CHAN_SHFT);
  962. return ctrl->reg_write(ctrl, reg, val);
  963. }
  964. static const struct sdw_master_port_ops qcom_swrm_port_ops = {
  965. .dpn_set_port_params = qcom_swrm_port_params,
  966. .dpn_set_port_transport_params = qcom_swrm_transport_params,
  967. .dpn_port_enable_ch = qcom_swrm_port_enable,
  968. };
  969. static const struct sdw_master_ops qcom_swrm_ops = {
  970. .read_prop = qcom_swrm_read_prop,
  971. .xfer_msg = qcom_swrm_xfer_msg,
  972. .pre_bank_switch = qcom_swrm_pre_bank_switch,
  973. };
  974. static int qcom_swrm_compute_params(struct sdw_bus *bus, struct sdw_stream_runtime *stream)
  975. {
  976. struct qcom_swrm_ctrl *ctrl = to_qcom_sdw(bus);
  977. struct sdw_master_runtime *m_rt;
  978. struct sdw_slave_runtime *s_rt;
  979. struct sdw_port_runtime *p_rt;
  980. struct qcom_swrm_port_config *pcfg;
  981. struct sdw_slave *slave;
  982. unsigned int m_port;
  983. int i = 1;
  984. list_for_each_entry(m_rt, &bus->m_rt_list, bus_node) {
  985. list_for_each_entry(p_rt, &m_rt->port_list, port_node) {
  986. pcfg = &ctrl->pconfig[p_rt->num];
  987. p_rt->transport_params.port_num = p_rt->num;
  988. if (pcfg->word_length != SWR_INVALID_PARAM) {
  989. sdw_fill_port_params(&p_rt->port_params,
  990. p_rt->num, pcfg->word_length + 1,
  991. SDW_PORT_FLOW_MODE_ISOCH,
  992. SDW_PORT_DATA_MODE_NORMAL);
  993. }
  994. }
  995. list_for_each_entry(s_rt, &m_rt->slave_rt_list, m_rt_node) {
  996. slave = s_rt->slave;
  997. list_for_each_entry(p_rt, &s_rt->port_list, port_node) {
  998. m_port = slave->m_port_map[p_rt->num];
  999. /* port config starts at offset 0 so -1 from actual port number */
  1000. if (m_port)
  1001. pcfg = &ctrl->pconfig[m_port];
  1002. else
  1003. pcfg = &ctrl->pconfig[i];
  1004. p_rt->transport_params.port_num = p_rt->num;
  1005. p_rt->transport_params.sample_interval =
  1006. pcfg->si + 1;
  1007. p_rt->transport_params.offset1 = pcfg->off1;
  1008. p_rt->transport_params.offset2 = pcfg->off2;
  1009. p_rt->transport_params.blk_pkg_mode = pcfg->bp_mode;
  1010. p_rt->transport_params.blk_grp_ctrl = pcfg->blk_group_count;
  1011. p_rt->transport_params.hstart = pcfg->hstart;
  1012. p_rt->transport_params.hstop = pcfg->hstop;
  1013. p_rt->transport_params.lane_ctrl = pcfg->lane_control;
  1014. if (pcfg->word_length != SWR_INVALID_PARAM) {
  1015. sdw_fill_port_params(&p_rt->port_params,
  1016. p_rt->num,
  1017. pcfg->word_length + 1,
  1018. SDW_PORT_FLOW_MODE_ISOCH,
  1019. SDW_PORT_DATA_MODE_NORMAL);
  1020. }
  1021. i++;
  1022. }
  1023. }
  1024. }
  1025. return 0;
  1026. }
  1027. static u32 qcom_swrm_freq_tbl[MAX_FREQ_NUM] = {
  1028. DEFAULT_CLK_FREQ,
  1029. };
  1030. static void qcom_swrm_stream_free_ports(struct qcom_swrm_ctrl *ctrl,
  1031. struct sdw_stream_runtime *stream)
  1032. {
  1033. struct sdw_master_runtime *m_rt;
  1034. struct sdw_port_runtime *p_rt;
  1035. unsigned long *port_mask;
  1036. mutex_lock(&ctrl->port_lock);
  1037. list_for_each_entry(m_rt, &stream->master_list, stream_node) {
  1038. port_mask = &ctrl->port_mask;
  1039. list_for_each_entry(p_rt, &m_rt->port_list, port_node)
  1040. clear_bit(p_rt->num, port_mask);
  1041. }
  1042. mutex_unlock(&ctrl->port_lock);
  1043. }
  1044. static int qcom_swrm_stream_alloc_ports(struct qcom_swrm_ctrl *ctrl,
  1045. struct sdw_stream_runtime *stream,
  1046. struct snd_pcm_hw_params *params,
  1047. int direction)
  1048. {
  1049. struct sdw_stream_config sconfig;
  1050. struct sdw_master_runtime *m_rt;
  1051. struct sdw_slave_runtime *s_rt;
  1052. struct sdw_port_runtime *p_rt;
  1053. struct sdw_slave *slave;
  1054. unsigned long *port_mask;
  1055. int maxport, pn, nports = 0;
  1056. unsigned int m_port;
  1057. struct sdw_port_config *pconfig __free(kfree) = kzalloc_objs(*pconfig,
  1058. ctrl->nports);
  1059. if (!pconfig)
  1060. return -ENOMEM;
  1061. if (direction == SNDRV_PCM_STREAM_CAPTURE)
  1062. sconfig.direction = SDW_DATA_DIR_TX;
  1063. else
  1064. sconfig.direction = SDW_DATA_DIR_RX;
  1065. /* hw parameters will be ignored as we only support PDM */
  1066. sconfig.ch_count = 1;
  1067. sconfig.frame_rate = params_rate(params);
  1068. sconfig.type = stream->type;
  1069. sconfig.bps = 1;
  1070. guard(mutex)(&ctrl->port_lock);
  1071. list_for_each_entry(m_rt, &stream->master_list, stream_node) {
  1072. /*
  1073. * For streams with multiple masters:
  1074. * Allocate ports only for devices connected to this master.
  1075. * Such devices will have ports allocated by their own master
  1076. * and its qcom_swrm_stream_alloc_ports() call.
  1077. */
  1078. if (ctrl->bus.id != m_rt->bus->id)
  1079. continue;
  1080. port_mask = &ctrl->port_mask;
  1081. maxport = ctrl->nports;
  1082. list_for_each_entry(s_rt, &m_rt->slave_rt_list, m_rt_node) {
  1083. slave = s_rt->slave;
  1084. list_for_each_entry(p_rt, &s_rt->port_list, port_node) {
  1085. m_port = slave->m_port_map[p_rt->num];
  1086. /* Port numbers start from 1 - 14*/
  1087. if (m_port)
  1088. pn = m_port;
  1089. else
  1090. pn = find_first_zero_bit(port_mask, maxport);
  1091. if (pn > maxport) {
  1092. dev_err(ctrl->dev, "All ports busy\n");
  1093. return -EBUSY;
  1094. }
  1095. set_bit(pn, port_mask);
  1096. pconfig[nports].num = pn;
  1097. pconfig[nports].ch_mask = p_rt->ch_mask;
  1098. nports++;
  1099. }
  1100. }
  1101. }
  1102. sdw_stream_add_master(&ctrl->bus, &sconfig, pconfig,
  1103. nports, stream);
  1104. return 0;
  1105. }
  1106. static int qcom_swrm_hw_params(struct snd_pcm_substream *substream,
  1107. struct snd_pcm_hw_params *params,
  1108. struct snd_soc_dai *dai)
  1109. {
  1110. struct qcom_swrm_ctrl *ctrl = dev_get_drvdata(dai->dev);
  1111. struct sdw_stream_runtime *sruntime = ctrl->sruntime[dai->id];
  1112. int ret;
  1113. ret = qcom_swrm_stream_alloc_ports(ctrl, sruntime, params,
  1114. substream->stream);
  1115. if (ret)
  1116. qcom_swrm_stream_free_ports(ctrl, sruntime);
  1117. return ret;
  1118. }
  1119. static int qcom_swrm_hw_free(struct snd_pcm_substream *substream,
  1120. struct snd_soc_dai *dai)
  1121. {
  1122. struct qcom_swrm_ctrl *ctrl = dev_get_drvdata(dai->dev);
  1123. struct sdw_stream_runtime *sruntime = ctrl->sruntime[dai->id];
  1124. qcom_swrm_stream_free_ports(ctrl, sruntime);
  1125. sdw_stream_remove_master(&ctrl->bus, sruntime);
  1126. return 0;
  1127. }
  1128. static int qcom_swrm_set_sdw_stream(struct snd_soc_dai *dai,
  1129. void *stream, int direction)
  1130. {
  1131. struct qcom_swrm_ctrl *ctrl = dev_get_drvdata(dai->dev);
  1132. ctrl->sruntime[dai->id] = stream;
  1133. return 0;
  1134. }
  1135. static void *qcom_swrm_get_sdw_stream(struct snd_soc_dai *dai, int direction)
  1136. {
  1137. struct qcom_swrm_ctrl *ctrl = dev_get_drvdata(dai->dev);
  1138. return ctrl->sruntime[dai->id];
  1139. }
  1140. static int qcom_swrm_startup(struct snd_pcm_substream *substream,
  1141. struct snd_soc_dai *dai)
  1142. {
  1143. struct qcom_swrm_ctrl *ctrl = dev_get_drvdata(dai->dev);
  1144. int ret;
  1145. ret = pm_runtime_get_sync(ctrl->dev);
  1146. if (ret < 0 && ret != -EACCES) {
  1147. dev_err_ratelimited(ctrl->dev,
  1148. "pm_runtime_get_sync failed in %s, ret %d\n",
  1149. __func__, ret);
  1150. pm_runtime_put_noidle(ctrl->dev);
  1151. return ret;
  1152. }
  1153. return 0;
  1154. }
  1155. static void qcom_swrm_shutdown(struct snd_pcm_substream *substream,
  1156. struct snd_soc_dai *dai)
  1157. {
  1158. struct qcom_swrm_ctrl *ctrl = dev_get_drvdata(dai->dev);
  1159. swrm_wait_for_wr_fifo_done(ctrl);
  1160. pm_runtime_mark_last_busy(ctrl->dev);
  1161. pm_runtime_put_autosuspend(ctrl->dev);
  1162. }
  1163. static const struct snd_soc_dai_ops qcom_swrm_pdm_dai_ops = {
  1164. .hw_params = qcom_swrm_hw_params,
  1165. .hw_free = qcom_swrm_hw_free,
  1166. .startup = qcom_swrm_startup,
  1167. .shutdown = qcom_swrm_shutdown,
  1168. .set_stream = qcom_swrm_set_sdw_stream,
  1169. .get_stream = qcom_swrm_get_sdw_stream,
  1170. };
  1171. static const struct snd_soc_component_driver qcom_swrm_dai_component = {
  1172. .name = "soundwire",
  1173. };
  1174. static int qcom_swrm_register_dais(struct qcom_swrm_ctrl *ctrl)
  1175. {
  1176. int num_dais = ctrl->num_dout_ports + ctrl->num_din_ports;
  1177. struct snd_soc_dai_driver *dais;
  1178. struct snd_soc_pcm_stream *stream;
  1179. struct device *dev = ctrl->dev;
  1180. int i;
  1181. /* PDM dais are only tested for now */
  1182. dais = devm_kcalloc(dev, num_dais, sizeof(*dais), GFP_KERNEL);
  1183. if (!dais)
  1184. return -ENOMEM;
  1185. for (i = 0; i < num_dais; i++) {
  1186. dais[i].name = devm_kasprintf(dev, GFP_KERNEL, "SDW Pin%d", i);
  1187. if (!dais[i].name)
  1188. return -ENOMEM;
  1189. if (i < ctrl->num_dout_ports)
  1190. stream = &dais[i].playback;
  1191. else
  1192. stream = &dais[i].capture;
  1193. stream->channels_min = 1;
  1194. stream->channels_max = 1;
  1195. stream->rates = SNDRV_PCM_RATE_48000;
  1196. stream->formats = SNDRV_PCM_FMTBIT_S16_LE;
  1197. dais[i].ops = &qcom_swrm_pdm_dai_ops;
  1198. dais[i].id = i;
  1199. }
  1200. return devm_snd_soc_register_component(ctrl->dev,
  1201. &qcom_swrm_dai_component,
  1202. dais, num_dais);
  1203. }
  1204. static int qcom_swrm_get_port_config(struct qcom_swrm_ctrl *ctrl)
  1205. {
  1206. struct device_node *np = ctrl->dev->of_node;
  1207. struct qcom_swrm_port_config *pcfg;
  1208. int i, ret, val;
  1209. ctrl->reg_read(ctrl, SWRM_COMP_PARAMS, &val);
  1210. ctrl->num_dout_ports = FIELD_GET(SWRM_COMP_PARAMS_DOUT_PORTS_MASK, val);
  1211. ctrl->num_din_ports = FIELD_GET(SWRM_COMP_PARAMS_DIN_PORTS_MASK, val);
  1212. ret = of_property_read_u32(np, "qcom,din-ports", &val);
  1213. if (!ret) { /* only if present */
  1214. if (val != ctrl->num_din_ports) {
  1215. dev_err(ctrl->dev, "din-ports (%d) mismatch with controller (%d)",
  1216. val, ctrl->num_din_ports);
  1217. }
  1218. ctrl->num_din_ports = val;
  1219. }
  1220. ret = of_property_read_u32(np, "qcom,dout-ports", &val);
  1221. if (!ret) { /* only if present */
  1222. if (val != ctrl->num_dout_ports) {
  1223. dev_err(ctrl->dev, "dout-ports (%d) mismatch with controller (%d)",
  1224. val, ctrl->num_dout_ports);
  1225. }
  1226. ctrl->num_dout_ports = val;
  1227. }
  1228. ctrl->nports = ctrl->num_dout_ports + ctrl->num_din_ports;
  1229. ctrl->pconfig = devm_kcalloc(ctrl->dev, ctrl->nports + 1,
  1230. sizeof(*ctrl->pconfig), GFP_KERNEL);
  1231. if (!ctrl->pconfig)
  1232. return -ENOMEM;
  1233. set_bit(0, &ctrl->port_mask);
  1234. /* Valid port numbers are from 1, so mask out port 0 explicitly */
  1235. for (i = 0; i < ctrl->nports; i++) {
  1236. pcfg = &ctrl->pconfig[i + 1];
  1237. ret = of_property_read_u8_index(np, "qcom,ports-offset1", i, &pcfg->off1);
  1238. if (ret)
  1239. return ret;
  1240. ret = of_property_read_u8_index(np, "qcom,ports-offset2", i, &pcfg->off2);
  1241. if (ret)
  1242. return ret;
  1243. ret = of_property_read_u8_index(np, "qcom,ports-sinterval-low", i, (u8 *)&pcfg->si);
  1244. if (ret) {
  1245. ret = of_property_read_u16_index(np, "qcom,ports-sinterval", i, &pcfg->si);
  1246. if (ret)
  1247. return ret;
  1248. }
  1249. ret = of_property_read_u8_index(np, "qcom,ports-block-pack-mode",
  1250. i, &pcfg->bp_mode);
  1251. if (ret) {
  1252. if (ctrl->version <= SWRM_VERSION_1_3_0)
  1253. pcfg->bp_mode = SWR_INVALID_PARAM;
  1254. else
  1255. return ret;
  1256. }
  1257. /* Optional properties */
  1258. pcfg->hstart = SWR_INVALID_PARAM;
  1259. pcfg->hstop = SWR_INVALID_PARAM;
  1260. pcfg->word_length = SWR_INVALID_PARAM;
  1261. pcfg->blk_group_count = SWR_INVALID_PARAM;
  1262. pcfg->lane_control = SWR_INVALID_PARAM;
  1263. of_property_read_u8_index(np, "qcom,ports-hstart", i, &pcfg->hstart);
  1264. of_property_read_u8_index(np, "qcom,ports-hstop", i, &pcfg->hstop);
  1265. of_property_read_u8_index(np, "qcom,ports-word-length", i, &pcfg->word_length);
  1266. of_property_read_u8_index(np, "qcom,ports-block-group-count",
  1267. i, &pcfg->blk_group_count);
  1268. of_property_read_u8_index(np, "qcom,ports-lane-control", i, &pcfg->lane_control);
  1269. }
  1270. return 0;
  1271. }
  1272. #ifdef CONFIG_DEBUG_FS
  1273. static int swrm_reg_show(struct seq_file *s_file, void *data)
  1274. {
  1275. struct qcom_swrm_ctrl *ctrl = s_file->private;
  1276. int reg, reg_val, ret;
  1277. ret = pm_runtime_get_sync(ctrl->dev);
  1278. if (ret < 0 && ret != -EACCES) {
  1279. dev_err_ratelimited(ctrl->dev,
  1280. "pm_runtime_get_sync failed in %s, ret %d\n",
  1281. __func__, ret);
  1282. pm_runtime_put_noidle(ctrl->dev);
  1283. return ret;
  1284. }
  1285. for (reg = 0; reg <= ctrl->max_reg; reg += 4) {
  1286. ctrl->reg_read(ctrl, reg, &reg_val);
  1287. seq_printf(s_file, "0x%.3x: 0x%.2x\n", reg, reg_val);
  1288. }
  1289. pm_runtime_mark_last_busy(ctrl->dev);
  1290. pm_runtime_put_autosuspend(ctrl->dev);
  1291. return 0;
  1292. }
  1293. DEFINE_SHOW_ATTRIBUTE(swrm_reg);
  1294. #endif
  1295. static int qcom_swrm_probe(struct platform_device *pdev)
  1296. {
  1297. struct device *dev = &pdev->dev;
  1298. struct sdw_master_prop *prop;
  1299. struct sdw_bus_params *params;
  1300. struct qcom_swrm_ctrl *ctrl;
  1301. const struct qcom_swrm_data *data;
  1302. int ret;
  1303. u32 val;
  1304. ctrl = devm_kzalloc(dev, sizeof(*ctrl), GFP_KERNEL);
  1305. if (!ctrl)
  1306. return -ENOMEM;
  1307. data = of_device_get_match_data(dev);
  1308. ctrl->max_reg = data->max_reg;
  1309. ctrl->reg_layout = data->reg_layout;
  1310. ctrl->rows_index = sdw_find_row_index(data->default_rows);
  1311. ctrl->cols_index = sdw_find_col_index(data->default_cols);
  1312. #if IS_REACHABLE(CONFIG_SLIMBUS)
  1313. if (dev->parent->bus == &slimbus_bus) {
  1314. #else
  1315. if (false) {
  1316. #endif
  1317. ctrl->reg_read = qcom_swrm_ahb_reg_read;
  1318. ctrl->reg_write = qcom_swrm_ahb_reg_write;
  1319. ctrl->regmap = dev_get_regmap(dev->parent, NULL);
  1320. if (!ctrl->regmap)
  1321. return -EINVAL;
  1322. } else {
  1323. ctrl->reg_read = qcom_swrm_cpu_reg_read;
  1324. ctrl->reg_write = qcom_swrm_cpu_reg_write;
  1325. ctrl->mmio = devm_platform_ioremap_resource(pdev, 0);
  1326. if (IS_ERR(ctrl->mmio))
  1327. return PTR_ERR(ctrl->mmio);
  1328. }
  1329. if (data->sw_clk_gate_required) {
  1330. ctrl->audio_cgcr = devm_reset_control_get_optional_exclusive(dev, "swr_audio_cgcr");
  1331. if (IS_ERR(ctrl->audio_cgcr)) {
  1332. dev_err(dev, "Failed to get cgcr reset ctrl required for SW gating\n");
  1333. ret = PTR_ERR(ctrl->audio_cgcr);
  1334. goto err_init;
  1335. }
  1336. }
  1337. ctrl->irq = of_irq_get(dev->of_node, 0);
  1338. if (ctrl->irq < 0) {
  1339. ret = ctrl->irq;
  1340. goto err_init;
  1341. }
  1342. ctrl->hclk = devm_clk_get(dev, "iface");
  1343. if (IS_ERR(ctrl->hclk)) {
  1344. ret = dev_err_probe(dev, PTR_ERR(ctrl->hclk), "unable to get iface clock\n");
  1345. goto err_init;
  1346. }
  1347. clk_prepare_enable(ctrl->hclk);
  1348. ctrl->dev = dev;
  1349. dev_set_drvdata(&pdev->dev, ctrl);
  1350. mutex_init(&ctrl->port_lock);
  1351. init_completion(&ctrl->broadcast);
  1352. init_completion(&ctrl->enumeration);
  1353. ctrl->bus.ops = &qcom_swrm_ops;
  1354. ctrl->bus.port_ops = &qcom_swrm_port_ops;
  1355. ctrl->bus.compute_params = &qcom_swrm_compute_params;
  1356. ctrl->bus.clk_stop_timeout = 300;
  1357. ret = qcom_swrm_get_port_config(ctrl);
  1358. if (ret)
  1359. goto err_clk;
  1360. params = &ctrl->bus.params;
  1361. params->max_dr_freq = DEFAULT_CLK_FREQ;
  1362. params->curr_dr_freq = DEFAULT_CLK_FREQ;
  1363. params->col = data->default_cols;
  1364. params->row = data->default_rows;
  1365. ctrl->reg_read(ctrl, SWRM_MCP_STATUS, &val);
  1366. params->curr_bank = val & SWRM_MCP_STATUS_BANK_NUM_MASK;
  1367. params->next_bank = !params->curr_bank;
  1368. prop = &ctrl->bus.prop;
  1369. prop->max_clk_freq = DEFAULT_CLK_FREQ;
  1370. prop->num_clk_gears = 0;
  1371. prop->num_clk_freq = MAX_FREQ_NUM;
  1372. prop->clk_freq = &qcom_swrm_freq_tbl[0];
  1373. prop->default_col = data->default_cols;
  1374. prop->default_row = data->default_rows;
  1375. ctrl->reg_read(ctrl, SWRM_COMP_HW_VERSION, &ctrl->version);
  1376. ret = devm_request_threaded_irq(dev, ctrl->irq, NULL,
  1377. qcom_swrm_irq_handler,
  1378. IRQF_TRIGGER_RISING |
  1379. IRQF_ONESHOT,
  1380. "soundwire", ctrl);
  1381. if (ret) {
  1382. dev_err(dev, "Failed to request soundwire irq\n");
  1383. goto err_clk;
  1384. }
  1385. ctrl->wake_irq = of_irq_get(dev->of_node, 1);
  1386. if (ctrl->wake_irq > 0) {
  1387. ret = devm_request_threaded_irq(dev, ctrl->wake_irq, NULL,
  1388. qcom_swrm_wake_irq_handler,
  1389. IRQF_TRIGGER_HIGH | IRQF_ONESHOT,
  1390. "swr_wake_irq", ctrl);
  1391. if (ret) {
  1392. dev_err(dev, "Failed to request soundwire wake irq\n");
  1393. goto err_init;
  1394. }
  1395. }
  1396. ctrl->bus.controller_id = -1;
  1397. if (ctrl->version > SWRM_VERSION_1_3_0) {
  1398. ctrl->reg_read(ctrl, SWRM_COMP_MASTER_ID, &val);
  1399. ctrl->bus.controller_id = val;
  1400. }
  1401. ret = sdw_bus_master_add(&ctrl->bus, dev, dev->fwnode);
  1402. if (ret) {
  1403. dev_err(dev, "Failed to register Soundwire controller (%d)\n",
  1404. ret);
  1405. goto err_clk;
  1406. }
  1407. qcom_swrm_init(ctrl);
  1408. wait_for_completion_timeout(&ctrl->enumeration,
  1409. msecs_to_jiffies(TIMEOUT_MS));
  1410. ret = qcom_swrm_register_dais(ctrl);
  1411. if (ret)
  1412. goto err_master_add;
  1413. dev_dbg(dev, "Qualcomm Soundwire controller v%x.%x.%x registered\n",
  1414. (ctrl->version >> 24) & 0xff, (ctrl->version >> 16) & 0xff,
  1415. ctrl->version & 0xffff);
  1416. pm_runtime_set_autosuspend_delay(dev, 3000);
  1417. pm_runtime_use_autosuspend(dev);
  1418. pm_runtime_mark_last_busy(dev);
  1419. pm_runtime_set_active(dev);
  1420. pm_runtime_enable(dev);
  1421. #ifdef CONFIG_DEBUG_FS
  1422. ctrl->debugfs = debugfs_create_dir("qualcomm-sdw", ctrl->bus.debugfs);
  1423. debugfs_create_file("qualcomm-registers", 0400, ctrl->debugfs, ctrl,
  1424. &swrm_reg_fops);
  1425. #endif
  1426. return 0;
  1427. err_master_add:
  1428. sdw_bus_master_delete(&ctrl->bus);
  1429. err_clk:
  1430. clk_disable_unprepare(ctrl->hclk);
  1431. err_init:
  1432. return ret;
  1433. }
  1434. static void qcom_swrm_remove(struct platform_device *pdev)
  1435. {
  1436. struct qcom_swrm_ctrl *ctrl = dev_get_drvdata(&pdev->dev);
  1437. sdw_bus_master_delete(&ctrl->bus);
  1438. clk_disable_unprepare(ctrl->hclk);
  1439. }
  1440. static int __maybe_unused swrm_runtime_resume(struct device *dev)
  1441. {
  1442. struct qcom_swrm_ctrl *ctrl = dev_get_drvdata(dev);
  1443. int ret;
  1444. if (ctrl->wake_irq > 0) {
  1445. if (!irqd_irq_disabled(irq_get_irq_data(ctrl->wake_irq)))
  1446. disable_irq_nosync(ctrl->wake_irq);
  1447. }
  1448. clk_prepare_enable(ctrl->hclk);
  1449. if (ctrl->clock_stop_not_supported) {
  1450. reinit_completion(&ctrl->enumeration);
  1451. ctrl->reg_write(ctrl, SWRM_COMP_SW_RESET, 0x01);
  1452. usleep_range(100, 105);
  1453. qcom_swrm_init(ctrl);
  1454. usleep_range(100, 105);
  1455. if (!swrm_wait_for_frame_gen_enabled(ctrl))
  1456. dev_err(ctrl->dev, "link failed to connect\n");
  1457. /* wait for hw enumeration to complete */
  1458. wait_for_completion_timeout(&ctrl->enumeration,
  1459. msecs_to_jiffies(TIMEOUT_MS));
  1460. qcom_swrm_get_device_status(ctrl);
  1461. sdw_handle_slave_status(&ctrl->bus, ctrl->status);
  1462. } else {
  1463. reset_control_reset(ctrl->audio_cgcr);
  1464. if (ctrl->version == SWRM_VERSION_1_7_0) {
  1465. ctrl->reg_write(ctrl, SWRM_LINK_MANAGER_EE, SWRM_EE_CPU);
  1466. ctrl->reg_write(ctrl, SWRM_MCP_BUS_CTRL,
  1467. SWRM_MCP_BUS_CLK_START << SWRM_EE_CPU);
  1468. } else if (ctrl->version >= SWRM_VERSION_2_0_0) {
  1469. ctrl->reg_write(ctrl, SWRM_LINK_MANAGER_EE, SWRM_EE_CPU);
  1470. ctrl->reg_write(ctrl, SWRM_V2_0_CLK_CTRL,
  1471. SWRM_V2_0_CLK_CTRL_CLK_START);
  1472. } else {
  1473. ctrl->reg_write(ctrl, SWRM_MCP_BUS_CTRL, SWRM_MCP_BUS_CLK_START);
  1474. }
  1475. ctrl->reg_write(ctrl, ctrl->reg_layout[SWRM_REG_INTERRUPT_CLEAR],
  1476. SWRM_INTERRUPT_STATUS_MASTER_CLASH_DET);
  1477. ctrl->intr_mask |= SWRM_INTERRUPT_STATUS_MASTER_CLASH_DET;
  1478. if (ctrl->version < SWRM_VERSION_2_0_0)
  1479. ctrl->reg_write(ctrl,
  1480. ctrl->reg_layout[SWRM_REG_INTERRUPT_MASK_ADDR],
  1481. ctrl->intr_mask);
  1482. ctrl->reg_write(ctrl, ctrl->reg_layout[SWRM_REG_INTERRUPT_CPU_EN],
  1483. ctrl->intr_mask);
  1484. usleep_range(100, 105);
  1485. if (!swrm_wait_for_frame_gen_enabled(ctrl))
  1486. dev_err(ctrl->dev, "link failed to connect\n");
  1487. ret = sdw_bus_exit_clk_stop(&ctrl->bus);
  1488. if (ret < 0)
  1489. dev_err(ctrl->dev, "bus failed to exit clock stop %d\n", ret);
  1490. }
  1491. return 0;
  1492. }
  1493. static int __maybe_unused swrm_runtime_suspend(struct device *dev)
  1494. {
  1495. struct qcom_swrm_ctrl *ctrl = dev_get_drvdata(dev);
  1496. int ret;
  1497. swrm_wait_for_wr_fifo_done(ctrl);
  1498. if (!ctrl->clock_stop_not_supported) {
  1499. /* Mask bus clash interrupt */
  1500. ctrl->intr_mask &= ~SWRM_INTERRUPT_STATUS_MASTER_CLASH_DET;
  1501. if (ctrl->version < SWRM_VERSION_2_0_0)
  1502. ctrl->reg_write(ctrl,
  1503. ctrl->reg_layout[SWRM_REG_INTERRUPT_MASK_ADDR],
  1504. ctrl->intr_mask);
  1505. ctrl->reg_write(ctrl, ctrl->reg_layout[SWRM_REG_INTERRUPT_CPU_EN],
  1506. ctrl->intr_mask);
  1507. /* Prepare slaves for clock stop */
  1508. ret = sdw_bus_prep_clk_stop(&ctrl->bus);
  1509. if (ret < 0 && ret != -ENODATA) {
  1510. dev_err(dev, "prepare clock stop failed %d", ret);
  1511. return ret;
  1512. }
  1513. ret = sdw_bus_clk_stop(&ctrl->bus);
  1514. if (ret < 0 && ret != -ENODATA) {
  1515. dev_err(dev, "bus clock stop failed %d", ret);
  1516. return ret;
  1517. }
  1518. }
  1519. clk_disable_unprepare(ctrl->hclk);
  1520. usleep_range(300, 305);
  1521. if (ctrl->wake_irq > 0) {
  1522. if (irqd_irq_disabled(irq_get_irq_data(ctrl->wake_irq)))
  1523. enable_irq(ctrl->wake_irq);
  1524. }
  1525. return 0;
  1526. }
  1527. static const struct dev_pm_ops swrm_dev_pm_ops = {
  1528. SET_RUNTIME_PM_OPS(swrm_runtime_suspend, swrm_runtime_resume, NULL)
  1529. };
  1530. static const struct of_device_id qcom_swrm_of_match[] = {
  1531. { .compatible = "qcom,soundwire-v1.3.0", .data = &swrm_v1_3_data },
  1532. { .compatible = "qcom,soundwire-v1.5.1", .data = &swrm_v1_5_data },
  1533. { .compatible = "qcom,soundwire-v1.6.0", .data = &swrm_v1_6_data },
  1534. { .compatible = "qcom,soundwire-v1.7.0", .data = &swrm_v1_5_data },
  1535. { .compatible = "qcom,soundwire-v2.0.0", .data = &swrm_v2_0_data },
  1536. { .compatible = "qcom,soundwire-v3.1.0", .data = &swrm_v3_0_data },
  1537. {/* sentinel */},
  1538. };
  1539. MODULE_DEVICE_TABLE(of, qcom_swrm_of_match);
  1540. static struct platform_driver qcom_swrm_driver = {
  1541. .probe = &qcom_swrm_probe,
  1542. .remove = qcom_swrm_remove,
  1543. .driver = {
  1544. .name = "qcom-soundwire",
  1545. .of_match_table = qcom_swrm_of_match,
  1546. .pm = &swrm_dev_pm_ops,
  1547. }
  1548. };
  1549. module_platform_driver(qcom_swrm_driver);
  1550. MODULE_DESCRIPTION("Qualcomm soundwire driver");
  1551. MODULE_LICENSE("GPL v2");