^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) // SPDX-License-Identifier: GPL-2.0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) // Copyright (c) 2011-2017, The Linux Foundation. All rights reserved.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) // Copyright (c) 2018, Linaro Limited
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) #include <linux/slab.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) #include <linux/kernel.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) #include <linux/uaccess.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) #include <linux/wait.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) #include <linux/jiffies.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) #include <linux/sched.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) #include <linux/module.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) #include <linux/kref.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) #include <linux/of.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) #include <linux/of_platform.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) #include <linux/spinlock.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) #include <linux/delay.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) #include <linux/soc/qcom/apr.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) #include <sound/soc.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) #include <sound/soc-dai.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) #include <sound/pcm.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) #include <sound/pcm_params.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) #include "q6dsp-errno.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) #include "q6core.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) #include "q6afe.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) /* AFE CMDs */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) #define AFE_PORT_CMD_DEVICE_START 0x000100E5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) #define AFE_PORT_CMD_DEVICE_STOP 0x000100E6
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) #define AFE_PORT_CMD_SET_PARAM_V2 0x000100EF
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) #define AFE_SVC_CMD_SET_PARAM 0x000100f3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) #define AFE_PORT_CMDRSP_GET_PARAM_V2 0x00010106
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) #define AFE_PARAM_ID_HDMI_CONFIG 0x00010210
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) #define AFE_MODULE_AUDIO_DEV_INTERFACE 0x0001020C
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) #define AFE_MODULE_TDM 0x0001028A
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) #define AFE_PARAM_ID_CDC_SLIMBUS_SLAVE_CFG 0x00010235
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) #define AFE_PARAM_ID_LPAIF_CLK_CONFIG 0x00010238
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) #define AFE_PARAM_ID_INT_DIGITAL_CDC_CLK_CONFIG 0x00010239
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) #define AFE_PARAM_ID_SLIMBUS_CONFIG 0x00010212
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) #define AFE_PARAM_ID_I2S_CONFIG 0x0001020D
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) #define AFE_PARAM_ID_TDM_CONFIG 0x0001029D
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) #define AFE_PARAM_ID_PORT_SLOT_MAPPING_CONFIG 0x00010297
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) #define AFE_PARAM_ID_CODEC_DMA_CONFIG 0x000102B8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) #define AFE_CMD_REMOTE_LPASS_CORE_HW_VOTE_REQUEST 0x000100f4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) #define AFE_CMD_RSP_REMOTE_LPASS_CORE_HW_VOTE_REQUEST 0x000100f5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) #define AFE_CMD_REMOTE_LPASS_CORE_HW_DEVOTE_REQUEST 0x000100f6
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) /* I2S config specific */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) #define AFE_API_VERSION_I2S_CONFIG 0x1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) #define AFE_PORT_I2S_SD0 0x1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) #define AFE_PORT_I2S_SD1 0x2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) #define AFE_PORT_I2S_SD2 0x3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) #define AFE_PORT_I2S_SD3 0x4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) #define AFE_PORT_I2S_SD0_MASK BIT(0x0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) #define AFE_PORT_I2S_SD1_MASK BIT(0x1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) #define AFE_PORT_I2S_SD2_MASK BIT(0x2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) #define AFE_PORT_I2S_SD3_MASK BIT(0x3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) #define AFE_PORT_I2S_SD0_1_MASK GENMASK(1, 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) #define AFE_PORT_I2S_SD2_3_MASK GENMASK(3, 2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) #define AFE_PORT_I2S_SD0_1_2_MASK GENMASK(2, 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) #define AFE_PORT_I2S_SD0_1_2_3_MASK GENMASK(3, 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) #define AFE_PORT_I2S_QUAD01 0x5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) #define AFE_PORT_I2S_QUAD23 0x6
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) #define AFE_PORT_I2S_6CHS 0x7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) #define AFE_PORT_I2S_8CHS 0x8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) #define AFE_PORT_I2S_MONO 0x0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) #define AFE_PORT_I2S_STEREO 0x1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) #define AFE_PORT_CONFIG_I2S_WS_SRC_EXTERNAL 0x0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) #define AFE_PORT_CONFIG_I2S_WS_SRC_INTERNAL 0x1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) #define AFE_LINEAR_PCM_DATA 0x0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) /* Port IDs */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) #define AFE_API_VERSION_HDMI_CONFIG 0x1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) #define AFE_PORT_ID_MULTICHAN_HDMI_RX 0x100E
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) #define AFE_PORT_ID_HDMI_OVER_DP_RX 0x6020
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) #define AFE_API_VERSION_SLIMBUS_CONFIG 0x1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) /* Clock set API version */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) #define AFE_API_VERSION_CLOCK_SET 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) #define Q6AFE_LPASS_CLK_CONFIG_API_VERSION 0x1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) #define AFE_MODULE_CLOCK_SET 0x0001028F
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) #define AFE_PARAM_ID_CLOCK_SET 0x00010290
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) /* SLIMbus Rx port on channel 0. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) #define AFE_PORT_ID_SLIMBUS_MULTI_CHAN_0_RX 0x4000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) /* SLIMbus Tx port on channel 0. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) #define AFE_PORT_ID_SLIMBUS_MULTI_CHAN_0_TX 0x4001
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) /* SLIMbus Rx port on channel 1. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) #define AFE_PORT_ID_SLIMBUS_MULTI_CHAN_1_RX 0x4002
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) /* SLIMbus Tx port on channel 1. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) #define AFE_PORT_ID_SLIMBUS_MULTI_CHAN_1_TX 0x4003
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) /* SLIMbus Rx port on channel 2. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) #define AFE_PORT_ID_SLIMBUS_MULTI_CHAN_2_RX 0x4004
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) /* SLIMbus Tx port on channel 2. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) #define AFE_PORT_ID_SLIMBUS_MULTI_CHAN_2_TX 0x4005
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) /* SLIMbus Rx port on channel 3. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) #define AFE_PORT_ID_SLIMBUS_MULTI_CHAN_3_RX 0x4006
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) /* SLIMbus Tx port on channel 3. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) #define AFE_PORT_ID_SLIMBUS_MULTI_CHAN_3_TX 0x4007
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) /* SLIMbus Rx port on channel 4. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) #define AFE_PORT_ID_SLIMBUS_MULTI_CHAN_4_RX 0x4008
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) /* SLIMbus Tx port on channel 4. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) #define AFE_PORT_ID_SLIMBUS_MULTI_CHAN_4_TX 0x4009
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) /* SLIMbus Rx port on channel 5. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) #define AFE_PORT_ID_SLIMBUS_MULTI_CHAN_5_RX 0x400a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) /* SLIMbus Tx port on channel 5. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) #define AFE_PORT_ID_SLIMBUS_MULTI_CHAN_5_TX 0x400b
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) /* SLIMbus Rx port on channel 6. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) #define AFE_PORT_ID_SLIMBUS_MULTI_CHAN_6_RX 0x400c
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) /* SLIMbus Tx port on channel 6. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) #define AFE_PORT_ID_SLIMBUS_MULTI_CHAN_6_TX 0x400d
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) #define AFE_PORT_ID_PRIMARY_MI2S_RX 0x1000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) #define AFE_PORT_ID_PRIMARY_MI2S_TX 0x1001
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) #define AFE_PORT_ID_SECONDARY_MI2S_RX 0x1002
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) #define AFE_PORT_ID_SECONDARY_MI2S_TX 0x1003
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) #define AFE_PORT_ID_TERTIARY_MI2S_RX 0x1004
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) #define AFE_PORT_ID_TERTIARY_MI2S_TX 0x1005
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) #define AFE_PORT_ID_QUATERNARY_MI2S_RX 0x1006
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) #define AFE_PORT_ID_QUATERNARY_MI2S_TX 0x1007
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) /* Start of the range of port IDs for TDM devices. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) #define AFE_PORT_ID_TDM_PORT_RANGE_START 0x9000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) /* End of the range of port IDs for TDM devices. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) #define AFE_PORT_ID_TDM_PORT_RANGE_END \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) (AFE_PORT_ID_TDM_PORT_RANGE_START+0x50-1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) /* Size of the range of port IDs for TDM ports. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) #define AFE_PORT_ID_TDM_PORT_RANGE_SIZE \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) (AFE_PORT_ID_TDM_PORT_RANGE_END - \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) AFE_PORT_ID_TDM_PORT_RANGE_START+1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) #define AFE_PORT_ID_PRIMARY_TDM_RX \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) (AFE_PORT_ID_TDM_PORT_RANGE_START + 0x00)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) #define AFE_PORT_ID_PRIMARY_TDM_RX_1 \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) (AFE_PORT_ID_PRIMARY_TDM_RX + 0x02)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) #define AFE_PORT_ID_PRIMARY_TDM_RX_2 \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) (AFE_PORT_ID_PRIMARY_TDM_RX + 0x04)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) #define AFE_PORT_ID_PRIMARY_TDM_RX_3 \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) (AFE_PORT_ID_PRIMARY_TDM_RX + 0x06)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) #define AFE_PORT_ID_PRIMARY_TDM_RX_4 \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) (AFE_PORT_ID_PRIMARY_TDM_RX + 0x08)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) #define AFE_PORT_ID_PRIMARY_TDM_RX_5 \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) (AFE_PORT_ID_PRIMARY_TDM_RX + 0x0A)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) #define AFE_PORT_ID_PRIMARY_TDM_RX_6 \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) (AFE_PORT_ID_PRIMARY_TDM_RX + 0x0C)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) #define AFE_PORT_ID_PRIMARY_TDM_RX_7 \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) (AFE_PORT_ID_PRIMARY_TDM_RX + 0x0E)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) #define AFE_PORT_ID_PRIMARY_TDM_TX \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) (AFE_PORT_ID_TDM_PORT_RANGE_START + 0x01)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) #define AFE_PORT_ID_PRIMARY_TDM_TX_1 \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) (AFE_PORT_ID_PRIMARY_TDM_TX + 0x02)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) #define AFE_PORT_ID_PRIMARY_TDM_TX_2 \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) (AFE_PORT_ID_PRIMARY_TDM_TX + 0x04)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) #define AFE_PORT_ID_PRIMARY_TDM_TX_3 \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) (AFE_PORT_ID_PRIMARY_TDM_TX + 0x06)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) #define AFE_PORT_ID_PRIMARY_TDM_TX_4 \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) (AFE_PORT_ID_PRIMARY_TDM_TX + 0x08)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) #define AFE_PORT_ID_PRIMARY_TDM_TX_5 \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) (AFE_PORT_ID_PRIMARY_TDM_TX + 0x0A)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) #define AFE_PORT_ID_PRIMARY_TDM_TX_6 \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) (AFE_PORT_ID_PRIMARY_TDM_TX + 0x0C)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) #define AFE_PORT_ID_PRIMARY_TDM_TX_7 \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) (AFE_PORT_ID_PRIMARY_TDM_TX + 0x0E)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) #define AFE_PORT_ID_SECONDARY_TDM_RX \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) (AFE_PORT_ID_TDM_PORT_RANGE_START + 0x10)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) #define AFE_PORT_ID_SECONDARY_TDM_RX_1 \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) (AFE_PORT_ID_SECONDARY_TDM_RX + 0x02)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) #define AFE_PORT_ID_SECONDARY_TDM_RX_2 \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) (AFE_PORT_ID_SECONDARY_TDM_RX + 0x04)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) #define AFE_PORT_ID_SECONDARY_TDM_RX_3 \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) (AFE_PORT_ID_SECONDARY_TDM_RX + 0x06)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) #define AFE_PORT_ID_SECONDARY_TDM_RX_4 \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) (AFE_PORT_ID_SECONDARY_TDM_RX + 0x08)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) #define AFE_PORT_ID_SECONDARY_TDM_RX_5 \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) (AFE_PORT_ID_SECONDARY_TDM_RX + 0x0A)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) #define AFE_PORT_ID_SECONDARY_TDM_RX_6 \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) (AFE_PORT_ID_SECONDARY_TDM_RX + 0x0C)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) #define AFE_PORT_ID_SECONDARY_TDM_RX_7 \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) (AFE_PORT_ID_SECONDARY_TDM_RX + 0x0E)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) #define AFE_PORT_ID_SECONDARY_TDM_TX \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) (AFE_PORT_ID_TDM_PORT_RANGE_START + 0x11)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) #define AFE_PORT_ID_SECONDARY_TDM_TX_1 \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) (AFE_PORT_ID_SECONDARY_TDM_TX + 0x02)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) #define AFE_PORT_ID_SECONDARY_TDM_TX_2 \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) (AFE_PORT_ID_SECONDARY_TDM_TX + 0x04)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) #define AFE_PORT_ID_SECONDARY_TDM_TX_3 \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) (AFE_PORT_ID_SECONDARY_TDM_TX + 0x06)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) #define AFE_PORT_ID_SECONDARY_TDM_TX_4 \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) (AFE_PORT_ID_SECONDARY_TDM_TX + 0x08)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) #define AFE_PORT_ID_SECONDARY_TDM_TX_5 \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) (AFE_PORT_ID_SECONDARY_TDM_TX + 0x0A)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) #define AFE_PORT_ID_SECONDARY_TDM_TX_6 \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) (AFE_PORT_ID_SECONDARY_TDM_TX + 0x0C)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) #define AFE_PORT_ID_SECONDARY_TDM_TX_7 \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) (AFE_PORT_ID_SECONDARY_TDM_TX + 0x0E)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) #define AFE_PORT_ID_TERTIARY_TDM_RX \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) (AFE_PORT_ID_TDM_PORT_RANGE_START + 0x20)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) #define AFE_PORT_ID_TERTIARY_TDM_RX_1 \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) (AFE_PORT_ID_TERTIARY_TDM_RX + 0x02)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) #define AFE_PORT_ID_TERTIARY_TDM_RX_2 \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) (AFE_PORT_ID_TERTIARY_TDM_RX + 0x04)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) #define AFE_PORT_ID_TERTIARY_TDM_RX_3 \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) (AFE_PORT_ID_TERTIARY_TDM_RX + 0x06)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) #define AFE_PORT_ID_TERTIARY_TDM_RX_4 \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) (AFE_PORT_ID_TERTIARY_TDM_RX + 0x08)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) #define AFE_PORT_ID_TERTIARY_TDM_RX_5 \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) (AFE_PORT_ID_TERTIARY_TDM_RX + 0x0A)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) #define AFE_PORT_ID_TERTIARY_TDM_RX_6 \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) (AFE_PORT_ID_TERTIARY_TDM_RX + 0x0C)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) #define AFE_PORT_ID_TERTIARY_TDM_RX_7 \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) (AFE_PORT_ID_TERTIARY_TDM_RX + 0x0E)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) #define AFE_PORT_ID_TERTIARY_TDM_TX \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) (AFE_PORT_ID_TDM_PORT_RANGE_START + 0x21)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) #define AFE_PORT_ID_TERTIARY_TDM_TX_1 \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) (AFE_PORT_ID_TERTIARY_TDM_TX + 0x02)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) #define AFE_PORT_ID_TERTIARY_TDM_TX_2 \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) (AFE_PORT_ID_TERTIARY_TDM_TX + 0x04)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) #define AFE_PORT_ID_TERTIARY_TDM_TX_3 \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) (AFE_PORT_ID_TERTIARY_TDM_TX + 0x06)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) #define AFE_PORT_ID_TERTIARY_TDM_TX_4 \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) (AFE_PORT_ID_TERTIARY_TDM_TX + 0x08)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) #define AFE_PORT_ID_TERTIARY_TDM_TX_5 \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) (AFE_PORT_ID_TERTIARY_TDM_TX + 0x0A)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) #define AFE_PORT_ID_TERTIARY_TDM_TX_6 \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) (AFE_PORT_ID_TERTIARY_TDM_TX + 0x0C)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) #define AFE_PORT_ID_TERTIARY_TDM_TX_7 \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) (AFE_PORT_ID_TERTIARY_TDM_TX + 0x0E)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) #define AFE_PORT_ID_QUATERNARY_TDM_RX \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) (AFE_PORT_ID_TDM_PORT_RANGE_START + 0x30)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) #define AFE_PORT_ID_QUATERNARY_TDM_RX_1 \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) (AFE_PORT_ID_QUATERNARY_TDM_RX + 0x02)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) #define AFE_PORT_ID_QUATERNARY_TDM_RX_2 \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) (AFE_PORT_ID_QUATERNARY_TDM_RX + 0x04)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) #define AFE_PORT_ID_QUATERNARY_TDM_RX_3 \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) (AFE_PORT_ID_QUATERNARY_TDM_RX + 0x06)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) #define AFE_PORT_ID_QUATERNARY_TDM_RX_4 \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) (AFE_PORT_ID_QUATERNARY_TDM_RX + 0x08)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) #define AFE_PORT_ID_QUATERNARY_TDM_RX_5 \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) (AFE_PORT_ID_QUATERNARY_TDM_RX + 0x0A)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) #define AFE_PORT_ID_QUATERNARY_TDM_RX_6 \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) (AFE_PORT_ID_QUATERNARY_TDM_RX + 0x0C)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) #define AFE_PORT_ID_QUATERNARY_TDM_RX_7 \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) (AFE_PORT_ID_QUATERNARY_TDM_RX + 0x0E)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) #define AFE_PORT_ID_QUATERNARY_TDM_TX \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) (AFE_PORT_ID_TDM_PORT_RANGE_START + 0x31)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) #define AFE_PORT_ID_QUATERNARY_TDM_TX_1 \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) (AFE_PORT_ID_QUATERNARY_TDM_TX + 0x02)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) #define AFE_PORT_ID_QUATERNARY_TDM_TX_2 \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) (AFE_PORT_ID_QUATERNARY_TDM_TX + 0x04)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) #define AFE_PORT_ID_QUATERNARY_TDM_TX_3 \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) (AFE_PORT_ID_QUATERNARY_TDM_TX + 0x06)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) #define AFE_PORT_ID_QUATERNARY_TDM_TX_4 \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) (AFE_PORT_ID_QUATERNARY_TDM_TX + 0x08)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) #define AFE_PORT_ID_QUATERNARY_TDM_TX_5 \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) (AFE_PORT_ID_QUATERNARY_TDM_TX + 0x0A)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) #define AFE_PORT_ID_QUATERNARY_TDM_TX_6 \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) (AFE_PORT_ID_QUATERNARY_TDM_TX + 0x0C)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) #define AFE_PORT_ID_QUATERNARY_TDM_TX_7 \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) (AFE_PORT_ID_QUATERNARY_TDM_TX + 0x0E)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) #define AFE_PORT_ID_QUINARY_TDM_RX \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) (AFE_PORT_ID_TDM_PORT_RANGE_START + 0x40)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) #define AFE_PORT_ID_QUINARY_TDM_RX_1 \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) (AFE_PORT_ID_QUINARY_TDM_RX + 0x02)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) #define AFE_PORT_ID_QUINARY_TDM_RX_2 \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) (AFE_PORT_ID_QUINARY_TDM_RX + 0x04)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) #define AFE_PORT_ID_QUINARY_TDM_RX_3 \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) (AFE_PORT_ID_QUINARY_TDM_RX + 0x06)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) #define AFE_PORT_ID_QUINARY_TDM_RX_4 \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) (AFE_PORT_ID_QUINARY_TDM_RX + 0x08)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) #define AFE_PORT_ID_QUINARY_TDM_RX_5 \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) (AFE_PORT_ID_QUINARY_TDM_RX + 0x0A)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) #define AFE_PORT_ID_QUINARY_TDM_RX_6 \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) (AFE_PORT_ID_QUINARY_TDM_RX + 0x0C)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) #define AFE_PORT_ID_QUINARY_TDM_RX_7 \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) (AFE_PORT_ID_QUINARY_TDM_RX + 0x0E)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) #define AFE_PORT_ID_QUINARY_TDM_TX \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) (AFE_PORT_ID_TDM_PORT_RANGE_START + 0x41)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) #define AFE_PORT_ID_QUINARY_TDM_TX_1 \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) (AFE_PORT_ID_QUINARY_TDM_TX + 0x02)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) #define AFE_PORT_ID_QUINARY_TDM_TX_2 \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) (AFE_PORT_ID_QUINARY_TDM_TX + 0x04)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) #define AFE_PORT_ID_QUINARY_TDM_TX_3 \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) (AFE_PORT_ID_QUINARY_TDM_TX + 0x06)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) #define AFE_PORT_ID_QUINARY_TDM_TX_4 \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) (AFE_PORT_ID_QUINARY_TDM_TX + 0x08)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) #define AFE_PORT_ID_QUINARY_TDM_TX_5 \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) (AFE_PORT_ID_QUINARY_TDM_TX + 0x0A)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) #define AFE_PORT_ID_QUINARY_TDM_TX_6 \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) (AFE_PORT_ID_QUINARY_TDM_TX + 0x0C)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) #define AFE_PORT_ID_QUINARY_TDM_TX_7 \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) (AFE_PORT_ID_QUINARY_TDM_TX + 0x0E)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) /* AFE WSA Codec DMA Rx port 0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) #define AFE_PORT_ID_WSA_CODEC_DMA_RX_0 0xB000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) /* AFE WSA Codec DMA Tx port 0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) #define AFE_PORT_ID_WSA_CODEC_DMA_TX_0 0xB001
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) /* AFE WSA Codec DMA Rx port 1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) #define AFE_PORT_ID_WSA_CODEC_DMA_RX_1 0xB002
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) /* AFE WSA Codec DMA Tx port 1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) #define AFE_PORT_ID_WSA_CODEC_DMA_TX_1 0xB003
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) /* AFE WSA Codec DMA Tx port 2 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) #define AFE_PORT_ID_WSA_CODEC_DMA_TX_2 0xB005
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) /* AFE VA Codec DMA Tx port 0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) #define AFE_PORT_ID_VA_CODEC_DMA_TX_0 0xB021
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) /* AFE VA Codec DMA Tx port 1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) #define AFE_PORT_ID_VA_CODEC_DMA_TX_1 0xB023
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) /* AFE VA Codec DMA Tx port 2 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) #define AFE_PORT_ID_VA_CODEC_DMA_TX_2 0xB025
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) /* AFE Rx Codec DMA Rx port 0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) #define AFE_PORT_ID_RX_CODEC_DMA_RX_0 0xB030
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) /* AFE Tx Codec DMA Tx port 0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) #define AFE_PORT_ID_TX_CODEC_DMA_TX_0 0xB031
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) /* AFE Rx Codec DMA Rx port 1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) #define AFE_PORT_ID_RX_CODEC_DMA_RX_1 0xB032
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) /* AFE Tx Codec DMA Tx port 1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) #define AFE_PORT_ID_TX_CODEC_DMA_TX_1 0xB033
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) /* AFE Rx Codec DMA Rx port 2 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331) #define AFE_PORT_ID_RX_CODEC_DMA_RX_2 0xB034
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) /* AFE Tx Codec DMA Tx port 2 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) #define AFE_PORT_ID_TX_CODEC_DMA_TX_2 0xB035
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) /* AFE Rx Codec DMA Rx port 3 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) #define AFE_PORT_ID_RX_CODEC_DMA_RX_3 0xB036
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) /* AFE Tx Codec DMA Tx port 3 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) #define AFE_PORT_ID_TX_CODEC_DMA_TX_3 0xB037
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) /* AFE Rx Codec DMA Rx port 4 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) #define AFE_PORT_ID_RX_CODEC_DMA_RX_4 0xB038
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) /* AFE Tx Codec DMA Tx port 4 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) #define AFE_PORT_ID_TX_CODEC_DMA_TX_4 0xB039
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) /* AFE Rx Codec DMA Rx port 5 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) #define AFE_PORT_ID_RX_CODEC_DMA_RX_5 0xB03A
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) /* AFE Tx Codec DMA Tx port 5 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) #define AFE_PORT_ID_TX_CODEC_DMA_TX_5 0xB03B
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) /* AFE Rx Codec DMA Rx port 6 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) #define AFE_PORT_ID_RX_CODEC_DMA_RX_6 0xB03C
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) /* AFE Rx Codec DMA Rx port 7 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349) #define AFE_PORT_ID_RX_CODEC_DMA_RX_7 0xB03E
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351) #define Q6AFE_LPASS_MODE_CLK1_VALID 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) #define Q6AFE_LPASS_MODE_CLK2_VALID 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) #define Q6AFE_LPASS_CLK_SRC_INTERNAL 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) #define Q6AFE_LPASS_CLK_ROOT_DEFAULT 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) #define AFE_API_VERSION_TDM_CONFIG 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) #define AFE_API_VERSION_SLOT_MAPPING_CONFIG 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) #define AFE_API_VERSION_CODEC_DMA_CONFIG 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) #define TIMEOUT_MS 1000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) #define AFE_CMD_RESP_AVAIL 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) #define AFE_CMD_RESP_NONE 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) #define AFE_CLK_TOKEN 1024
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) struct q6afe {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) struct apr_device *apr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) struct device *dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) struct q6core_svc_api_info ainfo;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) struct mutex lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) struct aprv2_ibasic_rsp_result_t result;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) wait_queue_head_t wait;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371) struct list_head port_list;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372) spinlock_t port_list_lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) struct afe_port_cmd_device_start {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) u16 port_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377) u16 reserved;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) } __packed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380) struct afe_port_cmd_device_stop {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381) u16 port_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) u16 reserved;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383) /* Reserved for 32-bit alignment. This field must be set to 0.*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) } __packed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) struct afe_port_param_data_v2 {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387) u32 module_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388) u32 param_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389) u16 param_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) u16 reserved;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391) } __packed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393) struct afe_svc_cmd_set_param {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394) uint32_t payload_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395) uint32_t payload_address_lsw;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396) uint32_t payload_address_msw;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397) uint32_t mem_map_handle;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398) } __packed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400) struct afe_port_cmd_set_param_v2 {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401) u16 port_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402) u16 payload_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403) u32 payload_address_lsw;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404) u32 payload_address_msw;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405) u32 mem_map_handle;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406) } __packed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408) struct afe_param_id_hdmi_multi_chan_audio_cfg {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409) u32 hdmi_cfg_minor_version;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410) u16 datatype;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411) u16 channel_allocation;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412) u32 sample_rate;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413) u16 bit_width;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414) u16 reserved;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) } __packed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417) struct afe_param_id_slimbus_cfg {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418) u32 sb_cfg_minor_version;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419) /* Minor version used for tracking the version of the SLIMBUS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420) * configuration interface.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421) * Supported values: #AFE_API_VERSION_SLIMBUS_CONFIG
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424) u16 slimbus_dev_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425) /* SLIMbus hardware device ID, which is required to handle
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426) * multiple SLIMbus hardware blocks.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427) * Supported values: - #AFE_SLIMBUS_DEVICE_1 - #AFE_SLIMBUS_DEVICE_2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429) u16 bit_width;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430) /* Bit width of the sample.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431) * Supported values: 16, 24
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433) u16 data_format;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434) /* Data format supported by the SLIMbus hardware. The default is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435) * 0 (#AFE_SB_DATA_FORMAT_NOT_INDICATED), which indicates the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436) * hardware does not perform any format conversions before the data
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437) * transfer.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439) u16 num_channels;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440) /* Number of channels.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441) * Supported values: 1 to #AFE_PORT_MAX_AUDIO_CHAN_CNT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 443) u8 shared_ch_mapping[AFE_PORT_MAX_AUDIO_CHAN_CNT];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 444) /* Mapping of shared channel IDs (128 to 255) to which the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 445) * master port is to be connected.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 446) * Shared_channel_mapping[i] represents the shared channel assigned
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 447) * for audio channel i in multichannel audio data.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 448) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 449) u32 sample_rate;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 450) /* Sampling rate of the port.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 451) * Supported values:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 452) * - #AFE_PORT_SAMPLE_RATE_8K
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 453) * - #AFE_PORT_SAMPLE_RATE_16K
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 454) * - #AFE_PORT_SAMPLE_RATE_48K
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 455) * - #AFE_PORT_SAMPLE_RATE_96K
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 456) * - #AFE_PORT_SAMPLE_RATE_192K
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 457) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 458) } __packed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 459)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 460) struct afe_clk_cfg {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 461) u32 i2s_cfg_minor_version;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 462) u32 clk_val1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 463) u32 clk_val2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 464) u16 clk_src;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 465) u16 clk_root;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 466) u16 clk_set_mode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 467) u16 reserved;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 468) } __packed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 469)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 470) struct afe_digital_clk_cfg {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 471) u32 i2s_cfg_minor_version;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 472) u32 clk_val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 473) u16 clk_root;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 474) u16 reserved;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 475) } __packed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 476)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 477) struct afe_param_id_i2s_cfg {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 478) u32 i2s_cfg_minor_version;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 479) u16 bit_width;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 480) u16 channel_mode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 481) u16 mono_stereo;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 482) u16 ws_src;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 483) u32 sample_rate;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 484) u16 data_format;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 485) u16 reserved;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 486) } __packed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 487)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 488) struct afe_param_id_tdm_cfg {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 489) u32 tdm_cfg_minor_version;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 490) u32 num_channels;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 491) u32 sample_rate;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 492) u32 bit_width;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 493) u16 data_format;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 494) u16 sync_mode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 495) u16 sync_src;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 496) u16 nslots_per_frame;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 497) u16 ctrl_data_out_enable;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 498) u16 ctrl_invert_sync_pulse;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 499) u16 ctrl_sync_data_delay;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 500) u16 slot_width;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 501) u32 slot_mask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 502) } __packed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 503)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 504) struct afe_param_id_cdc_dma_cfg {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 505) u32 cdc_dma_cfg_minor_version;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 506) u32 sample_rate;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 507) u16 bit_width;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 508) u16 data_format;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 509) u16 num_channels;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 510) u16 active_channels_mask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 511) } __packed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 512)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 513) union afe_port_config {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 514) struct afe_param_id_hdmi_multi_chan_audio_cfg hdmi_multi_ch;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 515) struct afe_param_id_slimbus_cfg slim_cfg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 516) struct afe_param_id_i2s_cfg i2s_cfg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 517) struct afe_param_id_tdm_cfg tdm_cfg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 518) struct afe_param_id_cdc_dma_cfg dma_cfg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 519) } __packed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 520)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 521)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 522) struct afe_clk_set {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 523) uint32_t clk_set_minor_version;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 524) uint32_t clk_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 525) uint32_t clk_freq_in_hz;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 526) uint16_t clk_attri;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 527) uint16_t clk_root;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 528) uint32_t enable;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 529) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 530)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 531) struct afe_param_id_slot_mapping_cfg {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 532) u32 minor_version;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 533) u16 num_channels;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 534) u16 bitwidth;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 535) u32 data_align_type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 536) u16 ch_mapping[AFE_PORT_MAX_AUDIO_CHAN_CNT];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 537) } __packed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 538)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 539) struct q6afe_port {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 540) wait_queue_head_t wait;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 541) union afe_port_config port_cfg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 542) struct afe_param_id_slot_mapping_cfg *scfg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 543) struct aprv2_ibasic_rsp_result_t result;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 544) int token;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 545) int id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 546) int cfg_type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 547) struct q6afe *afe;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 548) struct kref refcount;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 549) struct list_head node;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 550) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 551)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 552) struct afe_cmd_remote_lpass_core_hw_vote_request {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 553) uint32_t hw_block_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 554) char client_name[8];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 555) } __packed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 556)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 557) struct afe_cmd_remote_lpass_core_hw_devote_request {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 558) uint32_t hw_block_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 559) uint32_t client_handle;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 560) } __packed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 561)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 562)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 563)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 564) struct afe_port_map {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 565) int port_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 566) int token;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 567) int is_rx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 568) int is_dig_pcm;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 569) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 570)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 571) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 572) * Mapping between Virtual Port IDs to DSP AFE Port ID
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 573) * On B Family SoCs DSP Port IDs are consistent across multiple SoCs
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 574) * on A Family SoCs DSP port IDs are same as virtual Port IDs.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 575) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 576)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 577) static struct afe_port_map port_maps[AFE_PORT_MAX] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 578) [HDMI_RX] = { AFE_PORT_ID_MULTICHAN_HDMI_RX, HDMI_RX, 1, 1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 579) [SLIMBUS_0_RX] = { AFE_PORT_ID_SLIMBUS_MULTI_CHAN_0_RX,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 580) SLIMBUS_0_RX, 1, 1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 581) [SLIMBUS_1_RX] = { AFE_PORT_ID_SLIMBUS_MULTI_CHAN_1_RX,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 582) SLIMBUS_1_RX, 1, 1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 583) [SLIMBUS_2_RX] = { AFE_PORT_ID_SLIMBUS_MULTI_CHAN_2_RX,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 584) SLIMBUS_2_RX, 1, 1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 585) [SLIMBUS_3_RX] = { AFE_PORT_ID_SLIMBUS_MULTI_CHAN_3_RX,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 586) SLIMBUS_3_RX, 1, 1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 587) [SLIMBUS_4_RX] = { AFE_PORT_ID_SLIMBUS_MULTI_CHAN_4_RX,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 588) SLIMBUS_4_RX, 1, 1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 589) [SLIMBUS_5_RX] = { AFE_PORT_ID_SLIMBUS_MULTI_CHAN_5_RX,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 590) SLIMBUS_5_RX, 1, 1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 591) [SLIMBUS_6_RX] = { AFE_PORT_ID_SLIMBUS_MULTI_CHAN_6_RX,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 592) SLIMBUS_6_RX, 1, 1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 593) [SLIMBUS_0_TX] = { AFE_PORT_ID_SLIMBUS_MULTI_CHAN_0_TX,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 594) SLIMBUS_0_TX, 0, 1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 595) [SLIMBUS_1_TX] = { AFE_PORT_ID_SLIMBUS_MULTI_CHAN_1_TX,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 596) SLIMBUS_1_TX, 0, 1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 597) [SLIMBUS_2_TX] = { AFE_PORT_ID_SLIMBUS_MULTI_CHAN_2_TX,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 598) SLIMBUS_2_TX, 0, 1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 599) [SLIMBUS_3_TX] = { AFE_PORT_ID_SLIMBUS_MULTI_CHAN_3_TX,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 600) SLIMBUS_3_TX, 0, 1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 601) [SLIMBUS_4_TX] = { AFE_PORT_ID_SLIMBUS_MULTI_CHAN_4_TX,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 602) SLIMBUS_4_TX, 0, 1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 603) [SLIMBUS_5_TX] = { AFE_PORT_ID_SLIMBUS_MULTI_CHAN_5_TX,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 604) SLIMBUS_5_TX, 0, 1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 605) [SLIMBUS_6_TX] = { AFE_PORT_ID_SLIMBUS_MULTI_CHAN_6_TX,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 606) SLIMBUS_6_TX, 0, 1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 607) [PRIMARY_MI2S_RX] = { AFE_PORT_ID_PRIMARY_MI2S_RX,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 608) PRIMARY_MI2S_RX, 1, 1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 609) [PRIMARY_MI2S_TX] = { AFE_PORT_ID_PRIMARY_MI2S_TX,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 610) PRIMARY_MI2S_RX, 0, 1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 611) [SECONDARY_MI2S_RX] = { AFE_PORT_ID_SECONDARY_MI2S_RX,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 612) SECONDARY_MI2S_RX, 1, 1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 613) [SECONDARY_MI2S_TX] = { AFE_PORT_ID_SECONDARY_MI2S_TX,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 614) SECONDARY_MI2S_TX, 0, 1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 615) [TERTIARY_MI2S_RX] = { AFE_PORT_ID_TERTIARY_MI2S_RX,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 616) TERTIARY_MI2S_RX, 1, 1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 617) [TERTIARY_MI2S_TX] = { AFE_PORT_ID_TERTIARY_MI2S_TX,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 618) TERTIARY_MI2S_TX, 0, 1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 619) [QUATERNARY_MI2S_RX] = { AFE_PORT_ID_QUATERNARY_MI2S_RX,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 620) QUATERNARY_MI2S_RX, 1, 1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 621) [QUATERNARY_MI2S_TX] = { AFE_PORT_ID_QUATERNARY_MI2S_TX,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 622) QUATERNARY_MI2S_TX, 0, 1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 623) [PRIMARY_TDM_RX_0] = { AFE_PORT_ID_PRIMARY_TDM_RX,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 624) PRIMARY_TDM_RX_0, 1, 1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 625) [PRIMARY_TDM_TX_0] = { AFE_PORT_ID_PRIMARY_TDM_TX,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 626) PRIMARY_TDM_TX_0, 0, 1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 627) [PRIMARY_TDM_RX_1] = { AFE_PORT_ID_PRIMARY_TDM_RX_1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 628) PRIMARY_TDM_RX_1, 1, 1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 629) [PRIMARY_TDM_TX_1] = { AFE_PORT_ID_PRIMARY_TDM_TX_1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 630) PRIMARY_TDM_TX_1, 0, 1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 631) [PRIMARY_TDM_RX_2] = { AFE_PORT_ID_PRIMARY_TDM_RX_2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 632) PRIMARY_TDM_RX_2, 1, 1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 633) [PRIMARY_TDM_TX_2] = { AFE_PORT_ID_PRIMARY_TDM_TX_2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 634) PRIMARY_TDM_TX_2, 0, 1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 635) [PRIMARY_TDM_RX_3] = { AFE_PORT_ID_PRIMARY_TDM_RX_3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 636) PRIMARY_TDM_RX_3, 1, 1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 637) [PRIMARY_TDM_TX_3] = { AFE_PORT_ID_PRIMARY_TDM_TX_3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 638) PRIMARY_TDM_TX_3, 0, 1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 639) [PRIMARY_TDM_RX_4] = { AFE_PORT_ID_PRIMARY_TDM_RX_4,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 640) PRIMARY_TDM_RX_4, 1, 1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 641) [PRIMARY_TDM_TX_4] = { AFE_PORT_ID_PRIMARY_TDM_TX_4,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 642) PRIMARY_TDM_TX_4, 0, 1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 643) [PRIMARY_TDM_RX_5] = { AFE_PORT_ID_PRIMARY_TDM_RX_5,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 644) PRIMARY_TDM_RX_5, 1, 1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 645) [PRIMARY_TDM_TX_5] = { AFE_PORT_ID_PRIMARY_TDM_TX_5,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 646) PRIMARY_TDM_TX_5, 0, 1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 647) [PRIMARY_TDM_RX_6] = { AFE_PORT_ID_PRIMARY_TDM_RX_6,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 648) PRIMARY_TDM_RX_6, 1, 1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 649) [PRIMARY_TDM_TX_6] = { AFE_PORT_ID_PRIMARY_TDM_TX_6,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 650) PRIMARY_TDM_TX_6, 0, 1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 651) [PRIMARY_TDM_RX_7] = { AFE_PORT_ID_PRIMARY_TDM_RX_7,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 652) PRIMARY_TDM_RX_7, 1, 1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 653) [PRIMARY_TDM_TX_7] = { AFE_PORT_ID_PRIMARY_TDM_TX_7,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 654) PRIMARY_TDM_TX_7, 0, 1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 655) [SECONDARY_TDM_RX_0] = { AFE_PORT_ID_SECONDARY_TDM_RX,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 656) SECONDARY_TDM_RX_0, 1, 1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 657) [SECONDARY_TDM_TX_0] = { AFE_PORT_ID_SECONDARY_TDM_TX,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 658) SECONDARY_TDM_TX_0, 0, 1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 659) [SECONDARY_TDM_RX_1] = { AFE_PORT_ID_SECONDARY_TDM_RX_1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 660) SECONDARY_TDM_RX_1, 1, 1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 661) [SECONDARY_TDM_TX_1] = { AFE_PORT_ID_SECONDARY_TDM_TX_1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 662) SECONDARY_TDM_TX_1, 0, 1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 663) [SECONDARY_TDM_RX_2] = { AFE_PORT_ID_SECONDARY_TDM_RX_2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 664) SECONDARY_TDM_RX_2, 1, 1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 665) [SECONDARY_TDM_TX_2] = { AFE_PORT_ID_SECONDARY_TDM_TX_2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 666) SECONDARY_TDM_TX_2, 0, 1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 667) [SECONDARY_TDM_RX_3] = { AFE_PORT_ID_SECONDARY_TDM_RX_3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 668) SECONDARY_TDM_RX_3, 1, 1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 669) [SECONDARY_TDM_TX_3] = { AFE_PORT_ID_SECONDARY_TDM_TX_3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 670) SECONDARY_TDM_TX_3, 0, 1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 671) [SECONDARY_TDM_RX_4] = { AFE_PORT_ID_SECONDARY_TDM_RX_4,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 672) SECONDARY_TDM_RX_4, 1, 1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 673) [SECONDARY_TDM_TX_4] = { AFE_PORT_ID_SECONDARY_TDM_TX_4,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 674) SECONDARY_TDM_TX_4, 0, 1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 675) [SECONDARY_TDM_RX_5] = { AFE_PORT_ID_SECONDARY_TDM_RX_5,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 676) SECONDARY_TDM_RX_5, 1, 1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 677) [SECONDARY_TDM_TX_5] = { AFE_PORT_ID_SECONDARY_TDM_TX_5,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 678) SECONDARY_TDM_TX_5, 0, 1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 679) [SECONDARY_TDM_RX_6] = { AFE_PORT_ID_SECONDARY_TDM_RX_6,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 680) SECONDARY_TDM_RX_6, 1, 1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 681) [SECONDARY_TDM_TX_6] = { AFE_PORT_ID_SECONDARY_TDM_TX_6,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 682) SECONDARY_TDM_TX_6, 0, 1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 683) [SECONDARY_TDM_RX_7] = { AFE_PORT_ID_SECONDARY_TDM_RX_7,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 684) SECONDARY_TDM_RX_7, 1, 1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 685) [SECONDARY_TDM_TX_7] = { AFE_PORT_ID_SECONDARY_TDM_TX_7,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 686) SECONDARY_TDM_TX_7, 0, 1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 687) [TERTIARY_TDM_RX_0] = { AFE_PORT_ID_TERTIARY_TDM_RX,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 688) TERTIARY_TDM_RX_0, 1, 1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 689) [TERTIARY_TDM_TX_0] = { AFE_PORT_ID_TERTIARY_TDM_TX,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 690) TERTIARY_TDM_TX_0, 0, 1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 691) [TERTIARY_TDM_RX_1] = { AFE_PORT_ID_TERTIARY_TDM_RX_1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 692) TERTIARY_TDM_RX_1, 1, 1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 693) [TERTIARY_TDM_TX_1] = { AFE_PORT_ID_TERTIARY_TDM_TX_1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 694) TERTIARY_TDM_TX_1, 0, 1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 695) [TERTIARY_TDM_RX_2] = { AFE_PORT_ID_TERTIARY_TDM_RX_2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 696) TERTIARY_TDM_RX_2, 1, 1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 697) [TERTIARY_TDM_TX_2] = { AFE_PORT_ID_TERTIARY_TDM_TX_2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 698) TERTIARY_TDM_TX_2, 0, 1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 699) [TERTIARY_TDM_RX_3] = { AFE_PORT_ID_TERTIARY_TDM_RX_3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 700) TERTIARY_TDM_RX_3, 1, 1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 701) [TERTIARY_TDM_TX_3] = { AFE_PORT_ID_TERTIARY_TDM_TX_3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 702) TERTIARY_TDM_TX_3, 0, 1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 703) [TERTIARY_TDM_RX_4] = { AFE_PORT_ID_TERTIARY_TDM_RX_4,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 704) TERTIARY_TDM_RX_4, 1, 1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 705) [TERTIARY_TDM_TX_4] = { AFE_PORT_ID_TERTIARY_TDM_TX_4,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 706) TERTIARY_TDM_TX_4, 0, 1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 707) [TERTIARY_TDM_RX_5] = { AFE_PORT_ID_TERTIARY_TDM_RX_5,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 708) TERTIARY_TDM_RX_5, 1, 1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 709) [TERTIARY_TDM_TX_5] = { AFE_PORT_ID_TERTIARY_TDM_TX_5,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 710) TERTIARY_TDM_TX_5, 0, 1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 711) [TERTIARY_TDM_RX_6] = { AFE_PORT_ID_TERTIARY_TDM_RX_6,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 712) TERTIARY_TDM_RX_6, 1, 1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 713) [TERTIARY_TDM_TX_6] = { AFE_PORT_ID_TERTIARY_TDM_TX_6,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 714) TERTIARY_TDM_TX_6, 0, 1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 715) [TERTIARY_TDM_RX_7] = { AFE_PORT_ID_TERTIARY_TDM_RX_7,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 716) TERTIARY_TDM_RX_7, 1, 1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 717) [TERTIARY_TDM_TX_7] = { AFE_PORT_ID_TERTIARY_TDM_TX_7,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 718) TERTIARY_TDM_TX_7, 0, 1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 719) [QUATERNARY_TDM_RX_0] = { AFE_PORT_ID_QUATERNARY_TDM_RX,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 720) QUATERNARY_TDM_RX_0, 1, 1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 721) [QUATERNARY_TDM_TX_0] = { AFE_PORT_ID_QUATERNARY_TDM_TX,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 722) QUATERNARY_TDM_TX_0, 0, 1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 723) [QUATERNARY_TDM_RX_1] = { AFE_PORT_ID_QUATERNARY_TDM_RX_1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 724) QUATERNARY_TDM_RX_1, 1, 1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 725) [QUATERNARY_TDM_TX_1] = { AFE_PORT_ID_QUATERNARY_TDM_TX_1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 726) QUATERNARY_TDM_TX_1, 0, 1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 727) [QUATERNARY_TDM_RX_2] = { AFE_PORT_ID_QUATERNARY_TDM_RX_2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 728) QUATERNARY_TDM_RX_2, 1, 1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 729) [QUATERNARY_TDM_TX_2] = { AFE_PORT_ID_QUATERNARY_TDM_TX_2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 730) QUATERNARY_TDM_TX_2, 0, 1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 731) [QUATERNARY_TDM_RX_3] = { AFE_PORT_ID_QUATERNARY_TDM_RX_3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 732) QUATERNARY_TDM_RX_3, 1, 1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 733) [QUATERNARY_TDM_TX_3] = { AFE_PORT_ID_QUATERNARY_TDM_TX_3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 734) QUATERNARY_TDM_TX_3, 0, 1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 735) [QUATERNARY_TDM_RX_4] = { AFE_PORT_ID_QUATERNARY_TDM_RX_4,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 736) QUATERNARY_TDM_RX_4, 1, 1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 737) [QUATERNARY_TDM_TX_4] = { AFE_PORT_ID_QUATERNARY_TDM_TX_4,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 738) QUATERNARY_TDM_TX_4, 0, 1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 739) [QUATERNARY_TDM_RX_5] = { AFE_PORT_ID_QUATERNARY_TDM_RX_5,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 740) QUATERNARY_TDM_RX_5, 1, 1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 741) [QUATERNARY_TDM_TX_5] = { AFE_PORT_ID_QUATERNARY_TDM_TX_5,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 742) QUATERNARY_TDM_TX_5, 0, 1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 743) [QUATERNARY_TDM_RX_6] = { AFE_PORT_ID_QUATERNARY_TDM_RX_6,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 744) QUATERNARY_TDM_RX_6, 1, 1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 745) [QUATERNARY_TDM_TX_6] = { AFE_PORT_ID_QUATERNARY_TDM_TX_6,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 746) QUATERNARY_TDM_TX_6, 0, 1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 747) [QUATERNARY_TDM_RX_7] = { AFE_PORT_ID_QUATERNARY_TDM_RX_7,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 748) QUATERNARY_TDM_RX_7, 1, 1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 749) [QUATERNARY_TDM_TX_7] = { AFE_PORT_ID_QUATERNARY_TDM_TX_7,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 750) QUATERNARY_TDM_TX_7, 0, 1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 751) [QUINARY_TDM_RX_0] = { AFE_PORT_ID_QUINARY_TDM_RX,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 752) QUINARY_TDM_RX_0, 1, 1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 753) [QUINARY_TDM_TX_0] = { AFE_PORT_ID_QUINARY_TDM_TX,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 754) QUINARY_TDM_TX_0, 0, 1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 755) [QUINARY_TDM_RX_1] = { AFE_PORT_ID_QUINARY_TDM_RX_1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 756) QUINARY_TDM_RX_1, 1, 1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 757) [QUINARY_TDM_TX_1] = { AFE_PORT_ID_QUINARY_TDM_TX_1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 758) QUINARY_TDM_TX_1, 0, 1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 759) [QUINARY_TDM_RX_2] = { AFE_PORT_ID_QUINARY_TDM_RX_2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 760) QUINARY_TDM_RX_2, 1, 1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 761) [QUINARY_TDM_TX_2] = { AFE_PORT_ID_QUINARY_TDM_TX_2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 762) QUINARY_TDM_TX_2, 0, 1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 763) [QUINARY_TDM_RX_3] = { AFE_PORT_ID_QUINARY_TDM_RX_3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 764) QUINARY_TDM_RX_3, 1, 1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 765) [QUINARY_TDM_TX_3] = { AFE_PORT_ID_QUINARY_TDM_TX_3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 766) QUINARY_TDM_TX_3, 0, 1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 767) [QUINARY_TDM_RX_4] = { AFE_PORT_ID_QUINARY_TDM_RX_4,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 768) QUINARY_TDM_RX_4, 1, 1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 769) [QUINARY_TDM_TX_4] = { AFE_PORT_ID_QUINARY_TDM_TX_4,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 770) QUINARY_TDM_TX_4, 0, 1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 771) [QUINARY_TDM_RX_5] = { AFE_PORT_ID_QUINARY_TDM_RX_5,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 772) QUINARY_TDM_RX_5, 1, 1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 773) [QUINARY_TDM_TX_5] = { AFE_PORT_ID_QUINARY_TDM_TX_5,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 774) QUINARY_TDM_TX_5, 0, 1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 775) [QUINARY_TDM_RX_6] = { AFE_PORT_ID_QUINARY_TDM_RX_6,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 776) QUINARY_TDM_RX_6, 1, 1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 777) [QUINARY_TDM_TX_6] = { AFE_PORT_ID_QUINARY_TDM_TX_6,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 778) QUINARY_TDM_TX_6, 0, 1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 779) [QUINARY_TDM_RX_7] = { AFE_PORT_ID_QUINARY_TDM_RX_7,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 780) QUINARY_TDM_RX_7, 1, 1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 781) [QUINARY_TDM_TX_7] = { AFE_PORT_ID_QUINARY_TDM_TX_7,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 782) QUINARY_TDM_TX_7, 0, 1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 783) [DISPLAY_PORT_RX] = { AFE_PORT_ID_HDMI_OVER_DP_RX,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 784) DISPLAY_PORT_RX, 1, 1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 785) [WSA_CODEC_DMA_RX_0] = { AFE_PORT_ID_WSA_CODEC_DMA_RX_0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 786) WSA_CODEC_DMA_RX_0, 1, 1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 787) [WSA_CODEC_DMA_TX_0] = { AFE_PORT_ID_WSA_CODEC_DMA_TX_0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 788) WSA_CODEC_DMA_TX_0, 0, 1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 789) [WSA_CODEC_DMA_RX_1] = { AFE_PORT_ID_WSA_CODEC_DMA_RX_1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 790) WSA_CODEC_DMA_RX_1, 1, 1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 791) [WSA_CODEC_DMA_TX_1] = { AFE_PORT_ID_WSA_CODEC_DMA_TX_1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 792) WSA_CODEC_DMA_TX_1, 0, 1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 793) [WSA_CODEC_DMA_TX_2] = { AFE_PORT_ID_WSA_CODEC_DMA_TX_2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 794) WSA_CODEC_DMA_TX_2, 0, 1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 795) [VA_CODEC_DMA_TX_0] = { AFE_PORT_ID_VA_CODEC_DMA_TX_0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 796) VA_CODEC_DMA_TX_0, 0, 1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 797) [VA_CODEC_DMA_TX_1] = { AFE_PORT_ID_VA_CODEC_DMA_TX_1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 798) VA_CODEC_DMA_TX_1, 0, 1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 799) [VA_CODEC_DMA_TX_2] = { AFE_PORT_ID_VA_CODEC_DMA_TX_2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 800) VA_CODEC_DMA_TX_2, 0, 1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 801) [RX_CODEC_DMA_RX_0] = { AFE_PORT_ID_RX_CODEC_DMA_RX_0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 802) RX_CODEC_DMA_RX_0, 1, 1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 803) [TX_CODEC_DMA_TX_0] = { AFE_PORT_ID_TX_CODEC_DMA_TX_0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 804) TX_CODEC_DMA_TX_0, 0, 1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 805) [RX_CODEC_DMA_RX_1] = { AFE_PORT_ID_RX_CODEC_DMA_RX_1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 806) RX_CODEC_DMA_RX_1, 1, 1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 807) [TX_CODEC_DMA_TX_1] = { AFE_PORT_ID_TX_CODEC_DMA_TX_1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 808) TX_CODEC_DMA_TX_1, 0, 1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 809) [RX_CODEC_DMA_RX_2] = { AFE_PORT_ID_RX_CODEC_DMA_RX_2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 810) RX_CODEC_DMA_RX_2, 1, 1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 811) [TX_CODEC_DMA_TX_2] = { AFE_PORT_ID_TX_CODEC_DMA_TX_2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 812) TX_CODEC_DMA_TX_2, 0, 1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 813) [RX_CODEC_DMA_RX_3] = { AFE_PORT_ID_RX_CODEC_DMA_RX_3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 814) RX_CODEC_DMA_RX_3, 1, 1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 815) [TX_CODEC_DMA_TX_3] = { AFE_PORT_ID_TX_CODEC_DMA_TX_3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 816) TX_CODEC_DMA_TX_3, 0, 1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 817) [RX_CODEC_DMA_RX_4] = { AFE_PORT_ID_RX_CODEC_DMA_RX_4,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 818) RX_CODEC_DMA_RX_4, 1, 1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 819) [TX_CODEC_DMA_TX_4] = { AFE_PORT_ID_TX_CODEC_DMA_TX_4,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 820) TX_CODEC_DMA_TX_4, 0, 1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 821) [RX_CODEC_DMA_RX_5] = { AFE_PORT_ID_RX_CODEC_DMA_RX_5,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 822) RX_CODEC_DMA_RX_5, 1, 1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 823) [TX_CODEC_DMA_TX_5] = { AFE_PORT_ID_TX_CODEC_DMA_TX_5,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 824) TX_CODEC_DMA_TX_5, 0, 1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 825) [RX_CODEC_DMA_RX_6] = { AFE_PORT_ID_RX_CODEC_DMA_RX_6,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 826) RX_CODEC_DMA_RX_6, 1, 1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 827) [RX_CODEC_DMA_RX_7] = { AFE_PORT_ID_RX_CODEC_DMA_RX_7,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 828) RX_CODEC_DMA_RX_7, 1, 1},
^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) static void q6afe_port_free(struct kref *ref)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 832) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 833) struct q6afe_port *port;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 834) struct q6afe *afe;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 835) unsigned long flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 836)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 837) port = container_of(ref, struct q6afe_port, refcount);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 838) afe = port->afe;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 839) spin_lock_irqsave(&afe->port_list_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 840) list_del(&port->node);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 841) spin_unlock_irqrestore(&afe->port_list_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 842) kfree(port->scfg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 843) kfree(port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 844) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 845)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 846) static struct q6afe_port *q6afe_find_port(struct q6afe *afe, int token)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 847) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 848) struct q6afe_port *p = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 849) struct q6afe_port *ret = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 850) unsigned long flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 851)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 852) spin_lock_irqsave(&afe->port_list_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 853) list_for_each_entry(p, &afe->port_list, node)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 854) if (p->token == token) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 855) ret = p;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 856) kref_get(&p->refcount);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 857) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 858) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 859)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 860) spin_unlock_irqrestore(&afe->port_list_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 861) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 862) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 863)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 864) static int q6afe_callback(struct apr_device *adev, struct apr_resp_pkt *data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 865) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 866) struct q6afe *afe = dev_get_drvdata(&adev->dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 867) struct aprv2_ibasic_rsp_result_t *res;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 868) struct apr_hdr *hdr = &data->hdr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 869) struct q6afe_port *port;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 870)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 871) if (!data->payload_size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 872) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 873)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 874) res = data->payload;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 875) switch (hdr->opcode) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 876) case APR_BASIC_RSP_RESULT: {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 877) if (res->status) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 878) dev_err(afe->dev, "cmd = 0x%x returned error = 0x%x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 879) res->opcode, res->status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 880) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 881) switch (res->opcode) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 882) case AFE_PORT_CMD_SET_PARAM_V2:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 883) case AFE_PORT_CMD_DEVICE_STOP:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 884) case AFE_PORT_CMD_DEVICE_START:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 885) case AFE_SVC_CMD_SET_PARAM:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 886) port = q6afe_find_port(afe, hdr->token);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 887) if (port) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 888) port->result = *res;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 889) wake_up(&port->wait);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 890) kref_put(&port->refcount, q6afe_port_free);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 891) } else if (hdr->token == AFE_CLK_TOKEN) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 892) afe->result = *res;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 893) wake_up(&afe->wait);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 894) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 895) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 896) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 897) dev_err(afe->dev, "Unknown cmd 0x%x\n", res->opcode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 898) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 899) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 900) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 901) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 902) case AFE_CMD_RSP_REMOTE_LPASS_CORE_HW_VOTE_REQUEST:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 903) afe->result.opcode = hdr->opcode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 904) afe->result.status = res->status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 905) wake_up(&afe->wait);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 906) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 907) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 908) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 909) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 910)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 911) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 912) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 913)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 914) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 915) * q6afe_get_port_id() - Get port id from a given port index
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 916) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 917) * @index: port index
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 918) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 919) * Return: Will be an negative on error or valid port_id on success
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 920) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 921) int q6afe_get_port_id(int index)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 922) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 923) if (index < 0 || index >= AFE_PORT_MAX)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 924) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 925)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 926) return port_maps[index].port_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 927) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 928) EXPORT_SYMBOL_GPL(q6afe_get_port_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 929)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 930) static int afe_apr_send_pkt(struct q6afe *afe, struct apr_pkt *pkt,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 931) struct q6afe_port *port, uint32_t rsp_opcode)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 932) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 933) wait_queue_head_t *wait = &port->wait;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 934) struct aprv2_ibasic_rsp_result_t *result;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 935) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 936)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 937) mutex_lock(&afe->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 938) if (port) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 939) wait = &port->wait;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 940) result = &port->result;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 941) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 942) result = &afe->result;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 943) wait = &afe->wait;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 944) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 945)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 946) result->opcode = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 947) result->status = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 948)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 949) ret = apr_send_pkt(afe->apr, pkt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 950) if (ret < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 951) dev_err(afe->dev, "packet not transmitted (%d)\n", ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 952) ret = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 953) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 954) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 955)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 956) ret = wait_event_timeout(*wait, (result->opcode == rsp_opcode),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 957) msecs_to_jiffies(TIMEOUT_MS));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 958) if (!ret) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 959) ret = -ETIMEDOUT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 960) } else if (result->status > 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 961) dev_err(afe->dev, "DSP returned error[%x]\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 962) result->status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 963) ret = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 964) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 965) ret = 0;
^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) err:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 969) mutex_unlock(&afe->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 970)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 971) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 972) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 973)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 974) static int q6afe_set_param(struct q6afe *afe, struct q6afe_port *port,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 975) void *data, int param_id, int module_id, int psize,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 976) int token)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 977) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 978) struct afe_svc_cmd_set_param *param;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 979) struct afe_port_param_data_v2 *pdata;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 980) struct apr_pkt *pkt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 981) int ret, pkt_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 982) void *p, *pl;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 983)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 984) pkt_size = APR_HDR_SIZE + sizeof(*param) + sizeof(*pdata) + psize;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 985) p = kzalloc(pkt_size, GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 986) if (!p)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 987) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 988)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 989) pkt = p;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 990) param = p + APR_HDR_SIZE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 991) pdata = p + APR_HDR_SIZE + sizeof(*param);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 992) pl = p + APR_HDR_SIZE + sizeof(*param) + sizeof(*pdata);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 993) memcpy(pl, data, psize);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 994)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 995) pkt->hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 996) APR_HDR_LEN(APR_HDR_SIZE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 997) APR_PKT_VER);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 998) pkt->hdr.pkt_size = pkt_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 999) pkt->hdr.src_port = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1000) pkt->hdr.dest_port = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1001) pkt->hdr.token = token;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1002) pkt->hdr.opcode = AFE_SVC_CMD_SET_PARAM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1003)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1004) param->payload_size = sizeof(*pdata) + psize;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1005) param->payload_address_lsw = 0x00;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1006) param->payload_address_msw = 0x00;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1007) param->mem_map_handle = 0x00;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1008) pdata->module_id = module_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1009) pdata->param_id = param_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1010) pdata->param_size = psize;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1011)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1012) ret = afe_apr_send_pkt(afe, pkt, port, AFE_SVC_CMD_SET_PARAM);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1013) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1014) dev_err(afe->dev, "AFE set params failed %d\n", ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1015)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1016) kfree(pkt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1017) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1018) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1019)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1020) static int q6afe_port_set_param(struct q6afe_port *port, void *data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1021) int param_id, int module_id, int psize)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1022) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1023) return q6afe_set_param(port->afe, port, data, param_id, module_id,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1024) psize, port->token);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1025) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1026)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1027) static int q6afe_port_set_param_v2(struct q6afe_port *port, void *data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1028) int param_id, int module_id, int psize)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1029) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1030) struct afe_port_cmd_set_param_v2 *param;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1031) struct afe_port_param_data_v2 *pdata;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1032) struct q6afe *afe = port->afe;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1033) struct apr_pkt *pkt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1034) u16 port_id = port->id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1035) int ret, pkt_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1036) void *p, *pl;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1037)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1038) pkt_size = APR_HDR_SIZE + sizeof(*param) + sizeof(*pdata) + psize;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1039) p = kzalloc(pkt_size, GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1040) if (!p)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1041) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1042)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1043) pkt = p;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1044) param = p + APR_HDR_SIZE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1045) pdata = p + APR_HDR_SIZE + sizeof(*param);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1046) pl = p + APR_HDR_SIZE + sizeof(*param) + sizeof(*pdata);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1047) memcpy(pl, data, psize);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1048)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1049) pkt->hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1050) APR_HDR_LEN(APR_HDR_SIZE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1051) APR_PKT_VER);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1052) pkt->hdr.pkt_size = pkt_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1053) pkt->hdr.src_port = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1054) pkt->hdr.dest_port = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1055) pkt->hdr.token = port->token;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1056) pkt->hdr.opcode = AFE_PORT_CMD_SET_PARAM_V2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1057)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1058) param->port_id = port_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1059) param->payload_size = sizeof(*pdata) + psize;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1060) param->payload_address_lsw = 0x00;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1061) param->payload_address_msw = 0x00;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1062) param->mem_map_handle = 0x00;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1063) pdata->module_id = module_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1064) pdata->param_id = param_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1065) pdata->param_size = psize;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1066)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1067) ret = afe_apr_send_pkt(afe, pkt, port, AFE_PORT_CMD_SET_PARAM_V2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1068) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1069) dev_err(afe->dev, "AFE enable for port 0x%x failed %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1070) port_id, ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1071)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1072) kfree(pkt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1073) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1074) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1075)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1076) static int q6afe_port_set_lpass_clock(struct q6afe_port *port,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1077) struct afe_clk_cfg *cfg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1078) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1079) return q6afe_port_set_param_v2(port, cfg,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1080) AFE_PARAM_ID_LPAIF_CLK_CONFIG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1081) AFE_MODULE_AUDIO_DEV_INTERFACE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1082) sizeof(*cfg));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1083) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1084)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1085) static int q6afe_set_lpass_clock_v2(struct q6afe_port *port,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1086) struct afe_clk_set *cfg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1087) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1088) return q6afe_port_set_param(port, cfg, AFE_PARAM_ID_CLOCK_SET,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1089) AFE_MODULE_CLOCK_SET, sizeof(*cfg));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1090) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1091)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1092) static int q6afe_set_digital_codec_core_clock(struct q6afe_port *port,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1093) struct afe_digital_clk_cfg *cfg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1094) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1095) return q6afe_port_set_param_v2(port, cfg,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1096) AFE_PARAM_ID_INT_DIGITAL_CDC_CLK_CONFIG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1097) AFE_MODULE_AUDIO_DEV_INTERFACE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1098) sizeof(*cfg));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1099) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1100)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1101) int q6afe_set_lpass_clock(struct device *dev, int clk_id, int attri,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1102) int clk_root, unsigned int freq)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1103) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1104) struct q6afe *afe = dev_get_drvdata(dev->parent);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1105) struct afe_clk_set cset = {0,};
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1106)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1107) cset.clk_set_minor_version = AFE_API_VERSION_CLOCK_SET;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1108) cset.clk_id = clk_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1109) cset.clk_freq_in_hz = freq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1110) cset.clk_attri = attri;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1111) cset.clk_root = clk_root;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1112) cset.enable = !!freq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1113)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1114) return q6afe_set_param(afe, NULL, &cset, AFE_PARAM_ID_CLOCK_SET,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1115) AFE_MODULE_CLOCK_SET, sizeof(cset),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1116) AFE_CLK_TOKEN);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1117) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1118) EXPORT_SYMBOL_GPL(q6afe_set_lpass_clock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1119)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1120) int q6afe_port_set_sysclk(struct q6afe_port *port, int clk_id,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1121) int clk_src, int clk_root,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1122) unsigned int freq, int dir)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1123) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1124) struct afe_clk_cfg ccfg = {0,};
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1125) struct afe_clk_set cset = {0,};
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1126) struct afe_digital_clk_cfg dcfg = {0,};
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1127) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1128)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1129) switch (clk_id) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1130) case LPAIF_DIG_CLK:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1131) dcfg.i2s_cfg_minor_version = AFE_API_VERSION_I2S_CONFIG;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1132) dcfg.clk_val = freq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1133) dcfg.clk_root = clk_root;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1134) ret = q6afe_set_digital_codec_core_clock(port, &dcfg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1135) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1136) case LPAIF_BIT_CLK:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1137) ccfg.i2s_cfg_minor_version = AFE_API_VERSION_I2S_CONFIG;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1138) ccfg.clk_val1 = freq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1139) ccfg.clk_src = clk_src;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1140) ccfg.clk_root = clk_root;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1141) ccfg.clk_set_mode = Q6AFE_LPASS_MODE_CLK1_VALID;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1142) ret = q6afe_port_set_lpass_clock(port, &ccfg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1143) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1144)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1145) case LPAIF_OSR_CLK:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1146) ccfg.i2s_cfg_minor_version = AFE_API_VERSION_I2S_CONFIG;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1147) ccfg.clk_val2 = freq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1148) ccfg.clk_src = clk_src;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1149) ccfg.clk_root = clk_root;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1150) ccfg.clk_set_mode = Q6AFE_LPASS_MODE_CLK2_VALID;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1151) ret = q6afe_port_set_lpass_clock(port, &ccfg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1152) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1153) case Q6AFE_LPASS_CLK_ID_PRI_MI2S_IBIT ... Q6AFE_LPASS_CLK_ID_QUI_MI2S_OSR:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1154) case Q6AFE_LPASS_CLK_ID_MCLK_1 ... Q6AFE_LPASS_CLK_ID_INT_MCLK_1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1155) case Q6AFE_LPASS_CLK_ID_PRI_TDM_IBIT ... Q6AFE_LPASS_CLK_ID_QUIN_TDM_EBIT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1156) case Q6AFE_LPASS_CLK_ID_WSA_CORE_MCLK ... Q6AFE_LPASS_CLK_ID_VA_CORE_2X_MCLK:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1157) cset.clk_set_minor_version = AFE_API_VERSION_CLOCK_SET;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1158) cset.clk_id = clk_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1159) cset.clk_freq_in_hz = freq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1160) cset.clk_attri = clk_src;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1161) cset.clk_root = clk_root;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1162) cset.enable = !!freq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1163) ret = q6afe_set_lpass_clock_v2(port, &cset);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1164) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1165) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1166) ret = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1167) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1168) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1169)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1170) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1171) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1172) EXPORT_SYMBOL_GPL(q6afe_port_set_sysclk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1173)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1174) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1175) * q6afe_port_stop() - Stop a afe port
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1176) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1177) * @port: Instance of port to stop
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1178) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1179) * Return: Will be an negative on packet size on success.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1180) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1181) int q6afe_port_stop(struct q6afe_port *port)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1182) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1183) struct afe_port_cmd_device_stop *stop;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1184) struct q6afe *afe = port->afe;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1185) struct apr_pkt *pkt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1186) int port_id = port->id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1187) int ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1188) int index, pkt_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1189) void *p;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1190)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1191) port_id = port->id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1192) index = port->token;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1193) if (index < 0 || index >= AFE_PORT_MAX) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1194) dev_err(afe->dev, "AFE port index[%d] invalid!\n", index);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1195) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1196) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1197)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1198) pkt_size = APR_HDR_SIZE + sizeof(*stop);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1199) p = kzalloc(pkt_size, GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1200) if (!p)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1201) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1202)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1203) pkt = p;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1204) stop = p + APR_HDR_SIZE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1205)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1206) pkt->hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1207) APR_HDR_LEN(APR_HDR_SIZE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1208) APR_PKT_VER);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1209) pkt->hdr.pkt_size = pkt_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1210) pkt->hdr.src_port = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1211) pkt->hdr.dest_port = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1212) pkt->hdr.token = index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1213) pkt->hdr.opcode = AFE_PORT_CMD_DEVICE_STOP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1214) stop->port_id = port_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1215) stop->reserved = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1216)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1217) ret = afe_apr_send_pkt(afe, pkt, port, AFE_PORT_CMD_DEVICE_STOP);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1218) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1219) dev_err(afe->dev, "AFE close failed %d\n", ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1220)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1221) kfree(pkt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1222) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1223) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1224) EXPORT_SYMBOL_GPL(q6afe_port_stop);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1225)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1226) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1227) * q6afe_slim_port_prepare() - Prepare slim afe port.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1228) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1229) * @port: Instance of afe port
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1230) * @cfg: SLIM configuration for the afe port
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1231) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1232) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1233) void q6afe_slim_port_prepare(struct q6afe_port *port,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1234) struct q6afe_slim_cfg *cfg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1235) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1236) union afe_port_config *pcfg = &port->port_cfg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1237)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1238) pcfg->slim_cfg.sb_cfg_minor_version = AFE_API_VERSION_SLIMBUS_CONFIG;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1239) pcfg->slim_cfg.sample_rate = cfg->sample_rate;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1240) pcfg->slim_cfg.bit_width = cfg->bit_width;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1241) pcfg->slim_cfg.num_channels = cfg->num_channels;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1242) pcfg->slim_cfg.data_format = cfg->data_format;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1243) pcfg->slim_cfg.shared_ch_mapping[0] = cfg->ch_mapping[0];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1244) pcfg->slim_cfg.shared_ch_mapping[1] = cfg->ch_mapping[1];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1245) pcfg->slim_cfg.shared_ch_mapping[2] = cfg->ch_mapping[2];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1246) pcfg->slim_cfg.shared_ch_mapping[3] = cfg->ch_mapping[3];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1247)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1248) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1249) EXPORT_SYMBOL_GPL(q6afe_slim_port_prepare);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1250)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1251) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1252) * q6afe_tdm_port_prepare() - Prepare tdm afe port.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1253) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1254) * @port: Instance of afe port
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1255) * @cfg: TDM configuration for the afe port
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1256) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1257) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1258) void q6afe_tdm_port_prepare(struct q6afe_port *port,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1259) struct q6afe_tdm_cfg *cfg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1260) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1261) union afe_port_config *pcfg = &port->port_cfg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1262)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1263) pcfg->tdm_cfg.tdm_cfg_minor_version = AFE_API_VERSION_TDM_CONFIG;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1264) pcfg->tdm_cfg.num_channels = cfg->num_channels;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1265) pcfg->tdm_cfg.sample_rate = cfg->sample_rate;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1266) pcfg->tdm_cfg.bit_width = cfg->bit_width;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1267) pcfg->tdm_cfg.data_format = cfg->data_format;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1268) pcfg->tdm_cfg.sync_mode = cfg->sync_mode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1269) pcfg->tdm_cfg.sync_src = cfg->sync_src;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1270) pcfg->tdm_cfg.nslots_per_frame = cfg->nslots_per_frame;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1271)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1272) pcfg->tdm_cfg.slot_width = cfg->slot_width;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1273) pcfg->tdm_cfg.slot_mask = cfg->slot_mask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1274) port->scfg = kzalloc(sizeof(*port->scfg), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1275) if (!port->scfg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1276) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1277)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1278) port->scfg->minor_version = AFE_API_VERSION_SLOT_MAPPING_CONFIG;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1279) port->scfg->num_channels = cfg->num_channels;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1280) port->scfg->bitwidth = cfg->bit_width;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1281) port->scfg->data_align_type = cfg->data_align_type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1282) memcpy(port->scfg->ch_mapping, cfg->ch_mapping,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1283) sizeof(u16) * AFE_PORT_MAX_AUDIO_CHAN_CNT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1284) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1285) EXPORT_SYMBOL_GPL(q6afe_tdm_port_prepare);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1286)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1287) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1288) * q6afe_hdmi_port_prepare() - Prepare hdmi afe port.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1289) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1290) * @port: Instance of afe port
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1291) * @cfg: HDMI configuration for the afe port
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1292) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1293) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1294) void q6afe_hdmi_port_prepare(struct q6afe_port *port,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1295) struct q6afe_hdmi_cfg *cfg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1296) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1297) union afe_port_config *pcfg = &port->port_cfg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1298)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1299) pcfg->hdmi_multi_ch.hdmi_cfg_minor_version =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1300) AFE_API_VERSION_HDMI_CONFIG;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1301) pcfg->hdmi_multi_ch.datatype = cfg->datatype;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1302) pcfg->hdmi_multi_ch.channel_allocation = cfg->channel_allocation;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1303) pcfg->hdmi_multi_ch.sample_rate = cfg->sample_rate;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1304) pcfg->hdmi_multi_ch.bit_width = cfg->bit_width;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1305) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1306) EXPORT_SYMBOL_GPL(q6afe_hdmi_port_prepare);
^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) * q6afe_i2s_port_prepare() - Prepare i2s afe port.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1310) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1311) * @port: Instance of afe port
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1312) * @cfg: I2S configuration for the afe port
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1313) * Return: Will be an negative on error and zero on success.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1314) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1315) int q6afe_i2s_port_prepare(struct q6afe_port *port, struct q6afe_i2s_cfg *cfg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1316) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1317) union afe_port_config *pcfg = &port->port_cfg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1318) struct device *dev = port->afe->dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1319) int num_sd_lines;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1320)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1321) pcfg->i2s_cfg.i2s_cfg_minor_version = AFE_API_VERSION_I2S_CONFIG;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1322) pcfg->i2s_cfg.sample_rate = cfg->sample_rate;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1323) pcfg->i2s_cfg.bit_width = cfg->bit_width;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1324) pcfg->i2s_cfg.data_format = AFE_LINEAR_PCM_DATA;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1325)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1326) switch (cfg->fmt & SND_SOC_DAIFMT_MASTER_MASK) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1327) case SND_SOC_DAIFMT_CBS_CFS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1328) pcfg->i2s_cfg.ws_src = AFE_PORT_CONFIG_I2S_WS_SRC_INTERNAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1329) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1330) case SND_SOC_DAIFMT_CBM_CFM:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1331) /* CPU is slave */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1332) pcfg->i2s_cfg.ws_src = AFE_PORT_CONFIG_I2S_WS_SRC_EXTERNAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1333) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1334) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1335) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1336) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1337)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1338) num_sd_lines = hweight_long(cfg->sd_line_mask);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1339)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1340) switch (num_sd_lines) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1341) case 0:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1342) dev_err(dev, "no line is assigned\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1343) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1344) case 1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1345) switch (cfg->sd_line_mask) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1346) case AFE_PORT_I2S_SD0_MASK:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1347) pcfg->i2s_cfg.channel_mode = AFE_PORT_I2S_SD0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1348) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1349) case AFE_PORT_I2S_SD1_MASK:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1350) pcfg->i2s_cfg.channel_mode = AFE_PORT_I2S_SD1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1351) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1352) case AFE_PORT_I2S_SD2_MASK:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1353) pcfg->i2s_cfg.channel_mode = AFE_PORT_I2S_SD2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1354) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1355) case AFE_PORT_I2S_SD3_MASK:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1356) pcfg->i2s_cfg.channel_mode = AFE_PORT_I2S_SD3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1357) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1358) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1359) dev_err(dev, "Invalid SD lines\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1360) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1361) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1362) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1363) case 2:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1364) switch (cfg->sd_line_mask) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1365) case AFE_PORT_I2S_SD0_1_MASK:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1366) pcfg->i2s_cfg.channel_mode = AFE_PORT_I2S_QUAD01;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1367) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1368) case AFE_PORT_I2S_SD2_3_MASK:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1369) pcfg->i2s_cfg.channel_mode = AFE_PORT_I2S_QUAD23;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1370) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1371) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1372) dev_err(dev, "Invalid SD lines\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1373) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1374) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1375) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1376) case 3:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1377) switch (cfg->sd_line_mask) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1378) case AFE_PORT_I2S_SD0_1_2_MASK:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1379) pcfg->i2s_cfg.channel_mode = AFE_PORT_I2S_6CHS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1380) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1381) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1382) dev_err(dev, "Invalid SD lines\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1383) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1384) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1385) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1386) case 4:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1387) switch (cfg->sd_line_mask) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1388) case AFE_PORT_I2S_SD0_1_2_3_MASK:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1389) pcfg->i2s_cfg.channel_mode = AFE_PORT_I2S_8CHS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1390)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1391) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1392) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1393) dev_err(dev, "Invalid SD lines\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1394) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1395) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1396) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1397) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1398) dev_err(dev, "Invalid SD lines\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1399) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1400) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1401)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1402) switch (cfg->num_channels) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1403) case 1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1404) case 2:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1405) switch (pcfg->i2s_cfg.channel_mode) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1406) case AFE_PORT_I2S_QUAD01:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1407) case AFE_PORT_I2S_6CHS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1408) case AFE_PORT_I2S_8CHS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1409) pcfg->i2s_cfg.channel_mode = AFE_PORT_I2S_SD0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1410) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1411) case AFE_PORT_I2S_QUAD23:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1412) pcfg->i2s_cfg.channel_mode = AFE_PORT_I2S_SD2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1413) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1414) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1415)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1416) if (cfg->num_channels == 2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1417) pcfg->i2s_cfg.mono_stereo = AFE_PORT_I2S_STEREO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1418) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1419) pcfg->i2s_cfg.mono_stereo = AFE_PORT_I2S_MONO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1420)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1421) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1422) case 3:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1423) case 4:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1424) if (pcfg->i2s_cfg.channel_mode < AFE_PORT_I2S_QUAD01) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1425) dev_err(dev, "Invalid Channel mode\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1426) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1427) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1428) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1429) case 5:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1430) case 6:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1431) if (pcfg->i2s_cfg.channel_mode < AFE_PORT_I2S_6CHS) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1432) dev_err(dev, "Invalid Channel mode\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1433) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1434) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1435) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1436) case 7:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1437) case 8:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1438) if (pcfg->i2s_cfg.channel_mode < AFE_PORT_I2S_8CHS) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1439) dev_err(dev, "Invalid Channel mode\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1440) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1441) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1442) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1443) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1444) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1445) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1446)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1447) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1448) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1449) EXPORT_SYMBOL_GPL(q6afe_i2s_port_prepare);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1450)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1451) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1452) * q6afe_dam_port_prepare() - Prepare dma afe port.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1453) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1454) * @port: Instance of afe port
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1455) * @cfg: DMA configuration for the afe port
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1456) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1457) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1458) void q6afe_cdc_dma_port_prepare(struct q6afe_port *port,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1459) struct q6afe_cdc_dma_cfg *cfg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1460) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1461) union afe_port_config *pcfg = &port->port_cfg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1462) struct afe_param_id_cdc_dma_cfg *dma_cfg = &pcfg->dma_cfg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1463)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1464) dma_cfg->cdc_dma_cfg_minor_version = AFE_API_VERSION_CODEC_DMA_CONFIG;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1465) dma_cfg->sample_rate = cfg->sample_rate;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1466) dma_cfg->bit_width = cfg->bit_width;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1467) dma_cfg->data_format = cfg->data_format;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1468) dma_cfg->num_channels = cfg->num_channels;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1469) if (!cfg->active_channels_mask)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1470) dma_cfg->active_channels_mask = (1 << cfg->num_channels) - 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1471) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1472) EXPORT_SYMBOL_GPL(q6afe_cdc_dma_port_prepare);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1473) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1474) * q6afe_port_start() - Start a afe port
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1475) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1476) * @port: Instance of port to start
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1477) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1478) * Return: Will be an negative on packet size on success.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1479) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1480) int q6afe_port_start(struct q6afe_port *port)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1481) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1482) struct afe_port_cmd_device_start *start;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1483) struct q6afe *afe = port->afe;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1484) int port_id = port->id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1485) int ret, param_id = port->cfg_type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1486) struct apr_pkt *pkt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1487) int pkt_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1488) void *p;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1489)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1490) ret = q6afe_port_set_param_v2(port, &port->port_cfg, param_id,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1491) AFE_MODULE_AUDIO_DEV_INTERFACE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1492) sizeof(port->port_cfg));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1493) if (ret) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1494) dev_err(afe->dev, "AFE enable for port 0x%x failed %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1495) port_id, ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1496) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1497) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1498)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1499) if (port->scfg) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1500) ret = q6afe_port_set_param_v2(port, port->scfg,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1501) AFE_PARAM_ID_PORT_SLOT_MAPPING_CONFIG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1502) AFE_MODULE_TDM, sizeof(*port->scfg));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1503) if (ret) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1504) dev_err(afe->dev, "AFE enable for port 0x%x failed %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1505) port_id, ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1506) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1507) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1508) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1509)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1510) pkt_size = APR_HDR_SIZE + sizeof(*start);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1511) p = kzalloc(pkt_size, GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1512) if (!p)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1513) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1514)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1515) pkt = p;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1516) start = p + APR_HDR_SIZE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1517)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1518) pkt->hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1519) APR_HDR_LEN(APR_HDR_SIZE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1520) APR_PKT_VER);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1521) pkt->hdr.pkt_size = pkt_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1522) pkt->hdr.src_port = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1523) pkt->hdr.dest_port = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1524) pkt->hdr.token = port->token;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1525) pkt->hdr.opcode = AFE_PORT_CMD_DEVICE_START;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1526)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1527) start->port_id = port_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1528)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1529) ret = afe_apr_send_pkt(afe, pkt, port, AFE_PORT_CMD_DEVICE_START);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1530) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1531) dev_err(afe->dev, "AFE enable for port 0x%x failed %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1532) port_id, ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1533)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1534) kfree(pkt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1535) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1536) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1537) EXPORT_SYMBOL_GPL(q6afe_port_start);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1538)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1539) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1540) * q6afe_port_get_from_id() - Get port instance from a port id
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1541) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1542) * @dev: Pointer to afe child device.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1543) * @id: port id
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1544) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1545) * Return: Will be an error pointer on error or a valid afe port
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1546) * on success.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1547) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1548) struct q6afe_port *q6afe_port_get_from_id(struct device *dev, int id)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1549) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1550) int port_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1551) struct q6afe *afe = dev_get_drvdata(dev->parent);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1552) struct q6afe_port *port;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1553) unsigned long flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1554) int cfg_type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1555)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1556) if (id < 0 || id >= AFE_PORT_MAX) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1557) dev_err(dev, "AFE port token[%d] invalid!\n", id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1558) return ERR_PTR(-EINVAL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1559) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1560)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1561) /* if port is multiple times bind/unbind before callback finishes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1562) port = q6afe_find_port(afe, id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1563) if (port) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1564) dev_err(dev, "AFE Port already open\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1565) return port;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1566) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1567)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1568) port_id = port_maps[id].port_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1569)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1570) switch (port_id) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1571) case AFE_PORT_ID_MULTICHAN_HDMI_RX:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1572) case AFE_PORT_ID_HDMI_OVER_DP_RX:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1573) cfg_type = AFE_PARAM_ID_HDMI_CONFIG;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1574) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1575) case AFE_PORT_ID_SLIMBUS_MULTI_CHAN_0_TX:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1576) case AFE_PORT_ID_SLIMBUS_MULTI_CHAN_1_TX:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1577) case AFE_PORT_ID_SLIMBUS_MULTI_CHAN_2_TX:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1578) case AFE_PORT_ID_SLIMBUS_MULTI_CHAN_3_TX:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1579) case AFE_PORT_ID_SLIMBUS_MULTI_CHAN_4_TX:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1580) case AFE_PORT_ID_SLIMBUS_MULTI_CHAN_5_TX:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1581) case AFE_PORT_ID_SLIMBUS_MULTI_CHAN_6_TX:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1582) case AFE_PORT_ID_SLIMBUS_MULTI_CHAN_0_RX:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1583) case AFE_PORT_ID_SLIMBUS_MULTI_CHAN_1_RX:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1584) case AFE_PORT_ID_SLIMBUS_MULTI_CHAN_2_RX:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1585) case AFE_PORT_ID_SLIMBUS_MULTI_CHAN_3_RX:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1586) case AFE_PORT_ID_SLIMBUS_MULTI_CHAN_4_RX:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1587) case AFE_PORT_ID_SLIMBUS_MULTI_CHAN_5_RX:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1588) case AFE_PORT_ID_SLIMBUS_MULTI_CHAN_6_RX:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1589) cfg_type = AFE_PARAM_ID_SLIMBUS_CONFIG;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1590) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1591)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1592) case AFE_PORT_ID_PRIMARY_MI2S_RX:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1593) case AFE_PORT_ID_PRIMARY_MI2S_TX:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1594) case AFE_PORT_ID_SECONDARY_MI2S_RX:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1595) case AFE_PORT_ID_SECONDARY_MI2S_TX:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1596) case AFE_PORT_ID_TERTIARY_MI2S_RX:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1597) case AFE_PORT_ID_TERTIARY_MI2S_TX:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1598) case AFE_PORT_ID_QUATERNARY_MI2S_RX:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1599) case AFE_PORT_ID_QUATERNARY_MI2S_TX:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1600) cfg_type = AFE_PARAM_ID_I2S_CONFIG;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1601) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1602) case AFE_PORT_ID_PRIMARY_TDM_RX ... AFE_PORT_ID_QUINARY_TDM_TX_7:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1603) cfg_type = AFE_PARAM_ID_TDM_CONFIG;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1604) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1605) case AFE_PORT_ID_WSA_CODEC_DMA_RX_0 ... AFE_PORT_ID_RX_CODEC_DMA_RX_7:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1606) cfg_type = AFE_PARAM_ID_CODEC_DMA_CONFIG;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1607) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1608) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1609) dev_err(dev, "Invalid port id 0x%x\n", port_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1610) return ERR_PTR(-EINVAL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1611) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1612)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1613) port = kzalloc(sizeof(*port), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1614) if (!port)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1615) return ERR_PTR(-ENOMEM);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1616)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1617) init_waitqueue_head(&port->wait);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1618)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1619) port->token = id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1620) port->id = port_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1621) port->afe = afe;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1622) port->cfg_type = cfg_type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1623) kref_init(&port->refcount);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1624)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1625) spin_lock_irqsave(&afe->port_list_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1626) list_add_tail(&port->node, &afe->port_list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1627) spin_unlock_irqrestore(&afe->port_list_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1628)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1629) return port;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1630)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1631) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1632) EXPORT_SYMBOL_GPL(q6afe_port_get_from_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1633)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1634) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1635) * q6afe_port_put() - Release port reference
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1636) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1637) * @port: Instance of port to put
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1638) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1639) void q6afe_port_put(struct q6afe_port *port)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1640) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1641) kref_put(&port->refcount, q6afe_port_free);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1642) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1643) EXPORT_SYMBOL_GPL(q6afe_port_put);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1644)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1645) int q6afe_unvote_lpass_core_hw(struct device *dev, uint32_t hw_block_id,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1646) uint32_t client_handle)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1647) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1648) struct q6afe *afe = dev_get_drvdata(dev->parent);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1649) struct afe_cmd_remote_lpass_core_hw_devote_request *vote_cfg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1650) struct apr_pkt *pkt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1651) int ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1652) int pkt_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1653) void *p;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1654)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1655) pkt_size = APR_HDR_SIZE + sizeof(*vote_cfg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1656) p = kzalloc(pkt_size, GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1657) if (!p)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1658) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1659)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1660) pkt = p;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1661) vote_cfg = p + APR_HDR_SIZE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1662)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1663) pkt->hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1664) APR_HDR_LEN(APR_HDR_SIZE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1665) APR_PKT_VER);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1666) pkt->hdr.pkt_size = pkt_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1667) pkt->hdr.src_port = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1668) pkt->hdr.dest_port = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1669) pkt->hdr.token = hw_block_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1670) pkt->hdr.opcode = AFE_CMD_REMOTE_LPASS_CORE_HW_DEVOTE_REQUEST;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1671) vote_cfg->hw_block_id = hw_block_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1672) vote_cfg->client_handle = client_handle;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1673)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1674) ret = apr_send_pkt(afe->apr, pkt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1675) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1676) dev_err(afe->dev, "AFE failed to unvote (%d)\n", hw_block_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1677)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1678) kfree(pkt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1679) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1680) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1681) EXPORT_SYMBOL(q6afe_unvote_lpass_core_hw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1682)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1683) int q6afe_vote_lpass_core_hw(struct device *dev, uint32_t hw_block_id,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1684) char *client_name, uint32_t *client_handle)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1685) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1686) struct q6afe *afe = dev_get_drvdata(dev->parent);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1687) struct afe_cmd_remote_lpass_core_hw_vote_request *vote_cfg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1688) struct apr_pkt *pkt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1689) int ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1690) int pkt_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1691) void *p;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1692)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1693) pkt_size = APR_HDR_SIZE + sizeof(*vote_cfg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1694) p = kzalloc(pkt_size, GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1695) if (!p)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1696) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1697)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1698) pkt = p;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1699) vote_cfg = p + APR_HDR_SIZE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1700)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1701) pkt->hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1702) APR_HDR_LEN(APR_HDR_SIZE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1703) APR_PKT_VER);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1704) pkt->hdr.pkt_size = pkt_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1705) pkt->hdr.src_port = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1706) pkt->hdr.dest_port = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1707) pkt->hdr.token = hw_block_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1708) pkt->hdr.opcode = AFE_CMD_REMOTE_LPASS_CORE_HW_VOTE_REQUEST;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1709) vote_cfg->hw_block_id = hw_block_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1710) strlcpy(vote_cfg->client_name, client_name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1711) sizeof(vote_cfg->client_name));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1712)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1713) ret = afe_apr_send_pkt(afe, pkt, NULL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1714) AFE_CMD_RSP_REMOTE_LPASS_CORE_HW_VOTE_REQUEST);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1715) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1716) dev_err(afe->dev, "AFE failed to vote (%d)\n", hw_block_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1717)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1718)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1719) kfree(pkt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1720) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1721) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1722) EXPORT_SYMBOL(q6afe_vote_lpass_core_hw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1723)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1724) static int q6afe_probe(struct apr_device *adev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1725) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1726) struct q6afe *afe;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1727) struct device *dev = &adev->dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1728)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1729) afe = devm_kzalloc(dev, sizeof(*afe), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1730) if (!afe)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1731) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1732)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1733) q6core_get_svc_api_info(adev->svc_id, &afe->ainfo);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1734) afe->apr = adev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1735) mutex_init(&afe->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1736) init_waitqueue_head(&afe->wait);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1737) afe->dev = dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1738) INIT_LIST_HEAD(&afe->port_list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1739) spin_lock_init(&afe->port_list_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1740)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1741) dev_set_drvdata(dev, afe);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1742)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1743) return of_platform_populate(dev->of_node, NULL, NULL, dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1744) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1745)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1746) static int q6afe_remove(struct apr_device *adev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1747) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1748) of_platform_depopulate(&adev->dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1749)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1750) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1751) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1752)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1753) #ifdef CONFIG_OF
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1754) static const struct of_device_id q6afe_device_id[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1755) { .compatible = "qcom,q6afe" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1756) {},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1757) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1758) MODULE_DEVICE_TABLE(of, q6afe_device_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1759) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1760)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1761) static struct apr_driver qcom_q6afe_driver = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1762) .probe = q6afe_probe,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1763) .remove = q6afe_remove,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1764) .callback = q6afe_callback,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1765) .driver = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1766) .name = "qcom-q6afe",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1767) .of_match_table = of_match_ptr(q6afe_device_id),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1768)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1769) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1770) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1771)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1772) module_apr_driver(qcom_q6afe_driver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1773) MODULE_DESCRIPTION("Q6 Audio Front End");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1774) MODULE_LICENSE("GPL v2");