1809bcbceSSrinivas Kandagatla // SPDX-License-Identifier: GPL-2.0-only 2809bcbceSSrinivas Kandagatla // Copyright (c) 2018-2020, The Linux Foundation. All rights reserved. 3809bcbceSSrinivas Kandagatla 4809bcbceSSrinivas Kandagatla #include <linux/module.h> 5809bcbceSSrinivas Kandagatla #include <linux/init.h> 6809bcbceSSrinivas Kandagatla #include <linux/io.h> 7809bcbceSSrinivas Kandagatla #include <linux/platform_device.h> 8809bcbceSSrinivas Kandagatla #include <linux/clk.h> 9809bcbceSSrinivas Kandagatla #include <linux/of_clk.h> 10809bcbceSSrinivas Kandagatla #include <linux/clk-provider.h> 11809bcbceSSrinivas Kandagatla #include <sound/soc.h> 12809bcbceSSrinivas Kandagatla #include <sound/soc-dapm.h> 13809bcbceSSrinivas Kandagatla #include <linux/of_platform.h> 14809bcbceSSrinivas Kandagatla #include <sound/tlv.h> 15809bcbceSSrinivas Kandagatla #include "lpass-wsa-macro.h" 16809bcbceSSrinivas Kandagatla 17809bcbceSSrinivas Kandagatla #define CDC_WSA_CLK_RST_CTRL_MCLK_CONTROL (0x0000) 18809bcbceSSrinivas Kandagatla #define CDC_WSA_MCLK_EN_MASK BIT(0) 19809bcbceSSrinivas Kandagatla #define CDC_WSA_MCLK_ENABLE BIT(0) 20809bcbceSSrinivas Kandagatla #define CDC_WSA_MCLK_DISABLE 0 21809bcbceSSrinivas Kandagatla #define CDC_WSA_CLK_RST_CTRL_FS_CNT_CONTROL (0x0004) 22809bcbceSSrinivas Kandagatla #define CDC_WSA_FS_CNT_EN_MASK BIT(0) 23809bcbceSSrinivas Kandagatla #define CDC_WSA_FS_CNT_ENABLE BIT(0) 24809bcbceSSrinivas Kandagatla #define CDC_WSA_FS_CNT_DISABLE 0 25809bcbceSSrinivas Kandagatla #define CDC_WSA_CLK_RST_CTRL_SWR_CONTROL (0x0008) 26809bcbceSSrinivas Kandagatla #define CDC_WSA_SWR_CLK_EN_MASK BIT(0) 27809bcbceSSrinivas Kandagatla #define CDC_WSA_SWR_CLK_ENABLE BIT(0) 28809bcbceSSrinivas Kandagatla #define CDC_WSA_SWR_RST_EN_MASK BIT(1) 29809bcbceSSrinivas Kandagatla #define CDC_WSA_SWR_RST_ENABLE BIT(1) 30809bcbceSSrinivas Kandagatla #define CDC_WSA_SWR_RST_DISABLE 0 31809bcbceSSrinivas Kandagatla #define CDC_WSA_TOP_TOP_CFG0 (0x0080) 32809bcbceSSrinivas Kandagatla #define CDC_WSA_TOP_TOP_CFG1 (0x0084) 33809bcbceSSrinivas Kandagatla #define CDC_WSA_TOP_FREQ_MCLK (0x0088) 34809bcbceSSrinivas Kandagatla #define CDC_WSA_TOP_DEBUG_BUS_SEL (0x008C) 35809bcbceSSrinivas Kandagatla #define CDC_WSA_TOP_DEBUG_EN0 (0x0090) 36809bcbceSSrinivas Kandagatla #define CDC_WSA_TOP_DEBUG_EN1 (0x0094) 37809bcbceSSrinivas Kandagatla #define CDC_WSA_TOP_DEBUG_DSM_LB (0x0098) 38809bcbceSSrinivas Kandagatla #define CDC_WSA_TOP_RX_I2S_CTL (0x009C) 39809bcbceSSrinivas Kandagatla #define CDC_WSA_TOP_TX_I2S_CTL (0x00A0) 40809bcbceSSrinivas Kandagatla #define CDC_WSA_TOP_I2S_CLK (0x00A4) 41809bcbceSSrinivas Kandagatla #define CDC_WSA_TOP_I2S_RESET (0x00A8) 42809bcbceSSrinivas Kandagatla #define CDC_WSA_RX_INP_MUX_RX_INT0_CFG0 (0x0100) 437db4c4cdSSrinivas Kandagatla #define CDC_WSA_RX_INTX_1_MIX_INP0_SEL_MASK GENMASK(2, 0) 447db4c4cdSSrinivas Kandagatla #define CDC_WSA_RX_INTX_1_MIX_INP1_SEL_MASK GENMASK(5, 3) 45809bcbceSSrinivas Kandagatla #define CDC_WSA_RX_INP_MUX_RX_INT0_CFG1 (0x0104) 467db4c4cdSSrinivas Kandagatla #define CDC_WSA_RX_INTX_2_SEL_MASK GENMASK(2, 0) 477db4c4cdSSrinivas Kandagatla #define CDC_WSA_RX_INTX_1_MIX_INP2_SEL_MASK GENMASK(5, 3) 48809bcbceSSrinivas Kandagatla #define CDC_WSA_RX_INP_MUX_RX_INT1_CFG0 (0x0108) 49809bcbceSSrinivas Kandagatla #define CDC_WSA_RX_INP_MUX_RX_INT1_CFG1 (0x010C) 50809bcbceSSrinivas Kandagatla #define CDC_WSA_RX_INP_MUX_RX_MIX_CFG0 (0x0110) 51809bcbceSSrinivas Kandagatla #define CDC_WSA_RX_MIX_TX1_SEL_MASK GENMASK(5, 3) 52809bcbceSSrinivas Kandagatla #define CDC_WSA_RX_MIX_TX1_SEL_SHFT 3 53809bcbceSSrinivas Kandagatla #define CDC_WSA_RX_MIX_TX0_SEL_MASK GENMASK(2, 0) 54809bcbceSSrinivas Kandagatla #define CDC_WSA_RX_INP_MUX_RX_EC_CFG0 (0x0114) 55809bcbceSSrinivas Kandagatla #define CDC_WSA_RX_INP_MUX_SOFTCLIP_CFG0 (0x0118) 56809bcbceSSrinivas Kandagatla #define CDC_WSA_TX0_SPKR_PROT_PATH_CTL (0x0244) 57809bcbceSSrinivas Kandagatla #define CDC_WSA_TX_SPKR_PROT_RESET_MASK BIT(5) 58809bcbceSSrinivas Kandagatla #define CDC_WSA_TX_SPKR_PROT_RESET BIT(5) 59809bcbceSSrinivas Kandagatla #define CDC_WSA_TX_SPKR_PROT_NO_RESET 0 60809bcbceSSrinivas Kandagatla #define CDC_WSA_TX_SPKR_PROT_CLK_EN_MASK BIT(4) 61809bcbceSSrinivas Kandagatla #define CDC_WSA_TX_SPKR_PROT_CLK_ENABLE BIT(4) 62809bcbceSSrinivas Kandagatla #define CDC_WSA_TX_SPKR_PROT_CLK_DISABLE 0 63809bcbceSSrinivas Kandagatla #define CDC_WSA_TX_SPKR_PROT_PCM_RATE_MASK GENMASK(3, 0) 64809bcbceSSrinivas Kandagatla #define CDC_WSA_TX_SPKR_PROT_PCM_RATE_8K 0 65809bcbceSSrinivas Kandagatla #define CDC_WSA_TX0_SPKR_PROT_PATH_CFG0 (0x0248) 66809bcbceSSrinivas Kandagatla #define CDC_WSA_TX1_SPKR_PROT_PATH_CTL (0x0264) 67809bcbceSSrinivas Kandagatla #define CDC_WSA_TX1_SPKR_PROT_PATH_CFG0 (0x0268) 68809bcbceSSrinivas Kandagatla #define CDC_WSA_TX2_SPKR_PROT_PATH_CTL (0x0284) 69809bcbceSSrinivas Kandagatla #define CDC_WSA_TX2_SPKR_PROT_PATH_CFG0 (0x0288) 70809bcbceSSrinivas Kandagatla #define CDC_WSA_TX3_SPKR_PROT_PATH_CTL (0x02A4) 71809bcbceSSrinivas Kandagatla #define CDC_WSA_TX3_SPKR_PROT_PATH_CFG0 (0x02A8) 72809bcbceSSrinivas Kandagatla #define CDC_WSA_INTR_CTRL_CFG (0x0340) 73809bcbceSSrinivas Kandagatla #define CDC_WSA_INTR_CTRL_CLR_COMMIT (0x0344) 74809bcbceSSrinivas Kandagatla #define CDC_WSA_INTR_CTRL_PIN1_MASK0 (0x0360) 75809bcbceSSrinivas Kandagatla #define CDC_WSA_INTR_CTRL_PIN1_STATUS0 (0x0368) 76809bcbceSSrinivas Kandagatla #define CDC_WSA_INTR_CTRL_PIN1_CLEAR0 (0x0370) 77809bcbceSSrinivas Kandagatla #define CDC_WSA_INTR_CTRL_PIN2_MASK0 (0x0380) 78809bcbceSSrinivas Kandagatla #define CDC_WSA_INTR_CTRL_PIN2_STATUS0 (0x0388) 79809bcbceSSrinivas Kandagatla #define CDC_WSA_INTR_CTRL_PIN2_CLEAR0 (0x0390) 80809bcbceSSrinivas Kandagatla #define CDC_WSA_INTR_CTRL_LEVEL0 (0x03C0) 81809bcbceSSrinivas Kandagatla #define CDC_WSA_INTR_CTRL_BYPASS0 (0x03C8) 82809bcbceSSrinivas Kandagatla #define CDC_WSA_INTR_CTRL_SET0 (0x03D0) 83809bcbceSSrinivas Kandagatla #define CDC_WSA_RX0_RX_PATH_CTL (0x0400) 84809bcbceSSrinivas Kandagatla #define CDC_WSA_RX_PATH_CLK_EN_MASK BIT(5) 85809bcbceSSrinivas Kandagatla #define CDC_WSA_RX_PATH_CLK_ENABLE BIT(5) 86809bcbceSSrinivas Kandagatla #define CDC_WSA_RX_PATH_CLK_DISABLE 0 87809bcbceSSrinivas Kandagatla #define CDC_WSA_RX_PATH_PGA_MUTE_EN_MASK BIT(4) 88809bcbceSSrinivas Kandagatla #define CDC_WSA_RX_PATH_PGA_MUTE_ENABLE BIT(4) 89809bcbceSSrinivas Kandagatla #define CDC_WSA_RX_PATH_PGA_MUTE_DISABLE 0 90809bcbceSSrinivas Kandagatla #define CDC_WSA_RX0_RX_PATH_CFG0 (0x0404) 91809bcbceSSrinivas Kandagatla #define CDC_WSA_RX_PATH_COMP_EN_MASK BIT(1) 92809bcbceSSrinivas Kandagatla #define CDC_WSA_RX_PATH_COMP_ENABLE BIT(1) 93809bcbceSSrinivas Kandagatla #define CDC_WSA_RX_PATH_HD2_EN_MASK BIT(2) 94809bcbceSSrinivas Kandagatla #define CDC_WSA_RX_PATH_HD2_ENABLE BIT(2) 95809bcbceSSrinivas Kandagatla #define CDC_WSA_RX_PATH_SPKR_RATE_MASK BIT(3) 96809bcbceSSrinivas Kandagatla #define CDC_WSA_RX_PATH_SPKR_RATE_FS_2P4_3P072 BIT(3) 97809bcbceSSrinivas Kandagatla #define CDC_WSA_RX0_RX_PATH_CFG1 (0x0408) 98809bcbceSSrinivas Kandagatla #define CDC_WSA_RX_PATH_SMART_BST_EN_MASK BIT(0) 99809bcbceSSrinivas Kandagatla #define CDC_WSA_RX_PATH_SMART_BST_ENABLE BIT(0) 100809bcbceSSrinivas Kandagatla #define CDC_WSA_RX_PATH_SMART_BST_DISABLE 0 101809bcbceSSrinivas Kandagatla #define CDC_WSA_RX0_RX_PATH_CFG2 (0x040C) 102809bcbceSSrinivas Kandagatla #define CDC_WSA_RX0_RX_PATH_CFG3 (0x0410) 103809bcbceSSrinivas Kandagatla #define CDC_WSA_RX_DC_DCOEFF_MASK GENMASK(1, 0) 104809bcbceSSrinivas Kandagatla #define CDC_WSA_RX0_RX_VOL_CTL (0x0414) 105809bcbceSSrinivas Kandagatla #define CDC_WSA_RX0_RX_PATH_MIX_CTL (0x0418) 106809bcbceSSrinivas Kandagatla #define CDC_WSA_RX_PATH_MIX_CLK_EN_MASK BIT(5) 107809bcbceSSrinivas Kandagatla #define CDC_WSA_RX_PATH_MIX_CLK_ENABLE BIT(5) 108809bcbceSSrinivas Kandagatla #define CDC_WSA_RX_PATH_MIX_CLK_DISABLE 0 109809bcbceSSrinivas Kandagatla #define CDC_WSA_RX0_RX_PATH_MIX_CFG (0x041C) 110809bcbceSSrinivas Kandagatla #define CDC_WSA_RX0_RX_VOL_MIX_CTL (0x0420) 111809bcbceSSrinivas Kandagatla #define CDC_WSA_RX0_RX_PATH_SEC0 (0x0424) 112809bcbceSSrinivas Kandagatla #define CDC_WSA_RX0_RX_PATH_SEC1 (0x0428) 113809bcbceSSrinivas Kandagatla #define CDC_WSA_RX_PGA_HALF_DB_MASK BIT(0) 114809bcbceSSrinivas Kandagatla #define CDC_WSA_RX_PGA_HALF_DB_ENABLE BIT(0) 115809bcbceSSrinivas Kandagatla #define CDC_WSA_RX_PGA_HALF_DB_DISABLE 0 116809bcbceSSrinivas Kandagatla #define CDC_WSA_RX0_RX_PATH_SEC2 (0x042C) 117809bcbceSSrinivas Kandagatla #define CDC_WSA_RX0_RX_PATH_SEC3 (0x0430) 118809bcbceSSrinivas Kandagatla #define CDC_WSA_RX_PATH_HD2_SCALE_MASK GENMASK(1, 0) 119809bcbceSSrinivas Kandagatla #define CDC_WSA_RX_PATH_HD2_ALPHA_MASK GENMASK(5, 2) 120809bcbceSSrinivas Kandagatla #define CDC_WSA_RX0_RX_PATH_SEC5 (0x0438) 121809bcbceSSrinivas Kandagatla #define CDC_WSA_RX0_RX_PATH_SEC6 (0x043C) 122809bcbceSSrinivas Kandagatla #define CDC_WSA_RX0_RX_PATH_SEC7 (0x0440) 123809bcbceSSrinivas Kandagatla #define CDC_WSA_RX0_RX_PATH_MIX_SEC0 (0x0444) 124809bcbceSSrinivas Kandagatla #define CDC_WSA_RX0_RX_PATH_MIX_SEC1 (0x0448) 125809bcbceSSrinivas Kandagatla #define CDC_WSA_RX0_RX_PATH_DSMDEM_CTL (0x044C) 126809bcbceSSrinivas Kandagatla #define CDC_WSA_RX_DSMDEM_CLK_EN_MASK BIT(0) 127809bcbceSSrinivas Kandagatla #define CDC_WSA_RX_DSMDEM_CLK_ENABLE BIT(0) 128809bcbceSSrinivas Kandagatla #define CDC_WSA_RX1_RX_PATH_CTL (0x0480) 129809bcbceSSrinivas Kandagatla #define CDC_WSA_RX1_RX_PATH_CFG0 (0x0484) 130809bcbceSSrinivas Kandagatla #define CDC_WSA_RX1_RX_PATH_CFG1 (0x0488) 131809bcbceSSrinivas Kandagatla #define CDC_WSA_RX1_RX_PATH_CFG2 (0x048C) 132809bcbceSSrinivas Kandagatla #define CDC_WSA_RX1_RX_PATH_CFG3 (0x0490) 133809bcbceSSrinivas Kandagatla #define CDC_WSA_RX1_RX_VOL_CTL (0x0494) 134809bcbceSSrinivas Kandagatla #define CDC_WSA_RX1_RX_PATH_MIX_CTL (0x0498) 135809bcbceSSrinivas Kandagatla #define CDC_WSA_RX1_RX_PATH_MIX_CFG (0x049C) 136809bcbceSSrinivas Kandagatla #define CDC_WSA_RX1_RX_VOL_MIX_CTL (0x04A0) 137809bcbceSSrinivas Kandagatla #define CDC_WSA_RX1_RX_PATH_SEC0 (0x04A4) 138809bcbceSSrinivas Kandagatla #define CDC_WSA_RX1_RX_PATH_SEC1 (0x04A8) 139809bcbceSSrinivas Kandagatla #define CDC_WSA_RX1_RX_PATH_SEC2 (0x04AC) 140809bcbceSSrinivas Kandagatla #define CDC_WSA_RX1_RX_PATH_SEC3 (0x04B0) 141809bcbceSSrinivas Kandagatla #define CDC_WSA_RX1_RX_PATH_SEC5 (0x04B8) 142809bcbceSSrinivas Kandagatla #define CDC_WSA_RX1_RX_PATH_SEC6 (0x04BC) 143809bcbceSSrinivas Kandagatla #define CDC_WSA_RX1_RX_PATH_SEC7 (0x04C0) 144809bcbceSSrinivas Kandagatla #define CDC_WSA_RX1_RX_PATH_MIX_SEC0 (0x04C4) 145809bcbceSSrinivas Kandagatla #define CDC_WSA_RX1_RX_PATH_MIX_SEC1 (0x04C8) 146809bcbceSSrinivas Kandagatla #define CDC_WSA_RX1_RX_PATH_DSMDEM_CTL (0x04CC) 147809bcbceSSrinivas Kandagatla #define CDC_WSA_BOOST0_BOOST_PATH_CTL (0x0500) 148809bcbceSSrinivas Kandagatla #define CDC_WSA_BOOST_PATH_CLK_EN_MASK BIT(4) 149809bcbceSSrinivas Kandagatla #define CDC_WSA_BOOST_PATH_CLK_ENABLE BIT(4) 150809bcbceSSrinivas Kandagatla #define CDC_WSA_BOOST_PATH_CLK_DISABLE 0 151809bcbceSSrinivas Kandagatla #define CDC_WSA_BOOST0_BOOST_CTL (0x0504) 152809bcbceSSrinivas Kandagatla #define CDC_WSA_BOOST0_BOOST_CFG1 (0x0508) 153809bcbceSSrinivas Kandagatla #define CDC_WSA_BOOST0_BOOST_CFG2 (0x050C) 154809bcbceSSrinivas Kandagatla #define CDC_WSA_BOOST1_BOOST_PATH_CTL (0x0540) 155809bcbceSSrinivas Kandagatla #define CDC_WSA_BOOST1_BOOST_CTL (0x0544) 156809bcbceSSrinivas Kandagatla #define CDC_WSA_BOOST1_BOOST_CFG1 (0x0548) 157809bcbceSSrinivas Kandagatla #define CDC_WSA_BOOST1_BOOST_CFG2 (0x054C) 158809bcbceSSrinivas Kandagatla #define CDC_WSA_COMPANDER0_CTL0 (0x0580) 159809bcbceSSrinivas Kandagatla #define CDC_WSA_COMPANDER_CLK_EN_MASK BIT(0) 160809bcbceSSrinivas Kandagatla #define CDC_WSA_COMPANDER_CLK_ENABLE BIT(0) 161809bcbceSSrinivas Kandagatla #define CDC_WSA_COMPANDER_SOFT_RST_MASK BIT(1) 162809bcbceSSrinivas Kandagatla #define CDC_WSA_COMPANDER_SOFT_RST_ENABLE BIT(1) 163809bcbceSSrinivas Kandagatla #define CDC_WSA_COMPANDER_HALT_MASK BIT(2) 164809bcbceSSrinivas Kandagatla #define CDC_WSA_COMPANDER_HALT BIT(2) 165809bcbceSSrinivas Kandagatla #define CDC_WSA_COMPANDER0_CTL1 (0x0584) 166809bcbceSSrinivas Kandagatla #define CDC_WSA_COMPANDER0_CTL2 (0x0588) 167809bcbceSSrinivas Kandagatla #define CDC_WSA_COMPANDER0_CTL3 (0x058C) 168809bcbceSSrinivas Kandagatla #define CDC_WSA_COMPANDER0_CTL4 (0x0590) 169809bcbceSSrinivas Kandagatla #define CDC_WSA_COMPANDER0_CTL5 (0x0594) 170809bcbceSSrinivas Kandagatla #define CDC_WSA_COMPANDER0_CTL6 (0x0598) 171809bcbceSSrinivas Kandagatla #define CDC_WSA_COMPANDER0_CTL7 (0x059C) 172809bcbceSSrinivas Kandagatla #define CDC_WSA_COMPANDER1_CTL0 (0x05C0) 173809bcbceSSrinivas Kandagatla #define CDC_WSA_COMPANDER1_CTL1 (0x05C4) 174809bcbceSSrinivas Kandagatla #define CDC_WSA_COMPANDER1_CTL2 (0x05C8) 175809bcbceSSrinivas Kandagatla #define CDC_WSA_COMPANDER1_CTL3 (0x05CC) 176809bcbceSSrinivas Kandagatla #define CDC_WSA_COMPANDER1_CTL4 (0x05D0) 177809bcbceSSrinivas Kandagatla #define CDC_WSA_COMPANDER1_CTL5 (0x05D4) 178809bcbceSSrinivas Kandagatla #define CDC_WSA_COMPANDER1_CTL6 (0x05D8) 179809bcbceSSrinivas Kandagatla #define CDC_WSA_COMPANDER1_CTL7 (0x05DC) 180809bcbceSSrinivas Kandagatla #define CDC_WSA_SOFTCLIP0_CRC (0x0600) 181809bcbceSSrinivas Kandagatla #define CDC_WSA_SOFTCLIP_CLK_EN_MASK BIT(0) 182809bcbceSSrinivas Kandagatla #define CDC_WSA_SOFTCLIP_CLK_ENABLE BIT(0) 183809bcbceSSrinivas Kandagatla #define CDC_WSA_SOFTCLIP0_SOFTCLIP_CTRL (0x0604) 184809bcbceSSrinivas Kandagatla #define CDC_WSA_SOFTCLIP_EN_MASK BIT(0) 185809bcbceSSrinivas Kandagatla #define CDC_WSA_SOFTCLIP_ENABLE BIT(0) 186809bcbceSSrinivas Kandagatla #define CDC_WSA_SOFTCLIP1_CRC (0x0640) 187809bcbceSSrinivas Kandagatla #define CDC_WSA_SOFTCLIP1_SOFTCLIP_CTRL (0x0644) 188809bcbceSSrinivas Kandagatla #define CDC_WSA_EC_HQ0_EC_REF_HQ_PATH_CTL (0x0680) 189809bcbceSSrinivas Kandagatla #define CDC_WSA_EC_HQ_EC_CLK_EN_MASK BIT(0) 190809bcbceSSrinivas Kandagatla #define CDC_WSA_EC_HQ_EC_CLK_ENABLE BIT(0) 191809bcbceSSrinivas Kandagatla #define CDC_WSA_EC_HQ0_EC_REF_HQ_CFG0 (0x0684) 192809bcbceSSrinivas Kandagatla #define CDC_WSA_EC_HQ_EC_REF_PCM_RATE_MASK GENMASK(4, 1) 193809bcbceSSrinivas Kandagatla #define CDC_WSA_EC_HQ_EC_REF_PCM_RATE_48K BIT(3) 194809bcbceSSrinivas Kandagatla #define CDC_WSA_EC_HQ1_EC_REF_HQ_PATH_CTL (0x06C0) 195809bcbceSSrinivas Kandagatla #define CDC_WSA_EC_HQ1_EC_REF_HQ_CFG0 (0x06C4) 196809bcbceSSrinivas Kandagatla #define CDC_WSA_SPLINE_ASRC0_CLK_RST_CTL (0x0700) 197809bcbceSSrinivas Kandagatla #define CDC_WSA_SPLINE_ASRC0_CTL0 (0x0704) 198809bcbceSSrinivas Kandagatla #define CDC_WSA_SPLINE_ASRC0_CTL1 (0x0708) 199809bcbceSSrinivas Kandagatla #define CDC_WSA_SPLINE_ASRC0_FIFO_CTL (0x070C) 200809bcbceSSrinivas Kandagatla #define CDC_WSA_SPLINE_ASRC0_STATUS_FMIN_CNTR_LSB (0x0710) 201809bcbceSSrinivas Kandagatla #define CDC_WSA_SPLINE_ASRC0_STATUS_FMIN_CNTR_MSB (0x0714) 202809bcbceSSrinivas Kandagatla #define CDC_WSA_SPLINE_ASRC0_STATUS_FMAX_CNTR_LSB (0x0718) 203809bcbceSSrinivas Kandagatla #define CDC_WSA_SPLINE_ASRC0_STATUS_FMAX_CNTR_MSB (0x071C) 204809bcbceSSrinivas Kandagatla #define CDC_WSA_SPLINE_ASRC0_STATUS_FIFO (0x0720) 205809bcbceSSrinivas Kandagatla #define CDC_WSA_SPLINE_ASRC1_CLK_RST_CTL (0x0740) 206809bcbceSSrinivas Kandagatla #define CDC_WSA_SPLINE_ASRC1_CTL0 (0x0744) 207809bcbceSSrinivas Kandagatla #define CDC_WSA_SPLINE_ASRC1_CTL1 (0x0748) 208809bcbceSSrinivas Kandagatla #define CDC_WSA_SPLINE_ASRC1_FIFO_CTL (0x074C) 209809bcbceSSrinivas Kandagatla #define CDC_WSA_SPLINE_ASRC1_STATUS_FMIN_CNTR_LSB (0x0750) 210809bcbceSSrinivas Kandagatla #define CDC_WSA_SPLINE_ASRC1_STATUS_FMIN_CNTR_MSB (0x0754) 211809bcbceSSrinivas Kandagatla #define CDC_WSA_SPLINE_ASRC1_STATUS_FMAX_CNTR_LSB (0x0758) 212809bcbceSSrinivas Kandagatla #define CDC_WSA_SPLINE_ASRC1_STATUS_FMAX_CNTR_MSB (0x075C) 213809bcbceSSrinivas Kandagatla #define CDC_WSA_SPLINE_ASRC1_STATUS_FIFO (0x0760) 214809bcbceSSrinivas Kandagatla #define WSA_MAX_OFFSET (0x0760) 215809bcbceSSrinivas Kandagatla 216809bcbceSSrinivas Kandagatla #define WSA_MACRO_RX_RATES (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 |\ 217809bcbceSSrinivas Kandagatla SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 |\ 218809bcbceSSrinivas Kandagatla SNDRV_PCM_RATE_96000 | SNDRV_PCM_RATE_192000) 219809bcbceSSrinivas Kandagatla #define WSA_MACRO_RX_MIX_RATES (SNDRV_PCM_RATE_48000 |\ 220809bcbceSSrinivas Kandagatla SNDRV_PCM_RATE_96000 | SNDRV_PCM_RATE_192000) 221809bcbceSSrinivas Kandagatla #define WSA_MACRO_RX_FORMATS (SNDRV_PCM_FMTBIT_S16_LE |\ 222809bcbceSSrinivas Kandagatla SNDRV_PCM_FMTBIT_S24_LE |\ 223809bcbceSSrinivas Kandagatla SNDRV_PCM_FMTBIT_S24_3LE | SNDRV_PCM_FMTBIT_S32_LE) 224809bcbceSSrinivas Kandagatla 225809bcbceSSrinivas Kandagatla #define WSA_MACRO_ECHO_RATES (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 |\ 226809bcbceSSrinivas Kandagatla SNDRV_PCM_RATE_48000) 227809bcbceSSrinivas Kandagatla #define WSA_MACRO_ECHO_FORMATS (SNDRV_PCM_FMTBIT_S16_LE |\ 228809bcbceSSrinivas Kandagatla SNDRV_PCM_FMTBIT_S24_LE |\ 229809bcbceSSrinivas Kandagatla SNDRV_PCM_FMTBIT_S24_3LE) 230809bcbceSSrinivas Kandagatla 231809bcbceSSrinivas Kandagatla #define NUM_INTERPOLATORS 2 232809bcbceSSrinivas Kandagatla #define WSA_NUM_CLKS_MAX 5 233809bcbceSSrinivas Kandagatla #define WSA_MACRO_MCLK_FREQ 19200000 234809bcbceSSrinivas Kandagatla #define WSA_MACRO_MUX_INP_MASK2 0x38 235809bcbceSSrinivas Kandagatla #define WSA_MACRO_MUX_CFG_OFFSET 0x8 236809bcbceSSrinivas Kandagatla #define WSA_MACRO_MUX_CFG1_OFFSET 0x4 237809bcbceSSrinivas Kandagatla #define WSA_MACRO_RX_COMP_OFFSET 0x40 238809bcbceSSrinivas Kandagatla #define WSA_MACRO_RX_SOFTCLIP_OFFSET 0x40 239809bcbceSSrinivas Kandagatla #define WSA_MACRO_RX_PATH_OFFSET 0x80 240809bcbceSSrinivas Kandagatla #define WSA_MACRO_RX_PATH_CFG3_OFFSET 0x10 241809bcbceSSrinivas Kandagatla #define WSA_MACRO_RX_PATH_DSMDEM_OFFSET 0x4C 242809bcbceSSrinivas Kandagatla #define WSA_MACRO_FS_RATE_MASK 0x0F 243809bcbceSSrinivas Kandagatla #define WSA_MACRO_EC_MIX_TX0_MASK 0x03 244809bcbceSSrinivas Kandagatla #define WSA_MACRO_EC_MIX_TX1_MASK 0x18 245809bcbceSSrinivas Kandagatla #define WSA_MACRO_MAX_DMA_CH_PER_PORT 0x2 246809bcbceSSrinivas Kandagatla 247809bcbceSSrinivas Kandagatla enum { 248809bcbceSSrinivas Kandagatla WSA_MACRO_GAIN_OFFSET_M1P5_DB, 249809bcbceSSrinivas Kandagatla WSA_MACRO_GAIN_OFFSET_0_DB, 250809bcbceSSrinivas Kandagatla }; 251809bcbceSSrinivas Kandagatla enum { 252809bcbceSSrinivas Kandagatla WSA_MACRO_RX0 = 0, 253809bcbceSSrinivas Kandagatla WSA_MACRO_RX1, 254809bcbceSSrinivas Kandagatla WSA_MACRO_RX_MIX, 255809bcbceSSrinivas Kandagatla WSA_MACRO_RX_MIX0 = WSA_MACRO_RX_MIX, 256809bcbceSSrinivas Kandagatla WSA_MACRO_RX_MIX1, 257809bcbceSSrinivas Kandagatla WSA_MACRO_RX_MAX, 258809bcbceSSrinivas Kandagatla }; 259809bcbceSSrinivas Kandagatla 260809bcbceSSrinivas Kandagatla enum { 261809bcbceSSrinivas Kandagatla WSA_MACRO_TX0 = 0, 262809bcbceSSrinivas Kandagatla WSA_MACRO_TX1, 263809bcbceSSrinivas Kandagatla WSA_MACRO_TX_MAX, 264809bcbceSSrinivas Kandagatla }; 265809bcbceSSrinivas Kandagatla 266809bcbceSSrinivas Kandagatla enum { 267809bcbceSSrinivas Kandagatla WSA_MACRO_EC0_MUX = 0, 268809bcbceSSrinivas Kandagatla WSA_MACRO_EC1_MUX, 269809bcbceSSrinivas Kandagatla WSA_MACRO_EC_MUX_MAX, 270809bcbceSSrinivas Kandagatla }; 271809bcbceSSrinivas Kandagatla 272809bcbceSSrinivas Kandagatla enum { 273809bcbceSSrinivas Kandagatla WSA_MACRO_COMP1, /* SPK_L */ 274809bcbceSSrinivas Kandagatla WSA_MACRO_COMP2, /* SPK_R */ 275809bcbceSSrinivas Kandagatla WSA_MACRO_COMP_MAX 276809bcbceSSrinivas Kandagatla }; 277809bcbceSSrinivas Kandagatla 278809bcbceSSrinivas Kandagatla enum { 279809bcbceSSrinivas Kandagatla WSA_MACRO_SOFTCLIP0, /* RX0 */ 280809bcbceSSrinivas Kandagatla WSA_MACRO_SOFTCLIP1, /* RX1 */ 281809bcbceSSrinivas Kandagatla WSA_MACRO_SOFTCLIP_MAX 282809bcbceSSrinivas Kandagatla }; 283809bcbceSSrinivas Kandagatla 284809bcbceSSrinivas Kandagatla enum { 285809bcbceSSrinivas Kandagatla INTn_1_INP_SEL_ZERO = 0, 286809bcbceSSrinivas Kandagatla INTn_1_INP_SEL_RX0, 287809bcbceSSrinivas Kandagatla INTn_1_INP_SEL_RX1, 288809bcbceSSrinivas Kandagatla INTn_1_INP_SEL_RX2, 289809bcbceSSrinivas Kandagatla INTn_1_INP_SEL_RX3, 290809bcbceSSrinivas Kandagatla INTn_1_INP_SEL_DEC0, 291809bcbceSSrinivas Kandagatla INTn_1_INP_SEL_DEC1, 292809bcbceSSrinivas Kandagatla }; 293809bcbceSSrinivas Kandagatla 294809bcbceSSrinivas Kandagatla enum { 295809bcbceSSrinivas Kandagatla INTn_2_INP_SEL_ZERO = 0, 296809bcbceSSrinivas Kandagatla INTn_2_INP_SEL_RX0, 297809bcbceSSrinivas Kandagatla INTn_2_INP_SEL_RX1, 298809bcbceSSrinivas Kandagatla INTn_2_INP_SEL_RX2, 299809bcbceSSrinivas Kandagatla INTn_2_INP_SEL_RX3, 300809bcbceSSrinivas Kandagatla }; 301809bcbceSSrinivas Kandagatla 302809bcbceSSrinivas Kandagatla struct interp_sample_rate { 303809bcbceSSrinivas Kandagatla int sample_rate; 304809bcbceSSrinivas Kandagatla int rate_val; 305809bcbceSSrinivas Kandagatla }; 306809bcbceSSrinivas Kandagatla 307809bcbceSSrinivas Kandagatla static struct interp_sample_rate int_prim_sample_rate_val[] = { 308809bcbceSSrinivas Kandagatla {8000, 0x0}, /* 8K */ 309809bcbceSSrinivas Kandagatla {16000, 0x1}, /* 16K */ 310809bcbceSSrinivas Kandagatla {24000, -EINVAL},/* 24K */ 311809bcbceSSrinivas Kandagatla {32000, 0x3}, /* 32K */ 312809bcbceSSrinivas Kandagatla {48000, 0x4}, /* 48K */ 313809bcbceSSrinivas Kandagatla {96000, 0x5}, /* 96K */ 314809bcbceSSrinivas Kandagatla {192000, 0x6}, /* 192K */ 315809bcbceSSrinivas Kandagatla {384000, 0x7}, /* 384K */ 316809bcbceSSrinivas Kandagatla {44100, 0x8}, /* 44.1K */ 317809bcbceSSrinivas Kandagatla }; 318809bcbceSSrinivas Kandagatla 319809bcbceSSrinivas Kandagatla static struct interp_sample_rate int_mix_sample_rate_val[] = { 320809bcbceSSrinivas Kandagatla {48000, 0x4}, /* 48K */ 321809bcbceSSrinivas Kandagatla {96000, 0x5}, /* 96K */ 322809bcbceSSrinivas Kandagatla {192000, 0x6}, /* 192K */ 323809bcbceSSrinivas Kandagatla }; 324809bcbceSSrinivas Kandagatla 325809bcbceSSrinivas Kandagatla enum { 326809bcbceSSrinivas Kandagatla WSA_MACRO_AIF_INVALID = 0, 327809bcbceSSrinivas Kandagatla WSA_MACRO_AIF1_PB, 328809bcbceSSrinivas Kandagatla WSA_MACRO_AIF_MIX1_PB, 329809bcbceSSrinivas Kandagatla WSA_MACRO_AIF_VI, 330809bcbceSSrinivas Kandagatla WSA_MACRO_AIF_ECHO, 331809bcbceSSrinivas Kandagatla WSA_MACRO_MAX_DAIS, 332809bcbceSSrinivas Kandagatla }; 333809bcbceSSrinivas Kandagatla 334809bcbceSSrinivas Kandagatla struct wsa_macro { 335809bcbceSSrinivas Kandagatla struct device *dev; 336809bcbceSSrinivas Kandagatla int comp_enabled[WSA_MACRO_COMP_MAX]; 337809bcbceSSrinivas Kandagatla int ec_hq[WSA_MACRO_RX1 + 1]; 338809bcbceSSrinivas Kandagatla u16 prim_int_users[WSA_MACRO_RX1 + 1]; 339809bcbceSSrinivas Kandagatla u16 wsa_mclk_users; 340809bcbceSSrinivas Kandagatla bool reset_swr; 341809bcbceSSrinivas Kandagatla unsigned long active_ch_mask[WSA_MACRO_MAX_DAIS]; 342809bcbceSSrinivas Kandagatla unsigned long active_ch_cnt[WSA_MACRO_MAX_DAIS]; 343809bcbceSSrinivas Kandagatla int rx_port_value[WSA_MACRO_RX_MAX]; 344809bcbceSSrinivas Kandagatla int ear_spkr_gain; 345809bcbceSSrinivas Kandagatla int spkr_gain_offset; 346809bcbceSSrinivas Kandagatla int spkr_mode; 347809bcbceSSrinivas Kandagatla int is_softclip_on[WSA_MACRO_SOFTCLIP_MAX]; 348809bcbceSSrinivas Kandagatla int softclip_clk_users[WSA_MACRO_SOFTCLIP_MAX]; 349809bcbceSSrinivas Kandagatla struct regmap *regmap; 350*e252801dSSrinivas Kandagatla struct clk *mclk; 351*e252801dSSrinivas Kandagatla struct clk *npl; 352*e252801dSSrinivas Kandagatla struct clk *macro; 353*e252801dSSrinivas Kandagatla struct clk *dcodec; 354*e252801dSSrinivas Kandagatla struct clk *fsgen; 355809bcbceSSrinivas Kandagatla struct clk_hw hw; 356809bcbceSSrinivas Kandagatla }; 357809bcbceSSrinivas Kandagatla #define to_wsa_macro(_hw) container_of(_hw, struct wsa_macro, hw) 358809bcbceSSrinivas Kandagatla 359809bcbceSSrinivas Kandagatla static const DECLARE_TLV_DB_SCALE(digital_gain, -8400, 100, -8400); 360809bcbceSSrinivas Kandagatla 3612c4066e5SSrinivas Kandagatla static const char *const rx_text[] = { 3622c4066e5SSrinivas Kandagatla "ZERO", "RX0", "RX1", "RX_MIX0", "RX_MIX1", "DEC0", "DEC1" 3632c4066e5SSrinivas Kandagatla }; 3642c4066e5SSrinivas Kandagatla 3652c4066e5SSrinivas Kandagatla static const char *const rx_mix_text[] = { 3662c4066e5SSrinivas Kandagatla "ZERO", "RX0", "RX1", "RX_MIX0", "RX_MIX1" 3672c4066e5SSrinivas Kandagatla }; 3682c4066e5SSrinivas Kandagatla 3692c4066e5SSrinivas Kandagatla static const char *const rx_mix_ec_text[] = { 3702c4066e5SSrinivas Kandagatla "ZERO", "RX_MIX_TX0", "RX_MIX_TX1" 3712c4066e5SSrinivas Kandagatla }; 3722c4066e5SSrinivas Kandagatla 3732c4066e5SSrinivas Kandagatla static const char *const rx_mux_text[] = { 3742c4066e5SSrinivas Kandagatla "ZERO", "AIF1_PB", "AIF_MIX1_PB" 3752c4066e5SSrinivas Kandagatla }; 3762c4066e5SSrinivas Kandagatla 3772c4066e5SSrinivas Kandagatla static const char *const rx_sidetone_mix_text[] = { 3782c4066e5SSrinivas Kandagatla "ZERO", "SRC0" 3792c4066e5SSrinivas Kandagatla }; 3802c4066e5SSrinivas Kandagatla 381809bcbceSSrinivas Kandagatla static const char * const wsa_macro_ear_spkr_pa_gain_text[] = { 382809bcbceSSrinivas Kandagatla "G_DEFAULT", "G_0_DB", "G_1_DB", "G_2_DB", "G_3_DB", 383809bcbceSSrinivas Kandagatla "G_4_DB", "G_5_DB", "G_6_DB" 384809bcbceSSrinivas Kandagatla }; 385809bcbceSSrinivas Kandagatla 386809bcbceSSrinivas Kandagatla static SOC_ENUM_SINGLE_EXT_DECL(wsa_macro_ear_spkr_pa_gain_enum, 387809bcbceSSrinivas Kandagatla wsa_macro_ear_spkr_pa_gain_text); 388809bcbceSSrinivas Kandagatla 3892c4066e5SSrinivas Kandagatla /* RX INT0 */ 3902c4066e5SSrinivas Kandagatla static const struct soc_enum rx0_prim_inp0_chain_enum = 3912c4066e5SSrinivas Kandagatla SOC_ENUM_SINGLE(CDC_WSA_RX_INP_MUX_RX_INT0_CFG0, 3922c4066e5SSrinivas Kandagatla 0, 7, rx_text); 3932c4066e5SSrinivas Kandagatla 3942c4066e5SSrinivas Kandagatla static const struct soc_enum rx0_prim_inp1_chain_enum = 3952c4066e5SSrinivas Kandagatla SOC_ENUM_SINGLE(CDC_WSA_RX_INP_MUX_RX_INT0_CFG0, 3962c4066e5SSrinivas Kandagatla 3, 7, rx_text); 3972c4066e5SSrinivas Kandagatla 3982c4066e5SSrinivas Kandagatla static const struct soc_enum rx0_prim_inp2_chain_enum = 3992c4066e5SSrinivas Kandagatla SOC_ENUM_SINGLE(CDC_WSA_RX_INP_MUX_RX_INT0_CFG1, 4002c4066e5SSrinivas Kandagatla 3, 7, rx_text); 4012c4066e5SSrinivas Kandagatla 4022c4066e5SSrinivas Kandagatla static const struct soc_enum rx0_mix_chain_enum = 4032c4066e5SSrinivas Kandagatla SOC_ENUM_SINGLE(CDC_WSA_RX_INP_MUX_RX_INT0_CFG1, 4042c4066e5SSrinivas Kandagatla 0, 5, rx_mix_text); 4052c4066e5SSrinivas Kandagatla 4062c4066e5SSrinivas Kandagatla static const struct soc_enum rx0_sidetone_mix_enum = 4072c4066e5SSrinivas Kandagatla SOC_ENUM_SINGLE(SND_SOC_NOPM, 0, 2, rx_sidetone_mix_text); 4082c4066e5SSrinivas Kandagatla 4092c4066e5SSrinivas Kandagatla static const struct snd_kcontrol_new rx0_prim_inp0_mux = 4102c4066e5SSrinivas Kandagatla SOC_DAPM_ENUM("WSA_RX0 INP0 Mux", rx0_prim_inp0_chain_enum); 4112c4066e5SSrinivas Kandagatla 4122c4066e5SSrinivas Kandagatla static const struct snd_kcontrol_new rx0_prim_inp1_mux = 4132c4066e5SSrinivas Kandagatla SOC_DAPM_ENUM("WSA_RX0 INP1 Mux", rx0_prim_inp1_chain_enum); 4142c4066e5SSrinivas Kandagatla 4152c4066e5SSrinivas Kandagatla static const struct snd_kcontrol_new rx0_prim_inp2_mux = 4162c4066e5SSrinivas Kandagatla SOC_DAPM_ENUM("WSA_RX0 INP2 Mux", rx0_prim_inp2_chain_enum); 4172c4066e5SSrinivas Kandagatla 4182c4066e5SSrinivas Kandagatla static const struct snd_kcontrol_new rx0_mix_mux = 4192c4066e5SSrinivas Kandagatla SOC_DAPM_ENUM("WSA_RX0 MIX Mux", rx0_mix_chain_enum); 4202c4066e5SSrinivas Kandagatla 4212c4066e5SSrinivas Kandagatla static const struct snd_kcontrol_new rx0_sidetone_mix_mux = 4222c4066e5SSrinivas Kandagatla SOC_DAPM_ENUM("WSA_RX0 SIDETONE MIX Mux", rx0_sidetone_mix_enum); 4232c4066e5SSrinivas Kandagatla 4242c4066e5SSrinivas Kandagatla /* RX INT1 */ 4252c4066e5SSrinivas Kandagatla static const struct soc_enum rx1_prim_inp0_chain_enum = 4262c4066e5SSrinivas Kandagatla SOC_ENUM_SINGLE(CDC_WSA_RX_INP_MUX_RX_INT1_CFG0, 4272c4066e5SSrinivas Kandagatla 0, 7, rx_text); 4282c4066e5SSrinivas Kandagatla 4292c4066e5SSrinivas Kandagatla static const struct soc_enum rx1_prim_inp1_chain_enum = 4302c4066e5SSrinivas Kandagatla SOC_ENUM_SINGLE(CDC_WSA_RX_INP_MUX_RX_INT1_CFG0, 4312c4066e5SSrinivas Kandagatla 3, 7, rx_text); 4322c4066e5SSrinivas Kandagatla 4332c4066e5SSrinivas Kandagatla static const struct soc_enum rx1_prim_inp2_chain_enum = 4342c4066e5SSrinivas Kandagatla SOC_ENUM_SINGLE(CDC_WSA_RX_INP_MUX_RX_INT1_CFG1, 4352c4066e5SSrinivas Kandagatla 3, 7, rx_text); 4362c4066e5SSrinivas Kandagatla 4372c4066e5SSrinivas Kandagatla static const struct soc_enum rx1_mix_chain_enum = 4382c4066e5SSrinivas Kandagatla SOC_ENUM_SINGLE(CDC_WSA_RX_INP_MUX_RX_INT1_CFG1, 4392c4066e5SSrinivas Kandagatla 0, 5, rx_mix_text); 4402c4066e5SSrinivas Kandagatla 4412c4066e5SSrinivas Kandagatla static const struct snd_kcontrol_new rx1_prim_inp0_mux = 4422c4066e5SSrinivas Kandagatla SOC_DAPM_ENUM("WSA_RX1 INP0 Mux", rx1_prim_inp0_chain_enum); 4432c4066e5SSrinivas Kandagatla 4442c4066e5SSrinivas Kandagatla static const struct snd_kcontrol_new rx1_prim_inp1_mux = 4452c4066e5SSrinivas Kandagatla SOC_DAPM_ENUM("WSA_RX1 INP1 Mux", rx1_prim_inp1_chain_enum); 4462c4066e5SSrinivas Kandagatla 4472c4066e5SSrinivas Kandagatla static const struct snd_kcontrol_new rx1_prim_inp2_mux = 4482c4066e5SSrinivas Kandagatla SOC_DAPM_ENUM("WSA_RX1 INP2 Mux", rx1_prim_inp2_chain_enum); 4492c4066e5SSrinivas Kandagatla 4502c4066e5SSrinivas Kandagatla static const struct snd_kcontrol_new rx1_mix_mux = 4512c4066e5SSrinivas Kandagatla SOC_DAPM_ENUM("WSA_RX1 MIX Mux", rx1_mix_chain_enum); 4522c4066e5SSrinivas Kandagatla 4532c4066e5SSrinivas Kandagatla static const struct soc_enum rx_mix_ec0_enum = 4542c4066e5SSrinivas Kandagatla SOC_ENUM_SINGLE(CDC_WSA_RX_INP_MUX_RX_MIX_CFG0, 4552c4066e5SSrinivas Kandagatla 0, 3, rx_mix_ec_text); 4562c4066e5SSrinivas Kandagatla 4572c4066e5SSrinivas Kandagatla static const struct soc_enum rx_mix_ec1_enum = 4582c4066e5SSrinivas Kandagatla SOC_ENUM_SINGLE(CDC_WSA_RX_INP_MUX_RX_MIX_CFG0, 4592c4066e5SSrinivas Kandagatla 3, 3, rx_mix_ec_text); 4602c4066e5SSrinivas Kandagatla 4612c4066e5SSrinivas Kandagatla static const struct snd_kcontrol_new rx_mix_ec0_mux = 4622c4066e5SSrinivas Kandagatla SOC_DAPM_ENUM("WSA RX_MIX EC0_Mux", rx_mix_ec0_enum); 4632c4066e5SSrinivas Kandagatla 4642c4066e5SSrinivas Kandagatla static const struct snd_kcontrol_new rx_mix_ec1_mux = 4652c4066e5SSrinivas Kandagatla SOC_DAPM_ENUM("WSA RX_MIX EC1_Mux", rx_mix_ec1_enum); 4662c4066e5SSrinivas Kandagatla 467809bcbceSSrinivas Kandagatla static const struct reg_default wsa_defaults[] = { 468809bcbceSSrinivas Kandagatla /* WSA Macro */ 469809bcbceSSrinivas Kandagatla { CDC_WSA_CLK_RST_CTRL_MCLK_CONTROL, 0x00}, 470809bcbceSSrinivas Kandagatla { CDC_WSA_CLK_RST_CTRL_FS_CNT_CONTROL, 0x00}, 471809bcbceSSrinivas Kandagatla { CDC_WSA_CLK_RST_CTRL_SWR_CONTROL, 0x00}, 472809bcbceSSrinivas Kandagatla { CDC_WSA_TOP_TOP_CFG0, 0x00}, 473809bcbceSSrinivas Kandagatla { CDC_WSA_TOP_TOP_CFG1, 0x00}, 474809bcbceSSrinivas Kandagatla { CDC_WSA_TOP_FREQ_MCLK, 0x00}, 475809bcbceSSrinivas Kandagatla { CDC_WSA_TOP_DEBUG_BUS_SEL, 0x00}, 476809bcbceSSrinivas Kandagatla { CDC_WSA_TOP_DEBUG_EN0, 0x00}, 477809bcbceSSrinivas Kandagatla { CDC_WSA_TOP_DEBUG_EN1, 0x00}, 478809bcbceSSrinivas Kandagatla { CDC_WSA_TOP_DEBUG_DSM_LB, 0x88}, 479809bcbceSSrinivas Kandagatla { CDC_WSA_TOP_RX_I2S_CTL, 0x0C}, 480809bcbceSSrinivas Kandagatla { CDC_WSA_TOP_TX_I2S_CTL, 0x0C}, 481809bcbceSSrinivas Kandagatla { CDC_WSA_TOP_I2S_CLK, 0x02}, 482809bcbceSSrinivas Kandagatla { CDC_WSA_TOP_I2S_RESET, 0x00}, 483809bcbceSSrinivas Kandagatla { CDC_WSA_RX_INP_MUX_RX_INT0_CFG0, 0x00}, 484809bcbceSSrinivas Kandagatla { CDC_WSA_RX_INP_MUX_RX_INT0_CFG1, 0x00}, 485809bcbceSSrinivas Kandagatla { CDC_WSA_RX_INP_MUX_RX_INT1_CFG0, 0x00}, 486809bcbceSSrinivas Kandagatla { CDC_WSA_RX_INP_MUX_RX_INT1_CFG1, 0x00}, 487809bcbceSSrinivas Kandagatla { CDC_WSA_RX_INP_MUX_RX_MIX_CFG0, 0x00}, 488809bcbceSSrinivas Kandagatla { CDC_WSA_RX_INP_MUX_RX_EC_CFG0, 0x00}, 489809bcbceSSrinivas Kandagatla { CDC_WSA_RX_INP_MUX_SOFTCLIP_CFG0, 0x00}, 490809bcbceSSrinivas Kandagatla { CDC_WSA_TX0_SPKR_PROT_PATH_CTL, 0x02}, 491809bcbceSSrinivas Kandagatla { CDC_WSA_TX0_SPKR_PROT_PATH_CFG0, 0x00}, 492809bcbceSSrinivas Kandagatla { CDC_WSA_TX1_SPKR_PROT_PATH_CTL, 0x02}, 493809bcbceSSrinivas Kandagatla { CDC_WSA_TX1_SPKR_PROT_PATH_CFG0, 0x00}, 494809bcbceSSrinivas Kandagatla { CDC_WSA_TX2_SPKR_PROT_PATH_CTL, 0x02}, 495809bcbceSSrinivas Kandagatla { CDC_WSA_TX2_SPKR_PROT_PATH_CFG0, 0x00}, 496809bcbceSSrinivas Kandagatla { CDC_WSA_TX3_SPKR_PROT_PATH_CTL, 0x02}, 497809bcbceSSrinivas Kandagatla { CDC_WSA_TX3_SPKR_PROT_PATH_CFG0, 0x00}, 498809bcbceSSrinivas Kandagatla { CDC_WSA_INTR_CTRL_CFG, 0x00}, 499809bcbceSSrinivas Kandagatla { CDC_WSA_INTR_CTRL_CLR_COMMIT, 0x00}, 500809bcbceSSrinivas Kandagatla { CDC_WSA_INTR_CTRL_PIN1_MASK0, 0xFF}, 501809bcbceSSrinivas Kandagatla { CDC_WSA_INTR_CTRL_PIN1_STATUS0, 0x00}, 502809bcbceSSrinivas Kandagatla { CDC_WSA_INTR_CTRL_PIN1_CLEAR0, 0x00}, 503809bcbceSSrinivas Kandagatla { CDC_WSA_INTR_CTRL_PIN2_MASK0, 0xFF}, 504809bcbceSSrinivas Kandagatla { CDC_WSA_INTR_CTRL_PIN2_STATUS0, 0x00}, 505809bcbceSSrinivas Kandagatla { CDC_WSA_INTR_CTRL_PIN2_CLEAR0, 0x00}, 506809bcbceSSrinivas Kandagatla { CDC_WSA_INTR_CTRL_LEVEL0, 0x00}, 507809bcbceSSrinivas Kandagatla { CDC_WSA_INTR_CTRL_BYPASS0, 0x00}, 508809bcbceSSrinivas Kandagatla { CDC_WSA_INTR_CTRL_SET0, 0x00}, 509809bcbceSSrinivas Kandagatla { CDC_WSA_RX0_RX_PATH_CTL, 0x04}, 510809bcbceSSrinivas Kandagatla { CDC_WSA_RX0_RX_PATH_CFG0, 0x00}, 511809bcbceSSrinivas Kandagatla { CDC_WSA_RX0_RX_PATH_CFG1, 0x64}, 512809bcbceSSrinivas Kandagatla { CDC_WSA_RX0_RX_PATH_CFG2, 0x8F}, 513809bcbceSSrinivas Kandagatla { CDC_WSA_RX0_RX_PATH_CFG3, 0x00}, 514809bcbceSSrinivas Kandagatla { CDC_WSA_RX0_RX_VOL_CTL, 0x00}, 515809bcbceSSrinivas Kandagatla { CDC_WSA_RX0_RX_PATH_MIX_CTL, 0x04}, 516809bcbceSSrinivas Kandagatla { CDC_WSA_RX0_RX_PATH_MIX_CFG, 0x7E}, 517809bcbceSSrinivas Kandagatla { CDC_WSA_RX0_RX_VOL_MIX_CTL, 0x00}, 518809bcbceSSrinivas Kandagatla { CDC_WSA_RX0_RX_PATH_SEC0, 0x04}, 519809bcbceSSrinivas Kandagatla { CDC_WSA_RX0_RX_PATH_SEC1, 0x08}, 520809bcbceSSrinivas Kandagatla { CDC_WSA_RX0_RX_PATH_SEC2, 0x00}, 521809bcbceSSrinivas Kandagatla { CDC_WSA_RX0_RX_PATH_SEC3, 0x00}, 522809bcbceSSrinivas Kandagatla { CDC_WSA_RX0_RX_PATH_SEC5, 0x00}, 523809bcbceSSrinivas Kandagatla { CDC_WSA_RX0_RX_PATH_SEC6, 0x00}, 524809bcbceSSrinivas Kandagatla { CDC_WSA_RX0_RX_PATH_SEC7, 0x00}, 525809bcbceSSrinivas Kandagatla { CDC_WSA_RX0_RX_PATH_MIX_SEC0, 0x08}, 526809bcbceSSrinivas Kandagatla { CDC_WSA_RX0_RX_PATH_MIX_SEC1, 0x00}, 527809bcbceSSrinivas Kandagatla { CDC_WSA_RX0_RX_PATH_DSMDEM_CTL, 0x00}, 528809bcbceSSrinivas Kandagatla { CDC_WSA_RX1_RX_PATH_CFG0, 0x00}, 529809bcbceSSrinivas Kandagatla { CDC_WSA_RX1_RX_PATH_CFG1, 0x64}, 530809bcbceSSrinivas Kandagatla { CDC_WSA_RX1_RX_PATH_CFG2, 0x8F}, 531809bcbceSSrinivas Kandagatla { CDC_WSA_RX1_RX_PATH_CFG3, 0x00}, 532809bcbceSSrinivas Kandagatla { CDC_WSA_RX1_RX_VOL_CTL, 0x00}, 533809bcbceSSrinivas Kandagatla { CDC_WSA_RX1_RX_PATH_MIX_CTL, 0x04}, 534809bcbceSSrinivas Kandagatla { CDC_WSA_RX1_RX_PATH_MIX_CFG, 0x7E}, 535809bcbceSSrinivas Kandagatla { CDC_WSA_RX1_RX_VOL_MIX_CTL, 0x00}, 536809bcbceSSrinivas Kandagatla { CDC_WSA_RX1_RX_PATH_SEC0, 0x04}, 537809bcbceSSrinivas Kandagatla { CDC_WSA_RX1_RX_PATH_SEC1, 0x08}, 538809bcbceSSrinivas Kandagatla { CDC_WSA_RX1_RX_PATH_SEC2, 0x00}, 539809bcbceSSrinivas Kandagatla { CDC_WSA_RX1_RX_PATH_SEC3, 0x00}, 540809bcbceSSrinivas Kandagatla { CDC_WSA_RX1_RX_PATH_SEC5, 0x00}, 541809bcbceSSrinivas Kandagatla { CDC_WSA_RX1_RX_PATH_SEC6, 0x00}, 542809bcbceSSrinivas Kandagatla { CDC_WSA_RX1_RX_PATH_SEC7, 0x00}, 543809bcbceSSrinivas Kandagatla { CDC_WSA_RX1_RX_PATH_MIX_SEC0, 0x08}, 544809bcbceSSrinivas Kandagatla { CDC_WSA_RX1_RX_PATH_MIX_SEC1, 0x00}, 545809bcbceSSrinivas Kandagatla { CDC_WSA_RX1_RX_PATH_DSMDEM_CTL, 0x00}, 546809bcbceSSrinivas Kandagatla { CDC_WSA_BOOST0_BOOST_PATH_CTL, 0x00}, 547809bcbceSSrinivas Kandagatla { CDC_WSA_BOOST0_BOOST_CTL, 0xD0}, 548809bcbceSSrinivas Kandagatla { CDC_WSA_BOOST0_BOOST_CFG1, 0x89}, 549809bcbceSSrinivas Kandagatla { CDC_WSA_BOOST0_BOOST_CFG2, 0x04}, 550809bcbceSSrinivas Kandagatla { CDC_WSA_BOOST1_BOOST_PATH_CTL, 0x00}, 551809bcbceSSrinivas Kandagatla { CDC_WSA_BOOST1_BOOST_CTL, 0xD0}, 552809bcbceSSrinivas Kandagatla { CDC_WSA_BOOST1_BOOST_CFG1, 0x89}, 553809bcbceSSrinivas Kandagatla { CDC_WSA_BOOST1_BOOST_CFG2, 0x04}, 554809bcbceSSrinivas Kandagatla { CDC_WSA_COMPANDER0_CTL0, 0x60}, 555809bcbceSSrinivas Kandagatla { CDC_WSA_COMPANDER0_CTL1, 0xDB}, 556809bcbceSSrinivas Kandagatla { CDC_WSA_COMPANDER0_CTL2, 0xFF}, 557809bcbceSSrinivas Kandagatla { CDC_WSA_COMPANDER0_CTL3, 0x35}, 558809bcbceSSrinivas Kandagatla { CDC_WSA_COMPANDER0_CTL4, 0xFF}, 559809bcbceSSrinivas Kandagatla { CDC_WSA_COMPANDER0_CTL5, 0x00}, 560809bcbceSSrinivas Kandagatla { CDC_WSA_COMPANDER0_CTL6, 0x01}, 561809bcbceSSrinivas Kandagatla { CDC_WSA_COMPANDER0_CTL7, 0x28}, 562809bcbceSSrinivas Kandagatla { CDC_WSA_COMPANDER1_CTL0, 0x60}, 563809bcbceSSrinivas Kandagatla { CDC_WSA_COMPANDER1_CTL1, 0xDB}, 564809bcbceSSrinivas Kandagatla { CDC_WSA_COMPANDER1_CTL2, 0xFF}, 565809bcbceSSrinivas Kandagatla { CDC_WSA_COMPANDER1_CTL3, 0x35}, 566809bcbceSSrinivas Kandagatla { CDC_WSA_COMPANDER1_CTL4, 0xFF}, 567809bcbceSSrinivas Kandagatla { CDC_WSA_COMPANDER1_CTL5, 0x00}, 568809bcbceSSrinivas Kandagatla { CDC_WSA_COMPANDER1_CTL6, 0x01}, 569809bcbceSSrinivas Kandagatla { CDC_WSA_COMPANDER1_CTL7, 0x28}, 570809bcbceSSrinivas Kandagatla { CDC_WSA_SOFTCLIP0_CRC, 0x00}, 571809bcbceSSrinivas Kandagatla { CDC_WSA_SOFTCLIP0_SOFTCLIP_CTRL, 0x38}, 572809bcbceSSrinivas Kandagatla { CDC_WSA_SOFTCLIP1_CRC, 0x00}, 573809bcbceSSrinivas Kandagatla { CDC_WSA_SOFTCLIP1_SOFTCLIP_CTRL, 0x38}, 574809bcbceSSrinivas Kandagatla { CDC_WSA_EC_HQ0_EC_REF_HQ_PATH_CTL, 0x00}, 575809bcbceSSrinivas Kandagatla { CDC_WSA_EC_HQ0_EC_REF_HQ_CFG0, 0x01}, 576809bcbceSSrinivas Kandagatla { CDC_WSA_EC_HQ1_EC_REF_HQ_PATH_CTL, 0x00}, 577809bcbceSSrinivas Kandagatla { CDC_WSA_EC_HQ1_EC_REF_HQ_CFG0, 0x01}, 578809bcbceSSrinivas Kandagatla { CDC_WSA_SPLINE_ASRC0_CLK_RST_CTL, 0x00}, 579809bcbceSSrinivas Kandagatla { CDC_WSA_SPLINE_ASRC0_CTL0, 0x00}, 580809bcbceSSrinivas Kandagatla { CDC_WSA_SPLINE_ASRC0_CTL1, 0x00}, 581809bcbceSSrinivas Kandagatla { CDC_WSA_SPLINE_ASRC0_FIFO_CTL, 0xA8}, 582809bcbceSSrinivas Kandagatla { CDC_WSA_SPLINE_ASRC0_STATUS_FMIN_CNTR_LSB, 0x00}, 583809bcbceSSrinivas Kandagatla { CDC_WSA_SPLINE_ASRC0_STATUS_FMIN_CNTR_MSB, 0x00}, 584809bcbceSSrinivas Kandagatla { CDC_WSA_SPLINE_ASRC0_STATUS_FMAX_CNTR_LSB, 0x00}, 585809bcbceSSrinivas Kandagatla { CDC_WSA_SPLINE_ASRC0_STATUS_FMAX_CNTR_MSB, 0x00}, 586809bcbceSSrinivas Kandagatla { CDC_WSA_SPLINE_ASRC0_STATUS_FIFO, 0x00}, 587809bcbceSSrinivas Kandagatla { CDC_WSA_SPLINE_ASRC1_CLK_RST_CTL, 0x00}, 588809bcbceSSrinivas Kandagatla { CDC_WSA_SPLINE_ASRC1_CTL0, 0x00}, 589809bcbceSSrinivas Kandagatla { CDC_WSA_SPLINE_ASRC1_CTL1, 0x00}, 590809bcbceSSrinivas Kandagatla { CDC_WSA_SPLINE_ASRC1_FIFO_CTL, 0xA8}, 591809bcbceSSrinivas Kandagatla { CDC_WSA_SPLINE_ASRC1_STATUS_FMIN_CNTR_LSB, 0x00}, 592809bcbceSSrinivas Kandagatla { CDC_WSA_SPLINE_ASRC1_STATUS_FMIN_CNTR_MSB, 0x00}, 593809bcbceSSrinivas Kandagatla { CDC_WSA_SPLINE_ASRC1_STATUS_FMAX_CNTR_LSB, 0x00}, 594809bcbceSSrinivas Kandagatla { CDC_WSA_SPLINE_ASRC1_STATUS_FMAX_CNTR_MSB, 0x00}, 595809bcbceSSrinivas Kandagatla { CDC_WSA_SPLINE_ASRC1_STATUS_FIFO, 0x00}, 596809bcbceSSrinivas Kandagatla }; 597809bcbceSSrinivas Kandagatla 598809bcbceSSrinivas Kandagatla static bool wsa_is_wronly_register(struct device *dev, 599809bcbceSSrinivas Kandagatla unsigned int reg) 600809bcbceSSrinivas Kandagatla { 601809bcbceSSrinivas Kandagatla switch (reg) { 602809bcbceSSrinivas Kandagatla case CDC_WSA_INTR_CTRL_CLR_COMMIT: 603809bcbceSSrinivas Kandagatla case CDC_WSA_INTR_CTRL_PIN1_CLEAR0: 604809bcbceSSrinivas Kandagatla case CDC_WSA_INTR_CTRL_PIN2_CLEAR0: 605809bcbceSSrinivas Kandagatla return true; 606809bcbceSSrinivas Kandagatla } 607809bcbceSSrinivas Kandagatla 608809bcbceSSrinivas Kandagatla return false; 609809bcbceSSrinivas Kandagatla } 610809bcbceSSrinivas Kandagatla 611809bcbceSSrinivas Kandagatla static bool wsa_is_rw_register(struct device *dev, unsigned int reg) 612809bcbceSSrinivas Kandagatla { 613809bcbceSSrinivas Kandagatla switch (reg) { 614809bcbceSSrinivas Kandagatla case CDC_WSA_CLK_RST_CTRL_MCLK_CONTROL: 615809bcbceSSrinivas Kandagatla case CDC_WSA_CLK_RST_CTRL_FS_CNT_CONTROL: 616809bcbceSSrinivas Kandagatla case CDC_WSA_CLK_RST_CTRL_SWR_CONTROL: 617809bcbceSSrinivas Kandagatla case CDC_WSA_TOP_TOP_CFG0: 618809bcbceSSrinivas Kandagatla case CDC_WSA_TOP_TOP_CFG1: 619809bcbceSSrinivas Kandagatla case CDC_WSA_TOP_FREQ_MCLK: 620809bcbceSSrinivas Kandagatla case CDC_WSA_TOP_DEBUG_BUS_SEL: 621809bcbceSSrinivas Kandagatla case CDC_WSA_TOP_DEBUG_EN0: 622809bcbceSSrinivas Kandagatla case CDC_WSA_TOP_DEBUG_EN1: 623809bcbceSSrinivas Kandagatla case CDC_WSA_TOP_DEBUG_DSM_LB: 624809bcbceSSrinivas Kandagatla case CDC_WSA_TOP_RX_I2S_CTL: 625809bcbceSSrinivas Kandagatla case CDC_WSA_TOP_TX_I2S_CTL: 626809bcbceSSrinivas Kandagatla case CDC_WSA_TOP_I2S_CLK: 627809bcbceSSrinivas Kandagatla case CDC_WSA_TOP_I2S_RESET: 628809bcbceSSrinivas Kandagatla case CDC_WSA_RX_INP_MUX_RX_INT0_CFG0: 629809bcbceSSrinivas Kandagatla case CDC_WSA_RX_INP_MUX_RX_INT0_CFG1: 630809bcbceSSrinivas Kandagatla case CDC_WSA_RX_INP_MUX_RX_INT1_CFG0: 631809bcbceSSrinivas Kandagatla case CDC_WSA_RX_INP_MUX_RX_INT1_CFG1: 632809bcbceSSrinivas Kandagatla case CDC_WSA_RX_INP_MUX_RX_MIX_CFG0: 633809bcbceSSrinivas Kandagatla case CDC_WSA_RX_INP_MUX_RX_EC_CFG0: 634809bcbceSSrinivas Kandagatla case CDC_WSA_RX_INP_MUX_SOFTCLIP_CFG0: 635809bcbceSSrinivas Kandagatla case CDC_WSA_TX0_SPKR_PROT_PATH_CTL: 636809bcbceSSrinivas Kandagatla case CDC_WSA_TX0_SPKR_PROT_PATH_CFG0: 637809bcbceSSrinivas Kandagatla case CDC_WSA_TX1_SPKR_PROT_PATH_CTL: 638809bcbceSSrinivas Kandagatla case CDC_WSA_TX1_SPKR_PROT_PATH_CFG0: 639809bcbceSSrinivas Kandagatla case CDC_WSA_TX2_SPKR_PROT_PATH_CTL: 640809bcbceSSrinivas Kandagatla case CDC_WSA_TX2_SPKR_PROT_PATH_CFG0: 641809bcbceSSrinivas Kandagatla case CDC_WSA_TX3_SPKR_PROT_PATH_CTL: 642809bcbceSSrinivas Kandagatla case CDC_WSA_TX3_SPKR_PROT_PATH_CFG0: 643809bcbceSSrinivas Kandagatla case CDC_WSA_INTR_CTRL_CFG: 644809bcbceSSrinivas Kandagatla case CDC_WSA_INTR_CTRL_PIN1_MASK0: 645809bcbceSSrinivas Kandagatla case CDC_WSA_INTR_CTRL_PIN2_MASK0: 646809bcbceSSrinivas Kandagatla case CDC_WSA_INTR_CTRL_LEVEL0: 647809bcbceSSrinivas Kandagatla case CDC_WSA_INTR_CTRL_BYPASS0: 648809bcbceSSrinivas Kandagatla case CDC_WSA_INTR_CTRL_SET0: 649809bcbceSSrinivas Kandagatla case CDC_WSA_RX0_RX_PATH_CTL: 650809bcbceSSrinivas Kandagatla case CDC_WSA_RX0_RX_PATH_CFG0: 651809bcbceSSrinivas Kandagatla case CDC_WSA_RX0_RX_PATH_CFG1: 652809bcbceSSrinivas Kandagatla case CDC_WSA_RX0_RX_PATH_CFG2: 653809bcbceSSrinivas Kandagatla case CDC_WSA_RX0_RX_PATH_CFG3: 654809bcbceSSrinivas Kandagatla case CDC_WSA_RX0_RX_VOL_CTL: 655809bcbceSSrinivas Kandagatla case CDC_WSA_RX0_RX_PATH_MIX_CTL: 656809bcbceSSrinivas Kandagatla case CDC_WSA_RX0_RX_PATH_MIX_CFG: 657809bcbceSSrinivas Kandagatla case CDC_WSA_RX0_RX_VOL_MIX_CTL: 658809bcbceSSrinivas Kandagatla case CDC_WSA_RX0_RX_PATH_SEC0: 659809bcbceSSrinivas Kandagatla case CDC_WSA_RX0_RX_PATH_SEC1: 660809bcbceSSrinivas Kandagatla case CDC_WSA_RX0_RX_PATH_SEC2: 661809bcbceSSrinivas Kandagatla case CDC_WSA_RX0_RX_PATH_SEC3: 662809bcbceSSrinivas Kandagatla case CDC_WSA_RX0_RX_PATH_SEC5: 663809bcbceSSrinivas Kandagatla case CDC_WSA_RX0_RX_PATH_SEC6: 664809bcbceSSrinivas Kandagatla case CDC_WSA_RX0_RX_PATH_SEC7: 665809bcbceSSrinivas Kandagatla case CDC_WSA_RX0_RX_PATH_MIX_SEC0: 666809bcbceSSrinivas Kandagatla case CDC_WSA_RX0_RX_PATH_MIX_SEC1: 667809bcbceSSrinivas Kandagatla case CDC_WSA_RX0_RX_PATH_DSMDEM_CTL: 668809bcbceSSrinivas Kandagatla case CDC_WSA_RX1_RX_PATH_CTL: 669809bcbceSSrinivas Kandagatla case CDC_WSA_RX1_RX_PATH_CFG0: 670809bcbceSSrinivas Kandagatla case CDC_WSA_RX1_RX_PATH_CFG1: 671809bcbceSSrinivas Kandagatla case CDC_WSA_RX1_RX_PATH_CFG2: 672809bcbceSSrinivas Kandagatla case CDC_WSA_RX1_RX_PATH_CFG3: 673809bcbceSSrinivas Kandagatla case CDC_WSA_RX1_RX_VOL_CTL: 674809bcbceSSrinivas Kandagatla case CDC_WSA_RX1_RX_PATH_MIX_CTL: 675809bcbceSSrinivas Kandagatla case CDC_WSA_RX1_RX_PATH_MIX_CFG: 676809bcbceSSrinivas Kandagatla case CDC_WSA_RX1_RX_VOL_MIX_CTL: 677809bcbceSSrinivas Kandagatla case CDC_WSA_RX1_RX_PATH_SEC0: 678809bcbceSSrinivas Kandagatla case CDC_WSA_RX1_RX_PATH_SEC1: 679809bcbceSSrinivas Kandagatla case CDC_WSA_RX1_RX_PATH_SEC2: 680809bcbceSSrinivas Kandagatla case CDC_WSA_RX1_RX_PATH_SEC3: 681809bcbceSSrinivas Kandagatla case CDC_WSA_RX1_RX_PATH_SEC5: 682809bcbceSSrinivas Kandagatla case CDC_WSA_RX1_RX_PATH_SEC6: 683809bcbceSSrinivas Kandagatla case CDC_WSA_RX1_RX_PATH_SEC7: 684809bcbceSSrinivas Kandagatla case CDC_WSA_RX1_RX_PATH_MIX_SEC0: 685809bcbceSSrinivas Kandagatla case CDC_WSA_RX1_RX_PATH_MIX_SEC1: 686809bcbceSSrinivas Kandagatla case CDC_WSA_RX1_RX_PATH_DSMDEM_CTL: 687809bcbceSSrinivas Kandagatla case CDC_WSA_BOOST0_BOOST_PATH_CTL: 688809bcbceSSrinivas Kandagatla case CDC_WSA_BOOST0_BOOST_CTL: 689809bcbceSSrinivas Kandagatla case CDC_WSA_BOOST0_BOOST_CFG1: 690809bcbceSSrinivas Kandagatla case CDC_WSA_BOOST0_BOOST_CFG2: 691809bcbceSSrinivas Kandagatla case CDC_WSA_BOOST1_BOOST_PATH_CTL: 692809bcbceSSrinivas Kandagatla case CDC_WSA_BOOST1_BOOST_CTL: 693809bcbceSSrinivas Kandagatla case CDC_WSA_BOOST1_BOOST_CFG1: 694809bcbceSSrinivas Kandagatla case CDC_WSA_BOOST1_BOOST_CFG2: 695809bcbceSSrinivas Kandagatla case CDC_WSA_COMPANDER0_CTL0: 696809bcbceSSrinivas Kandagatla case CDC_WSA_COMPANDER0_CTL1: 697809bcbceSSrinivas Kandagatla case CDC_WSA_COMPANDER0_CTL2: 698809bcbceSSrinivas Kandagatla case CDC_WSA_COMPANDER0_CTL3: 699809bcbceSSrinivas Kandagatla case CDC_WSA_COMPANDER0_CTL4: 700809bcbceSSrinivas Kandagatla case CDC_WSA_COMPANDER0_CTL5: 701809bcbceSSrinivas Kandagatla case CDC_WSA_COMPANDER0_CTL7: 702809bcbceSSrinivas Kandagatla case CDC_WSA_COMPANDER1_CTL0: 703809bcbceSSrinivas Kandagatla case CDC_WSA_COMPANDER1_CTL1: 704809bcbceSSrinivas Kandagatla case CDC_WSA_COMPANDER1_CTL2: 705809bcbceSSrinivas Kandagatla case CDC_WSA_COMPANDER1_CTL3: 706809bcbceSSrinivas Kandagatla case CDC_WSA_COMPANDER1_CTL4: 707809bcbceSSrinivas Kandagatla case CDC_WSA_COMPANDER1_CTL5: 708809bcbceSSrinivas Kandagatla case CDC_WSA_COMPANDER1_CTL7: 709809bcbceSSrinivas Kandagatla case CDC_WSA_SOFTCLIP0_CRC: 710809bcbceSSrinivas Kandagatla case CDC_WSA_SOFTCLIP0_SOFTCLIP_CTRL: 711809bcbceSSrinivas Kandagatla case CDC_WSA_SOFTCLIP1_CRC: 712809bcbceSSrinivas Kandagatla case CDC_WSA_SOFTCLIP1_SOFTCLIP_CTRL: 713809bcbceSSrinivas Kandagatla case CDC_WSA_EC_HQ0_EC_REF_HQ_PATH_CTL: 714809bcbceSSrinivas Kandagatla case CDC_WSA_EC_HQ0_EC_REF_HQ_CFG0: 715809bcbceSSrinivas Kandagatla case CDC_WSA_EC_HQ1_EC_REF_HQ_PATH_CTL: 716809bcbceSSrinivas Kandagatla case CDC_WSA_EC_HQ1_EC_REF_HQ_CFG0: 717809bcbceSSrinivas Kandagatla case CDC_WSA_SPLINE_ASRC0_CLK_RST_CTL: 718809bcbceSSrinivas Kandagatla case CDC_WSA_SPLINE_ASRC0_CTL0: 719809bcbceSSrinivas Kandagatla case CDC_WSA_SPLINE_ASRC0_CTL1: 720809bcbceSSrinivas Kandagatla case CDC_WSA_SPLINE_ASRC0_FIFO_CTL: 721809bcbceSSrinivas Kandagatla case CDC_WSA_SPLINE_ASRC1_CLK_RST_CTL: 722809bcbceSSrinivas Kandagatla case CDC_WSA_SPLINE_ASRC1_CTL0: 723809bcbceSSrinivas Kandagatla case CDC_WSA_SPLINE_ASRC1_CTL1: 724809bcbceSSrinivas Kandagatla case CDC_WSA_SPLINE_ASRC1_FIFO_CTL: 725809bcbceSSrinivas Kandagatla return true; 726809bcbceSSrinivas Kandagatla } 727809bcbceSSrinivas Kandagatla 728809bcbceSSrinivas Kandagatla return false; 729809bcbceSSrinivas Kandagatla } 730809bcbceSSrinivas Kandagatla 731809bcbceSSrinivas Kandagatla static bool wsa_is_writeable_register(struct device *dev, unsigned int reg) 732809bcbceSSrinivas Kandagatla { 733809bcbceSSrinivas Kandagatla bool ret; 734809bcbceSSrinivas Kandagatla 735809bcbceSSrinivas Kandagatla ret = wsa_is_rw_register(dev, reg); 736809bcbceSSrinivas Kandagatla if (!ret) 737809bcbceSSrinivas Kandagatla return wsa_is_wronly_register(dev, reg); 738809bcbceSSrinivas Kandagatla 739809bcbceSSrinivas Kandagatla return ret; 740809bcbceSSrinivas Kandagatla } 741809bcbceSSrinivas Kandagatla 742809bcbceSSrinivas Kandagatla static bool wsa_is_readable_register(struct device *dev, unsigned int reg) 743809bcbceSSrinivas Kandagatla { 744809bcbceSSrinivas Kandagatla switch (reg) { 745809bcbceSSrinivas Kandagatla case CDC_WSA_INTR_CTRL_CLR_COMMIT: 746809bcbceSSrinivas Kandagatla case CDC_WSA_INTR_CTRL_PIN1_CLEAR0: 747809bcbceSSrinivas Kandagatla case CDC_WSA_INTR_CTRL_PIN2_CLEAR0: 748809bcbceSSrinivas Kandagatla case CDC_WSA_INTR_CTRL_PIN1_STATUS0: 749809bcbceSSrinivas Kandagatla case CDC_WSA_INTR_CTRL_PIN2_STATUS0: 750809bcbceSSrinivas Kandagatla case CDC_WSA_COMPANDER0_CTL6: 751809bcbceSSrinivas Kandagatla case CDC_WSA_COMPANDER1_CTL6: 752809bcbceSSrinivas Kandagatla case CDC_WSA_SPLINE_ASRC0_STATUS_FMIN_CNTR_LSB: 753809bcbceSSrinivas Kandagatla case CDC_WSA_SPLINE_ASRC0_STATUS_FMIN_CNTR_MSB: 754809bcbceSSrinivas Kandagatla case CDC_WSA_SPLINE_ASRC0_STATUS_FMAX_CNTR_LSB: 755809bcbceSSrinivas Kandagatla case CDC_WSA_SPLINE_ASRC0_STATUS_FMAX_CNTR_MSB: 756809bcbceSSrinivas Kandagatla case CDC_WSA_SPLINE_ASRC0_STATUS_FIFO: 757809bcbceSSrinivas Kandagatla case CDC_WSA_SPLINE_ASRC1_STATUS_FMIN_CNTR_LSB: 758809bcbceSSrinivas Kandagatla case CDC_WSA_SPLINE_ASRC1_STATUS_FMIN_CNTR_MSB: 759809bcbceSSrinivas Kandagatla case CDC_WSA_SPLINE_ASRC1_STATUS_FMAX_CNTR_LSB: 760809bcbceSSrinivas Kandagatla case CDC_WSA_SPLINE_ASRC1_STATUS_FMAX_CNTR_MSB: 761809bcbceSSrinivas Kandagatla case CDC_WSA_SPLINE_ASRC1_STATUS_FIFO: 762809bcbceSSrinivas Kandagatla return true; 763809bcbceSSrinivas Kandagatla } 764809bcbceSSrinivas Kandagatla 765809bcbceSSrinivas Kandagatla return wsa_is_rw_register(dev, reg); 766809bcbceSSrinivas Kandagatla } 767809bcbceSSrinivas Kandagatla 768809bcbceSSrinivas Kandagatla static bool wsa_is_volatile_register(struct device *dev, unsigned int reg) 769809bcbceSSrinivas Kandagatla { 770809bcbceSSrinivas Kandagatla /* Update volatile list for rx/tx macros */ 771809bcbceSSrinivas Kandagatla switch (reg) { 772809bcbceSSrinivas Kandagatla case CDC_WSA_INTR_CTRL_PIN1_STATUS0: 773809bcbceSSrinivas Kandagatla case CDC_WSA_INTR_CTRL_PIN2_STATUS0: 774809bcbceSSrinivas Kandagatla case CDC_WSA_COMPANDER0_CTL6: 775809bcbceSSrinivas Kandagatla case CDC_WSA_COMPANDER1_CTL6: 776809bcbceSSrinivas Kandagatla case CDC_WSA_SPLINE_ASRC0_STATUS_FMIN_CNTR_LSB: 777809bcbceSSrinivas Kandagatla case CDC_WSA_SPLINE_ASRC0_STATUS_FMIN_CNTR_MSB: 778809bcbceSSrinivas Kandagatla case CDC_WSA_SPLINE_ASRC0_STATUS_FMAX_CNTR_LSB: 779809bcbceSSrinivas Kandagatla case CDC_WSA_SPLINE_ASRC0_STATUS_FMAX_CNTR_MSB: 780809bcbceSSrinivas Kandagatla case CDC_WSA_SPLINE_ASRC0_STATUS_FIFO: 781809bcbceSSrinivas Kandagatla case CDC_WSA_SPLINE_ASRC1_STATUS_FMIN_CNTR_LSB: 782809bcbceSSrinivas Kandagatla case CDC_WSA_SPLINE_ASRC1_STATUS_FMIN_CNTR_MSB: 783809bcbceSSrinivas Kandagatla case CDC_WSA_SPLINE_ASRC1_STATUS_FMAX_CNTR_LSB: 784809bcbceSSrinivas Kandagatla case CDC_WSA_SPLINE_ASRC1_STATUS_FMAX_CNTR_MSB: 785809bcbceSSrinivas Kandagatla case CDC_WSA_SPLINE_ASRC1_STATUS_FIFO: 786809bcbceSSrinivas Kandagatla return true; 787809bcbceSSrinivas Kandagatla } 788809bcbceSSrinivas Kandagatla return false; 789809bcbceSSrinivas Kandagatla } 790809bcbceSSrinivas Kandagatla 791809bcbceSSrinivas Kandagatla static const struct regmap_config wsa_regmap_config = { 792809bcbceSSrinivas Kandagatla .name = "wsa_macro", 793809bcbceSSrinivas Kandagatla .reg_bits = 16, 794809bcbceSSrinivas Kandagatla .val_bits = 32, /* 8 but with 32 bit read/write */ 795809bcbceSSrinivas Kandagatla .reg_stride = 4, 796809bcbceSSrinivas Kandagatla .cache_type = REGCACHE_FLAT, 797809bcbceSSrinivas Kandagatla .reg_defaults = wsa_defaults, 798809bcbceSSrinivas Kandagatla .num_reg_defaults = ARRAY_SIZE(wsa_defaults), 799809bcbceSSrinivas Kandagatla .max_register = WSA_MAX_OFFSET, 800809bcbceSSrinivas Kandagatla .writeable_reg = wsa_is_writeable_register, 801809bcbceSSrinivas Kandagatla .volatile_reg = wsa_is_volatile_register, 802809bcbceSSrinivas Kandagatla .readable_reg = wsa_is_readable_register, 803809bcbceSSrinivas Kandagatla }; 804809bcbceSSrinivas Kandagatla 805809bcbceSSrinivas Kandagatla /** 806809bcbceSSrinivas Kandagatla * wsa_macro_set_spkr_mode - Configures speaker compander and smartboost 807809bcbceSSrinivas Kandagatla * settings based on speaker mode. 808809bcbceSSrinivas Kandagatla * 809809bcbceSSrinivas Kandagatla * @component: codec instance 810809bcbceSSrinivas Kandagatla * @mode: Indicates speaker configuration mode. 811809bcbceSSrinivas Kandagatla * 812809bcbceSSrinivas Kandagatla * Returns 0 on success or -EINVAL on error. 813809bcbceSSrinivas Kandagatla */ 814809bcbceSSrinivas Kandagatla int wsa_macro_set_spkr_mode(struct snd_soc_component *component, int mode) 815809bcbceSSrinivas Kandagatla { 816809bcbceSSrinivas Kandagatla struct wsa_macro *wsa = snd_soc_component_get_drvdata(component); 817809bcbceSSrinivas Kandagatla 818809bcbceSSrinivas Kandagatla wsa->spkr_mode = mode; 819809bcbceSSrinivas Kandagatla 820809bcbceSSrinivas Kandagatla switch (mode) { 821809bcbceSSrinivas Kandagatla case WSA_MACRO_SPKR_MODE_1: 822809bcbceSSrinivas Kandagatla snd_soc_component_update_bits(component, CDC_WSA_COMPANDER0_CTL3, 0x80, 0x00); 823809bcbceSSrinivas Kandagatla snd_soc_component_update_bits(component, CDC_WSA_COMPANDER1_CTL3, 0x80, 0x00); 824809bcbceSSrinivas Kandagatla snd_soc_component_update_bits(component, CDC_WSA_COMPANDER0_CTL7, 0x01, 0x00); 825809bcbceSSrinivas Kandagatla snd_soc_component_update_bits(component, CDC_WSA_COMPANDER1_CTL7, 0x01, 0x00); 826809bcbceSSrinivas Kandagatla snd_soc_component_update_bits(component, CDC_WSA_BOOST0_BOOST_CTL, 0x7C, 0x44); 827809bcbceSSrinivas Kandagatla snd_soc_component_update_bits(component, CDC_WSA_BOOST1_BOOST_CTL, 0x7C, 0x44); 828809bcbceSSrinivas Kandagatla break; 829809bcbceSSrinivas Kandagatla default: 830809bcbceSSrinivas Kandagatla snd_soc_component_update_bits(component, CDC_WSA_COMPANDER0_CTL3, 0x80, 0x80); 831809bcbceSSrinivas Kandagatla snd_soc_component_update_bits(component, CDC_WSA_COMPANDER1_CTL3, 0x80, 0x80); 832809bcbceSSrinivas Kandagatla snd_soc_component_update_bits(component, CDC_WSA_COMPANDER0_CTL7, 0x01, 0x01); 833809bcbceSSrinivas Kandagatla snd_soc_component_update_bits(component, CDC_WSA_COMPANDER1_CTL7, 0x01, 0x01); 834809bcbceSSrinivas Kandagatla snd_soc_component_update_bits(component, CDC_WSA_BOOST0_BOOST_CTL, 0x7C, 0x58); 835809bcbceSSrinivas Kandagatla snd_soc_component_update_bits(component, CDC_WSA_BOOST1_BOOST_CTL, 0x7C, 0x58); 836809bcbceSSrinivas Kandagatla break; 837809bcbceSSrinivas Kandagatla } 838809bcbceSSrinivas Kandagatla return 0; 839809bcbceSSrinivas Kandagatla } 840809bcbceSSrinivas Kandagatla EXPORT_SYMBOL(wsa_macro_set_spkr_mode); 841809bcbceSSrinivas Kandagatla 842809bcbceSSrinivas Kandagatla static int wsa_macro_set_prim_interpolator_rate(struct snd_soc_dai *dai, 843809bcbceSSrinivas Kandagatla u8 int_prim_fs_rate_reg_val, 844809bcbceSSrinivas Kandagatla u32 sample_rate) 845809bcbceSSrinivas Kandagatla { 846809bcbceSSrinivas Kandagatla u8 int_1_mix1_inp; 847809bcbceSSrinivas Kandagatla u32 j, port; 848809bcbceSSrinivas Kandagatla u16 int_mux_cfg0, int_mux_cfg1; 849809bcbceSSrinivas Kandagatla u16 int_fs_reg; 850809bcbceSSrinivas Kandagatla u8 inp0_sel, inp1_sel, inp2_sel; 851809bcbceSSrinivas Kandagatla struct snd_soc_component *component = dai->component; 852809bcbceSSrinivas Kandagatla struct wsa_macro *wsa = snd_soc_component_get_drvdata(component); 853809bcbceSSrinivas Kandagatla 854809bcbceSSrinivas Kandagatla for_each_set_bit(port, &wsa->active_ch_mask[dai->id], WSA_MACRO_RX_MAX) { 855809bcbceSSrinivas Kandagatla int_1_mix1_inp = port; 856809bcbceSSrinivas Kandagatla if ((int_1_mix1_inp < WSA_MACRO_RX0) || (int_1_mix1_inp > WSA_MACRO_RX_MIX1)) { 857809bcbceSSrinivas Kandagatla dev_err(component->dev, "%s: Invalid RX port, Dai ID is %d\n", 858809bcbceSSrinivas Kandagatla __func__, dai->id); 859809bcbceSSrinivas Kandagatla return -EINVAL; 860809bcbceSSrinivas Kandagatla } 861809bcbceSSrinivas Kandagatla 862809bcbceSSrinivas Kandagatla int_mux_cfg0 = CDC_WSA_RX_INP_MUX_RX_INT0_CFG0; 863809bcbceSSrinivas Kandagatla 864809bcbceSSrinivas Kandagatla /* 865809bcbceSSrinivas Kandagatla * Loop through all interpolator MUX inputs and find out 866809bcbceSSrinivas Kandagatla * to which interpolator input, the cdc_dma rx port 867809bcbceSSrinivas Kandagatla * is connected 868809bcbceSSrinivas Kandagatla */ 869809bcbceSSrinivas Kandagatla for (j = 0; j < NUM_INTERPOLATORS; j++) { 870809bcbceSSrinivas Kandagatla int_mux_cfg1 = int_mux_cfg0 + WSA_MACRO_MUX_CFG1_OFFSET; 8717db4c4cdSSrinivas Kandagatla inp0_sel = snd_soc_component_read_field(component, int_mux_cfg0, 8727db4c4cdSSrinivas Kandagatla CDC_WSA_RX_INTX_1_MIX_INP0_SEL_MASK); 8737db4c4cdSSrinivas Kandagatla inp1_sel = snd_soc_component_read_field(component, int_mux_cfg0, 8747db4c4cdSSrinivas Kandagatla CDC_WSA_RX_INTX_1_MIX_INP1_SEL_MASK); 8757db4c4cdSSrinivas Kandagatla inp2_sel = snd_soc_component_read_field(component, int_mux_cfg1, 8767db4c4cdSSrinivas Kandagatla CDC_WSA_RX_INTX_1_MIX_INP2_SEL_MASK); 8777db4c4cdSSrinivas Kandagatla 878809bcbceSSrinivas Kandagatla if ((inp0_sel == int_1_mix1_inp + INTn_1_INP_SEL_RX0) || 879809bcbceSSrinivas Kandagatla (inp1_sel == int_1_mix1_inp + INTn_1_INP_SEL_RX0) || 880809bcbceSSrinivas Kandagatla (inp2_sel == int_1_mix1_inp + INTn_1_INP_SEL_RX0)) { 881809bcbceSSrinivas Kandagatla int_fs_reg = CDC_WSA_RX0_RX_PATH_CTL + 882809bcbceSSrinivas Kandagatla WSA_MACRO_RX_PATH_OFFSET * j; 883809bcbceSSrinivas Kandagatla /* sample_rate is in Hz */ 884809bcbceSSrinivas Kandagatla snd_soc_component_update_bits(component, int_fs_reg, 885809bcbceSSrinivas Kandagatla WSA_MACRO_FS_RATE_MASK, 886809bcbceSSrinivas Kandagatla int_prim_fs_rate_reg_val); 887809bcbceSSrinivas Kandagatla } 888809bcbceSSrinivas Kandagatla int_mux_cfg0 += WSA_MACRO_MUX_CFG_OFFSET; 889809bcbceSSrinivas Kandagatla } 890809bcbceSSrinivas Kandagatla } 891809bcbceSSrinivas Kandagatla 892809bcbceSSrinivas Kandagatla return 0; 893809bcbceSSrinivas Kandagatla } 894809bcbceSSrinivas Kandagatla 895809bcbceSSrinivas Kandagatla static int wsa_macro_set_mix_interpolator_rate(struct snd_soc_dai *dai, 896809bcbceSSrinivas Kandagatla u8 int_mix_fs_rate_reg_val, 897809bcbceSSrinivas Kandagatla u32 sample_rate) 898809bcbceSSrinivas Kandagatla { 899809bcbceSSrinivas Kandagatla u8 int_2_inp; 900809bcbceSSrinivas Kandagatla u32 j, port; 901809bcbceSSrinivas Kandagatla u16 int_mux_cfg1, int_fs_reg; 902809bcbceSSrinivas Kandagatla u8 int_mux_cfg1_val; 903809bcbceSSrinivas Kandagatla struct snd_soc_component *component = dai->component; 904809bcbceSSrinivas Kandagatla struct wsa_macro *wsa = snd_soc_component_get_drvdata(component); 905809bcbceSSrinivas Kandagatla 906809bcbceSSrinivas Kandagatla for_each_set_bit(port, &wsa->active_ch_mask[dai->id], WSA_MACRO_RX_MAX) { 907809bcbceSSrinivas Kandagatla int_2_inp = port; 908809bcbceSSrinivas Kandagatla if ((int_2_inp < WSA_MACRO_RX0) || (int_2_inp > WSA_MACRO_RX_MIX1)) { 909809bcbceSSrinivas Kandagatla dev_err(component->dev, "%s: Invalid RX port, Dai ID is %d\n", 910809bcbceSSrinivas Kandagatla __func__, dai->id); 911809bcbceSSrinivas Kandagatla return -EINVAL; 912809bcbceSSrinivas Kandagatla } 913809bcbceSSrinivas Kandagatla 914809bcbceSSrinivas Kandagatla int_mux_cfg1 = CDC_WSA_RX_INP_MUX_RX_INT0_CFG1; 915809bcbceSSrinivas Kandagatla for (j = 0; j < NUM_INTERPOLATORS; j++) { 9167db4c4cdSSrinivas Kandagatla int_mux_cfg1_val = snd_soc_component_read_field(component, int_mux_cfg1, 9177db4c4cdSSrinivas Kandagatla CDC_WSA_RX_INTX_2_SEL_MASK); 9187db4c4cdSSrinivas Kandagatla 919809bcbceSSrinivas Kandagatla if (int_mux_cfg1_val == int_2_inp + INTn_2_INP_SEL_RX0) { 920809bcbceSSrinivas Kandagatla int_fs_reg = CDC_WSA_RX0_RX_PATH_MIX_CTL + 921809bcbceSSrinivas Kandagatla WSA_MACRO_RX_PATH_OFFSET * j; 922809bcbceSSrinivas Kandagatla 923809bcbceSSrinivas Kandagatla snd_soc_component_update_bits(component, 924809bcbceSSrinivas Kandagatla int_fs_reg, 925809bcbceSSrinivas Kandagatla WSA_MACRO_FS_RATE_MASK, 926809bcbceSSrinivas Kandagatla int_mix_fs_rate_reg_val); 927809bcbceSSrinivas Kandagatla } 928809bcbceSSrinivas Kandagatla int_mux_cfg1 += WSA_MACRO_MUX_CFG_OFFSET; 929809bcbceSSrinivas Kandagatla } 930809bcbceSSrinivas Kandagatla } 931809bcbceSSrinivas Kandagatla return 0; 932809bcbceSSrinivas Kandagatla } 933809bcbceSSrinivas Kandagatla 934809bcbceSSrinivas Kandagatla static int wsa_macro_set_interpolator_rate(struct snd_soc_dai *dai, 935809bcbceSSrinivas Kandagatla u32 sample_rate) 936809bcbceSSrinivas Kandagatla { 937809bcbceSSrinivas Kandagatla int rate_val = 0; 938809bcbceSSrinivas Kandagatla int i, ret; 939809bcbceSSrinivas Kandagatla 940809bcbceSSrinivas Kandagatla /* set mixing path rate */ 941809bcbceSSrinivas Kandagatla for (i = 0; i < ARRAY_SIZE(int_mix_sample_rate_val); i++) { 942809bcbceSSrinivas Kandagatla if (sample_rate == int_mix_sample_rate_val[i].sample_rate) { 943809bcbceSSrinivas Kandagatla rate_val = int_mix_sample_rate_val[i].rate_val; 944809bcbceSSrinivas Kandagatla break; 945809bcbceSSrinivas Kandagatla } 946809bcbceSSrinivas Kandagatla } 947809bcbceSSrinivas Kandagatla if ((i == ARRAY_SIZE(int_mix_sample_rate_val)) || (rate_val < 0)) 948809bcbceSSrinivas Kandagatla goto prim_rate; 949809bcbceSSrinivas Kandagatla 950809bcbceSSrinivas Kandagatla ret = wsa_macro_set_mix_interpolator_rate(dai, (u8) rate_val, sample_rate); 9514b4f2119SPierre-Louis Bossart if (ret < 0) 9524b4f2119SPierre-Louis Bossart return ret; 953809bcbceSSrinivas Kandagatla prim_rate: 954809bcbceSSrinivas Kandagatla /* set primary path sample rate */ 955809bcbceSSrinivas Kandagatla for (i = 0; i < ARRAY_SIZE(int_prim_sample_rate_val); i++) { 956809bcbceSSrinivas Kandagatla if (sample_rate == int_prim_sample_rate_val[i].sample_rate) { 957809bcbceSSrinivas Kandagatla rate_val = int_prim_sample_rate_val[i].rate_val; 958809bcbceSSrinivas Kandagatla break; 959809bcbceSSrinivas Kandagatla } 960809bcbceSSrinivas Kandagatla } 961809bcbceSSrinivas Kandagatla if ((i == ARRAY_SIZE(int_prim_sample_rate_val)) || (rate_val < 0)) 962809bcbceSSrinivas Kandagatla return -EINVAL; 963809bcbceSSrinivas Kandagatla 964809bcbceSSrinivas Kandagatla ret = wsa_macro_set_prim_interpolator_rate(dai, (u8) rate_val, sample_rate); 965809bcbceSSrinivas Kandagatla 966809bcbceSSrinivas Kandagatla return ret; 967809bcbceSSrinivas Kandagatla } 968809bcbceSSrinivas Kandagatla 969809bcbceSSrinivas Kandagatla static int wsa_macro_hw_params(struct snd_pcm_substream *substream, 970809bcbceSSrinivas Kandagatla struct snd_pcm_hw_params *params, 971809bcbceSSrinivas Kandagatla struct snd_soc_dai *dai) 972809bcbceSSrinivas Kandagatla { 973809bcbceSSrinivas Kandagatla struct snd_soc_component *component = dai->component; 974809bcbceSSrinivas Kandagatla int ret; 975809bcbceSSrinivas Kandagatla 976809bcbceSSrinivas Kandagatla switch (substream->stream) { 977809bcbceSSrinivas Kandagatla case SNDRV_PCM_STREAM_PLAYBACK: 978809bcbceSSrinivas Kandagatla ret = wsa_macro_set_interpolator_rate(dai, params_rate(params)); 979809bcbceSSrinivas Kandagatla if (ret) { 980809bcbceSSrinivas Kandagatla dev_err(component->dev, 981809bcbceSSrinivas Kandagatla "%s: cannot set sample rate: %u\n", 982809bcbceSSrinivas Kandagatla __func__, params_rate(params)); 983809bcbceSSrinivas Kandagatla return ret; 984809bcbceSSrinivas Kandagatla } 985809bcbceSSrinivas Kandagatla break; 986809bcbceSSrinivas Kandagatla default: 987809bcbceSSrinivas Kandagatla break; 988809bcbceSSrinivas Kandagatla } 989809bcbceSSrinivas Kandagatla return 0; 990809bcbceSSrinivas Kandagatla } 991809bcbceSSrinivas Kandagatla 992809bcbceSSrinivas Kandagatla static int wsa_macro_get_channel_map(struct snd_soc_dai *dai, 993809bcbceSSrinivas Kandagatla unsigned int *tx_num, unsigned int *tx_slot, 994809bcbceSSrinivas Kandagatla unsigned int *rx_num, unsigned int *rx_slot) 995809bcbceSSrinivas Kandagatla { 996809bcbceSSrinivas Kandagatla struct snd_soc_component *component = dai->component; 997809bcbceSSrinivas Kandagatla struct wsa_macro *wsa = snd_soc_component_get_drvdata(component); 998809bcbceSSrinivas Kandagatla u16 val, mask = 0, cnt = 0, temp; 999809bcbceSSrinivas Kandagatla 1000809bcbceSSrinivas Kandagatla switch (dai->id) { 1001809bcbceSSrinivas Kandagatla case WSA_MACRO_AIF_VI: 1002809bcbceSSrinivas Kandagatla *tx_slot = wsa->active_ch_mask[dai->id]; 1003809bcbceSSrinivas Kandagatla *tx_num = wsa->active_ch_cnt[dai->id]; 1004809bcbceSSrinivas Kandagatla break; 1005809bcbceSSrinivas Kandagatla case WSA_MACRO_AIF1_PB: 1006809bcbceSSrinivas Kandagatla case WSA_MACRO_AIF_MIX1_PB: 1007809bcbceSSrinivas Kandagatla for_each_set_bit(temp, &wsa->active_ch_mask[dai->id], 1008809bcbceSSrinivas Kandagatla WSA_MACRO_RX_MAX) { 1009809bcbceSSrinivas Kandagatla mask |= (1 << temp); 1010809bcbceSSrinivas Kandagatla if (++cnt == WSA_MACRO_MAX_DMA_CH_PER_PORT) 1011809bcbceSSrinivas Kandagatla break; 1012809bcbceSSrinivas Kandagatla } 1013809bcbceSSrinivas Kandagatla if (mask & 0x0C) 1014809bcbceSSrinivas Kandagatla mask = mask >> 0x2; 1015809bcbceSSrinivas Kandagatla *rx_slot = mask; 1016809bcbceSSrinivas Kandagatla *rx_num = cnt; 1017809bcbceSSrinivas Kandagatla break; 1018809bcbceSSrinivas Kandagatla case WSA_MACRO_AIF_ECHO: 1019809bcbceSSrinivas Kandagatla val = snd_soc_component_read(component, CDC_WSA_RX_INP_MUX_RX_MIX_CFG0); 1020809bcbceSSrinivas Kandagatla if (val & WSA_MACRO_EC_MIX_TX1_MASK) { 1021809bcbceSSrinivas Kandagatla mask |= 0x2; 1022809bcbceSSrinivas Kandagatla cnt++; 1023809bcbceSSrinivas Kandagatla } 1024809bcbceSSrinivas Kandagatla if (val & WSA_MACRO_EC_MIX_TX0_MASK) { 1025809bcbceSSrinivas Kandagatla mask |= 0x1; 1026809bcbceSSrinivas Kandagatla cnt++; 1027809bcbceSSrinivas Kandagatla } 1028809bcbceSSrinivas Kandagatla *tx_slot = mask; 1029809bcbceSSrinivas Kandagatla *tx_num = cnt; 1030809bcbceSSrinivas Kandagatla break; 1031809bcbceSSrinivas Kandagatla default: 1032809bcbceSSrinivas Kandagatla dev_err(component->dev, "%s: Invalid AIF\n", __func__); 1033809bcbceSSrinivas Kandagatla break; 1034809bcbceSSrinivas Kandagatla } 1035809bcbceSSrinivas Kandagatla return 0; 1036809bcbceSSrinivas Kandagatla } 1037809bcbceSSrinivas Kandagatla 1038a893a666SYe Bin static const struct snd_soc_dai_ops wsa_macro_dai_ops = { 1039809bcbceSSrinivas Kandagatla .hw_params = wsa_macro_hw_params, 1040809bcbceSSrinivas Kandagatla .get_channel_map = wsa_macro_get_channel_map, 1041809bcbceSSrinivas Kandagatla }; 1042809bcbceSSrinivas Kandagatla 1043809bcbceSSrinivas Kandagatla static struct snd_soc_dai_driver wsa_macro_dai[] = { 1044809bcbceSSrinivas Kandagatla { 1045809bcbceSSrinivas Kandagatla .name = "wsa_macro_rx1", 1046809bcbceSSrinivas Kandagatla .id = WSA_MACRO_AIF1_PB, 1047809bcbceSSrinivas Kandagatla .playback = { 1048809bcbceSSrinivas Kandagatla .stream_name = "WSA_AIF1 Playback", 1049809bcbceSSrinivas Kandagatla .rates = WSA_MACRO_RX_RATES, 1050809bcbceSSrinivas Kandagatla .formats = WSA_MACRO_RX_FORMATS, 1051809bcbceSSrinivas Kandagatla .rate_max = 384000, 1052809bcbceSSrinivas Kandagatla .rate_min = 8000, 1053809bcbceSSrinivas Kandagatla .channels_min = 1, 1054809bcbceSSrinivas Kandagatla .channels_max = 2, 1055809bcbceSSrinivas Kandagatla }, 1056809bcbceSSrinivas Kandagatla .ops = &wsa_macro_dai_ops, 1057809bcbceSSrinivas Kandagatla }, 1058809bcbceSSrinivas Kandagatla { 1059809bcbceSSrinivas Kandagatla .name = "wsa_macro_rx_mix", 1060809bcbceSSrinivas Kandagatla .id = WSA_MACRO_AIF_MIX1_PB, 1061809bcbceSSrinivas Kandagatla .playback = { 1062809bcbceSSrinivas Kandagatla .stream_name = "WSA_AIF_MIX1 Playback", 1063809bcbceSSrinivas Kandagatla .rates = WSA_MACRO_RX_MIX_RATES, 1064809bcbceSSrinivas Kandagatla .formats = WSA_MACRO_RX_FORMATS, 1065809bcbceSSrinivas Kandagatla .rate_max = 192000, 1066809bcbceSSrinivas Kandagatla .rate_min = 48000, 1067809bcbceSSrinivas Kandagatla .channels_min = 1, 1068809bcbceSSrinivas Kandagatla .channels_max = 2, 1069809bcbceSSrinivas Kandagatla }, 1070809bcbceSSrinivas Kandagatla .ops = &wsa_macro_dai_ops, 1071809bcbceSSrinivas Kandagatla }, 1072809bcbceSSrinivas Kandagatla { 1073809bcbceSSrinivas Kandagatla .name = "wsa_macro_vifeedback", 1074809bcbceSSrinivas Kandagatla .id = WSA_MACRO_AIF_VI, 1075809bcbceSSrinivas Kandagatla .capture = { 1076809bcbceSSrinivas Kandagatla .stream_name = "WSA_AIF_VI Capture", 1077809bcbceSSrinivas Kandagatla .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_48000, 1078809bcbceSSrinivas Kandagatla .formats = WSA_MACRO_RX_FORMATS, 1079809bcbceSSrinivas Kandagatla .rate_max = 48000, 1080809bcbceSSrinivas Kandagatla .rate_min = 8000, 1081809bcbceSSrinivas Kandagatla .channels_min = 1, 1082809bcbceSSrinivas Kandagatla .channels_max = 4, 1083809bcbceSSrinivas Kandagatla }, 1084809bcbceSSrinivas Kandagatla .ops = &wsa_macro_dai_ops, 1085809bcbceSSrinivas Kandagatla }, 1086809bcbceSSrinivas Kandagatla { 1087809bcbceSSrinivas Kandagatla .name = "wsa_macro_echo", 1088809bcbceSSrinivas Kandagatla .id = WSA_MACRO_AIF_ECHO, 1089809bcbceSSrinivas Kandagatla .capture = { 1090809bcbceSSrinivas Kandagatla .stream_name = "WSA_AIF_ECHO Capture", 1091809bcbceSSrinivas Kandagatla .rates = WSA_MACRO_ECHO_RATES, 1092809bcbceSSrinivas Kandagatla .formats = WSA_MACRO_ECHO_FORMATS, 1093809bcbceSSrinivas Kandagatla .rate_max = 48000, 1094809bcbceSSrinivas Kandagatla .rate_min = 8000, 1095809bcbceSSrinivas Kandagatla .channels_min = 1, 1096809bcbceSSrinivas Kandagatla .channels_max = 2, 1097809bcbceSSrinivas Kandagatla }, 1098809bcbceSSrinivas Kandagatla .ops = &wsa_macro_dai_ops, 1099809bcbceSSrinivas Kandagatla }, 1100809bcbceSSrinivas Kandagatla }; 1101809bcbceSSrinivas Kandagatla 1102809bcbceSSrinivas Kandagatla static void wsa_macro_mclk_enable(struct wsa_macro *wsa, bool mclk_enable) 1103809bcbceSSrinivas Kandagatla { 1104809bcbceSSrinivas Kandagatla struct regmap *regmap = wsa->regmap; 1105809bcbceSSrinivas Kandagatla 1106809bcbceSSrinivas Kandagatla if (mclk_enable) { 1107809bcbceSSrinivas Kandagatla if (wsa->wsa_mclk_users == 0) { 1108809bcbceSSrinivas Kandagatla regcache_mark_dirty(regmap); 1109809bcbceSSrinivas Kandagatla regcache_sync(regmap); 1110809bcbceSSrinivas Kandagatla /* 9.6MHz MCLK, set value 0x00 if other frequency */ 1111809bcbceSSrinivas Kandagatla regmap_update_bits(regmap, CDC_WSA_TOP_FREQ_MCLK, 0x01, 0x01); 1112809bcbceSSrinivas Kandagatla regmap_update_bits(regmap, 1113809bcbceSSrinivas Kandagatla CDC_WSA_CLK_RST_CTRL_MCLK_CONTROL, 1114809bcbceSSrinivas Kandagatla CDC_WSA_MCLK_EN_MASK, 1115809bcbceSSrinivas Kandagatla CDC_WSA_MCLK_ENABLE); 1116809bcbceSSrinivas Kandagatla regmap_update_bits(regmap, 1117809bcbceSSrinivas Kandagatla CDC_WSA_CLK_RST_CTRL_FS_CNT_CONTROL, 1118809bcbceSSrinivas Kandagatla CDC_WSA_FS_CNT_EN_MASK, 1119809bcbceSSrinivas Kandagatla CDC_WSA_FS_CNT_ENABLE); 1120809bcbceSSrinivas Kandagatla } 1121809bcbceSSrinivas Kandagatla wsa->wsa_mclk_users++; 1122809bcbceSSrinivas Kandagatla } else { 1123809bcbceSSrinivas Kandagatla if (wsa->wsa_mclk_users <= 0) { 1124809bcbceSSrinivas Kandagatla dev_err(wsa->dev, "clock already disabled\n"); 1125809bcbceSSrinivas Kandagatla wsa->wsa_mclk_users = 0; 1126809bcbceSSrinivas Kandagatla return; 1127809bcbceSSrinivas Kandagatla } 1128809bcbceSSrinivas Kandagatla wsa->wsa_mclk_users--; 1129809bcbceSSrinivas Kandagatla if (wsa->wsa_mclk_users == 0) { 1130809bcbceSSrinivas Kandagatla regmap_update_bits(regmap, 1131809bcbceSSrinivas Kandagatla CDC_WSA_CLK_RST_CTRL_FS_CNT_CONTROL, 1132809bcbceSSrinivas Kandagatla CDC_WSA_FS_CNT_EN_MASK, 1133809bcbceSSrinivas Kandagatla CDC_WSA_FS_CNT_DISABLE); 1134809bcbceSSrinivas Kandagatla regmap_update_bits(regmap, 1135809bcbceSSrinivas Kandagatla CDC_WSA_CLK_RST_CTRL_MCLK_CONTROL, 1136809bcbceSSrinivas Kandagatla CDC_WSA_MCLK_EN_MASK, 1137809bcbceSSrinivas Kandagatla CDC_WSA_MCLK_DISABLE); 1138809bcbceSSrinivas Kandagatla } 1139809bcbceSSrinivas Kandagatla } 1140809bcbceSSrinivas Kandagatla } 1141809bcbceSSrinivas Kandagatla 11422c4066e5SSrinivas Kandagatla static int wsa_macro_mclk_event(struct snd_soc_dapm_widget *w, 11432c4066e5SSrinivas Kandagatla struct snd_kcontrol *kcontrol, int event) 11442c4066e5SSrinivas Kandagatla { 11452c4066e5SSrinivas Kandagatla struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); 11462c4066e5SSrinivas Kandagatla struct wsa_macro *wsa = snd_soc_component_get_drvdata(component); 11472c4066e5SSrinivas Kandagatla 11482c4066e5SSrinivas Kandagatla wsa_macro_mclk_enable(wsa, event == SND_SOC_DAPM_PRE_PMU); 11492c4066e5SSrinivas Kandagatla return 0; 11502c4066e5SSrinivas Kandagatla } 11512c4066e5SSrinivas Kandagatla 11522c4066e5SSrinivas Kandagatla static int wsa_macro_enable_vi_feedback(struct snd_soc_dapm_widget *w, 11532c4066e5SSrinivas Kandagatla struct snd_kcontrol *kcontrol, 11542c4066e5SSrinivas Kandagatla int event) 11552c4066e5SSrinivas Kandagatla { 11562c4066e5SSrinivas Kandagatla struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); 11572c4066e5SSrinivas Kandagatla struct wsa_macro *wsa = snd_soc_component_get_drvdata(component); 11582c4066e5SSrinivas Kandagatla u32 tx_reg0, tx_reg1; 11592c4066e5SSrinivas Kandagatla 11602c4066e5SSrinivas Kandagatla if (test_bit(WSA_MACRO_TX0, &wsa->active_ch_mask[WSA_MACRO_AIF_VI])) { 11612c4066e5SSrinivas Kandagatla tx_reg0 = CDC_WSA_TX0_SPKR_PROT_PATH_CTL; 11622c4066e5SSrinivas Kandagatla tx_reg1 = CDC_WSA_TX1_SPKR_PROT_PATH_CTL; 11632c4066e5SSrinivas Kandagatla } else if (test_bit(WSA_MACRO_TX1, &wsa->active_ch_mask[WSA_MACRO_AIF_VI])) { 11642c4066e5SSrinivas Kandagatla tx_reg0 = CDC_WSA_TX2_SPKR_PROT_PATH_CTL; 11652c4066e5SSrinivas Kandagatla tx_reg1 = CDC_WSA_TX3_SPKR_PROT_PATH_CTL; 11662c4066e5SSrinivas Kandagatla } 11672c4066e5SSrinivas Kandagatla 11682c4066e5SSrinivas Kandagatla switch (event) { 11692c4066e5SSrinivas Kandagatla case SND_SOC_DAPM_POST_PMU: 11702c4066e5SSrinivas Kandagatla /* Enable V&I sensing */ 11712c4066e5SSrinivas Kandagatla snd_soc_component_update_bits(component, tx_reg0, 11722c4066e5SSrinivas Kandagatla CDC_WSA_TX_SPKR_PROT_RESET_MASK, 11732c4066e5SSrinivas Kandagatla CDC_WSA_TX_SPKR_PROT_RESET); 11742c4066e5SSrinivas Kandagatla snd_soc_component_update_bits(component, tx_reg1, 11752c4066e5SSrinivas Kandagatla CDC_WSA_TX_SPKR_PROT_RESET_MASK, 11762c4066e5SSrinivas Kandagatla CDC_WSA_TX_SPKR_PROT_RESET); 11772c4066e5SSrinivas Kandagatla snd_soc_component_update_bits(component, tx_reg0, 11782c4066e5SSrinivas Kandagatla CDC_WSA_TX_SPKR_PROT_PCM_RATE_MASK, 11792c4066e5SSrinivas Kandagatla CDC_WSA_TX_SPKR_PROT_PCM_RATE_8K); 11802c4066e5SSrinivas Kandagatla snd_soc_component_update_bits(component, tx_reg1, 11812c4066e5SSrinivas Kandagatla CDC_WSA_TX_SPKR_PROT_PCM_RATE_MASK, 11822c4066e5SSrinivas Kandagatla CDC_WSA_TX_SPKR_PROT_PCM_RATE_8K); 11832c4066e5SSrinivas Kandagatla snd_soc_component_update_bits(component, tx_reg0, 11842c4066e5SSrinivas Kandagatla CDC_WSA_TX_SPKR_PROT_CLK_EN_MASK, 11852c4066e5SSrinivas Kandagatla CDC_WSA_TX_SPKR_PROT_CLK_ENABLE); 11862c4066e5SSrinivas Kandagatla snd_soc_component_update_bits(component, tx_reg1, 11872c4066e5SSrinivas Kandagatla CDC_WSA_TX_SPKR_PROT_CLK_EN_MASK, 11882c4066e5SSrinivas Kandagatla CDC_WSA_TX_SPKR_PROT_CLK_ENABLE); 11892c4066e5SSrinivas Kandagatla snd_soc_component_update_bits(component, tx_reg0, 11902c4066e5SSrinivas Kandagatla CDC_WSA_TX_SPKR_PROT_RESET_MASK, 11912c4066e5SSrinivas Kandagatla CDC_WSA_TX_SPKR_PROT_NO_RESET); 11922c4066e5SSrinivas Kandagatla snd_soc_component_update_bits(component, tx_reg1, 11932c4066e5SSrinivas Kandagatla CDC_WSA_TX_SPKR_PROT_RESET_MASK, 11942c4066e5SSrinivas Kandagatla CDC_WSA_TX_SPKR_PROT_NO_RESET); 11952c4066e5SSrinivas Kandagatla break; 11962c4066e5SSrinivas Kandagatla case SND_SOC_DAPM_POST_PMD: 11972c4066e5SSrinivas Kandagatla /* Disable V&I sensing */ 11982c4066e5SSrinivas Kandagatla snd_soc_component_update_bits(component, tx_reg0, 11992c4066e5SSrinivas Kandagatla CDC_WSA_TX_SPKR_PROT_RESET_MASK, 12002c4066e5SSrinivas Kandagatla CDC_WSA_TX_SPKR_PROT_RESET); 12012c4066e5SSrinivas Kandagatla snd_soc_component_update_bits(component, tx_reg1, 12022c4066e5SSrinivas Kandagatla CDC_WSA_TX_SPKR_PROT_RESET_MASK, 12032c4066e5SSrinivas Kandagatla CDC_WSA_TX_SPKR_PROT_RESET); 12042c4066e5SSrinivas Kandagatla snd_soc_component_update_bits(component, tx_reg0, 12052c4066e5SSrinivas Kandagatla CDC_WSA_TX_SPKR_PROT_CLK_EN_MASK, 12062c4066e5SSrinivas Kandagatla CDC_WSA_TX_SPKR_PROT_CLK_DISABLE); 12072c4066e5SSrinivas Kandagatla snd_soc_component_update_bits(component, tx_reg1, 12082c4066e5SSrinivas Kandagatla CDC_WSA_TX_SPKR_PROT_CLK_EN_MASK, 12092c4066e5SSrinivas Kandagatla CDC_WSA_TX_SPKR_PROT_CLK_DISABLE); 12102c4066e5SSrinivas Kandagatla break; 12112c4066e5SSrinivas Kandagatla } 12122c4066e5SSrinivas Kandagatla 12132c4066e5SSrinivas Kandagatla return 0; 12142c4066e5SSrinivas Kandagatla } 12152c4066e5SSrinivas Kandagatla 12162c4066e5SSrinivas Kandagatla static int wsa_macro_enable_mix_path(struct snd_soc_dapm_widget *w, 12172c4066e5SSrinivas Kandagatla struct snd_kcontrol *kcontrol, int event) 12182c4066e5SSrinivas Kandagatla { 12192c4066e5SSrinivas Kandagatla struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); 1220e4b8b7c9SJonathan Marek u16 path_reg, gain_reg; 12212c4066e5SSrinivas Kandagatla int val; 12222c4066e5SSrinivas Kandagatla 1223e4b8b7c9SJonathan Marek switch (w->shift) { 1224e4b8b7c9SJonathan Marek case WSA_MACRO_RX_MIX0: 1225e4b8b7c9SJonathan Marek path_reg = CDC_WSA_RX0_RX_PATH_MIX_CTL; 12262c4066e5SSrinivas Kandagatla gain_reg = CDC_WSA_RX0_RX_VOL_MIX_CTL; 12272c4066e5SSrinivas Kandagatla break; 1228e4b8b7c9SJonathan Marek case WSA_MACRO_RX_MIX1: 1229e4b8b7c9SJonathan Marek path_reg = CDC_WSA_RX1_RX_PATH_MIX_CTL; 12302c4066e5SSrinivas Kandagatla gain_reg = CDC_WSA_RX1_RX_VOL_MIX_CTL; 12312c4066e5SSrinivas Kandagatla break; 12322c4066e5SSrinivas Kandagatla default: 12332c4066e5SSrinivas Kandagatla return 0; 12342c4066e5SSrinivas Kandagatla } 12352c4066e5SSrinivas Kandagatla 12362c4066e5SSrinivas Kandagatla switch (event) { 12372c4066e5SSrinivas Kandagatla case SND_SOC_DAPM_POST_PMU: 12382c4066e5SSrinivas Kandagatla val = snd_soc_component_read(component, gain_reg); 12392c4066e5SSrinivas Kandagatla snd_soc_component_write(component, gain_reg, val); 12402c4066e5SSrinivas Kandagatla break; 12412c4066e5SSrinivas Kandagatla case SND_SOC_DAPM_POST_PMD: 1242e4b8b7c9SJonathan Marek snd_soc_component_update_bits(component, path_reg, 12432c4066e5SSrinivas Kandagatla CDC_WSA_RX_PATH_MIX_CLK_EN_MASK, 12442c4066e5SSrinivas Kandagatla CDC_WSA_RX_PATH_MIX_CLK_DISABLE); 12452c4066e5SSrinivas Kandagatla break; 12462c4066e5SSrinivas Kandagatla } 12472c4066e5SSrinivas Kandagatla 12482c4066e5SSrinivas Kandagatla return 0; 12492c4066e5SSrinivas Kandagatla } 12502c4066e5SSrinivas Kandagatla 12512c4066e5SSrinivas Kandagatla static void wsa_macro_hd2_control(struct snd_soc_component *component, 12522c4066e5SSrinivas Kandagatla u16 reg, int event) 12532c4066e5SSrinivas Kandagatla { 12542c4066e5SSrinivas Kandagatla u16 hd2_scale_reg; 12552c4066e5SSrinivas Kandagatla u16 hd2_enable_reg; 12562c4066e5SSrinivas Kandagatla 12572c4066e5SSrinivas Kandagatla if (reg == CDC_WSA_RX0_RX_PATH_CTL) { 12582c4066e5SSrinivas Kandagatla hd2_scale_reg = CDC_WSA_RX0_RX_PATH_SEC3; 12592c4066e5SSrinivas Kandagatla hd2_enable_reg = CDC_WSA_RX0_RX_PATH_CFG0; 12602c4066e5SSrinivas Kandagatla } 12612c4066e5SSrinivas Kandagatla if (reg == CDC_WSA_RX1_RX_PATH_CTL) { 12622c4066e5SSrinivas Kandagatla hd2_scale_reg = CDC_WSA_RX1_RX_PATH_SEC3; 12632c4066e5SSrinivas Kandagatla hd2_enable_reg = CDC_WSA_RX1_RX_PATH_CFG0; 12642c4066e5SSrinivas Kandagatla } 12652c4066e5SSrinivas Kandagatla 12662c4066e5SSrinivas Kandagatla if (hd2_enable_reg && SND_SOC_DAPM_EVENT_ON(event)) { 12672c4066e5SSrinivas Kandagatla snd_soc_component_update_bits(component, hd2_scale_reg, 12682c4066e5SSrinivas Kandagatla CDC_WSA_RX_PATH_HD2_ALPHA_MASK, 12692c4066e5SSrinivas Kandagatla 0x10); 12702c4066e5SSrinivas Kandagatla snd_soc_component_update_bits(component, hd2_scale_reg, 12712c4066e5SSrinivas Kandagatla CDC_WSA_RX_PATH_HD2_SCALE_MASK, 12722c4066e5SSrinivas Kandagatla 0x1); 12732c4066e5SSrinivas Kandagatla snd_soc_component_update_bits(component, hd2_enable_reg, 12742c4066e5SSrinivas Kandagatla CDC_WSA_RX_PATH_HD2_EN_MASK, 12752c4066e5SSrinivas Kandagatla CDC_WSA_RX_PATH_HD2_ENABLE); 12762c4066e5SSrinivas Kandagatla } 12772c4066e5SSrinivas Kandagatla 12782c4066e5SSrinivas Kandagatla if (hd2_enable_reg && SND_SOC_DAPM_EVENT_OFF(event)) { 12792c4066e5SSrinivas Kandagatla snd_soc_component_update_bits(component, hd2_enable_reg, 12802c4066e5SSrinivas Kandagatla CDC_WSA_RX_PATH_HD2_EN_MASK, 0); 12812c4066e5SSrinivas Kandagatla snd_soc_component_update_bits(component, hd2_scale_reg, 12822c4066e5SSrinivas Kandagatla CDC_WSA_RX_PATH_HD2_SCALE_MASK, 12832c4066e5SSrinivas Kandagatla 0); 12842c4066e5SSrinivas Kandagatla snd_soc_component_update_bits(component, hd2_scale_reg, 12852c4066e5SSrinivas Kandagatla CDC_WSA_RX_PATH_HD2_ALPHA_MASK, 12862c4066e5SSrinivas Kandagatla 0); 12872c4066e5SSrinivas Kandagatla } 12882c4066e5SSrinivas Kandagatla } 12892c4066e5SSrinivas Kandagatla 12902c4066e5SSrinivas Kandagatla static int wsa_macro_config_compander(struct snd_soc_component *component, 12912c4066e5SSrinivas Kandagatla int comp, int event) 12922c4066e5SSrinivas Kandagatla { 12932c4066e5SSrinivas Kandagatla u16 comp_ctl0_reg, rx_path_cfg0_reg; 12942c4066e5SSrinivas Kandagatla struct wsa_macro *wsa = snd_soc_component_get_drvdata(component); 12952c4066e5SSrinivas Kandagatla 12962c4066e5SSrinivas Kandagatla if (!wsa->comp_enabled[comp]) 12972c4066e5SSrinivas Kandagatla return 0; 12982c4066e5SSrinivas Kandagatla 12992c4066e5SSrinivas Kandagatla comp_ctl0_reg = CDC_WSA_COMPANDER0_CTL0 + 13002c4066e5SSrinivas Kandagatla (comp * WSA_MACRO_RX_COMP_OFFSET); 13012c4066e5SSrinivas Kandagatla rx_path_cfg0_reg = CDC_WSA_RX0_RX_PATH_CFG0 + 13022c4066e5SSrinivas Kandagatla (comp * WSA_MACRO_RX_PATH_OFFSET); 13032c4066e5SSrinivas Kandagatla 13042c4066e5SSrinivas Kandagatla if (SND_SOC_DAPM_EVENT_ON(event)) { 13052c4066e5SSrinivas Kandagatla /* Enable Compander Clock */ 13062c4066e5SSrinivas Kandagatla snd_soc_component_update_bits(component, comp_ctl0_reg, 13072c4066e5SSrinivas Kandagatla CDC_WSA_COMPANDER_CLK_EN_MASK, 13082c4066e5SSrinivas Kandagatla CDC_WSA_COMPANDER_CLK_ENABLE); 13092c4066e5SSrinivas Kandagatla snd_soc_component_update_bits(component, comp_ctl0_reg, 13102c4066e5SSrinivas Kandagatla CDC_WSA_COMPANDER_SOFT_RST_MASK, 13112c4066e5SSrinivas Kandagatla CDC_WSA_COMPANDER_SOFT_RST_ENABLE); 13122c4066e5SSrinivas Kandagatla snd_soc_component_update_bits(component, comp_ctl0_reg, 13132c4066e5SSrinivas Kandagatla CDC_WSA_COMPANDER_SOFT_RST_MASK, 13142c4066e5SSrinivas Kandagatla 0); 13152c4066e5SSrinivas Kandagatla snd_soc_component_update_bits(component, rx_path_cfg0_reg, 13162c4066e5SSrinivas Kandagatla CDC_WSA_RX_PATH_COMP_EN_MASK, 13172c4066e5SSrinivas Kandagatla CDC_WSA_RX_PATH_COMP_ENABLE); 13182c4066e5SSrinivas Kandagatla } 13192c4066e5SSrinivas Kandagatla 13202c4066e5SSrinivas Kandagatla if (SND_SOC_DAPM_EVENT_OFF(event)) { 13212c4066e5SSrinivas Kandagatla snd_soc_component_update_bits(component, comp_ctl0_reg, 13222c4066e5SSrinivas Kandagatla CDC_WSA_COMPANDER_HALT_MASK, 13232c4066e5SSrinivas Kandagatla CDC_WSA_COMPANDER_HALT); 13242c4066e5SSrinivas Kandagatla snd_soc_component_update_bits(component, rx_path_cfg0_reg, 13252c4066e5SSrinivas Kandagatla CDC_WSA_RX_PATH_COMP_EN_MASK, 0); 13262c4066e5SSrinivas Kandagatla snd_soc_component_update_bits(component, comp_ctl0_reg, 13272c4066e5SSrinivas Kandagatla CDC_WSA_COMPANDER_SOFT_RST_MASK, 13282c4066e5SSrinivas Kandagatla CDC_WSA_COMPANDER_SOFT_RST_ENABLE); 13292c4066e5SSrinivas Kandagatla snd_soc_component_update_bits(component, comp_ctl0_reg, 13302c4066e5SSrinivas Kandagatla CDC_WSA_COMPANDER_SOFT_RST_MASK, 13312c4066e5SSrinivas Kandagatla 0); 13322c4066e5SSrinivas Kandagatla snd_soc_component_update_bits(component, comp_ctl0_reg, 13332c4066e5SSrinivas Kandagatla CDC_WSA_COMPANDER_CLK_EN_MASK, 0); 13342c4066e5SSrinivas Kandagatla snd_soc_component_update_bits(component, comp_ctl0_reg, 13352c4066e5SSrinivas Kandagatla CDC_WSA_COMPANDER_HALT_MASK, 0); 13362c4066e5SSrinivas Kandagatla } 13372c4066e5SSrinivas Kandagatla 13382c4066e5SSrinivas Kandagatla return 0; 13392c4066e5SSrinivas Kandagatla } 13402c4066e5SSrinivas Kandagatla 13412c4066e5SSrinivas Kandagatla static void wsa_macro_enable_softclip_clk(struct snd_soc_component *component, 13422c4066e5SSrinivas Kandagatla struct wsa_macro *wsa, 13432c4066e5SSrinivas Kandagatla int path, 13442c4066e5SSrinivas Kandagatla bool enable) 13452c4066e5SSrinivas Kandagatla { 13462c4066e5SSrinivas Kandagatla u16 softclip_clk_reg = CDC_WSA_SOFTCLIP0_CRC + 13472c4066e5SSrinivas Kandagatla (path * WSA_MACRO_RX_SOFTCLIP_OFFSET); 13482c4066e5SSrinivas Kandagatla u8 softclip_mux_mask = (1 << path); 13492c4066e5SSrinivas Kandagatla u8 softclip_mux_value = (1 << path); 13502c4066e5SSrinivas Kandagatla 13512c4066e5SSrinivas Kandagatla if (enable) { 13522c4066e5SSrinivas Kandagatla if (wsa->softclip_clk_users[path] == 0) { 13532c4066e5SSrinivas Kandagatla snd_soc_component_update_bits(component, 13542c4066e5SSrinivas Kandagatla softclip_clk_reg, 13552c4066e5SSrinivas Kandagatla CDC_WSA_SOFTCLIP_CLK_EN_MASK, 13562c4066e5SSrinivas Kandagatla CDC_WSA_SOFTCLIP_CLK_ENABLE); 13572c4066e5SSrinivas Kandagatla snd_soc_component_update_bits(component, 13582c4066e5SSrinivas Kandagatla CDC_WSA_RX_INP_MUX_SOFTCLIP_CFG0, 13592c4066e5SSrinivas Kandagatla softclip_mux_mask, softclip_mux_value); 13602c4066e5SSrinivas Kandagatla } 13612c4066e5SSrinivas Kandagatla wsa->softclip_clk_users[path]++; 13622c4066e5SSrinivas Kandagatla } else { 13632c4066e5SSrinivas Kandagatla wsa->softclip_clk_users[path]--; 13642c4066e5SSrinivas Kandagatla if (wsa->softclip_clk_users[path] == 0) { 13652c4066e5SSrinivas Kandagatla snd_soc_component_update_bits(component, 13662c4066e5SSrinivas Kandagatla softclip_clk_reg, 13672c4066e5SSrinivas Kandagatla CDC_WSA_SOFTCLIP_CLK_EN_MASK, 13682c4066e5SSrinivas Kandagatla 0); 13692c4066e5SSrinivas Kandagatla snd_soc_component_update_bits(component, 13702c4066e5SSrinivas Kandagatla CDC_WSA_RX_INP_MUX_SOFTCLIP_CFG0, 13712c4066e5SSrinivas Kandagatla softclip_mux_mask, 0x00); 13722c4066e5SSrinivas Kandagatla } 13732c4066e5SSrinivas Kandagatla } 13742c4066e5SSrinivas Kandagatla } 13752c4066e5SSrinivas Kandagatla 13762c4066e5SSrinivas Kandagatla static int wsa_macro_config_softclip(struct snd_soc_component *component, 13772c4066e5SSrinivas Kandagatla int path, int event) 13782c4066e5SSrinivas Kandagatla { 13792c4066e5SSrinivas Kandagatla u16 softclip_ctrl_reg; 13802c4066e5SSrinivas Kandagatla struct wsa_macro *wsa = snd_soc_component_get_drvdata(component); 13812c4066e5SSrinivas Kandagatla int softclip_path = 0; 13822c4066e5SSrinivas Kandagatla 13832c4066e5SSrinivas Kandagatla if (path == WSA_MACRO_COMP1) 13842c4066e5SSrinivas Kandagatla softclip_path = WSA_MACRO_SOFTCLIP0; 13852c4066e5SSrinivas Kandagatla else if (path == WSA_MACRO_COMP2) 13862c4066e5SSrinivas Kandagatla softclip_path = WSA_MACRO_SOFTCLIP1; 13872c4066e5SSrinivas Kandagatla 13882c4066e5SSrinivas Kandagatla if (!wsa->is_softclip_on[softclip_path]) 13892c4066e5SSrinivas Kandagatla return 0; 13902c4066e5SSrinivas Kandagatla 13912c4066e5SSrinivas Kandagatla softclip_ctrl_reg = CDC_WSA_SOFTCLIP0_SOFTCLIP_CTRL + 13922c4066e5SSrinivas Kandagatla (softclip_path * WSA_MACRO_RX_SOFTCLIP_OFFSET); 13932c4066e5SSrinivas Kandagatla 13942c4066e5SSrinivas Kandagatla if (SND_SOC_DAPM_EVENT_ON(event)) { 13952c4066e5SSrinivas Kandagatla /* Enable Softclip clock and mux */ 13962c4066e5SSrinivas Kandagatla wsa_macro_enable_softclip_clk(component, wsa, softclip_path, 13972c4066e5SSrinivas Kandagatla true); 13982c4066e5SSrinivas Kandagatla /* Enable Softclip control */ 13992c4066e5SSrinivas Kandagatla snd_soc_component_update_bits(component, softclip_ctrl_reg, 14002c4066e5SSrinivas Kandagatla CDC_WSA_SOFTCLIP_EN_MASK, 14012c4066e5SSrinivas Kandagatla CDC_WSA_SOFTCLIP_ENABLE); 14022c4066e5SSrinivas Kandagatla } 14032c4066e5SSrinivas Kandagatla 14042c4066e5SSrinivas Kandagatla if (SND_SOC_DAPM_EVENT_OFF(event)) { 14052c4066e5SSrinivas Kandagatla snd_soc_component_update_bits(component, softclip_ctrl_reg, 14062c4066e5SSrinivas Kandagatla CDC_WSA_SOFTCLIP_EN_MASK, 0); 14072c4066e5SSrinivas Kandagatla wsa_macro_enable_softclip_clk(component, wsa, softclip_path, 14082c4066e5SSrinivas Kandagatla false); 14092c4066e5SSrinivas Kandagatla } 14102c4066e5SSrinivas Kandagatla 14112c4066e5SSrinivas Kandagatla return 0; 14122c4066e5SSrinivas Kandagatla } 14132c4066e5SSrinivas Kandagatla 14142c4066e5SSrinivas Kandagatla static bool wsa_macro_adie_lb(struct snd_soc_component *component, 14152c4066e5SSrinivas Kandagatla int interp_idx) 14162c4066e5SSrinivas Kandagatla { 14172c4066e5SSrinivas Kandagatla u16 int_mux_cfg0, int_mux_cfg1; 14182c4066e5SSrinivas Kandagatla u8 int_n_inp0, int_n_inp1, int_n_inp2; 14192c4066e5SSrinivas Kandagatla 14202c4066e5SSrinivas Kandagatla int_mux_cfg0 = CDC_WSA_RX_INP_MUX_RX_INT0_CFG0 + interp_idx * 8; 14212c4066e5SSrinivas Kandagatla int_mux_cfg1 = int_mux_cfg0 + 4; 14222c4066e5SSrinivas Kandagatla 14237db4c4cdSSrinivas Kandagatla int_n_inp0 = snd_soc_component_read_field(component, int_mux_cfg0, 14247db4c4cdSSrinivas Kandagatla CDC_WSA_RX_INTX_1_MIX_INP0_SEL_MASK); 14252c4066e5SSrinivas Kandagatla if (int_n_inp0 == INTn_1_INP_SEL_DEC0 || 14262c4066e5SSrinivas Kandagatla int_n_inp0 == INTn_1_INP_SEL_DEC1) 14272c4066e5SSrinivas Kandagatla return true; 14282c4066e5SSrinivas Kandagatla 14297db4c4cdSSrinivas Kandagatla int_n_inp1 = snd_soc_component_read_field(component, int_mux_cfg0, 14307db4c4cdSSrinivas Kandagatla CDC_WSA_RX_INTX_1_MIX_INP1_SEL_MASK); 14312c4066e5SSrinivas Kandagatla if (int_n_inp1 == INTn_1_INP_SEL_DEC0 || 14322c4066e5SSrinivas Kandagatla int_n_inp1 == INTn_1_INP_SEL_DEC1) 14332c4066e5SSrinivas Kandagatla return true; 14342c4066e5SSrinivas Kandagatla 14357db4c4cdSSrinivas Kandagatla int_n_inp2 = snd_soc_component_read_field(component, int_mux_cfg1, 14367db4c4cdSSrinivas Kandagatla CDC_WSA_RX_INTX_1_MIX_INP2_SEL_MASK); 14372c4066e5SSrinivas Kandagatla if (int_n_inp2 == INTn_1_INP_SEL_DEC0 || 14382c4066e5SSrinivas Kandagatla int_n_inp2 == INTn_1_INP_SEL_DEC1) 14392c4066e5SSrinivas Kandagatla return true; 14402c4066e5SSrinivas Kandagatla 14412c4066e5SSrinivas Kandagatla return false; 14422c4066e5SSrinivas Kandagatla } 14432c4066e5SSrinivas Kandagatla 14442c4066e5SSrinivas Kandagatla static int wsa_macro_enable_main_path(struct snd_soc_dapm_widget *w, 14452c4066e5SSrinivas Kandagatla struct snd_kcontrol *kcontrol, 14462c4066e5SSrinivas Kandagatla int event) 14472c4066e5SSrinivas Kandagatla { 14482c4066e5SSrinivas Kandagatla struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); 14492c4066e5SSrinivas Kandagatla u16 reg; 14502c4066e5SSrinivas Kandagatla 14512c4066e5SSrinivas Kandagatla reg = CDC_WSA_RX0_RX_PATH_CTL + WSA_MACRO_RX_PATH_OFFSET * w->shift; 14522c4066e5SSrinivas Kandagatla switch (event) { 14532c4066e5SSrinivas Kandagatla case SND_SOC_DAPM_PRE_PMU: 14542c4066e5SSrinivas Kandagatla if (wsa_macro_adie_lb(component, w->shift)) { 14552c4066e5SSrinivas Kandagatla snd_soc_component_update_bits(component, reg, 14562c4066e5SSrinivas Kandagatla CDC_WSA_RX_PATH_CLK_EN_MASK, 14572c4066e5SSrinivas Kandagatla CDC_WSA_RX_PATH_CLK_ENABLE); 14582c4066e5SSrinivas Kandagatla } 14592c4066e5SSrinivas Kandagatla break; 14602c4066e5SSrinivas Kandagatla default: 14612c4066e5SSrinivas Kandagatla break; 14622c4066e5SSrinivas Kandagatla } 14632c4066e5SSrinivas Kandagatla return 0; 14642c4066e5SSrinivas Kandagatla } 14652c4066e5SSrinivas Kandagatla 14662c4066e5SSrinivas Kandagatla static int wsa_macro_interp_get_primary_reg(u16 reg, u16 *ind) 14672c4066e5SSrinivas Kandagatla { 14682c4066e5SSrinivas Kandagatla u16 prim_int_reg = 0; 14692c4066e5SSrinivas Kandagatla 14702c4066e5SSrinivas Kandagatla switch (reg) { 14712c4066e5SSrinivas Kandagatla case CDC_WSA_RX0_RX_PATH_CTL: 14722c4066e5SSrinivas Kandagatla case CDC_WSA_RX0_RX_PATH_MIX_CTL: 14732c4066e5SSrinivas Kandagatla prim_int_reg = CDC_WSA_RX0_RX_PATH_CTL; 14742c4066e5SSrinivas Kandagatla *ind = 0; 14752c4066e5SSrinivas Kandagatla break; 14762c4066e5SSrinivas Kandagatla case CDC_WSA_RX1_RX_PATH_CTL: 14772c4066e5SSrinivas Kandagatla case CDC_WSA_RX1_RX_PATH_MIX_CTL: 14782c4066e5SSrinivas Kandagatla prim_int_reg = CDC_WSA_RX1_RX_PATH_CTL; 14792c4066e5SSrinivas Kandagatla *ind = 1; 14802c4066e5SSrinivas Kandagatla break; 14812c4066e5SSrinivas Kandagatla } 14822c4066e5SSrinivas Kandagatla 14832c4066e5SSrinivas Kandagatla return prim_int_reg; 14842c4066e5SSrinivas Kandagatla } 14852c4066e5SSrinivas Kandagatla 14862c4066e5SSrinivas Kandagatla static int wsa_macro_enable_prim_interpolator(struct snd_soc_component *component, 14872c4066e5SSrinivas Kandagatla u16 reg, int event) 14882c4066e5SSrinivas Kandagatla { 14892c4066e5SSrinivas Kandagatla u16 prim_int_reg; 14902c4066e5SSrinivas Kandagatla u16 ind = 0; 14912c4066e5SSrinivas Kandagatla struct wsa_macro *wsa = snd_soc_component_get_drvdata(component); 14922c4066e5SSrinivas Kandagatla 14932c4066e5SSrinivas Kandagatla prim_int_reg = wsa_macro_interp_get_primary_reg(reg, &ind); 14942c4066e5SSrinivas Kandagatla 14952c4066e5SSrinivas Kandagatla switch (event) { 14962c4066e5SSrinivas Kandagatla case SND_SOC_DAPM_PRE_PMU: 14972c4066e5SSrinivas Kandagatla wsa->prim_int_users[ind]++; 14982c4066e5SSrinivas Kandagatla if (wsa->prim_int_users[ind] == 1) { 14992c4066e5SSrinivas Kandagatla snd_soc_component_update_bits(component, 15002c4066e5SSrinivas Kandagatla prim_int_reg + WSA_MACRO_RX_PATH_CFG3_OFFSET, 15012c4066e5SSrinivas Kandagatla CDC_WSA_RX_DC_DCOEFF_MASK, 15022c4066e5SSrinivas Kandagatla 0x3); 15032c4066e5SSrinivas Kandagatla snd_soc_component_update_bits(component, prim_int_reg, 15042c4066e5SSrinivas Kandagatla CDC_WSA_RX_PATH_PGA_MUTE_EN_MASK, 15052c4066e5SSrinivas Kandagatla CDC_WSA_RX_PATH_PGA_MUTE_ENABLE); 15062c4066e5SSrinivas Kandagatla wsa_macro_hd2_control(component, prim_int_reg, event); 15072c4066e5SSrinivas Kandagatla snd_soc_component_update_bits(component, 15082c4066e5SSrinivas Kandagatla prim_int_reg + WSA_MACRO_RX_PATH_DSMDEM_OFFSET, 15092c4066e5SSrinivas Kandagatla CDC_WSA_RX_DSMDEM_CLK_EN_MASK, 15102c4066e5SSrinivas Kandagatla CDC_WSA_RX_DSMDEM_CLK_ENABLE); 15112c4066e5SSrinivas Kandagatla } 15122c4066e5SSrinivas Kandagatla if ((reg != prim_int_reg) && 15132c4066e5SSrinivas Kandagatla ((snd_soc_component_read( 15142c4066e5SSrinivas Kandagatla component, prim_int_reg)) & 0x10)) 15152c4066e5SSrinivas Kandagatla snd_soc_component_update_bits(component, reg, 15162c4066e5SSrinivas Kandagatla 0x10, 0x10); 15172c4066e5SSrinivas Kandagatla break; 15182c4066e5SSrinivas Kandagatla case SND_SOC_DAPM_POST_PMD: 15192c4066e5SSrinivas Kandagatla wsa->prim_int_users[ind]--; 15202c4066e5SSrinivas Kandagatla if (wsa->prim_int_users[ind] == 0) { 15212c4066e5SSrinivas Kandagatla snd_soc_component_update_bits(component, 15222c4066e5SSrinivas Kandagatla prim_int_reg + WSA_MACRO_RX_PATH_DSMDEM_OFFSET, 15232c4066e5SSrinivas Kandagatla CDC_WSA_RX_DSMDEM_CLK_EN_MASK, 0); 15242c4066e5SSrinivas Kandagatla wsa_macro_hd2_control(component, prim_int_reg, event); 15252c4066e5SSrinivas Kandagatla } 15262c4066e5SSrinivas Kandagatla break; 15272c4066e5SSrinivas Kandagatla } 15282c4066e5SSrinivas Kandagatla 15292c4066e5SSrinivas Kandagatla return 0; 15302c4066e5SSrinivas Kandagatla } 15312c4066e5SSrinivas Kandagatla 15322c4066e5SSrinivas Kandagatla static int wsa_macro_config_ear_spkr_gain(struct snd_soc_component *component, 15332c4066e5SSrinivas Kandagatla struct wsa_macro *wsa, 15342c4066e5SSrinivas Kandagatla int event, int gain_reg) 15352c4066e5SSrinivas Kandagatla { 15362c4066e5SSrinivas Kandagatla int comp_gain_offset, val; 15372c4066e5SSrinivas Kandagatla 15382c4066e5SSrinivas Kandagatla switch (wsa->spkr_mode) { 15392c4066e5SSrinivas Kandagatla /* Compander gain in WSA_MACRO_SPKR_MODE1 case is 12 dB */ 15402c4066e5SSrinivas Kandagatla case WSA_MACRO_SPKR_MODE_1: 15412c4066e5SSrinivas Kandagatla comp_gain_offset = -12; 15422c4066e5SSrinivas Kandagatla break; 15432c4066e5SSrinivas Kandagatla /* Default case compander gain is 15 dB */ 15442c4066e5SSrinivas Kandagatla default: 15452c4066e5SSrinivas Kandagatla comp_gain_offset = -15; 15462c4066e5SSrinivas Kandagatla break; 15472c4066e5SSrinivas Kandagatla } 15482c4066e5SSrinivas Kandagatla 15492c4066e5SSrinivas Kandagatla switch (event) { 15502c4066e5SSrinivas Kandagatla case SND_SOC_DAPM_POST_PMU: 15512c4066e5SSrinivas Kandagatla /* Apply ear spkr gain only if compander is enabled */ 15522c4066e5SSrinivas Kandagatla if (wsa->comp_enabled[WSA_MACRO_COMP1] && 15532c4066e5SSrinivas Kandagatla (gain_reg == CDC_WSA_RX0_RX_VOL_CTL) && 15542c4066e5SSrinivas Kandagatla (wsa->ear_spkr_gain != 0)) { 15552c4066e5SSrinivas Kandagatla /* For example, val is -8(-12+5-1) for 4dB of gain */ 15562c4066e5SSrinivas Kandagatla val = comp_gain_offset + wsa->ear_spkr_gain - 1; 15572c4066e5SSrinivas Kandagatla snd_soc_component_write(component, gain_reg, val); 15582c4066e5SSrinivas Kandagatla } 15592c4066e5SSrinivas Kandagatla break; 15602c4066e5SSrinivas Kandagatla case SND_SOC_DAPM_POST_PMD: 15612c4066e5SSrinivas Kandagatla /* 15622c4066e5SSrinivas Kandagatla * Reset RX0 volume to 0 dB if compander is enabled and 15632c4066e5SSrinivas Kandagatla * ear_spkr_gain is non-zero. 15642c4066e5SSrinivas Kandagatla */ 15652c4066e5SSrinivas Kandagatla if (wsa->comp_enabled[WSA_MACRO_COMP1] && 15662c4066e5SSrinivas Kandagatla (gain_reg == CDC_WSA_RX0_RX_VOL_CTL) && 15672c4066e5SSrinivas Kandagatla (wsa->ear_spkr_gain != 0)) { 15682c4066e5SSrinivas Kandagatla snd_soc_component_write(component, gain_reg, 0x0); 15692c4066e5SSrinivas Kandagatla } 15702c4066e5SSrinivas Kandagatla break; 15712c4066e5SSrinivas Kandagatla } 15722c4066e5SSrinivas Kandagatla 15732c4066e5SSrinivas Kandagatla return 0; 15742c4066e5SSrinivas Kandagatla } 15752c4066e5SSrinivas Kandagatla 15762c4066e5SSrinivas Kandagatla static int wsa_macro_enable_interpolator(struct snd_soc_dapm_widget *w, 15772c4066e5SSrinivas Kandagatla struct snd_kcontrol *kcontrol, 15782c4066e5SSrinivas Kandagatla int event) 15792c4066e5SSrinivas Kandagatla { 15802c4066e5SSrinivas Kandagatla struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); 15812c4066e5SSrinivas Kandagatla u16 gain_reg; 15822c4066e5SSrinivas Kandagatla u16 reg; 15832c4066e5SSrinivas Kandagatla int val; 15842c4066e5SSrinivas Kandagatla int offset_val = 0; 15852c4066e5SSrinivas Kandagatla struct wsa_macro *wsa = snd_soc_component_get_drvdata(component); 15862c4066e5SSrinivas Kandagatla 15872c4066e5SSrinivas Kandagatla if (w->shift == WSA_MACRO_COMP1) { 15882c4066e5SSrinivas Kandagatla reg = CDC_WSA_RX0_RX_PATH_CTL; 15892c4066e5SSrinivas Kandagatla gain_reg = CDC_WSA_RX0_RX_VOL_CTL; 15902c4066e5SSrinivas Kandagatla } else if (w->shift == WSA_MACRO_COMP2) { 15912c4066e5SSrinivas Kandagatla reg = CDC_WSA_RX1_RX_PATH_CTL; 15922c4066e5SSrinivas Kandagatla gain_reg = CDC_WSA_RX1_RX_VOL_CTL; 15932c4066e5SSrinivas Kandagatla } 15942c4066e5SSrinivas Kandagatla 15952c4066e5SSrinivas Kandagatla switch (event) { 15962c4066e5SSrinivas Kandagatla case SND_SOC_DAPM_PRE_PMU: 15972c4066e5SSrinivas Kandagatla /* Reset if needed */ 15982c4066e5SSrinivas Kandagatla wsa_macro_enable_prim_interpolator(component, reg, event); 15992c4066e5SSrinivas Kandagatla break; 16002c4066e5SSrinivas Kandagatla case SND_SOC_DAPM_POST_PMU: 16012c4066e5SSrinivas Kandagatla wsa_macro_config_compander(component, w->shift, event); 16022c4066e5SSrinivas Kandagatla wsa_macro_config_softclip(component, w->shift, event); 16032c4066e5SSrinivas Kandagatla /* apply gain after int clk is enabled */ 16042c4066e5SSrinivas Kandagatla if ((wsa->spkr_gain_offset == WSA_MACRO_GAIN_OFFSET_M1P5_DB) && 16052c4066e5SSrinivas Kandagatla (wsa->comp_enabled[WSA_MACRO_COMP1] || 16062c4066e5SSrinivas Kandagatla wsa->comp_enabled[WSA_MACRO_COMP2])) { 16072c4066e5SSrinivas Kandagatla snd_soc_component_update_bits(component, 16082c4066e5SSrinivas Kandagatla CDC_WSA_RX0_RX_PATH_SEC1, 16092c4066e5SSrinivas Kandagatla CDC_WSA_RX_PGA_HALF_DB_MASK, 16102c4066e5SSrinivas Kandagatla CDC_WSA_RX_PGA_HALF_DB_ENABLE); 16112c4066e5SSrinivas Kandagatla snd_soc_component_update_bits(component, 16122c4066e5SSrinivas Kandagatla CDC_WSA_RX0_RX_PATH_MIX_SEC0, 16132c4066e5SSrinivas Kandagatla CDC_WSA_RX_PGA_HALF_DB_MASK, 16142c4066e5SSrinivas Kandagatla CDC_WSA_RX_PGA_HALF_DB_ENABLE); 16152c4066e5SSrinivas Kandagatla snd_soc_component_update_bits(component, 16162c4066e5SSrinivas Kandagatla CDC_WSA_RX1_RX_PATH_SEC1, 16172c4066e5SSrinivas Kandagatla CDC_WSA_RX_PGA_HALF_DB_MASK, 16182c4066e5SSrinivas Kandagatla CDC_WSA_RX_PGA_HALF_DB_ENABLE); 16192c4066e5SSrinivas Kandagatla snd_soc_component_update_bits(component, 16202c4066e5SSrinivas Kandagatla CDC_WSA_RX1_RX_PATH_MIX_SEC0, 16212c4066e5SSrinivas Kandagatla CDC_WSA_RX_PGA_HALF_DB_MASK, 16222c4066e5SSrinivas Kandagatla CDC_WSA_RX_PGA_HALF_DB_ENABLE); 16232c4066e5SSrinivas Kandagatla offset_val = -2; 16242c4066e5SSrinivas Kandagatla } 16252c4066e5SSrinivas Kandagatla val = snd_soc_component_read(component, gain_reg); 16262c4066e5SSrinivas Kandagatla val += offset_val; 16272c4066e5SSrinivas Kandagatla snd_soc_component_write(component, gain_reg, val); 16282c4066e5SSrinivas Kandagatla wsa_macro_config_ear_spkr_gain(component, wsa, 16292c4066e5SSrinivas Kandagatla event, gain_reg); 16302c4066e5SSrinivas Kandagatla break; 16312c4066e5SSrinivas Kandagatla case SND_SOC_DAPM_POST_PMD: 16322c4066e5SSrinivas Kandagatla wsa_macro_config_compander(component, w->shift, event); 16332c4066e5SSrinivas Kandagatla wsa_macro_config_softclip(component, w->shift, event); 16342c4066e5SSrinivas Kandagatla wsa_macro_enable_prim_interpolator(component, reg, event); 16352c4066e5SSrinivas Kandagatla if ((wsa->spkr_gain_offset == WSA_MACRO_GAIN_OFFSET_M1P5_DB) && 16362c4066e5SSrinivas Kandagatla (wsa->comp_enabled[WSA_MACRO_COMP1] || 16372c4066e5SSrinivas Kandagatla wsa->comp_enabled[WSA_MACRO_COMP2])) { 16382c4066e5SSrinivas Kandagatla snd_soc_component_update_bits(component, 16392c4066e5SSrinivas Kandagatla CDC_WSA_RX0_RX_PATH_SEC1, 16402c4066e5SSrinivas Kandagatla CDC_WSA_RX_PGA_HALF_DB_MASK, 16412c4066e5SSrinivas Kandagatla CDC_WSA_RX_PGA_HALF_DB_DISABLE); 16422c4066e5SSrinivas Kandagatla snd_soc_component_update_bits(component, 16432c4066e5SSrinivas Kandagatla CDC_WSA_RX0_RX_PATH_MIX_SEC0, 16442c4066e5SSrinivas Kandagatla CDC_WSA_RX_PGA_HALF_DB_MASK, 16452c4066e5SSrinivas Kandagatla CDC_WSA_RX_PGA_HALF_DB_DISABLE); 16462c4066e5SSrinivas Kandagatla snd_soc_component_update_bits(component, 16472c4066e5SSrinivas Kandagatla CDC_WSA_RX1_RX_PATH_SEC1, 16482c4066e5SSrinivas Kandagatla CDC_WSA_RX_PGA_HALF_DB_MASK, 16492c4066e5SSrinivas Kandagatla CDC_WSA_RX_PGA_HALF_DB_DISABLE); 16502c4066e5SSrinivas Kandagatla snd_soc_component_update_bits(component, 16512c4066e5SSrinivas Kandagatla CDC_WSA_RX1_RX_PATH_MIX_SEC0, 16522c4066e5SSrinivas Kandagatla CDC_WSA_RX_PGA_HALF_DB_MASK, 16532c4066e5SSrinivas Kandagatla CDC_WSA_RX_PGA_HALF_DB_DISABLE); 16542c4066e5SSrinivas Kandagatla offset_val = 2; 16552c4066e5SSrinivas Kandagatla val = snd_soc_component_read(component, gain_reg); 16562c4066e5SSrinivas Kandagatla val += offset_val; 16572c4066e5SSrinivas Kandagatla snd_soc_component_write(component, gain_reg, val); 16582c4066e5SSrinivas Kandagatla } 16592c4066e5SSrinivas Kandagatla wsa_macro_config_ear_spkr_gain(component, wsa, 16602c4066e5SSrinivas Kandagatla event, gain_reg); 16612c4066e5SSrinivas Kandagatla break; 16622c4066e5SSrinivas Kandagatla } 16632c4066e5SSrinivas Kandagatla 16642c4066e5SSrinivas Kandagatla return 0; 16652c4066e5SSrinivas Kandagatla } 16662c4066e5SSrinivas Kandagatla 16672c4066e5SSrinivas Kandagatla static int wsa_macro_spk_boost_event(struct snd_soc_dapm_widget *w, 16682c4066e5SSrinivas Kandagatla struct snd_kcontrol *kcontrol, 16692c4066e5SSrinivas Kandagatla int event) 16702c4066e5SSrinivas Kandagatla { 16712c4066e5SSrinivas Kandagatla struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); 16722c4066e5SSrinivas Kandagatla u16 boost_path_ctl, boost_path_cfg1; 16732c4066e5SSrinivas Kandagatla u16 reg, reg_mix; 16742c4066e5SSrinivas Kandagatla 16752c4066e5SSrinivas Kandagatla if (!strcmp(w->name, "WSA_RX INT0 CHAIN")) { 16762c4066e5SSrinivas Kandagatla boost_path_ctl = CDC_WSA_BOOST0_BOOST_PATH_CTL; 16772c4066e5SSrinivas Kandagatla boost_path_cfg1 = CDC_WSA_RX0_RX_PATH_CFG1; 16782c4066e5SSrinivas Kandagatla reg = CDC_WSA_RX0_RX_PATH_CTL; 16792c4066e5SSrinivas Kandagatla reg_mix = CDC_WSA_RX0_RX_PATH_MIX_CTL; 16802c4066e5SSrinivas Kandagatla } else if (!strcmp(w->name, "WSA_RX INT1 CHAIN")) { 16812c4066e5SSrinivas Kandagatla boost_path_ctl = CDC_WSA_BOOST1_BOOST_PATH_CTL; 16822c4066e5SSrinivas Kandagatla boost_path_cfg1 = CDC_WSA_RX1_RX_PATH_CFG1; 16832c4066e5SSrinivas Kandagatla reg = CDC_WSA_RX1_RX_PATH_CTL; 16842c4066e5SSrinivas Kandagatla reg_mix = CDC_WSA_RX1_RX_PATH_MIX_CTL; 16852c4066e5SSrinivas Kandagatla } 16862c4066e5SSrinivas Kandagatla 16872c4066e5SSrinivas Kandagatla switch (event) { 16882c4066e5SSrinivas Kandagatla case SND_SOC_DAPM_PRE_PMU: 16892c4066e5SSrinivas Kandagatla snd_soc_component_update_bits(component, boost_path_cfg1, 16902c4066e5SSrinivas Kandagatla CDC_WSA_RX_PATH_SMART_BST_EN_MASK, 16912c4066e5SSrinivas Kandagatla CDC_WSA_RX_PATH_SMART_BST_ENABLE); 16922c4066e5SSrinivas Kandagatla snd_soc_component_update_bits(component, boost_path_ctl, 16932c4066e5SSrinivas Kandagatla CDC_WSA_BOOST_PATH_CLK_EN_MASK, 16942c4066e5SSrinivas Kandagatla CDC_WSA_BOOST_PATH_CLK_ENABLE); 16952c4066e5SSrinivas Kandagatla if ((snd_soc_component_read(component, reg_mix)) & 0x10) 16962c4066e5SSrinivas Kandagatla snd_soc_component_update_bits(component, reg_mix, 16972c4066e5SSrinivas Kandagatla 0x10, 0x00); 16982c4066e5SSrinivas Kandagatla break; 16992c4066e5SSrinivas Kandagatla case SND_SOC_DAPM_POST_PMU: 17002c4066e5SSrinivas Kandagatla snd_soc_component_update_bits(component, reg, 0x10, 0x00); 17012c4066e5SSrinivas Kandagatla break; 17022c4066e5SSrinivas Kandagatla case SND_SOC_DAPM_POST_PMD: 17032c4066e5SSrinivas Kandagatla snd_soc_component_update_bits(component, boost_path_ctl, 17042c4066e5SSrinivas Kandagatla CDC_WSA_BOOST_PATH_CLK_EN_MASK, 17052c4066e5SSrinivas Kandagatla CDC_WSA_BOOST_PATH_CLK_DISABLE); 17062c4066e5SSrinivas Kandagatla snd_soc_component_update_bits(component, boost_path_cfg1, 17072c4066e5SSrinivas Kandagatla CDC_WSA_RX_PATH_SMART_BST_EN_MASK, 17082c4066e5SSrinivas Kandagatla CDC_WSA_RX_PATH_SMART_BST_DISABLE); 17092c4066e5SSrinivas Kandagatla break; 17102c4066e5SSrinivas Kandagatla } 17112c4066e5SSrinivas Kandagatla 17122c4066e5SSrinivas Kandagatla return 0; 17132c4066e5SSrinivas Kandagatla } 17142c4066e5SSrinivas Kandagatla 17152c4066e5SSrinivas Kandagatla static int wsa_macro_enable_echo(struct snd_soc_dapm_widget *w, 17162c4066e5SSrinivas Kandagatla struct snd_kcontrol *kcontrol, 17172c4066e5SSrinivas Kandagatla int event) 17182c4066e5SSrinivas Kandagatla { 17192c4066e5SSrinivas Kandagatla struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); 17202c4066e5SSrinivas Kandagatla struct wsa_macro *wsa = snd_soc_component_get_drvdata(component); 17212c4066e5SSrinivas Kandagatla u16 val, ec_tx, ec_hq_reg; 17222c4066e5SSrinivas Kandagatla 17232c4066e5SSrinivas Kandagatla val = snd_soc_component_read(component, CDC_WSA_RX_INP_MUX_RX_MIX_CFG0); 17242c4066e5SSrinivas Kandagatla 17252c4066e5SSrinivas Kandagatla switch (w->shift) { 17262c4066e5SSrinivas Kandagatla case WSA_MACRO_EC0_MUX: 17272c4066e5SSrinivas Kandagatla val = val & CDC_WSA_RX_MIX_TX0_SEL_MASK; 17282c4066e5SSrinivas Kandagatla ec_tx = val - 1; 17292c4066e5SSrinivas Kandagatla break; 17302c4066e5SSrinivas Kandagatla case WSA_MACRO_EC1_MUX: 17312c4066e5SSrinivas Kandagatla val = val & CDC_WSA_RX_MIX_TX1_SEL_MASK; 17322c4066e5SSrinivas Kandagatla ec_tx = (val >> CDC_WSA_RX_MIX_TX1_SEL_SHFT) - 1; 17332c4066e5SSrinivas Kandagatla break; 173458f01c7fSTom Rix default: 173558f01c7fSTom Rix dev_err(component->dev, "%s: Invalid shift %u\n", 173658f01c7fSTom Rix __func__, w->shift); 173758f01c7fSTom Rix return -EINVAL; 17382c4066e5SSrinivas Kandagatla } 17392c4066e5SSrinivas Kandagatla 17402c4066e5SSrinivas Kandagatla if (wsa->ec_hq[ec_tx]) { 17412c4066e5SSrinivas Kandagatla ec_hq_reg = CDC_WSA_EC_HQ0_EC_REF_HQ_PATH_CTL + 0x40 * ec_tx; 17422c4066e5SSrinivas Kandagatla snd_soc_component_update_bits(component, ec_hq_reg, 17432c4066e5SSrinivas Kandagatla CDC_WSA_EC_HQ_EC_CLK_EN_MASK, 17442c4066e5SSrinivas Kandagatla CDC_WSA_EC_HQ_EC_CLK_ENABLE); 17452c4066e5SSrinivas Kandagatla ec_hq_reg = CDC_WSA_EC_HQ0_EC_REF_HQ_CFG0 + 0x40 * ec_tx; 17462c4066e5SSrinivas Kandagatla /* default set to 48k */ 17472c4066e5SSrinivas Kandagatla snd_soc_component_update_bits(component, ec_hq_reg, 17482c4066e5SSrinivas Kandagatla CDC_WSA_EC_HQ_EC_REF_PCM_RATE_MASK, 17492c4066e5SSrinivas Kandagatla CDC_WSA_EC_HQ_EC_REF_PCM_RATE_48K); 17502c4066e5SSrinivas Kandagatla } 17512c4066e5SSrinivas Kandagatla 17522c4066e5SSrinivas Kandagatla return 0; 17532c4066e5SSrinivas Kandagatla } 17542c4066e5SSrinivas Kandagatla 1755809bcbceSSrinivas Kandagatla static int wsa_macro_get_ec_hq(struct snd_kcontrol *kcontrol, 1756809bcbceSSrinivas Kandagatla struct snd_ctl_elem_value *ucontrol) 1757809bcbceSSrinivas Kandagatla { 1758809bcbceSSrinivas Kandagatla 1759809bcbceSSrinivas Kandagatla struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); 1760809bcbceSSrinivas Kandagatla int ec_tx = ((struct soc_mixer_control *) kcontrol->private_value)->shift; 1761809bcbceSSrinivas Kandagatla struct wsa_macro *wsa = snd_soc_component_get_drvdata(component); 1762809bcbceSSrinivas Kandagatla 1763809bcbceSSrinivas Kandagatla ucontrol->value.integer.value[0] = wsa->ec_hq[ec_tx]; 1764809bcbceSSrinivas Kandagatla 1765809bcbceSSrinivas Kandagatla return 0; 1766809bcbceSSrinivas Kandagatla } 1767809bcbceSSrinivas Kandagatla 1768809bcbceSSrinivas Kandagatla static int wsa_macro_set_ec_hq(struct snd_kcontrol *kcontrol, 1769809bcbceSSrinivas Kandagatla struct snd_ctl_elem_value *ucontrol) 1770809bcbceSSrinivas Kandagatla { 1771809bcbceSSrinivas Kandagatla struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); 1772809bcbceSSrinivas Kandagatla int ec_tx = ((struct soc_mixer_control *) kcontrol->private_value)->shift; 1773809bcbceSSrinivas Kandagatla int value = ucontrol->value.integer.value[0]; 1774809bcbceSSrinivas Kandagatla struct wsa_macro *wsa = snd_soc_component_get_drvdata(component); 1775809bcbceSSrinivas Kandagatla 1776809bcbceSSrinivas Kandagatla wsa->ec_hq[ec_tx] = value; 1777809bcbceSSrinivas Kandagatla 1778809bcbceSSrinivas Kandagatla return 0; 1779809bcbceSSrinivas Kandagatla } 1780809bcbceSSrinivas Kandagatla 1781809bcbceSSrinivas Kandagatla static int wsa_macro_get_compander(struct snd_kcontrol *kcontrol, 1782809bcbceSSrinivas Kandagatla struct snd_ctl_elem_value *ucontrol) 1783809bcbceSSrinivas Kandagatla { 1784809bcbceSSrinivas Kandagatla 1785809bcbceSSrinivas Kandagatla struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); 1786809bcbceSSrinivas Kandagatla int comp = ((struct soc_mixer_control *) kcontrol->private_value)->shift; 1787809bcbceSSrinivas Kandagatla struct wsa_macro *wsa = snd_soc_component_get_drvdata(component); 1788809bcbceSSrinivas Kandagatla 1789809bcbceSSrinivas Kandagatla ucontrol->value.integer.value[0] = wsa->comp_enabled[comp]; 1790809bcbceSSrinivas Kandagatla return 0; 1791809bcbceSSrinivas Kandagatla } 1792809bcbceSSrinivas Kandagatla 1793809bcbceSSrinivas Kandagatla static int wsa_macro_set_compander(struct snd_kcontrol *kcontrol, 1794809bcbceSSrinivas Kandagatla struct snd_ctl_elem_value *ucontrol) 1795809bcbceSSrinivas Kandagatla { 1796809bcbceSSrinivas Kandagatla struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); 1797809bcbceSSrinivas Kandagatla int comp = ((struct soc_mixer_control *) kcontrol->private_value)->shift; 1798809bcbceSSrinivas Kandagatla int value = ucontrol->value.integer.value[0]; 1799809bcbceSSrinivas Kandagatla struct wsa_macro *wsa = snd_soc_component_get_drvdata(component); 1800809bcbceSSrinivas Kandagatla 1801809bcbceSSrinivas Kandagatla wsa->comp_enabled[comp] = value; 1802809bcbceSSrinivas Kandagatla 1803809bcbceSSrinivas Kandagatla return 0; 1804809bcbceSSrinivas Kandagatla } 1805809bcbceSSrinivas Kandagatla 1806809bcbceSSrinivas Kandagatla static int wsa_macro_ear_spkr_pa_gain_get(struct snd_kcontrol *kcontrol, 1807809bcbceSSrinivas Kandagatla struct snd_ctl_elem_value *ucontrol) 1808809bcbceSSrinivas Kandagatla { 1809809bcbceSSrinivas Kandagatla struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); 1810809bcbceSSrinivas Kandagatla struct wsa_macro *wsa = snd_soc_component_get_drvdata(component); 1811809bcbceSSrinivas Kandagatla 1812809bcbceSSrinivas Kandagatla ucontrol->value.integer.value[0] = wsa->ear_spkr_gain; 1813809bcbceSSrinivas Kandagatla 1814809bcbceSSrinivas Kandagatla return 0; 1815809bcbceSSrinivas Kandagatla } 1816809bcbceSSrinivas Kandagatla 1817809bcbceSSrinivas Kandagatla static int wsa_macro_ear_spkr_pa_gain_put(struct snd_kcontrol *kcontrol, 1818809bcbceSSrinivas Kandagatla struct snd_ctl_elem_value *ucontrol) 1819809bcbceSSrinivas Kandagatla { 1820809bcbceSSrinivas Kandagatla struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); 1821809bcbceSSrinivas Kandagatla struct wsa_macro *wsa = snd_soc_component_get_drvdata(component); 1822809bcbceSSrinivas Kandagatla 1823809bcbceSSrinivas Kandagatla wsa->ear_spkr_gain = ucontrol->value.integer.value[0]; 1824809bcbceSSrinivas Kandagatla 1825809bcbceSSrinivas Kandagatla return 0; 1826809bcbceSSrinivas Kandagatla } 1827809bcbceSSrinivas Kandagatla 18282c4066e5SSrinivas Kandagatla static int wsa_macro_rx_mux_get(struct snd_kcontrol *kcontrol, 18292c4066e5SSrinivas Kandagatla struct snd_ctl_elem_value *ucontrol) 18302c4066e5SSrinivas Kandagatla { 18312c4066e5SSrinivas Kandagatla struct snd_soc_dapm_widget *widget = 18322c4066e5SSrinivas Kandagatla snd_soc_dapm_kcontrol_widget(kcontrol); 18332c4066e5SSrinivas Kandagatla struct snd_soc_component *component = 18342c4066e5SSrinivas Kandagatla snd_soc_dapm_to_component(widget->dapm); 18352c4066e5SSrinivas Kandagatla struct wsa_macro *wsa = snd_soc_component_get_drvdata(component); 18362c4066e5SSrinivas Kandagatla 18372c4066e5SSrinivas Kandagatla ucontrol->value.integer.value[0] = 18382c4066e5SSrinivas Kandagatla wsa->rx_port_value[widget->shift]; 18392c4066e5SSrinivas Kandagatla return 0; 18402c4066e5SSrinivas Kandagatla } 18412c4066e5SSrinivas Kandagatla 18422c4066e5SSrinivas Kandagatla static int wsa_macro_rx_mux_put(struct snd_kcontrol *kcontrol, 18432c4066e5SSrinivas Kandagatla struct snd_ctl_elem_value *ucontrol) 18442c4066e5SSrinivas Kandagatla { 18452c4066e5SSrinivas Kandagatla struct snd_soc_dapm_widget *widget = 18462c4066e5SSrinivas Kandagatla snd_soc_dapm_kcontrol_widget(kcontrol); 18472c4066e5SSrinivas Kandagatla struct snd_soc_component *component = 18482c4066e5SSrinivas Kandagatla snd_soc_dapm_to_component(widget->dapm); 18492c4066e5SSrinivas Kandagatla struct soc_enum *e = (struct soc_enum *)kcontrol->private_value; 18502c4066e5SSrinivas Kandagatla struct snd_soc_dapm_update *update = NULL; 18512c4066e5SSrinivas Kandagatla u32 rx_port_value = ucontrol->value.integer.value[0]; 18522c4066e5SSrinivas Kandagatla u32 bit_input; 18532c4066e5SSrinivas Kandagatla u32 aif_rst; 18542c4066e5SSrinivas Kandagatla struct wsa_macro *wsa = snd_soc_component_get_drvdata(component); 18552c4066e5SSrinivas Kandagatla 18562c4066e5SSrinivas Kandagatla aif_rst = wsa->rx_port_value[widget->shift]; 18572c4066e5SSrinivas Kandagatla if (!rx_port_value) { 18582c4066e5SSrinivas Kandagatla if (aif_rst == 0) { 18592c4066e5SSrinivas Kandagatla dev_err(component->dev, "%s: AIF reset already\n", __func__); 18602c4066e5SSrinivas Kandagatla return 0; 18612c4066e5SSrinivas Kandagatla } 18622c4066e5SSrinivas Kandagatla if (aif_rst >= WSA_MACRO_RX_MAX) { 18632c4066e5SSrinivas Kandagatla dev_err(component->dev, "%s: Invalid AIF reset\n", __func__); 18642c4066e5SSrinivas Kandagatla return 0; 18652c4066e5SSrinivas Kandagatla } 18662c4066e5SSrinivas Kandagatla } 18672c4066e5SSrinivas Kandagatla wsa->rx_port_value[widget->shift] = rx_port_value; 18682c4066e5SSrinivas Kandagatla 18692c4066e5SSrinivas Kandagatla bit_input = widget->shift; 18702c4066e5SSrinivas Kandagatla 18712c4066e5SSrinivas Kandagatla switch (rx_port_value) { 18722c4066e5SSrinivas Kandagatla case 0: 18732c4066e5SSrinivas Kandagatla if (wsa->active_ch_cnt[aif_rst]) { 18742c4066e5SSrinivas Kandagatla clear_bit(bit_input, 18752c4066e5SSrinivas Kandagatla &wsa->active_ch_mask[aif_rst]); 18762c4066e5SSrinivas Kandagatla wsa->active_ch_cnt[aif_rst]--; 18772c4066e5SSrinivas Kandagatla } 18782c4066e5SSrinivas Kandagatla break; 18792c4066e5SSrinivas Kandagatla case 1: 18802c4066e5SSrinivas Kandagatla case 2: 18812c4066e5SSrinivas Kandagatla set_bit(bit_input, 18822c4066e5SSrinivas Kandagatla &wsa->active_ch_mask[rx_port_value]); 18832c4066e5SSrinivas Kandagatla wsa->active_ch_cnt[rx_port_value]++; 18842c4066e5SSrinivas Kandagatla break; 18852c4066e5SSrinivas Kandagatla default: 18862c4066e5SSrinivas Kandagatla dev_err(component->dev, 18872c4066e5SSrinivas Kandagatla "%s: Invalid AIF_ID for WSA RX MUX %d\n", 18882c4066e5SSrinivas Kandagatla __func__, rx_port_value); 18892c4066e5SSrinivas Kandagatla return -EINVAL; 18902c4066e5SSrinivas Kandagatla } 18912c4066e5SSrinivas Kandagatla 18922c4066e5SSrinivas Kandagatla snd_soc_dapm_mux_update_power(widget->dapm, kcontrol, 18932c4066e5SSrinivas Kandagatla rx_port_value, e, update); 18942c4066e5SSrinivas Kandagatla return 0; 18952c4066e5SSrinivas Kandagatla } 18962c4066e5SSrinivas Kandagatla 1897809bcbceSSrinivas Kandagatla static int wsa_macro_soft_clip_enable_get(struct snd_kcontrol *kcontrol, 1898809bcbceSSrinivas Kandagatla struct snd_ctl_elem_value *ucontrol) 1899809bcbceSSrinivas Kandagatla { 1900809bcbceSSrinivas Kandagatla struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); 1901809bcbceSSrinivas Kandagatla struct wsa_macro *wsa = snd_soc_component_get_drvdata(component); 1902809bcbceSSrinivas Kandagatla int path = ((struct soc_mixer_control *)kcontrol->private_value)->shift; 1903809bcbceSSrinivas Kandagatla 1904809bcbceSSrinivas Kandagatla ucontrol->value.integer.value[0] = wsa->is_softclip_on[path]; 1905809bcbceSSrinivas Kandagatla 1906809bcbceSSrinivas Kandagatla return 0; 1907809bcbceSSrinivas Kandagatla } 1908809bcbceSSrinivas Kandagatla 1909809bcbceSSrinivas Kandagatla static int wsa_macro_soft_clip_enable_put(struct snd_kcontrol *kcontrol, 1910809bcbceSSrinivas Kandagatla struct snd_ctl_elem_value *ucontrol) 1911809bcbceSSrinivas Kandagatla { 1912809bcbceSSrinivas Kandagatla struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); 1913809bcbceSSrinivas Kandagatla struct wsa_macro *wsa = snd_soc_component_get_drvdata(component); 1914809bcbceSSrinivas Kandagatla int path = ((struct soc_mixer_control *) kcontrol->private_value)->shift; 1915809bcbceSSrinivas Kandagatla 1916809bcbceSSrinivas Kandagatla wsa->is_softclip_on[path] = ucontrol->value.integer.value[0]; 1917809bcbceSSrinivas Kandagatla 1918809bcbceSSrinivas Kandagatla return 0; 1919809bcbceSSrinivas Kandagatla } 1920809bcbceSSrinivas Kandagatla 1921809bcbceSSrinivas Kandagatla static const struct snd_kcontrol_new wsa_macro_snd_controls[] = { 1922809bcbceSSrinivas Kandagatla SOC_ENUM_EXT("EAR SPKR PA Gain", wsa_macro_ear_spkr_pa_gain_enum, 1923809bcbceSSrinivas Kandagatla wsa_macro_ear_spkr_pa_gain_get, 1924809bcbceSSrinivas Kandagatla wsa_macro_ear_spkr_pa_gain_put), 1925809bcbceSSrinivas Kandagatla SOC_SINGLE_EXT("WSA_Softclip0 Enable", SND_SOC_NOPM, 1926809bcbceSSrinivas Kandagatla WSA_MACRO_SOFTCLIP0, 1, 0, 1927809bcbceSSrinivas Kandagatla wsa_macro_soft_clip_enable_get, 1928809bcbceSSrinivas Kandagatla wsa_macro_soft_clip_enable_put), 1929809bcbceSSrinivas Kandagatla SOC_SINGLE_EXT("WSA_Softclip1 Enable", SND_SOC_NOPM, 1930809bcbceSSrinivas Kandagatla WSA_MACRO_SOFTCLIP1, 1, 0, 1931809bcbceSSrinivas Kandagatla wsa_macro_soft_clip_enable_get, 1932809bcbceSSrinivas Kandagatla wsa_macro_soft_clip_enable_put), 1933809bcbceSSrinivas Kandagatla 1934809bcbceSSrinivas Kandagatla SOC_SINGLE_S8_TLV("WSA_RX0 Digital Volume", CDC_WSA_RX0_RX_VOL_CTL, 1935809bcbceSSrinivas Kandagatla -84, 40, digital_gain), 1936809bcbceSSrinivas Kandagatla SOC_SINGLE_S8_TLV("WSA_RX1 Digital Volume", CDC_WSA_RX1_RX_VOL_CTL, 1937809bcbceSSrinivas Kandagatla -84, 40, digital_gain), 1938809bcbceSSrinivas Kandagatla 1939809bcbceSSrinivas Kandagatla SOC_SINGLE("WSA_RX0 Digital Mute", CDC_WSA_RX0_RX_PATH_CTL, 4, 1, 0), 1940809bcbceSSrinivas Kandagatla SOC_SINGLE("WSA_RX1 Digital Mute", CDC_WSA_RX1_RX_PATH_CTL, 4, 1, 0), 1941809bcbceSSrinivas Kandagatla SOC_SINGLE("WSA_RX0_MIX Digital Mute", CDC_WSA_RX0_RX_PATH_MIX_CTL, 4, 1942809bcbceSSrinivas Kandagatla 1, 0), 1943809bcbceSSrinivas Kandagatla SOC_SINGLE("WSA_RX1_MIX Digital Mute", CDC_WSA_RX1_RX_PATH_MIX_CTL, 4, 1944809bcbceSSrinivas Kandagatla 1, 0), 1945809bcbceSSrinivas Kandagatla SOC_SINGLE_EXT("WSA_COMP1 Switch", SND_SOC_NOPM, WSA_MACRO_COMP1, 1, 0, 1946809bcbceSSrinivas Kandagatla wsa_macro_get_compander, wsa_macro_set_compander), 1947809bcbceSSrinivas Kandagatla SOC_SINGLE_EXT("WSA_COMP2 Switch", SND_SOC_NOPM, WSA_MACRO_COMP2, 1, 0, 1948809bcbceSSrinivas Kandagatla wsa_macro_get_compander, wsa_macro_set_compander), 1949809bcbceSSrinivas Kandagatla SOC_SINGLE_EXT("WSA_RX0 EC_HQ Switch", SND_SOC_NOPM, WSA_MACRO_RX0, 1, 0, 1950809bcbceSSrinivas Kandagatla wsa_macro_get_ec_hq, wsa_macro_set_ec_hq), 1951809bcbceSSrinivas Kandagatla SOC_SINGLE_EXT("WSA_RX1 EC_HQ Switch", SND_SOC_NOPM, WSA_MACRO_RX1, 1, 0, 1952809bcbceSSrinivas Kandagatla wsa_macro_get_ec_hq, wsa_macro_set_ec_hq), 1953809bcbceSSrinivas Kandagatla }; 1954809bcbceSSrinivas Kandagatla 19552c4066e5SSrinivas Kandagatla static const struct soc_enum rx_mux_enum = 19562c4066e5SSrinivas Kandagatla SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(rx_mux_text), rx_mux_text); 19572c4066e5SSrinivas Kandagatla 19582c4066e5SSrinivas Kandagatla static const struct snd_kcontrol_new rx_mux[WSA_MACRO_RX_MAX] = { 19592c4066e5SSrinivas Kandagatla SOC_DAPM_ENUM_EXT("WSA RX0 Mux", rx_mux_enum, 19602c4066e5SSrinivas Kandagatla wsa_macro_rx_mux_get, wsa_macro_rx_mux_put), 19612c4066e5SSrinivas Kandagatla SOC_DAPM_ENUM_EXT("WSA RX1 Mux", rx_mux_enum, 19622c4066e5SSrinivas Kandagatla wsa_macro_rx_mux_get, wsa_macro_rx_mux_put), 19632c4066e5SSrinivas Kandagatla SOC_DAPM_ENUM_EXT("WSA RX_MIX0 Mux", rx_mux_enum, 19642c4066e5SSrinivas Kandagatla wsa_macro_rx_mux_get, wsa_macro_rx_mux_put), 19652c4066e5SSrinivas Kandagatla SOC_DAPM_ENUM_EXT("WSA RX_MIX1 Mux", rx_mux_enum, 19662c4066e5SSrinivas Kandagatla wsa_macro_rx_mux_get, wsa_macro_rx_mux_put), 19672c4066e5SSrinivas Kandagatla }; 19682c4066e5SSrinivas Kandagatla 19692c4066e5SSrinivas Kandagatla static int wsa_macro_vi_feed_mixer_get(struct snd_kcontrol *kcontrol, 19702c4066e5SSrinivas Kandagatla struct snd_ctl_elem_value *ucontrol) 19712c4066e5SSrinivas Kandagatla { 19722c4066e5SSrinivas Kandagatla struct snd_soc_dapm_widget *widget = snd_soc_dapm_kcontrol_widget(kcontrol); 19732c4066e5SSrinivas Kandagatla struct snd_soc_component *component = snd_soc_dapm_to_component(widget->dapm); 19742c4066e5SSrinivas Kandagatla struct soc_mixer_control *mixer = (struct soc_mixer_control *)kcontrol->private_value; 19752c4066e5SSrinivas Kandagatla struct wsa_macro *wsa = snd_soc_component_get_drvdata(component); 19762c4066e5SSrinivas Kandagatla u32 spk_tx_id = mixer->shift; 19772c4066e5SSrinivas Kandagatla u32 dai_id = widget->shift; 19782c4066e5SSrinivas Kandagatla 19792c4066e5SSrinivas Kandagatla if (test_bit(spk_tx_id, &wsa->active_ch_mask[dai_id])) 19802c4066e5SSrinivas Kandagatla ucontrol->value.integer.value[0] = 1; 19812c4066e5SSrinivas Kandagatla else 19822c4066e5SSrinivas Kandagatla ucontrol->value.integer.value[0] = 0; 19832c4066e5SSrinivas Kandagatla 19842c4066e5SSrinivas Kandagatla return 0; 19852c4066e5SSrinivas Kandagatla } 19862c4066e5SSrinivas Kandagatla 19872c4066e5SSrinivas Kandagatla static int wsa_macro_vi_feed_mixer_put(struct snd_kcontrol *kcontrol, 19882c4066e5SSrinivas Kandagatla struct snd_ctl_elem_value *ucontrol) 19892c4066e5SSrinivas Kandagatla { 19902c4066e5SSrinivas Kandagatla struct snd_soc_dapm_widget *widget = snd_soc_dapm_kcontrol_widget(kcontrol); 19912c4066e5SSrinivas Kandagatla struct snd_soc_component *component = snd_soc_dapm_to_component(widget->dapm); 19922c4066e5SSrinivas Kandagatla struct soc_mixer_control *mixer = (struct soc_mixer_control *)kcontrol->private_value; 19932c4066e5SSrinivas Kandagatla struct wsa_macro *wsa = snd_soc_component_get_drvdata(component); 19942c4066e5SSrinivas Kandagatla u32 enable = ucontrol->value.integer.value[0]; 19952c4066e5SSrinivas Kandagatla u32 spk_tx_id = mixer->shift; 19962c4066e5SSrinivas Kandagatla 19972c4066e5SSrinivas Kandagatla if (enable) { 19982c4066e5SSrinivas Kandagatla if (spk_tx_id == WSA_MACRO_TX0 && 19992c4066e5SSrinivas Kandagatla !test_bit(WSA_MACRO_TX0, 20002c4066e5SSrinivas Kandagatla &wsa->active_ch_mask[WSA_MACRO_AIF_VI])) { 20012c4066e5SSrinivas Kandagatla set_bit(WSA_MACRO_TX0, 20022c4066e5SSrinivas Kandagatla &wsa->active_ch_mask[WSA_MACRO_AIF_VI]); 20032c4066e5SSrinivas Kandagatla wsa->active_ch_cnt[WSA_MACRO_AIF_VI]++; 20042c4066e5SSrinivas Kandagatla } 20052c4066e5SSrinivas Kandagatla if (spk_tx_id == WSA_MACRO_TX1 && 20062c4066e5SSrinivas Kandagatla !test_bit(WSA_MACRO_TX1, 20072c4066e5SSrinivas Kandagatla &wsa->active_ch_mask[WSA_MACRO_AIF_VI])) { 20082c4066e5SSrinivas Kandagatla set_bit(WSA_MACRO_TX1, 20092c4066e5SSrinivas Kandagatla &wsa->active_ch_mask[WSA_MACRO_AIF_VI]); 20102c4066e5SSrinivas Kandagatla wsa->active_ch_cnt[WSA_MACRO_AIF_VI]++; 20112c4066e5SSrinivas Kandagatla } 20122c4066e5SSrinivas Kandagatla } else { 20132c4066e5SSrinivas Kandagatla if (spk_tx_id == WSA_MACRO_TX0 && 20142c4066e5SSrinivas Kandagatla test_bit(WSA_MACRO_TX0, 20152c4066e5SSrinivas Kandagatla &wsa->active_ch_mask[WSA_MACRO_AIF_VI])) { 20162c4066e5SSrinivas Kandagatla clear_bit(WSA_MACRO_TX0, 20172c4066e5SSrinivas Kandagatla &wsa->active_ch_mask[WSA_MACRO_AIF_VI]); 20182c4066e5SSrinivas Kandagatla wsa->active_ch_cnt[WSA_MACRO_AIF_VI]--; 20192c4066e5SSrinivas Kandagatla } 20202c4066e5SSrinivas Kandagatla if (spk_tx_id == WSA_MACRO_TX1 && 20212c4066e5SSrinivas Kandagatla test_bit(WSA_MACRO_TX1, 20222c4066e5SSrinivas Kandagatla &wsa->active_ch_mask[WSA_MACRO_AIF_VI])) { 20232c4066e5SSrinivas Kandagatla clear_bit(WSA_MACRO_TX1, 20242c4066e5SSrinivas Kandagatla &wsa->active_ch_mask[WSA_MACRO_AIF_VI]); 20252c4066e5SSrinivas Kandagatla wsa->active_ch_cnt[WSA_MACRO_AIF_VI]--; 20262c4066e5SSrinivas Kandagatla } 20272c4066e5SSrinivas Kandagatla } 20282c4066e5SSrinivas Kandagatla snd_soc_dapm_mixer_update_power(widget->dapm, kcontrol, enable, NULL); 20292c4066e5SSrinivas Kandagatla 20302c4066e5SSrinivas Kandagatla return 0; 20312c4066e5SSrinivas Kandagatla } 20322c4066e5SSrinivas Kandagatla 20332c4066e5SSrinivas Kandagatla static const struct snd_kcontrol_new aif_vi_mixer[] = { 20342c4066e5SSrinivas Kandagatla SOC_SINGLE_EXT("WSA_SPKR_VI_1", SND_SOC_NOPM, WSA_MACRO_TX0, 1, 0, 20352c4066e5SSrinivas Kandagatla wsa_macro_vi_feed_mixer_get, 20362c4066e5SSrinivas Kandagatla wsa_macro_vi_feed_mixer_put), 20372c4066e5SSrinivas Kandagatla SOC_SINGLE_EXT("WSA_SPKR_VI_2", SND_SOC_NOPM, WSA_MACRO_TX1, 1, 0, 20382c4066e5SSrinivas Kandagatla wsa_macro_vi_feed_mixer_get, 20392c4066e5SSrinivas Kandagatla wsa_macro_vi_feed_mixer_put), 20402c4066e5SSrinivas Kandagatla }; 20412c4066e5SSrinivas Kandagatla 20422c4066e5SSrinivas Kandagatla static const struct snd_soc_dapm_widget wsa_macro_dapm_widgets[] = { 20432c4066e5SSrinivas Kandagatla SND_SOC_DAPM_AIF_IN("WSA AIF1 PB", "WSA_AIF1 Playback", 0, 20442c4066e5SSrinivas Kandagatla SND_SOC_NOPM, 0, 0), 20452c4066e5SSrinivas Kandagatla SND_SOC_DAPM_AIF_IN("WSA AIF_MIX1 PB", "WSA_AIF_MIX1 Playback", 0, 20462c4066e5SSrinivas Kandagatla SND_SOC_NOPM, 0, 0), 20472c4066e5SSrinivas Kandagatla 20482c4066e5SSrinivas Kandagatla SND_SOC_DAPM_AIF_OUT_E("WSA AIF_VI", "WSA_AIF_VI Capture", 0, 20492c4066e5SSrinivas Kandagatla SND_SOC_NOPM, WSA_MACRO_AIF_VI, 0, 20502c4066e5SSrinivas Kandagatla wsa_macro_enable_vi_feedback, 20512c4066e5SSrinivas Kandagatla SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD), 20522c4066e5SSrinivas Kandagatla SND_SOC_DAPM_AIF_OUT("WSA AIF_ECHO", "WSA_AIF_ECHO Capture", 0, 20532c4066e5SSrinivas Kandagatla SND_SOC_NOPM, 0, 0), 20542c4066e5SSrinivas Kandagatla 20552c4066e5SSrinivas Kandagatla SND_SOC_DAPM_MIXER("WSA_AIF_VI Mixer", SND_SOC_NOPM, WSA_MACRO_AIF_VI, 20562c4066e5SSrinivas Kandagatla 0, aif_vi_mixer, ARRAY_SIZE(aif_vi_mixer)), 20572c4066e5SSrinivas Kandagatla SND_SOC_DAPM_MUX_E("WSA RX_MIX EC0_MUX", SND_SOC_NOPM, 20582c4066e5SSrinivas Kandagatla WSA_MACRO_EC0_MUX, 0, 20592c4066e5SSrinivas Kandagatla &rx_mix_ec0_mux, wsa_macro_enable_echo, 20602c4066e5SSrinivas Kandagatla SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), 20612c4066e5SSrinivas Kandagatla SND_SOC_DAPM_MUX_E("WSA RX_MIX EC1_MUX", SND_SOC_NOPM, 20622c4066e5SSrinivas Kandagatla WSA_MACRO_EC1_MUX, 0, 20632c4066e5SSrinivas Kandagatla &rx_mix_ec1_mux, wsa_macro_enable_echo, 20642c4066e5SSrinivas Kandagatla SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), 20652c4066e5SSrinivas Kandagatla 20662c4066e5SSrinivas Kandagatla SND_SOC_DAPM_MUX("WSA RX0 MUX", SND_SOC_NOPM, WSA_MACRO_RX0, 0, 20672c4066e5SSrinivas Kandagatla &rx_mux[WSA_MACRO_RX0]), 20682c4066e5SSrinivas Kandagatla SND_SOC_DAPM_MUX("WSA RX1 MUX", SND_SOC_NOPM, WSA_MACRO_RX1, 0, 20692c4066e5SSrinivas Kandagatla &rx_mux[WSA_MACRO_RX1]), 20702c4066e5SSrinivas Kandagatla SND_SOC_DAPM_MUX("WSA RX_MIX0 MUX", SND_SOC_NOPM, WSA_MACRO_RX_MIX0, 0, 20712c4066e5SSrinivas Kandagatla &rx_mux[WSA_MACRO_RX_MIX0]), 20722c4066e5SSrinivas Kandagatla SND_SOC_DAPM_MUX("WSA RX_MIX1 MUX", SND_SOC_NOPM, WSA_MACRO_RX_MIX1, 0, 20732c4066e5SSrinivas Kandagatla &rx_mux[WSA_MACRO_RX_MIX1]), 20742c4066e5SSrinivas Kandagatla 20752c4066e5SSrinivas Kandagatla SND_SOC_DAPM_MIXER("WSA RX0", SND_SOC_NOPM, 0, 0, NULL, 0), 20762c4066e5SSrinivas Kandagatla SND_SOC_DAPM_MIXER("WSA RX1", SND_SOC_NOPM, 0, 0, NULL, 0), 20772c4066e5SSrinivas Kandagatla SND_SOC_DAPM_MIXER("WSA RX_MIX0", SND_SOC_NOPM, 0, 0, NULL, 0), 20782c4066e5SSrinivas Kandagatla SND_SOC_DAPM_MIXER("WSA RX_MIX1", SND_SOC_NOPM, 0, 0, NULL, 0), 20792c4066e5SSrinivas Kandagatla 20802c4066e5SSrinivas Kandagatla SND_SOC_DAPM_MUX("WSA_RX0 INP0", SND_SOC_NOPM, 0, 0, &rx0_prim_inp0_mux), 20812c4066e5SSrinivas Kandagatla SND_SOC_DAPM_MUX("WSA_RX0 INP1", SND_SOC_NOPM, 0, 0, &rx0_prim_inp1_mux), 20822c4066e5SSrinivas Kandagatla SND_SOC_DAPM_MUX("WSA_RX0 INP2", SND_SOC_NOPM, 0, 0, &rx0_prim_inp2_mux), 2083e4b8b7c9SJonathan Marek SND_SOC_DAPM_MUX_E("WSA_RX0 MIX INP", SND_SOC_NOPM, WSA_MACRO_RX_MIX0, 2084e4b8b7c9SJonathan Marek 0, &rx0_mix_mux, wsa_macro_enable_mix_path, 20852c4066e5SSrinivas Kandagatla SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), 20862c4066e5SSrinivas Kandagatla SND_SOC_DAPM_MUX("WSA_RX1 INP0", SND_SOC_NOPM, 0, 0, &rx1_prim_inp0_mux), 20872c4066e5SSrinivas Kandagatla SND_SOC_DAPM_MUX("WSA_RX1 INP1", SND_SOC_NOPM, 0, 0, &rx1_prim_inp1_mux), 20882c4066e5SSrinivas Kandagatla SND_SOC_DAPM_MUX("WSA_RX1 INP2", SND_SOC_NOPM, 0, 0, &rx1_prim_inp2_mux), 2089e4b8b7c9SJonathan Marek SND_SOC_DAPM_MUX_E("WSA_RX1 MIX INP", SND_SOC_NOPM, WSA_MACRO_RX_MIX1, 2090e4b8b7c9SJonathan Marek 0, &rx1_mix_mux, wsa_macro_enable_mix_path, 20912c4066e5SSrinivas Kandagatla SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), 20922c4066e5SSrinivas Kandagatla 20932c4066e5SSrinivas Kandagatla SND_SOC_DAPM_MIXER_E("WSA_RX INT0 MIX", SND_SOC_NOPM, 0, 0, NULL, 0, 20942c4066e5SSrinivas Kandagatla wsa_macro_enable_main_path, SND_SOC_DAPM_PRE_PMU), 20952c4066e5SSrinivas Kandagatla SND_SOC_DAPM_MIXER_E("WSA_RX INT1 MIX", SND_SOC_NOPM, 1, 0, NULL, 0, 20962c4066e5SSrinivas Kandagatla wsa_macro_enable_main_path, SND_SOC_DAPM_PRE_PMU), 20972c4066e5SSrinivas Kandagatla 20982c4066e5SSrinivas Kandagatla SND_SOC_DAPM_MIXER("WSA_RX INT0 SEC MIX", SND_SOC_NOPM, 0, 0, NULL, 0), 20992c4066e5SSrinivas Kandagatla SND_SOC_DAPM_MIXER("WSA_RX INT1 SEC MIX", SND_SOC_NOPM, 0, 0, NULL, 0), 21002c4066e5SSrinivas Kandagatla 21012c4066e5SSrinivas Kandagatla SND_SOC_DAPM_MUX("WSA_RX0 INT0 SIDETONE MIX", CDC_WSA_RX0_RX_PATH_CFG1, 21022c4066e5SSrinivas Kandagatla 4, 0, &rx0_sidetone_mix_mux), 21032c4066e5SSrinivas Kandagatla 21042c4066e5SSrinivas Kandagatla SND_SOC_DAPM_INPUT("WSA SRC0_INP"), 21052c4066e5SSrinivas Kandagatla SND_SOC_DAPM_INPUT("WSA_TX DEC0_INP"), 21062c4066e5SSrinivas Kandagatla SND_SOC_DAPM_INPUT("WSA_TX DEC1_INP"), 21072c4066e5SSrinivas Kandagatla 21082c4066e5SSrinivas Kandagatla SND_SOC_DAPM_MIXER_E("WSA_RX INT0 INTERP", SND_SOC_NOPM, 21092c4066e5SSrinivas Kandagatla WSA_MACRO_COMP1, 0, NULL, 0, 21102c4066e5SSrinivas Kandagatla wsa_macro_enable_interpolator, 21112c4066e5SSrinivas Kandagatla SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | 21122c4066e5SSrinivas Kandagatla SND_SOC_DAPM_POST_PMD), 21132c4066e5SSrinivas Kandagatla 21142c4066e5SSrinivas Kandagatla SND_SOC_DAPM_MIXER_E("WSA_RX INT1 INTERP", SND_SOC_NOPM, 21152c4066e5SSrinivas Kandagatla WSA_MACRO_COMP2, 0, NULL, 0, 21162c4066e5SSrinivas Kandagatla wsa_macro_enable_interpolator, 21172c4066e5SSrinivas Kandagatla SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | 21182c4066e5SSrinivas Kandagatla SND_SOC_DAPM_POST_PMD), 21192c4066e5SSrinivas Kandagatla 21202c4066e5SSrinivas Kandagatla SND_SOC_DAPM_MIXER_E("WSA_RX INT0 CHAIN", SND_SOC_NOPM, 0, 0, 21212c4066e5SSrinivas Kandagatla NULL, 0, wsa_macro_spk_boost_event, 21222c4066e5SSrinivas Kandagatla SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | 21232c4066e5SSrinivas Kandagatla SND_SOC_DAPM_POST_PMD), 21242c4066e5SSrinivas Kandagatla 21252c4066e5SSrinivas Kandagatla SND_SOC_DAPM_MIXER_E("WSA_RX INT1 CHAIN", SND_SOC_NOPM, 0, 0, 21262c4066e5SSrinivas Kandagatla NULL, 0, wsa_macro_spk_boost_event, 21272c4066e5SSrinivas Kandagatla SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | 21282c4066e5SSrinivas Kandagatla SND_SOC_DAPM_POST_PMD), 21292c4066e5SSrinivas Kandagatla 21302c4066e5SSrinivas Kandagatla SND_SOC_DAPM_INPUT("VIINPUT_WSA"), 21312c4066e5SSrinivas Kandagatla SND_SOC_DAPM_OUTPUT("WSA_SPK1 OUT"), 21322c4066e5SSrinivas Kandagatla SND_SOC_DAPM_OUTPUT("WSA_SPK2 OUT"), 21332c4066e5SSrinivas Kandagatla 21342c4066e5SSrinivas Kandagatla SND_SOC_DAPM_SUPPLY("WSA_RX0_CLK", CDC_WSA_RX0_RX_PATH_CTL, 5, 0, NULL, 0), 21352c4066e5SSrinivas Kandagatla SND_SOC_DAPM_SUPPLY("WSA_RX1_CLK", CDC_WSA_RX1_RX_PATH_CTL, 5, 0, NULL, 0), 21362c4066e5SSrinivas Kandagatla SND_SOC_DAPM_SUPPLY("WSA_RX_MIX0_CLK", CDC_WSA_RX0_RX_PATH_MIX_CTL, 5, 0, NULL, 0), 21372c4066e5SSrinivas Kandagatla SND_SOC_DAPM_SUPPLY("WSA_RX_MIX1_CLK", CDC_WSA_RX1_RX_PATH_MIX_CTL, 5, 0, NULL, 0), 21382c4066e5SSrinivas Kandagatla SND_SOC_DAPM_SUPPLY_S("WSA_MCLK", 0, SND_SOC_NOPM, 0, 0, 21392c4066e5SSrinivas Kandagatla wsa_macro_mclk_event, 21402c4066e5SSrinivas Kandagatla SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), 21412c4066e5SSrinivas Kandagatla }; 21422c4066e5SSrinivas Kandagatla 21432c4066e5SSrinivas Kandagatla static const struct snd_soc_dapm_route wsa_audio_map[] = { 21442c4066e5SSrinivas Kandagatla /* VI Feedback */ 21452c4066e5SSrinivas Kandagatla {"WSA_AIF_VI Mixer", "WSA_SPKR_VI_1", "VIINPUT_WSA"}, 21462c4066e5SSrinivas Kandagatla {"WSA_AIF_VI Mixer", "WSA_SPKR_VI_2", "VIINPUT_WSA"}, 21472c4066e5SSrinivas Kandagatla {"WSA AIF_VI", NULL, "WSA_AIF_VI Mixer"}, 21482c4066e5SSrinivas Kandagatla {"WSA AIF_VI", NULL, "WSA_MCLK"}, 21492c4066e5SSrinivas Kandagatla 21502c4066e5SSrinivas Kandagatla {"WSA RX_MIX EC0_MUX", "RX_MIX_TX0", "WSA_RX INT0 SEC MIX"}, 21512c4066e5SSrinivas Kandagatla {"WSA RX_MIX EC1_MUX", "RX_MIX_TX0", "WSA_RX INT0 SEC MIX"}, 21522c4066e5SSrinivas Kandagatla {"WSA RX_MIX EC0_MUX", "RX_MIX_TX1", "WSA_RX INT1 SEC MIX"}, 21532c4066e5SSrinivas Kandagatla {"WSA RX_MIX EC1_MUX", "RX_MIX_TX1", "WSA_RX INT1 SEC MIX"}, 21542c4066e5SSrinivas Kandagatla {"WSA AIF_ECHO", NULL, "WSA RX_MIX EC0_MUX"}, 21552c4066e5SSrinivas Kandagatla {"WSA AIF_ECHO", NULL, "WSA RX_MIX EC1_MUX"}, 21562c4066e5SSrinivas Kandagatla {"WSA AIF_ECHO", NULL, "WSA_MCLK"}, 21572c4066e5SSrinivas Kandagatla 21582c4066e5SSrinivas Kandagatla {"WSA AIF1 PB", NULL, "WSA_MCLK"}, 21592c4066e5SSrinivas Kandagatla {"WSA AIF_MIX1 PB", NULL, "WSA_MCLK"}, 21602c4066e5SSrinivas Kandagatla 21612c4066e5SSrinivas Kandagatla {"WSA RX0 MUX", "AIF1_PB", "WSA AIF1 PB"}, 21622c4066e5SSrinivas Kandagatla {"WSA RX1 MUX", "AIF1_PB", "WSA AIF1 PB"}, 21632c4066e5SSrinivas Kandagatla {"WSA RX_MIX0 MUX", "AIF1_PB", "WSA AIF1 PB"}, 21642c4066e5SSrinivas Kandagatla {"WSA RX_MIX1 MUX", "AIF1_PB", "WSA AIF1 PB"}, 21652c4066e5SSrinivas Kandagatla 21662c4066e5SSrinivas Kandagatla {"WSA RX0 MUX", "AIF_MIX1_PB", "WSA AIF_MIX1 PB"}, 21672c4066e5SSrinivas Kandagatla {"WSA RX1 MUX", "AIF_MIX1_PB", "WSA AIF_MIX1 PB"}, 21682c4066e5SSrinivas Kandagatla {"WSA RX_MIX0 MUX", "AIF_MIX1_PB", "WSA AIF_MIX1 PB"}, 21692c4066e5SSrinivas Kandagatla {"WSA RX_MIX1 MUX", "AIF_MIX1_PB", "WSA AIF_MIX1 PB"}, 21702c4066e5SSrinivas Kandagatla 21712c4066e5SSrinivas Kandagatla {"WSA RX0", NULL, "WSA RX0 MUX"}, 21722c4066e5SSrinivas Kandagatla {"WSA RX1", NULL, "WSA RX1 MUX"}, 21732c4066e5SSrinivas Kandagatla {"WSA RX_MIX0", NULL, "WSA RX_MIX0 MUX"}, 21742c4066e5SSrinivas Kandagatla {"WSA RX_MIX1", NULL, "WSA RX_MIX1 MUX"}, 21752c4066e5SSrinivas Kandagatla 21762c4066e5SSrinivas Kandagatla {"WSA RX0", NULL, "WSA_RX0_CLK"}, 21772c4066e5SSrinivas Kandagatla {"WSA RX1", NULL, "WSA_RX1_CLK"}, 21782c4066e5SSrinivas Kandagatla {"WSA RX_MIX0", NULL, "WSA_RX_MIX0_CLK"}, 21792c4066e5SSrinivas Kandagatla {"WSA RX_MIX1", NULL, "WSA_RX_MIX1_CLK"}, 21802c4066e5SSrinivas Kandagatla 21812c4066e5SSrinivas Kandagatla {"WSA_RX0 INP0", "RX0", "WSA RX0"}, 21822c4066e5SSrinivas Kandagatla {"WSA_RX0 INP0", "RX1", "WSA RX1"}, 21832c4066e5SSrinivas Kandagatla {"WSA_RX0 INP0", "RX_MIX0", "WSA RX_MIX0"}, 21842c4066e5SSrinivas Kandagatla {"WSA_RX0 INP0", "RX_MIX1", "WSA RX_MIX1"}, 21852c4066e5SSrinivas Kandagatla {"WSA_RX0 INP0", "DEC0", "WSA_TX DEC0_INP"}, 21862c4066e5SSrinivas Kandagatla {"WSA_RX0 INP0", "DEC1", "WSA_TX DEC1_INP"}, 21872c4066e5SSrinivas Kandagatla {"WSA_RX INT0 MIX", NULL, "WSA_RX0 INP0"}, 21882c4066e5SSrinivas Kandagatla 21892c4066e5SSrinivas Kandagatla {"WSA_RX0 INP1", "RX0", "WSA RX0"}, 21902c4066e5SSrinivas Kandagatla {"WSA_RX0 INP1", "RX1", "WSA RX1"}, 21912c4066e5SSrinivas Kandagatla {"WSA_RX0 INP1", "RX_MIX0", "WSA RX_MIX0"}, 21922c4066e5SSrinivas Kandagatla {"WSA_RX0 INP1", "RX_MIX1", "WSA RX_MIX1"}, 21932c4066e5SSrinivas Kandagatla {"WSA_RX0 INP1", "DEC0", "WSA_TX DEC0_INP"}, 21942c4066e5SSrinivas Kandagatla {"WSA_RX0 INP1", "DEC1", "WSA_TX DEC1_INP"}, 21952c4066e5SSrinivas Kandagatla {"WSA_RX INT0 MIX", NULL, "WSA_RX0 INP1"}, 21962c4066e5SSrinivas Kandagatla 21972c4066e5SSrinivas Kandagatla {"WSA_RX0 INP2", "RX0", "WSA RX0"}, 21982c4066e5SSrinivas Kandagatla {"WSA_RX0 INP2", "RX1", "WSA RX1"}, 21992c4066e5SSrinivas Kandagatla {"WSA_RX0 INP2", "RX_MIX0", "WSA RX_MIX0"}, 22002c4066e5SSrinivas Kandagatla {"WSA_RX0 INP2", "RX_MIX1", "WSA RX_MIX1"}, 22012c4066e5SSrinivas Kandagatla {"WSA_RX0 INP2", "DEC0", "WSA_TX DEC0_INP"}, 22022c4066e5SSrinivas Kandagatla {"WSA_RX0 INP2", "DEC1", "WSA_TX DEC1_INP"}, 22032c4066e5SSrinivas Kandagatla {"WSA_RX INT0 MIX", NULL, "WSA_RX0 INP2"}, 22042c4066e5SSrinivas Kandagatla 22052c4066e5SSrinivas Kandagatla {"WSA_RX0 MIX INP", "RX0", "WSA RX0"}, 22062c4066e5SSrinivas Kandagatla {"WSA_RX0 MIX INP", "RX1", "WSA RX1"}, 22072c4066e5SSrinivas Kandagatla {"WSA_RX0 MIX INP", "RX_MIX0", "WSA RX_MIX0"}, 22082c4066e5SSrinivas Kandagatla {"WSA_RX0 MIX INP", "RX_MIX1", "WSA RX_MIX1"}, 22092c4066e5SSrinivas Kandagatla {"WSA_RX INT0 SEC MIX", NULL, "WSA_RX0 MIX INP"}, 22102c4066e5SSrinivas Kandagatla 22112c4066e5SSrinivas Kandagatla {"WSA_RX INT0 SEC MIX", NULL, "WSA_RX INT0 MIX"}, 22122c4066e5SSrinivas Kandagatla {"WSA_RX INT0 INTERP", NULL, "WSA_RX INT0 SEC MIX"}, 22132c4066e5SSrinivas Kandagatla {"WSA_RX0 INT0 SIDETONE MIX", "SRC0", "WSA SRC0_INP"}, 22142c4066e5SSrinivas Kandagatla {"WSA_RX INT0 INTERP", NULL, "WSA_RX0 INT0 SIDETONE MIX"}, 22152c4066e5SSrinivas Kandagatla {"WSA_RX INT0 CHAIN", NULL, "WSA_RX INT0 INTERP"}, 22162c4066e5SSrinivas Kandagatla 22172c4066e5SSrinivas Kandagatla {"WSA_SPK1 OUT", NULL, "WSA_RX INT0 CHAIN"}, 22182c4066e5SSrinivas Kandagatla {"WSA_SPK1 OUT", NULL, "WSA_MCLK"}, 22192c4066e5SSrinivas Kandagatla 22202c4066e5SSrinivas Kandagatla {"WSA_RX1 INP0", "RX0", "WSA RX0"}, 22212c4066e5SSrinivas Kandagatla {"WSA_RX1 INP0", "RX1", "WSA RX1"}, 22222c4066e5SSrinivas Kandagatla {"WSA_RX1 INP0", "RX_MIX0", "WSA RX_MIX0"}, 22232c4066e5SSrinivas Kandagatla {"WSA_RX1 INP0", "RX_MIX1", "WSA RX_MIX1"}, 22242c4066e5SSrinivas Kandagatla {"WSA_RX1 INP0", "DEC0", "WSA_TX DEC0_INP"}, 22252c4066e5SSrinivas Kandagatla {"WSA_RX1 INP0", "DEC1", "WSA_TX DEC1_INP"}, 22262c4066e5SSrinivas Kandagatla {"WSA_RX INT1 MIX", NULL, "WSA_RX1 INP0"}, 22272c4066e5SSrinivas Kandagatla 22282c4066e5SSrinivas Kandagatla {"WSA_RX1 INP1", "RX0", "WSA RX0"}, 22292c4066e5SSrinivas Kandagatla {"WSA_RX1 INP1", "RX1", "WSA RX1"}, 22302c4066e5SSrinivas Kandagatla {"WSA_RX1 INP1", "RX_MIX0", "WSA RX_MIX0"}, 22312c4066e5SSrinivas Kandagatla {"WSA_RX1 INP1", "RX_MIX1", "WSA RX_MIX1"}, 22322c4066e5SSrinivas Kandagatla {"WSA_RX1 INP1", "DEC0", "WSA_TX DEC0_INP"}, 22332c4066e5SSrinivas Kandagatla {"WSA_RX1 INP1", "DEC1", "WSA_TX DEC1_INP"}, 22342c4066e5SSrinivas Kandagatla {"WSA_RX INT1 MIX", NULL, "WSA_RX1 INP1"}, 22352c4066e5SSrinivas Kandagatla 22362c4066e5SSrinivas Kandagatla {"WSA_RX1 INP2", "RX0", "WSA RX0"}, 22372c4066e5SSrinivas Kandagatla {"WSA_RX1 INP2", "RX1", "WSA RX1"}, 22382c4066e5SSrinivas Kandagatla {"WSA_RX1 INP2", "RX_MIX0", "WSA RX_MIX0"}, 22392c4066e5SSrinivas Kandagatla {"WSA_RX1 INP2", "RX_MIX1", "WSA RX_MIX1"}, 22402c4066e5SSrinivas Kandagatla {"WSA_RX1 INP2", "DEC0", "WSA_TX DEC0_INP"}, 22412c4066e5SSrinivas Kandagatla {"WSA_RX1 INP2", "DEC1", "WSA_TX DEC1_INP"}, 22422c4066e5SSrinivas Kandagatla {"WSA_RX INT1 MIX", NULL, "WSA_RX1 INP2"}, 22432c4066e5SSrinivas Kandagatla 22442c4066e5SSrinivas Kandagatla {"WSA_RX1 MIX INP", "RX0", "WSA RX0"}, 22452c4066e5SSrinivas Kandagatla {"WSA_RX1 MIX INP", "RX1", "WSA RX1"}, 22462c4066e5SSrinivas Kandagatla {"WSA_RX1 MIX INP", "RX_MIX0", "WSA RX_MIX0"}, 22472c4066e5SSrinivas Kandagatla {"WSA_RX1 MIX INP", "RX_MIX1", "WSA RX_MIX1"}, 22482c4066e5SSrinivas Kandagatla {"WSA_RX INT1 SEC MIX", NULL, "WSA_RX1 MIX INP"}, 22492c4066e5SSrinivas Kandagatla 22502c4066e5SSrinivas Kandagatla {"WSA_RX INT1 SEC MIX", NULL, "WSA_RX INT1 MIX"}, 22512c4066e5SSrinivas Kandagatla {"WSA_RX INT1 INTERP", NULL, "WSA_RX INT1 SEC MIX"}, 22522c4066e5SSrinivas Kandagatla 22532c4066e5SSrinivas Kandagatla {"WSA_RX INT1 CHAIN", NULL, "WSA_RX INT1 INTERP"}, 22542c4066e5SSrinivas Kandagatla {"WSA_SPK2 OUT", NULL, "WSA_RX INT1 CHAIN"}, 22552c4066e5SSrinivas Kandagatla {"WSA_SPK2 OUT", NULL, "WSA_MCLK"}, 22562c4066e5SSrinivas Kandagatla }; 22572c4066e5SSrinivas Kandagatla 2258809bcbceSSrinivas Kandagatla static int wsa_swrm_clock(struct wsa_macro *wsa, bool enable) 2259809bcbceSSrinivas Kandagatla { 2260809bcbceSSrinivas Kandagatla struct regmap *regmap = wsa->regmap; 2261809bcbceSSrinivas Kandagatla 2262809bcbceSSrinivas Kandagatla if (enable) { 2263809bcbceSSrinivas Kandagatla wsa_macro_mclk_enable(wsa, true); 2264809bcbceSSrinivas Kandagatla 2265809bcbceSSrinivas Kandagatla /* reset swr ip */ 2266809bcbceSSrinivas Kandagatla if (wsa->reset_swr) 2267809bcbceSSrinivas Kandagatla regmap_update_bits(regmap, 2268809bcbceSSrinivas Kandagatla CDC_WSA_CLK_RST_CTRL_SWR_CONTROL, 2269809bcbceSSrinivas Kandagatla CDC_WSA_SWR_RST_EN_MASK, 2270809bcbceSSrinivas Kandagatla CDC_WSA_SWR_RST_ENABLE); 2271809bcbceSSrinivas Kandagatla 2272809bcbceSSrinivas Kandagatla regmap_update_bits(regmap, CDC_WSA_CLK_RST_CTRL_SWR_CONTROL, 2273809bcbceSSrinivas Kandagatla CDC_WSA_SWR_CLK_EN_MASK, 2274809bcbceSSrinivas Kandagatla CDC_WSA_SWR_CLK_ENABLE); 2275809bcbceSSrinivas Kandagatla 2276809bcbceSSrinivas Kandagatla /* Bring out of reset */ 2277809bcbceSSrinivas Kandagatla if (wsa->reset_swr) 2278809bcbceSSrinivas Kandagatla regmap_update_bits(regmap, 2279809bcbceSSrinivas Kandagatla CDC_WSA_CLK_RST_CTRL_SWR_CONTROL, 2280809bcbceSSrinivas Kandagatla CDC_WSA_SWR_RST_EN_MASK, 2281809bcbceSSrinivas Kandagatla CDC_WSA_SWR_RST_DISABLE); 2282809bcbceSSrinivas Kandagatla wsa->reset_swr = false; 2283809bcbceSSrinivas Kandagatla } else { 2284809bcbceSSrinivas Kandagatla regmap_update_bits(regmap, CDC_WSA_CLK_RST_CTRL_SWR_CONTROL, 2285809bcbceSSrinivas Kandagatla CDC_WSA_SWR_CLK_EN_MASK, 0); 2286809bcbceSSrinivas Kandagatla wsa_macro_mclk_enable(wsa, false); 2287809bcbceSSrinivas Kandagatla } 2288809bcbceSSrinivas Kandagatla 2289809bcbceSSrinivas Kandagatla return 0; 2290809bcbceSSrinivas Kandagatla } 2291809bcbceSSrinivas Kandagatla 2292809bcbceSSrinivas Kandagatla static int wsa_macro_component_probe(struct snd_soc_component *comp) 2293809bcbceSSrinivas Kandagatla { 2294809bcbceSSrinivas Kandagatla struct wsa_macro *wsa = snd_soc_component_get_drvdata(comp); 2295809bcbceSSrinivas Kandagatla 2296809bcbceSSrinivas Kandagatla snd_soc_component_init_regmap(comp, wsa->regmap); 2297809bcbceSSrinivas Kandagatla 2298809bcbceSSrinivas Kandagatla wsa->spkr_gain_offset = WSA_MACRO_GAIN_OFFSET_M1P5_DB; 2299809bcbceSSrinivas Kandagatla 2300809bcbceSSrinivas Kandagatla /* set SPKR rate to FS_2P4_3P072 */ 2301809bcbceSSrinivas Kandagatla snd_soc_component_update_bits(comp, CDC_WSA_RX0_RX_PATH_CFG1, 2302809bcbceSSrinivas Kandagatla CDC_WSA_RX_PATH_SPKR_RATE_MASK, 2303809bcbceSSrinivas Kandagatla CDC_WSA_RX_PATH_SPKR_RATE_FS_2P4_3P072); 2304809bcbceSSrinivas Kandagatla 2305809bcbceSSrinivas Kandagatla snd_soc_component_update_bits(comp, CDC_WSA_RX1_RX_PATH_CFG1, 2306809bcbceSSrinivas Kandagatla CDC_WSA_RX_PATH_SPKR_RATE_MASK, 2307809bcbceSSrinivas Kandagatla CDC_WSA_RX_PATH_SPKR_RATE_FS_2P4_3P072); 2308809bcbceSSrinivas Kandagatla 2309809bcbceSSrinivas Kandagatla wsa_macro_set_spkr_mode(comp, WSA_MACRO_SPKR_MODE_1); 2310809bcbceSSrinivas Kandagatla 2311809bcbceSSrinivas Kandagatla return 0; 2312809bcbceSSrinivas Kandagatla } 2313809bcbceSSrinivas Kandagatla 2314809bcbceSSrinivas Kandagatla static int swclk_gate_enable(struct clk_hw *hw) 2315809bcbceSSrinivas Kandagatla { 2316809bcbceSSrinivas Kandagatla return wsa_swrm_clock(to_wsa_macro(hw), true); 2317809bcbceSSrinivas Kandagatla } 2318809bcbceSSrinivas Kandagatla 2319809bcbceSSrinivas Kandagatla static void swclk_gate_disable(struct clk_hw *hw) 2320809bcbceSSrinivas Kandagatla { 2321809bcbceSSrinivas Kandagatla wsa_swrm_clock(to_wsa_macro(hw), false); 2322809bcbceSSrinivas Kandagatla } 2323809bcbceSSrinivas Kandagatla 2324809bcbceSSrinivas Kandagatla static int swclk_gate_is_enabled(struct clk_hw *hw) 2325809bcbceSSrinivas Kandagatla { 2326809bcbceSSrinivas Kandagatla struct wsa_macro *wsa = to_wsa_macro(hw); 2327809bcbceSSrinivas Kandagatla int ret, val; 2328809bcbceSSrinivas Kandagatla 2329809bcbceSSrinivas Kandagatla regmap_read(wsa->regmap, CDC_WSA_CLK_RST_CTRL_SWR_CONTROL, &val); 2330809bcbceSSrinivas Kandagatla ret = val & BIT(0); 2331809bcbceSSrinivas Kandagatla 2332809bcbceSSrinivas Kandagatla return ret; 2333809bcbceSSrinivas Kandagatla } 2334809bcbceSSrinivas Kandagatla 2335809bcbceSSrinivas Kandagatla static unsigned long swclk_recalc_rate(struct clk_hw *hw, 2336809bcbceSSrinivas Kandagatla unsigned long parent_rate) 2337809bcbceSSrinivas Kandagatla { 2338809bcbceSSrinivas Kandagatla return parent_rate / 2; 2339809bcbceSSrinivas Kandagatla } 2340809bcbceSSrinivas Kandagatla 2341809bcbceSSrinivas Kandagatla static const struct clk_ops swclk_gate_ops = { 2342809bcbceSSrinivas Kandagatla .prepare = swclk_gate_enable, 2343809bcbceSSrinivas Kandagatla .unprepare = swclk_gate_disable, 2344809bcbceSSrinivas Kandagatla .is_enabled = swclk_gate_is_enabled, 2345809bcbceSSrinivas Kandagatla .recalc_rate = swclk_recalc_rate, 2346809bcbceSSrinivas Kandagatla }; 2347809bcbceSSrinivas Kandagatla 234827dc72b4SJerome Brunet static int wsa_macro_register_mclk_output(struct wsa_macro *wsa) 2349809bcbceSSrinivas Kandagatla { 2350809bcbceSSrinivas Kandagatla struct device *dev = wsa->dev; 2351809bcbceSSrinivas Kandagatla const char *parent_clk_name; 2352809bcbceSSrinivas Kandagatla const char *clk_name = "mclk"; 2353809bcbceSSrinivas Kandagatla struct clk_hw *hw; 2354809bcbceSSrinivas Kandagatla struct clk_init_data init; 2355809bcbceSSrinivas Kandagatla int ret; 2356809bcbceSSrinivas Kandagatla 2357*e252801dSSrinivas Kandagatla parent_clk_name = __clk_get_name(wsa->mclk); 2358809bcbceSSrinivas Kandagatla 2359809bcbceSSrinivas Kandagatla init.name = clk_name; 2360809bcbceSSrinivas Kandagatla init.ops = &swclk_gate_ops; 2361809bcbceSSrinivas Kandagatla init.flags = 0; 2362809bcbceSSrinivas Kandagatla init.parent_names = &parent_clk_name; 2363809bcbceSSrinivas Kandagatla init.num_parents = 1; 2364809bcbceSSrinivas Kandagatla wsa->hw.init = &init; 2365809bcbceSSrinivas Kandagatla hw = &wsa->hw; 2366809bcbceSSrinivas Kandagatla ret = clk_hw_register(wsa->dev, hw); 2367809bcbceSSrinivas Kandagatla if (ret) 236827dc72b4SJerome Brunet return ret; 2369809bcbceSSrinivas Kandagatla 237027dc72b4SJerome Brunet return devm_of_clk_add_hw_provider(dev, of_clk_hw_simple_get, hw); 2371809bcbceSSrinivas Kandagatla } 2372809bcbceSSrinivas Kandagatla 2373809bcbceSSrinivas Kandagatla static const struct snd_soc_component_driver wsa_macro_component_drv = { 2374809bcbceSSrinivas Kandagatla .name = "WSA MACRO", 2375809bcbceSSrinivas Kandagatla .probe = wsa_macro_component_probe, 2376809bcbceSSrinivas Kandagatla .controls = wsa_macro_snd_controls, 2377809bcbceSSrinivas Kandagatla .num_controls = ARRAY_SIZE(wsa_macro_snd_controls), 23782c4066e5SSrinivas Kandagatla .dapm_widgets = wsa_macro_dapm_widgets, 23792c4066e5SSrinivas Kandagatla .num_dapm_widgets = ARRAY_SIZE(wsa_macro_dapm_widgets), 23802c4066e5SSrinivas Kandagatla .dapm_routes = wsa_audio_map, 23812c4066e5SSrinivas Kandagatla .num_dapm_routes = ARRAY_SIZE(wsa_audio_map), 2382809bcbceSSrinivas Kandagatla }; 2383809bcbceSSrinivas Kandagatla 2384809bcbceSSrinivas Kandagatla static int wsa_macro_probe(struct platform_device *pdev) 2385809bcbceSSrinivas Kandagatla { 2386809bcbceSSrinivas Kandagatla struct device *dev = &pdev->dev; 2387809bcbceSSrinivas Kandagatla struct wsa_macro *wsa; 2388809bcbceSSrinivas Kandagatla void __iomem *base; 2389809bcbceSSrinivas Kandagatla int ret; 2390809bcbceSSrinivas Kandagatla 2391809bcbceSSrinivas Kandagatla wsa = devm_kzalloc(dev, sizeof(*wsa), GFP_KERNEL); 2392809bcbceSSrinivas Kandagatla if (!wsa) 2393809bcbceSSrinivas Kandagatla return -ENOMEM; 2394809bcbceSSrinivas Kandagatla 2395*e252801dSSrinivas Kandagatla wsa->macro = devm_clk_get_optional(dev, "macro"); 2396*e252801dSSrinivas Kandagatla if (IS_ERR(wsa->macro)) 2397*e252801dSSrinivas Kandagatla return PTR_ERR(wsa->macro); 2398809bcbceSSrinivas Kandagatla 2399*e252801dSSrinivas Kandagatla wsa->dcodec = devm_clk_get_optional(dev, "dcodec"); 2400*e252801dSSrinivas Kandagatla if (IS_ERR(wsa->dcodec)) 2401*e252801dSSrinivas Kandagatla return PTR_ERR(wsa->dcodec); 2402*e252801dSSrinivas Kandagatla 2403*e252801dSSrinivas Kandagatla wsa->mclk = devm_clk_get(dev, "mclk"); 2404*e252801dSSrinivas Kandagatla if (IS_ERR(wsa->mclk)) 2405*e252801dSSrinivas Kandagatla return PTR_ERR(wsa->mclk); 2406*e252801dSSrinivas Kandagatla 2407*e252801dSSrinivas Kandagatla wsa->npl = devm_clk_get(dev, "npl"); 2408*e252801dSSrinivas Kandagatla if (IS_ERR(wsa->npl)) 2409*e252801dSSrinivas Kandagatla return PTR_ERR(wsa->npl); 2410*e252801dSSrinivas Kandagatla 2411*e252801dSSrinivas Kandagatla wsa->fsgen = devm_clk_get(dev, "fsgen"); 2412*e252801dSSrinivas Kandagatla if (IS_ERR(wsa->fsgen)) 2413*e252801dSSrinivas Kandagatla return PTR_ERR(wsa->fsgen); 2414809bcbceSSrinivas Kandagatla 2415809bcbceSSrinivas Kandagatla base = devm_platform_ioremap_resource(pdev, 0); 2416809bcbceSSrinivas Kandagatla if (IS_ERR(base)) 2417809bcbceSSrinivas Kandagatla return PTR_ERR(base); 2418809bcbceSSrinivas Kandagatla 2419809bcbceSSrinivas Kandagatla wsa->regmap = devm_regmap_init_mmio(dev, base, &wsa_regmap_config); 2420aa505eccSJiasheng Jiang if (IS_ERR(wsa->regmap)) 2421aa505eccSJiasheng Jiang return PTR_ERR(wsa->regmap); 2422809bcbceSSrinivas Kandagatla 2423809bcbceSSrinivas Kandagatla dev_set_drvdata(dev, wsa); 2424809bcbceSSrinivas Kandagatla 2425809bcbceSSrinivas Kandagatla wsa->reset_swr = true; 2426809bcbceSSrinivas Kandagatla wsa->dev = dev; 2427809bcbceSSrinivas Kandagatla 2428809bcbceSSrinivas Kandagatla /* set MCLK and NPL rates */ 2429*e252801dSSrinivas Kandagatla clk_set_rate(wsa->mclk, WSA_MACRO_MCLK_FREQ); 2430*e252801dSSrinivas Kandagatla clk_set_rate(wsa->npl, WSA_MACRO_MCLK_FREQ); 2431809bcbceSSrinivas Kandagatla 2432*e252801dSSrinivas Kandagatla ret = clk_prepare_enable(wsa->macro); 2433809bcbceSSrinivas Kandagatla if (ret) 2434*e252801dSSrinivas Kandagatla goto err; 2435809bcbceSSrinivas Kandagatla 2436*e252801dSSrinivas Kandagatla ret = clk_prepare_enable(wsa->dcodec); 2437*e252801dSSrinivas Kandagatla if (ret) 2438*e252801dSSrinivas Kandagatla goto err_dcodec; 2439*e252801dSSrinivas Kandagatla 2440*e252801dSSrinivas Kandagatla ret = clk_prepare_enable(wsa->mclk); 2441*e252801dSSrinivas Kandagatla if (ret) 2442*e252801dSSrinivas Kandagatla goto err_mclk; 2443*e252801dSSrinivas Kandagatla 2444*e252801dSSrinivas Kandagatla ret = clk_prepare_enable(wsa->npl); 2445*e252801dSSrinivas Kandagatla if (ret) 2446*e252801dSSrinivas Kandagatla goto err_npl; 2447*e252801dSSrinivas Kandagatla 2448*e252801dSSrinivas Kandagatla ret = clk_prepare_enable(wsa->fsgen); 2449*e252801dSSrinivas Kandagatla if (ret) 2450*e252801dSSrinivas Kandagatla goto err_fsgen; 2451*e252801dSSrinivas Kandagatla 2452*e252801dSSrinivas Kandagatla ret = wsa_macro_register_mclk_output(wsa); 2453*e252801dSSrinivas Kandagatla if (ret) 2454*e252801dSSrinivas Kandagatla goto err_clkout; 2455*e252801dSSrinivas Kandagatla 2456809bcbceSSrinivas Kandagatla 2457809bcbceSSrinivas Kandagatla ret = devm_snd_soc_register_component(dev, &wsa_macro_component_drv, 2458809bcbceSSrinivas Kandagatla wsa_macro_dai, 2459809bcbceSSrinivas Kandagatla ARRAY_SIZE(wsa_macro_dai)); 2460809bcbceSSrinivas Kandagatla if (ret) 2461*e252801dSSrinivas Kandagatla goto err_clkout; 2462809bcbceSSrinivas Kandagatla 2463*e252801dSSrinivas Kandagatla return 0; 2464*e252801dSSrinivas Kandagatla 2465*e252801dSSrinivas Kandagatla err_clkout: 2466*e252801dSSrinivas Kandagatla clk_disable_unprepare(wsa->fsgen); 2467*e252801dSSrinivas Kandagatla err_fsgen: 2468*e252801dSSrinivas Kandagatla clk_disable_unprepare(wsa->npl); 2469*e252801dSSrinivas Kandagatla err_npl: 2470*e252801dSSrinivas Kandagatla clk_disable_unprepare(wsa->mclk); 2471*e252801dSSrinivas Kandagatla err_mclk: 2472*e252801dSSrinivas Kandagatla clk_disable_unprepare(wsa->dcodec); 2473*e252801dSSrinivas Kandagatla err_dcodec: 2474*e252801dSSrinivas Kandagatla clk_disable_unprepare(wsa->macro); 2475809bcbceSSrinivas Kandagatla err: 2476809bcbceSSrinivas Kandagatla return ret; 2477809bcbceSSrinivas Kandagatla 2478809bcbceSSrinivas Kandagatla } 2479809bcbceSSrinivas Kandagatla 2480809bcbceSSrinivas Kandagatla static int wsa_macro_remove(struct platform_device *pdev) 2481809bcbceSSrinivas Kandagatla { 2482809bcbceSSrinivas Kandagatla struct wsa_macro *wsa = dev_get_drvdata(&pdev->dev); 2483809bcbceSSrinivas Kandagatla 2484*e252801dSSrinivas Kandagatla clk_disable_unprepare(wsa->macro); 2485*e252801dSSrinivas Kandagatla clk_disable_unprepare(wsa->dcodec); 2486*e252801dSSrinivas Kandagatla clk_disable_unprepare(wsa->mclk); 2487*e252801dSSrinivas Kandagatla clk_disable_unprepare(wsa->npl); 2488*e252801dSSrinivas Kandagatla clk_disable_unprepare(wsa->fsgen); 2489809bcbceSSrinivas Kandagatla 2490809bcbceSSrinivas Kandagatla return 0; 2491809bcbceSSrinivas Kandagatla } 2492809bcbceSSrinivas Kandagatla 2493809bcbceSSrinivas Kandagatla static const struct of_device_id wsa_macro_dt_match[] = { 24949d8c6981SSrinivasa Rao Mandadapu {.compatible = "qcom,sc7280-lpass-wsa-macro"}, 2495809bcbceSSrinivas Kandagatla {.compatible = "qcom,sm8250-lpass-wsa-macro"}, 2496809bcbceSSrinivas Kandagatla {} 2497809bcbceSSrinivas Kandagatla }; 2498809bcbceSSrinivas Kandagatla MODULE_DEVICE_TABLE(of, wsa_macro_dt_match); 2499809bcbceSSrinivas Kandagatla 2500809bcbceSSrinivas Kandagatla static struct platform_driver wsa_macro_driver = { 2501809bcbceSSrinivas Kandagatla .driver = { 2502809bcbceSSrinivas Kandagatla .name = "wsa_macro", 2503809bcbceSSrinivas Kandagatla .of_match_table = wsa_macro_dt_match, 2504809bcbceSSrinivas Kandagatla }, 2505809bcbceSSrinivas Kandagatla .probe = wsa_macro_probe, 2506809bcbceSSrinivas Kandagatla .remove = wsa_macro_remove, 2507809bcbceSSrinivas Kandagatla }; 2508809bcbceSSrinivas Kandagatla 2509809bcbceSSrinivas Kandagatla module_platform_driver(wsa_macro_driver); 2510809bcbceSSrinivas Kandagatla MODULE_DESCRIPTION("WSA macro driver"); 2511809bcbceSSrinivas Kandagatla MODULE_LICENSE("GPL"); 2512