ac97c.c 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * Driver for Atmel AC97C
  4. *
  5. * Copyright (C) 2005-2009 Atmel Corporation
  6. */
  7. #include <linux/clk.h>
  8. #include <linux/delay.h>
  9. #include <linux/bitmap.h>
  10. #include <linux/device.h>
  11. #include <linux/atmel_pdc.h>
  12. #include <linux/gpio/consumer.h>
  13. #include <linux/init.h>
  14. #include <linux/interrupt.h>
  15. #include <linux/mod_devicetable.h>
  16. #include <linux/module.h>
  17. #include <linux/platform_device.h>
  18. #include <linux/mutex.h>
  19. #include <linux/types.h>
  20. #include <linux/io.h>
  21. #include <sound/core.h>
  22. #include <sound/initval.h>
  23. #include <sound/pcm.h>
  24. #include <sound/pcm_params.h>
  25. #include <sound/ac97_codec.h>
  26. #include <sound/memalloc.h>
  27. #include "ac97c.h"
  28. /* Serialize access to opened variable */
  29. static DEFINE_MUTEX(opened_mutex);
  30. struct atmel_ac97c {
  31. struct clk *pclk;
  32. struct platform_device *pdev;
  33. struct snd_pcm_substream *playback_substream;
  34. struct snd_pcm_substream *capture_substream;
  35. struct snd_card *card;
  36. struct snd_pcm *pcm;
  37. struct snd_ac97 *ac97;
  38. struct snd_ac97_bus *ac97_bus;
  39. u64 cur_format;
  40. unsigned int cur_rate;
  41. int playback_period, capture_period;
  42. /* Serialize access to opened variable */
  43. spinlock_t lock;
  44. void __iomem *regs;
  45. int irq;
  46. int opened;
  47. struct gpio_desc *reset_pin;
  48. };
  49. #define get_chip(card) ((struct atmel_ac97c *)(card)->private_data)
  50. #define ac97c_writel(chip, reg, val) \
  51. __raw_writel((val), (chip)->regs + AC97C_##reg)
  52. #define ac97c_readl(chip, reg) \
  53. __raw_readl((chip)->regs + AC97C_##reg)
  54. static const struct snd_pcm_hardware atmel_ac97c_hw = {
  55. .info = (SNDRV_PCM_INFO_MMAP
  56. | SNDRV_PCM_INFO_MMAP_VALID
  57. | SNDRV_PCM_INFO_INTERLEAVED
  58. | SNDRV_PCM_INFO_BLOCK_TRANSFER
  59. | SNDRV_PCM_INFO_JOINT_DUPLEX
  60. | SNDRV_PCM_INFO_RESUME
  61. | SNDRV_PCM_INFO_PAUSE),
  62. .formats = (SNDRV_PCM_FMTBIT_S16_BE
  63. | SNDRV_PCM_FMTBIT_S16_LE),
  64. .rates = (SNDRV_PCM_RATE_CONTINUOUS),
  65. .rate_min = 4000,
  66. .rate_max = 48000,
  67. .channels_min = 1,
  68. .channels_max = 2,
  69. .buffer_bytes_max = 2 * 2 * 64 * 2048,
  70. .period_bytes_min = 4096,
  71. .period_bytes_max = 4096,
  72. .periods_min = 6,
  73. .periods_max = 64,
  74. };
  75. static int atmel_ac97c_playback_open(struct snd_pcm_substream *substream)
  76. {
  77. struct atmel_ac97c *chip = snd_pcm_substream_chip(substream);
  78. struct snd_pcm_runtime *runtime = substream->runtime;
  79. mutex_lock(&opened_mutex);
  80. chip->opened++;
  81. runtime->hw = atmel_ac97c_hw;
  82. if (chip->cur_rate) {
  83. runtime->hw.rate_min = chip->cur_rate;
  84. runtime->hw.rate_max = chip->cur_rate;
  85. }
  86. if (chip->cur_format)
  87. runtime->hw.formats = pcm_format_to_bits(chip->cur_format);
  88. mutex_unlock(&opened_mutex);
  89. chip->playback_substream = substream;
  90. return 0;
  91. }
  92. static int atmel_ac97c_capture_open(struct snd_pcm_substream *substream)
  93. {
  94. struct atmel_ac97c *chip = snd_pcm_substream_chip(substream);
  95. struct snd_pcm_runtime *runtime = substream->runtime;
  96. mutex_lock(&opened_mutex);
  97. chip->opened++;
  98. runtime->hw = atmel_ac97c_hw;
  99. if (chip->cur_rate) {
  100. runtime->hw.rate_min = chip->cur_rate;
  101. runtime->hw.rate_max = chip->cur_rate;
  102. }
  103. if (chip->cur_format)
  104. runtime->hw.formats = pcm_format_to_bits(chip->cur_format);
  105. mutex_unlock(&opened_mutex);
  106. chip->capture_substream = substream;
  107. return 0;
  108. }
  109. static int atmel_ac97c_playback_close(struct snd_pcm_substream *substream)
  110. {
  111. struct atmel_ac97c *chip = snd_pcm_substream_chip(substream);
  112. mutex_lock(&opened_mutex);
  113. chip->opened--;
  114. if (!chip->opened) {
  115. chip->cur_rate = 0;
  116. chip->cur_format = 0;
  117. }
  118. mutex_unlock(&opened_mutex);
  119. chip->playback_substream = NULL;
  120. return 0;
  121. }
  122. static int atmel_ac97c_capture_close(struct snd_pcm_substream *substream)
  123. {
  124. struct atmel_ac97c *chip = snd_pcm_substream_chip(substream);
  125. mutex_lock(&opened_mutex);
  126. chip->opened--;
  127. if (!chip->opened) {
  128. chip->cur_rate = 0;
  129. chip->cur_format = 0;
  130. }
  131. mutex_unlock(&opened_mutex);
  132. chip->capture_substream = NULL;
  133. return 0;
  134. }
  135. static int atmel_ac97c_playback_hw_params(struct snd_pcm_substream *substream,
  136. struct snd_pcm_hw_params *hw_params)
  137. {
  138. struct atmel_ac97c *chip = snd_pcm_substream_chip(substream);
  139. /* Set restrictions to params. */
  140. mutex_lock(&opened_mutex);
  141. chip->cur_rate = params_rate(hw_params);
  142. chip->cur_format = params_format(hw_params);
  143. mutex_unlock(&opened_mutex);
  144. return 0;
  145. }
  146. static int atmel_ac97c_capture_hw_params(struct snd_pcm_substream *substream,
  147. struct snd_pcm_hw_params *hw_params)
  148. {
  149. struct atmel_ac97c *chip = snd_pcm_substream_chip(substream);
  150. /* Set restrictions to params. */
  151. mutex_lock(&opened_mutex);
  152. chip->cur_rate = params_rate(hw_params);
  153. chip->cur_format = params_format(hw_params);
  154. mutex_unlock(&opened_mutex);
  155. return 0;
  156. }
  157. static int atmel_ac97c_playback_prepare(struct snd_pcm_substream *substream)
  158. {
  159. struct atmel_ac97c *chip = snd_pcm_substream_chip(substream);
  160. struct snd_pcm_runtime *runtime = substream->runtime;
  161. int block_size = frames_to_bytes(runtime, runtime->period_size);
  162. unsigned long word = ac97c_readl(chip, OCA);
  163. int retval;
  164. chip->playback_period = 0;
  165. word &= ~(AC97C_CH_MASK(PCM_LEFT) | AC97C_CH_MASK(PCM_RIGHT));
  166. /* assign channels to AC97C channel A */
  167. switch (runtime->channels) {
  168. case 1:
  169. word |= AC97C_CH_ASSIGN(PCM_LEFT, A);
  170. break;
  171. case 2:
  172. word |= AC97C_CH_ASSIGN(PCM_LEFT, A)
  173. | AC97C_CH_ASSIGN(PCM_RIGHT, A);
  174. break;
  175. default:
  176. /* TODO: support more than two channels */
  177. return -EINVAL;
  178. }
  179. ac97c_writel(chip, OCA, word);
  180. /* configure sample format and size */
  181. word = ac97c_readl(chip, CAMR);
  182. if (chip->opened <= 1)
  183. word = AC97C_CMR_DMAEN | AC97C_CMR_SIZE_16;
  184. else
  185. word |= AC97C_CMR_DMAEN | AC97C_CMR_SIZE_16;
  186. switch (runtime->format) {
  187. case SNDRV_PCM_FORMAT_S16_LE:
  188. break;
  189. case SNDRV_PCM_FORMAT_S16_BE:
  190. word &= ~(AC97C_CMR_CEM_LITTLE);
  191. break;
  192. default:
  193. word = ac97c_readl(chip, OCA);
  194. word &= ~(AC97C_CH_MASK(PCM_LEFT) | AC97C_CH_MASK(PCM_RIGHT));
  195. ac97c_writel(chip, OCA, word);
  196. return -EINVAL;
  197. }
  198. /* Enable underrun interrupt on channel A */
  199. word |= AC97C_CSR_UNRUN;
  200. ac97c_writel(chip, CAMR, word);
  201. /* Enable channel A event interrupt */
  202. word = ac97c_readl(chip, IMR);
  203. word |= AC97C_SR_CAEVT;
  204. ac97c_writel(chip, IER, word);
  205. /* set variable rate if needed */
  206. if (runtime->rate != 48000) {
  207. word = ac97c_readl(chip, MR);
  208. word |= AC97C_MR_VRA;
  209. ac97c_writel(chip, MR, word);
  210. } else {
  211. word = ac97c_readl(chip, MR);
  212. word &= ~(AC97C_MR_VRA);
  213. ac97c_writel(chip, MR, word);
  214. }
  215. retval = snd_ac97_set_rate(chip->ac97, AC97_PCM_FRONT_DAC_RATE,
  216. runtime->rate);
  217. if (retval)
  218. dev_dbg(&chip->pdev->dev, "could not set rate %d Hz\n",
  219. runtime->rate);
  220. /* Initialize and start the PDC */
  221. writel(runtime->dma_addr, chip->regs + ATMEL_PDC_TPR);
  222. writel(block_size / 2, chip->regs + ATMEL_PDC_TCR);
  223. writel(runtime->dma_addr + block_size, chip->regs + ATMEL_PDC_TNPR);
  224. writel(block_size / 2, chip->regs + ATMEL_PDC_TNCR);
  225. return retval;
  226. }
  227. static int atmel_ac97c_capture_prepare(struct snd_pcm_substream *substream)
  228. {
  229. struct atmel_ac97c *chip = snd_pcm_substream_chip(substream);
  230. struct snd_pcm_runtime *runtime = substream->runtime;
  231. int block_size = frames_to_bytes(runtime, runtime->period_size);
  232. unsigned long word = ac97c_readl(chip, ICA);
  233. int retval;
  234. chip->capture_period = 0;
  235. word &= ~(AC97C_CH_MASK(PCM_LEFT) | AC97C_CH_MASK(PCM_RIGHT));
  236. /* assign channels to AC97C channel A */
  237. switch (runtime->channels) {
  238. case 1:
  239. word |= AC97C_CH_ASSIGN(PCM_LEFT, A);
  240. break;
  241. case 2:
  242. word |= AC97C_CH_ASSIGN(PCM_LEFT, A)
  243. | AC97C_CH_ASSIGN(PCM_RIGHT, A);
  244. break;
  245. default:
  246. /* TODO: support more than two channels */
  247. return -EINVAL;
  248. }
  249. ac97c_writel(chip, ICA, word);
  250. /* configure sample format and size */
  251. word = ac97c_readl(chip, CAMR);
  252. if (chip->opened <= 1)
  253. word = AC97C_CMR_DMAEN | AC97C_CMR_SIZE_16;
  254. else
  255. word |= AC97C_CMR_DMAEN | AC97C_CMR_SIZE_16;
  256. switch (runtime->format) {
  257. case SNDRV_PCM_FORMAT_S16_LE:
  258. break;
  259. case SNDRV_PCM_FORMAT_S16_BE:
  260. word &= ~(AC97C_CMR_CEM_LITTLE);
  261. break;
  262. default:
  263. word = ac97c_readl(chip, ICA);
  264. word &= ~(AC97C_CH_MASK(PCM_LEFT) | AC97C_CH_MASK(PCM_RIGHT));
  265. ac97c_writel(chip, ICA, word);
  266. return -EINVAL;
  267. }
  268. /* Enable overrun interrupt on channel A */
  269. word |= AC97C_CSR_OVRUN;
  270. ac97c_writel(chip, CAMR, word);
  271. /* Enable channel A event interrupt */
  272. word = ac97c_readl(chip, IMR);
  273. word |= AC97C_SR_CAEVT;
  274. ac97c_writel(chip, IER, word);
  275. /* set variable rate if needed */
  276. if (runtime->rate != 48000) {
  277. word = ac97c_readl(chip, MR);
  278. word |= AC97C_MR_VRA;
  279. ac97c_writel(chip, MR, word);
  280. } else {
  281. word = ac97c_readl(chip, MR);
  282. word &= ~(AC97C_MR_VRA);
  283. ac97c_writel(chip, MR, word);
  284. }
  285. retval = snd_ac97_set_rate(chip->ac97, AC97_PCM_LR_ADC_RATE,
  286. runtime->rate);
  287. if (retval)
  288. dev_dbg(&chip->pdev->dev, "could not set rate %d Hz\n",
  289. runtime->rate);
  290. /* Initialize and start the PDC */
  291. writel(runtime->dma_addr, chip->regs + ATMEL_PDC_RPR);
  292. writel(block_size / 2, chip->regs + ATMEL_PDC_RCR);
  293. writel(runtime->dma_addr + block_size, chip->regs + ATMEL_PDC_RNPR);
  294. writel(block_size / 2, chip->regs + ATMEL_PDC_RNCR);
  295. return retval;
  296. }
  297. static int
  298. atmel_ac97c_playback_trigger(struct snd_pcm_substream *substream, int cmd)
  299. {
  300. struct atmel_ac97c *chip = snd_pcm_substream_chip(substream);
  301. unsigned long camr, ptcr = 0;
  302. camr = ac97c_readl(chip, CAMR);
  303. switch (cmd) {
  304. case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
  305. case SNDRV_PCM_TRIGGER_RESUME:
  306. case SNDRV_PCM_TRIGGER_START:
  307. ptcr = ATMEL_PDC_TXTEN;
  308. camr |= AC97C_CMR_CENA | AC97C_CSR_ENDTX;
  309. break;
  310. case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
  311. case SNDRV_PCM_TRIGGER_SUSPEND:
  312. case SNDRV_PCM_TRIGGER_STOP:
  313. ptcr |= ATMEL_PDC_TXTDIS;
  314. if (chip->opened <= 1)
  315. camr &= ~AC97C_CMR_CENA;
  316. break;
  317. default:
  318. return -EINVAL;
  319. }
  320. ac97c_writel(chip, CAMR, camr);
  321. writel(ptcr, chip->regs + ATMEL_PDC_PTCR);
  322. return 0;
  323. }
  324. static int
  325. atmel_ac97c_capture_trigger(struct snd_pcm_substream *substream, int cmd)
  326. {
  327. struct atmel_ac97c *chip = snd_pcm_substream_chip(substream);
  328. unsigned long camr, ptcr = 0;
  329. camr = ac97c_readl(chip, CAMR);
  330. ptcr = readl(chip->regs + ATMEL_PDC_PTSR);
  331. switch (cmd) {
  332. case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
  333. case SNDRV_PCM_TRIGGER_RESUME:
  334. case SNDRV_PCM_TRIGGER_START:
  335. ptcr = ATMEL_PDC_RXTEN;
  336. camr |= AC97C_CMR_CENA | AC97C_CSR_ENDRX;
  337. break;
  338. case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
  339. case SNDRV_PCM_TRIGGER_SUSPEND:
  340. case SNDRV_PCM_TRIGGER_STOP:
  341. ptcr |= ATMEL_PDC_RXTDIS;
  342. if (chip->opened <= 1)
  343. camr &= ~AC97C_CMR_CENA;
  344. break;
  345. default:
  346. return -EINVAL;
  347. }
  348. ac97c_writel(chip, CAMR, camr);
  349. writel(ptcr, chip->regs + ATMEL_PDC_PTCR);
  350. return 0;
  351. }
  352. static snd_pcm_uframes_t
  353. atmel_ac97c_playback_pointer(struct snd_pcm_substream *substream)
  354. {
  355. struct atmel_ac97c *chip = snd_pcm_substream_chip(substream);
  356. struct snd_pcm_runtime *runtime = substream->runtime;
  357. snd_pcm_uframes_t frames;
  358. unsigned long bytes;
  359. bytes = readl(chip->regs + ATMEL_PDC_TPR);
  360. bytes -= runtime->dma_addr;
  361. frames = bytes_to_frames(runtime, bytes);
  362. if (frames >= runtime->buffer_size)
  363. frames -= runtime->buffer_size;
  364. return frames;
  365. }
  366. static snd_pcm_uframes_t
  367. atmel_ac97c_capture_pointer(struct snd_pcm_substream *substream)
  368. {
  369. struct atmel_ac97c *chip = snd_pcm_substream_chip(substream);
  370. struct snd_pcm_runtime *runtime = substream->runtime;
  371. snd_pcm_uframes_t frames;
  372. unsigned long bytes;
  373. bytes = readl(chip->regs + ATMEL_PDC_RPR);
  374. bytes -= runtime->dma_addr;
  375. frames = bytes_to_frames(runtime, bytes);
  376. if (frames >= runtime->buffer_size)
  377. frames -= runtime->buffer_size;
  378. return frames;
  379. }
  380. static const struct snd_pcm_ops atmel_ac97_playback_ops = {
  381. .open = atmel_ac97c_playback_open,
  382. .close = atmel_ac97c_playback_close,
  383. .hw_params = atmel_ac97c_playback_hw_params,
  384. .prepare = atmel_ac97c_playback_prepare,
  385. .trigger = atmel_ac97c_playback_trigger,
  386. .pointer = atmel_ac97c_playback_pointer,
  387. };
  388. static const struct snd_pcm_ops atmel_ac97_capture_ops = {
  389. .open = atmel_ac97c_capture_open,
  390. .close = atmel_ac97c_capture_close,
  391. .hw_params = atmel_ac97c_capture_hw_params,
  392. .prepare = atmel_ac97c_capture_prepare,
  393. .trigger = atmel_ac97c_capture_trigger,
  394. .pointer = atmel_ac97c_capture_pointer,
  395. };
  396. static irqreturn_t atmel_ac97c_interrupt(int irq, void *dev)
  397. {
  398. struct atmel_ac97c *chip = (struct atmel_ac97c *)dev;
  399. irqreturn_t retval = IRQ_NONE;
  400. u32 sr = ac97c_readl(chip, SR);
  401. u32 casr = ac97c_readl(chip, CASR);
  402. u32 cosr = ac97c_readl(chip, COSR);
  403. u32 camr = ac97c_readl(chip, CAMR);
  404. if (sr & AC97C_SR_CAEVT) {
  405. struct snd_pcm_runtime *runtime;
  406. int offset, next_period, block_size;
  407. dev_dbg(&chip->pdev->dev, "channel A event%s%s%s%s%s%s\n",
  408. (casr & AC97C_CSR_OVRUN) ? " OVRUN" : "",
  409. (casr & AC97C_CSR_RXRDY) ? " RXRDY" : "",
  410. (casr & AC97C_CSR_UNRUN) ? " UNRUN" : "",
  411. (casr & AC97C_CSR_TXEMPTY) ? " TXEMPTY" : "",
  412. (casr & AC97C_CSR_TXRDY) ? " TXRDY" : "",
  413. !casr ? " NONE" : "");
  414. if ((casr & camr) & AC97C_CSR_ENDTX) {
  415. runtime = chip->playback_substream->runtime;
  416. block_size = frames_to_bytes(runtime, runtime->period_size);
  417. chip->playback_period++;
  418. if (chip->playback_period == runtime->periods)
  419. chip->playback_period = 0;
  420. next_period = chip->playback_period + 1;
  421. if (next_period == runtime->periods)
  422. next_period = 0;
  423. offset = block_size * next_period;
  424. writel(runtime->dma_addr + offset, chip->regs + ATMEL_PDC_TNPR);
  425. writel(block_size / 2, chip->regs + ATMEL_PDC_TNCR);
  426. snd_pcm_period_elapsed(chip->playback_substream);
  427. }
  428. if ((casr & camr) & AC97C_CSR_ENDRX) {
  429. runtime = chip->capture_substream->runtime;
  430. block_size = frames_to_bytes(runtime, runtime->period_size);
  431. chip->capture_period++;
  432. if (chip->capture_period == runtime->periods)
  433. chip->capture_period = 0;
  434. next_period = chip->capture_period + 1;
  435. if (next_period == runtime->periods)
  436. next_period = 0;
  437. offset = block_size * next_period;
  438. writel(runtime->dma_addr + offset, chip->regs + ATMEL_PDC_RNPR);
  439. writel(block_size / 2, chip->regs + ATMEL_PDC_RNCR);
  440. snd_pcm_period_elapsed(chip->capture_substream);
  441. }
  442. retval = IRQ_HANDLED;
  443. }
  444. if (sr & AC97C_SR_COEVT) {
  445. dev_info(&chip->pdev->dev, "codec channel event%s%s%s%s%s\n",
  446. (cosr & AC97C_CSR_OVRUN) ? " OVRUN" : "",
  447. (cosr & AC97C_CSR_RXRDY) ? " RXRDY" : "",
  448. (cosr & AC97C_CSR_TXEMPTY) ? " TXEMPTY" : "",
  449. (cosr & AC97C_CSR_TXRDY) ? " TXRDY" : "",
  450. !cosr ? " NONE" : "");
  451. retval = IRQ_HANDLED;
  452. }
  453. if (retval == IRQ_NONE) {
  454. dev_err(&chip->pdev->dev, "spurious interrupt sr 0x%08x "
  455. "casr 0x%08x cosr 0x%08x\n", sr, casr, cosr);
  456. }
  457. return retval;
  458. }
  459. static const struct ac97_pcm at91_ac97_pcm_defs[] = {
  460. /* Playback */
  461. {
  462. .exclusive = 1,
  463. .r = { {
  464. .slots = ((1 << AC97_SLOT_PCM_LEFT)
  465. | (1 << AC97_SLOT_PCM_RIGHT)),
  466. } },
  467. },
  468. /* PCM in */
  469. {
  470. .stream = 1,
  471. .exclusive = 1,
  472. .r = { {
  473. .slots = ((1 << AC97_SLOT_PCM_LEFT)
  474. | (1 << AC97_SLOT_PCM_RIGHT)),
  475. } }
  476. },
  477. /* Mic in */
  478. {
  479. .stream = 1,
  480. .exclusive = 1,
  481. .r = { {
  482. .slots = (1<<AC97_SLOT_MIC),
  483. } }
  484. },
  485. };
  486. static int atmel_ac97c_pcm_new(struct atmel_ac97c *chip)
  487. {
  488. struct snd_pcm *pcm;
  489. struct snd_pcm_hardware hw = atmel_ac97c_hw;
  490. int retval;
  491. retval = snd_ac97_pcm_assign(chip->ac97_bus,
  492. ARRAY_SIZE(at91_ac97_pcm_defs),
  493. at91_ac97_pcm_defs);
  494. if (retval)
  495. return retval;
  496. retval = snd_pcm_new(chip->card, chip->card->shortname, 0, 1, 1, &pcm);
  497. if (retval)
  498. return retval;
  499. snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, &atmel_ac97_capture_ops);
  500. snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, &atmel_ac97_playback_ops);
  501. snd_pcm_set_managed_buffer_all(pcm, SNDRV_DMA_TYPE_DEV,
  502. &chip->pdev->dev, hw.periods_min * hw.period_bytes_min,
  503. hw.buffer_bytes_max);
  504. pcm->private_data = chip;
  505. pcm->info_flags = 0;
  506. strcpy(pcm->name, chip->card->shortname);
  507. chip->pcm = pcm;
  508. return 0;
  509. }
  510. static int atmel_ac97c_mixer_new(struct atmel_ac97c *chip)
  511. {
  512. struct snd_ac97_template template;
  513. memset(&template, 0, sizeof(template));
  514. template.private_data = chip;
  515. return snd_ac97_mixer(chip->ac97_bus, &template, &chip->ac97);
  516. }
  517. static void atmel_ac97c_write(struct snd_ac97 *ac97, unsigned short reg,
  518. unsigned short val)
  519. {
  520. struct atmel_ac97c *chip = get_chip(ac97);
  521. unsigned long word;
  522. int timeout = 40;
  523. word = (reg & 0x7f) << 16 | val;
  524. do {
  525. if (ac97c_readl(chip, COSR) & AC97C_CSR_TXRDY) {
  526. ac97c_writel(chip, COTHR, word);
  527. return;
  528. }
  529. udelay(1);
  530. } while (--timeout);
  531. dev_dbg(&chip->pdev->dev, "codec write timeout\n");
  532. }
  533. static unsigned short atmel_ac97c_read(struct snd_ac97 *ac97,
  534. unsigned short reg)
  535. {
  536. struct atmel_ac97c *chip = get_chip(ac97);
  537. unsigned long word;
  538. int timeout = 40;
  539. int write = 10;
  540. word = (0x80 | (reg & 0x7f)) << 16;
  541. if ((ac97c_readl(chip, COSR) & AC97C_CSR_RXRDY) != 0)
  542. ac97c_readl(chip, CORHR);
  543. retry_write:
  544. timeout = 40;
  545. do {
  546. if ((ac97c_readl(chip, COSR) & AC97C_CSR_TXRDY) != 0) {
  547. ac97c_writel(chip, COTHR, word);
  548. goto read_reg;
  549. }
  550. udelay(10);
  551. } while (--timeout);
  552. if (!--write)
  553. goto timed_out;
  554. goto retry_write;
  555. read_reg:
  556. do {
  557. if ((ac97c_readl(chip, COSR) & AC97C_CSR_RXRDY) != 0) {
  558. unsigned short val = ac97c_readl(chip, CORHR);
  559. return val;
  560. }
  561. udelay(10);
  562. } while (--timeout);
  563. if (!--write)
  564. goto timed_out;
  565. goto retry_write;
  566. timed_out:
  567. dev_dbg(&chip->pdev->dev, "codec read timeout\n");
  568. return 0xffff;
  569. }
  570. static void atmel_ac97c_reset(struct atmel_ac97c *chip)
  571. {
  572. ac97c_writel(chip, MR, 0);
  573. ac97c_writel(chip, MR, AC97C_MR_ENA);
  574. ac97c_writel(chip, CAMR, 0);
  575. ac97c_writel(chip, COMR, 0);
  576. if (!IS_ERR(chip->reset_pin)) {
  577. gpiod_set_value(chip->reset_pin, 0);
  578. /* AC97 v2.2 specifications says minimum 1 us. */
  579. udelay(2);
  580. gpiod_set_value(chip->reset_pin, 1);
  581. } else {
  582. ac97c_writel(chip, MR, AC97C_MR_WRST | AC97C_MR_ENA);
  583. udelay(2);
  584. ac97c_writel(chip, MR, AC97C_MR_ENA);
  585. }
  586. }
  587. static const struct of_device_id atmel_ac97c_dt_ids[] = {
  588. { .compatible = "atmel,at91sam9263-ac97c", },
  589. { }
  590. };
  591. MODULE_DEVICE_TABLE(of, atmel_ac97c_dt_ids);
  592. static int atmel_ac97c_probe(struct platform_device *pdev)
  593. {
  594. struct device *dev = &pdev->dev;
  595. struct snd_card *card;
  596. struct atmel_ac97c *chip;
  597. struct resource *regs;
  598. struct clk *pclk;
  599. static const struct snd_ac97_bus_ops ops = {
  600. .write = atmel_ac97c_write,
  601. .read = atmel_ac97c_read,
  602. };
  603. int retval;
  604. int irq;
  605. regs = platform_get_resource(pdev, IORESOURCE_MEM, 0);
  606. if (!regs) {
  607. dev_dbg(&pdev->dev, "no memory resource\n");
  608. return -ENXIO;
  609. }
  610. irq = platform_get_irq(pdev, 0);
  611. if (irq < 0) {
  612. dev_dbg(&pdev->dev, "could not get irq: %d\n", irq);
  613. return irq;
  614. }
  615. pclk = clk_get(&pdev->dev, "ac97_clk");
  616. if (IS_ERR(pclk)) {
  617. dev_dbg(&pdev->dev, "no peripheral clock\n");
  618. return PTR_ERR(pclk);
  619. }
  620. retval = clk_prepare_enable(pclk);
  621. if (retval)
  622. goto err_prepare_enable;
  623. retval = snd_card_new(&pdev->dev, SNDRV_DEFAULT_IDX1,
  624. SNDRV_DEFAULT_STR1, THIS_MODULE,
  625. sizeof(struct atmel_ac97c), &card);
  626. if (retval) {
  627. dev_dbg(&pdev->dev, "could not create sound card device\n");
  628. goto err_snd_card_new;
  629. }
  630. chip = get_chip(card);
  631. retval = request_irq(irq, atmel_ac97c_interrupt, 0, "AC97C", chip);
  632. if (retval) {
  633. dev_dbg(&pdev->dev, "unable to request irq %d\n", irq);
  634. goto err_request_irq;
  635. }
  636. chip->irq = irq;
  637. spin_lock_init(&chip->lock);
  638. strcpy(card->driver, "Atmel AC97C");
  639. strcpy(card->shortname, "Atmel AC97C");
  640. sprintf(card->longname, "Atmel AC97 controller");
  641. chip->card = card;
  642. chip->pclk = pclk;
  643. chip->pdev = pdev;
  644. chip->regs = ioremap(regs->start, resource_size(regs));
  645. if (!chip->regs) {
  646. dev_dbg(&pdev->dev, "could not remap register memory\n");
  647. retval = -ENOMEM;
  648. goto err_ioremap;
  649. }
  650. chip->reset_pin = devm_gpiod_get_index(dev, "ac97", 2, GPIOD_OUT_HIGH);
  651. if (IS_ERR(chip->reset_pin))
  652. dev_dbg(dev, "reset pin not available\n");
  653. atmel_ac97c_reset(chip);
  654. /* Enable overrun interrupt from codec channel */
  655. ac97c_writel(chip, COMR, AC97C_CSR_OVRUN);
  656. ac97c_writel(chip, IER, ac97c_readl(chip, IMR) | AC97C_SR_COEVT);
  657. retval = snd_ac97_bus(card, 0, &ops, chip, &chip->ac97_bus);
  658. if (retval) {
  659. dev_dbg(&pdev->dev, "could not register on ac97 bus\n");
  660. goto err_ac97_bus;
  661. }
  662. retval = atmel_ac97c_mixer_new(chip);
  663. if (retval) {
  664. dev_dbg(&pdev->dev, "could not register ac97 mixer\n");
  665. goto err_ac97_bus;
  666. }
  667. retval = atmel_ac97c_pcm_new(chip);
  668. if (retval) {
  669. dev_dbg(&pdev->dev, "could not register ac97 pcm device\n");
  670. goto err_ac97_bus;
  671. }
  672. retval = snd_card_register(card);
  673. if (retval) {
  674. dev_dbg(&pdev->dev, "could not register sound card\n");
  675. goto err_ac97_bus;
  676. }
  677. platform_set_drvdata(pdev, card);
  678. dev_info(&pdev->dev, "Atmel AC97 controller at 0x%p, irq = %d\n",
  679. chip->regs, irq);
  680. return 0;
  681. err_ac97_bus:
  682. iounmap(chip->regs);
  683. err_ioremap:
  684. free_irq(irq, chip);
  685. err_request_irq:
  686. snd_card_free(card);
  687. err_snd_card_new:
  688. clk_disable_unprepare(pclk);
  689. err_prepare_enable:
  690. clk_put(pclk);
  691. return retval;
  692. }
  693. #ifdef CONFIG_PM_SLEEP
  694. static int atmel_ac97c_suspend(struct device *pdev)
  695. {
  696. struct snd_card *card = dev_get_drvdata(pdev);
  697. struct atmel_ac97c *chip = card->private_data;
  698. clk_disable_unprepare(chip->pclk);
  699. return 0;
  700. }
  701. static int atmel_ac97c_resume(struct device *pdev)
  702. {
  703. struct snd_card *card = dev_get_drvdata(pdev);
  704. struct atmel_ac97c *chip = card->private_data;
  705. int ret = clk_prepare_enable(chip->pclk);
  706. return ret;
  707. }
  708. static SIMPLE_DEV_PM_OPS(atmel_ac97c_pm, atmel_ac97c_suspend, atmel_ac97c_resume);
  709. #define ATMEL_AC97C_PM_OPS &atmel_ac97c_pm
  710. #else
  711. #define ATMEL_AC97C_PM_OPS NULL
  712. #endif
  713. static void atmel_ac97c_remove(struct platform_device *pdev)
  714. {
  715. struct snd_card *card = platform_get_drvdata(pdev);
  716. struct atmel_ac97c *chip = get_chip(card);
  717. ac97c_writel(chip, CAMR, 0);
  718. ac97c_writel(chip, COMR, 0);
  719. ac97c_writel(chip, MR, 0);
  720. clk_disable_unprepare(chip->pclk);
  721. clk_put(chip->pclk);
  722. iounmap(chip->regs);
  723. free_irq(chip->irq, chip);
  724. snd_card_free(card);
  725. }
  726. static struct platform_driver atmel_ac97c_driver = {
  727. .probe = atmel_ac97c_probe,
  728. .remove_new = atmel_ac97c_remove,
  729. .driver = {
  730. .name = "atmel_ac97c",
  731. .pm = ATMEL_AC97C_PM_OPS,
  732. .of_match_table = atmel_ac97c_dt_ids,
  733. },
  734. };
  735. module_platform_driver(atmel_ac97c_driver);
  736. MODULE_LICENSE("GPL");
  737. MODULE_DESCRIPTION("Driver for Atmel AC97 controller");
  738. MODULE_AUTHOR("Hans-Christian Egtvedt <egtvedt@samfundet.no>");