acp-pcm-dma.c 40 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404
  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 <drm/amd_asic_type.h>
  22. #include "acp.h"
  23. #define DRV_NAME "acp_audio_dma"
  24. #define PLAYBACK_MIN_NUM_PERIODS 2
  25. #define PLAYBACK_MAX_NUM_PERIODS 2
  26. #define PLAYBACK_MAX_PERIOD_SIZE 16384
  27. #define PLAYBACK_MIN_PERIOD_SIZE 1024
  28. #define CAPTURE_MIN_NUM_PERIODS 2
  29. #define CAPTURE_MAX_NUM_PERIODS 2
  30. #define CAPTURE_MAX_PERIOD_SIZE 16384
  31. #define CAPTURE_MIN_PERIOD_SIZE 1024
  32. #define MAX_BUFFER (PLAYBACK_MAX_PERIOD_SIZE * PLAYBACK_MAX_NUM_PERIODS)
  33. #define MIN_BUFFER MAX_BUFFER
  34. #define ST_PLAYBACK_MAX_PERIOD_SIZE 4096
  35. #define ST_CAPTURE_MAX_PERIOD_SIZE ST_PLAYBACK_MAX_PERIOD_SIZE
  36. #define ST_MAX_BUFFER (ST_PLAYBACK_MAX_PERIOD_SIZE * PLAYBACK_MAX_NUM_PERIODS)
  37. #define ST_MIN_BUFFER ST_MAX_BUFFER
  38. #define DRV_NAME "acp_audio_dma"
  39. bool bt_uart_enable = true;
  40. EXPORT_SYMBOL(bt_uart_enable);
  41. static const struct snd_pcm_hardware acp_pcm_hardware_playback = {
  42. .info = SNDRV_PCM_INFO_INTERLEAVED |
  43. SNDRV_PCM_INFO_BLOCK_TRANSFER | SNDRV_PCM_INFO_MMAP |
  44. SNDRV_PCM_INFO_MMAP_VALID | SNDRV_PCM_INFO_BATCH |
  45. SNDRV_PCM_INFO_PAUSE | SNDRV_PCM_INFO_RESUME,
  46. .formats = SNDRV_PCM_FMTBIT_S16_LE |
  47. SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S32_LE,
  48. .channels_min = 1,
  49. .channels_max = 8,
  50. .rates = SNDRV_PCM_RATE_8000_96000,
  51. .rate_min = 8000,
  52. .rate_max = 96000,
  53. .buffer_bytes_max = PLAYBACK_MAX_NUM_PERIODS * PLAYBACK_MAX_PERIOD_SIZE,
  54. .period_bytes_min = PLAYBACK_MIN_PERIOD_SIZE,
  55. .period_bytes_max = PLAYBACK_MAX_PERIOD_SIZE,
  56. .periods_min = PLAYBACK_MIN_NUM_PERIODS,
  57. .periods_max = PLAYBACK_MAX_NUM_PERIODS,
  58. };
  59. static const struct snd_pcm_hardware acp_pcm_hardware_capture = {
  60. .info = SNDRV_PCM_INFO_INTERLEAVED |
  61. SNDRV_PCM_INFO_BLOCK_TRANSFER | SNDRV_PCM_INFO_MMAP |
  62. SNDRV_PCM_INFO_MMAP_VALID | SNDRV_PCM_INFO_BATCH |
  63. SNDRV_PCM_INFO_PAUSE | SNDRV_PCM_INFO_RESUME,
  64. .formats = SNDRV_PCM_FMTBIT_S16_LE |
  65. SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S32_LE,
  66. .channels_min = 1,
  67. .channels_max = 2,
  68. .rates = SNDRV_PCM_RATE_8000_48000,
  69. .rate_min = 8000,
  70. .rate_max = 48000,
  71. .buffer_bytes_max = CAPTURE_MAX_NUM_PERIODS * CAPTURE_MAX_PERIOD_SIZE,
  72. .period_bytes_min = CAPTURE_MIN_PERIOD_SIZE,
  73. .period_bytes_max = CAPTURE_MAX_PERIOD_SIZE,
  74. .periods_min = CAPTURE_MIN_NUM_PERIODS,
  75. .periods_max = CAPTURE_MAX_NUM_PERIODS,
  76. };
  77. static const struct snd_pcm_hardware acp_st_pcm_hardware_playback = {
  78. .info = SNDRV_PCM_INFO_INTERLEAVED |
  79. SNDRV_PCM_INFO_BLOCK_TRANSFER | SNDRV_PCM_INFO_MMAP |
  80. SNDRV_PCM_INFO_MMAP_VALID | SNDRV_PCM_INFO_BATCH |
  81. SNDRV_PCM_INFO_PAUSE | SNDRV_PCM_INFO_RESUME,
  82. .formats = SNDRV_PCM_FMTBIT_S16_LE |
  83. SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S32_LE,
  84. .channels_min = 1,
  85. .channels_max = 8,
  86. .rates = SNDRV_PCM_RATE_8000_96000,
  87. .rate_min = 8000,
  88. .rate_max = 96000,
  89. .buffer_bytes_max = ST_MAX_BUFFER,
  90. .period_bytes_min = PLAYBACK_MIN_PERIOD_SIZE,
  91. .period_bytes_max = ST_PLAYBACK_MAX_PERIOD_SIZE,
  92. .periods_min = PLAYBACK_MIN_NUM_PERIODS,
  93. .periods_max = PLAYBACK_MAX_NUM_PERIODS,
  94. };
  95. static const struct snd_pcm_hardware acp_st_pcm_hardware_capture = {
  96. .info = SNDRV_PCM_INFO_INTERLEAVED |
  97. SNDRV_PCM_INFO_BLOCK_TRANSFER | SNDRV_PCM_INFO_MMAP |
  98. SNDRV_PCM_INFO_MMAP_VALID | SNDRV_PCM_INFO_BATCH |
  99. SNDRV_PCM_INFO_PAUSE | SNDRV_PCM_INFO_RESUME,
  100. .formats = SNDRV_PCM_FMTBIT_S16_LE |
  101. SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S32_LE,
  102. .channels_min = 1,
  103. .channels_max = 2,
  104. .rates = SNDRV_PCM_RATE_8000_48000,
  105. .rate_min = 8000,
  106. .rate_max = 48000,
  107. .buffer_bytes_max = ST_MAX_BUFFER,
  108. .period_bytes_min = CAPTURE_MIN_PERIOD_SIZE,
  109. .period_bytes_max = ST_CAPTURE_MAX_PERIOD_SIZE,
  110. .periods_min = CAPTURE_MIN_NUM_PERIODS,
  111. .periods_max = CAPTURE_MAX_NUM_PERIODS,
  112. };
  113. static u32 acp_reg_read(void __iomem *acp_mmio, u32 reg)
  114. {
  115. return readl(acp_mmio + (reg * 4));
  116. }
  117. static void acp_reg_write(u32 val, void __iomem *acp_mmio, u32 reg)
  118. {
  119. writel(val, acp_mmio + (reg * 4));
  120. }
  121. /*
  122. * Configure a given dma channel parameters - enable/disable,
  123. * number of descriptors, priority
  124. */
  125. static void config_acp_dma_channel(void __iomem *acp_mmio, u8 ch_num,
  126. u16 dscr_strt_idx, u16 num_dscrs,
  127. enum acp_dma_priority_level priority_level)
  128. {
  129. u32 dma_ctrl;
  130. /* disable the channel run field */
  131. dma_ctrl = acp_reg_read(acp_mmio, mmACP_DMA_CNTL_0 + ch_num);
  132. dma_ctrl &= ~ACP_DMA_CNTL_0__DMAChRun_MASK;
  133. acp_reg_write(dma_ctrl, acp_mmio, mmACP_DMA_CNTL_0 + ch_num);
  134. /* program a DMA channel with first descriptor to be processed. */
  135. acp_reg_write((ACP_DMA_DSCR_STRT_IDX_0__DMAChDscrStrtIdx_MASK
  136. & dscr_strt_idx),
  137. acp_mmio, mmACP_DMA_DSCR_STRT_IDX_0 + ch_num);
  138. /*
  139. * program a DMA channel with the number of descriptors to be
  140. * processed in the transfer
  141. */
  142. acp_reg_write(ACP_DMA_DSCR_CNT_0__DMAChDscrCnt_MASK & num_dscrs,
  143. acp_mmio, mmACP_DMA_DSCR_CNT_0 + ch_num);
  144. /* set DMA channel priority */
  145. acp_reg_write(priority_level, acp_mmio, mmACP_DMA_PRIO_0 + ch_num);
  146. }
  147. /* Initialize a dma descriptor in SRAM based on descritor information passed */
  148. static void config_dma_descriptor_in_sram(void __iomem *acp_mmio,
  149. u16 descr_idx,
  150. acp_dma_dscr_transfer_t *descr_info)
  151. {
  152. u32 sram_offset;
  153. sram_offset = (descr_idx * sizeof(acp_dma_dscr_transfer_t));
  154. /* program the source base address. */
  155. acp_reg_write(sram_offset, acp_mmio, mmACP_SRBM_Targ_Idx_Addr);
  156. acp_reg_write(descr_info->src, acp_mmio, mmACP_SRBM_Targ_Idx_Data);
  157. /* program the destination base address. */
  158. acp_reg_write(sram_offset + 4, acp_mmio, mmACP_SRBM_Targ_Idx_Addr);
  159. acp_reg_write(descr_info->dest, acp_mmio, mmACP_SRBM_Targ_Idx_Data);
  160. /* program the number of bytes to be transferred for this descriptor. */
  161. acp_reg_write(sram_offset + 8, acp_mmio, mmACP_SRBM_Targ_Idx_Addr);
  162. acp_reg_write(descr_info->xfer_val, acp_mmio, mmACP_SRBM_Targ_Idx_Data);
  163. }
  164. /*
  165. * Initialize the DMA descriptor information for transfer between
  166. * system memory <-> ACP SRAM
  167. */
  168. static void set_acp_sysmem_dma_descriptors(void __iomem *acp_mmio,
  169. u32 size, int direction,
  170. u32 pte_offset, u16 ch,
  171. u32 sram_bank, u16 dma_dscr_idx,
  172. u32 asic_type)
  173. {
  174. u16 i;
  175. acp_dma_dscr_transfer_t dmadscr[NUM_DSCRS_PER_CHANNEL];
  176. for (i = 0; i < NUM_DSCRS_PER_CHANNEL; i++) {
  177. dmadscr[i].xfer_val = 0;
  178. if (direction == SNDRV_PCM_STREAM_PLAYBACK) {
  179. dma_dscr_idx = dma_dscr_idx + i;
  180. dmadscr[i].dest = sram_bank + (i * (size / 2));
  181. dmadscr[i].src = ACP_INTERNAL_APERTURE_WINDOW_0_ADDRESS
  182. + (pte_offset * SZ_4K) + (i * (size / 2));
  183. switch (asic_type) {
  184. case CHIP_STONEY:
  185. dmadscr[i].xfer_val |=
  186. (ACP_DMA_ATTR_DAGB_GARLIC_TO_SHAREDMEM << 16) |
  187. (size / 2);
  188. break;
  189. default:
  190. dmadscr[i].xfer_val |=
  191. (ACP_DMA_ATTR_DAGB_ONION_TO_SHAREDMEM << 16) |
  192. (size / 2);
  193. }
  194. } else {
  195. dma_dscr_idx = dma_dscr_idx + i;
  196. dmadscr[i].src = sram_bank + (i * (size / 2));
  197. dmadscr[i].dest =
  198. ACP_INTERNAL_APERTURE_WINDOW_0_ADDRESS +
  199. (pte_offset * SZ_4K) + (i * (size / 2));
  200. switch (asic_type) {
  201. case CHIP_STONEY:
  202. dmadscr[i].xfer_val |=
  203. (ACP_DMA_ATTR_SHARED_MEM_TO_DAGB_GARLIC << 16) |
  204. (size / 2);
  205. break;
  206. default:
  207. dmadscr[i].xfer_val |=
  208. (ACP_DMA_ATTR_SHAREDMEM_TO_DAGB_ONION << 16) |
  209. (size / 2);
  210. }
  211. }
  212. config_dma_descriptor_in_sram(acp_mmio, dma_dscr_idx,
  213. &dmadscr[i]);
  214. }
  215. config_acp_dma_channel(acp_mmio, ch,
  216. dma_dscr_idx - 1,
  217. NUM_DSCRS_PER_CHANNEL,
  218. ACP_DMA_PRIORITY_LEVEL_NORMAL);
  219. }
  220. /*
  221. * Initialize the DMA descriptor information for transfer between
  222. * ACP SRAM <-> I2S
  223. */
  224. static void set_acp_to_i2s_dma_descriptors(void __iomem *acp_mmio, u32 size,
  225. int direction, u32 sram_bank,
  226. u16 destination, u16 ch,
  227. u16 dma_dscr_idx, u32 asic_type)
  228. {
  229. u16 i;
  230. acp_dma_dscr_transfer_t dmadscr[NUM_DSCRS_PER_CHANNEL];
  231. for (i = 0; i < NUM_DSCRS_PER_CHANNEL; i++) {
  232. dmadscr[i].xfer_val = 0;
  233. if (direction == SNDRV_PCM_STREAM_PLAYBACK) {
  234. dma_dscr_idx = dma_dscr_idx + i;
  235. dmadscr[i].src = sram_bank + (i * (size / 2));
  236. /* dmadscr[i].dest is unused by hardware. */
  237. dmadscr[i].dest = 0;
  238. dmadscr[i].xfer_val |= BIT(22) | (destination << 16) |
  239. (size / 2);
  240. } else {
  241. dma_dscr_idx = dma_dscr_idx + i;
  242. /* dmadscr[i].src is unused by hardware. */
  243. dmadscr[i].src = 0;
  244. dmadscr[i].dest =
  245. sram_bank + (i * (size / 2));
  246. dmadscr[i].xfer_val |= BIT(22) |
  247. (destination << 16) | (size / 2);
  248. }
  249. config_dma_descriptor_in_sram(acp_mmio, dma_dscr_idx,
  250. &dmadscr[i]);
  251. }
  252. /* Configure the DMA channel with the above descriptore */
  253. config_acp_dma_channel(acp_mmio, ch, dma_dscr_idx - 1,
  254. NUM_DSCRS_PER_CHANNEL,
  255. ACP_DMA_PRIORITY_LEVEL_NORMAL);
  256. }
  257. /* Create page table entries in ACP SRAM for the allocated memory */
  258. static void acp_pte_config(void __iomem *acp_mmio, struct page *pg,
  259. u16 num_of_pages, u32 pte_offset)
  260. {
  261. u16 page_idx;
  262. u64 addr;
  263. u32 low;
  264. u32 high;
  265. u32 offset;
  266. offset = ACP_DAGB_GRP_SRBM_SRAM_BASE_OFFSET + (pte_offset * 8);
  267. for (page_idx = 0; page_idx < (num_of_pages); page_idx++) {
  268. /* Load the low address of page int ACP SRAM through SRBM */
  269. acp_reg_write((offset + (page_idx * 8)),
  270. acp_mmio, mmACP_SRBM_Targ_Idx_Addr);
  271. addr = page_to_phys(pg);
  272. low = lower_32_bits(addr);
  273. high = upper_32_bits(addr);
  274. acp_reg_write(low, acp_mmio, mmACP_SRBM_Targ_Idx_Data);
  275. /* Load the High address of page int ACP SRAM through SRBM */
  276. acp_reg_write((offset + (page_idx * 8) + 4),
  277. acp_mmio, mmACP_SRBM_Targ_Idx_Addr);
  278. /* page enable in ACP */
  279. high |= BIT(31);
  280. acp_reg_write(high, acp_mmio, mmACP_SRBM_Targ_Idx_Data);
  281. /* Move to next physically contiguos page */
  282. pg++;
  283. }
  284. }
  285. static void config_acp_dma(void __iomem *acp_mmio,
  286. struct audio_substream_data *rtd,
  287. u32 asic_type)
  288. {
  289. u16 ch_acp_sysmem, ch_acp_i2s;
  290. acp_pte_config(acp_mmio, rtd->pg, rtd->num_of_pages,
  291. rtd->pte_offset);
  292. if (rtd->direction == SNDRV_PCM_STREAM_PLAYBACK) {
  293. ch_acp_sysmem = rtd->ch1;
  294. ch_acp_i2s = rtd->ch2;
  295. } else {
  296. ch_acp_i2s = rtd->ch1;
  297. ch_acp_sysmem = rtd->ch2;
  298. }
  299. /* Configure System memory <-> ACP SRAM DMA descriptors */
  300. set_acp_sysmem_dma_descriptors(acp_mmio, rtd->size,
  301. rtd->direction, rtd->pte_offset,
  302. ch_acp_sysmem, rtd->sram_bank,
  303. rtd->dma_dscr_idx_1, asic_type);
  304. /* Configure ACP SRAM <-> I2S DMA descriptors */
  305. set_acp_to_i2s_dma_descriptors(acp_mmio, rtd->size,
  306. rtd->direction, rtd->sram_bank,
  307. rtd->destination, ch_acp_i2s,
  308. rtd->dma_dscr_idx_2, asic_type);
  309. }
  310. static void acp_dma_cap_channel_enable(void __iomem *acp_mmio,
  311. u16 cap_channel)
  312. {
  313. u32 val, ch_reg, imr_reg, res_reg;
  314. switch (cap_channel) {
  315. case CAP_CHANNEL1:
  316. ch_reg = mmACP_I2SMICSP_RER1;
  317. res_reg = mmACP_I2SMICSP_RCR1;
  318. imr_reg = mmACP_I2SMICSP_IMR1;
  319. break;
  320. case CAP_CHANNEL0:
  321. default:
  322. ch_reg = mmACP_I2SMICSP_RER0;
  323. res_reg = mmACP_I2SMICSP_RCR0;
  324. imr_reg = mmACP_I2SMICSP_IMR0;
  325. break;
  326. }
  327. val = acp_reg_read(acp_mmio,
  328. mmACP_I2S_16BIT_RESOLUTION_EN);
  329. if (val & ACP_I2S_MIC_16BIT_RESOLUTION_EN) {
  330. acp_reg_write(0x0, acp_mmio, ch_reg);
  331. /* Set 16bit resolution on capture */
  332. acp_reg_write(0x2, acp_mmio, res_reg);
  333. }
  334. val = acp_reg_read(acp_mmio, imr_reg);
  335. val &= ~ACP_I2SMICSP_IMR1__I2SMICSP_RXDAM_MASK;
  336. val &= ~ACP_I2SMICSP_IMR1__I2SMICSP_RXFOM_MASK;
  337. acp_reg_write(val, acp_mmio, imr_reg);
  338. acp_reg_write(0x1, acp_mmio, ch_reg);
  339. }
  340. static void acp_dma_cap_channel_disable(void __iomem *acp_mmio,
  341. u16 cap_channel)
  342. {
  343. u32 val, ch_reg, imr_reg;
  344. switch (cap_channel) {
  345. case CAP_CHANNEL1:
  346. imr_reg = mmACP_I2SMICSP_IMR1;
  347. ch_reg = mmACP_I2SMICSP_RER1;
  348. break;
  349. case CAP_CHANNEL0:
  350. default:
  351. imr_reg = mmACP_I2SMICSP_IMR0;
  352. ch_reg = mmACP_I2SMICSP_RER0;
  353. break;
  354. }
  355. val = acp_reg_read(acp_mmio, imr_reg);
  356. val |= ACP_I2SMICSP_IMR1__I2SMICSP_RXDAM_MASK;
  357. val |= ACP_I2SMICSP_IMR1__I2SMICSP_RXFOM_MASK;
  358. acp_reg_write(val, acp_mmio, imr_reg);
  359. acp_reg_write(0x0, acp_mmio, ch_reg);
  360. }
  361. /* Start a given DMA channel transfer */
  362. static void acp_dma_start(void __iomem *acp_mmio, u16 ch_num, bool is_circular)
  363. {
  364. u32 dma_ctrl;
  365. /* read the dma control register and disable the channel run field */
  366. dma_ctrl = acp_reg_read(acp_mmio, mmACP_DMA_CNTL_0 + ch_num);
  367. /* Invalidating the DAGB cache */
  368. acp_reg_write(1, acp_mmio, mmACP_DAGB_ATU_CTRL);
  369. /*
  370. * configure the DMA channel and start the DMA transfer
  371. * set dmachrun bit to start the transfer and enable the
  372. * interrupt on completion of the dma transfer
  373. */
  374. dma_ctrl |= ACP_DMA_CNTL_0__DMAChRun_MASK;
  375. switch (ch_num) {
  376. case ACP_TO_I2S_DMA_CH_NUM:
  377. case I2S_TO_ACP_DMA_CH_NUM:
  378. case ACP_TO_I2S_DMA_BT_INSTANCE_CH_NUM:
  379. case I2S_TO_ACP_DMA_BT_INSTANCE_CH_NUM:
  380. dma_ctrl |= ACP_DMA_CNTL_0__DMAChIOCEn_MASK;
  381. break;
  382. default:
  383. dma_ctrl &= ~ACP_DMA_CNTL_0__DMAChIOCEn_MASK;
  384. break;
  385. }
  386. /* enable for ACP to SRAM DMA channel */
  387. if (is_circular == true)
  388. dma_ctrl |= ACP_DMA_CNTL_0__Circular_DMA_En_MASK;
  389. else
  390. dma_ctrl &= ~ACP_DMA_CNTL_0__Circular_DMA_En_MASK;
  391. acp_reg_write(dma_ctrl, acp_mmio, mmACP_DMA_CNTL_0 + ch_num);
  392. }
  393. /* Stop a given DMA channel transfer */
  394. static int acp_dma_stop(void __iomem *acp_mmio, u8 ch_num)
  395. {
  396. u32 dma_ctrl;
  397. u32 dma_ch_sts;
  398. u32 count = ACP_DMA_RESET_TIME;
  399. dma_ctrl = acp_reg_read(acp_mmio, mmACP_DMA_CNTL_0 + ch_num);
  400. /*
  401. * clear the dma control register fields before writing zero
  402. * in reset bit
  403. */
  404. dma_ctrl &= ~ACP_DMA_CNTL_0__DMAChRun_MASK;
  405. dma_ctrl &= ~ACP_DMA_CNTL_0__DMAChIOCEn_MASK;
  406. acp_reg_write(dma_ctrl, acp_mmio, mmACP_DMA_CNTL_0 + ch_num);
  407. dma_ch_sts = acp_reg_read(acp_mmio, mmACP_DMA_CH_STS);
  408. if (dma_ch_sts & BIT(ch_num)) {
  409. /*
  410. * set the reset bit for this channel to stop the dma
  411. * transfer
  412. */
  413. dma_ctrl |= ACP_DMA_CNTL_0__DMAChRst_MASK;
  414. acp_reg_write(dma_ctrl, acp_mmio, mmACP_DMA_CNTL_0 + ch_num);
  415. }
  416. /* check the channel status bit for some time and return the status */
  417. while (true) {
  418. dma_ch_sts = acp_reg_read(acp_mmio, mmACP_DMA_CH_STS);
  419. if (!(dma_ch_sts & BIT(ch_num))) {
  420. /*
  421. * clear the reset flag after successfully stopping
  422. * the dma transfer and break from the loop
  423. */
  424. dma_ctrl &= ~ACP_DMA_CNTL_0__DMAChRst_MASK;
  425. acp_reg_write(dma_ctrl, acp_mmio, mmACP_DMA_CNTL_0
  426. + ch_num);
  427. break;
  428. }
  429. if (--count == 0) {
  430. pr_err("Failed to stop ACP DMA channel : %d\n", ch_num);
  431. return -ETIMEDOUT;
  432. }
  433. udelay(100);
  434. }
  435. return 0;
  436. }
  437. static void acp_set_sram_bank_state(void __iomem *acp_mmio, u16 bank,
  438. bool power_on)
  439. {
  440. u32 val, req_reg, sts_reg, sts_reg_mask;
  441. u32 loops = 1000;
  442. if (bank < 32) {
  443. req_reg = mmACP_MEM_SHUT_DOWN_REQ_LO;
  444. sts_reg = mmACP_MEM_SHUT_DOWN_STS_LO;
  445. sts_reg_mask = 0xFFFFFFFF;
  446. } else {
  447. bank -= 32;
  448. req_reg = mmACP_MEM_SHUT_DOWN_REQ_HI;
  449. sts_reg = mmACP_MEM_SHUT_DOWN_STS_HI;
  450. sts_reg_mask = 0x0000FFFF;
  451. }
  452. val = acp_reg_read(acp_mmio, req_reg);
  453. if (val & (1 << bank)) {
  454. /* bank is in off state */
  455. if (power_on == true)
  456. /* request to on */
  457. val &= ~(1 << bank);
  458. else
  459. /* request to off */
  460. return;
  461. } else {
  462. /* bank is in on state */
  463. if (power_on == false)
  464. /* request to off */
  465. val |= 1 << bank;
  466. else
  467. /* request to on */
  468. return;
  469. }
  470. acp_reg_write(val, acp_mmio, req_reg);
  471. while (acp_reg_read(acp_mmio, sts_reg) != sts_reg_mask) {
  472. if (!loops--) {
  473. pr_err("ACP SRAM bank %d state change failed\n", bank);
  474. break;
  475. }
  476. cpu_relax();
  477. }
  478. }
  479. /* Initialize and bring ACP hardware to default state. */
  480. static int acp_init(void __iomem *acp_mmio, u32 asic_type)
  481. {
  482. u16 bank;
  483. u32 val, count, sram_pte_offset;
  484. /* Assert Soft reset of ACP */
  485. val = acp_reg_read(acp_mmio, mmACP_SOFT_RESET);
  486. val |= ACP_SOFT_RESET__SoftResetAud_MASK;
  487. acp_reg_write(val, acp_mmio, mmACP_SOFT_RESET);
  488. count = ACP_SOFT_RESET_DONE_TIME_OUT_VALUE;
  489. while (true) {
  490. val = acp_reg_read(acp_mmio, mmACP_SOFT_RESET);
  491. if (ACP_SOFT_RESET__SoftResetAudDone_MASK ==
  492. (val & ACP_SOFT_RESET__SoftResetAudDone_MASK))
  493. break;
  494. if (--count == 0) {
  495. pr_err("Failed to reset ACP\n");
  496. return -ETIMEDOUT;
  497. }
  498. udelay(100);
  499. }
  500. /* Enable clock to ACP and wait until the clock is enabled */
  501. val = acp_reg_read(acp_mmio, mmACP_CONTROL);
  502. val = val | ACP_CONTROL__ClkEn_MASK;
  503. acp_reg_write(val, acp_mmio, mmACP_CONTROL);
  504. count = ACP_CLOCK_EN_TIME_OUT_VALUE;
  505. while (true) {
  506. val = acp_reg_read(acp_mmio, mmACP_STATUS);
  507. if (val & (u32)0x1)
  508. break;
  509. if (--count == 0) {
  510. pr_err("Failed to reset ACP\n");
  511. return -ETIMEDOUT;
  512. }
  513. udelay(100);
  514. }
  515. /* Deassert the SOFT RESET flags */
  516. val = acp_reg_read(acp_mmio, mmACP_SOFT_RESET);
  517. val &= ~ACP_SOFT_RESET__SoftResetAud_MASK;
  518. acp_reg_write(val, acp_mmio, mmACP_SOFT_RESET);
  519. /* For BT instance change pins from UART to BT */
  520. if (!bt_uart_enable) {
  521. val = acp_reg_read(acp_mmio, mmACP_BT_UART_PAD_SEL);
  522. val |= ACP_BT_UART_PAD_SELECT_MASK;
  523. acp_reg_write(val, acp_mmio, mmACP_BT_UART_PAD_SEL);
  524. }
  525. /* initiailize Onion control DAGB register */
  526. acp_reg_write(ACP_ONION_CNTL_DEFAULT, acp_mmio,
  527. mmACP_AXI2DAGB_ONION_CNTL);
  528. /* initiailize Garlic control DAGB registers */
  529. acp_reg_write(ACP_GARLIC_CNTL_DEFAULT, acp_mmio,
  530. mmACP_AXI2DAGB_GARLIC_CNTL);
  531. sram_pte_offset = ACP_DAGB_GRP_SRAM_BASE_ADDRESS |
  532. ACP_DAGB_BASE_ADDR_GRP_1__AXI2DAGBSnoopSel_MASK |
  533. ACP_DAGB_BASE_ADDR_GRP_1__AXI2DAGBTargetMemSel_MASK |
  534. ACP_DAGB_BASE_ADDR_GRP_1__AXI2DAGBGrpEnable_MASK;
  535. acp_reg_write(sram_pte_offset, acp_mmio, mmACP_DAGB_BASE_ADDR_GRP_1);
  536. acp_reg_write(ACP_PAGE_SIZE_4K_ENABLE, acp_mmio,
  537. mmACP_DAGB_PAGE_SIZE_GRP_1);
  538. acp_reg_write(ACP_SRAM_BASE_ADDRESS, acp_mmio,
  539. mmACP_DMA_DESC_BASE_ADDR);
  540. /* Num of descriptiors in SRAM 0x4, means 256 descriptors;(64 * 4) */
  541. acp_reg_write(0x4, acp_mmio, mmACP_DMA_DESC_MAX_NUM_DSCR);
  542. acp_reg_write(ACP_EXTERNAL_INTR_CNTL__DMAIOCMask_MASK,
  543. acp_mmio, mmACP_EXTERNAL_INTR_CNTL);
  544. /*
  545. * When ACP_TILE_P1 is turned on, all SRAM banks get turned on.
  546. * Now, turn off all of them. This can't be done in 'poweron' of
  547. * ACP pm domain, as this requires ACP to be initialized.
  548. * For Stoney, Memory gating is disabled,i.e SRAM Banks
  549. * won't be turned off. The default state for SRAM banks is ON.
  550. * Setting SRAM bank state code skipped for STONEY platform.
  551. */
  552. if (asic_type != CHIP_STONEY) {
  553. for (bank = 1; bank < 48; bank++)
  554. acp_set_sram_bank_state(acp_mmio, bank, false);
  555. }
  556. return 0;
  557. }
  558. /* Deinitialize ACP */
  559. static int acp_deinit(void __iomem *acp_mmio)
  560. {
  561. u32 val;
  562. u32 count;
  563. /* Assert Soft reset of ACP */
  564. val = acp_reg_read(acp_mmio, mmACP_SOFT_RESET);
  565. val |= ACP_SOFT_RESET__SoftResetAud_MASK;
  566. acp_reg_write(val, acp_mmio, mmACP_SOFT_RESET);
  567. count = ACP_SOFT_RESET_DONE_TIME_OUT_VALUE;
  568. while (true) {
  569. val = acp_reg_read(acp_mmio, mmACP_SOFT_RESET);
  570. if (ACP_SOFT_RESET__SoftResetAudDone_MASK ==
  571. (val & ACP_SOFT_RESET__SoftResetAudDone_MASK))
  572. break;
  573. if (--count == 0) {
  574. pr_err("Failed to reset ACP\n");
  575. return -ETIMEDOUT;
  576. }
  577. udelay(100);
  578. }
  579. /* Disable ACP clock */
  580. val = acp_reg_read(acp_mmio, mmACP_CONTROL);
  581. val &= ~ACP_CONTROL__ClkEn_MASK;
  582. acp_reg_write(val, acp_mmio, mmACP_CONTROL);
  583. count = ACP_CLOCK_EN_TIME_OUT_VALUE;
  584. while (true) {
  585. val = acp_reg_read(acp_mmio, mmACP_STATUS);
  586. if (!(val & (u32)0x1))
  587. break;
  588. if (--count == 0) {
  589. pr_err("Failed to reset ACP\n");
  590. return -ETIMEDOUT;
  591. }
  592. udelay(100);
  593. }
  594. return 0;
  595. }
  596. /* ACP DMA irq handler routine for playback, capture usecases */
  597. static irqreturn_t dma_irq_handler(int irq, void *arg)
  598. {
  599. u16 dscr_idx;
  600. u32 intr_flag, ext_intr_status;
  601. struct audio_drv_data *irq_data;
  602. void __iomem *acp_mmio;
  603. struct device *dev = arg;
  604. bool valid_irq = false;
  605. irq_data = dev_get_drvdata(dev);
  606. acp_mmio = irq_data->acp_mmio;
  607. ext_intr_status = acp_reg_read(acp_mmio, mmACP_EXTERNAL_INTR_STAT);
  608. intr_flag = (((ext_intr_status &
  609. ACP_EXTERNAL_INTR_STAT__DMAIOCStat_MASK) >>
  610. ACP_EXTERNAL_INTR_STAT__DMAIOCStat__SHIFT));
  611. if ((intr_flag & BIT(ACP_TO_I2S_DMA_CH_NUM)) != 0) {
  612. valid_irq = true;
  613. snd_pcm_period_elapsed(irq_data->play_i2ssp_stream);
  614. acp_reg_write((intr_flag & BIT(ACP_TO_I2S_DMA_CH_NUM)) << 16,
  615. acp_mmio, mmACP_EXTERNAL_INTR_STAT);
  616. }
  617. if ((intr_flag & BIT(ACP_TO_I2S_DMA_BT_INSTANCE_CH_NUM)) != 0) {
  618. valid_irq = true;
  619. snd_pcm_period_elapsed(irq_data->play_i2sbt_stream);
  620. acp_reg_write((intr_flag &
  621. BIT(ACP_TO_I2S_DMA_BT_INSTANCE_CH_NUM)) << 16,
  622. acp_mmio, mmACP_EXTERNAL_INTR_STAT);
  623. }
  624. if ((intr_flag & BIT(I2S_TO_ACP_DMA_CH_NUM)) != 0) {
  625. valid_irq = true;
  626. if (acp_reg_read(acp_mmio, mmACP_DMA_CUR_DSCR_14) ==
  627. CAPTURE_START_DMA_DESCR_CH15)
  628. dscr_idx = CAPTURE_END_DMA_DESCR_CH14;
  629. else
  630. dscr_idx = CAPTURE_START_DMA_DESCR_CH14;
  631. config_acp_dma_channel(acp_mmio, ACP_TO_SYSRAM_CH_NUM, dscr_idx,
  632. 1, 0);
  633. acp_dma_start(acp_mmio, ACP_TO_SYSRAM_CH_NUM, false);
  634. snd_pcm_period_elapsed(irq_data->capture_i2ssp_stream);
  635. acp_reg_write((intr_flag & BIT(I2S_TO_ACP_DMA_CH_NUM)) << 16,
  636. acp_mmio, mmACP_EXTERNAL_INTR_STAT);
  637. }
  638. if ((intr_flag & BIT(I2S_TO_ACP_DMA_BT_INSTANCE_CH_NUM)) != 0) {
  639. valid_irq = true;
  640. if (acp_reg_read(acp_mmio, mmACP_DMA_CUR_DSCR_10) ==
  641. CAPTURE_START_DMA_DESCR_CH11)
  642. dscr_idx = CAPTURE_END_DMA_DESCR_CH10;
  643. else
  644. dscr_idx = CAPTURE_START_DMA_DESCR_CH10;
  645. config_acp_dma_channel(acp_mmio,
  646. ACP_TO_SYSRAM_BT_INSTANCE_CH_NUM,
  647. dscr_idx, 1, 0);
  648. acp_dma_start(acp_mmio, ACP_TO_SYSRAM_BT_INSTANCE_CH_NUM,
  649. false);
  650. snd_pcm_period_elapsed(irq_data->capture_i2sbt_stream);
  651. acp_reg_write((intr_flag &
  652. BIT(I2S_TO_ACP_DMA_BT_INSTANCE_CH_NUM)) << 16,
  653. acp_mmio, mmACP_EXTERNAL_INTR_STAT);
  654. }
  655. if (valid_irq)
  656. return IRQ_HANDLED;
  657. else
  658. return IRQ_NONE;
  659. }
  660. static int acp_dma_open(struct snd_pcm_substream *substream)
  661. {
  662. u16 bank;
  663. int ret = 0;
  664. struct snd_pcm_runtime *runtime = substream->runtime;
  665. struct snd_soc_pcm_runtime *prtd = substream->private_data;
  666. struct snd_soc_component *component = snd_soc_rtdcom_lookup(prtd,
  667. DRV_NAME);
  668. struct audio_drv_data *intr_data = dev_get_drvdata(component->dev);
  669. struct audio_substream_data *adata =
  670. kzalloc(sizeof(struct audio_substream_data), GFP_KERNEL);
  671. if (!adata)
  672. return -ENOMEM;
  673. if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
  674. switch (intr_data->asic_type) {
  675. case CHIP_STONEY:
  676. runtime->hw = acp_st_pcm_hardware_playback;
  677. break;
  678. default:
  679. runtime->hw = acp_pcm_hardware_playback;
  680. }
  681. } else {
  682. switch (intr_data->asic_type) {
  683. case CHIP_STONEY:
  684. runtime->hw = acp_st_pcm_hardware_capture;
  685. break;
  686. default:
  687. runtime->hw = acp_pcm_hardware_capture;
  688. }
  689. }
  690. ret = snd_pcm_hw_constraint_integer(runtime,
  691. SNDRV_PCM_HW_PARAM_PERIODS);
  692. if (ret < 0) {
  693. dev_err(component->dev, "set integer constraint failed\n");
  694. kfree(adata);
  695. return ret;
  696. }
  697. adata->acp_mmio = intr_data->acp_mmio;
  698. runtime->private_data = adata;
  699. /*
  700. * Enable ACP irq, when neither playback or capture streams are
  701. * active by the time when a new stream is being opened.
  702. * This enablement is not required for another stream, if current
  703. * stream is not closed
  704. */
  705. if (!intr_data->play_i2ssp_stream && !intr_data->capture_i2ssp_stream &&
  706. !intr_data->play_i2sbt_stream && !intr_data->capture_i2sbt_stream)
  707. acp_reg_write(1, adata->acp_mmio, mmACP_EXTERNAL_INTR_ENB);
  708. if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
  709. /*
  710. * For Stoney, Memory gating is disabled,i.e SRAM Banks
  711. * won't be turned off. The default state for SRAM banks is ON.
  712. * Setting SRAM bank state code skipped for STONEY platform.
  713. */
  714. if (intr_data->asic_type != CHIP_STONEY) {
  715. for (bank = 1; bank <= 4; bank++)
  716. acp_set_sram_bank_state(intr_data->acp_mmio,
  717. bank, true);
  718. }
  719. } else {
  720. if (intr_data->asic_type != CHIP_STONEY) {
  721. for (bank = 5; bank <= 8; bank++)
  722. acp_set_sram_bank_state(intr_data->acp_mmio,
  723. bank, true);
  724. }
  725. }
  726. return 0;
  727. }
  728. static int acp_dma_hw_params(struct snd_pcm_substream *substream,
  729. struct snd_pcm_hw_params *params)
  730. {
  731. int status;
  732. uint64_t size;
  733. u32 val = 0;
  734. struct page *pg;
  735. struct snd_pcm_runtime *runtime;
  736. struct audio_substream_data *rtd;
  737. struct snd_soc_pcm_runtime *prtd = substream->private_data;
  738. struct snd_soc_component *component = snd_soc_rtdcom_lookup(prtd,
  739. DRV_NAME);
  740. struct audio_drv_data *adata = dev_get_drvdata(component->dev);
  741. struct snd_soc_card *card = prtd->card;
  742. struct acp_platform_info *pinfo = snd_soc_card_get_drvdata(card);
  743. runtime = substream->runtime;
  744. rtd = runtime->private_data;
  745. if (WARN_ON(!rtd))
  746. return -EINVAL;
  747. if (pinfo) {
  748. rtd->i2s_instance = pinfo->i2s_instance;
  749. rtd->capture_channel = pinfo->capture_channel;
  750. }
  751. if (adata->asic_type == CHIP_STONEY) {
  752. val = acp_reg_read(adata->acp_mmio,
  753. mmACP_I2S_16BIT_RESOLUTION_EN);
  754. if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
  755. switch (rtd->i2s_instance) {
  756. case I2S_BT_INSTANCE:
  757. val |= ACP_I2S_BT_16BIT_RESOLUTION_EN;
  758. break;
  759. case I2S_SP_INSTANCE:
  760. default:
  761. val |= ACP_I2S_SP_16BIT_RESOLUTION_EN;
  762. }
  763. } else {
  764. switch (rtd->i2s_instance) {
  765. case I2S_BT_INSTANCE:
  766. val |= ACP_I2S_BT_16BIT_RESOLUTION_EN;
  767. break;
  768. case I2S_SP_INSTANCE:
  769. default:
  770. val |= ACP_I2S_MIC_16BIT_RESOLUTION_EN;
  771. }
  772. }
  773. acp_reg_write(val, adata->acp_mmio,
  774. mmACP_I2S_16BIT_RESOLUTION_EN);
  775. }
  776. if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
  777. switch (rtd->i2s_instance) {
  778. case I2S_BT_INSTANCE:
  779. rtd->pte_offset = ACP_ST_BT_PLAYBACK_PTE_OFFSET;
  780. rtd->ch1 = SYSRAM_TO_ACP_BT_INSTANCE_CH_NUM;
  781. rtd->ch2 = ACP_TO_I2S_DMA_BT_INSTANCE_CH_NUM;
  782. rtd->sram_bank = ACP_SRAM_BANK_3_ADDRESS;
  783. rtd->destination = TO_BLUETOOTH;
  784. rtd->dma_dscr_idx_1 = PLAYBACK_START_DMA_DESCR_CH8;
  785. rtd->dma_dscr_idx_2 = PLAYBACK_START_DMA_DESCR_CH9;
  786. rtd->byte_cnt_high_reg_offset =
  787. mmACP_I2S_BT_TRANSMIT_BYTE_CNT_HIGH;
  788. rtd->byte_cnt_low_reg_offset =
  789. mmACP_I2S_BT_TRANSMIT_BYTE_CNT_LOW;
  790. adata->play_i2sbt_stream = substream;
  791. break;
  792. case I2S_SP_INSTANCE:
  793. default:
  794. switch (adata->asic_type) {
  795. case CHIP_STONEY:
  796. rtd->pte_offset = ACP_ST_PLAYBACK_PTE_OFFSET;
  797. break;
  798. default:
  799. rtd->pte_offset = ACP_PLAYBACK_PTE_OFFSET;
  800. }
  801. rtd->ch1 = SYSRAM_TO_ACP_CH_NUM;
  802. rtd->ch2 = ACP_TO_I2S_DMA_CH_NUM;
  803. rtd->sram_bank = ACP_SRAM_BANK_1_ADDRESS;
  804. rtd->destination = TO_ACP_I2S_1;
  805. rtd->dma_dscr_idx_1 = PLAYBACK_START_DMA_DESCR_CH12;
  806. rtd->dma_dscr_idx_2 = PLAYBACK_START_DMA_DESCR_CH13;
  807. rtd->byte_cnt_high_reg_offset =
  808. mmACP_I2S_TRANSMIT_BYTE_CNT_HIGH;
  809. rtd->byte_cnt_low_reg_offset =
  810. mmACP_I2S_TRANSMIT_BYTE_CNT_LOW;
  811. adata->play_i2ssp_stream = substream;
  812. }
  813. } else {
  814. switch (rtd->i2s_instance) {
  815. case I2S_BT_INSTANCE:
  816. rtd->pte_offset = ACP_ST_BT_CAPTURE_PTE_OFFSET;
  817. rtd->ch1 = I2S_TO_ACP_DMA_BT_INSTANCE_CH_NUM;
  818. rtd->ch2 = ACP_TO_SYSRAM_BT_INSTANCE_CH_NUM;
  819. rtd->sram_bank = ACP_SRAM_BANK_4_ADDRESS;
  820. rtd->destination = FROM_BLUETOOTH;
  821. rtd->dma_dscr_idx_1 = CAPTURE_START_DMA_DESCR_CH10;
  822. rtd->dma_dscr_idx_2 = CAPTURE_START_DMA_DESCR_CH11;
  823. rtd->byte_cnt_high_reg_offset =
  824. mmACP_I2S_BT_RECEIVE_BYTE_CNT_HIGH;
  825. rtd->byte_cnt_low_reg_offset =
  826. mmACP_I2S_BT_RECEIVE_BYTE_CNT_LOW;
  827. rtd->dma_curr_dscr = mmACP_DMA_CUR_DSCR_11;
  828. adata->capture_i2sbt_stream = substream;
  829. break;
  830. case I2S_SP_INSTANCE:
  831. default:
  832. rtd->pte_offset = ACP_CAPTURE_PTE_OFFSET;
  833. rtd->ch1 = I2S_TO_ACP_DMA_CH_NUM;
  834. rtd->ch2 = ACP_TO_SYSRAM_CH_NUM;
  835. switch (adata->asic_type) {
  836. case CHIP_STONEY:
  837. rtd->pte_offset = ACP_ST_CAPTURE_PTE_OFFSET;
  838. rtd->sram_bank = ACP_SRAM_BANK_2_ADDRESS;
  839. break;
  840. default:
  841. rtd->pte_offset = ACP_CAPTURE_PTE_OFFSET;
  842. rtd->sram_bank = ACP_SRAM_BANK_5_ADDRESS;
  843. }
  844. rtd->destination = FROM_ACP_I2S_1;
  845. rtd->dma_dscr_idx_1 = CAPTURE_START_DMA_DESCR_CH14;
  846. rtd->dma_dscr_idx_2 = CAPTURE_START_DMA_DESCR_CH15;
  847. rtd->byte_cnt_high_reg_offset =
  848. mmACP_I2S_RECEIVED_BYTE_CNT_HIGH;
  849. rtd->byte_cnt_low_reg_offset =
  850. mmACP_I2S_RECEIVED_BYTE_CNT_LOW;
  851. rtd->dma_curr_dscr = mmACP_DMA_CUR_DSCR_15;
  852. adata->capture_i2ssp_stream = substream;
  853. }
  854. }
  855. size = params_buffer_bytes(params);
  856. status = snd_pcm_lib_malloc_pages(substream, size);
  857. if (status < 0)
  858. return status;
  859. memset(substream->runtime->dma_area, 0, params_buffer_bytes(params));
  860. pg = virt_to_page(substream->dma_buffer.area);
  861. if (pg) {
  862. acp_set_sram_bank_state(rtd->acp_mmio, 0, true);
  863. /* Save for runtime private data */
  864. rtd->pg = pg;
  865. rtd->order = get_order(size);
  866. /* Fill the page table entries in ACP SRAM */
  867. rtd->pg = pg;
  868. rtd->size = size;
  869. rtd->num_of_pages = PAGE_ALIGN(size) >> PAGE_SHIFT;
  870. rtd->direction = substream->stream;
  871. config_acp_dma(rtd->acp_mmio, rtd, adata->asic_type);
  872. status = 0;
  873. } else {
  874. status = -ENOMEM;
  875. }
  876. return status;
  877. }
  878. static int acp_dma_hw_free(struct snd_pcm_substream *substream)
  879. {
  880. return snd_pcm_lib_free_pages(substream);
  881. }
  882. static u64 acp_get_byte_count(struct audio_substream_data *rtd)
  883. {
  884. union acp_dma_count byte_count;
  885. byte_count.bcount.high = acp_reg_read(rtd->acp_mmio,
  886. rtd->byte_cnt_high_reg_offset);
  887. byte_count.bcount.low = acp_reg_read(rtd->acp_mmio,
  888. rtd->byte_cnt_low_reg_offset);
  889. return byte_count.bytescount;
  890. }
  891. static snd_pcm_uframes_t acp_dma_pointer(struct snd_pcm_substream *substream)
  892. {
  893. u32 buffersize;
  894. u32 pos = 0;
  895. u64 bytescount = 0;
  896. u16 dscr;
  897. u32 period_bytes, delay;
  898. struct snd_pcm_runtime *runtime = substream->runtime;
  899. struct audio_substream_data *rtd = runtime->private_data;
  900. if (!rtd)
  901. return -EINVAL;
  902. if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) {
  903. period_bytes = frames_to_bytes(runtime, runtime->period_size);
  904. dscr = acp_reg_read(rtd->acp_mmio, rtd->dma_curr_dscr);
  905. if (dscr == rtd->dma_dscr_idx_1)
  906. pos = period_bytes;
  907. else
  908. pos = 0;
  909. bytescount = acp_get_byte_count(rtd);
  910. if (bytescount > rtd->bytescount)
  911. bytescount -= rtd->bytescount;
  912. delay = do_div(bytescount, period_bytes);
  913. runtime->delay = bytes_to_frames(runtime, delay);
  914. } else {
  915. buffersize = frames_to_bytes(runtime, runtime->buffer_size);
  916. bytescount = acp_get_byte_count(rtd);
  917. if (bytescount > rtd->bytescount)
  918. bytescount -= rtd->bytescount;
  919. pos = do_div(bytescount, buffersize);
  920. }
  921. return bytes_to_frames(runtime, pos);
  922. }
  923. static int acp_dma_mmap(struct snd_pcm_substream *substream,
  924. struct vm_area_struct *vma)
  925. {
  926. return snd_pcm_lib_default_mmap(substream, vma);
  927. }
  928. static int acp_dma_prepare(struct snd_pcm_substream *substream)
  929. {
  930. struct snd_pcm_runtime *runtime = substream->runtime;
  931. struct audio_substream_data *rtd = runtime->private_data;
  932. u16 ch_acp_sysmem, ch_acp_i2s;
  933. if (!rtd)
  934. return -EINVAL;
  935. if (rtd->direction == SNDRV_PCM_STREAM_PLAYBACK) {
  936. ch_acp_sysmem = rtd->ch1;
  937. ch_acp_i2s = rtd->ch2;
  938. } else {
  939. ch_acp_i2s = rtd->ch1;
  940. ch_acp_sysmem = rtd->ch2;
  941. }
  942. config_acp_dma_channel(rtd->acp_mmio,
  943. ch_acp_sysmem,
  944. rtd->dma_dscr_idx_1,
  945. NUM_DSCRS_PER_CHANNEL, 0);
  946. config_acp_dma_channel(rtd->acp_mmio,
  947. ch_acp_i2s,
  948. rtd->dma_dscr_idx_2,
  949. NUM_DSCRS_PER_CHANNEL, 0);
  950. return 0;
  951. }
  952. static int acp_dma_trigger(struct snd_pcm_substream *substream, int cmd)
  953. {
  954. int ret;
  955. struct snd_pcm_runtime *runtime = substream->runtime;
  956. struct audio_substream_data *rtd = runtime->private_data;
  957. if (!rtd)
  958. return -EINVAL;
  959. switch (cmd) {
  960. case SNDRV_PCM_TRIGGER_START:
  961. case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
  962. case SNDRV_PCM_TRIGGER_RESUME:
  963. rtd->bytescount = acp_get_byte_count(rtd);
  964. if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) {
  965. if (rtd->capture_channel == CAP_CHANNEL0) {
  966. acp_dma_cap_channel_disable(rtd->acp_mmio,
  967. CAP_CHANNEL1);
  968. acp_dma_cap_channel_enable(rtd->acp_mmio,
  969. CAP_CHANNEL0);
  970. }
  971. if (rtd->capture_channel == CAP_CHANNEL1) {
  972. acp_dma_cap_channel_disable(rtd->acp_mmio,
  973. CAP_CHANNEL0);
  974. acp_dma_cap_channel_enable(rtd->acp_mmio,
  975. CAP_CHANNEL1);
  976. }
  977. acp_dma_start(rtd->acp_mmio, rtd->ch1, true);
  978. } else {
  979. acp_dma_start(rtd->acp_mmio, rtd->ch1, true);
  980. acp_dma_start(rtd->acp_mmio, rtd->ch2, true);
  981. }
  982. ret = 0;
  983. break;
  984. case SNDRV_PCM_TRIGGER_STOP:
  985. case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
  986. case SNDRV_PCM_TRIGGER_SUSPEND:
  987. acp_dma_stop(rtd->acp_mmio, rtd->ch2);
  988. ret = acp_dma_stop(rtd->acp_mmio, rtd->ch1);
  989. break;
  990. default:
  991. ret = -EINVAL;
  992. }
  993. return ret;
  994. }
  995. static int acp_dma_new(struct snd_soc_pcm_runtime *rtd)
  996. {
  997. int ret;
  998. struct snd_soc_component *component = snd_soc_rtdcom_lookup(rtd,
  999. DRV_NAME);
  1000. struct audio_drv_data *adata = dev_get_drvdata(component->dev);
  1001. switch (adata->asic_type) {
  1002. case CHIP_STONEY:
  1003. ret = snd_pcm_lib_preallocate_pages_for_all(rtd->pcm,
  1004. SNDRV_DMA_TYPE_DEV,
  1005. NULL, ST_MIN_BUFFER,
  1006. ST_MAX_BUFFER);
  1007. break;
  1008. default:
  1009. ret = snd_pcm_lib_preallocate_pages_for_all(rtd->pcm,
  1010. SNDRV_DMA_TYPE_DEV,
  1011. NULL, MIN_BUFFER,
  1012. MAX_BUFFER);
  1013. break;
  1014. }
  1015. if (ret < 0)
  1016. dev_err(component->dev,
  1017. "buffer preallocation failure error:%d\n", ret);
  1018. return ret;
  1019. }
  1020. static int acp_dma_close(struct snd_pcm_substream *substream)
  1021. {
  1022. u16 bank;
  1023. struct snd_pcm_runtime *runtime = substream->runtime;
  1024. struct audio_substream_data *rtd = runtime->private_data;
  1025. struct snd_soc_pcm_runtime *prtd = substream->private_data;
  1026. struct snd_soc_component *component = snd_soc_rtdcom_lookup(prtd,
  1027. DRV_NAME);
  1028. struct audio_drv_data *adata = dev_get_drvdata(component->dev);
  1029. if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
  1030. switch (rtd->i2s_instance) {
  1031. case I2S_BT_INSTANCE:
  1032. adata->play_i2sbt_stream = NULL;
  1033. break;
  1034. case I2S_SP_INSTANCE:
  1035. default:
  1036. adata->play_i2ssp_stream = NULL;
  1037. /*
  1038. * For Stoney, Memory gating is disabled,i.e SRAM Banks
  1039. * won't be turned off. The default state for SRAM banks
  1040. * is ON.Setting SRAM bank state code skipped for STONEY
  1041. * platform. Added condition checks for Carrizo platform
  1042. * only.
  1043. */
  1044. if (adata->asic_type != CHIP_STONEY) {
  1045. for (bank = 1; bank <= 4; bank++)
  1046. acp_set_sram_bank_state(adata->acp_mmio,
  1047. bank, false);
  1048. }
  1049. }
  1050. } else {
  1051. switch (rtd->i2s_instance) {
  1052. case I2S_BT_INSTANCE:
  1053. adata->capture_i2sbt_stream = NULL;
  1054. break;
  1055. case I2S_SP_INSTANCE:
  1056. default:
  1057. adata->capture_i2ssp_stream = NULL;
  1058. if (adata->asic_type != CHIP_STONEY) {
  1059. for (bank = 5; bank <= 8; bank++)
  1060. acp_set_sram_bank_state(adata->acp_mmio,
  1061. bank, false);
  1062. }
  1063. }
  1064. }
  1065. /*
  1066. * Disable ACP irq, when the current stream is being closed and
  1067. * another stream is also not active.
  1068. */
  1069. if (!adata->play_i2ssp_stream && !adata->capture_i2ssp_stream &&
  1070. !adata->play_i2sbt_stream && !adata->capture_i2sbt_stream)
  1071. acp_reg_write(0, adata->acp_mmio, mmACP_EXTERNAL_INTR_ENB);
  1072. kfree(rtd);
  1073. return 0;
  1074. }
  1075. static const struct snd_pcm_ops acp_dma_ops = {
  1076. .open = acp_dma_open,
  1077. .close = acp_dma_close,
  1078. .ioctl = snd_pcm_lib_ioctl,
  1079. .hw_params = acp_dma_hw_params,
  1080. .hw_free = acp_dma_hw_free,
  1081. .trigger = acp_dma_trigger,
  1082. .pointer = acp_dma_pointer,
  1083. .mmap = acp_dma_mmap,
  1084. .prepare = acp_dma_prepare,
  1085. };
  1086. static const struct snd_soc_component_driver acp_asoc_platform = {
  1087. .name = DRV_NAME,
  1088. .ops = &acp_dma_ops,
  1089. .pcm_new = acp_dma_new,
  1090. };
  1091. static int acp_audio_probe(struct platform_device *pdev)
  1092. {
  1093. int status;
  1094. struct audio_drv_data *audio_drv_data;
  1095. struct resource *res;
  1096. const u32 *pdata = pdev->dev.platform_data;
  1097. if (!pdata) {
  1098. dev_err(&pdev->dev, "Missing platform data\n");
  1099. return -ENODEV;
  1100. }
  1101. audio_drv_data = devm_kzalloc(&pdev->dev, sizeof(struct audio_drv_data),
  1102. GFP_KERNEL);
  1103. if (!audio_drv_data)
  1104. return -ENOMEM;
  1105. res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
  1106. audio_drv_data->acp_mmio = devm_ioremap_resource(&pdev->dev, res);
  1107. if (IS_ERR(audio_drv_data->acp_mmio))
  1108. return PTR_ERR(audio_drv_data->acp_mmio);
  1109. /*
  1110. * The following members gets populated in device 'open'
  1111. * function. Till then interrupts are disabled in 'acp_init'
  1112. * and device doesn't generate any interrupts.
  1113. */
  1114. audio_drv_data->play_i2ssp_stream = NULL;
  1115. audio_drv_data->capture_i2ssp_stream = NULL;
  1116. audio_drv_data->play_i2sbt_stream = NULL;
  1117. audio_drv_data->capture_i2sbt_stream = NULL;
  1118. audio_drv_data->asic_type = *pdata;
  1119. res = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
  1120. if (!res) {
  1121. dev_err(&pdev->dev, "IORESOURCE_IRQ FAILED\n");
  1122. return -ENODEV;
  1123. }
  1124. status = devm_request_irq(&pdev->dev, res->start, dma_irq_handler,
  1125. 0, "ACP_IRQ", &pdev->dev);
  1126. if (status) {
  1127. dev_err(&pdev->dev, "ACP IRQ request failed\n");
  1128. return status;
  1129. }
  1130. dev_set_drvdata(&pdev->dev, audio_drv_data);
  1131. /* Initialize the ACP */
  1132. status = acp_init(audio_drv_data->acp_mmio, audio_drv_data->asic_type);
  1133. if (status) {
  1134. dev_err(&pdev->dev, "ACP Init failed status:%d\n", status);
  1135. return status;
  1136. }
  1137. status = devm_snd_soc_register_component(&pdev->dev,
  1138. &acp_asoc_platform, NULL, 0);
  1139. if (status != 0) {
  1140. dev_err(&pdev->dev, "Fail to register ALSA platform device\n");
  1141. return status;
  1142. }
  1143. pm_runtime_set_autosuspend_delay(&pdev->dev, 10000);
  1144. pm_runtime_use_autosuspend(&pdev->dev);
  1145. pm_runtime_enable(&pdev->dev);
  1146. return status;
  1147. }
  1148. static int acp_audio_remove(struct platform_device *pdev)
  1149. {
  1150. int status;
  1151. struct audio_drv_data *adata = dev_get_drvdata(&pdev->dev);
  1152. status = acp_deinit(adata->acp_mmio);
  1153. if (status)
  1154. dev_err(&pdev->dev, "ACP Deinit failed status:%d\n", status);
  1155. pm_runtime_disable(&pdev->dev);
  1156. return 0;
  1157. }
  1158. static int acp_pcm_resume(struct device *dev)
  1159. {
  1160. u16 bank;
  1161. int status;
  1162. struct audio_substream_data *rtd;
  1163. struct audio_drv_data *adata = dev_get_drvdata(dev);
  1164. status = acp_init(adata->acp_mmio, adata->asic_type);
  1165. if (status) {
  1166. dev_err(dev, "ACP Init failed status:%d\n", status);
  1167. return status;
  1168. }
  1169. if (adata->play_i2ssp_stream && adata->play_i2ssp_stream->runtime) {
  1170. /*
  1171. * For Stoney, Memory gating is disabled,i.e SRAM Banks
  1172. * won't be turned off. The default state for SRAM banks is ON.
  1173. * Setting SRAM bank state code skipped for STONEY platform.
  1174. */
  1175. if (adata->asic_type != CHIP_STONEY) {
  1176. for (bank = 1; bank <= 4; bank++)
  1177. acp_set_sram_bank_state(adata->acp_mmio, bank,
  1178. true);
  1179. }
  1180. rtd = adata->play_i2ssp_stream->runtime->private_data;
  1181. config_acp_dma(adata->acp_mmio, rtd, adata->asic_type);
  1182. }
  1183. if (adata->capture_i2ssp_stream &&
  1184. adata->capture_i2ssp_stream->runtime) {
  1185. if (adata->asic_type != CHIP_STONEY) {
  1186. for (bank = 5; bank <= 8; bank++)
  1187. acp_set_sram_bank_state(adata->acp_mmio, bank,
  1188. true);
  1189. }
  1190. rtd = adata->capture_i2ssp_stream->runtime->private_data;
  1191. config_acp_dma(adata->acp_mmio, rtd, adata->asic_type);
  1192. }
  1193. if (adata->asic_type != CHIP_CARRIZO) {
  1194. if (adata->play_i2sbt_stream &&
  1195. adata->play_i2sbt_stream->runtime) {
  1196. rtd = adata->play_i2sbt_stream->runtime->private_data;
  1197. config_acp_dma(adata->acp_mmio, rtd, adata->asic_type);
  1198. }
  1199. if (adata->capture_i2sbt_stream &&
  1200. adata->capture_i2sbt_stream->runtime) {
  1201. rtd = adata->capture_i2sbt_stream->runtime->private_data;
  1202. config_acp_dma(adata->acp_mmio, rtd, adata->asic_type);
  1203. }
  1204. }
  1205. acp_reg_write(1, adata->acp_mmio, mmACP_EXTERNAL_INTR_ENB);
  1206. return 0;
  1207. }
  1208. static int acp_pcm_runtime_suspend(struct device *dev)
  1209. {
  1210. int status;
  1211. struct audio_drv_data *adata = dev_get_drvdata(dev);
  1212. status = acp_deinit(adata->acp_mmio);
  1213. if (status)
  1214. dev_err(dev, "ACP Deinit failed status:%d\n", status);
  1215. acp_reg_write(0, adata->acp_mmio, mmACP_EXTERNAL_INTR_ENB);
  1216. return 0;
  1217. }
  1218. static int acp_pcm_runtime_resume(struct device *dev)
  1219. {
  1220. int status;
  1221. struct audio_drv_data *adata = dev_get_drvdata(dev);
  1222. status = acp_init(adata->acp_mmio, adata->asic_type);
  1223. if (status) {
  1224. dev_err(dev, "ACP Init failed status:%d\n", status);
  1225. return status;
  1226. }
  1227. acp_reg_write(1, adata->acp_mmio, mmACP_EXTERNAL_INTR_ENB);
  1228. return 0;
  1229. }
  1230. static const struct dev_pm_ops acp_pm_ops = {
  1231. .resume = acp_pcm_resume,
  1232. .runtime_suspend = acp_pcm_runtime_suspend,
  1233. .runtime_resume = acp_pcm_runtime_resume,
  1234. };
  1235. static struct platform_driver acp_dma_driver = {
  1236. .probe = acp_audio_probe,
  1237. .remove = acp_audio_remove,
  1238. .driver = {
  1239. .name = DRV_NAME,
  1240. .pm = &acp_pm_ops,
  1241. },
  1242. };
  1243. module_platform_driver(acp_dma_driver);
  1244. MODULE_AUTHOR("Vijendar.Mukunda@amd.com");
  1245. MODULE_AUTHOR("Maruthi.Bayyavarapu@amd.com");
  1246. MODULE_DESCRIPTION("AMD ACP PCM Driver");
  1247. MODULE_LICENSE("GPL v2");
  1248. MODULE_ALIAS("platform:"DRV_NAME);