ac97c.c 24 KB

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