uniperif_player.c 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134
  1. /*
  2. * Copyright (C) STMicroelectronics SA 2015
  3. * Authors: Arnaud Pouliquen <arnaud.pouliquen@st.com>
  4. * for STMicroelectronics.
  5. * License terms: GNU General Public License (GPL), version 2
  6. */
  7. #include <linux/clk.h>
  8. #include <linux/mfd/syscon.h>
  9. #include <sound/asoundef.h>
  10. #include <sound/soc.h>
  11. #include "uniperif.h"
  12. /*
  13. * Some hardware-related definitions
  14. */
  15. /* sys config registers definitions */
  16. #define SYS_CFG_AUDIO_GLUE 0xA4
  17. /*
  18. * Driver specific types.
  19. */
  20. #define UNIPERIF_PLAYER_CLK_ADJ_MIN -999999
  21. #define UNIPERIF_PLAYER_CLK_ADJ_MAX 1000000
  22. #define UNIPERIF_PLAYER_I2S_OUT 1 /* player id connected to I2S/TDM TX bus */
  23. /*
  24. * Note: snd_pcm_hardware is linked to DMA controller but is declared here to
  25. * integrate DAI_CPU capability in term of rate and supported channels
  26. */
  27. static const struct snd_pcm_hardware uni_player_pcm_hw = {
  28. .info = SNDRV_PCM_INFO_INTERLEAVED | SNDRV_PCM_INFO_BLOCK_TRANSFER |
  29. SNDRV_PCM_INFO_PAUSE | SNDRV_PCM_INFO_MMAP |
  30. SNDRV_PCM_INFO_MMAP_VALID,
  31. .formats = SNDRV_PCM_FMTBIT_S32_LE | SNDRV_PCM_FMTBIT_S16_LE,
  32. .rates = SNDRV_PCM_RATE_CONTINUOUS,
  33. .rate_min = 8000,
  34. .rate_max = 192000,
  35. .channels_min = 2,
  36. .channels_max = 8,
  37. .periods_min = 2,
  38. .periods_max = 48,
  39. .period_bytes_min = 128,
  40. .period_bytes_max = 64 * PAGE_SIZE,
  41. .buffer_bytes_max = 256 * PAGE_SIZE
  42. };
  43. /*
  44. * uni_player_irq_handler
  45. * In case of error audio stream is stopped; stop action is protected via PCM
  46. * stream lock to avoid race condition with trigger callback.
  47. */
  48. static irqreturn_t uni_player_irq_handler(int irq, void *dev_id)
  49. {
  50. irqreturn_t ret = IRQ_NONE;
  51. struct uniperif *player = dev_id;
  52. unsigned int status;
  53. unsigned int tmp;
  54. if (player->state == UNIPERIF_STATE_STOPPED) {
  55. /* Unexpected IRQ: do nothing */
  56. return IRQ_NONE;
  57. }
  58. /* Get interrupt status & clear them immediately */
  59. status = GET_UNIPERIF_ITS(player);
  60. SET_UNIPERIF_ITS_BCLR(player, status);
  61. /* Check for fifo error (underrun) */
  62. if (unlikely(status & UNIPERIF_ITS_FIFO_ERROR_MASK(player))) {
  63. dev_err(player->dev, "FIFO underflow error detected\n");
  64. /* Interrupt is just for information when underflow recovery */
  65. if (player->underflow_enabled) {
  66. /* Update state to underflow */
  67. player->state = UNIPERIF_STATE_UNDERFLOW;
  68. } else {
  69. /* Disable interrupt so doesn't continually fire */
  70. SET_UNIPERIF_ITM_BCLR_FIFO_ERROR(player);
  71. /* Stop the player */
  72. snd_pcm_stream_lock(player->substream);
  73. snd_pcm_stop(player->substream, SNDRV_PCM_STATE_XRUN);
  74. snd_pcm_stream_unlock(player->substream);
  75. }
  76. ret = IRQ_HANDLED;
  77. }
  78. /* Check for dma error (overrun) */
  79. if (unlikely(status & UNIPERIF_ITS_DMA_ERROR_MASK(player))) {
  80. dev_err(player->dev, "DMA error detected\n");
  81. /* Disable interrupt so doesn't continually fire */
  82. SET_UNIPERIF_ITM_BCLR_DMA_ERROR(player);
  83. /* Stop the player */
  84. snd_pcm_stream_lock(player->substream);
  85. snd_pcm_stop(player->substream, SNDRV_PCM_STATE_XRUN);
  86. snd_pcm_stream_unlock(player->substream);
  87. ret = IRQ_HANDLED;
  88. }
  89. /* Check for underflow recovery done */
  90. if (unlikely(status & UNIPERIF_ITM_UNDERFLOW_REC_DONE_MASK(player))) {
  91. if (!player->underflow_enabled) {
  92. dev_err(player->dev,
  93. "unexpected Underflow recovering\n");
  94. return -EPERM;
  95. }
  96. /* Read the underflow recovery duration */
  97. tmp = GET_UNIPERIF_STATUS_1_UNDERFLOW_DURATION(player);
  98. dev_dbg(player->dev, "Underflow recovered (%d LR clocks max)\n",
  99. tmp);
  100. /* Clear the underflow recovery duration */
  101. SET_UNIPERIF_BIT_CONTROL_CLR_UNDERFLOW_DURATION(player);
  102. /* Update state to started */
  103. player->state = UNIPERIF_STATE_STARTED;
  104. ret = IRQ_HANDLED;
  105. }
  106. /* Check if underflow recovery failed */
  107. if (unlikely(status &
  108. UNIPERIF_ITM_UNDERFLOW_REC_FAILED_MASK(player))) {
  109. dev_err(player->dev, "Underflow recovery failed\n");
  110. /* Stop the player */
  111. snd_pcm_stream_lock(player->substream);
  112. snd_pcm_stop(player->substream, SNDRV_PCM_STATE_XRUN);
  113. snd_pcm_stream_unlock(player->substream);
  114. ret = IRQ_HANDLED;
  115. }
  116. return ret;
  117. }
  118. static int uni_player_clk_set_rate(struct uniperif *player, unsigned long rate)
  119. {
  120. int rate_adjusted, rate_achieved, delta, ret;
  121. int adjustment = player->clk_adj;
  122. /*
  123. * a
  124. * F = f + --------- * f = f + d
  125. * 1000000
  126. *
  127. * a
  128. * d = --------- * f
  129. * 1000000
  130. *
  131. * where:
  132. * f - nominal rate
  133. * a - adjustment in ppm (parts per milion)
  134. * F - rate to be set in synthesizer
  135. * d - delta (difference) between f and F
  136. */
  137. if (adjustment < 0) {
  138. /* div64_64 operates on unsigned values... */
  139. delta = -1;
  140. adjustment = -adjustment;
  141. } else {
  142. delta = 1;
  143. }
  144. /* 500000 ppm is 0.5, which is used to round up values */
  145. delta *= (int)div64_u64((uint64_t)rate *
  146. (uint64_t)adjustment + 500000, 1000000);
  147. rate_adjusted = rate + delta;
  148. /* Adjusted rate should never be == 0 */
  149. if (!rate_adjusted)
  150. return -EINVAL;
  151. ret = clk_set_rate(player->clk, rate_adjusted);
  152. if (ret < 0)
  153. return ret;
  154. rate_achieved = clk_get_rate(player->clk);
  155. if (!rate_achieved)
  156. /* If value is 0 means that clock or parent not valid */
  157. return -EINVAL;
  158. /*
  159. * Using ALSA's adjustment control, we can modify the rate to be up
  160. * to twice as much as requested, but no more
  161. */
  162. delta = rate_achieved - rate;
  163. if (delta < 0) {
  164. /* div64_64 operates on unsigned values... */
  165. delta = -delta;
  166. adjustment = -1;
  167. } else {
  168. adjustment = 1;
  169. }
  170. /* Frequency/2 is added to round up result */
  171. adjustment *= (int)div64_u64((uint64_t)delta * 1000000 + rate / 2,
  172. rate);
  173. player->clk_adj = adjustment;
  174. return 0;
  175. }
  176. static void uni_player_set_channel_status(struct uniperif *player,
  177. struct snd_pcm_runtime *runtime)
  178. {
  179. int n;
  180. unsigned int status;
  181. /*
  182. * Some AVRs and TVs require the channel status to contain a correct
  183. * sampling frequency. If no sample rate is already specified, then
  184. * set one.
  185. */
  186. mutex_lock(&player->ctrl_lock);
  187. if (runtime) {
  188. switch (runtime->rate) {
  189. case 22050:
  190. player->stream_settings.iec958.status[3] =
  191. IEC958_AES3_CON_FS_22050;
  192. break;
  193. case 44100:
  194. player->stream_settings.iec958.status[3] =
  195. IEC958_AES3_CON_FS_44100;
  196. break;
  197. case 88200:
  198. player->stream_settings.iec958.status[3] =
  199. IEC958_AES3_CON_FS_88200;
  200. break;
  201. case 176400:
  202. player->stream_settings.iec958.status[3] =
  203. IEC958_AES3_CON_FS_176400;
  204. break;
  205. case 24000:
  206. player->stream_settings.iec958.status[3] =
  207. IEC958_AES3_CON_FS_24000;
  208. break;
  209. case 48000:
  210. player->stream_settings.iec958.status[3] =
  211. IEC958_AES3_CON_FS_48000;
  212. break;
  213. case 96000:
  214. player->stream_settings.iec958.status[3] =
  215. IEC958_AES3_CON_FS_96000;
  216. break;
  217. case 192000:
  218. player->stream_settings.iec958.status[3] =
  219. IEC958_AES3_CON_FS_192000;
  220. break;
  221. case 32000:
  222. player->stream_settings.iec958.status[3] =
  223. IEC958_AES3_CON_FS_32000;
  224. break;
  225. default:
  226. /* Mark as sampling frequency not indicated */
  227. player->stream_settings.iec958.status[3] =
  228. IEC958_AES3_CON_FS_NOTID;
  229. break;
  230. }
  231. }
  232. /* Audio mode:
  233. * Use audio mode status to select PCM or encoded mode
  234. */
  235. if (player->stream_settings.iec958.status[0] & IEC958_AES0_NONAUDIO)
  236. player->stream_settings.encoding_mode =
  237. UNIPERIF_IEC958_ENCODING_MODE_ENCODED;
  238. else
  239. player->stream_settings.encoding_mode =
  240. UNIPERIF_IEC958_ENCODING_MODE_PCM;
  241. if (player->stream_settings.encoding_mode ==
  242. UNIPERIF_IEC958_ENCODING_MODE_PCM)
  243. /* Clear user validity bits */
  244. SET_UNIPERIF_USER_VALIDITY_VALIDITY_LR(player, 0);
  245. else
  246. /* Set user validity bits */
  247. SET_UNIPERIF_USER_VALIDITY_VALIDITY_LR(player, 1);
  248. /* Program the new channel status */
  249. for (n = 0; n < 6; ++n) {
  250. status =
  251. player->stream_settings.iec958.status[0 + (n * 4)] & 0xf;
  252. status |=
  253. player->stream_settings.iec958.status[1 + (n * 4)] << 8;
  254. status |=
  255. player->stream_settings.iec958.status[2 + (n * 4)] << 16;
  256. status |=
  257. player->stream_settings.iec958.status[3 + (n * 4)] << 24;
  258. SET_UNIPERIF_CHANNEL_STA_REGN(player, n, status);
  259. }
  260. mutex_unlock(&player->ctrl_lock);
  261. /* Update the channel status */
  262. if (player->ver < SND_ST_UNIPERIF_VERSION_UNI_PLR_TOP_1_0)
  263. SET_UNIPERIF_CONFIG_CHL_STS_UPDATE(player);
  264. else
  265. SET_UNIPERIF_BIT_CONTROL_CHL_STS_UPDATE(player);
  266. }
  267. static int uni_player_prepare_iec958(struct uniperif *player,
  268. struct snd_pcm_runtime *runtime)
  269. {
  270. int clk_div;
  271. clk_div = player->mclk / runtime->rate;
  272. /* Oversampling must be multiple of 128 as iec958 frame is 32-bits */
  273. if ((clk_div % 128) || (clk_div <= 0)) {
  274. dev_err(player->dev, "%s: invalid clk_div %d\n",
  275. __func__, clk_div);
  276. return -EINVAL;
  277. }
  278. switch (runtime->format) {
  279. case SNDRV_PCM_FORMAT_S16_LE:
  280. /* 16/16 memory format */
  281. SET_UNIPERIF_CONFIG_MEM_FMT_16_16(player);
  282. /* 16-bits per sub-frame */
  283. SET_UNIPERIF_I2S_FMT_NBIT_32(player);
  284. /* Set 16-bit sample precision */
  285. SET_UNIPERIF_I2S_FMT_DATA_SIZE_16(player);
  286. break;
  287. case SNDRV_PCM_FORMAT_S32_LE:
  288. /* 16/0 memory format */
  289. SET_UNIPERIF_CONFIG_MEM_FMT_16_0(player);
  290. /* 32-bits per sub-frame */
  291. SET_UNIPERIF_I2S_FMT_NBIT_32(player);
  292. /* Set 24-bit sample precision */
  293. SET_UNIPERIF_I2S_FMT_DATA_SIZE_24(player);
  294. break;
  295. default:
  296. dev_err(player->dev, "format not supported\n");
  297. return -EINVAL;
  298. }
  299. /* Set parity to be calculated by the hardware */
  300. SET_UNIPERIF_CONFIG_PARITY_CNTR_BY_HW(player);
  301. /* Set channel status bits to be inserted by the hardware */
  302. SET_UNIPERIF_CONFIG_CHANNEL_STA_CNTR_BY_HW(player);
  303. /* Set user data bits to be inserted by the hardware */
  304. SET_UNIPERIF_CONFIG_USER_DAT_CNTR_BY_HW(player);
  305. /* Set validity bits to be inserted by the hardware */
  306. SET_UNIPERIF_CONFIG_VALIDITY_DAT_CNTR_BY_HW(player);
  307. /* Set full software control to disabled */
  308. SET_UNIPERIF_CONFIG_SPDIF_SW_CTRL_DISABLE(player);
  309. SET_UNIPERIF_CTRL_ZERO_STUFF_HW(player);
  310. /* Update the channel status */
  311. uni_player_set_channel_status(player, runtime);
  312. /* Clear the user validity user bits */
  313. SET_UNIPERIF_USER_VALIDITY_VALIDITY_LR(player, 0);
  314. /* Disable one-bit audio mode */
  315. SET_UNIPERIF_CONFIG_ONE_BIT_AUD_DISABLE(player);
  316. /* Enable consecutive frames repetition of Z preamble (not for HBRA) */
  317. SET_UNIPERIF_CONFIG_REPEAT_CHL_STS_ENABLE(player);
  318. /* Change to SUF0_SUBF1 and left/right channels swap! */
  319. SET_UNIPERIF_CONFIG_SUBFRAME_SEL_SUBF1_SUBF0(player);
  320. /* Set data output as MSB first */
  321. SET_UNIPERIF_I2S_FMT_ORDER_MSB(player);
  322. if (player->stream_settings.encoding_mode ==
  323. UNIPERIF_IEC958_ENCODING_MODE_ENCODED)
  324. SET_UNIPERIF_CTRL_EXIT_STBY_ON_EOBLOCK_ON(player);
  325. else
  326. SET_UNIPERIF_CTRL_EXIT_STBY_ON_EOBLOCK_OFF(player);
  327. SET_UNIPERIF_I2S_FMT_NUM_CH(player, runtime->channels / 2);
  328. /* Set rounding to off */
  329. SET_UNIPERIF_CTRL_ROUNDING_OFF(player);
  330. /* Set clock divisor */
  331. SET_UNIPERIF_CTRL_DIVIDER(player, clk_div / 128);
  332. /* Set the spdif latency to not wait before starting player */
  333. SET_UNIPERIF_CTRL_SPDIF_LAT_OFF(player);
  334. /*
  335. * Ensure iec958 formatting is off. It will be enabled in function
  336. * uni_player_start() at the same time as the operation
  337. * mode is set to work around a silicon issue.
  338. */
  339. if (player->ver < SND_ST_UNIPERIF_VERSION_UNI_PLR_TOP_1_0)
  340. SET_UNIPERIF_CTRL_SPDIF_FMT_OFF(player);
  341. else
  342. SET_UNIPERIF_CTRL_SPDIF_FMT_ON(player);
  343. return 0;
  344. }
  345. static int uni_player_prepare_pcm(struct uniperif *player,
  346. struct snd_pcm_runtime *runtime)
  347. {
  348. int output_frame_size, slot_width, clk_div;
  349. /* Force slot width to 32 in I2S mode (HW constraint) */
  350. if ((player->daifmt & SND_SOC_DAIFMT_FORMAT_MASK) ==
  351. SND_SOC_DAIFMT_I2S)
  352. slot_width = 32;
  353. else
  354. slot_width = snd_pcm_format_width(runtime->format);
  355. output_frame_size = slot_width * runtime->channels;
  356. clk_div = player->mclk / runtime->rate;
  357. /*
  358. * For 32 bits subframe clk_div must be a multiple of 128,
  359. * for 16 bits must be a multiple of 64
  360. */
  361. if ((slot_width == 32) && (clk_div % 128)) {
  362. dev_err(player->dev, "%s: invalid clk_div\n", __func__);
  363. return -EINVAL;
  364. }
  365. if ((slot_width == 16) && (clk_div % 64)) {
  366. dev_err(player->dev, "%s: invalid clk_div\n", __func__);
  367. return -EINVAL;
  368. }
  369. /*
  370. * Number of bits per subframe (which is one channel sample)
  371. * on output - Transfer 16 or 32 bits from FIFO
  372. */
  373. switch (slot_width) {
  374. case 32:
  375. SET_UNIPERIF_I2S_FMT_NBIT_32(player);
  376. SET_UNIPERIF_I2S_FMT_DATA_SIZE_32(player);
  377. break;
  378. case 16:
  379. SET_UNIPERIF_I2S_FMT_NBIT_16(player);
  380. SET_UNIPERIF_I2S_FMT_DATA_SIZE_16(player);
  381. break;
  382. default:
  383. dev_err(player->dev, "subframe format not supported\n");
  384. return -EINVAL;
  385. }
  386. /* Configure data memory format */
  387. switch (runtime->format) {
  388. case SNDRV_PCM_FORMAT_S16_LE:
  389. /* One data word contains two samples */
  390. SET_UNIPERIF_CONFIG_MEM_FMT_16_16(player);
  391. break;
  392. case SNDRV_PCM_FORMAT_S32_LE:
  393. /*
  394. * Actually "16 bits/0 bits" means "32/28/24/20/18/16 bits
  395. * on the left than zeros (if less than 32 bytes)"... ;-)
  396. */
  397. SET_UNIPERIF_CONFIG_MEM_FMT_16_0(player);
  398. break;
  399. default:
  400. dev_err(player->dev, "format not supported\n");
  401. return -EINVAL;
  402. }
  403. /* Set rounding to off */
  404. SET_UNIPERIF_CTRL_ROUNDING_OFF(player);
  405. /* Set clock divisor */
  406. SET_UNIPERIF_CTRL_DIVIDER(player, clk_div / (2 * output_frame_size));
  407. /* Number of channelsmust be even*/
  408. if ((runtime->channels % 2) || (runtime->channels < 2) ||
  409. (runtime->channels > 10)) {
  410. dev_err(player->dev, "%s: invalid nb of channels\n", __func__);
  411. return -EINVAL;
  412. }
  413. SET_UNIPERIF_I2S_FMT_NUM_CH(player, runtime->channels / 2);
  414. /* Set 1-bit audio format to disabled */
  415. SET_UNIPERIF_CONFIG_ONE_BIT_AUD_DISABLE(player);
  416. SET_UNIPERIF_I2S_FMT_ORDER_MSB(player);
  417. /* No iec958 formatting as outputting to DAC */
  418. SET_UNIPERIF_CTRL_SPDIF_FMT_OFF(player);
  419. return 0;
  420. }
  421. static int uni_player_prepare_tdm(struct uniperif *player,
  422. struct snd_pcm_runtime *runtime)
  423. {
  424. int tdm_frame_size; /* unip tdm frame size in bytes */
  425. int user_frame_size; /* user tdm frame size in bytes */
  426. /* default unip TDM_WORD_POS_X_Y */
  427. unsigned int word_pos[4] = {
  428. 0x04060002, 0x0C0E080A, 0x14161012, 0x1C1E181A};
  429. int freq, ret;
  430. tdm_frame_size =
  431. sti_uniperiph_get_unip_tdm_frame_size(player);
  432. user_frame_size =
  433. sti_uniperiph_get_user_frame_size(runtime);
  434. /* fix 16/0 format */
  435. SET_UNIPERIF_CONFIG_MEM_FMT_16_0(player);
  436. SET_UNIPERIF_I2S_FMT_DATA_SIZE_32(player);
  437. /* number of words inserted on the TDM line */
  438. SET_UNIPERIF_I2S_FMT_NUM_CH(player, user_frame_size / 4 / 2);
  439. SET_UNIPERIF_I2S_FMT_ORDER_MSB(player);
  440. SET_UNIPERIF_I2S_FMT_ALIGN_LEFT(player);
  441. /* Enable the tdm functionality */
  442. SET_UNIPERIF_TDM_ENABLE_TDM_ENABLE(player);
  443. /* number of 8 bits timeslots avail in unip tdm frame */
  444. SET_UNIPERIF_TDM_FS_REF_DIV_NUM_TIMESLOT(player, tdm_frame_size);
  445. /* set the timeslot allocation for words in FIFO */
  446. sti_uniperiph_get_tdm_word_pos(player, word_pos);
  447. SET_UNIPERIF_TDM_WORD_POS(player, 1_2, word_pos[WORD_1_2]);
  448. SET_UNIPERIF_TDM_WORD_POS(player, 3_4, word_pos[WORD_3_4]);
  449. SET_UNIPERIF_TDM_WORD_POS(player, 5_6, word_pos[WORD_5_6]);
  450. SET_UNIPERIF_TDM_WORD_POS(player, 7_8, word_pos[WORD_7_8]);
  451. /* set unip clk rate (not done vai set_sysclk ops) */
  452. freq = runtime->rate * tdm_frame_size * 8;
  453. mutex_lock(&player->ctrl_lock);
  454. ret = uni_player_clk_set_rate(player, freq);
  455. if (!ret)
  456. player->mclk = freq;
  457. mutex_unlock(&player->ctrl_lock);
  458. return 0;
  459. }
  460. /*
  461. * ALSA uniperipheral iec958 controls
  462. */
  463. static int uni_player_ctl_iec958_info(struct snd_kcontrol *kcontrol,
  464. struct snd_ctl_elem_info *uinfo)
  465. {
  466. uinfo->type = SNDRV_CTL_ELEM_TYPE_IEC958;
  467. uinfo->count = 1;
  468. return 0;
  469. }
  470. static int uni_player_ctl_iec958_get(struct snd_kcontrol *kcontrol,
  471. struct snd_ctl_elem_value *ucontrol)
  472. {
  473. struct snd_soc_dai *dai = snd_kcontrol_chip(kcontrol);
  474. struct sti_uniperiph_data *priv = snd_soc_dai_get_drvdata(dai);
  475. struct uniperif *player = priv->dai_data.uni;
  476. struct snd_aes_iec958 *iec958 = &player->stream_settings.iec958;
  477. mutex_lock(&player->ctrl_lock);
  478. ucontrol->value.iec958.status[0] = iec958->status[0];
  479. ucontrol->value.iec958.status[1] = iec958->status[1];
  480. ucontrol->value.iec958.status[2] = iec958->status[2];
  481. ucontrol->value.iec958.status[3] = iec958->status[3];
  482. mutex_unlock(&player->ctrl_lock);
  483. return 0;
  484. }
  485. static int uni_player_ctl_iec958_put(struct snd_kcontrol *kcontrol,
  486. struct snd_ctl_elem_value *ucontrol)
  487. {
  488. struct snd_soc_dai *dai = snd_kcontrol_chip(kcontrol);
  489. struct sti_uniperiph_data *priv = snd_soc_dai_get_drvdata(dai);
  490. struct uniperif *player = priv->dai_data.uni;
  491. struct snd_aes_iec958 *iec958 = &player->stream_settings.iec958;
  492. mutex_lock(&player->ctrl_lock);
  493. iec958->status[0] = ucontrol->value.iec958.status[0];
  494. iec958->status[1] = ucontrol->value.iec958.status[1];
  495. iec958->status[2] = ucontrol->value.iec958.status[2];
  496. iec958->status[3] = ucontrol->value.iec958.status[3];
  497. mutex_unlock(&player->ctrl_lock);
  498. if (player->substream && player->substream->runtime)
  499. uni_player_set_channel_status(player,
  500. player->substream->runtime);
  501. else
  502. uni_player_set_channel_status(player, NULL);
  503. return 0;
  504. }
  505. static struct snd_kcontrol_new uni_player_iec958_ctl = {
  506. .iface = SNDRV_CTL_ELEM_IFACE_PCM,
  507. .name = SNDRV_CTL_NAME_IEC958("", PLAYBACK, DEFAULT),
  508. .info = uni_player_ctl_iec958_info,
  509. .get = uni_player_ctl_iec958_get,
  510. .put = uni_player_ctl_iec958_put,
  511. };
  512. /*
  513. * uniperif rate adjustement control
  514. */
  515. static int snd_sti_clk_adjustment_info(struct snd_kcontrol *kcontrol,
  516. struct snd_ctl_elem_info *uinfo)
  517. {
  518. uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
  519. uinfo->count = 1;
  520. uinfo->value.integer.min = UNIPERIF_PLAYER_CLK_ADJ_MIN;
  521. uinfo->value.integer.max = UNIPERIF_PLAYER_CLK_ADJ_MAX;
  522. uinfo->value.integer.step = 1;
  523. return 0;
  524. }
  525. static int snd_sti_clk_adjustment_get(struct snd_kcontrol *kcontrol,
  526. struct snd_ctl_elem_value *ucontrol)
  527. {
  528. struct snd_soc_dai *dai = snd_kcontrol_chip(kcontrol);
  529. struct sti_uniperiph_data *priv = snd_soc_dai_get_drvdata(dai);
  530. struct uniperif *player = priv->dai_data.uni;
  531. mutex_lock(&player->ctrl_lock);
  532. ucontrol->value.integer.value[0] = player->clk_adj;
  533. mutex_unlock(&player->ctrl_lock);
  534. return 0;
  535. }
  536. static int snd_sti_clk_adjustment_put(struct snd_kcontrol *kcontrol,
  537. struct snd_ctl_elem_value *ucontrol)
  538. {
  539. struct snd_soc_dai *dai = snd_kcontrol_chip(kcontrol);
  540. struct sti_uniperiph_data *priv = snd_soc_dai_get_drvdata(dai);
  541. struct uniperif *player = priv->dai_data.uni;
  542. int ret = 0;
  543. if ((ucontrol->value.integer.value[0] < UNIPERIF_PLAYER_CLK_ADJ_MIN) ||
  544. (ucontrol->value.integer.value[0] > UNIPERIF_PLAYER_CLK_ADJ_MAX))
  545. return -EINVAL;
  546. mutex_lock(&player->ctrl_lock);
  547. player->clk_adj = ucontrol->value.integer.value[0];
  548. if (player->mclk)
  549. ret = uni_player_clk_set_rate(player, player->mclk);
  550. mutex_unlock(&player->ctrl_lock);
  551. return ret;
  552. }
  553. static struct snd_kcontrol_new uni_player_clk_adj_ctl = {
  554. .iface = SNDRV_CTL_ELEM_IFACE_PCM,
  555. .name = "PCM Playback Oversampling Freq. Adjustment",
  556. .info = snd_sti_clk_adjustment_info,
  557. .get = snd_sti_clk_adjustment_get,
  558. .put = snd_sti_clk_adjustment_put,
  559. };
  560. static struct snd_kcontrol_new *snd_sti_pcm_ctl[] = {
  561. &uni_player_clk_adj_ctl,
  562. };
  563. static struct snd_kcontrol_new *snd_sti_iec_ctl[] = {
  564. &uni_player_iec958_ctl,
  565. &uni_player_clk_adj_ctl,
  566. };
  567. static int uni_player_startup(struct snd_pcm_substream *substream,
  568. struct snd_soc_dai *dai)
  569. {
  570. struct sti_uniperiph_data *priv = snd_soc_dai_get_drvdata(dai);
  571. struct uniperif *player = priv->dai_data.uni;
  572. int ret;
  573. player->substream = substream;
  574. player->clk_adj = 0;
  575. if (!UNIPERIF_TYPE_IS_TDM(player))
  576. return 0;
  577. /* refine hw constraint in tdm mode */
  578. ret = snd_pcm_hw_rule_add(substream->runtime, 0,
  579. SNDRV_PCM_HW_PARAM_CHANNELS,
  580. sti_uniperiph_fix_tdm_chan,
  581. player, SNDRV_PCM_HW_PARAM_CHANNELS,
  582. -1);
  583. if (ret < 0)
  584. return ret;
  585. return snd_pcm_hw_rule_add(substream->runtime, 0,
  586. SNDRV_PCM_HW_PARAM_FORMAT,
  587. sti_uniperiph_fix_tdm_format,
  588. player, SNDRV_PCM_HW_PARAM_FORMAT,
  589. -1);
  590. }
  591. static int uni_player_set_sysclk(struct snd_soc_dai *dai, int clk_id,
  592. unsigned int freq, int dir)
  593. {
  594. struct sti_uniperiph_data *priv = snd_soc_dai_get_drvdata(dai);
  595. struct uniperif *player = priv->dai_data.uni;
  596. int ret;
  597. if (UNIPERIF_TYPE_IS_TDM(player) || (dir == SND_SOC_CLOCK_IN))
  598. return 0;
  599. if (clk_id != 0)
  600. return -EINVAL;
  601. mutex_lock(&player->ctrl_lock);
  602. ret = uni_player_clk_set_rate(player, freq);
  603. if (!ret)
  604. player->mclk = freq;
  605. mutex_unlock(&player->ctrl_lock);
  606. return ret;
  607. }
  608. static int uni_player_prepare(struct snd_pcm_substream *substream,
  609. struct snd_soc_dai *dai)
  610. {
  611. struct sti_uniperiph_data *priv = snd_soc_dai_get_drvdata(dai);
  612. struct uniperif *player = priv->dai_data.uni;
  613. struct snd_pcm_runtime *runtime = substream->runtime;
  614. int transfer_size, trigger_limit;
  615. int ret;
  616. /* The player should be stopped */
  617. if (player->state != UNIPERIF_STATE_STOPPED) {
  618. dev_err(player->dev, "%s: invalid player state %d\n", __func__,
  619. player->state);
  620. return -EINVAL;
  621. }
  622. /* Calculate transfer size (in fifo cells and bytes) for frame count */
  623. if (player->type == SND_ST_UNIPERIF_TYPE_TDM) {
  624. /* transfer size = user frame size (in 32 bits FIFO cell) */
  625. transfer_size =
  626. sti_uniperiph_get_user_frame_size(runtime) / 4;
  627. } else {
  628. transfer_size = runtime->channels * UNIPERIF_FIFO_FRAMES;
  629. }
  630. /* Calculate number of empty cells available before asserting DREQ */
  631. if (player->ver < SND_ST_UNIPERIF_VERSION_UNI_PLR_TOP_1_0) {
  632. trigger_limit = UNIPERIF_FIFO_SIZE - transfer_size;
  633. } else {
  634. /*
  635. * Since SND_ST_UNIPERIF_VERSION_UNI_PLR_TOP_1_0
  636. * FDMA_TRIGGER_LIMIT also controls when the state switches
  637. * from OFF or STANDBY to AUDIO DATA.
  638. */
  639. trigger_limit = transfer_size;
  640. }
  641. /* Trigger limit must be an even number */
  642. if ((!trigger_limit % 2) || (trigger_limit != 1 && transfer_size % 2) ||
  643. (trigger_limit > UNIPERIF_CONFIG_DMA_TRIG_LIMIT_MASK(player))) {
  644. dev_err(player->dev, "invalid trigger limit %d\n",
  645. trigger_limit);
  646. return -EINVAL;
  647. }
  648. SET_UNIPERIF_CONFIG_DMA_TRIG_LIMIT(player, trigger_limit);
  649. /* Uniperipheral setup depends on player type */
  650. switch (player->type) {
  651. case SND_ST_UNIPERIF_TYPE_HDMI:
  652. ret = uni_player_prepare_iec958(player, runtime);
  653. break;
  654. case SND_ST_UNIPERIF_TYPE_PCM:
  655. ret = uni_player_prepare_pcm(player, runtime);
  656. break;
  657. case SND_ST_UNIPERIF_TYPE_SPDIF:
  658. ret = uni_player_prepare_iec958(player, runtime);
  659. break;
  660. case SND_ST_UNIPERIF_TYPE_TDM:
  661. ret = uni_player_prepare_tdm(player, runtime);
  662. break;
  663. default:
  664. dev_err(player->dev, "invalid player type\n");
  665. return -EINVAL;
  666. }
  667. if (ret)
  668. return ret;
  669. switch (player->daifmt & SND_SOC_DAIFMT_INV_MASK) {
  670. case SND_SOC_DAIFMT_NB_NF:
  671. SET_UNIPERIF_I2S_FMT_LR_POL_LOW(player);
  672. SET_UNIPERIF_I2S_FMT_SCLK_EDGE_RISING(player);
  673. break;
  674. case SND_SOC_DAIFMT_NB_IF:
  675. SET_UNIPERIF_I2S_FMT_LR_POL_HIG(player);
  676. SET_UNIPERIF_I2S_FMT_SCLK_EDGE_RISING(player);
  677. break;
  678. case SND_SOC_DAIFMT_IB_NF:
  679. SET_UNIPERIF_I2S_FMT_LR_POL_LOW(player);
  680. SET_UNIPERIF_I2S_FMT_SCLK_EDGE_FALLING(player);
  681. break;
  682. case SND_SOC_DAIFMT_IB_IF:
  683. SET_UNIPERIF_I2S_FMT_LR_POL_HIG(player);
  684. SET_UNIPERIF_I2S_FMT_SCLK_EDGE_FALLING(player);
  685. break;
  686. }
  687. switch (player->daifmt & SND_SOC_DAIFMT_FORMAT_MASK) {
  688. case SND_SOC_DAIFMT_I2S:
  689. SET_UNIPERIF_I2S_FMT_ALIGN_LEFT(player);
  690. SET_UNIPERIF_I2S_FMT_PADDING_I2S_MODE(player);
  691. break;
  692. case SND_SOC_DAIFMT_LEFT_J:
  693. SET_UNIPERIF_I2S_FMT_ALIGN_LEFT(player);
  694. SET_UNIPERIF_I2S_FMT_PADDING_SONY_MODE(player);
  695. break;
  696. case SND_SOC_DAIFMT_RIGHT_J:
  697. SET_UNIPERIF_I2S_FMT_ALIGN_RIGHT(player);
  698. SET_UNIPERIF_I2S_FMT_PADDING_SONY_MODE(player);
  699. break;
  700. default:
  701. dev_err(player->dev, "format not supported\n");
  702. return -EINVAL;
  703. }
  704. SET_UNIPERIF_I2S_FMT_NO_OF_SAMPLES_TO_READ(player, 0);
  705. return sti_uniperiph_reset(player);
  706. }
  707. static int uni_player_start(struct uniperif *player)
  708. {
  709. int ret;
  710. /* The player should be stopped */
  711. if (player->state != UNIPERIF_STATE_STOPPED) {
  712. dev_err(player->dev, "%s: invalid player state\n", __func__);
  713. return -EINVAL;
  714. }
  715. ret = clk_prepare_enable(player->clk);
  716. if (ret) {
  717. dev_err(player->dev, "%s: Failed to enable clock\n", __func__);
  718. return ret;
  719. }
  720. /* Clear any pending interrupts */
  721. SET_UNIPERIF_ITS_BCLR(player, GET_UNIPERIF_ITS(player));
  722. /* Set the interrupt mask */
  723. SET_UNIPERIF_ITM_BSET_DMA_ERROR(player);
  724. SET_UNIPERIF_ITM_BSET_FIFO_ERROR(player);
  725. /* Enable underflow recovery interrupts */
  726. if (player->underflow_enabled) {
  727. SET_UNIPERIF_ITM_BSET_UNDERFLOW_REC_DONE(player);
  728. SET_UNIPERIF_ITM_BSET_UNDERFLOW_REC_FAILED(player);
  729. }
  730. ret = sti_uniperiph_reset(player);
  731. if (ret < 0) {
  732. clk_disable_unprepare(player->clk);
  733. return ret;
  734. }
  735. /*
  736. * Does not use IEC61937 features of the uniperipheral hardware.
  737. * Instead it performs IEC61937 in software and inserts it directly
  738. * into the audio data stream. As such, when encoded mode is selected,
  739. * linear pcm mode is still used, but with the differences of the
  740. * channel status bits set for encoded mode and the validity bits set.
  741. */
  742. SET_UNIPERIF_CTRL_OPERATION_PCM_DATA(player);
  743. /*
  744. * If iec958 formatting is required for hdmi or spdif, then it must be
  745. * enabled after the operation mode is set. If set prior to this, it
  746. * will not take affect and hang the player.
  747. */
  748. if (player->ver < SND_ST_UNIPERIF_VERSION_UNI_PLR_TOP_1_0)
  749. if (UNIPERIF_TYPE_IS_IEC958(player))
  750. SET_UNIPERIF_CTRL_SPDIF_FMT_ON(player);
  751. /* Force channel status update (no update if clk disable) */
  752. if (player->ver < SND_ST_UNIPERIF_VERSION_UNI_PLR_TOP_1_0)
  753. SET_UNIPERIF_CONFIG_CHL_STS_UPDATE(player);
  754. else
  755. SET_UNIPERIF_BIT_CONTROL_CHL_STS_UPDATE(player);
  756. /* Update state to started */
  757. player->state = UNIPERIF_STATE_STARTED;
  758. return 0;
  759. }
  760. static int uni_player_stop(struct uniperif *player)
  761. {
  762. int ret;
  763. /* The player should not be in stopped state */
  764. if (player->state == UNIPERIF_STATE_STOPPED) {
  765. dev_err(player->dev, "%s: invalid player state\n", __func__);
  766. return -EINVAL;
  767. }
  768. /* Turn the player off */
  769. SET_UNIPERIF_CTRL_OPERATION_OFF(player);
  770. ret = sti_uniperiph_reset(player);
  771. if (ret < 0)
  772. return ret;
  773. /* Disable interrupts */
  774. SET_UNIPERIF_ITM_BCLR(player, GET_UNIPERIF_ITM(player));
  775. /* Disable clock */
  776. clk_disable_unprepare(player->clk);
  777. /* Update state to stopped and return */
  778. player->state = UNIPERIF_STATE_STOPPED;
  779. return 0;
  780. }
  781. int uni_player_resume(struct uniperif *player)
  782. {
  783. int ret;
  784. /* Select the frequency synthesizer clock */
  785. if (player->clk_sel) {
  786. ret = regmap_field_write(player->clk_sel, 1);
  787. if (ret) {
  788. dev_err(player->dev,
  789. "%s: Failed to select freq synth clock\n",
  790. __func__);
  791. return ret;
  792. }
  793. }
  794. SET_UNIPERIF_CONFIG_BACK_STALL_REQ_DISABLE(player);
  795. SET_UNIPERIF_CTRL_ROUNDING_OFF(player);
  796. SET_UNIPERIF_CTRL_SPDIF_LAT_OFF(player);
  797. SET_UNIPERIF_CONFIG_IDLE_MOD_DISABLE(player);
  798. return 0;
  799. }
  800. EXPORT_SYMBOL_GPL(uni_player_resume);
  801. static int uni_player_trigger(struct snd_pcm_substream *substream,
  802. int cmd, struct snd_soc_dai *dai)
  803. {
  804. struct sti_uniperiph_data *priv = snd_soc_dai_get_drvdata(dai);
  805. struct uniperif *player = priv->dai_data.uni;
  806. switch (cmd) {
  807. case SNDRV_PCM_TRIGGER_START:
  808. return uni_player_start(player);
  809. case SNDRV_PCM_TRIGGER_STOP:
  810. return uni_player_stop(player);
  811. case SNDRV_PCM_TRIGGER_RESUME:
  812. return uni_player_resume(player);
  813. default:
  814. return -EINVAL;
  815. }
  816. }
  817. static void uni_player_shutdown(struct snd_pcm_substream *substream,
  818. struct snd_soc_dai *dai)
  819. {
  820. struct sti_uniperiph_data *priv = snd_soc_dai_get_drvdata(dai);
  821. struct uniperif *player = priv->dai_data.uni;
  822. if (player->state != UNIPERIF_STATE_STOPPED)
  823. /* Stop the player */
  824. uni_player_stop(player);
  825. player->substream = NULL;
  826. }
  827. static int uni_player_parse_dt_audio_glue(struct platform_device *pdev,
  828. struct uniperif *player)
  829. {
  830. struct device_node *node = pdev->dev.of_node;
  831. struct regmap *regmap;
  832. struct reg_field regfield[2] = {
  833. /* PCM_CLK_SEL */
  834. REG_FIELD(SYS_CFG_AUDIO_GLUE,
  835. 8 + player->id,
  836. 8 + player->id),
  837. /* PCMP_VALID_SEL */
  838. REG_FIELD(SYS_CFG_AUDIO_GLUE, 0, 1)
  839. };
  840. regmap = syscon_regmap_lookup_by_phandle(node, "st,syscfg");
  841. if (IS_ERR(regmap)) {
  842. dev_err(&pdev->dev, "sti-audio-clk-glue syscf not found\n");
  843. return PTR_ERR(regmap);
  844. }
  845. player->clk_sel = regmap_field_alloc(regmap, regfield[0]);
  846. player->valid_sel = regmap_field_alloc(regmap, regfield[1]);
  847. return 0;
  848. }
  849. static const struct snd_soc_dai_ops uni_player_dai_ops = {
  850. .startup = uni_player_startup,
  851. .shutdown = uni_player_shutdown,
  852. .prepare = uni_player_prepare,
  853. .trigger = uni_player_trigger,
  854. .hw_params = sti_uniperiph_dai_hw_params,
  855. .set_fmt = sti_uniperiph_dai_set_fmt,
  856. .set_sysclk = uni_player_set_sysclk,
  857. .set_tdm_slot = sti_uniperiph_set_tdm_slot
  858. };
  859. int uni_player_init(struct platform_device *pdev,
  860. struct uniperif *player)
  861. {
  862. int ret = 0;
  863. player->dev = &pdev->dev;
  864. player->state = UNIPERIF_STATE_STOPPED;
  865. player->dai_ops = &uni_player_dai_ops;
  866. /* Get PCM_CLK_SEL & PCMP_VALID_SEL from audio-glue-ctrl SoC reg */
  867. ret = uni_player_parse_dt_audio_glue(pdev, player);
  868. if (ret < 0) {
  869. dev_err(player->dev, "Failed to parse DeviceTree\n");
  870. return ret;
  871. }
  872. /* Underflow recovery is only supported on later ip revisions */
  873. if (player->ver >= SND_ST_UNIPERIF_VERSION_UNI_PLR_TOP_1_0)
  874. player->underflow_enabled = 1;
  875. if (UNIPERIF_TYPE_IS_TDM(player))
  876. player->hw = &uni_tdm_hw;
  877. else
  878. player->hw = &uni_player_pcm_hw;
  879. /* Get uniperif resource */
  880. player->clk = of_clk_get(pdev->dev.of_node, 0);
  881. if (IS_ERR(player->clk)) {
  882. dev_err(player->dev, "Failed to get clock\n");
  883. ret = PTR_ERR(player->clk);
  884. }
  885. /* Select the frequency synthesizer clock */
  886. if (player->clk_sel) {
  887. ret = regmap_field_write(player->clk_sel, 1);
  888. if (ret) {
  889. dev_err(player->dev,
  890. "%s: Failed to select freq synth clock\n",
  891. __func__);
  892. return ret;
  893. }
  894. }
  895. /* connect to I2S/TDM TX bus */
  896. if (player->valid_sel &&
  897. (player->id == UNIPERIF_PLAYER_I2S_OUT)) {
  898. ret = regmap_field_write(player->valid_sel, player->id);
  899. if (ret) {
  900. dev_err(player->dev,
  901. "%s: unable to connect to tdm bus\n", __func__);
  902. return ret;
  903. }
  904. }
  905. ret = devm_request_irq(&pdev->dev, player->irq,
  906. uni_player_irq_handler, IRQF_SHARED,
  907. dev_name(&pdev->dev), player);
  908. if (ret < 0) {
  909. dev_err(player->dev, "unable to request IRQ %d\n", player->irq);
  910. return ret;
  911. }
  912. mutex_init(&player->ctrl_lock);
  913. /* Ensure that disabled by default */
  914. SET_UNIPERIF_CONFIG_BACK_STALL_REQ_DISABLE(player);
  915. SET_UNIPERIF_CTRL_ROUNDING_OFF(player);
  916. SET_UNIPERIF_CTRL_SPDIF_LAT_OFF(player);
  917. SET_UNIPERIF_CONFIG_IDLE_MOD_DISABLE(player);
  918. if (UNIPERIF_TYPE_IS_IEC958(player)) {
  919. /* Set default iec958 status bits */
  920. /* Consumer, PCM, copyright, 2ch, mode 0 */
  921. player->stream_settings.iec958.status[0] = 0x00;
  922. /* Broadcast reception category */
  923. player->stream_settings.iec958.status[1] =
  924. IEC958_AES1_CON_GENERAL;
  925. /* Do not take into account source or channel number */
  926. player->stream_settings.iec958.status[2] =
  927. IEC958_AES2_CON_SOURCE_UNSPEC;
  928. /* Sampling frequency not indicated */
  929. player->stream_settings.iec958.status[3] =
  930. IEC958_AES3_CON_FS_NOTID;
  931. /* Max sample word 24-bit, sample word length not indicated */
  932. player->stream_settings.iec958.status[4] =
  933. IEC958_AES4_CON_MAX_WORDLEN_24 |
  934. IEC958_AES4_CON_WORDLEN_24_20;
  935. player->num_ctrls = ARRAY_SIZE(snd_sti_iec_ctl);
  936. player->snd_ctrls = snd_sti_iec_ctl[0];
  937. } else {
  938. player->num_ctrls = ARRAY_SIZE(snd_sti_pcm_ctl);
  939. player->snd_ctrls = snd_sti_pcm_ctl[0];
  940. }
  941. return 0;
  942. }
  943. EXPORT_SYMBOL_GPL(uni_player_init);