atmel_ssc_dai.c 26 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004
  1. /*
  2. * atmel_ssc_dai.c -- ALSA SoC ATMEL SSC Audio Layer Platform driver
  3. *
  4. * Copyright (C) 2005 SAN People
  5. * Copyright (C) 2008 Atmel
  6. *
  7. * Author: Sedji Gaouaou <sedji.gaouaou@atmel.com>
  8. * ATMEL CORP.
  9. *
  10. * Based on at91-ssc.c by
  11. * Frank Mandarino <fmandarino@endrelia.com>
  12. * Based on pxa2xx Platform drivers by
  13. * Liam Girdwood <lrg@slimlogic.co.uk>
  14. *
  15. * This program is free software; you can redistribute it and/or modify
  16. * it under the terms of the GNU General Public License as published by
  17. * the Free Software Foundation; either version 2 of the License, or
  18. * (at your option) any later version.
  19. *
  20. * This program is distributed in the hope that it will be useful,
  21. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  22. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  23. * GNU General Public License for more details.
  24. *
  25. * You should have received a copy of the GNU General Public License
  26. * along with this program; if not, write to the Free Software
  27. * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
  28. */
  29. #include <linux/init.h>
  30. #include <linux/module.h>
  31. #include <linux/interrupt.h>
  32. #include <linux/device.h>
  33. #include <linux/delay.h>
  34. #include <linux/clk.h>
  35. #include <linux/atmel_pdc.h>
  36. #include <linux/atmel-ssc.h>
  37. #include <sound/core.h>
  38. #include <sound/pcm.h>
  39. #include <sound/pcm_params.h>
  40. #include <sound/initval.h>
  41. #include <sound/soc.h>
  42. #include "atmel-pcm.h"
  43. #include "atmel_ssc_dai.h"
  44. #define NUM_SSC_DEVICES 3
  45. /*
  46. * SSC PDC registers required by the PCM DMA engine.
  47. */
  48. static struct atmel_pdc_regs pdc_tx_reg = {
  49. .xpr = ATMEL_PDC_TPR,
  50. .xcr = ATMEL_PDC_TCR,
  51. .xnpr = ATMEL_PDC_TNPR,
  52. .xncr = ATMEL_PDC_TNCR,
  53. };
  54. static struct atmel_pdc_regs pdc_rx_reg = {
  55. .xpr = ATMEL_PDC_RPR,
  56. .xcr = ATMEL_PDC_RCR,
  57. .xnpr = ATMEL_PDC_RNPR,
  58. .xncr = ATMEL_PDC_RNCR,
  59. };
  60. /*
  61. * SSC & PDC status bits for transmit and receive.
  62. */
  63. static struct atmel_ssc_mask ssc_tx_mask = {
  64. .ssc_enable = SSC_BIT(CR_TXEN),
  65. .ssc_disable = SSC_BIT(CR_TXDIS),
  66. .ssc_endx = SSC_BIT(SR_ENDTX),
  67. .ssc_endbuf = SSC_BIT(SR_TXBUFE),
  68. .ssc_error = SSC_BIT(SR_OVRUN),
  69. .pdc_enable = ATMEL_PDC_TXTEN,
  70. .pdc_disable = ATMEL_PDC_TXTDIS,
  71. };
  72. static struct atmel_ssc_mask ssc_rx_mask = {
  73. .ssc_enable = SSC_BIT(CR_RXEN),
  74. .ssc_disable = SSC_BIT(CR_RXDIS),
  75. .ssc_endx = SSC_BIT(SR_ENDRX),
  76. .ssc_endbuf = SSC_BIT(SR_RXBUFF),
  77. .ssc_error = SSC_BIT(SR_OVRUN),
  78. .pdc_enable = ATMEL_PDC_RXTEN,
  79. .pdc_disable = ATMEL_PDC_RXTDIS,
  80. };
  81. /*
  82. * DMA parameters.
  83. */
  84. static struct atmel_pcm_dma_params ssc_dma_params[NUM_SSC_DEVICES][2] = {
  85. {{
  86. .name = "SSC0 PCM out",
  87. .pdc = &pdc_tx_reg,
  88. .mask = &ssc_tx_mask,
  89. },
  90. {
  91. .name = "SSC0 PCM in",
  92. .pdc = &pdc_rx_reg,
  93. .mask = &ssc_rx_mask,
  94. } },
  95. {{
  96. .name = "SSC1 PCM out",
  97. .pdc = &pdc_tx_reg,
  98. .mask = &ssc_tx_mask,
  99. },
  100. {
  101. .name = "SSC1 PCM in",
  102. .pdc = &pdc_rx_reg,
  103. .mask = &ssc_rx_mask,
  104. } },
  105. {{
  106. .name = "SSC2 PCM out",
  107. .pdc = &pdc_tx_reg,
  108. .mask = &ssc_tx_mask,
  109. },
  110. {
  111. .name = "SSC2 PCM in",
  112. .pdc = &pdc_rx_reg,
  113. .mask = &ssc_rx_mask,
  114. } },
  115. };
  116. static struct atmel_ssc_info ssc_info[NUM_SSC_DEVICES] = {
  117. {
  118. .name = "ssc0",
  119. .lock = __SPIN_LOCK_UNLOCKED(ssc_info[0].lock),
  120. .dir_mask = SSC_DIR_MASK_UNUSED,
  121. .initialized = 0,
  122. },
  123. {
  124. .name = "ssc1",
  125. .lock = __SPIN_LOCK_UNLOCKED(ssc_info[1].lock),
  126. .dir_mask = SSC_DIR_MASK_UNUSED,
  127. .initialized = 0,
  128. },
  129. {
  130. .name = "ssc2",
  131. .lock = __SPIN_LOCK_UNLOCKED(ssc_info[2].lock),
  132. .dir_mask = SSC_DIR_MASK_UNUSED,
  133. .initialized = 0,
  134. },
  135. };
  136. /*
  137. * SSC interrupt handler. Passes PDC interrupts to the DMA
  138. * interrupt handler in the PCM driver.
  139. */
  140. static irqreturn_t atmel_ssc_interrupt(int irq, void *dev_id)
  141. {
  142. struct atmel_ssc_info *ssc_p = dev_id;
  143. struct atmel_pcm_dma_params *dma_params;
  144. u32 ssc_sr;
  145. u32 ssc_substream_mask;
  146. int i;
  147. ssc_sr = (unsigned long)ssc_readl(ssc_p->ssc->regs, SR)
  148. & (unsigned long)ssc_readl(ssc_p->ssc->regs, IMR);
  149. /*
  150. * Loop through the substreams attached to this SSC. If
  151. * a DMA-related interrupt occurred on that substream, call
  152. * the DMA interrupt handler function, if one has been
  153. * registered in the dma_params structure by the PCM driver.
  154. */
  155. for (i = 0; i < ARRAY_SIZE(ssc_p->dma_params); i++) {
  156. dma_params = ssc_p->dma_params[i];
  157. if ((dma_params != NULL) &&
  158. (dma_params->dma_intr_handler != NULL)) {
  159. ssc_substream_mask = (dma_params->mask->ssc_endx |
  160. dma_params->mask->ssc_endbuf);
  161. if (ssc_sr & ssc_substream_mask) {
  162. dma_params->dma_intr_handler(ssc_sr,
  163. dma_params->
  164. substream);
  165. }
  166. }
  167. }
  168. return IRQ_HANDLED;
  169. }
  170. /*
  171. * When the bit clock is input, limit the maximum rate according to the
  172. * Serial Clock Ratio Considerations section from the SSC documentation:
  173. *
  174. * The Transmitter and the Receiver can be programmed to operate
  175. * with the clock signals provided on either the TK or RK pins.
  176. * This allows the SSC to support many slave-mode data transfers.
  177. * In this case, the maximum clock speed allowed on the RK pin is:
  178. * - Peripheral clock divided by 2 if Receiver Frame Synchro is input
  179. * - Peripheral clock divided by 3 if Receiver Frame Synchro is output
  180. * In addition, the maximum clock speed allowed on the TK pin is:
  181. * - Peripheral clock divided by 6 if Transmit Frame Synchro is input
  182. * - Peripheral clock divided by 2 if Transmit Frame Synchro is output
  183. *
  184. * When the bit clock is output, limit the rate according to the
  185. * SSC divider restrictions.
  186. */
  187. static int atmel_ssc_hw_rule_rate(struct snd_pcm_hw_params *params,
  188. struct snd_pcm_hw_rule *rule)
  189. {
  190. struct atmel_ssc_info *ssc_p = rule->private;
  191. struct ssc_device *ssc = ssc_p->ssc;
  192. struct snd_interval *i = hw_param_interval(params, rule->var);
  193. struct snd_interval t;
  194. struct snd_ratnum r = {
  195. .den_min = 1,
  196. .den_max = 4095,
  197. .den_step = 1,
  198. };
  199. unsigned int num = 0, den = 0;
  200. int frame_size;
  201. int mck_div = 2;
  202. int ret;
  203. frame_size = snd_soc_params_to_frame_size(params);
  204. if (frame_size < 0)
  205. return frame_size;
  206. switch (ssc_p->daifmt & SND_SOC_DAIFMT_MASTER_MASK) {
  207. case SND_SOC_DAIFMT_CBM_CFS:
  208. if ((ssc_p->dir_mask & SSC_DIR_MASK_CAPTURE)
  209. && ssc->clk_from_rk_pin)
  210. /* Receiver Frame Synchro (i.e. capture)
  211. * is output (format is _CFS) and the RK pin
  212. * is used for input (format is _CBM_).
  213. */
  214. mck_div = 3;
  215. break;
  216. case SND_SOC_DAIFMT_CBM_CFM:
  217. if ((ssc_p->dir_mask & SSC_DIR_MASK_PLAYBACK)
  218. && !ssc->clk_from_rk_pin)
  219. /* Transmit Frame Synchro (i.e. playback)
  220. * is input (format is _CFM) and the TK pin
  221. * is used for input (format _CBM_ but not
  222. * using the RK pin).
  223. */
  224. mck_div = 6;
  225. break;
  226. }
  227. switch (ssc_p->daifmt & SND_SOC_DAIFMT_MASTER_MASK) {
  228. case SND_SOC_DAIFMT_CBS_CFS:
  229. r.num = ssc_p->mck_rate / mck_div / frame_size;
  230. ret = snd_interval_ratnum(i, 1, &r, &num, &den);
  231. if (ret >= 0 && den && rule->var == SNDRV_PCM_HW_PARAM_RATE) {
  232. params->rate_num = num;
  233. params->rate_den = den;
  234. }
  235. break;
  236. case SND_SOC_DAIFMT_CBM_CFS:
  237. case SND_SOC_DAIFMT_CBM_CFM:
  238. t.min = 8000;
  239. t.max = ssc_p->mck_rate / mck_div / frame_size;
  240. t.openmin = t.openmax = 0;
  241. t.integer = 0;
  242. ret = snd_interval_refine(i, &t);
  243. break;
  244. default:
  245. ret = -EINVAL;
  246. break;
  247. }
  248. return ret;
  249. }
  250. /*-------------------------------------------------------------------------*\
  251. * DAI functions
  252. \*-------------------------------------------------------------------------*/
  253. /*
  254. * Startup. Only that one substream allowed in each direction.
  255. */
  256. static int atmel_ssc_startup(struct snd_pcm_substream *substream,
  257. struct snd_soc_dai *dai)
  258. {
  259. struct atmel_ssc_info *ssc_p = &ssc_info[dai->id];
  260. struct atmel_pcm_dma_params *dma_params;
  261. int dir, dir_mask;
  262. int ret;
  263. pr_debug("atmel_ssc_startup: SSC_SR=0x%x\n",
  264. ssc_readl(ssc_p->ssc->regs, SR));
  265. /* Enable PMC peripheral clock for this SSC */
  266. pr_debug("atmel_ssc_dai: Starting clock\n");
  267. clk_enable(ssc_p->ssc->clk);
  268. ssc_p->mck_rate = clk_get_rate(ssc_p->ssc->clk);
  269. /* Reset the SSC to keep it at a clean status */
  270. ssc_writel(ssc_p->ssc->regs, CR, SSC_BIT(CR_SWRST));
  271. if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
  272. dir = 0;
  273. dir_mask = SSC_DIR_MASK_PLAYBACK;
  274. } else {
  275. dir = 1;
  276. dir_mask = SSC_DIR_MASK_CAPTURE;
  277. }
  278. ret = snd_pcm_hw_rule_add(substream->runtime, 0,
  279. SNDRV_PCM_HW_PARAM_RATE,
  280. atmel_ssc_hw_rule_rate,
  281. ssc_p,
  282. SNDRV_PCM_HW_PARAM_FRAME_BITS,
  283. SNDRV_PCM_HW_PARAM_CHANNELS, -1);
  284. if (ret < 0) {
  285. dev_err(dai->dev, "Failed to specify rate rule: %d\n", ret);
  286. return ret;
  287. }
  288. dma_params = &ssc_dma_params[dai->id][dir];
  289. dma_params->ssc = ssc_p->ssc;
  290. dma_params->substream = substream;
  291. ssc_p->dma_params[dir] = dma_params;
  292. snd_soc_dai_set_dma_data(dai, substream, dma_params);
  293. spin_lock_irq(&ssc_p->lock);
  294. if (ssc_p->dir_mask & dir_mask) {
  295. spin_unlock_irq(&ssc_p->lock);
  296. return -EBUSY;
  297. }
  298. ssc_p->dir_mask |= dir_mask;
  299. spin_unlock_irq(&ssc_p->lock);
  300. return 0;
  301. }
  302. /*
  303. * Shutdown. Clear DMA parameters and shutdown the SSC if there
  304. * are no other substreams open.
  305. */
  306. static void atmel_ssc_shutdown(struct snd_pcm_substream *substream,
  307. struct snd_soc_dai *dai)
  308. {
  309. struct atmel_ssc_info *ssc_p = &ssc_info[dai->id];
  310. struct atmel_pcm_dma_params *dma_params;
  311. int dir, dir_mask;
  312. if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
  313. dir = 0;
  314. else
  315. dir = 1;
  316. dma_params = ssc_p->dma_params[dir];
  317. if (dma_params != NULL) {
  318. dma_params->ssc = NULL;
  319. dma_params->substream = NULL;
  320. ssc_p->dma_params[dir] = NULL;
  321. }
  322. dir_mask = 1 << dir;
  323. spin_lock_irq(&ssc_p->lock);
  324. ssc_p->dir_mask &= ~dir_mask;
  325. if (!ssc_p->dir_mask) {
  326. if (ssc_p->initialized) {
  327. free_irq(ssc_p->ssc->irq, ssc_p);
  328. ssc_p->initialized = 0;
  329. }
  330. /* Reset the SSC */
  331. ssc_writel(ssc_p->ssc->regs, CR, SSC_BIT(CR_SWRST));
  332. /* Clear the SSC dividers */
  333. ssc_p->cmr_div = ssc_p->tcmr_period = ssc_p->rcmr_period = 0;
  334. }
  335. spin_unlock_irq(&ssc_p->lock);
  336. /* Shutdown the SSC clock. */
  337. pr_debug("atmel_ssc_dai: Stopping clock\n");
  338. clk_disable(ssc_p->ssc->clk);
  339. }
  340. /*
  341. * Record the DAI format for use in hw_params().
  342. */
  343. static int atmel_ssc_set_dai_fmt(struct snd_soc_dai *cpu_dai,
  344. unsigned int fmt)
  345. {
  346. struct atmel_ssc_info *ssc_p = &ssc_info[cpu_dai->id];
  347. ssc_p->daifmt = fmt;
  348. return 0;
  349. }
  350. /*
  351. * Record SSC clock dividers for use in hw_params().
  352. */
  353. static int atmel_ssc_set_dai_clkdiv(struct snd_soc_dai *cpu_dai,
  354. int div_id, int div)
  355. {
  356. struct atmel_ssc_info *ssc_p = &ssc_info[cpu_dai->id];
  357. switch (div_id) {
  358. case ATMEL_SSC_CMR_DIV:
  359. /*
  360. * The same master clock divider is used for both
  361. * transmit and receive, so if a value has already
  362. * been set, it must match this value.
  363. */
  364. if (ssc_p->dir_mask !=
  365. (SSC_DIR_MASK_PLAYBACK | SSC_DIR_MASK_CAPTURE))
  366. ssc_p->cmr_div = div;
  367. else if (ssc_p->cmr_div == 0)
  368. ssc_p->cmr_div = div;
  369. else
  370. if (div != ssc_p->cmr_div)
  371. return -EBUSY;
  372. break;
  373. case ATMEL_SSC_TCMR_PERIOD:
  374. ssc_p->tcmr_period = div;
  375. break;
  376. case ATMEL_SSC_RCMR_PERIOD:
  377. ssc_p->rcmr_period = div;
  378. break;
  379. default:
  380. return -EINVAL;
  381. }
  382. return 0;
  383. }
  384. /*
  385. * Configure the SSC.
  386. */
  387. static int atmel_ssc_hw_params(struct snd_pcm_substream *substream,
  388. struct snd_pcm_hw_params *params,
  389. struct snd_soc_dai *dai)
  390. {
  391. int id = dai->id;
  392. struct atmel_ssc_info *ssc_p = &ssc_info[id];
  393. struct ssc_device *ssc = ssc_p->ssc;
  394. struct atmel_pcm_dma_params *dma_params;
  395. int dir, channels, bits;
  396. u32 tfmr, rfmr, tcmr, rcmr;
  397. int ret;
  398. int fslen, fslen_ext;
  399. /*
  400. * Currently, there is only one set of dma params for
  401. * each direction. If more are added, this code will
  402. * have to be changed to select the proper set.
  403. */
  404. if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
  405. dir = 0;
  406. else
  407. dir = 1;
  408. dma_params = ssc_p->dma_params[dir];
  409. channels = params_channels(params);
  410. /*
  411. * Determine sample size in bits and the PDC increment.
  412. */
  413. switch (params_format(params)) {
  414. case SNDRV_PCM_FORMAT_S8:
  415. bits = 8;
  416. dma_params->pdc_xfer_size = 1;
  417. break;
  418. case SNDRV_PCM_FORMAT_S16_LE:
  419. bits = 16;
  420. dma_params->pdc_xfer_size = 2;
  421. break;
  422. case SNDRV_PCM_FORMAT_S24_LE:
  423. bits = 24;
  424. dma_params->pdc_xfer_size = 4;
  425. break;
  426. case SNDRV_PCM_FORMAT_S32_LE:
  427. bits = 32;
  428. dma_params->pdc_xfer_size = 4;
  429. break;
  430. default:
  431. printk(KERN_WARNING "atmel_ssc_dai: unsupported PCM format");
  432. return -EINVAL;
  433. }
  434. /*
  435. * Compute SSC register settings.
  436. */
  437. switch (ssc_p->daifmt
  438. & (SND_SOC_DAIFMT_FORMAT_MASK | SND_SOC_DAIFMT_MASTER_MASK)) {
  439. case SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_CBS_CFS:
  440. /*
  441. * I2S format, SSC provides BCLK and LRC clocks.
  442. *
  443. * The SSC transmit and receive clocks are generated
  444. * from the MCK divider, and the BCLK signal
  445. * is output on the SSC TK line.
  446. */
  447. if (bits > 16 && !ssc->pdata->has_fslen_ext) {
  448. dev_err(dai->dev,
  449. "sample size %d is too large for SSC device\n",
  450. bits);
  451. return -EINVAL;
  452. }
  453. fslen_ext = (bits - 1) / 16;
  454. fslen = (bits - 1) % 16;
  455. rcmr = SSC_BF(RCMR_PERIOD, ssc_p->rcmr_period)
  456. | SSC_BF(RCMR_STTDLY, START_DELAY)
  457. | SSC_BF(RCMR_START, SSC_START_FALLING_RF)
  458. | SSC_BF(RCMR_CKI, SSC_CKI_RISING)
  459. | SSC_BF(RCMR_CKO, SSC_CKO_NONE)
  460. | SSC_BF(RCMR_CKS, SSC_CKS_DIV);
  461. rfmr = SSC_BF(RFMR_FSLEN_EXT, fslen_ext)
  462. | SSC_BF(RFMR_FSEDGE, SSC_FSEDGE_POSITIVE)
  463. | SSC_BF(RFMR_FSOS, SSC_FSOS_NEGATIVE)
  464. | SSC_BF(RFMR_FSLEN, fslen)
  465. | SSC_BF(RFMR_DATNB, (channels - 1))
  466. | SSC_BIT(RFMR_MSBF)
  467. | SSC_BF(RFMR_LOOP, 0)
  468. | SSC_BF(RFMR_DATLEN, (bits - 1));
  469. tcmr = SSC_BF(TCMR_PERIOD, ssc_p->tcmr_period)
  470. | SSC_BF(TCMR_STTDLY, START_DELAY)
  471. | SSC_BF(TCMR_START, SSC_START_FALLING_RF)
  472. | SSC_BF(TCMR_CKI, SSC_CKI_FALLING)
  473. | SSC_BF(TCMR_CKO, SSC_CKO_CONTINUOUS)
  474. | SSC_BF(TCMR_CKS, SSC_CKS_DIV);
  475. tfmr = SSC_BF(TFMR_FSLEN_EXT, fslen_ext)
  476. | SSC_BF(TFMR_FSEDGE, SSC_FSEDGE_POSITIVE)
  477. | SSC_BF(TFMR_FSDEN, 0)
  478. | SSC_BF(TFMR_FSOS, SSC_FSOS_NEGATIVE)
  479. | SSC_BF(TFMR_FSLEN, fslen)
  480. | SSC_BF(TFMR_DATNB, (channels - 1))
  481. | SSC_BIT(TFMR_MSBF)
  482. | SSC_BF(TFMR_DATDEF, 0)
  483. | SSC_BF(TFMR_DATLEN, (bits - 1));
  484. break;
  485. case SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_CBM_CFM:
  486. /* I2S format, CODEC supplies BCLK and LRC clocks. */
  487. rcmr = SSC_BF(RCMR_PERIOD, 0)
  488. | SSC_BF(RCMR_STTDLY, START_DELAY)
  489. | SSC_BF(RCMR_START, SSC_START_FALLING_RF)
  490. | SSC_BF(RCMR_CKI, SSC_CKI_RISING)
  491. | SSC_BF(RCMR_CKO, SSC_CKO_NONE)
  492. | SSC_BF(RCMR_CKS, ssc->clk_from_rk_pin ?
  493. SSC_CKS_PIN : SSC_CKS_CLOCK);
  494. rfmr = SSC_BF(RFMR_FSEDGE, SSC_FSEDGE_POSITIVE)
  495. | SSC_BF(RFMR_FSOS, SSC_FSOS_NONE)
  496. | SSC_BF(RFMR_FSLEN, 0)
  497. | SSC_BF(RFMR_DATNB, (channels - 1))
  498. | SSC_BIT(RFMR_MSBF)
  499. | SSC_BF(RFMR_LOOP, 0)
  500. | SSC_BF(RFMR_DATLEN, (bits - 1));
  501. tcmr = SSC_BF(TCMR_PERIOD, 0)
  502. | SSC_BF(TCMR_STTDLY, START_DELAY)
  503. | SSC_BF(TCMR_START, SSC_START_FALLING_RF)
  504. | SSC_BF(TCMR_CKI, SSC_CKI_FALLING)
  505. | SSC_BF(TCMR_CKO, SSC_CKO_NONE)
  506. | SSC_BF(TCMR_CKS, ssc->clk_from_rk_pin ?
  507. SSC_CKS_CLOCK : SSC_CKS_PIN);
  508. tfmr = SSC_BF(TFMR_FSEDGE, SSC_FSEDGE_POSITIVE)
  509. | SSC_BF(TFMR_FSDEN, 0)
  510. | SSC_BF(TFMR_FSOS, SSC_FSOS_NONE)
  511. | SSC_BF(TFMR_FSLEN, 0)
  512. | SSC_BF(TFMR_DATNB, (channels - 1))
  513. | SSC_BIT(TFMR_MSBF)
  514. | SSC_BF(TFMR_DATDEF, 0)
  515. | SSC_BF(TFMR_DATLEN, (bits - 1));
  516. break;
  517. case SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_CBM_CFS:
  518. /* I2S format, CODEC supplies BCLK, SSC supplies LRCLK. */
  519. if (bits > 16 && !ssc->pdata->has_fslen_ext) {
  520. dev_err(dai->dev,
  521. "sample size %d is too large for SSC device\n",
  522. bits);
  523. return -EINVAL;
  524. }
  525. fslen_ext = (bits - 1) / 16;
  526. fslen = (bits - 1) % 16;
  527. rcmr = SSC_BF(RCMR_PERIOD, ssc_p->rcmr_period)
  528. | SSC_BF(RCMR_STTDLY, START_DELAY)
  529. | SSC_BF(RCMR_START, SSC_START_FALLING_RF)
  530. | SSC_BF(RCMR_CKI, SSC_CKI_RISING)
  531. | SSC_BF(RCMR_CKO, SSC_CKO_NONE)
  532. | SSC_BF(RCMR_CKS, ssc->clk_from_rk_pin ?
  533. SSC_CKS_PIN : SSC_CKS_CLOCK);
  534. rfmr = SSC_BF(RFMR_FSLEN_EXT, fslen_ext)
  535. | SSC_BF(RFMR_FSEDGE, SSC_FSEDGE_POSITIVE)
  536. | SSC_BF(RFMR_FSOS, SSC_FSOS_NEGATIVE)
  537. | SSC_BF(RFMR_FSLEN, fslen)
  538. | SSC_BF(RFMR_DATNB, (channels - 1))
  539. | SSC_BIT(RFMR_MSBF)
  540. | SSC_BF(RFMR_LOOP, 0)
  541. | SSC_BF(RFMR_DATLEN, (bits - 1));
  542. tcmr = SSC_BF(TCMR_PERIOD, ssc_p->tcmr_period)
  543. | SSC_BF(TCMR_STTDLY, START_DELAY)
  544. | SSC_BF(TCMR_START, SSC_START_FALLING_RF)
  545. | SSC_BF(TCMR_CKI, SSC_CKI_FALLING)
  546. | SSC_BF(TCMR_CKO, SSC_CKO_NONE)
  547. | SSC_BF(TCMR_CKS, ssc->clk_from_rk_pin ?
  548. SSC_CKS_CLOCK : SSC_CKS_PIN);
  549. tfmr = SSC_BF(TFMR_FSLEN_EXT, fslen_ext)
  550. | SSC_BF(TFMR_FSEDGE, SSC_FSEDGE_NEGATIVE)
  551. | SSC_BF(TFMR_FSDEN, 0)
  552. | SSC_BF(TFMR_FSOS, SSC_FSOS_NEGATIVE)
  553. | SSC_BF(TFMR_FSLEN, fslen)
  554. | SSC_BF(TFMR_DATNB, (channels - 1))
  555. | SSC_BIT(TFMR_MSBF)
  556. | SSC_BF(TFMR_DATDEF, 0)
  557. | SSC_BF(TFMR_DATLEN, (bits - 1));
  558. break;
  559. case SND_SOC_DAIFMT_DSP_A | SND_SOC_DAIFMT_CBS_CFS:
  560. /*
  561. * DSP/PCM Mode A format, SSC provides BCLK and LRC clocks.
  562. *
  563. * The SSC transmit and receive clocks are generated from the
  564. * MCK divider, and the BCLK signal is output
  565. * on the SSC TK line.
  566. */
  567. rcmr = SSC_BF(RCMR_PERIOD, ssc_p->rcmr_period)
  568. | SSC_BF(RCMR_STTDLY, 1)
  569. | SSC_BF(RCMR_START, SSC_START_RISING_RF)
  570. | SSC_BF(RCMR_CKI, SSC_CKI_FALLING)
  571. | SSC_BF(RCMR_CKO, SSC_CKO_NONE)
  572. | SSC_BF(RCMR_CKS, SSC_CKS_DIV);
  573. rfmr = SSC_BF(RFMR_FSEDGE, SSC_FSEDGE_POSITIVE)
  574. | SSC_BF(RFMR_FSOS, SSC_FSOS_POSITIVE)
  575. | SSC_BF(RFMR_FSLEN, 0)
  576. | SSC_BF(RFMR_DATNB, (channels - 1))
  577. | SSC_BIT(RFMR_MSBF)
  578. | SSC_BF(RFMR_LOOP, 0)
  579. | SSC_BF(RFMR_DATLEN, (bits - 1));
  580. tcmr = SSC_BF(TCMR_PERIOD, ssc_p->tcmr_period)
  581. | SSC_BF(TCMR_STTDLY, 1)
  582. | SSC_BF(TCMR_START, SSC_START_RISING_RF)
  583. | SSC_BF(TCMR_CKI, SSC_CKI_FALLING)
  584. | SSC_BF(TCMR_CKO, SSC_CKO_CONTINUOUS)
  585. | SSC_BF(TCMR_CKS, SSC_CKS_DIV);
  586. tfmr = SSC_BF(TFMR_FSEDGE, SSC_FSEDGE_POSITIVE)
  587. | SSC_BF(TFMR_FSDEN, 0)
  588. | SSC_BF(TFMR_FSOS, SSC_FSOS_POSITIVE)
  589. | SSC_BF(TFMR_FSLEN, 0)
  590. | SSC_BF(TFMR_DATNB, (channels - 1))
  591. | SSC_BIT(TFMR_MSBF)
  592. | SSC_BF(TFMR_DATDEF, 0)
  593. | SSC_BF(TFMR_DATLEN, (bits - 1));
  594. break;
  595. case SND_SOC_DAIFMT_DSP_A | SND_SOC_DAIFMT_CBM_CFM:
  596. /*
  597. * DSP/PCM Mode A format, CODEC supplies BCLK and LRC clocks.
  598. *
  599. * Data is transferred on first BCLK after LRC pulse rising
  600. * edge.If stereo, the right channel data is contiguous with
  601. * the left channel data.
  602. */
  603. rcmr = SSC_BF(RCMR_PERIOD, 0)
  604. | SSC_BF(RCMR_STTDLY, START_DELAY)
  605. | SSC_BF(RCMR_START, SSC_START_RISING_RF)
  606. | SSC_BF(RCMR_CKI, SSC_CKI_FALLING)
  607. | SSC_BF(RCMR_CKO, SSC_CKO_NONE)
  608. | SSC_BF(RCMR_CKS, ssc->clk_from_rk_pin ?
  609. SSC_CKS_PIN : SSC_CKS_CLOCK);
  610. rfmr = SSC_BF(RFMR_FSEDGE, SSC_FSEDGE_POSITIVE)
  611. | SSC_BF(RFMR_FSOS, SSC_FSOS_NONE)
  612. | SSC_BF(RFMR_FSLEN, 0)
  613. | SSC_BF(RFMR_DATNB, (channels - 1))
  614. | SSC_BIT(RFMR_MSBF)
  615. | SSC_BF(RFMR_LOOP, 0)
  616. | SSC_BF(RFMR_DATLEN, (bits - 1));
  617. tcmr = SSC_BF(TCMR_PERIOD, 0)
  618. | SSC_BF(TCMR_STTDLY, START_DELAY)
  619. | SSC_BF(TCMR_START, SSC_START_RISING_RF)
  620. | SSC_BF(TCMR_CKI, SSC_CKI_FALLING)
  621. | SSC_BF(TCMR_CKO, SSC_CKO_NONE)
  622. | SSC_BF(RCMR_CKS, ssc->clk_from_rk_pin ?
  623. SSC_CKS_CLOCK : SSC_CKS_PIN);
  624. tfmr = SSC_BF(TFMR_FSEDGE, SSC_FSEDGE_POSITIVE)
  625. | SSC_BF(TFMR_FSDEN, 0)
  626. | SSC_BF(TFMR_FSOS, SSC_FSOS_NONE)
  627. | SSC_BF(TFMR_FSLEN, 0)
  628. | SSC_BF(TFMR_DATNB, (channels - 1))
  629. | SSC_BIT(TFMR_MSBF)
  630. | SSC_BF(TFMR_DATDEF, 0)
  631. | SSC_BF(TFMR_DATLEN, (bits - 1));
  632. break;
  633. default:
  634. printk(KERN_WARNING "atmel_ssc_dai: unsupported DAI format 0x%x\n",
  635. ssc_p->daifmt);
  636. return -EINVAL;
  637. }
  638. pr_debug("atmel_ssc_hw_params: "
  639. "RCMR=%08x RFMR=%08x TCMR=%08x TFMR=%08x\n",
  640. rcmr, rfmr, tcmr, tfmr);
  641. if (!ssc_p->initialized) {
  642. if (!ssc_p->ssc->pdata->use_dma) {
  643. ssc_writel(ssc_p->ssc->regs, PDC_RPR, 0);
  644. ssc_writel(ssc_p->ssc->regs, PDC_RCR, 0);
  645. ssc_writel(ssc_p->ssc->regs, PDC_RNPR, 0);
  646. ssc_writel(ssc_p->ssc->regs, PDC_RNCR, 0);
  647. ssc_writel(ssc_p->ssc->regs, PDC_TPR, 0);
  648. ssc_writel(ssc_p->ssc->regs, PDC_TCR, 0);
  649. ssc_writel(ssc_p->ssc->regs, PDC_TNPR, 0);
  650. ssc_writel(ssc_p->ssc->regs, PDC_TNCR, 0);
  651. }
  652. ret = request_irq(ssc_p->ssc->irq, atmel_ssc_interrupt, 0,
  653. ssc_p->name, ssc_p);
  654. if (ret < 0) {
  655. printk(KERN_WARNING
  656. "atmel_ssc_dai: request_irq failure\n");
  657. pr_debug("Atmel_ssc_dai: Stoping clock\n");
  658. clk_disable(ssc_p->ssc->clk);
  659. return ret;
  660. }
  661. ssc_p->initialized = 1;
  662. }
  663. /* set SSC clock mode register */
  664. ssc_writel(ssc_p->ssc->regs, CMR, ssc_p->cmr_div);
  665. /* set receive clock mode and format */
  666. ssc_writel(ssc_p->ssc->regs, RCMR, rcmr);
  667. ssc_writel(ssc_p->ssc->regs, RFMR, rfmr);
  668. /* set transmit clock mode and format */
  669. ssc_writel(ssc_p->ssc->regs, TCMR, tcmr);
  670. ssc_writel(ssc_p->ssc->regs, TFMR, tfmr);
  671. pr_debug("atmel_ssc_dai,hw_params: SSC initialized\n");
  672. return 0;
  673. }
  674. static int atmel_ssc_prepare(struct snd_pcm_substream *substream,
  675. struct snd_soc_dai *dai)
  676. {
  677. struct atmel_ssc_info *ssc_p = &ssc_info[dai->id];
  678. struct atmel_pcm_dma_params *dma_params;
  679. int dir;
  680. if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
  681. dir = 0;
  682. else
  683. dir = 1;
  684. dma_params = ssc_p->dma_params[dir];
  685. ssc_writel(ssc_p->ssc->regs, CR, dma_params->mask->ssc_disable);
  686. ssc_writel(ssc_p->ssc->regs, IDR, dma_params->mask->ssc_error);
  687. pr_debug("%s enabled SSC_SR=0x%08x\n",
  688. dir ? "receive" : "transmit",
  689. ssc_readl(ssc_p->ssc->regs, SR));
  690. return 0;
  691. }
  692. static int atmel_ssc_trigger(struct snd_pcm_substream *substream,
  693. int cmd, struct snd_soc_dai *dai)
  694. {
  695. struct atmel_ssc_info *ssc_p = &ssc_info[dai->id];
  696. struct atmel_pcm_dma_params *dma_params;
  697. int dir;
  698. if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
  699. dir = 0;
  700. else
  701. dir = 1;
  702. dma_params = ssc_p->dma_params[dir];
  703. switch (cmd) {
  704. case SNDRV_PCM_TRIGGER_START:
  705. case SNDRV_PCM_TRIGGER_RESUME:
  706. case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
  707. ssc_writel(ssc_p->ssc->regs, CR, dma_params->mask->ssc_enable);
  708. break;
  709. default:
  710. ssc_writel(ssc_p->ssc->regs, CR, dma_params->mask->ssc_disable);
  711. break;
  712. }
  713. return 0;
  714. }
  715. #ifdef CONFIG_PM
  716. static int atmel_ssc_suspend(struct snd_soc_dai *cpu_dai)
  717. {
  718. struct atmel_ssc_info *ssc_p;
  719. if (!cpu_dai->active)
  720. return 0;
  721. ssc_p = &ssc_info[cpu_dai->id];
  722. /* Save the status register before disabling transmit and receive */
  723. ssc_p->ssc_state.ssc_sr = ssc_readl(ssc_p->ssc->regs, SR);
  724. ssc_writel(ssc_p->ssc->regs, CR, SSC_BIT(CR_TXDIS) | SSC_BIT(CR_RXDIS));
  725. /* Save the current interrupt mask, then disable unmasked interrupts */
  726. ssc_p->ssc_state.ssc_imr = ssc_readl(ssc_p->ssc->regs, IMR);
  727. ssc_writel(ssc_p->ssc->regs, IDR, ssc_p->ssc_state.ssc_imr);
  728. ssc_p->ssc_state.ssc_cmr = ssc_readl(ssc_p->ssc->regs, CMR);
  729. ssc_p->ssc_state.ssc_rcmr = ssc_readl(ssc_p->ssc->regs, RCMR);
  730. ssc_p->ssc_state.ssc_rfmr = ssc_readl(ssc_p->ssc->regs, RFMR);
  731. ssc_p->ssc_state.ssc_tcmr = ssc_readl(ssc_p->ssc->regs, TCMR);
  732. ssc_p->ssc_state.ssc_tfmr = ssc_readl(ssc_p->ssc->regs, TFMR);
  733. return 0;
  734. }
  735. static int atmel_ssc_resume(struct snd_soc_dai *cpu_dai)
  736. {
  737. struct atmel_ssc_info *ssc_p;
  738. u32 cr;
  739. if (!cpu_dai->active)
  740. return 0;
  741. ssc_p = &ssc_info[cpu_dai->id];
  742. /* restore SSC register settings */
  743. ssc_writel(ssc_p->ssc->regs, TFMR, ssc_p->ssc_state.ssc_tfmr);
  744. ssc_writel(ssc_p->ssc->regs, TCMR, ssc_p->ssc_state.ssc_tcmr);
  745. ssc_writel(ssc_p->ssc->regs, RFMR, ssc_p->ssc_state.ssc_rfmr);
  746. ssc_writel(ssc_p->ssc->regs, RCMR, ssc_p->ssc_state.ssc_rcmr);
  747. ssc_writel(ssc_p->ssc->regs, CMR, ssc_p->ssc_state.ssc_cmr);
  748. /* re-enable interrupts */
  749. ssc_writel(ssc_p->ssc->regs, IER, ssc_p->ssc_state.ssc_imr);
  750. /* Re-enable receive and transmit as appropriate */
  751. cr = 0;
  752. cr |=
  753. (ssc_p->ssc_state.ssc_sr & SSC_BIT(SR_RXEN)) ? SSC_BIT(CR_RXEN) : 0;
  754. cr |=
  755. (ssc_p->ssc_state.ssc_sr & SSC_BIT(SR_TXEN)) ? SSC_BIT(CR_TXEN) : 0;
  756. ssc_writel(ssc_p->ssc->regs, CR, cr);
  757. return 0;
  758. }
  759. #else /* CONFIG_PM */
  760. # define atmel_ssc_suspend NULL
  761. # define atmel_ssc_resume NULL
  762. #endif /* CONFIG_PM */
  763. #define ATMEL_SSC_FORMATS (SNDRV_PCM_FMTBIT_S8 | SNDRV_PCM_FMTBIT_S16_LE |\
  764. SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S32_LE)
  765. static const struct snd_soc_dai_ops atmel_ssc_dai_ops = {
  766. .startup = atmel_ssc_startup,
  767. .shutdown = atmel_ssc_shutdown,
  768. .prepare = atmel_ssc_prepare,
  769. .trigger = atmel_ssc_trigger,
  770. .hw_params = atmel_ssc_hw_params,
  771. .set_fmt = atmel_ssc_set_dai_fmt,
  772. .set_clkdiv = atmel_ssc_set_dai_clkdiv,
  773. };
  774. static struct snd_soc_dai_driver atmel_ssc_dai = {
  775. .suspend = atmel_ssc_suspend,
  776. .resume = atmel_ssc_resume,
  777. .playback = {
  778. .channels_min = 1,
  779. .channels_max = 2,
  780. .rates = SNDRV_PCM_RATE_CONTINUOUS,
  781. .rate_min = 8000,
  782. .rate_max = 384000,
  783. .formats = ATMEL_SSC_FORMATS,},
  784. .capture = {
  785. .channels_min = 1,
  786. .channels_max = 2,
  787. .rates = SNDRV_PCM_RATE_CONTINUOUS,
  788. .rate_min = 8000,
  789. .rate_max = 384000,
  790. .formats = ATMEL_SSC_FORMATS,},
  791. .ops = &atmel_ssc_dai_ops,
  792. };
  793. static const struct snd_soc_component_driver atmel_ssc_component = {
  794. .name = "atmel-ssc",
  795. };
  796. static int asoc_ssc_init(struct device *dev)
  797. {
  798. struct platform_device *pdev = to_platform_device(dev);
  799. struct ssc_device *ssc = platform_get_drvdata(pdev);
  800. int ret;
  801. ret = snd_soc_register_component(dev, &atmel_ssc_component,
  802. &atmel_ssc_dai, 1);
  803. if (ret) {
  804. dev_err(dev, "Could not register DAI: %d\n", ret);
  805. goto err;
  806. }
  807. if (ssc->pdata->use_dma)
  808. ret = atmel_pcm_dma_platform_register(dev);
  809. else
  810. ret = atmel_pcm_pdc_platform_register(dev);
  811. if (ret) {
  812. dev_err(dev, "Could not register PCM: %d\n", ret);
  813. goto err_unregister_dai;
  814. }
  815. return 0;
  816. err_unregister_dai:
  817. snd_soc_unregister_component(dev);
  818. err:
  819. return ret;
  820. }
  821. static void asoc_ssc_exit(struct device *dev)
  822. {
  823. struct platform_device *pdev = to_platform_device(dev);
  824. struct ssc_device *ssc = platform_get_drvdata(pdev);
  825. if (ssc->pdata->use_dma)
  826. atmel_pcm_dma_platform_unregister(dev);
  827. else
  828. atmel_pcm_pdc_platform_unregister(dev);
  829. snd_soc_unregister_component(dev);
  830. }
  831. /**
  832. * atmel_ssc_set_audio - Allocate the specified SSC for audio use.
  833. */
  834. int atmel_ssc_set_audio(int ssc_id)
  835. {
  836. struct ssc_device *ssc;
  837. int ret;
  838. /* If we can grab the SSC briefly to parent the DAI device off it */
  839. ssc = ssc_request(ssc_id);
  840. if (IS_ERR(ssc)) {
  841. pr_err("Unable to parent ASoC SSC DAI on SSC: %ld\n",
  842. PTR_ERR(ssc));
  843. return PTR_ERR(ssc);
  844. } else {
  845. ssc_info[ssc_id].ssc = ssc;
  846. }
  847. ret = asoc_ssc_init(&ssc->pdev->dev);
  848. return ret;
  849. }
  850. EXPORT_SYMBOL_GPL(atmel_ssc_set_audio);
  851. void atmel_ssc_put_audio(int ssc_id)
  852. {
  853. struct ssc_device *ssc = ssc_info[ssc_id].ssc;
  854. asoc_ssc_exit(&ssc->pdev->dev);
  855. ssc_free(ssc);
  856. }
  857. EXPORT_SYMBOL_GPL(atmel_ssc_put_audio);
  858. /* Module information */
  859. MODULE_AUTHOR("Sedji Gaouaou, sedji.gaouaou@atmel.com, www.atmel.com");
  860. MODULE_DESCRIPTION("ATMEL SSC ASoC Interface");
  861. MODULE_LICENSE("GPL");