at91-ssc.c 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792
  1. /*
  2. * at91-ssc.c -- ALSA SoC AT91 SSC Audio Layer Platform driver
  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. */
  16. #include <linux/init.h>
  17. #include <linux/module.h>
  18. #include <linux/interrupt.h>
  19. #include <linux/device.h>
  20. #include <linux/delay.h>
  21. #include <linux/clk.h>
  22. #include <linux/atmel_pdc.h>
  23. #include <sound/driver.h>
  24. #include <sound/core.h>
  25. #include <sound/pcm.h>
  26. #include <sound/pcm_params.h>
  27. #include <sound/initval.h>
  28. #include <sound/soc.h>
  29. #include <asm/arch/hardware.h>
  30. #include <asm/arch/at91_pmc.h>
  31. #include <asm/arch/at91_ssc.h>
  32. #include "at91-pcm.h"
  33. #include "at91-ssc.h"
  34. #if 0
  35. #define DBG(x...) printk(KERN_DEBUG "at91-ssc:" x)
  36. #else
  37. #define DBG(x...)
  38. #endif
  39. #if defined(CONFIG_ARCH_AT91SAM9260)
  40. #define NUM_SSC_DEVICES 1
  41. #else
  42. #define NUM_SSC_DEVICES 3
  43. #endif
  44. /*
  45. * SSC PDC registers required by the PCM DMA engine.
  46. */
  47. static struct at91_pdc_regs pdc_tx_reg = {
  48. .xpr = ATMEL_PDC_TPR,
  49. .xcr = ATMEL_PDC_TCR,
  50. .xnpr = ATMEL_PDC_TNPR,
  51. .xncr = ATMEL_PDC_TNCR,
  52. };
  53. static struct at91_pdc_regs pdc_rx_reg = {
  54. .xpr = ATMEL_PDC_RPR,
  55. .xcr = ATMEL_PDC_RCR,
  56. .xnpr = ATMEL_PDC_RNPR,
  57. .xncr = ATMEL_PDC_RNCR,
  58. };
  59. /*
  60. * SSC & PDC status bits for transmit and receive.
  61. */
  62. static struct at91_ssc_mask ssc_tx_mask = {
  63. .ssc_enable = AT91_SSC_TXEN,
  64. .ssc_disable = AT91_SSC_TXDIS,
  65. .ssc_endx = AT91_SSC_ENDTX,
  66. .ssc_endbuf = AT91_SSC_TXBUFE,
  67. .pdc_enable = ATMEL_PDC_TXTEN,
  68. .pdc_disable = ATMEL_PDC_TXTDIS,
  69. };
  70. static struct at91_ssc_mask ssc_rx_mask = {
  71. .ssc_enable = AT91_SSC_RXEN,
  72. .ssc_disable = AT91_SSC_RXDIS,
  73. .ssc_endx = AT91_SSC_ENDRX,
  74. .ssc_endbuf = AT91_SSC_RXBUFF,
  75. .pdc_enable = ATMEL_PDC_RXTEN,
  76. .pdc_disable = ATMEL_PDC_RXTDIS,
  77. };
  78. /*
  79. * DMA parameters.
  80. */
  81. static struct at91_pcm_dma_params ssc_dma_params[NUM_SSC_DEVICES][2] = {
  82. {{
  83. .name = "SSC0 PCM out",
  84. .pdc = &pdc_tx_reg,
  85. .mask = &ssc_tx_mask,
  86. },
  87. {
  88. .name = "SSC0 PCM in",
  89. .pdc = &pdc_rx_reg,
  90. .mask = &ssc_rx_mask,
  91. }},
  92. #if NUM_SSC_DEVICES == 3
  93. {{
  94. .name = "SSC1 PCM out",
  95. .pdc = &pdc_tx_reg,
  96. .mask = &ssc_tx_mask,
  97. },
  98. {
  99. .name = "SSC1 PCM in",
  100. .pdc = &pdc_rx_reg,
  101. .mask = &ssc_rx_mask,
  102. }},
  103. {{
  104. .name = "SSC2 PCM out",
  105. .pdc = &pdc_tx_reg,
  106. .mask = &ssc_tx_mask,
  107. },
  108. {
  109. .name = "SSC2 PCM in",
  110. .pdc = &pdc_rx_reg,
  111. .mask = &ssc_rx_mask,
  112. }},
  113. #endif
  114. };
  115. struct at91_ssc_state {
  116. u32 ssc_cmr;
  117. u32 ssc_rcmr;
  118. u32 ssc_rfmr;
  119. u32 ssc_tcmr;
  120. u32 ssc_tfmr;
  121. u32 ssc_sr;
  122. u32 ssc_imr;
  123. };
  124. static struct at91_ssc_info {
  125. char *name;
  126. struct at91_ssc_periph ssc;
  127. spinlock_t lock; /* lock for dir_mask */
  128. unsigned short dir_mask; /* 0=unused, 1=playback, 2=capture */
  129. unsigned short initialized; /* 1=SSC has been initialized */
  130. unsigned short daifmt;
  131. unsigned short cmr_div;
  132. unsigned short tcmr_period;
  133. unsigned short rcmr_period;
  134. struct at91_pcm_dma_params *dma_params[2];
  135. struct at91_ssc_state ssc_state;
  136. } ssc_info[NUM_SSC_DEVICES] = {
  137. {
  138. .name = "ssc0",
  139. .lock = __SPIN_LOCK_UNLOCKED(ssc_info[0].lock),
  140. .dir_mask = 0,
  141. .initialized = 0,
  142. },
  143. #if NUM_SSC_DEVICES == 3
  144. {
  145. .name = "ssc1",
  146. .lock = __SPIN_LOCK_UNLOCKED(ssc_info[1].lock),
  147. .dir_mask = 0,
  148. .initialized = 0,
  149. },
  150. {
  151. .name = "ssc2",
  152. .lock = __SPIN_LOCK_UNLOCKED(ssc_info[2].lock),
  153. .dir_mask = 0,
  154. .initialized = 0,
  155. },
  156. #endif
  157. };
  158. static unsigned int at91_ssc_sysclk;
  159. /*
  160. * SSC interrupt handler. Passes PDC interrupts to the DMA
  161. * interrupt handler in the PCM driver.
  162. */
  163. static irqreturn_t at91_ssc_interrupt(int irq, void *dev_id)
  164. {
  165. struct at91_ssc_info *ssc_p = dev_id;
  166. struct at91_pcm_dma_params *dma_params;
  167. u32 ssc_sr;
  168. int i;
  169. ssc_sr = at91_ssc_read(ssc_p->ssc.base + AT91_SSC_SR)
  170. & at91_ssc_read(ssc_p->ssc.base + AT91_SSC_IMR);
  171. /*
  172. * Loop through the substreams attached to this SSC. If
  173. * a DMA-related interrupt occurred on that substream, call
  174. * the DMA interrupt handler function, if one has been
  175. * registered in the dma_params structure by the PCM driver.
  176. */
  177. for (i = 0; i < ARRAY_SIZE(ssc_p->dma_params); i++) {
  178. dma_params = ssc_p->dma_params[i];
  179. if (dma_params != NULL && dma_params->dma_intr_handler != NULL &&
  180. (ssc_sr &
  181. (dma_params->mask->ssc_endx | dma_params->mask->ssc_endbuf)))
  182. dma_params->dma_intr_handler(ssc_sr, dma_params->substream);
  183. }
  184. return IRQ_HANDLED;
  185. }
  186. /*
  187. * Startup. Only that one substream allowed in each direction.
  188. */
  189. static int at91_ssc_startup(struct snd_pcm_substream *substream)
  190. {
  191. struct snd_soc_pcm_runtime *rtd = substream->private_data;
  192. struct at91_ssc_info *ssc_p = &ssc_info[rtd->dai->cpu_dai->id];
  193. int dir_mask;
  194. DBG("ssc_startup: SSC_SR=0x%08lx\n",
  195. at91_ssc_read(ssc_p->ssc.base + AT91_SSC_SR));
  196. dir_mask = substream->stream == SNDRV_PCM_STREAM_PLAYBACK ? 0x1 : 0x2;
  197. spin_lock_irq(&ssc_p->lock);
  198. if (ssc_p->dir_mask & dir_mask) {
  199. spin_unlock_irq(&ssc_p->lock);
  200. return -EBUSY;
  201. }
  202. ssc_p->dir_mask |= dir_mask;
  203. spin_unlock_irq(&ssc_p->lock);
  204. return 0;
  205. }
  206. /*
  207. * Shutdown. Clear DMA parameters and shutdown the SSC if there
  208. * are no other substreams open.
  209. */
  210. static void at91_ssc_shutdown(struct snd_pcm_substream *substream)
  211. {
  212. struct snd_soc_pcm_runtime *rtd = substream->private_data;
  213. struct at91_ssc_info *ssc_p = &ssc_info[rtd->dai->cpu_dai->id];
  214. struct at91_pcm_dma_params *dma_params;
  215. int dir, dir_mask;
  216. dir = substream->stream == SNDRV_PCM_STREAM_PLAYBACK ? 0 : 1;
  217. dma_params = ssc_p->dma_params[dir];
  218. if (dma_params != NULL) {
  219. at91_ssc_write(dma_params->ssc_base + AT91_SSC_CR,
  220. dma_params->mask->ssc_disable);
  221. DBG("%s disabled SSC_SR=0x%08lx\n", (dir ? "receive" : "transmit"),
  222. at91_ssc_read(ssc_p->ssc.base + AT91_SSC_SR));
  223. dma_params->ssc_base = NULL;
  224. dma_params->substream = NULL;
  225. ssc_p->dma_params[dir] = NULL;
  226. }
  227. dir_mask = 1 << dir;
  228. spin_lock_irq(&ssc_p->lock);
  229. ssc_p->dir_mask &= ~dir_mask;
  230. if (!ssc_p->dir_mask) {
  231. /* Shutdown the SSC clock. */
  232. DBG("Stopping pid %d clock\n", ssc_p->ssc.pid);
  233. at91_sys_write(AT91_PMC_PCDR, 1<<ssc_p->ssc.pid);
  234. if (ssc_p->initialized) {
  235. free_irq(ssc_p->ssc.pid, ssc_p);
  236. ssc_p->initialized = 0;
  237. }
  238. /* Reset the SSC */
  239. at91_ssc_write(ssc_p->ssc.base + AT91_SSC_CR, AT91_SSC_SWRST);
  240. /* Clear the SSC dividers */
  241. ssc_p->cmr_div = ssc_p->tcmr_period = ssc_p->rcmr_period = 0;
  242. }
  243. spin_unlock_irq(&ssc_p->lock);
  244. }
  245. /*
  246. * Record the SSC system clock rate.
  247. */
  248. static int at91_ssc_set_dai_sysclk(struct snd_soc_cpu_dai *cpu_dai,
  249. int clk_id, unsigned int freq, int dir)
  250. {
  251. /*
  252. * The only clock supplied to the SSC is the AT91 master clock,
  253. * which is only used if the SSC is generating BCLK and/or
  254. * LRC clocks.
  255. */
  256. switch (clk_id) {
  257. case AT91_SYSCLK_MCK:
  258. at91_ssc_sysclk = freq;
  259. break;
  260. default:
  261. return -EINVAL;
  262. }
  263. return 0;
  264. }
  265. /*
  266. * Record the DAI format for use in hw_params().
  267. */
  268. static int at91_ssc_set_dai_fmt(struct snd_soc_cpu_dai *cpu_dai,
  269. unsigned int fmt)
  270. {
  271. struct at91_ssc_info *ssc_p = &ssc_info[cpu_dai->id];
  272. ssc_p->daifmt = fmt;
  273. return 0;
  274. }
  275. /*
  276. * Record SSC clock dividers for use in hw_params().
  277. */
  278. static int at91_ssc_set_dai_clkdiv(struct snd_soc_cpu_dai *cpu_dai,
  279. int div_id, int div)
  280. {
  281. struct at91_ssc_info *ssc_p = &ssc_info[cpu_dai->id];
  282. switch (div_id) {
  283. case AT91SSC_CMR_DIV:
  284. /*
  285. * The same master clock divider is used for both
  286. * transmit and receive, so if a value has already
  287. * been set, it must match this value.
  288. */
  289. if (ssc_p->cmr_div == 0)
  290. ssc_p->cmr_div = div;
  291. else
  292. if (div != ssc_p->cmr_div)
  293. return -EBUSY;
  294. break;
  295. case AT91SSC_TCMR_PERIOD:
  296. ssc_p->tcmr_period = div;
  297. break;
  298. case AT91SSC_RCMR_PERIOD:
  299. ssc_p->rcmr_period = div;
  300. break;
  301. default:
  302. return -EINVAL;
  303. }
  304. return 0;
  305. }
  306. /*
  307. * Configure the SSC.
  308. */
  309. static int at91_ssc_hw_params(struct snd_pcm_substream *substream,
  310. struct snd_pcm_hw_params *params)
  311. {
  312. struct snd_soc_pcm_runtime *rtd = substream->private_data;
  313. int id = rtd->dai->cpu_dai->id;
  314. struct at91_ssc_info *ssc_p = &ssc_info[id];
  315. struct at91_pcm_dma_params *dma_params;
  316. int dir, channels, bits;
  317. u32 tfmr, rfmr, tcmr, rcmr;
  318. int start_event;
  319. int ret;
  320. /*
  321. * Currently, there is only one set of dma params for
  322. * each direction. If more are added, this code will
  323. * have to be changed to select the proper set.
  324. */
  325. dir = substream->stream == SNDRV_PCM_STREAM_PLAYBACK ? 0 : 1;
  326. dma_params = &ssc_dma_params[id][dir];
  327. dma_params->ssc_base = ssc_p->ssc.base;
  328. dma_params->substream = substream;
  329. ssc_p->dma_params[dir] = dma_params;
  330. /*
  331. * The cpu_dai->dma_data field is only used to communicate the
  332. * appropriate DMA parameters to the pcm driver hw_params()
  333. * function. It should not be used for other purposes
  334. * as it is common to all substreams.
  335. */
  336. rtd->dai->cpu_dai->dma_data = dma_params;
  337. channels = params_channels(params);
  338. /*
  339. * Determine sample size in bits and the PDC increment.
  340. */
  341. switch(params_format(params)) {
  342. case SNDRV_PCM_FORMAT_S8:
  343. bits = 8;
  344. dma_params->pdc_xfer_size = 1;
  345. break;
  346. case SNDRV_PCM_FORMAT_S16_LE:
  347. bits = 16;
  348. dma_params->pdc_xfer_size = 2;
  349. break;
  350. case SNDRV_PCM_FORMAT_S24_LE:
  351. bits = 24;
  352. dma_params->pdc_xfer_size = 4;
  353. break;
  354. case SNDRV_PCM_FORMAT_S32_LE:
  355. bits = 32;
  356. dma_params->pdc_xfer_size = 4;
  357. break;
  358. default:
  359. printk(KERN_WARNING "at91-ssc: unsupported PCM format");
  360. return -EINVAL;
  361. }
  362. /*
  363. * The SSC only supports up to 16-bit samples in I2S format, due
  364. * to the size of the Frame Mode Register FSLEN field.
  365. */
  366. if ((ssc_p->daifmt & SND_SOC_DAIFMT_FORMAT_MASK) == SND_SOC_DAIFMT_I2S
  367. && bits > 16) {
  368. printk(KERN_WARNING
  369. "at91-ssc: sample size %d is too large for I2S\n", bits);
  370. return -EINVAL;
  371. }
  372. /*
  373. * Compute SSC register settings.
  374. */
  375. switch (ssc_p->daifmt
  376. & (SND_SOC_DAIFMT_FORMAT_MASK | SND_SOC_DAIFMT_MASTER_MASK)) {
  377. case SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_CBS_CFS:
  378. /*
  379. * I2S format, SSC provides BCLK and LRC clocks.
  380. *
  381. * The SSC transmit and receive clocks are generated from the
  382. * MCK divider, and the BCLK signal is output on the SSC TK line.
  383. */
  384. rcmr = (( ssc_p->rcmr_period << 24) & AT91_SSC_PERIOD)
  385. | (( 1 << 16) & AT91_SSC_STTDLY)
  386. | (( AT91_SSC_START_FALLING_RF ) & AT91_SSC_START)
  387. | (( AT91_SSC_CK_RISING ) & AT91_SSC_CKI)
  388. | (( AT91_SSC_CKO_NONE ) & AT91_SSC_CKO)
  389. | (( AT91_SSC_CKS_DIV ) & AT91_SSC_CKS);
  390. rfmr = (( AT91_SSC_FSEDGE_POSITIVE ) & AT91_SSC_FSEDGE)
  391. | (( AT91_SSC_FSOS_NEGATIVE ) & AT91_SSC_FSOS)
  392. | (((bits - 1) << 16) & AT91_SSC_FSLEN)
  393. | (((channels - 1) << 8) & AT91_SSC_DATNB)
  394. | (( 1 << 7) & AT91_SSC_MSBF)
  395. | (( 0 << 5) & AT91_SSC_LOOP)
  396. | (((bits - 1) << 0) & AT91_SSC_DATALEN);
  397. tcmr = (( ssc_p->tcmr_period << 24) & AT91_SSC_PERIOD)
  398. | (( 1 << 16) & AT91_SSC_STTDLY)
  399. | (( AT91_SSC_START_FALLING_RF ) & AT91_SSC_START)
  400. | (( AT91_SSC_CKI_FALLING ) & AT91_SSC_CKI)
  401. | (( AT91_SSC_CKO_CONTINUOUS ) & AT91_SSC_CKO)
  402. | (( AT91_SSC_CKS_DIV ) & AT91_SSC_CKS);
  403. tfmr = (( AT91_SSC_FSEDGE_POSITIVE ) & AT91_SSC_FSEDGE)
  404. | (( 0 << 23) & AT91_SSC_FSDEN)
  405. | (( AT91_SSC_FSOS_NEGATIVE ) & AT91_SSC_FSOS)
  406. | (((bits - 1) << 16) & AT91_SSC_FSLEN)
  407. | (((channels - 1) << 8) & AT91_SSC_DATNB)
  408. | (( 1 << 7) & AT91_SSC_MSBF)
  409. | (( 0 << 5) & AT91_SSC_DATDEF)
  410. | (((bits - 1) << 0) & AT91_SSC_DATALEN);
  411. break;
  412. case SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_CBM_CFM:
  413. /*
  414. * I2S format, CODEC supplies BCLK and LRC clocks.
  415. *
  416. * The SSC transmit clock is obtained from the BCLK signal on
  417. * on the TK line, and the SSC receive clock is generated from the
  418. * transmit clock.
  419. *
  420. * For single channel data, one sample is transferred on the falling
  421. * edge of the LRC clock. For two channel data, one sample is
  422. * transferred on both edges of the LRC clock.
  423. */
  424. start_event = channels == 1
  425. ? AT91_SSC_START_FALLING_RF
  426. : AT91_SSC_START_EDGE_RF;
  427. rcmr = (( 0 << 24) & AT91_SSC_PERIOD)
  428. | (( 1 << 16) & AT91_SSC_STTDLY)
  429. | (( start_event ) & AT91_SSC_START)
  430. | (( AT91_SSC_CK_RISING ) & AT91_SSC_CKI)
  431. | (( AT91_SSC_CKO_NONE ) & AT91_SSC_CKO)
  432. | (( AT91_SSC_CKS_CLOCK ) & AT91_SSC_CKS);
  433. rfmr = (( AT91_SSC_FSEDGE_POSITIVE ) & AT91_SSC_FSEDGE)
  434. | (( AT91_SSC_FSOS_NONE ) & AT91_SSC_FSOS)
  435. | (( 0 << 16) & AT91_SSC_FSLEN)
  436. | (( 0 << 8) & AT91_SSC_DATNB)
  437. | (( 1 << 7) & AT91_SSC_MSBF)
  438. | (( 0 << 5) & AT91_SSC_LOOP)
  439. | (((bits - 1) << 0) & AT91_SSC_DATALEN);
  440. tcmr = (( 0 << 24) & AT91_SSC_PERIOD)
  441. | (( 1 << 16) & AT91_SSC_STTDLY)
  442. | (( start_event ) & AT91_SSC_START)
  443. | (( AT91_SSC_CKI_FALLING ) & AT91_SSC_CKI)
  444. | (( AT91_SSC_CKO_NONE ) & AT91_SSC_CKO)
  445. | (( AT91_SSC_CKS_PIN ) & AT91_SSC_CKS);
  446. tfmr = (( AT91_SSC_FSEDGE_POSITIVE ) & AT91_SSC_FSEDGE)
  447. | (( 0 << 23) & AT91_SSC_FSDEN)
  448. | (( AT91_SSC_FSOS_NONE ) & AT91_SSC_FSOS)
  449. | (( 0 << 16) & AT91_SSC_FSLEN)
  450. | (( 0 << 8) & AT91_SSC_DATNB)
  451. | (( 1 << 7) & AT91_SSC_MSBF)
  452. | (( 0 << 5) & AT91_SSC_DATDEF)
  453. | (((bits - 1) << 0) & AT91_SSC_DATALEN);
  454. break;
  455. case SND_SOC_DAIFMT_DSP_A | SND_SOC_DAIFMT_CBS_CFS:
  456. /*
  457. * DSP/PCM Mode A format, SSC provides BCLK and LRC clocks.
  458. *
  459. * The SSC transmit and receive clocks are generated from the
  460. * MCK divider, and the BCLK signal is output on the SSC TK line.
  461. */
  462. rcmr = (( ssc_p->rcmr_period << 24) & AT91_SSC_PERIOD)
  463. | (( 1 << 16) & AT91_SSC_STTDLY)
  464. | (( AT91_SSC_START_RISING_RF ) & AT91_SSC_START)
  465. | (( AT91_SSC_CK_RISING ) & AT91_SSC_CKI)
  466. | (( AT91_SSC_CKO_NONE ) & AT91_SSC_CKO)
  467. | (( AT91_SSC_CKS_DIV ) & AT91_SSC_CKS);
  468. rfmr = (( AT91_SSC_FSEDGE_POSITIVE ) & AT91_SSC_FSEDGE)
  469. | (( AT91_SSC_FSOS_POSITIVE ) & AT91_SSC_FSOS)
  470. | (( 0 << 16) & AT91_SSC_FSLEN)
  471. | (((channels - 1) << 8) & AT91_SSC_DATNB)
  472. | (( 1 << 7) & AT91_SSC_MSBF)
  473. | (( 0 << 5) & AT91_SSC_LOOP)
  474. | (((bits - 1) << 0) & AT91_SSC_DATALEN);
  475. tcmr = (( ssc_p->tcmr_period << 24) & AT91_SSC_PERIOD)
  476. | (( 1 << 16) & AT91_SSC_STTDLY)
  477. | (( AT91_SSC_START_RISING_RF ) & AT91_SSC_START)
  478. | (( AT91_SSC_CK_RISING ) & AT91_SSC_CKI)
  479. | (( AT91_SSC_CKO_CONTINUOUS ) & AT91_SSC_CKO)
  480. | (( AT91_SSC_CKS_DIV ) & AT91_SSC_CKS);
  481. tfmr = (( AT91_SSC_FSEDGE_POSITIVE ) & AT91_SSC_FSEDGE)
  482. | (( 0 << 23) & AT91_SSC_FSDEN)
  483. | (( AT91_SSC_FSOS_POSITIVE ) & AT91_SSC_FSOS)
  484. | (( 0 << 16) & AT91_SSC_FSLEN)
  485. | (((channels - 1) << 8) & AT91_SSC_DATNB)
  486. | (( 1 << 7) & AT91_SSC_MSBF)
  487. | (( 0 << 5) & AT91_SSC_DATDEF)
  488. | (((bits - 1) << 0) & AT91_SSC_DATALEN);
  489. break;
  490. case SND_SOC_DAIFMT_DSP_A | SND_SOC_DAIFMT_CBM_CFM:
  491. default:
  492. printk(KERN_WARNING "at91-ssc: unsupported DAI format 0x%x.\n",
  493. ssc_p->daifmt);
  494. return -EINVAL;
  495. break;
  496. }
  497. DBG("RCMR=%08x RFMR=%08x TCMR=%08x TFMR=%08x\n", rcmr, rfmr, tcmr, tfmr);
  498. if (!ssc_p->initialized) {
  499. /* Enable PMC peripheral clock for this SSC */
  500. DBG("Starting pid %d clock\n", ssc_p->ssc.pid);
  501. at91_sys_write(AT91_PMC_PCER, 1<<ssc_p->ssc.pid);
  502. /* Reset the SSC and its PDC registers */
  503. at91_ssc_write(ssc_p->ssc.base + AT91_SSC_CR, AT91_SSC_SWRST);
  504. at91_ssc_write(ssc_p->ssc.base + ATMEL_PDC_RPR, 0);
  505. at91_ssc_write(ssc_p->ssc.base + ATMEL_PDC_RCR, 0);
  506. at91_ssc_write(ssc_p->ssc.base + ATMEL_PDC_RNPR, 0);
  507. at91_ssc_write(ssc_p->ssc.base + ATMEL_PDC_RNCR, 0);
  508. at91_ssc_write(ssc_p->ssc.base + ATMEL_PDC_TPR, 0);
  509. at91_ssc_write(ssc_p->ssc.base + ATMEL_PDC_TCR, 0);
  510. at91_ssc_write(ssc_p->ssc.base + ATMEL_PDC_TNPR, 0);
  511. at91_ssc_write(ssc_p->ssc.base + ATMEL_PDC_TNCR, 0);
  512. if ((ret = request_irq(ssc_p->ssc.pid, at91_ssc_interrupt,
  513. 0, ssc_p->name, ssc_p)) < 0) {
  514. printk(KERN_WARNING "at91-ssc: request_irq failure\n");
  515. DBG("Stopping pid %d clock\n", ssc_p->ssc.pid);
  516. at91_sys_write(AT91_PMC_PCER, 1<<ssc_p->ssc.pid);
  517. return ret;
  518. }
  519. ssc_p->initialized = 1;
  520. }
  521. /* set SSC clock mode register */
  522. at91_ssc_write(ssc_p->ssc.base + AT91_SSC_CMR, ssc_p->cmr_div);
  523. /* set receive clock mode and format */
  524. at91_ssc_write(ssc_p->ssc.base + AT91_SSC_RCMR, rcmr);
  525. at91_ssc_write(ssc_p->ssc.base + AT91_SSC_RFMR, rfmr);
  526. /* set transmit clock mode and format */
  527. at91_ssc_write(ssc_p->ssc.base + AT91_SSC_TCMR, tcmr);
  528. at91_ssc_write(ssc_p->ssc.base + AT91_SSC_TFMR, tfmr);
  529. DBG("hw_params: SSC initialized\n");
  530. return 0;
  531. }
  532. static int at91_ssc_prepare(struct snd_pcm_substream *substream)
  533. {
  534. struct snd_soc_pcm_runtime *rtd = substream->private_data;
  535. struct at91_ssc_info *ssc_p = &ssc_info[rtd->dai->cpu_dai->id];
  536. struct at91_pcm_dma_params *dma_params;
  537. int dir;
  538. dir = substream->stream == SNDRV_PCM_STREAM_PLAYBACK ? 0 : 1;
  539. dma_params = ssc_p->dma_params[dir];
  540. at91_ssc_write(dma_params->ssc_base + AT91_SSC_CR,
  541. dma_params->mask->ssc_enable);
  542. DBG("%s enabled SSC_SR=0x%08lx\n", dir ? "receive" : "transmit",
  543. at91_ssc_read(dma_params->ssc_base + AT91_SSC_SR));
  544. return 0;
  545. }
  546. #ifdef CONFIG_PM
  547. static int at91_ssc_suspend(struct platform_device *pdev,
  548. struct snd_soc_cpu_dai *cpu_dai)
  549. {
  550. struct at91_ssc_info *ssc_p;
  551. if(!cpu_dai->active)
  552. return 0;
  553. ssc_p = &ssc_info[cpu_dai->id];
  554. /* Save the status register before disabling transmit and receive. */
  555. ssc_p->ssc_state.ssc_sr = at91_ssc_read(ssc_p->ssc.base + AT91_SSC_SR);
  556. at91_ssc_write(ssc_p->ssc.base + AT91_SSC_CR,
  557. AT91_SSC_TXDIS | AT91_SSC_RXDIS);
  558. /* Save the current interrupt mask, then disable unmasked interrupts. */
  559. ssc_p->ssc_state.ssc_imr = at91_ssc_read(ssc_p->ssc.base + AT91_SSC_IMR);
  560. at91_ssc_write(ssc_p->ssc.base + AT91_SSC_IDR, ssc_p->ssc_state.ssc_imr);
  561. ssc_p->ssc_state.ssc_cmr = at91_ssc_read(ssc_p->ssc.base + AT91_SSC_CMR);
  562. ssc_p->ssc_state.ssc_rcmr = at91_ssc_read(ssc_p->ssc.base + AT91_SSC_RCMR);
  563. ssc_p->ssc_state.ssc_rfmr = at91_ssc_read(ssc_p->ssc.base + AT91_SSC_RFMR);
  564. ssc_p->ssc_state.ssc_tcmr = at91_ssc_read(ssc_p->ssc.base + AT91_SSC_TCMR);
  565. ssc_p->ssc_state.ssc_tfmr = at91_ssc_read(ssc_p->ssc.base + AT91_SSC_TFMR);
  566. return 0;
  567. }
  568. static int at91_ssc_resume(struct platform_device *pdev,
  569. struct snd_soc_cpu_dai *cpu_dai)
  570. {
  571. struct at91_ssc_info *ssc_p;
  572. if(!cpu_dai->active)
  573. return 0;
  574. ssc_p = &ssc_info[cpu_dai->id];
  575. at91_ssc_write(ssc_p->ssc.base + AT91_SSC_TFMR, ssc_p->ssc_state.ssc_tfmr);
  576. at91_ssc_write(ssc_p->ssc.base + AT91_SSC_TCMR, ssc_p->ssc_state.ssc_tcmr);
  577. at91_ssc_write(ssc_p->ssc.base + AT91_SSC_RFMR, ssc_p->ssc_state.ssc_rfmr);
  578. at91_ssc_write(ssc_p->ssc.base + AT91_SSC_RCMR, ssc_p->ssc_state.ssc_rcmr);
  579. at91_ssc_write(ssc_p->ssc.base + AT91_SSC_CMR, ssc_p->ssc_state.ssc_cmr);
  580. at91_ssc_write(ssc_p->ssc.base + AT91_SSC_IER, ssc_p->ssc_state.ssc_imr);
  581. at91_ssc_write(ssc_p->ssc.base + AT91_SSC_CR,
  582. ((ssc_p->ssc_state.ssc_sr & AT91_SSC_RXENA) ? AT91_SSC_RXEN : 0) |
  583. ((ssc_p->ssc_state.ssc_sr & AT91_SSC_TXENA) ? AT91_SSC_TXEN : 0));
  584. return 0;
  585. }
  586. #else
  587. #define at91_ssc_suspend NULL
  588. #define at91_ssc_resume NULL
  589. #endif
  590. #define AT91_SSC_RATES (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 |\
  591. SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_22050 |\
  592. SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 |\
  593. SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_88200 |\
  594. SNDRV_PCM_RATE_96000)
  595. #define AT91_SSC_FORMATS (SNDRV_PCM_FMTBIT_S8 | SNDRV_PCM_FMTBIT_S16_LE |\
  596. SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S32_LE)
  597. struct snd_soc_cpu_dai at91_ssc_dai[NUM_SSC_DEVICES] = {
  598. { .name = "at91-ssc0",
  599. .id = 0,
  600. .type = SND_SOC_DAI_PCM,
  601. .suspend = at91_ssc_suspend,
  602. .resume = at91_ssc_resume,
  603. .playback = {
  604. .channels_min = 1,
  605. .channels_max = 2,
  606. .rates = AT91_SSC_RATES,
  607. .formats = AT91_SSC_FORMATS,},
  608. .capture = {
  609. .channels_min = 1,
  610. .channels_max = 2,
  611. .rates = AT91_SSC_RATES,
  612. .formats = AT91_SSC_FORMATS,},
  613. .ops = {
  614. .startup = at91_ssc_startup,
  615. .shutdown = at91_ssc_shutdown,
  616. .prepare = at91_ssc_prepare,
  617. .hw_params = at91_ssc_hw_params,},
  618. .dai_ops = {
  619. .set_sysclk = at91_ssc_set_dai_sysclk,
  620. .set_fmt = at91_ssc_set_dai_fmt,
  621. .set_clkdiv = at91_ssc_set_dai_clkdiv,},
  622. .private_data = &ssc_info[0].ssc,
  623. },
  624. #if NUM_SSC_DEVICES == 3
  625. { .name = "at91-ssc1",
  626. .id = 1,
  627. .type = SND_SOC_DAI_PCM,
  628. .suspend = at91_ssc_suspend,
  629. .resume = at91_ssc_resume,
  630. .playback = {
  631. .channels_min = 1,
  632. .channels_max = 2,
  633. .rates = AT91_SSC_RATES,
  634. .formats = AT91_SSC_FORMATS,},
  635. .capture = {
  636. .channels_min = 1,
  637. .channels_max = 2,
  638. .rates = AT91_SSC_RATES,
  639. .formats = AT91_SSC_FORMATS,},
  640. .ops = {
  641. .startup = at91_ssc_startup,
  642. .shutdown = at91_ssc_shutdown,
  643. .prepare = at91_ssc_prepare,
  644. .hw_params = at91_ssc_hw_params,},
  645. .dai_ops = {
  646. .set_sysclk = at91_ssc_set_dai_sysclk,
  647. .set_fmt = at91_ssc_set_dai_fmt,
  648. .set_clkdiv = at91_ssc_set_dai_clkdiv,},
  649. .private_data = &ssc_info[1].ssc,
  650. },
  651. { .name = "at91-ssc2",
  652. .id = 2,
  653. .type = SND_SOC_DAI_PCM,
  654. .suspend = at91_ssc_suspend,
  655. .resume = at91_ssc_resume,
  656. .playback = {
  657. .channels_min = 1,
  658. .channels_max = 2,
  659. .rates = AT91_SSC_RATES,
  660. .formats = AT91_SSC_FORMATS,},
  661. .capture = {
  662. .channels_min = 1,
  663. .channels_max = 2,
  664. .rates = AT91_SSC_RATES,
  665. .formats = AT91_SSC_FORMATS,},
  666. .ops = {
  667. .startup = at91_ssc_startup,
  668. .shutdown = at91_ssc_shutdown,
  669. .prepare = at91_ssc_prepare,
  670. .hw_params = at91_ssc_hw_params,},
  671. .dai_ops = {
  672. .set_sysclk = at91_ssc_set_dai_sysclk,
  673. .set_fmt = at91_ssc_set_dai_fmt,
  674. .set_clkdiv = at91_ssc_set_dai_clkdiv,},
  675. .private_data = &ssc_info[2].ssc,
  676. },
  677. #endif
  678. };
  679. EXPORT_SYMBOL_GPL(at91_ssc_dai);
  680. /* Module information */
  681. MODULE_AUTHOR("Frank Mandarino, fmandarino@endrelia.com, www.endrelia.com");
  682. MODULE_DESCRIPTION("AT91 SSC ASoC Interface");
  683. MODULE_LICENSE("GPL");