stm32_sai_sub.c 47 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * STM32 ALSA SoC Digital Audio Interface (SAI) driver.
  4. *
  5. * Copyright (C) 2016, STMicroelectronics - All Rights Reserved
  6. * Author(s): Olivier Moysan <olivier.moysan@st.com> for STMicroelectronics.
  7. */
  8. #include <linux/clk.h>
  9. #include <linux/clk-provider.h>
  10. #include <linux/kernel.h>
  11. #include <linux/module.h>
  12. #include <linux/of_irq.h>
  13. #include <linux/of_platform.h>
  14. #include <linux/pm_runtime.h>
  15. #include <linux/regmap.h>
  16. #include <sound/asoundef.h>
  17. #include <sound/core.h>
  18. #include <sound/dmaengine_pcm.h>
  19. #include <sound/pcm_params.h>
  20. #include "stm32_sai.h"
  21. #define SAI_FREE_PROTOCOL 0x0
  22. #define SAI_SPDIF_PROTOCOL 0x1
  23. #define SAI_SLOT_SIZE_AUTO 0x0
  24. #define SAI_SLOT_SIZE_16 0x1
  25. #define SAI_SLOT_SIZE_32 0x2
  26. #define SAI_DATASIZE_8 0x2
  27. #define SAI_DATASIZE_10 0x3
  28. #define SAI_DATASIZE_16 0x4
  29. #define SAI_DATASIZE_20 0x5
  30. #define SAI_DATASIZE_24 0x6
  31. #define SAI_DATASIZE_32 0x7
  32. #define STM_SAI_DAI_NAME_SIZE 15
  33. #define STM_SAI_IS_PLAYBACK(ip) ((ip)->dir == SNDRV_PCM_STREAM_PLAYBACK)
  34. #define STM_SAI_IS_CAPTURE(ip) ((ip)->dir == SNDRV_PCM_STREAM_CAPTURE)
  35. #define STM_SAI_A_ID 0x0
  36. #define STM_SAI_B_ID 0x1
  37. #define STM_SAI_IS_SUB_A(x) ((x)->id == STM_SAI_A_ID)
  38. #define SAI_SYNC_NONE 0x0
  39. #define SAI_SYNC_INTERNAL 0x1
  40. #define SAI_SYNC_EXTERNAL 0x2
  41. #define STM_SAI_PROTOCOL_IS_SPDIF(ip) ((ip)->spdif)
  42. #define STM_SAI_HAS_SPDIF(x) ((x)->pdata->conf.has_spdif_pdm)
  43. #define STM_SAI_HAS_PDM(x) ((x)->pdata->conf.has_spdif_pdm)
  44. #define STM_SAI_HAS_EXT_SYNC(x) (!STM_SAI_IS_F4((x)->pdata))
  45. #define SAI_IEC60958_BLOCK_FRAMES 192
  46. #define SAI_IEC60958_STATUS_BYTES 24
  47. #define SAI_MCLK_NAME_LEN 32
  48. #define SAI_RATE_11K 11025
  49. #define SAI_MAX_SAMPLE_RATE_8K 192000
  50. #define SAI_MAX_SAMPLE_RATE_11K 176400
  51. #define SAI_CK_RATE_TOLERANCE 1000 /* ppm */
  52. /**
  53. * struct stm32_sai_sub_data - private data of SAI sub block (block A or B)
  54. * @pdev: device data pointer
  55. * @regmap: SAI register map pointer
  56. * @regmap_config: SAI sub block register map configuration pointer
  57. * @dma_params: dma configuration data for rx or tx channel
  58. * @cpu_dai_drv: DAI driver data pointer
  59. * @cpu_dai: DAI runtime data pointer
  60. * @substream: PCM substream data pointer
  61. * @pdata: SAI block parent data pointer
  62. * @np_sync_provider: synchronization provider node
  63. * @sai_ck: kernel clock feeding the SAI clock generator
  64. * @sai_mclk: master clock from SAI mclk provider
  65. * @phys_addr: SAI registers physical base address
  66. * @mclk_rate: SAI block master clock frequency (Hz). set at init
  67. * @id: SAI sub block id corresponding to sub-block A or B
  68. * @dir: SAI block direction (playback or capture). set at init
  69. * @master: SAI block mode flag. (true=master, false=slave) set at init
  70. * @spdif: SAI S/PDIF iec60958 mode flag. set at init
  71. * @sai_ck_used: flag set while exclusivity on SAI kernel clock is active
  72. * @fmt: SAI block format. relevant only for custom protocols. set at init
  73. * @sync: SAI block synchronization mode. (none, internal or external)
  74. * @synco: SAI block ext sync source (provider setting). (none, sub-block A/B)
  75. * @synci: SAI block ext sync source (client setting). (SAI sync provider index)
  76. * @fs_length: frame synchronization length. depends on protocol settings
  77. * @slots: rx or tx slot number
  78. * @slot_width: rx or tx slot width in bits
  79. * @slot_mask: rx or tx active slots mask. set at init or at runtime
  80. * @data_size: PCM data width. corresponds to PCM substream width.
  81. * @spdif_frm_cnt: S/PDIF playback frame counter
  82. * @iec958: iec958 data
  83. * @ctrl_lock: control lock
  84. * @irq_lock: prevent race condition with IRQ
  85. * @set_sai_ck_rate: set SAI kernel clock rate
  86. * @put_sai_ck_rate: put SAI kernel clock rate
  87. */
  88. struct stm32_sai_sub_data {
  89. struct platform_device *pdev;
  90. struct regmap *regmap;
  91. const struct regmap_config *regmap_config;
  92. struct snd_dmaengine_dai_dma_data dma_params;
  93. struct snd_soc_dai_driver cpu_dai_drv;
  94. struct snd_soc_dai *cpu_dai;
  95. struct snd_pcm_substream *substream;
  96. struct stm32_sai_data *pdata;
  97. struct device_node *np_sync_provider;
  98. struct clk *sai_ck;
  99. struct clk *sai_mclk;
  100. dma_addr_t phys_addr;
  101. unsigned int mclk_rate;
  102. unsigned int id;
  103. int dir;
  104. bool master;
  105. bool spdif;
  106. bool sai_ck_used;
  107. int fmt;
  108. int sync;
  109. int synco;
  110. int synci;
  111. int fs_length;
  112. int slots;
  113. int slot_width;
  114. int slot_mask;
  115. int data_size;
  116. unsigned int spdif_frm_cnt;
  117. struct snd_aes_iec958 iec958;
  118. struct mutex ctrl_lock; /* protect resources accessed by controls */
  119. spinlock_t irq_lock; /* used to prevent race condition with IRQ */
  120. int (*set_sai_ck_rate)(struct stm32_sai_sub_data *sai, unsigned int rate);
  121. void (*put_sai_ck_rate)(struct stm32_sai_sub_data *sai);
  122. };
  123. enum stm32_sai_fifo_th {
  124. STM_SAI_FIFO_TH_EMPTY,
  125. STM_SAI_FIFO_TH_QUARTER,
  126. STM_SAI_FIFO_TH_HALF,
  127. STM_SAI_FIFO_TH_3_QUARTER,
  128. STM_SAI_FIFO_TH_FULL,
  129. };
  130. static bool stm32_sai_sub_readable_reg(struct device *dev, unsigned int reg)
  131. {
  132. switch (reg) {
  133. case STM_SAI_CR1_REGX:
  134. case STM_SAI_CR2_REGX:
  135. case STM_SAI_FRCR_REGX:
  136. case STM_SAI_SLOTR_REGX:
  137. case STM_SAI_IMR_REGX:
  138. case STM_SAI_SR_REGX:
  139. case STM_SAI_CLRFR_REGX:
  140. case STM_SAI_DR_REGX:
  141. case STM_SAI_PDMCR_REGX:
  142. case STM_SAI_PDMLY_REGX:
  143. return true;
  144. default:
  145. return false;
  146. }
  147. }
  148. static bool stm32_sai_sub_volatile_reg(struct device *dev, unsigned int reg)
  149. {
  150. switch (reg) {
  151. case STM_SAI_DR_REGX:
  152. case STM_SAI_SR_REGX:
  153. return true;
  154. default:
  155. return false;
  156. }
  157. }
  158. static bool stm32_sai_sub_writeable_reg(struct device *dev, unsigned int reg)
  159. {
  160. switch (reg) {
  161. case STM_SAI_CR1_REGX:
  162. case STM_SAI_CR2_REGX:
  163. case STM_SAI_FRCR_REGX:
  164. case STM_SAI_SLOTR_REGX:
  165. case STM_SAI_IMR_REGX:
  166. case STM_SAI_CLRFR_REGX:
  167. case STM_SAI_DR_REGX:
  168. case STM_SAI_PDMCR_REGX:
  169. case STM_SAI_PDMLY_REGX:
  170. return true;
  171. default:
  172. return false;
  173. }
  174. }
  175. static int stm32_sai_sub_reg_up(struct stm32_sai_sub_data *sai,
  176. unsigned int reg, unsigned int mask,
  177. unsigned int val)
  178. {
  179. int ret;
  180. ret = clk_enable(sai->pdata->pclk);
  181. if (ret < 0)
  182. return ret;
  183. ret = regmap_update_bits(sai->regmap, reg, mask, val);
  184. clk_disable(sai->pdata->pclk);
  185. return ret;
  186. }
  187. static int stm32_sai_sub_reg_wr(struct stm32_sai_sub_data *sai,
  188. unsigned int reg, unsigned int mask,
  189. unsigned int val)
  190. {
  191. int ret;
  192. ret = clk_enable(sai->pdata->pclk);
  193. if (ret < 0)
  194. return ret;
  195. ret = regmap_write_bits(sai->regmap, reg, mask, val);
  196. clk_disable(sai->pdata->pclk);
  197. return ret;
  198. }
  199. static int stm32_sai_sub_reg_rd(struct stm32_sai_sub_data *sai,
  200. unsigned int reg, unsigned int *val)
  201. {
  202. int ret;
  203. ret = clk_enable(sai->pdata->pclk);
  204. if (ret < 0)
  205. return ret;
  206. ret = regmap_read(sai->regmap, reg, val);
  207. clk_disable(sai->pdata->pclk);
  208. return ret;
  209. }
  210. static const struct regmap_config stm32_sai_sub_regmap_config_f4 = {
  211. .reg_bits = 32,
  212. .reg_stride = 4,
  213. .val_bits = 32,
  214. .max_register = STM_SAI_DR_REGX,
  215. .readable_reg = stm32_sai_sub_readable_reg,
  216. .volatile_reg = stm32_sai_sub_volatile_reg,
  217. .writeable_reg = stm32_sai_sub_writeable_reg,
  218. .fast_io = true,
  219. .cache_type = REGCACHE_FLAT,
  220. };
  221. static const struct regmap_config stm32_sai_sub_regmap_config_h7 = {
  222. .reg_bits = 32,
  223. .reg_stride = 4,
  224. .val_bits = 32,
  225. .max_register = STM_SAI_PDMLY_REGX,
  226. .readable_reg = stm32_sai_sub_readable_reg,
  227. .volatile_reg = stm32_sai_sub_volatile_reg,
  228. .writeable_reg = stm32_sai_sub_writeable_reg,
  229. .fast_io = true,
  230. .cache_type = REGCACHE_FLAT,
  231. };
  232. static int snd_pcm_iec958_info(struct snd_kcontrol *kcontrol,
  233. struct snd_ctl_elem_info *uinfo)
  234. {
  235. uinfo->type = SNDRV_CTL_ELEM_TYPE_IEC958;
  236. uinfo->count = 1;
  237. return 0;
  238. }
  239. static int snd_pcm_iec958_get(struct snd_kcontrol *kcontrol,
  240. struct snd_ctl_elem_value *uctl)
  241. {
  242. struct stm32_sai_sub_data *sai = snd_kcontrol_chip(kcontrol);
  243. mutex_lock(&sai->ctrl_lock);
  244. memcpy(uctl->value.iec958.status, sai->iec958.status, 4);
  245. mutex_unlock(&sai->ctrl_lock);
  246. return 0;
  247. }
  248. static int snd_pcm_iec958_put(struct snd_kcontrol *kcontrol,
  249. struct snd_ctl_elem_value *uctl)
  250. {
  251. struct stm32_sai_sub_data *sai = snd_kcontrol_chip(kcontrol);
  252. mutex_lock(&sai->ctrl_lock);
  253. memcpy(sai->iec958.status, uctl->value.iec958.status, 4);
  254. mutex_unlock(&sai->ctrl_lock);
  255. return 0;
  256. }
  257. static const struct snd_kcontrol_new iec958_ctls = {
  258. .access = (SNDRV_CTL_ELEM_ACCESS_READWRITE |
  259. SNDRV_CTL_ELEM_ACCESS_VOLATILE),
  260. .iface = SNDRV_CTL_ELEM_IFACE_PCM,
  261. .name = SNDRV_CTL_NAME_IEC958("", PLAYBACK, DEFAULT),
  262. .info = snd_pcm_iec958_info,
  263. .get = snd_pcm_iec958_get,
  264. .put = snd_pcm_iec958_put,
  265. };
  266. struct stm32_sai_mclk_data {
  267. struct clk_hw hw;
  268. unsigned long freq;
  269. struct stm32_sai_sub_data *sai_data;
  270. };
  271. #define to_mclk_data(_hw) container_of(_hw, struct stm32_sai_mclk_data, hw)
  272. #define STM32_SAI_MAX_CLKS 1
  273. static int stm32_sai_get_clk_div(struct stm32_sai_sub_data *sai,
  274. unsigned long input_rate,
  275. unsigned long output_rate)
  276. {
  277. int version = sai->pdata->conf.version;
  278. int div;
  279. div = DIV_ROUND_CLOSEST(input_rate, output_rate);
  280. if (div > SAI_XCR1_MCKDIV_MAX(version) || div <= 0) {
  281. dev_err(&sai->pdev->dev, "Divider %d out of range\n", div);
  282. return -EINVAL;
  283. }
  284. dev_dbg(&sai->pdev->dev, "SAI divider %d\n", div);
  285. if (input_rate % div)
  286. dev_dbg(&sai->pdev->dev,
  287. "Rate not accurate. requested (%ld), actual (%ld)\n",
  288. output_rate, input_rate / div);
  289. return div;
  290. }
  291. static int stm32_sai_set_clk_div(struct stm32_sai_sub_data *sai,
  292. unsigned int div)
  293. {
  294. int version = sai->pdata->conf.version;
  295. int ret, cr1, mask;
  296. if (div > SAI_XCR1_MCKDIV_MAX(version)) {
  297. dev_err(&sai->pdev->dev, "Divider %d out of range\n", div);
  298. return -EINVAL;
  299. }
  300. mask = SAI_XCR1_MCKDIV_MASK(SAI_XCR1_MCKDIV_WIDTH(version));
  301. cr1 = SAI_XCR1_MCKDIV_SET(div);
  302. ret = stm32_sai_sub_reg_up(sai, STM_SAI_CR1_REGX, mask, cr1);
  303. if (ret < 0)
  304. dev_err(&sai->pdev->dev, "Failed to update CR1 register\n");
  305. return ret;
  306. }
  307. static bool stm32_sai_rate_accurate(unsigned int max_rate, unsigned int rate)
  308. {
  309. u64 delta, dividend;
  310. int ratio;
  311. ratio = DIV_ROUND_CLOSEST(max_rate, rate);
  312. if (!ratio)
  313. return false;
  314. dividend = mul_u32_u32(1000000, abs(max_rate - (ratio * rate)));
  315. delta = div_u64(dividend, max_rate);
  316. if (delta <= SAI_CK_RATE_TOLERANCE)
  317. return true;
  318. return false;
  319. }
  320. static int stm32_sai_set_parent_clk(struct stm32_sai_sub_data *sai,
  321. unsigned int rate)
  322. {
  323. struct platform_device *pdev = sai->pdev;
  324. struct clk *parent_clk = sai->pdata->clk_x8k;
  325. int ret;
  326. if (!(rate % SAI_RATE_11K))
  327. parent_clk = sai->pdata->clk_x11k;
  328. ret = clk_set_parent(sai->sai_ck, parent_clk);
  329. if (ret)
  330. dev_err(&pdev->dev, " Error %d setting sai_ck parent clock. %s",
  331. ret, ret == -EBUSY ?
  332. "Active stream rates conflict\n" : "\n");
  333. return ret;
  334. }
  335. static void stm32_sai_put_parent_rate(struct stm32_sai_sub_data *sai)
  336. {
  337. if (sai->sai_ck_used) {
  338. sai->sai_ck_used = false;
  339. clk_rate_exclusive_put(sai->sai_ck);
  340. }
  341. }
  342. static int stm32_sai_set_parent_rate(struct stm32_sai_sub_data *sai,
  343. unsigned int rate)
  344. {
  345. struct platform_device *pdev = sai->pdev;
  346. unsigned int sai_ck_rate, sai_ck_max_rate, sai_ck_min_rate, sai_curr_rate, sai_new_rate;
  347. int div, ret;
  348. /*
  349. * Set minimum and maximum expected kernel clock frequency
  350. * - mclk on or spdif:
  351. * f_sai_ck = MCKDIV * mclk-fs * fs
  352. * Here typical 256 ratio is assumed for mclk-fs
  353. * - mclk off:
  354. * f_sai_ck = MCKDIV * FRL * fs
  355. * Where FRL=[8..256], MCKDIV=[1..n] (n depends on SAI version)
  356. * Set constraint MCKDIV * FRL <= 256, to ensure MCKDIV is in available range
  357. * f_sai_ck = sai_ck_max_rate * pow_of_two(FRL) / 256
  358. */
  359. sai_ck_min_rate = rate * 256;
  360. if (!(rate % SAI_RATE_11K))
  361. sai_ck_max_rate = SAI_MAX_SAMPLE_RATE_11K * 256;
  362. else
  363. sai_ck_max_rate = SAI_MAX_SAMPLE_RATE_8K * 256;
  364. if (!sai->sai_mclk && !STM_SAI_PROTOCOL_IS_SPDIF(sai)) {
  365. sai_ck_min_rate = rate * sai->fs_length;
  366. sai_ck_max_rate /= DIV_ROUND_CLOSEST(256, roundup_pow_of_two(sai->fs_length));
  367. }
  368. /*
  369. * Request exclusivity, as the clock is shared by SAI sub-blocks and by
  370. * some SAI instances. This allows to ensure that the rate cannot be
  371. * changed while one or more SAIs are using the clock.
  372. */
  373. clk_rate_exclusive_get(sai->sai_ck);
  374. sai->sai_ck_used = true;
  375. /*
  376. * Check current kernel clock rate. If it gives the expected accuracy
  377. * return immediately.
  378. */
  379. sai_curr_rate = clk_get_rate(sai->sai_ck);
  380. dev_dbg(&pdev->dev, "kernel clock rate: min [%u], max [%u], current [%u]",
  381. sai_ck_min_rate, sai_ck_max_rate, sai_curr_rate);
  382. if (stm32_sai_rate_accurate(sai_ck_max_rate, sai_curr_rate) &&
  383. sai_curr_rate >= sai_ck_min_rate)
  384. return 0;
  385. /*
  386. * Otherwise try to set the maximum rate and check the new actual rate.
  387. * If the new rate does not give the expected accuracy, try to set
  388. * lower rates for the kernel clock.
  389. */
  390. sai_ck_rate = sai_ck_max_rate;
  391. div = 1;
  392. do {
  393. /* Check new rate accuracy. Return if ok */
  394. sai_new_rate = clk_round_rate(sai->sai_ck, sai_ck_rate);
  395. if (stm32_sai_rate_accurate(sai_ck_rate, sai_new_rate)) {
  396. ret = clk_set_rate(sai->sai_ck, sai_ck_rate);
  397. if (ret) {
  398. dev_err(&pdev->dev, "Error %d setting sai_ck rate. %s",
  399. ret, ret == -EBUSY ?
  400. "Active stream rates may be in conflict\n" : "\n");
  401. goto err;
  402. }
  403. return 0;
  404. }
  405. /* Try a lower frequency */
  406. div++;
  407. sai_ck_rate = sai_ck_max_rate / div;
  408. } while (sai_ck_rate >= sai_ck_min_rate);
  409. /* No accurate rate found */
  410. dev_err(&pdev->dev, "Failed to find an accurate rate");
  411. err:
  412. stm32_sai_put_parent_rate(sai);
  413. return -EINVAL;
  414. }
  415. static int stm32_sai_mclk_determine_rate(struct clk_hw *hw,
  416. struct clk_rate_request *req)
  417. {
  418. struct stm32_sai_mclk_data *mclk = to_mclk_data(hw);
  419. struct stm32_sai_sub_data *sai = mclk->sai_data;
  420. int div;
  421. div = stm32_sai_get_clk_div(sai, req->best_parent_rate, req->rate);
  422. if (div <= 0)
  423. return -EINVAL;
  424. mclk->freq = req->best_parent_rate / div;
  425. req->rate = mclk->freq;
  426. return 0;
  427. }
  428. static unsigned long stm32_sai_mclk_recalc_rate(struct clk_hw *hw,
  429. unsigned long parent_rate)
  430. {
  431. struct stm32_sai_mclk_data *mclk = to_mclk_data(hw);
  432. return mclk->freq;
  433. }
  434. static int stm32_sai_mclk_set_rate(struct clk_hw *hw, unsigned long rate,
  435. unsigned long parent_rate)
  436. {
  437. struct stm32_sai_mclk_data *mclk = to_mclk_data(hw);
  438. struct stm32_sai_sub_data *sai = mclk->sai_data;
  439. int div, ret;
  440. div = stm32_sai_get_clk_div(sai, parent_rate, rate);
  441. if (div < 0)
  442. return div;
  443. ret = stm32_sai_set_clk_div(sai, div);
  444. if (ret)
  445. return ret;
  446. mclk->freq = rate;
  447. return 0;
  448. }
  449. static int stm32_sai_mclk_enable(struct clk_hw *hw)
  450. {
  451. struct stm32_sai_mclk_data *mclk = to_mclk_data(hw);
  452. struct stm32_sai_sub_data *sai = mclk->sai_data;
  453. dev_dbg(&sai->pdev->dev, "Enable master clock\n");
  454. return stm32_sai_sub_reg_up(sai, STM_SAI_CR1_REGX,
  455. SAI_XCR1_MCKEN, SAI_XCR1_MCKEN);
  456. }
  457. static void stm32_sai_mclk_disable(struct clk_hw *hw)
  458. {
  459. struct stm32_sai_mclk_data *mclk = to_mclk_data(hw);
  460. struct stm32_sai_sub_data *sai = mclk->sai_data;
  461. dev_dbg(&sai->pdev->dev, "Disable master clock\n");
  462. stm32_sai_sub_reg_up(sai, STM_SAI_CR1_REGX, SAI_XCR1_MCKEN, 0);
  463. }
  464. static const struct clk_ops mclk_ops = {
  465. .enable = stm32_sai_mclk_enable,
  466. .disable = stm32_sai_mclk_disable,
  467. .recalc_rate = stm32_sai_mclk_recalc_rate,
  468. .determine_rate = stm32_sai_mclk_determine_rate,
  469. .set_rate = stm32_sai_mclk_set_rate,
  470. };
  471. static int stm32_sai_add_mclk_provider(struct stm32_sai_sub_data *sai)
  472. {
  473. struct clk_hw *hw;
  474. struct stm32_sai_mclk_data *mclk;
  475. struct device *dev = &sai->pdev->dev;
  476. const char *pname = __clk_get_name(sai->sai_ck);
  477. char *mclk_name, *p, *s = (char *)pname;
  478. int ret, i = 0;
  479. mclk = devm_kzalloc(dev, sizeof(*mclk), GFP_KERNEL);
  480. if (!mclk)
  481. return -ENOMEM;
  482. mclk_name = devm_kcalloc(dev, sizeof(char),
  483. SAI_MCLK_NAME_LEN, GFP_KERNEL);
  484. if (!mclk_name)
  485. return -ENOMEM;
  486. /*
  487. * Forge mclk clock name from parent clock name and suffix.
  488. * String after "_" char is stripped in parent name.
  489. */
  490. p = mclk_name;
  491. while (*s && *s != '_' && (i < (SAI_MCLK_NAME_LEN - 7))) {
  492. *p++ = *s++;
  493. i++;
  494. }
  495. STM_SAI_IS_SUB_A(sai) ? strcat(p, "a_mclk") : strcat(p, "b_mclk");
  496. mclk->hw.init = CLK_HW_INIT(mclk_name, pname, &mclk_ops, 0);
  497. mclk->sai_data = sai;
  498. hw = &mclk->hw;
  499. dev_dbg(dev, "Register master clock %s\n", mclk_name);
  500. ret = devm_clk_hw_register(&sai->pdev->dev, hw);
  501. if (ret) {
  502. dev_err(dev, "mclk register returned %d\n", ret);
  503. return ret;
  504. }
  505. sai->sai_mclk = hw->clk;
  506. /* register mclk provider */
  507. return devm_of_clk_add_hw_provider(dev, of_clk_hw_simple_get, hw);
  508. }
  509. static irqreturn_t stm32_sai_isr(int irq, void *devid)
  510. {
  511. struct stm32_sai_sub_data *sai = (struct stm32_sai_sub_data *)devid;
  512. struct platform_device *pdev = sai->pdev;
  513. unsigned int sr, imr, flags;
  514. snd_pcm_state_t status = SNDRV_PCM_STATE_RUNNING;
  515. stm32_sai_sub_reg_rd(sai, STM_SAI_IMR_REGX, &imr);
  516. stm32_sai_sub_reg_rd(sai, STM_SAI_SR_REGX, &sr);
  517. flags = sr & imr;
  518. if (!flags)
  519. return IRQ_NONE;
  520. stm32_sai_sub_reg_wr(sai, STM_SAI_CLRFR_REGX, SAI_XCLRFR_MASK,
  521. SAI_XCLRFR_MASK);
  522. if (!sai->substream) {
  523. dev_err(&pdev->dev, "Device stopped. Spurious IRQ 0x%x\n", sr);
  524. return IRQ_NONE;
  525. }
  526. if (flags & SAI_XIMR_OVRUDRIE) {
  527. dev_err(&pdev->dev, "IRQ %s\n",
  528. STM_SAI_IS_PLAYBACK(sai) ? "underrun" : "overrun");
  529. status = SNDRV_PCM_STATE_XRUN;
  530. }
  531. if (flags & SAI_XIMR_MUTEDETIE)
  532. dev_dbg(&pdev->dev, "IRQ mute detected\n");
  533. if (flags & SAI_XIMR_WCKCFGIE) {
  534. dev_err(&pdev->dev, "IRQ wrong clock configuration\n");
  535. status = SNDRV_PCM_STATE_DISCONNECTED;
  536. }
  537. if (flags & SAI_XIMR_CNRDYIE)
  538. dev_err(&pdev->dev, "IRQ Codec not ready\n");
  539. if (flags & SAI_XIMR_AFSDETIE) {
  540. dev_err(&pdev->dev, "IRQ Anticipated frame synchro\n");
  541. status = SNDRV_PCM_STATE_XRUN;
  542. }
  543. if (flags & SAI_XIMR_LFSDETIE) {
  544. dev_err(&pdev->dev, "IRQ Late frame synchro\n");
  545. status = SNDRV_PCM_STATE_XRUN;
  546. }
  547. spin_lock(&sai->irq_lock);
  548. if (status != SNDRV_PCM_STATE_RUNNING && sai->substream)
  549. snd_pcm_stop_xrun(sai->substream);
  550. spin_unlock(&sai->irq_lock);
  551. return IRQ_HANDLED;
  552. }
  553. static int stm32_sai_set_sysclk(struct snd_soc_dai *cpu_dai,
  554. int clk_id, unsigned int freq, int dir)
  555. {
  556. struct stm32_sai_sub_data *sai = snd_soc_dai_get_drvdata(cpu_dai);
  557. int ret;
  558. /*
  559. * The mclk rate is determined at runtime from the audio stream rate.
  560. * Skip calls to the set_sysclk callback that are not relevant during the
  561. * initialization phase.
  562. */
  563. if (!snd_soc_card_is_instantiated(cpu_dai->component->card))
  564. return 0;
  565. if (dir == SND_SOC_CLOCK_OUT && sai->sai_mclk) {
  566. ret = stm32_sai_sub_reg_up(sai, STM_SAI_CR1_REGX,
  567. SAI_XCR1_NODIV,
  568. freq ? 0 : SAI_XCR1_NODIV);
  569. if (ret < 0)
  570. return ret;
  571. /* Assume shutdown if requested frequency is 0Hz */
  572. if (!freq) {
  573. /* Release mclk rate only if rate was actually set */
  574. if (sai->mclk_rate) {
  575. clk_rate_exclusive_put(sai->sai_mclk);
  576. sai->mclk_rate = 0;
  577. }
  578. if (sai->put_sai_ck_rate)
  579. sai->put_sai_ck_rate(sai);
  580. return 0;
  581. }
  582. /* If master clock is used, configure SAI kernel clock now */
  583. ret = sai->set_sai_ck_rate(sai, freq);
  584. if (ret)
  585. return ret;
  586. ret = clk_set_rate_exclusive(sai->sai_mclk, freq);
  587. if (ret) {
  588. dev_err(cpu_dai->dev,
  589. ret == -EBUSY ?
  590. "Active streams have incompatible rates" :
  591. "Could not set mclk rate\n");
  592. return ret;
  593. }
  594. dev_dbg(cpu_dai->dev, "SAI MCLK frequency is %uHz\n", freq);
  595. sai->mclk_rate = freq;
  596. }
  597. return 0;
  598. }
  599. static int stm32_sai_set_dai_tdm_slot(struct snd_soc_dai *cpu_dai, u32 tx_mask,
  600. u32 rx_mask, int slots, int slot_width)
  601. {
  602. struct stm32_sai_sub_data *sai = snd_soc_dai_get_drvdata(cpu_dai);
  603. int slotr, slotr_mask, slot_size;
  604. if (STM_SAI_PROTOCOL_IS_SPDIF(sai)) {
  605. dev_warn(cpu_dai->dev, "Slot setting relevant only for TDM\n");
  606. return 0;
  607. }
  608. dev_dbg(cpu_dai->dev, "Masks tx/rx:%#x/%#x, slots:%d, width:%d\n",
  609. tx_mask, rx_mask, slots, slot_width);
  610. switch (slot_width) {
  611. case 16:
  612. slot_size = SAI_SLOT_SIZE_16;
  613. break;
  614. case 32:
  615. slot_size = SAI_SLOT_SIZE_32;
  616. break;
  617. default:
  618. slot_size = SAI_SLOT_SIZE_AUTO;
  619. break;
  620. }
  621. slotr = SAI_XSLOTR_SLOTSZ_SET(slot_size) |
  622. SAI_XSLOTR_NBSLOT_SET(slots - 1);
  623. slotr_mask = SAI_XSLOTR_SLOTSZ_MASK | SAI_XSLOTR_NBSLOT_MASK;
  624. /* tx/rx mask set in machine init, if slot number defined in DT */
  625. if (STM_SAI_IS_PLAYBACK(sai)) {
  626. sai->slot_mask = tx_mask;
  627. slotr |= SAI_XSLOTR_SLOTEN_SET(tx_mask);
  628. }
  629. if (STM_SAI_IS_CAPTURE(sai)) {
  630. sai->slot_mask = rx_mask;
  631. slotr |= SAI_XSLOTR_SLOTEN_SET(rx_mask);
  632. }
  633. slotr_mask |= SAI_XSLOTR_SLOTEN_MASK;
  634. stm32_sai_sub_reg_up(sai, STM_SAI_SLOTR_REGX, slotr_mask, slotr);
  635. sai->slot_width = slot_width;
  636. sai->slots = slots;
  637. return 0;
  638. }
  639. static int stm32_sai_set_dai_fmt(struct snd_soc_dai *cpu_dai, unsigned int fmt)
  640. {
  641. struct stm32_sai_sub_data *sai = snd_soc_dai_get_drvdata(cpu_dai);
  642. int cr1, frcr = 0;
  643. int cr1_mask, frcr_mask = 0;
  644. int ret;
  645. dev_dbg(cpu_dai->dev, "fmt %x\n", fmt);
  646. /* Do not generate master by default */
  647. cr1 = SAI_XCR1_NODIV;
  648. cr1_mask = SAI_XCR1_NODIV;
  649. cr1_mask |= SAI_XCR1_PRTCFG_MASK;
  650. if (STM_SAI_PROTOCOL_IS_SPDIF(sai)) {
  651. cr1 |= SAI_XCR1_PRTCFG_SET(SAI_SPDIF_PROTOCOL);
  652. goto conf_update;
  653. }
  654. cr1 |= SAI_XCR1_PRTCFG_SET(SAI_FREE_PROTOCOL);
  655. switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
  656. /* SCK active high for all protocols */
  657. case SND_SOC_DAIFMT_I2S:
  658. cr1 |= SAI_XCR1_CKSTR;
  659. frcr |= SAI_XFRCR_FSOFF | SAI_XFRCR_FSDEF;
  660. break;
  661. /* Left justified */
  662. case SND_SOC_DAIFMT_MSB:
  663. cr1 |= SAI_XCR1_CKSTR;
  664. frcr |= SAI_XFRCR_FSPOL | SAI_XFRCR_FSDEF;
  665. break;
  666. /* Right justified */
  667. case SND_SOC_DAIFMT_LSB:
  668. frcr |= SAI_XFRCR_FSPOL | SAI_XFRCR_FSDEF;
  669. break;
  670. case SND_SOC_DAIFMT_DSP_A:
  671. cr1 |= SAI_XCR1_CKSTR;
  672. frcr |= SAI_XFRCR_FSPOL | SAI_XFRCR_FSOFF;
  673. break;
  674. case SND_SOC_DAIFMT_DSP_B:
  675. cr1 |= SAI_XCR1_CKSTR;
  676. frcr |= SAI_XFRCR_FSPOL;
  677. break;
  678. default:
  679. dev_err(cpu_dai->dev, "Unsupported protocol %#x\n",
  680. fmt & SND_SOC_DAIFMT_FORMAT_MASK);
  681. return -EINVAL;
  682. }
  683. cr1_mask |= SAI_XCR1_CKSTR;
  684. frcr_mask |= SAI_XFRCR_FSPOL | SAI_XFRCR_FSOFF |
  685. SAI_XFRCR_FSDEF;
  686. /* DAI clock strobing. Invert setting previously set */
  687. switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
  688. case SND_SOC_DAIFMT_NB_NF:
  689. break;
  690. case SND_SOC_DAIFMT_IB_NF:
  691. cr1 ^= SAI_XCR1_CKSTR;
  692. break;
  693. case SND_SOC_DAIFMT_NB_IF:
  694. frcr ^= SAI_XFRCR_FSPOL;
  695. break;
  696. case SND_SOC_DAIFMT_IB_IF:
  697. /* Invert fs & sck */
  698. cr1 ^= SAI_XCR1_CKSTR;
  699. frcr ^= SAI_XFRCR_FSPOL;
  700. break;
  701. default:
  702. dev_err(cpu_dai->dev, "Unsupported strobing %#x\n",
  703. fmt & SND_SOC_DAIFMT_INV_MASK);
  704. return -EINVAL;
  705. }
  706. cr1_mask |= SAI_XCR1_CKSTR;
  707. frcr_mask |= SAI_XFRCR_FSPOL;
  708. stm32_sai_sub_reg_up(sai, STM_SAI_FRCR_REGX, frcr_mask, frcr);
  709. /* DAI clock master masks */
  710. switch (fmt & SND_SOC_DAIFMT_CLOCK_PROVIDER_MASK) {
  711. case SND_SOC_DAIFMT_BC_FC:
  712. /* codec is master */
  713. cr1 |= SAI_XCR1_SLAVE;
  714. sai->master = false;
  715. break;
  716. case SND_SOC_DAIFMT_BP_FP:
  717. sai->master = true;
  718. break;
  719. default:
  720. dev_err(cpu_dai->dev, "Unsupported mode %#x\n",
  721. fmt & SND_SOC_DAIFMT_CLOCK_PROVIDER_MASK);
  722. return -EINVAL;
  723. }
  724. /* Set slave mode if sub-block is synchronized with another SAI */
  725. if (sai->sync) {
  726. dev_dbg(cpu_dai->dev, "Synchronized SAI configured as slave\n");
  727. cr1 |= SAI_XCR1_SLAVE;
  728. sai->master = false;
  729. }
  730. cr1_mask |= SAI_XCR1_SLAVE;
  731. conf_update:
  732. ret = stm32_sai_sub_reg_up(sai, STM_SAI_CR1_REGX, cr1_mask, cr1);
  733. if (ret < 0) {
  734. dev_err(cpu_dai->dev, "Failed to update CR1 register\n");
  735. return ret;
  736. }
  737. sai->fmt = fmt;
  738. return 0;
  739. }
  740. static int stm32_sai_startup(struct snd_pcm_substream *substream,
  741. struct snd_soc_dai *cpu_dai)
  742. {
  743. struct stm32_sai_sub_data *sai = snd_soc_dai_get_drvdata(cpu_dai);
  744. int imr, cr2, ret;
  745. unsigned long flags;
  746. spin_lock_irqsave(&sai->irq_lock, flags);
  747. sai->substream = substream;
  748. spin_unlock_irqrestore(&sai->irq_lock, flags);
  749. if (STM_SAI_PROTOCOL_IS_SPDIF(sai)) {
  750. snd_pcm_hw_constraint_mask64(substream->runtime,
  751. SNDRV_PCM_HW_PARAM_FORMAT,
  752. SNDRV_PCM_FMTBIT_S32_LE);
  753. snd_pcm_hw_constraint_single(substream->runtime,
  754. SNDRV_PCM_HW_PARAM_CHANNELS, 2);
  755. }
  756. ret = clk_prepare_enable(sai->sai_ck);
  757. if (ret < 0) {
  758. dev_err(cpu_dai->dev, "Failed to enable clock: %d\n", ret);
  759. return ret;
  760. }
  761. /* Enable ITs */
  762. stm32_sai_sub_reg_wr(sai, STM_SAI_CLRFR_REGX,
  763. SAI_XCLRFR_MASK, SAI_XCLRFR_MASK);
  764. imr = SAI_XIMR_OVRUDRIE;
  765. if (STM_SAI_IS_CAPTURE(sai)) {
  766. stm32_sai_sub_reg_rd(sai, STM_SAI_CR2_REGX, &cr2);
  767. if (cr2 & SAI_XCR2_MUTECNT_MASK)
  768. imr |= SAI_XIMR_MUTEDETIE;
  769. }
  770. if (sai->master)
  771. imr |= SAI_XIMR_WCKCFGIE;
  772. else
  773. imr |= SAI_XIMR_AFSDETIE | SAI_XIMR_LFSDETIE;
  774. stm32_sai_sub_reg_up(sai, STM_SAI_IMR_REGX,
  775. SAI_XIMR_MASK, imr);
  776. return 0;
  777. }
  778. static int stm32_sai_set_config(struct snd_soc_dai *cpu_dai,
  779. struct snd_pcm_substream *substream,
  780. struct snd_pcm_hw_params *params)
  781. {
  782. struct stm32_sai_sub_data *sai = snd_soc_dai_get_drvdata(cpu_dai);
  783. int cr1, cr1_mask, ret;
  784. /*
  785. * DMA bursts increment is set to 4 words.
  786. * SAI fifo threshold is set to half fifo, to keep enough space
  787. * for DMA incoming bursts.
  788. */
  789. stm32_sai_sub_reg_wr(sai, STM_SAI_CR2_REGX,
  790. SAI_XCR2_FFLUSH | SAI_XCR2_FTH_MASK,
  791. SAI_XCR2_FFLUSH |
  792. SAI_XCR2_FTH_SET(STM_SAI_FIFO_TH_HALF));
  793. /* DS bits in CR1 not set for SPDIF (size forced to 24 bits).*/
  794. if (STM_SAI_PROTOCOL_IS_SPDIF(sai)) {
  795. sai->spdif_frm_cnt = 0;
  796. return 0;
  797. }
  798. /* Mode, data format and channel config */
  799. cr1_mask = SAI_XCR1_DS_MASK;
  800. switch (params_format(params)) {
  801. case SNDRV_PCM_FORMAT_S8:
  802. cr1 = SAI_XCR1_DS_SET(SAI_DATASIZE_8);
  803. break;
  804. case SNDRV_PCM_FORMAT_S16_LE:
  805. cr1 = SAI_XCR1_DS_SET(SAI_DATASIZE_16);
  806. break;
  807. case SNDRV_PCM_FORMAT_S32_LE:
  808. cr1 = SAI_XCR1_DS_SET(SAI_DATASIZE_32);
  809. break;
  810. default:
  811. dev_err(cpu_dai->dev, "Data format not supported\n");
  812. return -EINVAL;
  813. }
  814. cr1_mask |= SAI_XCR1_MONO;
  815. if ((sai->slots == 2) && (params_channels(params) == 1))
  816. cr1 |= SAI_XCR1_MONO;
  817. ret = stm32_sai_sub_reg_up(sai, STM_SAI_CR1_REGX, cr1_mask, cr1);
  818. if (ret < 0) {
  819. dev_err(cpu_dai->dev, "Failed to update CR1 register\n");
  820. return ret;
  821. }
  822. return 0;
  823. }
  824. static int stm32_sai_set_slots(struct snd_soc_dai *cpu_dai)
  825. {
  826. struct stm32_sai_sub_data *sai = snd_soc_dai_get_drvdata(cpu_dai);
  827. int slotr, slot_sz;
  828. stm32_sai_sub_reg_rd(sai, STM_SAI_SLOTR_REGX, &slotr);
  829. /*
  830. * If SLOTSZ is set to auto in SLOTR, align slot width on data size
  831. * By default slot width = data size, if not forced from DT
  832. */
  833. slot_sz = slotr & SAI_XSLOTR_SLOTSZ_MASK;
  834. if (slot_sz == SAI_XSLOTR_SLOTSZ_SET(SAI_SLOT_SIZE_AUTO))
  835. sai->slot_width = sai->data_size;
  836. if (sai->slot_width < sai->data_size) {
  837. dev_err(cpu_dai->dev,
  838. "Data size %d larger than slot width\n",
  839. sai->data_size);
  840. return -EINVAL;
  841. }
  842. /* Slot number is set to 2, if not specified in DT */
  843. if (!sai->slots)
  844. sai->slots = 2;
  845. /* The number of slots in the audio frame is equal to NBSLOT[3:0] + 1*/
  846. stm32_sai_sub_reg_up(sai, STM_SAI_SLOTR_REGX,
  847. SAI_XSLOTR_NBSLOT_MASK,
  848. SAI_XSLOTR_NBSLOT_SET((sai->slots - 1)));
  849. /* Set default slots mask if not already set from DT */
  850. if (!(slotr & SAI_XSLOTR_SLOTEN_MASK)) {
  851. sai->slot_mask = (1 << sai->slots) - 1;
  852. stm32_sai_sub_reg_up(sai,
  853. STM_SAI_SLOTR_REGX, SAI_XSLOTR_SLOTEN_MASK,
  854. SAI_XSLOTR_SLOTEN_SET(sai->slot_mask));
  855. }
  856. dev_dbg(cpu_dai->dev, "Slots %d, slot width %d\n",
  857. sai->slots, sai->slot_width);
  858. return 0;
  859. }
  860. static void stm32_sai_set_frame(struct snd_soc_dai *cpu_dai)
  861. {
  862. struct stm32_sai_sub_data *sai = snd_soc_dai_get_drvdata(cpu_dai);
  863. int fs_active, offset, format;
  864. int frcr, frcr_mask;
  865. format = sai->fmt & SND_SOC_DAIFMT_FORMAT_MASK;
  866. sai->fs_length = sai->slot_width * sai->slots;
  867. fs_active = sai->fs_length / 2;
  868. if ((format == SND_SOC_DAIFMT_DSP_A) ||
  869. (format == SND_SOC_DAIFMT_DSP_B))
  870. fs_active = 1;
  871. frcr = SAI_XFRCR_FRL_SET((sai->fs_length - 1));
  872. frcr |= SAI_XFRCR_FSALL_SET((fs_active - 1));
  873. frcr_mask = SAI_XFRCR_FRL_MASK | SAI_XFRCR_FSALL_MASK;
  874. dev_dbg(cpu_dai->dev, "Frame length %d, frame active %d\n",
  875. sai->fs_length, fs_active);
  876. stm32_sai_sub_reg_up(sai, STM_SAI_FRCR_REGX, frcr_mask, frcr);
  877. if ((sai->fmt & SND_SOC_DAIFMT_FORMAT_MASK) == SND_SOC_DAIFMT_LSB) {
  878. offset = sai->slot_width - sai->data_size;
  879. stm32_sai_sub_reg_up(sai, STM_SAI_SLOTR_REGX,
  880. SAI_XSLOTR_FBOFF_MASK,
  881. SAI_XSLOTR_FBOFF_SET(offset));
  882. }
  883. }
  884. static void stm32_sai_init_iec958_status(struct stm32_sai_sub_data *sai)
  885. {
  886. unsigned char *cs = sai->iec958.status;
  887. cs[0] = IEC958_AES0_CON_NOT_COPYRIGHT | IEC958_AES0_CON_EMPHASIS_NONE;
  888. cs[1] = IEC958_AES1_CON_GENERAL;
  889. cs[2] = IEC958_AES2_CON_SOURCE_UNSPEC | IEC958_AES2_CON_CHANNEL_UNSPEC;
  890. cs[3] = IEC958_AES3_CON_CLOCK_1000PPM | IEC958_AES3_CON_FS_NOTID;
  891. }
  892. static void stm32_sai_set_iec958_status(struct stm32_sai_sub_data *sai,
  893. struct snd_pcm_runtime *runtime)
  894. {
  895. if (!runtime)
  896. return;
  897. /* Force the sample rate according to runtime rate */
  898. mutex_lock(&sai->ctrl_lock);
  899. switch (runtime->rate) {
  900. case 22050:
  901. sai->iec958.status[3] = IEC958_AES3_CON_FS_22050;
  902. break;
  903. case 44100:
  904. sai->iec958.status[3] = IEC958_AES3_CON_FS_44100;
  905. break;
  906. case 88200:
  907. sai->iec958.status[3] = IEC958_AES3_CON_FS_88200;
  908. break;
  909. case 176400:
  910. sai->iec958.status[3] = IEC958_AES3_CON_FS_176400;
  911. break;
  912. case 24000:
  913. sai->iec958.status[3] = IEC958_AES3_CON_FS_24000;
  914. break;
  915. case 48000:
  916. sai->iec958.status[3] = IEC958_AES3_CON_FS_48000;
  917. break;
  918. case 96000:
  919. sai->iec958.status[3] = IEC958_AES3_CON_FS_96000;
  920. break;
  921. case 192000:
  922. sai->iec958.status[3] = IEC958_AES3_CON_FS_192000;
  923. break;
  924. case 32000:
  925. sai->iec958.status[3] = IEC958_AES3_CON_FS_32000;
  926. break;
  927. default:
  928. sai->iec958.status[3] = IEC958_AES3_CON_FS_NOTID;
  929. break;
  930. }
  931. mutex_unlock(&sai->ctrl_lock);
  932. }
  933. static int stm32_sai_configure_clock(struct snd_soc_dai *cpu_dai,
  934. struct snd_pcm_hw_params *params)
  935. {
  936. struct stm32_sai_sub_data *sai = snd_soc_dai_get_drvdata(cpu_dai);
  937. int div = 0, cr1 = 0;
  938. int sai_clk_rate, mclk_ratio, den;
  939. unsigned int rate = params_rate(params);
  940. int ret;
  941. if (!sai->sai_mclk) {
  942. ret = sai->set_sai_ck_rate(sai, rate);
  943. if (ret)
  944. return ret;
  945. }
  946. sai_clk_rate = clk_get_rate(sai->sai_ck);
  947. if (STM_SAI_IS_F4(sai->pdata)) {
  948. /* mclk on (NODIV=0)
  949. * mclk_rate = 256 * fs
  950. * MCKDIV = 0 if sai_ck < 3/2 * mclk_rate
  951. * MCKDIV = sai_ck / (2 * mclk_rate) otherwise
  952. * mclk off (NODIV=1)
  953. * MCKDIV ignored. sck = sai_ck
  954. */
  955. if (!sai->mclk_rate)
  956. return 0;
  957. if (2 * sai_clk_rate >= 3 * sai->mclk_rate) {
  958. div = stm32_sai_get_clk_div(sai, sai_clk_rate,
  959. 2 * sai->mclk_rate);
  960. if (div < 0)
  961. return div;
  962. }
  963. } else {
  964. /*
  965. * TDM mode :
  966. * mclk on
  967. * MCKDIV = sai_ck / (ws x 256) (NOMCK=0. OSR=0)
  968. * MCKDIV = sai_ck / (ws x 512) (NOMCK=0. OSR=1)
  969. * mclk off
  970. * MCKDIV = sai_ck / (frl x ws) (NOMCK=1)
  971. * Note: NOMCK/NODIV correspond to same bit.
  972. */
  973. if (STM_SAI_PROTOCOL_IS_SPDIF(sai)) {
  974. div = stm32_sai_get_clk_div(sai, sai_clk_rate,
  975. rate * 128);
  976. if (div < 0)
  977. return div;
  978. } else {
  979. if (sai->mclk_rate) {
  980. mclk_ratio = sai->mclk_rate / rate;
  981. if (mclk_ratio == 512) {
  982. cr1 = SAI_XCR1_OSR;
  983. } else if (mclk_ratio != 256) {
  984. dev_err(cpu_dai->dev,
  985. "Wrong mclk ratio %d\n",
  986. mclk_ratio);
  987. return -EINVAL;
  988. }
  989. stm32_sai_sub_reg_up(sai,
  990. STM_SAI_CR1_REGX,
  991. SAI_XCR1_OSR, cr1);
  992. div = stm32_sai_get_clk_div(sai, sai_clk_rate,
  993. sai->mclk_rate);
  994. if (div < 0)
  995. return div;
  996. } else {
  997. /* mclk-fs not set, master clock not active */
  998. den = sai->fs_length * params_rate(params);
  999. div = stm32_sai_get_clk_div(sai, sai_clk_rate,
  1000. den);
  1001. if (div < 0)
  1002. return div;
  1003. }
  1004. }
  1005. }
  1006. return stm32_sai_set_clk_div(sai, div);
  1007. }
  1008. static int stm32_sai_hw_params(struct snd_pcm_substream *substream,
  1009. struct snd_pcm_hw_params *params,
  1010. struct snd_soc_dai *cpu_dai)
  1011. {
  1012. struct stm32_sai_sub_data *sai = snd_soc_dai_get_drvdata(cpu_dai);
  1013. int ret;
  1014. sai->data_size = params_width(params);
  1015. if (STM_SAI_PROTOCOL_IS_SPDIF(sai)) {
  1016. /* Rate not already set in runtime structure */
  1017. substream->runtime->rate = params_rate(params);
  1018. stm32_sai_set_iec958_status(sai, substream->runtime);
  1019. } else {
  1020. ret = stm32_sai_set_slots(cpu_dai);
  1021. if (ret < 0)
  1022. return ret;
  1023. stm32_sai_set_frame(cpu_dai);
  1024. }
  1025. ret = stm32_sai_set_config(cpu_dai, substream, params);
  1026. if (ret)
  1027. return ret;
  1028. if (sai->master)
  1029. ret = stm32_sai_configure_clock(cpu_dai, params);
  1030. return ret;
  1031. }
  1032. static int stm32_sai_trigger(struct snd_pcm_substream *substream, int cmd,
  1033. struct snd_soc_dai *cpu_dai)
  1034. {
  1035. struct stm32_sai_sub_data *sai = snd_soc_dai_get_drvdata(cpu_dai);
  1036. int ret;
  1037. switch (cmd) {
  1038. case SNDRV_PCM_TRIGGER_START:
  1039. case SNDRV_PCM_TRIGGER_RESUME:
  1040. case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
  1041. dev_dbg(cpu_dai->dev, "Enable DMA and SAI\n");
  1042. stm32_sai_sub_reg_up(sai, STM_SAI_CR1_REGX,
  1043. SAI_XCR1_DMAEN, SAI_XCR1_DMAEN);
  1044. /* Enable SAI */
  1045. ret = stm32_sai_sub_reg_up(sai, STM_SAI_CR1_REGX,
  1046. SAI_XCR1_SAIEN, SAI_XCR1_SAIEN);
  1047. if (ret < 0)
  1048. dev_err(cpu_dai->dev, "Failed to update CR1 register\n");
  1049. break;
  1050. case SNDRV_PCM_TRIGGER_SUSPEND:
  1051. case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
  1052. case SNDRV_PCM_TRIGGER_STOP:
  1053. dev_dbg(cpu_dai->dev, "Disable DMA and SAI\n");
  1054. stm32_sai_sub_reg_up(sai, STM_SAI_IMR_REGX,
  1055. SAI_XIMR_MASK, 0);
  1056. stm32_sai_sub_reg_up(sai, STM_SAI_CR1_REGX,
  1057. SAI_XCR1_SAIEN,
  1058. (unsigned int)~SAI_XCR1_SAIEN);
  1059. ret = stm32_sai_sub_reg_up(sai, STM_SAI_CR1_REGX,
  1060. SAI_XCR1_DMAEN,
  1061. (unsigned int)~SAI_XCR1_DMAEN);
  1062. if (ret < 0)
  1063. dev_err(cpu_dai->dev, "Failed to update CR1 register\n");
  1064. if (STM_SAI_PROTOCOL_IS_SPDIF(sai))
  1065. sai->spdif_frm_cnt = 0;
  1066. break;
  1067. default:
  1068. return -EINVAL;
  1069. }
  1070. return ret;
  1071. }
  1072. static void stm32_sai_shutdown(struct snd_pcm_substream *substream,
  1073. struct snd_soc_dai *cpu_dai)
  1074. {
  1075. struct stm32_sai_sub_data *sai = snd_soc_dai_get_drvdata(cpu_dai);
  1076. unsigned long flags;
  1077. stm32_sai_sub_reg_up(sai, STM_SAI_IMR_REGX, SAI_XIMR_MASK, 0);
  1078. clk_disable_unprepare(sai->sai_ck);
  1079. /*
  1080. * Release kernel clock if following conditions are fulfilled
  1081. * - Master clock is not used. Kernel clock won't be released trough sysclk
  1082. * - Put handler is defined. Involve that clock is managed exclusively
  1083. */
  1084. if (!sai->sai_mclk && sai->put_sai_ck_rate)
  1085. sai->put_sai_ck_rate(sai);
  1086. spin_lock_irqsave(&sai->irq_lock, flags);
  1087. sai->substream = NULL;
  1088. spin_unlock_irqrestore(&sai->irq_lock, flags);
  1089. }
  1090. static int stm32_sai_pcm_new(struct snd_soc_pcm_runtime *rtd,
  1091. struct snd_soc_dai *cpu_dai)
  1092. {
  1093. struct stm32_sai_sub_data *sai = dev_get_drvdata(cpu_dai->dev);
  1094. struct snd_kcontrol_new knew = iec958_ctls;
  1095. if (STM_SAI_PROTOCOL_IS_SPDIF(sai)) {
  1096. dev_dbg(&sai->pdev->dev, "%s: register iec controls", __func__);
  1097. knew.device = rtd->pcm->device;
  1098. return snd_ctl_add(rtd->pcm->card, snd_ctl_new1(&knew, sai));
  1099. }
  1100. return 0;
  1101. }
  1102. static int stm32_sai_dai_probe(struct snd_soc_dai *cpu_dai)
  1103. {
  1104. struct stm32_sai_sub_data *sai = dev_get_drvdata(cpu_dai->dev);
  1105. int cr1 = 0, cr1_mask, ret;
  1106. sai->cpu_dai = cpu_dai;
  1107. sai->dma_params.addr = (dma_addr_t)(sai->phys_addr + STM_SAI_DR_REGX);
  1108. /*
  1109. * DMA supports 4, 8 or 16 burst sizes. Burst size 4 is the best choice,
  1110. * as it allows bytes, half-word and words transfers. (See DMA fifos
  1111. * constraints).
  1112. */
  1113. sai->dma_params.maxburst = 4;
  1114. if (sai->pdata->conf.fifo_size < 8 || sai->pdata->conf.no_dma_burst)
  1115. sai->dma_params.maxburst = 1;
  1116. /* Buswidth will be set by framework at runtime */
  1117. sai->dma_params.addr_width = DMA_SLAVE_BUSWIDTH_UNDEFINED;
  1118. if (STM_SAI_IS_PLAYBACK(sai))
  1119. snd_soc_dai_init_dma_data(cpu_dai, &sai->dma_params, NULL);
  1120. else
  1121. snd_soc_dai_init_dma_data(cpu_dai, NULL, &sai->dma_params);
  1122. /* Next settings are not relevant for spdif mode */
  1123. if (STM_SAI_PROTOCOL_IS_SPDIF(sai))
  1124. return 0;
  1125. cr1_mask = SAI_XCR1_RX_TX;
  1126. if (STM_SAI_IS_CAPTURE(sai))
  1127. cr1 |= SAI_XCR1_RX_TX;
  1128. /* Configure synchronization */
  1129. if (sai->sync == SAI_SYNC_EXTERNAL) {
  1130. /* Configure synchro client and provider */
  1131. ret = sai->pdata->set_sync(sai->pdata, sai->np_sync_provider,
  1132. sai->synco, sai->synci);
  1133. if (ret)
  1134. return ret;
  1135. }
  1136. cr1_mask |= SAI_XCR1_SYNCEN_MASK;
  1137. cr1 |= SAI_XCR1_SYNCEN_SET(sai->sync);
  1138. return stm32_sai_sub_reg_up(sai, STM_SAI_CR1_REGX, cr1_mask, cr1);
  1139. }
  1140. static const struct snd_soc_dai_ops stm32_sai_pcm_dai_ops = {
  1141. .probe = stm32_sai_dai_probe,
  1142. .set_sysclk = stm32_sai_set_sysclk,
  1143. .set_fmt = stm32_sai_set_dai_fmt,
  1144. .set_tdm_slot = stm32_sai_set_dai_tdm_slot,
  1145. .startup = stm32_sai_startup,
  1146. .hw_params = stm32_sai_hw_params,
  1147. .trigger = stm32_sai_trigger,
  1148. .shutdown = stm32_sai_shutdown,
  1149. .pcm_new = stm32_sai_pcm_new,
  1150. };
  1151. static const struct snd_soc_dai_ops stm32_sai_pcm_dai_ops2 = {
  1152. .probe = stm32_sai_dai_probe,
  1153. .set_sysclk = stm32_sai_set_sysclk,
  1154. .set_fmt = stm32_sai_set_dai_fmt,
  1155. .set_tdm_slot = stm32_sai_set_dai_tdm_slot,
  1156. .startup = stm32_sai_startup,
  1157. .hw_params = stm32_sai_hw_params,
  1158. .trigger = stm32_sai_trigger,
  1159. .shutdown = stm32_sai_shutdown,
  1160. };
  1161. static int stm32_sai_pcm_process_spdif(struct snd_pcm_substream *substream,
  1162. int channel, unsigned long hwoff,
  1163. unsigned long bytes)
  1164. {
  1165. struct snd_pcm_runtime *runtime = substream->runtime;
  1166. struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
  1167. struct snd_soc_dai *cpu_dai = snd_soc_rtd_to_cpu(rtd, 0);
  1168. struct stm32_sai_sub_data *sai = dev_get_drvdata(cpu_dai->dev);
  1169. int *ptr = (int *)(runtime->dma_area + hwoff +
  1170. channel * (runtime->dma_bytes / runtime->channels));
  1171. ssize_t cnt = bytes_to_samples(runtime, bytes);
  1172. unsigned int frm_cnt = sai->spdif_frm_cnt;
  1173. unsigned int byte;
  1174. unsigned int mask;
  1175. do {
  1176. *ptr = ((*ptr >> 8) & 0x00ffffff);
  1177. /* Set channel status bit */
  1178. byte = frm_cnt >> 3;
  1179. mask = 1 << (frm_cnt - (byte << 3));
  1180. if (sai->iec958.status[byte] & mask)
  1181. *ptr |= 0x04000000;
  1182. ptr++;
  1183. if (!(cnt % 2))
  1184. frm_cnt++;
  1185. if (frm_cnt == SAI_IEC60958_BLOCK_FRAMES)
  1186. frm_cnt = 0;
  1187. } while (--cnt);
  1188. sai->spdif_frm_cnt = frm_cnt;
  1189. return 0;
  1190. }
  1191. /* No support of mmap in S/PDIF mode */
  1192. static const struct snd_pcm_hardware stm32_sai_pcm_hw_spdif = {
  1193. .info = SNDRV_PCM_INFO_INTERLEAVED,
  1194. .buffer_bytes_max = 8 * PAGE_SIZE,
  1195. .period_bytes_min = 1024,
  1196. .period_bytes_max = PAGE_SIZE,
  1197. .periods_min = 2,
  1198. .periods_max = 8,
  1199. };
  1200. static const struct snd_pcm_hardware stm32_sai_pcm_hw = {
  1201. .info = SNDRV_PCM_INFO_INTERLEAVED | SNDRV_PCM_INFO_MMAP,
  1202. .buffer_bytes_max = 8 * PAGE_SIZE,
  1203. .period_bytes_min = 1024, /* 5ms at 48kHz */
  1204. .period_bytes_max = PAGE_SIZE,
  1205. .periods_min = 2,
  1206. .periods_max = 8,
  1207. };
  1208. static struct snd_soc_dai_driver stm32_sai_playback_dai = {
  1209. .id = 1, /* avoid call to fmt_single_name() */
  1210. .playback = {
  1211. .channels_min = 1,
  1212. .channels_max = 16,
  1213. .rate_min = 8000,
  1214. .rate_max = 192000,
  1215. .rates = SNDRV_PCM_RATE_CONTINUOUS,
  1216. /* DMA does not support 24 bits transfers */
  1217. .formats =
  1218. SNDRV_PCM_FMTBIT_S8 |
  1219. SNDRV_PCM_FMTBIT_S16_LE |
  1220. SNDRV_PCM_FMTBIT_S32_LE,
  1221. },
  1222. .ops = &stm32_sai_pcm_dai_ops,
  1223. };
  1224. static struct snd_soc_dai_driver stm32_sai_capture_dai = {
  1225. .id = 1, /* avoid call to fmt_single_name() */
  1226. .capture = {
  1227. .channels_min = 1,
  1228. .channels_max = 16,
  1229. .rate_min = 8000,
  1230. .rate_max = 192000,
  1231. .rates = SNDRV_PCM_RATE_CONTINUOUS,
  1232. /* DMA does not support 24 bits transfers */
  1233. .formats =
  1234. SNDRV_PCM_FMTBIT_S8 |
  1235. SNDRV_PCM_FMTBIT_S16_LE |
  1236. SNDRV_PCM_FMTBIT_S32_LE,
  1237. },
  1238. .ops = &stm32_sai_pcm_dai_ops2,
  1239. };
  1240. static const struct snd_dmaengine_pcm_config stm32_sai_pcm_config = {
  1241. .pcm_hardware = &stm32_sai_pcm_hw,
  1242. .prepare_slave_config = snd_dmaengine_pcm_prepare_slave_config,
  1243. };
  1244. static const struct snd_dmaengine_pcm_config stm32_sai_pcm_config_spdif = {
  1245. .pcm_hardware = &stm32_sai_pcm_hw_spdif,
  1246. .prepare_slave_config = snd_dmaengine_pcm_prepare_slave_config,
  1247. .process = stm32_sai_pcm_process_spdif,
  1248. };
  1249. static const struct snd_soc_component_driver stm32_component = {
  1250. .name = "stm32-sai",
  1251. .legacy_dai_naming = 1,
  1252. };
  1253. static const struct of_device_id stm32_sai_sub_ids[] = {
  1254. { .compatible = "st,stm32-sai-sub-a",
  1255. .data = (void *)STM_SAI_A_ID},
  1256. { .compatible = "st,stm32-sai-sub-b",
  1257. .data = (void *)STM_SAI_B_ID},
  1258. {}
  1259. };
  1260. MODULE_DEVICE_TABLE(of, stm32_sai_sub_ids);
  1261. static int stm32_sai_sub_parse_of(struct platform_device *pdev,
  1262. struct stm32_sai_sub_data *sai)
  1263. {
  1264. struct device_node *np = pdev->dev.of_node;
  1265. struct resource *res;
  1266. void __iomem *base;
  1267. struct of_phandle_args args;
  1268. int ret;
  1269. if (!np)
  1270. return -ENODEV;
  1271. base = devm_platform_get_and_ioremap_resource(pdev, 0, &res);
  1272. if (IS_ERR(base))
  1273. return PTR_ERR(base);
  1274. sai->phys_addr = res->start;
  1275. sai->regmap_config = &stm32_sai_sub_regmap_config_f4;
  1276. /* Note: PDM registers not available for sub-block B */
  1277. if (STM_SAI_HAS_PDM(sai) && STM_SAI_IS_SUB_A(sai))
  1278. sai->regmap_config = &stm32_sai_sub_regmap_config_h7;
  1279. /*
  1280. * Do not manage peripheral clock through regmap framework as this
  1281. * can lead to circular locking issue with sai master clock provider.
  1282. * Manage peripheral clock directly in driver instead.
  1283. */
  1284. sai->regmap = devm_regmap_init_mmio(&pdev->dev, base,
  1285. sai->regmap_config);
  1286. if (IS_ERR(sai->regmap))
  1287. return dev_err_probe(&pdev->dev, PTR_ERR(sai->regmap),
  1288. "Regmap init error\n");
  1289. /* Get direction property */
  1290. if (of_property_match_string(np, "dma-names", "tx") >= 0) {
  1291. sai->dir = SNDRV_PCM_STREAM_PLAYBACK;
  1292. } else if (of_property_match_string(np, "dma-names", "rx") >= 0) {
  1293. sai->dir = SNDRV_PCM_STREAM_CAPTURE;
  1294. } else {
  1295. dev_err(&pdev->dev, "Unsupported direction\n");
  1296. return -EINVAL;
  1297. }
  1298. /* Get spdif iec60958 property */
  1299. sai->spdif = false;
  1300. if (of_property_present(np, "st,iec60958")) {
  1301. if (!STM_SAI_HAS_SPDIF(sai) ||
  1302. sai->dir == SNDRV_PCM_STREAM_CAPTURE) {
  1303. dev_err(&pdev->dev, "S/PDIF IEC60958 not supported\n");
  1304. return -EINVAL;
  1305. }
  1306. stm32_sai_init_iec958_status(sai);
  1307. sai->spdif = true;
  1308. sai->master = true;
  1309. }
  1310. /* Get synchronization property */
  1311. args.np = NULL;
  1312. ret = of_parse_phandle_with_fixed_args(np, "st,sync", 1, 0, &args);
  1313. if (ret < 0 && ret != -ENOENT) {
  1314. dev_err(&pdev->dev, "Failed to get st,sync property\n");
  1315. return ret;
  1316. }
  1317. sai->sync = SAI_SYNC_NONE;
  1318. if (args.np) {
  1319. if (args.np == np) {
  1320. dev_err(&pdev->dev, "%pOFn sync own reference\n", np);
  1321. of_node_put(args.np);
  1322. return -EINVAL;
  1323. }
  1324. sai->np_sync_provider = of_get_parent(args.np);
  1325. if (!sai->np_sync_provider) {
  1326. dev_err(&pdev->dev, "%pOFn parent node not found\n",
  1327. np);
  1328. of_node_put(args.np);
  1329. return -ENODEV;
  1330. }
  1331. sai->sync = SAI_SYNC_INTERNAL;
  1332. if (sai->np_sync_provider != sai->pdata->pdev->dev.of_node) {
  1333. if (!STM_SAI_HAS_EXT_SYNC(sai)) {
  1334. dev_err(&pdev->dev,
  1335. "External synchro not supported\n");
  1336. of_node_put(args.np);
  1337. ret = -EINVAL;
  1338. goto err_put_sync_provider;
  1339. }
  1340. sai->sync = SAI_SYNC_EXTERNAL;
  1341. sai->synci = args.args[0];
  1342. if (sai->synci < 1 ||
  1343. (sai->synci > (SAI_GCR_SYNCIN_MAX + 1))) {
  1344. dev_err(&pdev->dev, "Wrong SAI index\n");
  1345. of_node_put(args.np);
  1346. ret = -EINVAL;
  1347. goto err_put_sync_provider;
  1348. }
  1349. if (of_property_match_string(args.np, "compatible",
  1350. "st,stm32-sai-sub-a") >= 0)
  1351. sai->synco = STM_SAI_SYNC_OUT_A;
  1352. if (of_property_match_string(args.np, "compatible",
  1353. "st,stm32-sai-sub-b") >= 0)
  1354. sai->synco = STM_SAI_SYNC_OUT_B;
  1355. if (!sai->synco) {
  1356. dev_err(&pdev->dev, "Unknown SAI sub-block\n");
  1357. of_node_put(args.np);
  1358. ret = -EINVAL;
  1359. goto err_put_sync_provider;
  1360. }
  1361. }
  1362. dev_dbg(&pdev->dev, "%s synchronized with %s\n",
  1363. pdev->name, args.np->full_name);
  1364. }
  1365. of_node_put(args.np);
  1366. sai->sai_ck = devm_clk_get(&pdev->dev, "sai_ck");
  1367. if (IS_ERR(sai->sai_ck)) {
  1368. ret = dev_err_probe(&pdev->dev, PTR_ERR(sai->sai_ck),
  1369. "Missing kernel clock sai_ck\n");
  1370. goto err_put_sync_provider;
  1371. }
  1372. ret = clk_prepare(sai->pdata->pclk);
  1373. if (ret < 0)
  1374. goto err_put_sync_provider;
  1375. if (STM_SAI_IS_F4(sai->pdata))
  1376. return 0;
  1377. /* Register mclk provider if requested */
  1378. if (of_property_present(np, "#clock-cells")) {
  1379. ret = stm32_sai_add_mclk_provider(sai);
  1380. if (ret < 0)
  1381. goto err_unprepare_pclk;
  1382. } else {
  1383. sai->sai_mclk = devm_clk_get_optional(&pdev->dev, "MCLK");
  1384. if (IS_ERR(sai->sai_mclk)) {
  1385. ret = PTR_ERR(sai->sai_mclk);
  1386. goto err_unprepare_pclk;
  1387. }
  1388. }
  1389. return 0;
  1390. err_unprepare_pclk:
  1391. clk_unprepare(sai->pdata->pclk);
  1392. err_put_sync_provider:
  1393. of_node_put(sai->np_sync_provider);
  1394. return ret;
  1395. }
  1396. static int stm32_sai_sub_probe(struct platform_device *pdev)
  1397. {
  1398. struct stm32_sai_sub_data *sai;
  1399. const struct snd_dmaengine_pcm_config *conf = &stm32_sai_pcm_config;
  1400. int ret;
  1401. sai = devm_kzalloc(&pdev->dev, sizeof(*sai), GFP_KERNEL);
  1402. if (!sai)
  1403. return -ENOMEM;
  1404. sai->id = (uintptr_t)device_get_match_data(&pdev->dev);
  1405. sai->pdev = pdev;
  1406. mutex_init(&sai->ctrl_lock);
  1407. spin_lock_init(&sai->irq_lock);
  1408. platform_set_drvdata(pdev, sai);
  1409. sai->pdata = dev_get_drvdata(pdev->dev.parent);
  1410. if (!sai->pdata) {
  1411. dev_err(&pdev->dev, "Parent device data not available\n");
  1412. return -EINVAL;
  1413. }
  1414. if (sai->pdata->conf.get_sai_ck_parent) {
  1415. sai->set_sai_ck_rate = stm32_sai_set_parent_clk;
  1416. } else {
  1417. sai->set_sai_ck_rate = stm32_sai_set_parent_rate;
  1418. sai->put_sai_ck_rate = stm32_sai_put_parent_rate;
  1419. }
  1420. ret = stm32_sai_sub_parse_of(pdev, sai);
  1421. if (ret)
  1422. return ret;
  1423. if (STM_SAI_IS_PLAYBACK(sai))
  1424. sai->cpu_dai_drv = stm32_sai_playback_dai;
  1425. else
  1426. sai->cpu_dai_drv = stm32_sai_capture_dai;
  1427. sai->cpu_dai_drv.name = dev_name(&pdev->dev);
  1428. ret = devm_request_irq(&pdev->dev, sai->pdata->irq, stm32_sai_isr,
  1429. IRQF_SHARED, dev_name(&pdev->dev), sai);
  1430. if (ret) {
  1431. dev_err(&pdev->dev, "IRQ request returned %d\n", ret);
  1432. goto err_unprepare_pclk;
  1433. }
  1434. if (STM_SAI_PROTOCOL_IS_SPDIF(sai))
  1435. conf = &stm32_sai_pcm_config_spdif;
  1436. ret = snd_dmaengine_pcm_register(&pdev->dev, conf, 0);
  1437. if (ret) {
  1438. ret = dev_err_probe(&pdev->dev, ret, "Could not register pcm dma\n");
  1439. goto err_unprepare_pclk;
  1440. }
  1441. ret = snd_soc_register_component(&pdev->dev, &stm32_component,
  1442. &sai->cpu_dai_drv, 1);
  1443. if (ret)
  1444. goto err_deregister_pcm_dma;
  1445. pm_runtime_enable(&pdev->dev);
  1446. return 0;
  1447. err_deregister_pcm_dma:
  1448. snd_dmaengine_pcm_unregister(&pdev->dev);
  1449. err_unprepare_pclk:
  1450. clk_unprepare(sai->pdata->pclk);
  1451. of_node_put(sai->np_sync_provider);
  1452. return ret;
  1453. }
  1454. static void stm32_sai_sub_remove(struct platform_device *pdev)
  1455. {
  1456. struct stm32_sai_sub_data *sai = dev_get_drvdata(&pdev->dev);
  1457. clk_unprepare(sai->pdata->pclk);
  1458. snd_dmaengine_pcm_unregister(&pdev->dev);
  1459. snd_soc_unregister_component(&pdev->dev);
  1460. pm_runtime_disable(&pdev->dev);
  1461. of_node_put(sai->np_sync_provider);
  1462. }
  1463. static int stm32_sai_sub_suspend(struct device *dev)
  1464. {
  1465. struct stm32_sai_sub_data *sai = dev_get_drvdata(dev);
  1466. int ret;
  1467. ret = clk_enable(sai->pdata->pclk);
  1468. if (ret < 0)
  1469. return ret;
  1470. regcache_cache_only(sai->regmap, true);
  1471. regcache_mark_dirty(sai->regmap);
  1472. clk_disable(sai->pdata->pclk);
  1473. return 0;
  1474. }
  1475. static int stm32_sai_sub_resume(struct device *dev)
  1476. {
  1477. struct stm32_sai_sub_data *sai = dev_get_drvdata(dev);
  1478. int ret;
  1479. ret = clk_enable(sai->pdata->pclk);
  1480. if (ret < 0)
  1481. return ret;
  1482. regcache_cache_only(sai->regmap, false);
  1483. ret = regcache_sync(sai->regmap);
  1484. clk_disable(sai->pdata->pclk);
  1485. return ret;
  1486. }
  1487. static const struct dev_pm_ops stm32_sai_sub_pm_ops = {
  1488. SYSTEM_SLEEP_PM_OPS(stm32_sai_sub_suspend, stm32_sai_sub_resume)
  1489. };
  1490. static struct platform_driver stm32_sai_sub_driver = {
  1491. .driver = {
  1492. .name = "st,stm32-sai-sub",
  1493. .of_match_table = stm32_sai_sub_ids,
  1494. .pm = pm_ptr(&stm32_sai_sub_pm_ops),
  1495. },
  1496. .probe = stm32_sai_sub_probe,
  1497. .remove = stm32_sai_sub_remove,
  1498. };
  1499. module_platform_driver(stm32_sai_sub_driver);
  1500. MODULE_DESCRIPTION("STM32 Soc SAI sub-block Interface");
  1501. MODULE_AUTHOR("Olivier Moysan <olivier.moysan@st.com>");
  1502. MODULE_ALIAS("platform:st,stm32-sai-sub");
  1503. MODULE_LICENSE("GPL v2");