acp-pcm-dma.c 29 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045
  1. /*
  2. * AMD ALSA SoC PCM Driver for ACP 2.x
  3. *
  4. * Copyright 2014-2015 Advanced Micro Devices, Inc.
  5. *
  6. * This program is free software; you can redistribute it and/or modify it
  7. * under the terms and conditions of the GNU General Public License,
  8. * version 2, as published by the Free Software Foundation.
  9. *
  10. * This program is distributed in the hope it will be useful, but WITHOUT
  11. * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  12. * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  13. * more details.
  14. */
  15. #include <linux/module.h>
  16. #include <linux/delay.h>
  17. #include <linux/io.h>
  18. #include <linux/sizes.h>
  19. #include <linux/pm_runtime.h>
  20. #include <sound/soc.h>
  21. #include "acp.h"
  22. #define PLAYBACK_MIN_NUM_PERIODS 2
  23. #define PLAYBACK_MAX_NUM_PERIODS 2
  24. #define PLAYBACK_MAX_PERIOD_SIZE 16384
  25. #define PLAYBACK_MIN_PERIOD_SIZE 1024
  26. #define CAPTURE_MIN_NUM_PERIODS 2
  27. #define CAPTURE_MAX_NUM_PERIODS 2
  28. #define CAPTURE_MAX_PERIOD_SIZE 16384
  29. #define CAPTURE_MIN_PERIOD_SIZE 1024
  30. #define MAX_BUFFER (PLAYBACK_MAX_PERIOD_SIZE * PLAYBACK_MAX_NUM_PERIODS)
  31. #define MIN_BUFFER MAX_BUFFER
  32. static const struct snd_pcm_hardware acp_pcm_hardware_playback = {
  33. .info = SNDRV_PCM_INFO_INTERLEAVED |
  34. SNDRV_PCM_INFO_BLOCK_TRANSFER | SNDRV_PCM_INFO_MMAP |
  35. SNDRV_PCM_INFO_MMAP_VALID | SNDRV_PCM_INFO_BATCH |
  36. SNDRV_PCM_INFO_PAUSE | SNDRV_PCM_INFO_RESUME,
  37. .formats = SNDRV_PCM_FMTBIT_S16_LE |
  38. SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S32_LE,
  39. .channels_min = 1,
  40. .channels_max = 8,
  41. .rates = SNDRV_PCM_RATE_8000_96000,
  42. .rate_min = 8000,
  43. .rate_max = 96000,
  44. .buffer_bytes_max = PLAYBACK_MAX_NUM_PERIODS * PLAYBACK_MAX_PERIOD_SIZE,
  45. .period_bytes_min = PLAYBACK_MIN_PERIOD_SIZE,
  46. .period_bytes_max = PLAYBACK_MAX_PERIOD_SIZE,
  47. .periods_min = PLAYBACK_MIN_NUM_PERIODS,
  48. .periods_max = PLAYBACK_MAX_NUM_PERIODS,
  49. };
  50. static const struct snd_pcm_hardware acp_pcm_hardware_capture = {
  51. .info = SNDRV_PCM_INFO_INTERLEAVED |
  52. SNDRV_PCM_INFO_BLOCK_TRANSFER | SNDRV_PCM_INFO_MMAP |
  53. SNDRV_PCM_INFO_MMAP_VALID | SNDRV_PCM_INFO_BATCH |
  54. SNDRV_PCM_INFO_PAUSE | SNDRV_PCM_INFO_RESUME,
  55. .formats = SNDRV_PCM_FMTBIT_S16_LE |
  56. SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S32_LE,
  57. .channels_min = 1,
  58. .channels_max = 2,
  59. .rates = SNDRV_PCM_RATE_8000_48000,
  60. .rate_min = 8000,
  61. .rate_max = 48000,
  62. .buffer_bytes_max = CAPTURE_MAX_NUM_PERIODS * CAPTURE_MAX_PERIOD_SIZE,
  63. .period_bytes_min = CAPTURE_MIN_PERIOD_SIZE,
  64. .period_bytes_max = CAPTURE_MAX_PERIOD_SIZE,
  65. .periods_min = CAPTURE_MIN_NUM_PERIODS,
  66. .periods_max = CAPTURE_MAX_NUM_PERIODS,
  67. };
  68. struct audio_drv_data {
  69. struct snd_pcm_substream *play_stream;
  70. struct snd_pcm_substream *capture_stream;
  71. void __iomem *acp_mmio;
  72. };
  73. static u32 acp_reg_read(void __iomem *acp_mmio, u32 reg)
  74. {
  75. return readl(acp_mmio + (reg * 4));
  76. }
  77. static void acp_reg_write(u32 val, void __iomem *acp_mmio, u32 reg)
  78. {
  79. writel(val, acp_mmio + (reg * 4));
  80. }
  81. /* Configure a given dma channel parameters - enable/disble,
  82. * number of descriptors, priority
  83. */
  84. static void config_acp_dma_channel(void __iomem *acp_mmio, u8 ch_num,
  85. u16 dscr_strt_idx, u16 num_dscrs,
  86. enum acp_dma_priority_level priority_level)
  87. {
  88. u32 dma_ctrl;
  89. /* disable the channel run field */
  90. dma_ctrl = acp_reg_read(acp_mmio, mmACP_DMA_CNTL_0 + ch_num);
  91. dma_ctrl &= ~ACP_DMA_CNTL_0__DMAChRun_MASK;
  92. acp_reg_write(dma_ctrl, acp_mmio, mmACP_DMA_CNTL_0 + ch_num);
  93. /* program a DMA channel with first descriptor to be processed. */
  94. acp_reg_write((ACP_DMA_DSCR_STRT_IDX_0__DMAChDscrStrtIdx_MASK
  95. & dscr_strt_idx),
  96. acp_mmio, mmACP_DMA_DSCR_STRT_IDX_0 + ch_num);
  97. /* program a DMA channel with the number of descriptors to be
  98. * processed in the transfer
  99. */
  100. acp_reg_write(ACP_DMA_DSCR_CNT_0__DMAChDscrCnt_MASK & num_dscrs,
  101. acp_mmio, mmACP_DMA_DSCR_CNT_0 + ch_num);
  102. /* set DMA channel priority */
  103. acp_reg_write(priority_level, acp_mmio, mmACP_DMA_PRIO_0 + ch_num);
  104. }
  105. /* Initialize a dma descriptor in SRAM based on descritor information passed */
  106. static void config_dma_descriptor_in_sram(void __iomem *acp_mmio,
  107. u16 descr_idx,
  108. acp_dma_dscr_transfer_t *descr_info)
  109. {
  110. u32 sram_offset;
  111. sram_offset = (descr_idx * sizeof(acp_dma_dscr_transfer_t));
  112. /* program the source base address. */
  113. acp_reg_write(sram_offset, acp_mmio, mmACP_SRBM_Targ_Idx_Addr);
  114. acp_reg_write(descr_info->src, acp_mmio, mmACP_SRBM_Targ_Idx_Data);
  115. /* program the destination base address. */
  116. acp_reg_write(sram_offset + 4, acp_mmio, mmACP_SRBM_Targ_Idx_Addr);
  117. acp_reg_write(descr_info->dest, acp_mmio, mmACP_SRBM_Targ_Idx_Data);
  118. /* program the number of bytes to be transferred for this descriptor. */
  119. acp_reg_write(sram_offset + 8, acp_mmio, mmACP_SRBM_Targ_Idx_Addr);
  120. acp_reg_write(descr_info->xfer_val, acp_mmio, mmACP_SRBM_Targ_Idx_Data);
  121. }
  122. /* Initialize the DMA descriptor information for transfer between
  123. * system memory <-> ACP SRAM
  124. */
  125. static void set_acp_sysmem_dma_descriptors(void __iomem *acp_mmio,
  126. u32 size, int direction,
  127. u32 pte_offset)
  128. {
  129. u16 i;
  130. u16 dma_dscr_idx = PLAYBACK_START_DMA_DESCR_CH12;
  131. acp_dma_dscr_transfer_t dmadscr[NUM_DSCRS_PER_CHANNEL];
  132. for (i = 0; i < NUM_DSCRS_PER_CHANNEL; i++) {
  133. dmadscr[i].xfer_val = 0;
  134. if (direction == SNDRV_PCM_STREAM_PLAYBACK) {
  135. dma_dscr_idx = PLAYBACK_START_DMA_DESCR_CH12 + i;
  136. dmadscr[i].dest = ACP_SHARED_RAM_BANK_1_ADDRESS +
  137. (size / 2) - (i * (size/2));
  138. dmadscr[i].src = ACP_INTERNAL_APERTURE_WINDOW_0_ADDRESS
  139. + (pte_offset * SZ_4K) + (i * (size/2));
  140. dmadscr[i].xfer_val |=
  141. (ACP_DMA_ATTRIBUTES_DAGB_ONION_TO_SHAREDMEM << 16) |
  142. (size / 2);
  143. } else {
  144. dma_dscr_idx = CAPTURE_START_DMA_DESCR_CH14 + i;
  145. dmadscr[i].src = ACP_SHARED_RAM_BANK_5_ADDRESS +
  146. (i * (size/2));
  147. dmadscr[i].dest = ACP_INTERNAL_APERTURE_WINDOW_0_ADDRESS
  148. + (pte_offset * SZ_4K) +
  149. (i * (size/2));
  150. dmadscr[i].xfer_val |=
  151. BIT(22) |
  152. (ACP_DMA_ATTRIBUTES_SHAREDMEM_TO_DAGB_ONION << 16) |
  153. (size / 2);
  154. }
  155. config_dma_descriptor_in_sram(acp_mmio, dma_dscr_idx,
  156. &dmadscr[i]);
  157. }
  158. if (direction == SNDRV_PCM_STREAM_PLAYBACK)
  159. config_acp_dma_channel(acp_mmio, SYSRAM_TO_ACP_CH_NUM,
  160. PLAYBACK_START_DMA_DESCR_CH12,
  161. NUM_DSCRS_PER_CHANNEL,
  162. ACP_DMA_PRIORITY_LEVEL_NORMAL);
  163. else
  164. config_acp_dma_channel(acp_mmio, ACP_TO_SYSRAM_CH_NUM,
  165. CAPTURE_START_DMA_DESCR_CH14,
  166. NUM_DSCRS_PER_CHANNEL,
  167. ACP_DMA_PRIORITY_LEVEL_NORMAL);
  168. }
  169. /* Initialize the DMA descriptor information for transfer between
  170. * ACP SRAM <-> I2S
  171. */
  172. static void set_acp_to_i2s_dma_descriptors(void __iomem *acp_mmio,
  173. u32 size, int direction)
  174. {
  175. u16 i;
  176. u16 dma_dscr_idx = PLAYBACK_START_DMA_DESCR_CH13;
  177. acp_dma_dscr_transfer_t dmadscr[NUM_DSCRS_PER_CHANNEL];
  178. for (i = 0; i < NUM_DSCRS_PER_CHANNEL; i++) {
  179. dmadscr[i].xfer_val = 0;
  180. if (direction == SNDRV_PCM_STREAM_PLAYBACK) {
  181. dma_dscr_idx = PLAYBACK_START_DMA_DESCR_CH13 + i;
  182. dmadscr[i].src = ACP_SHARED_RAM_BANK_1_ADDRESS +
  183. (i * (size/2));
  184. /* dmadscr[i].dest is unused by hardware. */
  185. dmadscr[i].dest = 0;
  186. dmadscr[i].xfer_val |= BIT(22) | (TO_ACP_I2S_1 << 16) |
  187. (size / 2);
  188. } else {
  189. dma_dscr_idx = CAPTURE_START_DMA_DESCR_CH15 + i;
  190. /* dmadscr[i].src is unused by hardware. */
  191. dmadscr[i].src = 0;
  192. dmadscr[i].dest = ACP_SHARED_RAM_BANK_5_ADDRESS +
  193. (i * (size / 2));
  194. dmadscr[i].xfer_val |= BIT(22) |
  195. (FROM_ACP_I2S_1 << 16) | (size / 2);
  196. }
  197. config_dma_descriptor_in_sram(acp_mmio, dma_dscr_idx,
  198. &dmadscr[i]);
  199. }
  200. /* Configure the DMA channel with the above descriptore */
  201. if (direction == SNDRV_PCM_STREAM_PLAYBACK)
  202. config_acp_dma_channel(acp_mmio, ACP_TO_I2S_DMA_CH_NUM,
  203. PLAYBACK_START_DMA_DESCR_CH13,
  204. NUM_DSCRS_PER_CHANNEL,
  205. ACP_DMA_PRIORITY_LEVEL_NORMAL);
  206. else
  207. config_acp_dma_channel(acp_mmio, I2S_TO_ACP_DMA_CH_NUM,
  208. CAPTURE_START_DMA_DESCR_CH15,
  209. NUM_DSCRS_PER_CHANNEL,
  210. ACP_DMA_PRIORITY_LEVEL_NORMAL);
  211. }
  212. /* Create page table entries in ACP SRAM for the allocated memory */
  213. static void acp_pte_config(void __iomem *acp_mmio, struct page *pg,
  214. u16 num_of_pages, u32 pte_offset)
  215. {
  216. u16 page_idx;
  217. u64 addr;
  218. u32 low;
  219. u32 high;
  220. u32 offset;
  221. offset = ACP_DAGB_GRP_SRBM_SRAM_BASE_OFFSET + (pte_offset * 8);
  222. for (page_idx = 0; page_idx < (num_of_pages); page_idx++) {
  223. /* Load the low address of page int ACP SRAM through SRBM */
  224. acp_reg_write((offset + (page_idx * 8)),
  225. acp_mmio, mmACP_SRBM_Targ_Idx_Addr);
  226. addr = page_to_phys(pg);
  227. low = lower_32_bits(addr);
  228. high = upper_32_bits(addr);
  229. acp_reg_write(low, acp_mmio, mmACP_SRBM_Targ_Idx_Data);
  230. /* Load the High address of page int ACP SRAM through SRBM */
  231. acp_reg_write((offset + (page_idx * 8) + 4),
  232. acp_mmio, mmACP_SRBM_Targ_Idx_Addr);
  233. /* page enable in ACP */
  234. high |= BIT(31);
  235. acp_reg_write(high, acp_mmio, mmACP_SRBM_Targ_Idx_Data);
  236. /* Move to next physically contiguos page */
  237. pg++;
  238. }
  239. }
  240. static void config_acp_dma(void __iomem *acp_mmio,
  241. struct audio_substream_data *audio_config)
  242. {
  243. u32 pte_offset;
  244. if (audio_config->direction == SNDRV_PCM_STREAM_PLAYBACK)
  245. pte_offset = ACP_PLAYBACK_PTE_OFFSET;
  246. else
  247. pte_offset = ACP_CAPTURE_PTE_OFFSET;
  248. acp_pte_config(acp_mmio, audio_config->pg, audio_config->num_of_pages,
  249. pte_offset);
  250. /* Configure System memory <-> ACP SRAM DMA descriptors */
  251. set_acp_sysmem_dma_descriptors(acp_mmio, audio_config->size,
  252. audio_config->direction, pte_offset);
  253. /* Configure ACP SRAM <-> I2S DMA descriptors */
  254. set_acp_to_i2s_dma_descriptors(acp_mmio, audio_config->size,
  255. audio_config->direction);
  256. }
  257. /* Start a given DMA channel transfer */
  258. static void acp_dma_start(void __iomem *acp_mmio,
  259. u16 ch_num, bool is_circular)
  260. {
  261. u32 dma_ctrl;
  262. /* read the dma control register and disable the channel run field */
  263. dma_ctrl = acp_reg_read(acp_mmio, mmACP_DMA_CNTL_0 + ch_num);
  264. /* Invalidating the DAGB cache */
  265. acp_reg_write(1, acp_mmio, mmACP_DAGB_ATU_CTRL);
  266. /* configure the DMA channel and start the DMA transfer
  267. * set dmachrun bit to start the transfer and enable the
  268. * interrupt on completion of the dma transfer
  269. */
  270. dma_ctrl |= ACP_DMA_CNTL_0__DMAChRun_MASK;
  271. switch (ch_num) {
  272. case ACP_TO_I2S_DMA_CH_NUM:
  273. case ACP_TO_SYSRAM_CH_NUM:
  274. case I2S_TO_ACP_DMA_CH_NUM:
  275. dma_ctrl |= ACP_DMA_CNTL_0__DMAChIOCEn_MASK;
  276. break;
  277. default:
  278. dma_ctrl &= ~ACP_DMA_CNTL_0__DMAChIOCEn_MASK;
  279. break;
  280. }
  281. /* enable for ACP SRAM to/from I2S DMA channel */
  282. if (is_circular == true)
  283. dma_ctrl |= ACP_DMA_CNTL_0__Circular_DMA_En_MASK;
  284. else
  285. dma_ctrl &= ~ACP_DMA_CNTL_0__Circular_DMA_En_MASK;
  286. acp_reg_write(dma_ctrl, acp_mmio, mmACP_DMA_CNTL_0 + ch_num);
  287. }
  288. /* Stop a given DMA channel transfer */
  289. static int acp_dma_stop(void __iomem *acp_mmio, u8 ch_num)
  290. {
  291. u32 dma_ctrl;
  292. u32 dma_ch_sts;
  293. u32 count = ACP_DMA_RESET_TIME;
  294. dma_ctrl = acp_reg_read(acp_mmio, mmACP_DMA_CNTL_0 + ch_num);
  295. /* clear the dma control register fields before writing zero
  296. * in reset bit
  297. */
  298. dma_ctrl &= ~ACP_DMA_CNTL_0__DMAChRun_MASK;
  299. dma_ctrl &= ~ACP_DMA_CNTL_0__DMAChIOCEn_MASK;
  300. acp_reg_write(dma_ctrl, acp_mmio, mmACP_DMA_CNTL_0 + ch_num);
  301. dma_ch_sts = acp_reg_read(acp_mmio, mmACP_DMA_CH_STS);
  302. if (dma_ch_sts & BIT(ch_num)) {
  303. /* set the reset bit for this channel to stop the dma
  304. * transfer
  305. */
  306. dma_ctrl |= ACP_DMA_CNTL_0__DMAChRst_MASK;
  307. acp_reg_write(dma_ctrl, acp_mmio, mmACP_DMA_CNTL_0 + ch_num);
  308. }
  309. /* check the channel status bit for some time and return the status */
  310. while (true) {
  311. dma_ch_sts = acp_reg_read(acp_mmio, mmACP_DMA_CH_STS);
  312. if (!(dma_ch_sts & BIT(ch_num))) {
  313. /* clear the reset flag after successfully stopping
  314. * the dma transfer and break from the loop
  315. */
  316. dma_ctrl &= ~ACP_DMA_CNTL_0__DMAChRst_MASK;
  317. acp_reg_write(dma_ctrl, acp_mmio, mmACP_DMA_CNTL_0
  318. + ch_num);
  319. break;
  320. }
  321. if (--count == 0) {
  322. pr_err("Failed to stop ACP DMA channel : %d\n", ch_num);
  323. return -ETIMEDOUT;
  324. }
  325. udelay(100);
  326. }
  327. return 0;
  328. }
  329. static void acp_set_sram_bank_state(void __iomem *acp_mmio, u16 bank,
  330. bool power_on)
  331. {
  332. u32 val, req_reg, sts_reg, sts_reg_mask;
  333. u32 loops = 1000;
  334. if (bank < 32) {
  335. req_reg = mmACP_MEM_SHUT_DOWN_REQ_LO;
  336. sts_reg = mmACP_MEM_SHUT_DOWN_STS_LO;
  337. sts_reg_mask = 0xFFFFFFFF;
  338. } else {
  339. bank -= 32;
  340. req_reg = mmACP_MEM_SHUT_DOWN_REQ_HI;
  341. sts_reg = mmACP_MEM_SHUT_DOWN_STS_HI;
  342. sts_reg_mask = 0x0000FFFF;
  343. }
  344. val = acp_reg_read(acp_mmio, req_reg);
  345. if (val & (1 << bank)) {
  346. /* bank is in off state */
  347. if (power_on == true)
  348. /* request to on */
  349. val &= ~(1 << bank);
  350. else
  351. /* request to off */
  352. return;
  353. } else {
  354. /* bank is in on state */
  355. if (power_on == false)
  356. /* request to off */
  357. val |= 1 << bank;
  358. else
  359. /* request to on */
  360. return;
  361. }
  362. acp_reg_write(val, acp_mmio, req_reg);
  363. while (acp_reg_read(acp_mmio, sts_reg) != sts_reg_mask) {
  364. if (!loops--) {
  365. pr_err("ACP SRAM bank %d state change failed\n", bank);
  366. break;
  367. }
  368. cpu_relax();
  369. }
  370. }
  371. /* Initialize and bring ACP hardware to default state. */
  372. static int acp_init(void __iomem *acp_mmio)
  373. {
  374. u16 bank;
  375. u32 val, count, sram_pte_offset;
  376. /* Assert Soft reset of ACP */
  377. val = acp_reg_read(acp_mmio, mmACP_SOFT_RESET);
  378. val |= ACP_SOFT_RESET__SoftResetAud_MASK;
  379. acp_reg_write(val, acp_mmio, mmACP_SOFT_RESET);
  380. count = ACP_SOFT_RESET_DONE_TIME_OUT_VALUE;
  381. while (true) {
  382. val = acp_reg_read(acp_mmio, mmACP_SOFT_RESET);
  383. if (ACP_SOFT_RESET__SoftResetAudDone_MASK ==
  384. (val & ACP_SOFT_RESET__SoftResetAudDone_MASK))
  385. break;
  386. if (--count == 0) {
  387. pr_err("Failed to reset ACP\n");
  388. return -ETIMEDOUT;
  389. }
  390. udelay(100);
  391. }
  392. /* Enable clock to ACP and wait until the clock is enabled */
  393. val = acp_reg_read(acp_mmio, mmACP_CONTROL);
  394. val = val | ACP_CONTROL__ClkEn_MASK;
  395. acp_reg_write(val, acp_mmio, mmACP_CONTROL);
  396. count = ACP_CLOCK_EN_TIME_OUT_VALUE;
  397. while (true) {
  398. val = acp_reg_read(acp_mmio, mmACP_STATUS);
  399. if (val & (u32) 0x1)
  400. break;
  401. if (--count == 0) {
  402. pr_err("Failed to reset ACP\n");
  403. return -ETIMEDOUT;
  404. }
  405. udelay(100);
  406. }
  407. /* Deassert the SOFT RESET flags */
  408. val = acp_reg_read(acp_mmio, mmACP_SOFT_RESET);
  409. val &= ~ACP_SOFT_RESET__SoftResetAud_MASK;
  410. acp_reg_write(val, acp_mmio, mmACP_SOFT_RESET);
  411. /* initiailize Onion control DAGB register */
  412. acp_reg_write(ACP_ONION_CNTL_DEFAULT, acp_mmio,
  413. mmACP_AXI2DAGB_ONION_CNTL);
  414. /* initiailize Garlic control DAGB registers */
  415. acp_reg_write(ACP_GARLIC_CNTL_DEFAULT, acp_mmio,
  416. mmACP_AXI2DAGB_GARLIC_CNTL);
  417. sram_pte_offset = ACP_DAGB_GRP_SRAM_BASE_ADDRESS |
  418. ACP_DAGB_BASE_ADDR_GRP_1__AXI2DAGBSnoopSel_MASK |
  419. ACP_DAGB_BASE_ADDR_GRP_1__AXI2DAGBTargetMemSel_MASK |
  420. ACP_DAGB_BASE_ADDR_GRP_1__AXI2DAGBGrpEnable_MASK;
  421. acp_reg_write(sram_pte_offset, acp_mmio, mmACP_DAGB_BASE_ADDR_GRP_1);
  422. acp_reg_write(ACP_PAGE_SIZE_4K_ENABLE, acp_mmio,
  423. mmACP_DAGB_PAGE_SIZE_GRP_1);
  424. acp_reg_write(ACP_SRAM_BASE_ADDRESS, acp_mmio,
  425. mmACP_DMA_DESC_BASE_ADDR);
  426. /* Num of descriptiors in SRAM 0x4, means 256 descriptors;(64 * 4) */
  427. acp_reg_write(0x4, acp_mmio, mmACP_DMA_DESC_MAX_NUM_DSCR);
  428. acp_reg_write(ACP_EXTERNAL_INTR_CNTL__DMAIOCMask_MASK,
  429. acp_mmio, mmACP_EXTERNAL_INTR_CNTL);
  430. /* When ACP_TILE_P1 is turned on, all SRAM banks get turned on.
  431. * Now, turn off all of them. This can't be done in 'poweron' of
  432. * ACP pm domain, as this requires ACP to be initialized.
  433. */
  434. for (bank = 1; bank < 48; bank++)
  435. acp_set_sram_bank_state(acp_mmio, bank, false);
  436. return 0;
  437. }
  438. /* Deintialize ACP */
  439. static int acp_deinit(void __iomem *acp_mmio)
  440. {
  441. u32 val;
  442. u32 count;
  443. /* Assert Soft reset of ACP */
  444. val = acp_reg_read(acp_mmio, mmACP_SOFT_RESET);
  445. val |= ACP_SOFT_RESET__SoftResetAud_MASK;
  446. acp_reg_write(val, acp_mmio, mmACP_SOFT_RESET);
  447. count = ACP_SOFT_RESET_DONE_TIME_OUT_VALUE;
  448. while (true) {
  449. val = acp_reg_read(acp_mmio, mmACP_SOFT_RESET);
  450. if (ACP_SOFT_RESET__SoftResetAudDone_MASK ==
  451. (val & ACP_SOFT_RESET__SoftResetAudDone_MASK))
  452. break;
  453. if (--count == 0) {
  454. pr_err("Failed to reset ACP\n");
  455. return -ETIMEDOUT;
  456. }
  457. udelay(100);
  458. }
  459. /** Disable ACP clock */
  460. val = acp_reg_read(acp_mmio, mmACP_CONTROL);
  461. val &= ~ACP_CONTROL__ClkEn_MASK;
  462. acp_reg_write(val, acp_mmio, mmACP_CONTROL);
  463. count = ACP_CLOCK_EN_TIME_OUT_VALUE;
  464. while (true) {
  465. val = acp_reg_read(acp_mmio, mmACP_STATUS);
  466. if (!(val & (u32) 0x1))
  467. break;
  468. if (--count == 0) {
  469. pr_err("Failed to reset ACP\n");
  470. return -ETIMEDOUT;
  471. }
  472. udelay(100);
  473. }
  474. return 0;
  475. }
  476. /* ACP DMA irq handler routine for playback, capture usecases */
  477. static irqreturn_t dma_irq_handler(int irq, void *arg)
  478. {
  479. u16 dscr_idx;
  480. u32 intr_flag, ext_intr_status;
  481. struct audio_drv_data *irq_data;
  482. void __iomem *acp_mmio;
  483. struct device *dev = arg;
  484. bool valid_irq = false;
  485. irq_data = dev_get_drvdata(dev);
  486. acp_mmio = irq_data->acp_mmio;
  487. ext_intr_status = acp_reg_read(acp_mmio, mmACP_EXTERNAL_INTR_STAT);
  488. intr_flag = (((ext_intr_status &
  489. ACP_EXTERNAL_INTR_STAT__DMAIOCStat_MASK) >>
  490. ACP_EXTERNAL_INTR_STAT__DMAIOCStat__SHIFT));
  491. if ((intr_flag & BIT(ACP_TO_I2S_DMA_CH_NUM)) != 0) {
  492. valid_irq = true;
  493. if (acp_reg_read(acp_mmio, mmACP_DMA_CUR_DSCR_13) ==
  494. PLAYBACK_START_DMA_DESCR_CH13)
  495. dscr_idx = PLAYBACK_START_DMA_DESCR_CH12;
  496. else
  497. dscr_idx = PLAYBACK_END_DMA_DESCR_CH12;
  498. config_acp_dma_channel(acp_mmio, SYSRAM_TO_ACP_CH_NUM, dscr_idx,
  499. 1, 0);
  500. acp_dma_start(acp_mmio, SYSRAM_TO_ACP_CH_NUM, false);
  501. snd_pcm_period_elapsed(irq_data->play_stream);
  502. acp_reg_write((intr_flag & BIT(ACP_TO_I2S_DMA_CH_NUM)) << 16,
  503. acp_mmio, mmACP_EXTERNAL_INTR_STAT);
  504. }
  505. if ((intr_flag & BIT(I2S_TO_ACP_DMA_CH_NUM)) != 0) {
  506. valid_irq = true;
  507. if (acp_reg_read(acp_mmio, mmACP_DMA_CUR_DSCR_15) ==
  508. CAPTURE_START_DMA_DESCR_CH15)
  509. dscr_idx = CAPTURE_END_DMA_DESCR_CH14;
  510. else
  511. dscr_idx = CAPTURE_START_DMA_DESCR_CH14;
  512. config_acp_dma_channel(acp_mmio, ACP_TO_SYSRAM_CH_NUM, dscr_idx,
  513. 1, 0);
  514. acp_dma_start(acp_mmio, ACP_TO_SYSRAM_CH_NUM, false);
  515. acp_reg_write((intr_flag & BIT(I2S_TO_ACP_DMA_CH_NUM)) << 16,
  516. acp_mmio, mmACP_EXTERNAL_INTR_STAT);
  517. }
  518. if ((intr_flag & BIT(ACP_TO_SYSRAM_CH_NUM)) != 0) {
  519. valid_irq = true;
  520. snd_pcm_period_elapsed(irq_data->capture_stream);
  521. acp_reg_write((intr_flag & BIT(ACP_TO_SYSRAM_CH_NUM)) << 16,
  522. acp_mmio, mmACP_EXTERNAL_INTR_STAT);
  523. }
  524. if (valid_irq)
  525. return IRQ_HANDLED;
  526. else
  527. return IRQ_NONE;
  528. }
  529. static int acp_dma_open(struct snd_pcm_substream *substream)
  530. {
  531. u16 bank;
  532. int ret = 0;
  533. struct snd_pcm_runtime *runtime = substream->runtime;
  534. struct snd_soc_pcm_runtime *prtd = substream->private_data;
  535. struct audio_drv_data *intr_data = dev_get_drvdata(prtd->platform->dev);
  536. struct audio_substream_data *adata =
  537. kzalloc(sizeof(struct audio_substream_data), GFP_KERNEL);
  538. if (adata == NULL)
  539. return -ENOMEM;
  540. if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
  541. runtime->hw = acp_pcm_hardware_playback;
  542. else
  543. runtime->hw = acp_pcm_hardware_capture;
  544. ret = snd_pcm_hw_constraint_integer(runtime,
  545. SNDRV_PCM_HW_PARAM_PERIODS);
  546. if (ret < 0) {
  547. dev_err(prtd->platform->dev, "set integer constraint failed\n");
  548. kfree(adata);
  549. return ret;
  550. }
  551. adata->acp_mmio = intr_data->acp_mmio;
  552. runtime->private_data = adata;
  553. /* Enable ACP irq, when neither playback or capture streams are
  554. * active by the time when a new stream is being opened.
  555. * This enablement is not required for another stream, if current
  556. * stream is not closed
  557. */
  558. if (!intr_data->play_stream && !intr_data->capture_stream)
  559. acp_reg_write(1, adata->acp_mmio, mmACP_EXTERNAL_INTR_ENB);
  560. if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
  561. intr_data->play_stream = substream;
  562. for (bank = 1; bank <= 4; bank++)
  563. acp_set_sram_bank_state(intr_data->acp_mmio, bank,
  564. true);
  565. } else {
  566. intr_data->capture_stream = substream;
  567. for (bank = 5; bank <= 8; bank++)
  568. acp_set_sram_bank_state(intr_data->acp_mmio, bank,
  569. true);
  570. }
  571. return 0;
  572. }
  573. static int acp_dma_hw_params(struct snd_pcm_substream *substream,
  574. struct snd_pcm_hw_params *params)
  575. {
  576. int status;
  577. uint64_t size;
  578. struct snd_dma_buffer *dma_buffer;
  579. struct page *pg;
  580. struct snd_pcm_runtime *runtime;
  581. struct audio_substream_data *rtd;
  582. dma_buffer = &substream->dma_buffer;
  583. runtime = substream->runtime;
  584. rtd = runtime->private_data;
  585. if (WARN_ON(!rtd))
  586. return -EINVAL;
  587. size = params_buffer_bytes(params);
  588. status = snd_pcm_lib_malloc_pages(substream, size);
  589. if (status < 0)
  590. return status;
  591. memset(substream->runtime->dma_area, 0, params_buffer_bytes(params));
  592. pg = virt_to_page(substream->dma_buffer.area);
  593. if (pg != NULL) {
  594. acp_set_sram_bank_state(rtd->acp_mmio, 0, true);
  595. /* Save for runtime private data */
  596. rtd->pg = pg;
  597. rtd->order = get_order(size);
  598. /* Fill the page table entries in ACP SRAM */
  599. rtd->pg = pg;
  600. rtd->size = size;
  601. rtd->num_of_pages = PAGE_ALIGN(size) >> PAGE_SHIFT;
  602. rtd->direction = substream->stream;
  603. config_acp_dma(rtd->acp_mmio, rtd);
  604. status = 0;
  605. } else {
  606. status = -ENOMEM;
  607. }
  608. return status;
  609. }
  610. static int acp_dma_hw_free(struct snd_pcm_substream *substream)
  611. {
  612. return snd_pcm_lib_free_pages(substream);
  613. }
  614. static snd_pcm_uframes_t acp_dma_pointer(struct snd_pcm_substream *substream)
  615. {
  616. u16 dscr;
  617. u32 mul, dma_config, period_bytes;
  618. u32 pos = 0;
  619. struct snd_pcm_runtime *runtime = substream->runtime;
  620. struct audio_substream_data *rtd = runtime->private_data;
  621. period_bytes = frames_to_bytes(runtime, runtime->period_size);
  622. if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
  623. dscr = acp_reg_read(rtd->acp_mmio, mmACP_DMA_CUR_DSCR_13);
  624. if (dscr == PLAYBACK_START_DMA_DESCR_CH13)
  625. mul = 0;
  626. else
  627. mul = 1;
  628. pos = (mul * period_bytes);
  629. } else {
  630. dma_config = acp_reg_read(rtd->acp_mmio, mmACP_DMA_CNTL_14);
  631. if (dma_config != 0) {
  632. dscr = acp_reg_read(rtd->acp_mmio,
  633. mmACP_DMA_CUR_DSCR_14);
  634. if (dscr == CAPTURE_START_DMA_DESCR_CH14)
  635. mul = 1;
  636. else
  637. mul = 2;
  638. pos = (mul * period_bytes);
  639. }
  640. if (pos >= (2 * period_bytes))
  641. pos = 0;
  642. }
  643. return bytes_to_frames(runtime, pos);
  644. }
  645. static int acp_dma_mmap(struct snd_pcm_substream *substream,
  646. struct vm_area_struct *vma)
  647. {
  648. return snd_pcm_lib_default_mmap(substream, vma);
  649. }
  650. static int acp_dma_prepare(struct snd_pcm_substream *substream)
  651. {
  652. struct snd_pcm_runtime *runtime = substream->runtime;
  653. struct audio_substream_data *rtd = runtime->private_data;
  654. if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
  655. config_acp_dma_channel(rtd->acp_mmio, SYSRAM_TO_ACP_CH_NUM,
  656. PLAYBACK_START_DMA_DESCR_CH12,
  657. NUM_DSCRS_PER_CHANNEL, 0);
  658. config_acp_dma_channel(rtd->acp_mmio, ACP_TO_I2S_DMA_CH_NUM,
  659. PLAYBACK_START_DMA_DESCR_CH13,
  660. NUM_DSCRS_PER_CHANNEL, 0);
  661. /* Fill ACP SRAM (2 periods) with zeros from System RAM
  662. * which is zero-ed in hw_params
  663. */
  664. acp_dma_start(rtd->acp_mmio, SYSRAM_TO_ACP_CH_NUM, false);
  665. /* ACP SRAM (2 periods of buffer size) is intially filled with
  666. * zeros. Before rendering starts, 2nd half of SRAM will be
  667. * filled with valid audio data DMA'ed from first half of system
  668. * RAM and 1st half of SRAM will be filled with Zeros. This is
  669. * the initial scenario when redering starts from SRAM. Later
  670. * on, 2nd half of system memory will be DMA'ed to 1st half of
  671. * SRAM, 1st half of system memory will be DMA'ed to 2nd half of
  672. * SRAM in ping-pong way till rendering stops.
  673. */
  674. config_acp_dma_channel(rtd->acp_mmio, SYSRAM_TO_ACP_CH_NUM,
  675. PLAYBACK_START_DMA_DESCR_CH12,
  676. 1, 0);
  677. } else {
  678. config_acp_dma_channel(rtd->acp_mmio, ACP_TO_SYSRAM_CH_NUM,
  679. CAPTURE_START_DMA_DESCR_CH14,
  680. NUM_DSCRS_PER_CHANNEL, 0);
  681. config_acp_dma_channel(rtd->acp_mmio, I2S_TO_ACP_DMA_CH_NUM,
  682. CAPTURE_START_DMA_DESCR_CH15,
  683. NUM_DSCRS_PER_CHANNEL, 0);
  684. }
  685. return 0;
  686. }
  687. static int acp_dma_trigger(struct snd_pcm_substream *substream, int cmd)
  688. {
  689. int ret;
  690. u32 loops = 1000;
  691. struct snd_pcm_runtime *runtime = substream->runtime;
  692. struct snd_soc_pcm_runtime *prtd = substream->private_data;
  693. struct audio_substream_data *rtd = runtime->private_data;
  694. if (!rtd)
  695. return -EINVAL;
  696. switch (cmd) {
  697. case SNDRV_PCM_TRIGGER_START:
  698. case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
  699. case SNDRV_PCM_TRIGGER_RESUME:
  700. if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
  701. acp_dma_start(rtd->acp_mmio,
  702. SYSRAM_TO_ACP_CH_NUM, false);
  703. while (acp_reg_read(rtd->acp_mmio, mmACP_DMA_CH_STS) &
  704. BIT(SYSRAM_TO_ACP_CH_NUM)) {
  705. if (!loops--) {
  706. dev_err(prtd->platform->dev,
  707. "acp dma start timeout\n");
  708. return -ETIMEDOUT;
  709. }
  710. cpu_relax();
  711. }
  712. acp_dma_start(rtd->acp_mmio,
  713. ACP_TO_I2S_DMA_CH_NUM, true);
  714. } else {
  715. acp_dma_start(rtd->acp_mmio,
  716. I2S_TO_ACP_DMA_CH_NUM, true);
  717. }
  718. ret = 0;
  719. break;
  720. case SNDRV_PCM_TRIGGER_STOP:
  721. case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
  722. case SNDRV_PCM_TRIGGER_SUSPEND:
  723. /* Need to stop only circular DMA channels :
  724. * ACP_TO_I2S_DMA_CH_NUM / I2S_TO_ACP_DMA_CH_NUM. Non-circular
  725. * channels will stopped automatically after its transfer
  726. * completes : SYSRAM_TO_ACP_CH_NUM / ACP_TO_SYSRAM_CH_NUM
  727. */
  728. if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
  729. ret = acp_dma_stop(rtd->acp_mmio,
  730. ACP_TO_I2S_DMA_CH_NUM);
  731. else
  732. ret = acp_dma_stop(rtd->acp_mmio,
  733. I2S_TO_ACP_DMA_CH_NUM);
  734. break;
  735. default:
  736. ret = -EINVAL;
  737. }
  738. return ret;
  739. }
  740. static int acp_dma_new(struct snd_soc_pcm_runtime *rtd)
  741. {
  742. return snd_pcm_lib_preallocate_pages_for_all(rtd->pcm,
  743. SNDRV_DMA_TYPE_DEV,
  744. NULL, MIN_BUFFER,
  745. MAX_BUFFER);
  746. }
  747. static int acp_dma_close(struct snd_pcm_substream *substream)
  748. {
  749. u16 bank;
  750. struct snd_pcm_runtime *runtime = substream->runtime;
  751. struct audio_substream_data *rtd = runtime->private_data;
  752. struct snd_soc_pcm_runtime *prtd = substream->private_data;
  753. struct audio_drv_data *adata = dev_get_drvdata(prtd->platform->dev);
  754. kfree(rtd);
  755. if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
  756. adata->play_stream = NULL;
  757. for (bank = 1; bank <= 4; bank++)
  758. acp_set_sram_bank_state(adata->acp_mmio, bank,
  759. false);
  760. } else {
  761. adata->capture_stream = NULL;
  762. for (bank = 5; bank <= 8; bank++)
  763. acp_set_sram_bank_state(adata->acp_mmio, bank,
  764. false);
  765. }
  766. /* Disable ACP irq, when the current stream is being closed and
  767. * another stream is also not active.
  768. */
  769. if (!adata->play_stream && !adata->capture_stream)
  770. acp_reg_write(0, adata->acp_mmio, mmACP_EXTERNAL_INTR_ENB);
  771. return 0;
  772. }
  773. static const struct snd_pcm_ops acp_dma_ops = {
  774. .open = acp_dma_open,
  775. .close = acp_dma_close,
  776. .ioctl = snd_pcm_lib_ioctl,
  777. .hw_params = acp_dma_hw_params,
  778. .hw_free = acp_dma_hw_free,
  779. .trigger = acp_dma_trigger,
  780. .pointer = acp_dma_pointer,
  781. .mmap = acp_dma_mmap,
  782. .prepare = acp_dma_prepare,
  783. };
  784. static struct snd_soc_platform_driver acp_asoc_platform = {
  785. .ops = &acp_dma_ops,
  786. .pcm_new = acp_dma_new,
  787. };
  788. static int acp_audio_probe(struct platform_device *pdev)
  789. {
  790. int status;
  791. struct audio_drv_data *audio_drv_data;
  792. struct resource *res;
  793. audio_drv_data = devm_kzalloc(&pdev->dev, sizeof(struct audio_drv_data),
  794. GFP_KERNEL);
  795. if (audio_drv_data == NULL)
  796. return -ENOMEM;
  797. res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
  798. audio_drv_data->acp_mmio = devm_ioremap_resource(&pdev->dev, res);
  799. /* The following members gets populated in device 'open'
  800. * function. Till then interrupts are disabled in 'acp_init'
  801. * and device doesn't generate any interrupts.
  802. */
  803. audio_drv_data->play_stream = NULL;
  804. audio_drv_data->capture_stream = NULL;
  805. res = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
  806. if (!res) {
  807. dev_err(&pdev->dev, "IORESOURCE_IRQ FAILED\n");
  808. return -ENODEV;
  809. }
  810. status = devm_request_irq(&pdev->dev, res->start, dma_irq_handler,
  811. 0, "ACP_IRQ", &pdev->dev);
  812. if (status) {
  813. dev_err(&pdev->dev, "ACP IRQ request failed\n");
  814. return status;
  815. }
  816. dev_set_drvdata(&pdev->dev, audio_drv_data);
  817. /* Initialize the ACP */
  818. acp_init(audio_drv_data->acp_mmio);
  819. status = snd_soc_register_platform(&pdev->dev, &acp_asoc_platform);
  820. if (status != 0) {
  821. dev_err(&pdev->dev, "Fail to register ALSA platform device\n");
  822. return status;
  823. }
  824. pm_runtime_set_autosuspend_delay(&pdev->dev, 10000);
  825. pm_runtime_use_autosuspend(&pdev->dev);
  826. pm_runtime_enable(&pdev->dev);
  827. return status;
  828. }
  829. static int acp_audio_remove(struct platform_device *pdev)
  830. {
  831. struct audio_drv_data *adata = dev_get_drvdata(&pdev->dev);
  832. acp_deinit(adata->acp_mmio);
  833. snd_soc_unregister_platform(&pdev->dev);
  834. pm_runtime_disable(&pdev->dev);
  835. return 0;
  836. }
  837. static int acp_pcm_resume(struct device *dev)
  838. {
  839. u16 bank;
  840. struct audio_drv_data *adata = dev_get_drvdata(dev);
  841. acp_init(adata->acp_mmio);
  842. if (adata->play_stream && adata->play_stream->runtime) {
  843. for (bank = 1; bank <= 4; bank++)
  844. acp_set_sram_bank_state(adata->acp_mmio, bank,
  845. true);
  846. config_acp_dma(adata->acp_mmio,
  847. adata->play_stream->runtime->private_data);
  848. }
  849. if (adata->capture_stream && adata->capture_stream->runtime) {
  850. for (bank = 5; bank <= 8; bank++)
  851. acp_set_sram_bank_state(adata->acp_mmio, bank,
  852. true);
  853. config_acp_dma(adata->acp_mmio,
  854. adata->capture_stream->runtime->private_data);
  855. }
  856. acp_reg_write(1, adata->acp_mmio, mmACP_EXTERNAL_INTR_ENB);
  857. return 0;
  858. }
  859. static int acp_pcm_runtime_suspend(struct device *dev)
  860. {
  861. struct audio_drv_data *adata = dev_get_drvdata(dev);
  862. acp_deinit(adata->acp_mmio);
  863. acp_reg_write(0, adata->acp_mmio, mmACP_EXTERNAL_INTR_ENB);
  864. return 0;
  865. }
  866. static int acp_pcm_runtime_resume(struct device *dev)
  867. {
  868. struct audio_drv_data *adata = dev_get_drvdata(dev);
  869. acp_init(adata->acp_mmio);
  870. acp_reg_write(1, adata->acp_mmio, mmACP_EXTERNAL_INTR_ENB);
  871. return 0;
  872. }
  873. static const struct dev_pm_ops acp_pm_ops = {
  874. .resume = acp_pcm_resume,
  875. .runtime_suspend = acp_pcm_runtime_suspend,
  876. .runtime_resume = acp_pcm_runtime_resume,
  877. };
  878. static struct platform_driver acp_dma_driver = {
  879. .probe = acp_audio_probe,
  880. .remove = acp_audio_remove,
  881. .driver = {
  882. .name = "acp_audio_dma",
  883. .pm = &acp_pm_ops,
  884. },
  885. };
  886. module_platform_driver(acp_dma_driver);
  887. MODULE_AUTHOR("Maruthi.Bayyavarapu@amd.com");
  888. MODULE_DESCRIPTION("AMD ACP PCM Driver");
  889. MODULE_LICENSE("GPL v2");
  890. MODULE_ALIAS("platform:acp-dma-audio");