stm32_sai_sub.c 42 KB

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