at91rm9200-i2s.c 20 KB

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