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