uniperif_player.c 31 KB

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