at91rm9200-i2s.c 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715
  1. /*
  2. * at91rm9200-i2s.c -- ALSA Soc Audio Layer Platform driver and DMA engine
  3. *
  4. * Author: Frank Mandarino <fmandarino@endrelia.com>
  5. * Endrelia Technologies Inc.
  6. *
  7. * Based on pxa2xx Platform drivers by
  8. * Liam Girdwood <liam.girdwood@wolfsonmicro.com>
  9. *
  10. * This program is free software; you can redistribute it and/or modify it
  11. * under the terms of the GNU General Public License as published by the
  12. * Free Software Foundation; either version 2 of the License, or (at your
  13. * option) any later version.
  14. *
  15. * Revision history
  16. * 3rd Mar 2006 Initial version.
  17. */
  18. #include <linux/init.h>
  19. #include <linux/module.h>
  20. #include <linux/interrupt.h>
  21. #include <linux/device.h>
  22. #include <linux/delay.h>
  23. #include <linux/clk.h>
  24. #include <sound/driver.h>
  25. #include <sound/core.h>
  26. #include <sound/pcm.h>
  27. #include <sound/initval.h>
  28. #include <sound/soc.h>
  29. #include <asm/arch/at91rm9200.h>
  30. #include <asm/arch/at91rm9200_ssc.h>
  31. #include <asm/arch/at91rm9200_pdc.h>
  32. #include <asm/arch/hardware.h>
  33. #include "at91rm9200-pcm.h"
  34. #if 0
  35. #define DBG(x...) printk(KERN_DEBUG "at91rm9200-i2s:" x)
  36. #else
  37. #define DBG(x...)
  38. #endif
  39. #define AT91RM9200_I2S_DAIFMT \
  40. (SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_CBS_CFS | SND_SOC_DAIFMT_NB_NF)
  41. #define AT91RM9200_I2S_DIR \
  42. (SND_SOC_DAIDIR_PLAYBACK | SND_SOC_DAIDIR_CAPTURE)
  43. /* priv is (SSC_CMR.DIV << 16 | SSC_TCMR.PERIOD ) */
  44. static struct snd_soc_dai_mode at91rm9200_i2s[] = {
  45. /* 8k: BCLK = (MCLK/10) = (60MHz/50) = 1.2MHz */
  46. {
  47. .fmt = AT91RM9200_I2S_DAIFMT,
  48. .pcmfmt = SNDRV_PCM_FMTBIT_S16_LE,
  49. .pcmrate = SNDRV_PCM_RATE_8000,
  50. .pcmdir = AT91RM9200_I2S_DIR,
  51. .flags = SND_SOC_DAI_BFS_DIV,
  52. .fs = 1500,
  53. .bfs = SND_SOC_FSBD(10),
  54. .priv = (25 << 16 | 74),
  55. },
  56. /* 16k: BCLK = (MCLK/3) ~= (60MHz/14) = 4.285714MHz */
  57. {
  58. .fmt = AT91RM9200_I2S_DAIFMT,
  59. .pcmfmt = SNDRV_PCM_FMTBIT_S16_LE,
  60. .pcmrate = SNDRV_PCM_RATE_16000,
  61. .pcmdir = AT91RM9200_I2S_DIR,
  62. .flags = SND_SOC_DAI_BFS_DIV,
  63. .fs = 750,
  64. .bfs = SND_SOC_FSBD(3),
  65. .priv = (7 << 16 | 133),
  66. },
  67. /* 32k: BCLK = (MCLK/3) ~= (60MHz/14) = 4.285714MHz */
  68. {
  69. .fmt = AT91RM9200_I2S_DAIFMT,
  70. .pcmfmt = SNDRV_PCM_FMTBIT_S16_LE,
  71. .pcmrate = SNDRV_PCM_RATE_32000,
  72. .pcmdir = AT91RM9200_I2S_DIR,
  73. .flags = SND_SOC_DAI_BFS_DIV,
  74. .fs = 375,
  75. .bfs = SND_SOC_FSBD(3),
  76. .priv = (7 << 16 | 66),
  77. },
  78. /* 48k: BCLK = (MCLK/5) ~= (60MHz/26) = 2.3076923MHz */
  79. {
  80. .fmt = AT91RM9200_I2S_DAIFMT,
  81. .pcmfmt = SNDRV_PCM_FMTBIT_S16_LE,
  82. .pcmrate = SNDRV_PCM_RATE_48000,
  83. .pcmdir = AT91RM9200_I2S_DIR,
  84. .flags = SND_SOC_DAI_BFS_DIV,
  85. .fs = 250,
  86. .bfs SND_SOC_FSBD(5),
  87. .priv = (13 << 16 | 23),
  88. },
  89. };
  90. /*
  91. * SSC registers required by the PCM DMA engine.
  92. */
  93. static struct at91rm9200_ssc_regs ssc_reg[3] = {
  94. {
  95. .cr = (void __iomem *) (AT91_VA_BASE_SSC0 + AT91_SSC_CR),
  96. .ier = (void __iomem *) (AT91_VA_BASE_SSC0 + AT91_SSC_IER),
  97. .idr = (void __iomem *) (AT91_VA_BASE_SSC0 + AT91_SSC_IDR),
  98. },
  99. {
  100. .cr = (void __iomem *) (AT91_VA_BASE_SSC1 + AT91_SSC_CR),
  101. .ier = (void __iomem *) (AT91_VA_BASE_SSC1 + AT91_SSC_IER),
  102. .idr = (void __iomem *) (AT91_VA_BASE_SSC1 + AT91_SSC_IDR),
  103. },
  104. {
  105. .cr = (void __iomem *) (AT91_VA_BASE_SSC2 + AT91_SSC_CR),
  106. .ier = (void __iomem *) (AT91_VA_BASE_SSC2 + AT91_SSC_IER),
  107. .idr = (void __iomem *) (AT91_VA_BASE_SSC2 + AT91_SSC_IDR),
  108. },
  109. };
  110. static struct at91rm9200_pdc_regs pdc_tx_reg[3] = {
  111. {
  112. .xpr = (void __iomem *) (AT91_VA_BASE_SSC0 + AT91_PDC_TPR),
  113. .xcr = (void __iomem *) (AT91_VA_BASE_SSC0 + AT91_PDC_TCR),
  114. .xnpr = (void __iomem *) (AT91_VA_BASE_SSC0 + AT91_PDC_TNPR),
  115. .xncr = (void __iomem *) (AT91_VA_BASE_SSC0 + AT91_PDC_TNCR),
  116. .ptcr = (void __iomem *) (AT91_VA_BASE_SSC0 + AT91_PDC_PTCR),
  117. },
  118. {
  119. .xpr = (void __iomem *) (AT91_VA_BASE_SSC1 + AT91_PDC_TPR),
  120. .xcr = (void __iomem *) (AT91_VA_BASE_SSC1 + AT91_PDC_TCR),
  121. .xnpr = (void __iomem *) (AT91_VA_BASE_SSC1 + AT91_PDC_TNPR),
  122. .xncr = (void __iomem *) (AT91_VA_BASE_SSC1 + AT91_PDC_TNCR),
  123. .ptcr = (void __iomem *) (AT91_VA_BASE_SSC1 + AT91_PDC_PTCR),
  124. },
  125. {
  126. .xpr = (void __iomem *) (AT91_VA_BASE_SSC2 + AT91_PDC_TPR),
  127. .xcr = (void __iomem *) (AT91_VA_BASE_SSC2 + AT91_PDC_TCR),
  128. .xnpr = (void __iomem *) (AT91_VA_BASE_SSC2 + AT91_PDC_TNPR),
  129. .xncr = (void __iomem *) (AT91_VA_BASE_SSC2 + AT91_PDC_TNCR),
  130. .ptcr = (void __iomem *) (AT91_VA_BASE_SSC2 + AT91_PDC_PTCR),
  131. },
  132. };
  133. static struct at91rm9200_pdc_regs pdc_rx_reg[3] = {
  134. {
  135. .xpr = (void __iomem *) (AT91_VA_BASE_SSC0 + AT91_PDC_RPR),
  136. .xcr = (void __iomem *) (AT91_VA_BASE_SSC0 + AT91_PDC_RCR),
  137. .xnpr = (void __iomem *) (AT91_VA_BASE_SSC0 + AT91_PDC_RNPR),
  138. .xncr = (void __iomem *) (AT91_VA_BASE_SSC0 + AT91_PDC_RNCR),
  139. .ptcr = (void __iomem *) (AT91_VA_BASE_SSC0 + AT91_PDC_PTCR),
  140. },
  141. {
  142. .xpr = (void __iomem *) (AT91_VA_BASE_SSC1 + AT91_PDC_RPR),
  143. .xcr = (void __iomem *) (AT91_VA_BASE_SSC1 + AT91_PDC_RCR),
  144. .xnpr = (void __iomem *) (AT91_VA_BASE_SSC1 + AT91_PDC_RNPR),
  145. .xncr = (void __iomem *) (AT91_VA_BASE_SSC1 + AT91_PDC_RNCR),
  146. .ptcr = (void __iomem *) (AT91_VA_BASE_SSC1 + AT91_PDC_PTCR),
  147. },
  148. {
  149. .xpr = (void __iomem *) (AT91_VA_BASE_SSC2 + AT91_PDC_RPR),
  150. .xcr = (void __iomem *) (AT91_VA_BASE_SSC2 + AT91_PDC_RCR),
  151. .xnpr = (void __iomem *) (AT91_VA_BASE_SSC2 + AT91_PDC_RNPR),
  152. .xncr = (void __iomem *) (AT91_VA_BASE_SSC2 + AT91_PDC_RNCR),
  153. .ptcr = (void __iomem *) (AT91_VA_BASE_SSC2 + AT91_PDC_PTCR),
  154. },
  155. };
  156. /*
  157. * SSC & PDC status bits for transmit and receive.
  158. */
  159. static struct at91rm9200_ssc_mask ssc_tx_mask = {
  160. .ssc_enable = AT91_SSC_TXEN,
  161. .ssc_disable = AT91_SSC_TXDIS,
  162. .ssc_endx = AT91_SSC_ENDTX,
  163. .ssc_endbuf = AT91_SSC_TXBUFE,
  164. .pdc_enable = AT91_PDC_TXTEN,
  165. .pdc_disable = AT91_PDC_TXTDIS,
  166. };
  167. static struct at91rm9200_ssc_mask ssc_rx_mask = {
  168. .ssc_enable = AT91_SSC_RXEN,
  169. .ssc_disable = AT91_SSC_RXDIS,
  170. .ssc_endx = AT91_SSC_ENDRX,
  171. .ssc_endbuf = AT91_SSC_RXBUFF,
  172. .pdc_enable = AT91_PDC_RXTEN,
  173. .pdc_disable = AT91_PDC_RXTDIS,
  174. };
  175. /*
  176. * A MUTEX is used to protect an SSC initialzed flag which allows
  177. * the substream hw_params() call to initialize the SSC only if
  178. * there are no other substreams open. If there are other
  179. * substreams open, the hw_param() call can only check that
  180. * it is using the same format and rate.
  181. */
  182. static DECLARE_MUTEX(ssc0_mutex);
  183. static DECLARE_MUTEX(ssc1_mutex);
  184. static DECLARE_MUTEX(ssc2_mutex);
  185. /*
  186. * DMA parameters.
  187. */
  188. static at91rm9200_pcm_dma_params_t ssc_dma_params[3][2] = {
  189. {{
  190. .name = "SSC0/I2S PCM Stereo out",
  191. .ssc = &ssc_reg[0],
  192. .pdc = &pdc_tx_reg[0],
  193. .mask = &ssc_tx_mask,
  194. },
  195. {
  196. .name = "SSC0/I2S PCM Stereo in",
  197. .ssc = &ssc_reg[0],
  198. .pdc = &pdc_rx_reg[0],
  199. .mask = &ssc_rx_mask,
  200. }},
  201. {{
  202. .name = "SSC1/I2S PCM Stereo out",
  203. .ssc = &ssc_reg[1],
  204. .pdc = &pdc_tx_reg[1],
  205. .mask = &ssc_tx_mask,
  206. },
  207. {
  208. .name = "SSC1/I2S PCM Stereo in",
  209. .ssc = &ssc_reg[1],
  210. .pdc = &pdc_rx_reg[1],
  211. .mask = &ssc_rx_mask,
  212. }},
  213. {{
  214. .name = "SSC2/I2S PCM Stereo out",
  215. .ssc = &ssc_reg[2],
  216. .pdc = &pdc_tx_reg[2],
  217. .mask = &ssc_tx_mask,
  218. },
  219. {
  220. .name = "SSC1/I2S PCM Stereo in",
  221. .ssc = &ssc_reg[2],
  222. .pdc = &pdc_rx_reg[2],
  223. .mask = &ssc_rx_mask,
  224. }},
  225. };
  226. struct at91rm9200_ssc_state {
  227. u32 ssc_cmr;
  228. u32 ssc_rcmr;
  229. u32 ssc_rfmr;
  230. u32 ssc_tcmr;
  231. u32 ssc_tfmr;
  232. u32 ssc_sr;
  233. u32 ssc_imr;
  234. };
  235. static struct at91rm9200_ssc_info {
  236. char *name;
  237. void __iomem *ssc_base;
  238. u32 pid;
  239. spinlock_t lock; /* lock for dir_mask */
  240. int dir_mask; /* 0=unused, 1=playback, 2=capture */
  241. struct semaphore *mutex;
  242. int initialized;
  243. int pcmfmt;
  244. int rate;
  245. at91rm9200_pcm_dma_params_t *dma_params[2];
  246. struct at91rm9200_ssc_state ssc_state;
  247. } ssc_info[3] = {
  248. {
  249. .name = "ssc0",
  250. .ssc_base = (void __iomem *) AT91_VA_BASE_SSC0,
  251. .pid = AT91_ID_SSC0,
  252. .lock = SPIN_LOCK_UNLOCKED,
  253. .dir_mask = 0,
  254. .mutex = &ssc0_mutex,
  255. .initialized = 0,
  256. },
  257. {
  258. .name = "ssc1",
  259. .ssc_base = (void __iomem *) AT91_VA_BASE_SSC1,
  260. .pid = AT91_ID_SSC1,
  261. .lock = SPIN_LOCK_UNLOCKED,
  262. .dir_mask = 0,
  263. .mutex = &ssc1_mutex,
  264. .initialized = 0,
  265. },
  266. {
  267. .name = "ssc2",
  268. .ssc_base = (void __iomem *) AT91_VA_BASE_SSC2,
  269. .pid = AT91_ID_SSC2,
  270. .lock = SPIN_LOCK_UNLOCKED,
  271. .dir_mask = 0,
  272. .mutex = &ssc2_mutex,
  273. .initialized = 0,
  274. },
  275. };
  276. static irqreturn_t at91rm9200_i2s_interrupt(int irq, void *dev_id)
  277. {
  278. struct at91rm9200_ssc_info *ssc_p = dev_id;
  279. at91rm9200_pcm_dma_params_t *dma_params;
  280. u32 ssc_sr;
  281. int i;
  282. ssc_sr = at91_ssc_read(ssc_p->ssc_base + AT91_SSC_SR)
  283. & at91_ssc_read(ssc_p->ssc_base + AT91_SSC_IMR);
  284. /*
  285. * Loop through the substreams attached to this SSC. If
  286. * a DMA-related interrupt occurred on that substream, call
  287. * the DMA interrupt handler function, if one has been
  288. * registered in the dma_params structure by the PCM driver.
  289. */
  290. for (i = 0; i < ARRAY_SIZE(ssc_p->dma_params); i++) {
  291. dma_params = ssc_p->dma_params[i];
  292. if (dma_params != NULL && dma_params->dma_intr_handler != NULL &&
  293. (ssc_sr &
  294. (dma_params->mask->ssc_endx | dma_params->mask->ssc_endbuf)))
  295. dma_params->dma_intr_handler(ssc_sr, dma_params->substream);
  296. }
  297. return IRQ_HANDLED;
  298. }
  299. static int at91rm9200_i2s_startup(struct snd_pcm_substream *substream)
  300. {
  301. struct snd_soc_pcm_runtime *rtd = substream->private_data;
  302. struct at91rm9200_ssc_info *ssc_p = &ssc_info[rtd->cpu_dai->id];
  303. int dir_mask;
  304. DBG("i2s_startup: SSC_SR=0x%08lx\n",
  305. at91_ssc_read(ssc_p->ssc_base + AT91_SSC_SR));
  306. dir_mask = substream->stream == SNDRV_PCM_STREAM_PLAYBACK ? 0x1 : 0x2;
  307. spin_lock_irq(&ssc_p->lock);
  308. if (ssc_p->dir_mask & dir_mask) {
  309. spin_unlock_irq(&ssc_p->lock);
  310. return -EBUSY;
  311. }
  312. ssc_p->dir_mask |= dir_mask;
  313. spin_unlock_irq(&ssc_p->lock);
  314. return 0;
  315. }
  316. static void at91rm9200_i2s_shutdown(struct snd_pcm_substream *substream)
  317. {
  318. struct snd_soc_pcm_runtime *rtd = substream->private_data;
  319. struct at91rm9200_ssc_info *ssc_p = &ssc_info[rtd->cpu_dai->id];
  320. at91rm9200_pcm_dma_params_t *dma_params = rtd->cpu_dai->dma_data;
  321. int dir, dir_mask;
  322. dir = substream->stream == SNDRV_PCM_STREAM_PLAYBACK ? 0 : 1;
  323. if (dma_params != NULL) {
  324. at91_ssc_write(dma_params->ssc->cr, dma_params->mask->ssc_disable);
  325. DBG("%s disabled SSC_SR=0x%08lx\n", (dir ? "receive" : "transmit"),
  326. at91_ssc_read(ssc_p->ssc_base + AT91_SSC_SR));
  327. dma_params->substream = NULL;
  328. ssc_p->dma_params[dir] = NULL;
  329. }
  330. dir_mask = 1 << dir;
  331. spin_lock_irq(&ssc_p->lock);
  332. ssc_p->dir_mask &= ~dir_mask;
  333. if (!ssc_p->dir_mask) {
  334. /* Shutdown the SSC clock. */
  335. DBG("Stopping pid %d clock\n", ssc_p->pid);
  336. at91_sys_write(AT91_PMC_PCDR, 1<<ssc_p->pid);
  337. if (ssc_p->initialized)
  338. free_irq(ssc_p->pid, ssc_p);
  339. /* Reset the SSC */
  340. at91_ssc_write(ssc_p->ssc_base + AT91_SSC_CR, AT91_SSC_SWRST);
  341. /* Force a re-init on the next hw_params() call. */
  342. ssc_p->initialized = 0;
  343. }
  344. spin_unlock_irq(&ssc_p->lock);
  345. }
  346. #ifdef CONFIG_PM
  347. static int at91rm9200_i2s_suspend(struct platform_device *pdev,
  348. struct snd_soc_cpu_dai *dai)
  349. {
  350. struct at91rm9200_ssc_info *ssc_p;
  351. if(!dai->active)
  352. return 0;
  353. ssc_p = &ssc_info[dai->id];
  354. /* Save the status register before disabling transmit and receive. */
  355. ssc_p->state->ssc_sr = at91_ssc_read(ssc_p->ssc_base + AT91_SSC_SR);
  356. at91_ssc_write(ssc_p->ssc_base +
  357. AT91_SSC_CR, AT91_SSC_TXDIS | AT91_SSC_RXDIS);
  358. /* Save the current interrupt mask, then disable unmasked interrupts. */
  359. ssc_p->state->ssc_imr = at91_ssc_read(ssc_p->ssc_base + AT91_SSC_IMR);
  360. at91_ssc_write(ssc_p->ssc_base + AT91_SSC_IDR, ssc_p->state->ssc_imr);
  361. ssc_p->state->ssc_cmr = at91_ssc_read(ssc_p->ssc_base + AT91_SSC_CMR);
  362. ssc_p->state->ssc_rcmr = at91_ssc_read(ssc_p->ssc_base + AT91_SSC_RCMR);
  363. ssc_p->state->ssc_rfmr = at91_ssc_read(ssc_p->ssc_base + AT91_SSC_RCMR);
  364. ssc_p->state->ssc_tcmr = at91_ssc_read(ssc_p->ssc_base + AT91_SSC_RCMR);
  365. ssc_p->state->ssc_tfmr = at91_ssc_read(ssc_p->ssc_base + AT91_SSC_RCMR);
  366. return 0;
  367. }
  368. static int at91rm9200_i2s_resume(struct platform_device *pdev,
  369. struct snd_soc_cpu_dai *dai)
  370. {
  371. struct at91rm9200_ssc_info *ssc_p;
  372. u32 cr_mask;
  373. if(!dai->active)
  374. return 0;
  375. ssc_p = &ssc_info[dai->id];
  376. at91_ssc_write(ssc_p->ssc_base + AT91_SSC_RCMR, ssc_p->state->ssc_tfmr);
  377. at91_ssc_write(ssc_p->ssc_base + AT91_SSC_RCMR, ssc_p->state->ssc_tcmr);
  378. at91_ssc_write(ssc_p->ssc_base + AT91_SSC_RCMR, ssc_p->state->ssc_rfmr);
  379. at91_ssc_write(ssc_p->ssc_base + AT91_SSC_RCMR, ssc_p->state->ssc_rcmr);
  380. at91_ssc_write(ssc_p->ssc_base + AT91_SSC_CMR, ssc_p->state->ssc_cmr);
  381. at91_ssc_write(ssc_p->ssc_base + AT91_SSC_IER, ssc_p->state->ssc_imr);
  382. at91_ssc_write(ssc_p->ssc_base + AT91_SSC_CR,
  383. ((ssc_p->state->ssc_sr & AT91_SSC_RXENA) ? AT91_SSC_RXEN : 0) |
  384. ((ssc_p->state->ssc_sr & AT91_SSC_TXENA) ? AT91_SSC_TXEN : 0));
  385. return 0;
  386. }
  387. #else
  388. #define at91rm9200_i2s_suspend NULL
  389. #define at91rm9200_i2s_resume NULL
  390. #endif
  391. static unsigned int at91rm9200_i2s_config_sysclk(
  392. struct snd_soc_cpu_dai *iface, struct snd_soc_clock_info *info,
  393. unsigned int clk)
  394. {
  395. /* Currently, there is only support for USB (12Mhz) mode */
  396. if (clk != 12000000)
  397. return 0;
  398. return 12000000;
  399. }
  400. static int at91rm9200_i2s_hw_params(struct snd_pcm_substream *substream,
  401. struct snd_pcm_hw_params *params)
  402. {
  403. struct snd_soc_pcm_runtime *rtd = substream->private_data;
  404. int id = rtd->cpu_dai->id;
  405. struct at91rm9200_ssc_info *ssc_p = &ssc_info[id];
  406. at91rm9200_pcm_dma_params_t *dma_params;
  407. unsigned int pcmfmt, rate;
  408. int dir, channels, bits;
  409. struct clk *mck_clk;
  410. unsigned long bclk;
  411. u32 div, period, tfmr, rfmr, tcmr, rcmr;
  412. int ret;
  413. /*
  414. * Currently, there is only one set of dma params for
  415. * each direction. If more are added, this code will
  416. * have to be changed to select the proper set.
  417. */
  418. dir = substream->stream == SNDRV_PCM_STREAM_PLAYBACK ? 0 : 1;
  419. dma_params = &ssc_dma_params[id][dir];
  420. dma_params->substream = substream;
  421. ssc_p->dma_params[dir] = dma_params;
  422. rtd->cpu_dai->dma_data = dma_params;
  423. rate = params_rate(params);
  424. channels = params_channels(params);
  425. pcmfmt = rtd->cpu_dai->dai_runtime.pcmfmt;
  426. switch (pcmfmt) {
  427. case SNDRV_PCM_FMTBIT_S16_LE:
  428. /* likely this is all we'll ever support, but ... */
  429. bits = 16;
  430. dma_params->pdc_xfer_size = 2;
  431. break;
  432. default:
  433. printk(KERN_WARNING "at91rm9200-i2s: unsupported format %x\n",
  434. pcmfmt);
  435. return -EINVAL;
  436. }
  437. /* Don't allow both SSC substreams to initialize at the same time. */
  438. down(ssc_p->mutex);
  439. /*
  440. * If this SSC is alreadly initialized, then this substream must use
  441. * the same format and rate.
  442. */
  443. if (ssc_p->initialized) {
  444. if (pcmfmt != ssc_p->pcmfmt || rate != ssc_p->rate) {
  445. printk(KERN_WARNING "at91rm9200-i2s: "
  446. "incompatible substream in other direction\n");
  447. up(ssc_p->mutex);
  448. return -EINVAL;
  449. }
  450. } else {
  451. /* Enable PMC peripheral clock for this SSC */
  452. DBG("Starting pid %d clock\n", ssc_p->pid);
  453. at91_sys_write(AT91_PMC_PCER, 1<<ssc_p->pid);
  454. /* Reset the SSC */
  455. at91_ssc_write(ssc_p->ssc_base + AT91_SSC_CR, AT91_SSC_SWRST);
  456. at91_ssc_write(ssc_p->ssc_base + AT91_PDC_RPR, 0);
  457. at91_ssc_write(ssc_p->ssc_base + AT91_PDC_RCR, 0);
  458. at91_ssc_write(ssc_p->ssc_base + AT91_PDC_RNPR, 0);
  459. at91_ssc_write(ssc_p->ssc_base + AT91_PDC_RNCR, 0);
  460. at91_ssc_write(ssc_p->ssc_base + AT91_PDC_TPR, 0);
  461. at91_ssc_write(ssc_p->ssc_base + AT91_PDC_TCR, 0);
  462. at91_ssc_write(ssc_p->ssc_base + AT91_PDC_TNPR, 0);
  463. at91_ssc_write(ssc_p->ssc_base + AT91_PDC_TNCR, 0);
  464. mck_clk = clk_get(NULL, "mck");
  465. div = rtd->cpu_dai->dai_runtime.priv >> 16;
  466. period = rtd->cpu_dai->dai_runtime.priv & 0xffff;
  467. bclk = 60000000 / (2 * div);
  468. DBG("mck %ld fsbd %d bfs %d bfs_real %d bclk %ld div %d period %d\n",
  469. clk_get_rate(mck_clk),
  470. SND_SOC_FSBD(6),
  471. rtd->cpu_dai->dai_runtime.bfs,
  472. SND_SOC_FSBD_REAL(rtd->cpu_dai->dai_runtime.bfs),
  473. bclk,
  474. div,
  475. period);
  476. clk_put(mck_clk);
  477. at91_ssc_write(ssc_p->ssc_base + AT91_SSC_CMR, div);
  478. /*
  479. * Setup the TFMR and RFMR for the proper data format.
  480. */
  481. tfmr =
  482. (( AT91_SSC_FSEDGE_POSITIVE ) & AT91_SSC_FSEDGE)
  483. | (( 0 << 23) & AT91_SSC_FSDEN)
  484. | (( AT91_SSC_FSOS_NEGATIVE ) & AT91_SSC_FSOS)
  485. | (((bits - 1) << 16) & AT91_SSC_FSLEN)
  486. | (((channels - 1) << 8) & AT91_SSC_DATNB)
  487. | (( 1 << 7) & AT91_SSC_MSBF)
  488. | (( 0 << 5) & AT91_SSC_DATDEF)
  489. | (((bits - 1) << 0) & AT91_SSC_DATALEN);
  490. DBG("SSC_TFMR=0x%08x\n", tfmr);
  491. at91_ssc_write(ssc_p->ssc_base + AT91_SSC_TFMR, tfmr);
  492. rfmr =
  493. (( AT91_SSC_FSEDGE_POSITIVE ) & AT91_SSC_FSEDGE)
  494. | (( AT91_SSC_FSOS_NONE ) & AT91_SSC_FSOS)
  495. | (( 0 << 16) & AT91_SSC_FSLEN)
  496. | (((channels - 1) << 8) & AT91_SSC_DATNB)
  497. | (( 1 << 7) & AT91_SSC_MSBF)
  498. | (( 0 << 5) & AT91_SSC_LOOP)
  499. | (((bits - 1) << 0) & AT91_SSC_DATALEN);
  500. DBG("SSC_RFMR=0x%08x\n", rfmr);
  501. at91_ssc_write(ssc_p->ssc_base + AT91_SSC_RFMR, rfmr);
  502. /*
  503. * Setup the TCMR and RCMR to generate the proper BCLK
  504. * and LRC signals.
  505. */
  506. tcmr =
  507. (( period << 24) & AT91_SSC_PERIOD)
  508. | (( 1 << 16) & AT91_SSC_STTDLY)
  509. | (( AT91_SSC_START_FALLING_RF ) & AT91_SSC_START)
  510. | (( AT91_SSC_CKI_FALLING ) & AT91_SSC_CKI)
  511. | (( AT91_SSC_CKO_CONTINUOUS ) & AT91_SSC_CKO)
  512. | (( AT91_SSC_CKS_DIV ) & AT91_SSC_CKS);
  513. DBG("SSC_TCMR=0x%08x\n", tcmr);
  514. at91_ssc_write(ssc_p->ssc_base + AT91_SSC_TCMR, tcmr);
  515. rcmr =
  516. (( 0 << 24) & AT91_SSC_PERIOD)
  517. | (( 1 << 16) & AT91_SSC_STTDLY)
  518. | (( AT91_SSC_START_TX_RX ) & AT91_SSC_START)
  519. | (( AT91_SSC_CK_RISING ) & AT91_SSC_CKI)
  520. | (( AT91_SSC_CKO_NONE ) & AT91_SSC_CKO)
  521. | (( AT91_SSC_CKS_CLOCK ) & AT91_SSC_CKS);
  522. DBG("SSC_RCMR=0x%08x\n", rcmr);
  523. at91_ssc_write(ssc_p->ssc_base + AT91_SSC_RCMR, rcmr);
  524. if ((ret = request_irq(ssc_p->pid, at91rm9200_i2s_interrupt,
  525. 0, ssc_p->name, ssc_p)) < 0) {
  526. printk(KERN_WARNING "at91rm9200-i2s: request_irq failure\n");
  527. return ret;
  528. }
  529. /*
  530. * Save the current substream parameters in order to check
  531. * that the substream in the opposite direction uses the
  532. * same parameters.
  533. */
  534. ssc_p->pcmfmt = pcmfmt;
  535. ssc_p->rate = rate;
  536. ssc_p->initialized = 1;
  537. DBG("hw_params: SSC initialized\n");
  538. }
  539. up(ssc_p->mutex);
  540. return 0;
  541. }
  542. static int at91rm9200_i2s_prepare(struct snd_pcm_substream *substream)
  543. {
  544. struct snd_soc_pcm_runtime *rtd = substream->private_data;
  545. at91rm9200_pcm_dma_params_t *dma_params = rtd->cpu_dai->dma_data;
  546. at91_ssc_write(dma_params->ssc->cr, dma_params->mask->ssc_enable);
  547. DBG("%s enabled SSC_SR=0x%08lx\n",
  548. substream->stream == SNDRV_PCM_STREAM_PLAYBACK ? "transmit" : "receive",
  549. at91_ssc_read(ssc_info[rtd->cpu_dai->id].ssc_base + AT91_SSC_SR));
  550. return 0;
  551. }
  552. struct snd_soc_cpu_dai at91rm9200_i2s_dai[] = {
  553. { .name = "at91rm9200-ssc0/i2s",
  554. .id = 0,
  555. .type = SND_SOC_DAI_I2S,
  556. .suspend = at91rm9200_i2s_suspend,
  557. .resume = at91rm9200_i2s_resume,
  558. .config_sysclk = at91rm9200_i2s_config_sysclk,
  559. .playback = {
  560. .channels_min = 1,
  561. .channels_max = 2,},
  562. .capture = {
  563. .channels_min = 1,
  564. .channels_max = 2,},
  565. .ops = {
  566. .startup = at91rm9200_i2s_startup,
  567. .shutdown = at91rm9200_i2s_shutdown,
  568. .prepare = at91rm9200_i2s_prepare,
  569. .hw_params = at91rm9200_i2s_hw_params,},
  570. .caps = {
  571. .mode = &at91rm9200_i2s[0],
  572. .num_modes = ARRAY_SIZE(at91rm9200_i2s),},
  573. },
  574. { .name = "at91rm9200-ssc1/i2s",
  575. .id = 1,
  576. .type = SND_SOC_DAI_I2S,
  577. .suspend = at91rm9200_i2s_suspend,
  578. .resume = at91rm9200_i2s_resume,
  579. .config_sysclk = at91rm9200_i2s_config_sysclk,
  580. .playback = {
  581. .channels_min = 1,
  582. .channels_max = 2,},
  583. .capture = {
  584. .channels_min = 1,
  585. .channels_max = 2,},
  586. .ops = {
  587. .startup = at91rm9200_i2s_startup,
  588. .shutdown = at91rm9200_i2s_shutdown,
  589. .prepare = at91rm9200_i2s_prepare,
  590. .hw_params = at91rm9200_i2s_hw_params,},
  591. .caps = {
  592. .mode = &at91rm9200_i2s[0],
  593. .num_modes = ARRAY_SIZE(at91rm9200_i2s),},
  594. },
  595. { .name = "at91rm9200-ssc2/i2s",
  596. .id = 2,
  597. .type = SND_SOC_DAI_I2S,
  598. .suspend = at91rm9200_i2s_suspend,
  599. .resume = at91rm9200_i2s_resume,
  600. .config_sysclk = at91rm9200_i2s_config_sysclk,
  601. .playback = {
  602. .channels_min = 1,
  603. .channels_max = 2,},
  604. .capture = {
  605. .channels_min = 1,
  606. .channels_max = 2,},
  607. .ops = {
  608. .startup = at91rm9200_i2s_startup,
  609. .shutdown = at91rm9200_i2s_shutdown,
  610. .prepare = at91rm9200_i2s_prepare,
  611. .hw_params = at91rm9200_i2s_hw_params,},
  612. .caps = {
  613. .mode = &at91rm9200_i2s[0],
  614. .num_modes = ARRAY_SIZE(at91rm9200_i2s),},
  615. },
  616. };
  617. EXPORT_SYMBOL_GPL(at91rm9200_i2s_dai);
  618. /* Module information */
  619. MODULE_AUTHOR("Frank Mandarino, fmandarino@endrelia.com, www.endrelia.com");
  620. MODULE_DESCRIPTION("AT91RM9200 I2S ASoC Interface");
  621. MODULE_LICENSE("GPL");