at91-ssc.c 22 KB

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