1*809bcbceSSrinivas Kandagatla // SPDX-License-Identifier: GPL-2.0-only 2*809bcbceSSrinivas Kandagatla // Copyright (c) 2018-2020, The Linux Foundation. All rights reserved. 3*809bcbceSSrinivas Kandagatla 4*809bcbceSSrinivas Kandagatla #include <linux/module.h> 5*809bcbceSSrinivas Kandagatla #include <linux/init.h> 6*809bcbceSSrinivas Kandagatla #include <linux/io.h> 7*809bcbceSSrinivas Kandagatla #include <linux/platform_device.h> 8*809bcbceSSrinivas Kandagatla #include <linux/clk.h> 9*809bcbceSSrinivas Kandagatla #include <linux/of_clk.h> 10*809bcbceSSrinivas Kandagatla #include <linux/clk-provider.h> 11*809bcbceSSrinivas Kandagatla #include <sound/soc.h> 12*809bcbceSSrinivas Kandagatla #include <sound/soc-dapm.h> 13*809bcbceSSrinivas Kandagatla #include <linux/of_platform.h> 14*809bcbceSSrinivas Kandagatla #include <sound/tlv.h> 15*809bcbceSSrinivas Kandagatla #include "lpass-wsa-macro.h" 16*809bcbceSSrinivas Kandagatla 17*809bcbceSSrinivas Kandagatla #define CDC_WSA_CLK_RST_CTRL_MCLK_CONTROL (0x0000) 18*809bcbceSSrinivas Kandagatla #define CDC_WSA_MCLK_EN_MASK BIT(0) 19*809bcbceSSrinivas Kandagatla #define CDC_WSA_MCLK_ENABLE BIT(0) 20*809bcbceSSrinivas Kandagatla #define CDC_WSA_MCLK_DISABLE 0 21*809bcbceSSrinivas Kandagatla #define CDC_WSA_CLK_RST_CTRL_FS_CNT_CONTROL (0x0004) 22*809bcbceSSrinivas Kandagatla #define CDC_WSA_FS_CNT_EN_MASK BIT(0) 23*809bcbceSSrinivas Kandagatla #define CDC_WSA_FS_CNT_ENABLE BIT(0) 24*809bcbceSSrinivas Kandagatla #define CDC_WSA_FS_CNT_DISABLE 0 25*809bcbceSSrinivas Kandagatla #define CDC_WSA_CLK_RST_CTRL_SWR_CONTROL (0x0008) 26*809bcbceSSrinivas Kandagatla #define CDC_WSA_SWR_CLK_EN_MASK BIT(0) 27*809bcbceSSrinivas Kandagatla #define CDC_WSA_SWR_CLK_ENABLE BIT(0) 28*809bcbceSSrinivas Kandagatla #define CDC_WSA_SWR_RST_EN_MASK BIT(1) 29*809bcbceSSrinivas Kandagatla #define CDC_WSA_SWR_RST_ENABLE BIT(1) 30*809bcbceSSrinivas Kandagatla #define CDC_WSA_SWR_RST_DISABLE 0 31*809bcbceSSrinivas Kandagatla #define CDC_WSA_TOP_TOP_CFG0 (0x0080) 32*809bcbceSSrinivas Kandagatla #define CDC_WSA_TOP_TOP_CFG1 (0x0084) 33*809bcbceSSrinivas Kandagatla #define CDC_WSA_TOP_FREQ_MCLK (0x0088) 34*809bcbceSSrinivas Kandagatla #define CDC_WSA_TOP_DEBUG_BUS_SEL (0x008C) 35*809bcbceSSrinivas Kandagatla #define CDC_WSA_TOP_DEBUG_EN0 (0x0090) 36*809bcbceSSrinivas Kandagatla #define CDC_WSA_TOP_DEBUG_EN1 (0x0094) 37*809bcbceSSrinivas Kandagatla #define CDC_WSA_TOP_DEBUG_DSM_LB (0x0098) 38*809bcbceSSrinivas Kandagatla #define CDC_WSA_TOP_RX_I2S_CTL (0x009C) 39*809bcbceSSrinivas Kandagatla #define CDC_WSA_TOP_TX_I2S_CTL (0x00A0) 40*809bcbceSSrinivas Kandagatla #define CDC_WSA_TOP_I2S_CLK (0x00A4) 41*809bcbceSSrinivas Kandagatla #define CDC_WSA_TOP_I2S_RESET (0x00A8) 42*809bcbceSSrinivas Kandagatla #define CDC_WSA_RX_INP_MUX_RX_INT0_CFG0 (0x0100) 43*809bcbceSSrinivas Kandagatla #define CDC_WSA_RX_INTX_1_MIX_INP2_SEL_MASK GENMASK(5, 3) 44*809bcbceSSrinivas Kandagatla #define CDC_WSA_RX_INTX_2_SEL_MASK GENMASK(2, 0) 45*809bcbceSSrinivas Kandagatla #define CDC_WSA_RX_INP_MUX_RX_INT0_CFG1 (0x0104) 46*809bcbceSSrinivas Kandagatla #define CDC_WSA_RX_INP_MUX_RX_INT1_CFG0 (0x0108) 47*809bcbceSSrinivas Kandagatla #define CDC_WSA_RX_INP_MUX_RX_INT1_CFG1 (0x010C) 48*809bcbceSSrinivas Kandagatla #define CDC_WSA_RX_INP_MUX_RX_MIX_CFG0 (0x0110) 49*809bcbceSSrinivas Kandagatla #define CDC_WSA_RX_MIX_TX1_SEL_MASK GENMASK(5, 3) 50*809bcbceSSrinivas Kandagatla #define CDC_WSA_RX_MIX_TX1_SEL_SHFT 3 51*809bcbceSSrinivas Kandagatla #define CDC_WSA_RX_MIX_TX0_SEL_MASK GENMASK(2, 0) 52*809bcbceSSrinivas Kandagatla #define CDC_WSA_RX_INP_MUX_RX_EC_CFG0 (0x0114) 53*809bcbceSSrinivas Kandagatla #define CDC_WSA_RX_INP_MUX_SOFTCLIP_CFG0 (0x0118) 54*809bcbceSSrinivas Kandagatla #define CDC_WSA_TX0_SPKR_PROT_PATH_CTL (0x0244) 55*809bcbceSSrinivas Kandagatla #define CDC_WSA_TX_SPKR_PROT_RESET_MASK BIT(5) 56*809bcbceSSrinivas Kandagatla #define CDC_WSA_TX_SPKR_PROT_RESET BIT(5) 57*809bcbceSSrinivas Kandagatla #define CDC_WSA_TX_SPKR_PROT_NO_RESET 0 58*809bcbceSSrinivas Kandagatla #define CDC_WSA_TX_SPKR_PROT_CLK_EN_MASK BIT(4) 59*809bcbceSSrinivas Kandagatla #define CDC_WSA_TX_SPKR_PROT_CLK_ENABLE BIT(4) 60*809bcbceSSrinivas Kandagatla #define CDC_WSA_TX_SPKR_PROT_CLK_DISABLE 0 61*809bcbceSSrinivas Kandagatla #define CDC_WSA_TX_SPKR_PROT_PCM_RATE_MASK GENMASK(3, 0) 62*809bcbceSSrinivas Kandagatla #define CDC_WSA_TX_SPKR_PROT_PCM_RATE_8K 0 63*809bcbceSSrinivas Kandagatla #define CDC_WSA_TX0_SPKR_PROT_PATH_CFG0 (0x0248) 64*809bcbceSSrinivas Kandagatla #define CDC_WSA_TX1_SPKR_PROT_PATH_CTL (0x0264) 65*809bcbceSSrinivas Kandagatla #define CDC_WSA_TX1_SPKR_PROT_PATH_CFG0 (0x0268) 66*809bcbceSSrinivas Kandagatla #define CDC_WSA_TX2_SPKR_PROT_PATH_CTL (0x0284) 67*809bcbceSSrinivas Kandagatla #define CDC_WSA_TX2_SPKR_PROT_PATH_CFG0 (0x0288) 68*809bcbceSSrinivas Kandagatla #define CDC_WSA_TX3_SPKR_PROT_PATH_CTL (0x02A4) 69*809bcbceSSrinivas Kandagatla #define CDC_WSA_TX3_SPKR_PROT_PATH_CFG0 (0x02A8) 70*809bcbceSSrinivas Kandagatla #define CDC_WSA_INTR_CTRL_CFG (0x0340) 71*809bcbceSSrinivas Kandagatla #define CDC_WSA_INTR_CTRL_CLR_COMMIT (0x0344) 72*809bcbceSSrinivas Kandagatla #define CDC_WSA_INTR_CTRL_PIN1_MASK0 (0x0360) 73*809bcbceSSrinivas Kandagatla #define CDC_WSA_INTR_CTRL_PIN1_STATUS0 (0x0368) 74*809bcbceSSrinivas Kandagatla #define CDC_WSA_INTR_CTRL_PIN1_CLEAR0 (0x0370) 75*809bcbceSSrinivas Kandagatla #define CDC_WSA_INTR_CTRL_PIN2_MASK0 (0x0380) 76*809bcbceSSrinivas Kandagatla #define CDC_WSA_INTR_CTRL_PIN2_STATUS0 (0x0388) 77*809bcbceSSrinivas Kandagatla #define CDC_WSA_INTR_CTRL_PIN2_CLEAR0 (0x0390) 78*809bcbceSSrinivas Kandagatla #define CDC_WSA_INTR_CTRL_LEVEL0 (0x03C0) 79*809bcbceSSrinivas Kandagatla #define CDC_WSA_INTR_CTRL_BYPASS0 (0x03C8) 80*809bcbceSSrinivas Kandagatla #define CDC_WSA_INTR_CTRL_SET0 (0x03D0) 81*809bcbceSSrinivas Kandagatla #define CDC_WSA_RX0_RX_PATH_CTL (0x0400) 82*809bcbceSSrinivas Kandagatla #define CDC_WSA_RX_PATH_CLK_EN_MASK BIT(5) 83*809bcbceSSrinivas Kandagatla #define CDC_WSA_RX_PATH_CLK_ENABLE BIT(5) 84*809bcbceSSrinivas Kandagatla #define CDC_WSA_RX_PATH_CLK_DISABLE 0 85*809bcbceSSrinivas Kandagatla #define CDC_WSA_RX_PATH_PGA_MUTE_EN_MASK BIT(4) 86*809bcbceSSrinivas Kandagatla #define CDC_WSA_RX_PATH_PGA_MUTE_ENABLE BIT(4) 87*809bcbceSSrinivas Kandagatla #define CDC_WSA_RX_PATH_PGA_MUTE_DISABLE 0 88*809bcbceSSrinivas Kandagatla #define CDC_WSA_RX0_RX_PATH_CFG0 (0x0404) 89*809bcbceSSrinivas Kandagatla #define CDC_WSA_RX_PATH_COMP_EN_MASK BIT(1) 90*809bcbceSSrinivas Kandagatla #define CDC_WSA_RX_PATH_COMP_ENABLE BIT(1) 91*809bcbceSSrinivas Kandagatla #define CDC_WSA_RX_PATH_HD2_EN_MASK BIT(2) 92*809bcbceSSrinivas Kandagatla #define CDC_WSA_RX_PATH_HD2_ENABLE BIT(2) 93*809bcbceSSrinivas Kandagatla #define CDC_WSA_RX_PATH_SPKR_RATE_MASK BIT(3) 94*809bcbceSSrinivas Kandagatla #define CDC_WSA_RX_PATH_SPKR_RATE_FS_2P4_3P072 BIT(3) 95*809bcbceSSrinivas Kandagatla #define CDC_WSA_RX0_RX_PATH_CFG1 (0x0408) 96*809bcbceSSrinivas Kandagatla #define CDC_WSA_RX_PATH_SMART_BST_EN_MASK BIT(0) 97*809bcbceSSrinivas Kandagatla #define CDC_WSA_RX_PATH_SMART_BST_ENABLE BIT(0) 98*809bcbceSSrinivas Kandagatla #define CDC_WSA_RX_PATH_SMART_BST_DISABLE 0 99*809bcbceSSrinivas Kandagatla #define CDC_WSA_RX0_RX_PATH_CFG2 (0x040C) 100*809bcbceSSrinivas Kandagatla #define CDC_WSA_RX0_RX_PATH_CFG3 (0x0410) 101*809bcbceSSrinivas Kandagatla #define CDC_WSA_RX_DC_DCOEFF_MASK GENMASK(1, 0) 102*809bcbceSSrinivas Kandagatla #define CDC_WSA_RX0_RX_VOL_CTL (0x0414) 103*809bcbceSSrinivas Kandagatla #define CDC_WSA_RX0_RX_PATH_MIX_CTL (0x0418) 104*809bcbceSSrinivas Kandagatla #define CDC_WSA_RX_PATH_MIX_CLK_EN_MASK BIT(5) 105*809bcbceSSrinivas Kandagatla #define CDC_WSA_RX_PATH_MIX_CLK_ENABLE BIT(5) 106*809bcbceSSrinivas Kandagatla #define CDC_WSA_RX_PATH_MIX_CLK_DISABLE 0 107*809bcbceSSrinivas Kandagatla #define CDC_WSA_RX0_RX_PATH_MIX_CFG (0x041C) 108*809bcbceSSrinivas Kandagatla #define CDC_WSA_RX0_RX_VOL_MIX_CTL (0x0420) 109*809bcbceSSrinivas Kandagatla #define CDC_WSA_RX0_RX_PATH_SEC0 (0x0424) 110*809bcbceSSrinivas Kandagatla #define CDC_WSA_RX0_RX_PATH_SEC1 (0x0428) 111*809bcbceSSrinivas Kandagatla #define CDC_WSA_RX_PGA_HALF_DB_MASK BIT(0) 112*809bcbceSSrinivas Kandagatla #define CDC_WSA_RX_PGA_HALF_DB_ENABLE BIT(0) 113*809bcbceSSrinivas Kandagatla #define CDC_WSA_RX_PGA_HALF_DB_DISABLE 0 114*809bcbceSSrinivas Kandagatla #define CDC_WSA_RX0_RX_PATH_SEC2 (0x042C) 115*809bcbceSSrinivas Kandagatla #define CDC_WSA_RX0_RX_PATH_SEC3 (0x0430) 116*809bcbceSSrinivas Kandagatla #define CDC_WSA_RX_PATH_HD2_SCALE_MASK GENMASK(1, 0) 117*809bcbceSSrinivas Kandagatla #define CDC_WSA_RX_PATH_HD2_ALPHA_MASK GENMASK(5, 2) 118*809bcbceSSrinivas Kandagatla #define CDC_WSA_RX0_RX_PATH_SEC5 (0x0438) 119*809bcbceSSrinivas Kandagatla #define CDC_WSA_RX0_RX_PATH_SEC6 (0x043C) 120*809bcbceSSrinivas Kandagatla #define CDC_WSA_RX0_RX_PATH_SEC7 (0x0440) 121*809bcbceSSrinivas Kandagatla #define CDC_WSA_RX0_RX_PATH_MIX_SEC0 (0x0444) 122*809bcbceSSrinivas Kandagatla #define CDC_WSA_RX0_RX_PATH_MIX_SEC1 (0x0448) 123*809bcbceSSrinivas Kandagatla #define CDC_WSA_RX0_RX_PATH_DSMDEM_CTL (0x044C) 124*809bcbceSSrinivas Kandagatla #define CDC_WSA_RX_DSMDEM_CLK_EN_MASK BIT(0) 125*809bcbceSSrinivas Kandagatla #define CDC_WSA_RX_DSMDEM_CLK_ENABLE BIT(0) 126*809bcbceSSrinivas Kandagatla #define CDC_WSA_RX1_RX_PATH_CTL (0x0480) 127*809bcbceSSrinivas Kandagatla #define CDC_WSA_RX1_RX_PATH_CFG0 (0x0484) 128*809bcbceSSrinivas Kandagatla #define CDC_WSA_RX1_RX_PATH_CFG1 (0x0488) 129*809bcbceSSrinivas Kandagatla #define CDC_WSA_RX1_RX_PATH_CFG2 (0x048C) 130*809bcbceSSrinivas Kandagatla #define CDC_WSA_RX1_RX_PATH_CFG3 (0x0490) 131*809bcbceSSrinivas Kandagatla #define CDC_WSA_RX1_RX_VOL_CTL (0x0494) 132*809bcbceSSrinivas Kandagatla #define CDC_WSA_RX1_RX_PATH_MIX_CTL (0x0498) 133*809bcbceSSrinivas Kandagatla #define CDC_WSA_RX1_RX_PATH_MIX_CFG (0x049C) 134*809bcbceSSrinivas Kandagatla #define CDC_WSA_RX1_RX_VOL_MIX_CTL (0x04A0) 135*809bcbceSSrinivas Kandagatla #define CDC_WSA_RX1_RX_PATH_SEC0 (0x04A4) 136*809bcbceSSrinivas Kandagatla #define CDC_WSA_RX1_RX_PATH_SEC1 (0x04A8) 137*809bcbceSSrinivas Kandagatla #define CDC_WSA_RX1_RX_PATH_SEC2 (0x04AC) 138*809bcbceSSrinivas Kandagatla #define CDC_WSA_RX1_RX_PATH_SEC3 (0x04B0) 139*809bcbceSSrinivas Kandagatla #define CDC_WSA_RX1_RX_PATH_SEC5 (0x04B8) 140*809bcbceSSrinivas Kandagatla #define CDC_WSA_RX1_RX_PATH_SEC6 (0x04BC) 141*809bcbceSSrinivas Kandagatla #define CDC_WSA_RX1_RX_PATH_SEC7 (0x04C0) 142*809bcbceSSrinivas Kandagatla #define CDC_WSA_RX1_RX_PATH_MIX_SEC0 (0x04C4) 143*809bcbceSSrinivas Kandagatla #define CDC_WSA_RX1_RX_PATH_MIX_SEC1 (0x04C8) 144*809bcbceSSrinivas Kandagatla #define CDC_WSA_RX1_RX_PATH_DSMDEM_CTL (0x04CC) 145*809bcbceSSrinivas Kandagatla #define CDC_WSA_BOOST0_BOOST_PATH_CTL (0x0500) 146*809bcbceSSrinivas Kandagatla #define CDC_WSA_BOOST_PATH_CLK_EN_MASK BIT(4) 147*809bcbceSSrinivas Kandagatla #define CDC_WSA_BOOST_PATH_CLK_ENABLE BIT(4) 148*809bcbceSSrinivas Kandagatla #define CDC_WSA_BOOST_PATH_CLK_DISABLE 0 149*809bcbceSSrinivas Kandagatla #define CDC_WSA_BOOST0_BOOST_CTL (0x0504) 150*809bcbceSSrinivas Kandagatla #define CDC_WSA_BOOST0_BOOST_CFG1 (0x0508) 151*809bcbceSSrinivas Kandagatla #define CDC_WSA_BOOST0_BOOST_CFG2 (0x050C) 152*809bcbceSSrinivas Kandagatla #define CDC_WSA_BOOST1_BOOST_PATH_CTL (0x0540) 153*809bcbceSSrinivas Kandagatla #define CDC_WSA_BOOST1_BOOST_CTL (0x0544) 154*809bcbceSSrinivas Kandagatla #define CDC_WSA_BOOST1_BOOST_CFG1 (0x0548) 155*809bcbceSSrinivas Kandagatla #define CDC_WSA_BOOST1_BOOST_CFG2 (0x054C) 156*809bcbceSSrinivas Kandagatla #define CDC_WSA_COMPANDER0_CTL0 (0x0580) 157*809bcbceSSrinivas Kandagatla #define CDC_WSA_COMPANDER_CLK_EN_MASK BIT(0) 158*809bcbceSSrinivas Kandagatla #define CDC_WSA_COMPANDER_CLK_ENABLE BIT(0) 159*809bcbceSSrinivas Kandagatla #define CDC_WSA_COMPANDER_SOFT_RST_MASK BIT(1) 160*809bcbceSSrinivas Kandagatla #define CDC_WSA_COMPANDER_SOFT_RST_ENABLE BIT(1) 161*809bcbceSSrinivas Kandagatla #define CDC_WSA_COMPANDER_HALT_MASK BIT(2) 162*809bcbceSSrinivas Kandagatla #define CDC_WSA_COMPANDER_HALT BIT(2) 163*809bcbceSSrinivas Kandagatla #define CDC_WSA_COMPANDER0_CTL1 (0x0584) 164*809bcbceSSrinivas Kandagatla #define CDC_WSA_COMPANDER0_CTL2 (0x0588) 165*809bcbceSSrinivas Kandagatla #define CDC_WSA_COMPANDER0_CTL3 (0x058C) 166*809bcbceSSrinivas Kandagatla #define CDC_WSA_COMPANDER0_CTL4 (0x0590) 167*809bcbceSSrinivas Kandagatla #define CDC_WSA_COMPANDER0_CTL5 (0x0594) 168*809bcbceSSrinivas Kandagatla #define CDC_WSA_COMPANDER0_CTL6 (0x0598) 169*809bcbceSSrinivas Kandagatla #define CDC_WSA_COMPANDER0_CTL7 (0x059C) 170*809bcbceSSrinivas Kandagatla #define CDC_WSA_COMPANDER1_CTL0 (0x05C0) 171*809bcbceSSrinivas Kandagatla #define CDC_WSA_COMPANDER1_CTL1 (0x05C4) 172*809bcbceSSrinivas Kandagatla #define CDC_WSA_COMPANDER1_CTL2 (0x05C8) 173*809bcbceSSrinivas Kandagatla #define CDC_WSA_COMPANDER1_CTL3 (0x05CC) 174*809bcbceSSrinivas Kandagatla #define CDC_WSA_COMPANDER1_CTL4 (0x05D0) 175*809bcbceSSrinivas Kandagatla #define CDC_WSA_COMPANDER1_CTL5 (0x05D4) 176*809bcbceSSrinivas Kandagatla #define CDC_WSA_COMPANDER1_CTL6 (0x05D8) 177*809bcbceSSrinivas Kandagatla #define CDC_WSA_COMPANDER1_CTL7 (0x05DC) 178*809bcbceSSrinivas Kandagatla #define CDC_WSA_SOFTCLIP0_CRC (0x0600) 179*809bcbceSSrinivas Kandagatla #define CDC_WSA_SOFTCLIP_CLK_EN_MASK BIT(0) 180*809bcbceSSrinivas Kandagatla #define CDC_WSA_SOFTCLIP_CLK_ENABLE BIT(0) 181*809bcbceSSrinivas Kandagatla #define CDC_WSA_SOFTCLIP0_SOFTCLIP_CTRL (0x0604) 182*809bcbceSSrinivas Kandagatla #define CDC_WSA_SOFTCLIP_EN_MASK BIT(0) 183*809bcbceSSrinivas Kandagatla #define CDC_WSA_SOFTCLIP_ENABLE BIT(0) 184*809bcbceSSrinivas Kandagatla #define CDC_WSA_SOFTCLIP1_CRC (0x0640) 185*809bcbceSSrinivas Kandagatla #define CDC_WSA_SOFTCLIP1_SOFTCLIP_CTRL (0x0644) 186*809bcbceSSrinivas Kandagatla #define CDC_WSA_EC_HQ0_EC_REF_HQ_PATH_CTL (0x0680) 187*809bcbceSSrinivas Kandagatla #define CDC_WSA_EC_HQ_EC_CLK_EN_MASK BIT(0) 188*809bcbceSSrinivas Kandagatla #define CDC_WSA_EC_HQ_EC_CLK_ENABLE BIT(0) 189*809bcbceSSrinivas Kandagatla #define CDC_WSA_EC_HQ0_EC_REF_HQ_CFG0 (0x0684) 190*809bcbceSSrinivas Kandagatla #define CDC_WSA_EC_HQ_EC_REF_PCM_RATE_MASK GENMASK(4, 1) 191*809bcbceSSrinivas Kandagatla #define CDC_WSA_EC_HQ_EC_REF_PCM_RATE_48K BIT(3) 192*809bcbceSSrinivas Kandagatla #define CDC_WSA_EC_HQ1_EC_REF_HQ_PATH_CTL (0x06C0) 193*809bcbceSSrinivas Kandagatla #define CDC_WSA_EC_HQ1_EC_REF_HQ_CFG0 (0x06C4) 194*809bcbceSSrinivas Kandagatla #define CDC_WSA_SPLINE_ASRC0_CLK_RST_CTL (0x0700) 195*809bcbceSSrinivas Kandagatla #define CDC_WSA_SPLINE_ASRC0_CTL0 (0x0704) 196*809bcbceSSrinivas Kandagatla #define CDC_WSA_SPLINE_ASRC0_CTL1 (0x0708) 197*809bcbceSSrinivas Kandagatla #define CDC_WSA_SPLINE_ASRC0_FIFO_CTL (0x070C) 198*809bcbceSSrinivas Kandagatla #define CDC_WSA_SPLINE_ASRC0_STATUS_FMIN_CNTR_LSB (0x0710) 199*809bcbceSSrinivas Kandagatla #define CDC_WSA_SPLINE_ASRC0_STATUS_FMIN_CNTR_MSB (0x0714) 200*809bcbceSSrinivas Kandagatla #define CDC_WSA_SPLINE_ASRC0_STATUS_FMAX_CNTR_LSB (0x0718) 201*809bcbceSSrinivas Kandagatla #define CDC_WSA_SPLINE_ASRC0_STATUS_FMAX_CNTR_MSB (0x071C) 202*809bcbceSSrinivas Kandagatla #define CDC_WSA_SPLINE_ASRC0_STATUS_FIFO (0x0720) 203*809bcbceSSrinivas Kandagatla #define CDC_WSA_SPLINE_ASRC1_CLK_RST_CTL (0x0740) 204*809bcbceSSrinivas Kandagatla #define CDC_WSA_SPLINE_ASRC1_CTL0 (0x0744) 205*809bcbceSSrinivas Kandagatla #define CDC_WSA_SPLINE_ASRC1_CTL1 (0x0748) 206*809bcbceSSrinivas Kandagatla #define CDC_WSA_SPLINE_ASRC1_FIFO_CTL (0x074C) 207*809bcbceSSrinivas Kandagatla #define CDC_WSA_SPLINE_ASRC1_STATUS_FMIN_CNTR_LSB (0x0750) 208*809bcbceSSrinivas Kandagatla #define CDC_WSA_SPLINE_ASRC1_STATUS_FMIN_CNTR_MSB (0x0754) 209*809bcbceSSrinivas Kandagatla #define CDC_WSA_SPLINE_ASRC1_STATUS_FMAX_CNTR_LSB (0x0758) 210*809bcbceSSrinivas Kandagatla #define CDC_WSA_SPLINE_ASRC1_STATUS_FMAX_CNTR_MSB (0x075C) 211*809bcbceSSrinivas Kandagatla #define CDC_WSA_SPLINE_ASRC1_STATUS_FIFO (0x0760) 212*809bcbceSSrinivas Kandagatla #define WSA_MAX_OFFSET (0x0760) 213*809bcbceSSrinivas Kandagatla 214*809bcbceSSrinivas Kandagatla #define WSA_MACRO_RX_RATES (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 |\ 215*809bcbceSSrinivas Kandagatla SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 |\ 216*809bcbceSSrinivas Kandagatla SNDRV_PCM_RATE_96000 | SNDRV_PCM_RATE_192000) 217*809bcbceSSrinivas Kandagatla #define WSA_MACRO_RX_MIX_RATES (SNDRV_PCM_RATE_48000 |\ 218*809bcbceSSrinivas Kandagatla SNDRV_PCM_RATE_96000 | SNDRV_PCM_RATE_192000) 219*809bcbceSSrinivas Kandagatla #define WSA_MACRO_RX_FORMATS (SNDRV_PCM_FMTBIT_S16_LE |\ 220*809bcbceSSrinivas Kandagatla SNDRV_PCM_FMTBIT_S24_LE |\ 221*809bcbceSSrinivas Kandagatla SNDRV_PCM_FMTBIT_S24_3LE | SNDRV_PCM_FMTBIT_S32_LE) 222*809bcbceSSrinivas Kandagatla 223*809bcbceSSrinivas Kandagatla #define WSA_MACRO_ECHO_RATES (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 |\ 224*809bcbceSSrinivas Kandagatla SNDRV_PCM_RATE_48000) 225*809bcbceSSrinivas Kandagatla #define WSA_MACRO_ECHO_FORMATS (SNDRV_PCM_FMTBIT_S16_LE |\ 226*809bcbceSSrinivas Kandagatla SNDRV_PCM_FMTBIT_S24_LE |\ 227*809bcbceSSrinivas Kandagatla SNDRV_PCM_FMTBIT_S24_3LE) 228*809bcbceSSrinivas Kandagatla 229*809bcbceSSrinivas Kandagatla #define NUM_INTERPOLATORS 2 230*809bcbceSSrinivas Kandagatla #define WSA_NUM_CLKS_MAX 5 231*809bcbceSSrinivas Kandagatla #define WSA_MACRO_MCLK_FREQ 19200000 232*809bcbceSSrinivas Kandagatla #define WSA_MACRO_MUX_INP_SHFT 0x3 233*809bcbceSSrinivas Kandagatla #define WSA_MACRO_MUX_INP_MASK1 0x07 234*809bcbceSSrinivas Kandagatla #define WSA_MACRO_MUX_INP_MASK2 0x38 235*809bcbceSSrinivas Kandagatla #define WSA_MACRO_MUX_CFG_OFFSET 0x8 236*809bcbceSSrinivas Kandagatla #define WSA_MACRO_MUX_CFG1_OFFSET 0x4 237*809bcbceSSrinivas Kandagatla #define WSA_MACRO_RX_COMP_OFFSET 0x40 238*809bcbceSSrinivas Kandagatla #define WSA_MACRO_RX_SOFTCLIP_OFFSET 0x40 239*809bcbceSSrinivas Kandagatla #define WSA_MACRO_RX_PATH_OFFSET 0x80 240*809bcbceSSrinivas Kandagatla #define WSA_MACRO_RX_PATH_CFG3_OFFSET 0x10 241*809bcbceSSrinivas Kandagatla #define WSA_MACRO_RX_PATH_DSMDEM_OFFSET 0x4C 242*809bcbceSSrinivas Kandagatla #define WSA_MACRO_FS_RATE_MASK 0x0F 243*809bcbceSSrinivas Kandagatla #define WSA_MACRO_EC_MIX_TX0_MASK 0x03 244*809bcbceSSrinivas Kandagatla #define WSA_MACRO_EC_MIX_TX1_MASK 0x18 245*809bcbceSSrinivas Kandagatla #define WSA_MACRO_MAX_DMA_CH_PER_PORT 0x2 246*809bcbceSSrinivas Kandagatla 247*809bcbceSSrinivas Kandagatla enum { 248*809bcbceSSrinivas Kandagatla WSA_MACRO_GAIN_OFFSET_M1P5_DB, 249*809bcbceSSrinivas Kandagatla WSA_MACRO_GAIN_OFFSET_0_DB, 250*809bcbceSSrinivas Kandagatla }; 251*809bcbceSSrinivas Kandagatla enum { 252*809bcbceSSrinivas Kandagatla WSA_MACRO_RX0 = 0, 253*809bcbceSSrinivas Kandagatla WSA_MACRO_RX1, 254*809bcbceSSrinivas Kandagatla WSA_MACRO_RX_MIX, 255*809bcbceSSrinivas Kandagatla WSA_MACRO_RX_MIX0 = WSA_MACRO_RX_MIX, 256*809bcbceSSrinivas Kandagatla WSA_MACRO_RX_MIX1, 257*809bcbceSSrinivas Kandagatla WSA_MACRO_RX_MAX, 258*809bcbceSSrinivas Kandagatla }; 259*809bcbceSSrinivas Kandagatla 260*809bcbceSSrinivas Kandagatla enum { 261*809bcbceSSrinivas Kandagatla WSA_MACRO_TX0 = 0, 262*809bcbceSSrinivas Kandagatla WSA_MACRO_TX1, 263*809bcbceSSrinivas Kandagatla WSA_MACRO_TX_MAX, 264*809bcbceSSrinivas Kandagatla }; 265*809bcbceSSrinivas Kandagatla 266*809bcbceSSrinivas Kandagatla enum { 267*809bcbceSSrinivas Kandagatla WSA_MACRO_EC0_MUX = 0, 268*809bcbceSSrinivas Kandagatla WSA_MACRO_EC1_MUX, 269*809bcbceSSrinivas Kandagatla WSA_MACRO_EC_MUX_MAX, 270*809bcbceSSrinivas Kandagatla }; 271*809bcbceSSrinivas Kandagatla 272*809bcbceSSrinivas Kandagatla enum { 273*809bcbceSSrinivas Kandagatla WSA_MACRO_COMP1, /* SPK_L */ 274*809bcbceSSrinivas Kandagatla WSA_MACRO_COMP2, /* SPK_R */ 275*809bcbceSSrinivas Kandagatla WSA_MACRO_COMP_MAX 276*809bcbceSSrinivas Kandagatla }; 277*809bcbceSSrinivas Kandagatla 278*809bcbceSSrinivas Kandagatla enum { 279*809bcbceSSrinivas Kandagatla WSA_MACRO_SOFTCLIP0, /* RX0 */ 280*809bcbceSSrinivas Kandagatla WSA_MACRO_SOFTCLIP1, /* RX1 */ 281*809bcbceSSrinivas Kandagatla WSA_MACRO_SOFTCLIP_MAX 282*809bcbceSSrinivas Kandagatla }; 283*809bcbceSSrinivas Kandagatla 284*809bcbceSSrinivas Kandagatla enum { 285*809bcbceSSrinivas Kandagatla INTn_1_INP_SEL_ZERO = 0, 286*809bcbceSSrinivas Kandagatla INTn_1_INP_SEL_RX0, 287*809bcbceSSrinivas Kandagatla INTn_1_INP_SEL_RX1, 288*809bcbceSSrinivas Kandagatla INTn_1_INP_SEL_RX2, 289*809bcbceSSrinivas Kandagatla INTn_1_INP_SEL_RX3, 290*809bcbceSSrinivas Kandagatla INTn_1_INP_SEL_DEC0, 291*809bcbceSSrinivas Kandagatla INTn_1_INP_SEL_DEC1, 292*809bcbceSSrinivas Kandagatla }; 293*809bcbceSSrinivas Kandagatla 294*809bcbceSSrinivas Kandagatla enum { 295*809bcbceSSrinivas Kandagatla INTn_2_INP_SEL_ZERO = 0, 296*809bcbceSSrinivas Kandagatla INTn_2_INP_SEL_RX0, 297*809bcbceSSrinivas Kandagatla INTn_2_INP_SEL_RX1, 298*809bcbceSSrinivas Kandagatla INTn_2_INP_SEL_RX2, 299*809bcbceSSrinivas Kandagatla INTn_2_INP_SEL_RX3, 300*809bcbceSSrinivas Kandagatla }; 301*809bcbceSSrinivas Kandagatla 302*809bcbceSSrinivas Kandagatla struct interp_sample_rate { 303*809bcbceSSrinivas Kandagatla int sample_rate; 304*809bcbceSSrinivas Kandagatla int rate_val; 305*809bcbceSSrinivas Kandagatla }; 306*809bcbceSSrinivas Kandagatla 307*809bcbceSSrinivas Kandagatla static struct interp_sample_rate int_prim_sample_rate_val[] = { 308*809bcbceSSrinivas Kandagatla {8000, 0x0}, /* 8K */ 309*809bcbceSSrinivas Kandagatla {16000, 0x1}, /* 16K */ 310*809bcbceSSrinivas Kandagatla {24000, -EINVAL},/* 24K */ 311*809bcbceSSrinivas Kandagatla {32000, 0x3}, /* 32K */ 312*809bcbceSSrinivas Kandagatla {48000, 0x4}, /* 48K */ 313*809bcbceSSrinivas Kandagatla {96000, 0x5}, /* 96K */ 314*809bcbceSSrinivas Kandagatla {192000, 0x6}, /* 192K */ 315*809bcbceSSrinivas Kandagatla {384000, 0x7}, /* 384K */ 316*809bcbceSSrinivas Kandagatla {44100, 0x8}, /* 44.1K */ 317*809bcbceSSrinivas Kandagatla }; 318*809bcbceSSrinivas Kandagatla 319*809bcbceSSrinivas Kandagatla static struct interp_sample_rate int_mix_sample_rate_val[] = { 320*809bcbceSSrinivas Kandagatla {48000, 0x4}, /* 48K */ 321*809bcbceSSrinivas Kandagatla {96000, 0x5}, /* 96K */ 322*809bcbceSSrinivas Kandagatla {192000, 0x6}, /* 192K */ 323*809bcbceSSrinivas Kandagatla }; 324*809bcbceSSrinivas Kandagatla 325*809bcbceSSrinivas Kandagatla enum { 326*809bcbceSSrinivas Kandagatla WSA_MACRO_AIF_INVALID = 0, 327*809bcbceSSrinivas Kandagatla WSA_MACRO_AIF1_PB, 328*809bcbceSSrinivas Kandagatla WSA_MACRO_AIF_MIX1_PB, 329*809bcbceSSrinivas Kandagatla WSA_MACRO_AIF_VI, 330*809bcbceSSrinivas Kandagatla WSA_MACRO_AIF_ECHO, 331*809bcbceSSrinivas Kandagatla WSA_MACRO_MAX_DAIS, 332*809bcbceSSrinivas Kandagatla }; 333*809bcbceSSrinivas Kandagatla 334*809bcbceSSrinivas Kandagatla struct wsa_macro { 335*809bcbceSSrinivas Kandagatla struct device *dev; 336*809bcbceSSrinivas Kandagatla int comp_enabled[WSA_MACRO_COMP_MAX]; 337*809bcbceSSrinivas Kandagatla int ec_hq[WSA_MACRO_RX1 + 1]; 338*809bcbceSSrinivas Kandagatla u16 prim_int_users[WSA_MACRO_RX1 + 1]; 339*809bcbceSSrinivas Kandagatla u16 wsa_mclk_users; 340*809bcbceSSrinivas Kandagatla bool reset_swr; 341*809bcbceSSrinivas Kandagatla unsigned long active_ch_mask[WSA_MACRO_MAX_DAIS]; 342*809bcbceSSrinivas Kandagatla unsigned long active_ch_cnt[WSA_MACRO_MAX_DAIS]; 343*809bcbceSSrinivas Kandagatla int rx_port_value[WSA_MACRO_RX_MAX]; 344*809bcbceSSrinivas Kandagatla int ear_spkr_gain; 345*809bcbceSSrinivas Kandagatla int spkr_gain_offset; 346*809bcbceSSrinivas Kandagatla int spkr_mode; 347*809bcbceSSrinivas Kandagatla int is_softclip_on[WSA_MACRO_SOFTCLIP_MAX]; 348*809bcbceSSrinivas Kandagatla int softclip_clk_users[WSA_MACRO_SOFTCLIP_MAX]; 349*809bcbceSSrinivas Kandagatla struct regmap *regmap; 350*809bcbceSSrinivas Kandagatla struct clk_bulk_data clks[WSA_NUM_CLKS_MAX]; 351*809bcbceSSrinivas Kandagatla struct clk_hw hw; 352*809bcbceSSrinivas Kandagatla }; 353*809bcbceSSrinivas Kandagatla #define to_wsa_macro(_hw) container_of(_hw, struct wsa_macro, hw) 354*809bcbceSSrinivas Kandagatla 355*809bcbceSSrinivas Kandagatla static const DECLARE_TLV_DB_SCALE(digital_gain, -8400, 100, -8400); 356*809bcbceSSrinivas Kandagatla 357*809bcbceSSrinivas Kandagatla static const char * const wsa_macro_ear_spkr_pa_gain_text[] = { 358*809bcbceSSrinivas Kandagatla "G_DEFAULT", "G_0_DB", "G_1_DB", "G_2_DB", "G_3_DB", 359*809bcbceSSrinivas Kandagatla "G_4_DB", "G_5_DB", "G_6_DB" 360*809bcbceSSrinivas Kandagatla }; 361*809bcbceSSrinivas Kandagatla 362*809bcbceSSrinivas Kandagatla static SOC_ENUM_SINGLE_EXT_DECL(wsa_macro_ear_spkr_pa_gain_enum, 363*809bcbceSSrinivas Kandagatla wsa_macro_ear_spkr_pa_gain_text); 364*809bcbceSSrinivas Kandagatla 365*809bcbceSSrinivas Kandagatla static const struct reg_default wsa_defaults[] = { 366*809bcbceSSrinivas Kandagatla /* WSA Macro */ 367*809bcbceSSrinivas Kandagatla { CDC_WSA_CLK_RST_CTRL_MCLK_CONTROL, 0x00}, 368*809bcbceSSrinivas Kandagatla { CDC_WSA_CLK_RST_CTRL_FS_CNT_CONTROL, 0x00}, 369*809bcbceSSrinivas Kandagatla { CDC_WSA_CLK_RST_CTRL_SWR_CONTROL, 0x00}, 370*809bcbceSSrinivas Kandagatla { CDC_WSA_TOP_TOP_CFG0, 0x00}, 371*809bcbceSSrinivas Kandagatla { CDC_WSA_TOP_TOP_CFG1, 0x00}, 372*809bcbceSSrinivas Kandagatla { CDC_WSA_TOP_FREQ_MCLK, 0x00}, 373*809bcbceSSrinivas Kandagatla { CDC_WSA_TOP_DEBUG_BUS_SEL, 0x00}, 374*809bcbceSSrinivas Kandagatla { CDC_WSA_TOP_DEBUG_EN0, 0x00}, 375*809bcbceSSrinivas Kandagatla { CDC_WSA_TOP_DEBUG_EN1, 0x00}, 376*809bcbceSSrinivas Kandagatla { CDC_WSA_TOP_DEBUG_DSM_LB, 0x88}, 377*809bcbceSSrinivas Kandagatla { CDC_WSA_TOP_RX_I2S_CTL, 0x0C}, 378*809bcbceSSrinivas Kandagatla { CDC_WSA_TOP_TX_I2S_CTL, 0x0C}, 379*809bcbceSSrinivas Kandagatla { CDC_WSA_TOP_I2S_CLK, 0x02}, 380*809bcbceSSrinivas Kandagatla { CDC_WSA_TOP_I2S_RESET, 0x00}, 381*809bcbceSSrinivas Kandagatla { CDC_WSA_RX_INP_MUX_RX_INT0_CFG0, 0x00}, 382*809bcbceSSrinivas Kandagatla { CDC_WSA_RX_INP_MUX_RX_INT0_CFG1, 0x00}, 383*809bcbceSSrinivas Kandagatla { CDC_WSA_RX_INP_MUX_RX_INT1_CFG0, 0x00}, 384*809bcbceSSrinivas Kandagatla { CDC_WSA_RX_INP_MUX_RX_INT1_CFG1, 0x00}, 385*809bcbceSSrinivas Kandagatla { CDC_WSA_RX_INP_MUX_RX_MIX_CFG0, 0x00}, 386*809bcbceSSrinivas Kandagatla { CDC_WSA_RX_INP_MUX_RX_EC_CFG0, 0x00}, 387*809bcbceSSrinivas Kandagatla { CDC_WSA_RX_INP_MUX_SOFTCLIP_CFG0, 0x00}, 388*809bcbceSSrinivas Kandagatla { CDC_WSA_TX0_SPKR_PROT_PATH_CTL, 0x02}, 389*809bcbceSSrinivas Kandagatla { CDC_WSA_TX0_SPKR_PROT_PATH_CFG0, 0x00}, 390*809bcbceSSrinivas Kandagatla { CDC_WSA_TX1_SPKR_PROT_PATH_CTL, 0x02}, 391*809bcbceSSrinivas Kandagatla { CDC_WSA_TX1_SPKR_PROT_PATH_CFG0, 0x00}, 392*809bcbceSSrinivas Kandagatla { CDC_WSA_TX2_SPKR_PROT_PATH_CTL, 0x02}, 393*809bcbceSSrinivas Kandagatla { CDC_WSA_TX2_SPKR_PROT_PATH_CFG0, 0x00}, 394*809bcbceSSrinivas Kandagatla { CDC_WSA_TX3_SPKR_PROT_PATH_CTL, 0x02}, 395*809bcbceSSrinivas Kandagatla { CDC_WSA_TX3_SPKR_PROT_PATH_CFG0, 0x00}, 396*809bcbceSSrinivas Kandagatla { CDC_WSA_INTR_CTRL_CFG, 0x00}, 397*809bcbceSSrinivas Kandagatla { CDC_WSA_INTR_CTRL_CLR_COMMIT, 0x00}, 398*809bcbceSSrinivas Kandagatla { CDC_WSA_INTR_CTRL_PIN1_MASK0, 0xFF}, 399*809bcbceSSrinivas Kandagatla { CDC_WSA_INTR_CTRL_PIN1_STATUS0, 0x00}, 400*809bcbceSSrinivas Kandagatla { CDC_WSA_INTR_CTRL_PIN1_CLEAR0, 0x00}, 401*809bcbceSSrinivas Kandagatla { CDC_WSA_INTR_CTRL_PIN2_MASK0, 0xFF}, 402*809bcbceSSrinivas Kandagatla { CDC_WSA_INTR_CTRL_PIN2_STATUS0, 0x00}, 403*809bcbceSSrinivas Kandagatla { CDC_WSA_INTR_CTRL_PIN2_CLEAR0, 0x00}, 404*809bcbceSSrinivas Kandagatla { CDC_WSA_INTR_CTRL_LEVEL0, 0x00}, 405*809bcbceSSrinivas Kandagatla { CDC_WSA_INTR_CTRL_BYPASS0, 0x00}, 406*809bcbceSSrinivas Kandagatla { CDC_WSA_INTR_CTRL_SET0, 0x00}, 407*809bcbceSSrinivas Kandagatla { CDC_WSA_RX0_RX_PATH_CTL, 0x04}, 408*809bcbceSSrinivas Kandagatla { CDC_WSA_RX0_RX_PATH_CFG0, 0x00}, 409*809bcbceSSrinivas Kandagatla { CDC_WSA_RX0_RX_PATH_CFG1, 0x64}, 410*809bcbceSSrinivas Kandagatla { CDC_WSA_RX0_RX_PATH_CFG2, 0x8F}, 411*809bcbceSSrinivas Kandagatla { CDC_WSA_RX0_RX_PATH_CFG3, 0x00}, 412*809bcbceSSrinivas Kandagatla { CDC_WSA_RX0_RX_VOL_CTL, 0x00}, 413*809bcbceSSrinivas Kandagatla { CDC_WSA_RX0_RX_PATH_MIX_CTL, 0x04}, 414*809bcbceSSrinivas Kandagatla { CDC_WSA_RX0_RX_PATH_MIX_CFG, 0x7E}, 415*809bcbceSSrinivas Kandagatla { CDC_WSA_RX0_RX_VOL_MIX_CTL, 0x00}, 416*809bcbceSSrinivas Kandagatla { CDC_WSA_RX0_RX_PATH_SEC0, 0x04}, 417*809bcbceSSrinivas Kandagatla { CDC_WSA_RX0_RX_PATH_SEC1, 0x08}, 418*809bcbceSSrinivas Kandagatla { CDC_WSA_RX0_RX_PATH_SEC2, 0x00}, 419*809bcbceSSrinivas Kandagatla { CDC_WSA_RX0_RX_PATH_SEC3, 0x00}, 420*809bcbceSSrinivas Kandagatla { CDC_WSA_RX0_RX_PATH_SEC5, 0x00}, 421*809bcbceSSrinivas Kandagatla { CDC_WSA_RX0_RX_PATH_SEC6, 0x00}, 422*809bcbceSSrinivas Kandagatla { CDC_WSA_RX0_RX_PATH_SEC7, 0x00}, 423*809bcbceSSrinivas Kandagatla { CDC_WSA_RX0_RX_PATH_MIX_SEC0, 0x08}, 424*809bcbceSSrinivas Kandagatla { CDC_WSA_RX0_RX_PATH_MIX_SEC1, 0x00}, 425*809bcbceSSrinivas Kandagatla { CDC_WSA_RX0_RX_PATH_DSMDEM_CTL, 0x00}, 426*809bcbceSSrinivas Kandagatla { CDC_WSA_RX1_RX_PATH_CFG0, 0x00}, 427*809bcbceSSrinivas Kandagatla { CDC_WSA_RX1_RX_PATH_CFG1, 0x64}, 428*809bcbceSSrinivas Kandagatla { CDC_WSA_RX1_RX_PATH_CFG2, 0x8F}, 429*809bcbceSSrinivas Kandagatla { CDC_WSA_RX1_RX_PATH_CFG3, 0x00}, 430*809bcbceSSrinivas Kandagatla { CDC_WSA_RX1_RX_VOL_CTL, 0x00}, 431*809bcbceSSrinivas Kandagatla { CDC_WSA_RX1_RX_PATH_MIX_CTL, 0x04}, 432*809bcbceSSrinivas Kandagatla { CDC_WSA_RX1_RX_PATH_MIX_CFG, 0x7E}, 433*809bcbceSSrinivas Kandagatla { CDC_WSA_RX1_RX_VOL_MIX_CTL, 0x00}, 434*809bcbceSSrinivas Kandagatla { CDC_WSA_RX1_RX_PATH_SEC0, 0x04}, 435*809bcbceSSrinivas Kandagatla { CDC_WSA_RX1_RX_PATH_SEC1, 0x08}, 436*809bcbceSSrinivas Kandagatla { CDC_WSA_RX1_RX_PATH_SEC2, 0x00}, 437*809bcbceSSrinivas Kandagatla { CDC_WSA_RX1_RX_PATH_SEC3, 0x00}, 438*809bcbceSSrinivas Kandagatla { CDC_WSA_RX1_RX_PATH_SEC5, 0x00}, 439*809bcbceSSrinivas Kandagatla { CDC_WSA_RX1_RX_PATH_SEC6, 0x00}, 440*809bcbceSSrinivas Kandagatla { CDC_WSA_RX1_RX_PATH_SEC7, 0x00}, 441*809bcbceSSrinivas Kandagatla { CDC_WSA_RX1_RX_PATH_MIX_SEC0, 0x08}, 442*809bcbceSSrinivas Kandagatla { CDC_WSA_RX1_RX_PATH_MIX_SEC1, 0x00}, 443*809bcbceSSrinivas Kandagatla { CDC_WSA_RX1_RX_PATH_DSMDEM_CTL, 0x00}, 444*809bcbceSSrinivas Kandagatla { CDC_WSA_BOOST0_BOOST_PATH_CTL, 0x00}, 445*809bcbceSSrinivas Kandagatla { CDC_WSA_BOOST0_BOOST_CTL, 0xD0}, 446*809bcbceSSrinivas Kandagatla { CDC_WSA_BOOST0_BOOST_CFG1, 0x89}, 447*809bcbceSSrinivas Kandagatla { CDC_WSA_BOOST0_BOOST_CFG2, 0x04}, 448*809bcbceSSrinivas Kandagatla { CDC_WSA_BOOST1_BOOST_PATH_CTL, 0x00}, 449*809bcbceSSrinivas Kandagatla { CDC_WSA_BOOST1_BOOST_CTL, 0xD0}, 450*809bcbceSSrinivas Kandagatla { CDC_WSA_BOOST1_BOOST_CFG1, 0x89}, 451*809bcbceSSrinivas Kandagatla { CDC_WSA_BOOST1_BOOST_CFG2, 0x04}, 452*809bcbceSSrinivas Kandagatla { CDC_WSA_COMPANDER0_CTL0, 0x60}, 453*809bcbceSSrinivas Kandagatla { CDC_WSA_COMPANDER0_CTL1, 0xDB}, 454*809bcbceSSrinivas Kandagatla { CDC_WSA_COMPANDER0_CTL2, 0xFF}, 455*809bcbceSSrinivas Kandagatla { CDC_WSA_COMPANDER0_CTL3, 0x35}, 456*809bcbceSSrinivas Kandagatla { CDC_WSA_COMPANDER0_CTL4, 0xFF}, 457*809bcbceSSrinivas Kandagatla { CDC_WSA_COMPANDER0_CTL5, 0x00}, 458*809bcbceSSrinivas Kandagatla { CDC_WSA_COMPANDER0_CTL6, 0x01}, 459*809bcbceSSrinivas Kandagatla { CDC_WSA_COMPANDER0_CTL7, 0x28}, 460*809bcbceSSrinivas Kandagatla { CDC_WSA_COMPANDER1_CTL0, 0x60}, 461*809bcbceSSrinivas Kandagatla { CDC_WSA_COMPANDER1_CTL1, 0xDB}, 462*809bcbceSSrinivas Kandagatla { CDC_WSA_COMPANDER1_CTL2, 0xFF}, 463*809bcbceSSrinivas Kandagatla { CDC_WSA_COMPANDER1_CTL3, 0x35}, 464*809bcbceSSrinivas Kandagatla { CDC_WSA_COMPANDER1_CTL4, 0xFF}, 465*809bcbceSSrinivas Kandagatla { CDC_WSA_COMPANDER1_CTL5, 0x00}, 466*809bcbceSSrinivas Kandagatla { CDC_WSA_COMPANDER1_CTL6, 0x01}, 467*809bcbceSSrinivas Kandagatla { CDC_WSA_COMPANDER1_CTL7, 0x28}, 468*809bcbceSSrinivas Kandagatla { CDC_WSA_SOFTCLIP0_CRC, 0x00}, 469*809bcbceSSrinivas Kandagatla { CDC_WSA_SOFTCLIP0_SOFTCLIP_CTRL, 0x38}, 470*809bcbceSSrinivas Kandagatla { CDC_WSA_SOFTCLIP1_CRC, 0x00}, 471*809bcbceSSrinivas Kandagatla { CDC_WSA_SOFTCLIP1_SOFTCLIP_CTRL, 0x38}, 472*809bcbceSSrinivas Kandagatla { CDC_WSA_EC_HQ0_EC_REF_HQ_PATH_CTL, 0x00}, 473*809bcbceSSrinivas Kandagatla { CDC_WSA_EC_HQ0_EC_REF_HQ_CFG0, 0x01}, 474*809bcbceSSrinivas Kandagatla { CDC_WSA_EC_HQ1_EC_REF_HQ_PATH_CTL, 0x00}, 475*809bcbceSSrinivas Kandagatla { CDC_WSA_EC_HQ1_EC_REF_HQ_CFG0, 0x01}, 476*809bcbceSSrinivas Kandagatla { CDC_WSA_SPLINE_ASRC0_CLK_RST_CTL, 0x00}, 477*809bcbceSSrinivas Kandagatla { CDC_WSA_SPLINE_ASRC0_CTL0, 0x00}, 478*809bcbceSSrinivas Kandagatla { CDC_WSA_SPLINE_ASRC0_CTL1, 0x00}, 479*809bcbceSSrinivas Kandagatla { CDC_WSA_SPLINE_ASRC0_FIFO_CTL, 0xA8}, 480*809bcbceSSrinivas Kandagatla { CDC_WSA_SPLINE_ASRC0_STATUS_FMIN_CNTR_LSB, 0x00}, 481*809bcbceSSrinivas Kandagatla { CDC_WSA_SPLINE_ASRC0_STATUS_FMIN_CNTR_MSB, 0x00}, 482*809bcbceSSrinivas Kandagatla { CDC_WSA_SPLINE_ASRC0_STATUS_FMAX_CNTR_LSB, 0x00}, 483*809bcbceSSrinivas Kandagatla { CDC_WSA_SPLINE_ASRC0_STATUS_FMAX_CNTR_MSB, 0x00}, 484*809bcbceSSrinivas Kandagatla { CDC_WSA_SPLINE_ASRC0_STATUS_FIFO, 0x00}, 485*809bcbceSSrinivas Kandagatla { CDC_WSA_SPLINE_ASRC1_CLK_RST_CTL, 0x00}, 486*809bcbceSSrinivas Kandagatla { CDC_WSA_SPLINE_ASRC1_CTL0, 0x00}, 487*809bcbceSSrinivas Kandagatla { CDC_WSA_SPLINE_ASRC1_CTL1, 0x00}, 488*809bcbceSSrinivas Kandagatla { CDC_WSA_SPLINE_ASRC1_FIFO_CTL, 0xA8}, 489*809bcbceSSrinivas Kandagatla { CDC_WSA_SPLINE_ASRC1_STATUS_FMIN_CNTR_LSB, 0x00}, 490*809bcbceSSrinivas Kandagatla { CDC_WSA_SPLINE_ASRC1_STATUS_FMIN_CNTR_MSB, 0x00}, 491*809bcbceSSrinivas Kandagatla { CDC_WSA_SPLINE_ASRC1_STATUS_FMAX_CNTR_LSB, 0x00}, 492*809bcbceSSrinivas Kandagatla { CDC_WSA_SPLINE_ASRC1_STATUS_FMAX_CNTR_MSB, 0x00}, 493*809bcbceSSrinivas Kandagatla { CDC_WSA_SPLINE_ASRC1_STATUS_FIFO, 0x00}, 494*809bcbceSSrinivas Kandagatla }; 495*809bcbceSSrinivas Kandagatla 496*809bcbceSSrinivas Kandagatla static bool wsa_is_wronly_register(struct device *dev, 497*809bcbceSSrinivas Kandagatla unsigned int reg) 498*809bcbceSSrinivas Kandagatla { 499*809bcbceSSrinivas Kandagatla switch (reg) { 500*809bcbceSSrinivas Kandagatla case CDC_WSA_INTR_CTRL_CLR_COMMIT: 501*809bcbceSSrinivas Kandagatla case CDC_WSA_INTR_CTRL_PIN1_CLEAR0: 502*809bcbceSSrinivas Kandagatla case CDC_WSA_INTR_CTRL_PIN2_CLEAR0: 503*809bcbceSSrinivas Kandagatla return true; 504*809bcbceSSrinivas Kandagatla } 505*809bcbceSSrinivas Kandagatla 506*809bcbceSSrinivas Kandagatla return false; 507*809bcbceSSrinivas Kandagatla } 508*809bcbceSSrinivas Kandagatla 509*809bcbceSSrinivas Kandagatla static bool wsa_is_rw_register(struct device *dev, unsigned int reg) 510*809bcbceSSrinivas Kandagatla { 511*809bcbceSSrinivas Kandagatla switch (reg) { 512*809bcbceSSrinivas Kandagatla case CDC_WSA_CLK_RST_CTRL_MCLK_CONTROL: 513*809bcbceSSrinivas Kandagatla case CDC_WSA_CLK_RST_CTRL_FS_CNT_CONTROL: 514*809bcbceSSrinivas Kandagatla case CDC_WSA_CLK_RST_CTRL_SWR_CONTROL: 515*809bcbceSSrinivas Kandagatla case CDC_WSA_TOP_TOP_CFG0: 516*809bcbceSSrinivas Kandagatla case CDC_WSA_TOP_TOP_CFG1: 517*809bcbceSSrinivas Kandagatla case CDC_WSA_TOP_FREQ_MCLK: 518*809bcbceSSrinivas Kandagatla case CDC_WSA_TOP_DEBUG_BUS_SEL: 519*809bcbceSSrinivas Kandagatla case CDC_WSA_TOP_DEBUG_EN0: 520*809bcbceSSrinivas Kandagatla case CDC_WSA_TOP_DEBUG_EN1: 521*809bcbceSSrinivas Kandagatla case CDC_WSA_TOP_DEBUG_DSM_LB: 522*809bcbceSSrinivas Kandagatla case CDC_WSA_TOP_RX_I2S_CTL: 523*809bcbceSSrinivas Kandagatla case CDC_WSA_TOP_TX_I2S_CTL: 524*809bcbceSSrinivas Kandagatla case CDC_WSA_TOP_I2S_CLK: 525*809bcbceSSrinivas Kandagatla case CDC_WSA_TOP_I2S_RESET: 526*809bcbceSSrinivas Kandagatla case CDC_WSA_RX_INP_MUX_RX_INT0_CFG0: 527*809bcbceSSrinivas Kandagatla case CDC_WSA_RX_INP_MUX_RX_INT0_CFG1: 528*809bcbceSSrinivas Kandagatla case CDC_WSA_RX_INP_MUX_RX_INT1_CFG0: 529*809bcbceSSrinivas Kandagatla case CDC_WSA_RX_INP_MUX_RX_INT1_CFG1: 530*809bcbceSSrinivas Kandagatla case CDC_WSA_RX_INP_MUX_RX_MIX_CFG0: 531*809bcbceSSrinivas Kandagatla case CDC_WSA_RX_INP_MUX_RX_EC_CFG0: 532*809bcbceSSrinivas Kandagatla case CDC_WSA_RX_INP_MUX_SOFTCLIP_CFG0: 533*809bcbceSSrinivas Kandagatla case CDC_WSA_TX0_SPKR_PROT_PATH_CTL: 534*809bcbceSSrinivas Kandagatla case CDC_WSA_TX0_SPKR_PROT_PATH_CFG0: 535*809bcbceSSrinivas Kandagatla case CDC_WSA_TX1_SPKR_PROT_PATH_CTL: 536*809bcbceSSrinivas Kandagatla case CDC_WSA_TX1_SPKR_PROT_PATH_CFG0: 537*809bcbceSSrinivas Kandagatla case CDC_WSA_TX2_SPKR_PROT_PATH_CTL: 538*809bcbceSSrinivas Kandagatla case CDC_WSA_TX2_SPKR_PROT_PATH_CFG0: 539*809bcbceSSrinivas Kandagatla case CDC_WSA_TX3_SPKR_PROT_PATH_CTL: 540*809bcbceSSrinivas Kandagatla case CDC_WSA_TX3_SPKR_PROT_PATH_CFG0: 541*809bcbceSSrinivas Kandagatla case CDC_WSA_INTR_CTRL_CFG: 542*809bcbceSSrinivas Kandagatla case CDC_WSA_INTR_CTRL_PIN1_MASK0: 543*809bcbceSSrinivas Kandagatla case CDC_WSA_INTR_CTRL_PIN2_MASK0: 544*809bcbceSSrinivas Kandagatla case CDC_WSA_INTR_CTRL_LEVEL0: 545*809bcbceSSrinivas Kandagatla case CDC_WSA_INTR_CTRL_BYPASS0: 546*809bcbceSSrinivas Kandagatla case CDC_WSA_INTR_CTRL_SET0: 547*809bcbceSSrinivas Kandagatla case CDC_WSA_RX0_RX_PATH_CTL: 548*809bcbceSSrinivas Kandagatla case CDC_WSA_RX0_RX_PATH_CFG0: 549*809bcbceSSrinivas Kandagatla case CDC_WSA_RX0_RX_PATH_CFG1: 550*809bcbceSSrinivas Kandagatla case CDC_WSA_RX0_RX_PATH_CFG2: 551*809bcbceSSrinivas Kandagatla case CDC_WSA_RX0_RX_PATH_CFG3: 552*809bcbceSSrinivas Kandagatla case CDC_WSA_RX0_RX_VOL_CTL: 553*809bcbceSSrinivas Kandagatla case CDC_WSA_RX0_RX_PATH_MIX_CTL: 554*809bcbceSSrinivas Kandagatla case CDC_WSA_RX0_RX_PATH_MIX_CFG: 555*809bcbceSSrinivas Kandagatla case CDC_WSA_RX0_RX_VOL_MIX_CTL: 556*809bcbceSSrinivas Kandagatla case CDC_WSA_RX0_RX_PATH_SEC0: 557*809bcbceSSrinivas Kandagatla case CDC_WSA_RX0_RX_PATH_SEC1: 558*809bcbceSSrinivas Kandagatla case CDC_WSA_RX0_RX_PATH_SEC2: 559*809bcbceSSrinivas Kandagatla case CDC_WSA_RX0_RX_PATH_SEC3: 560*809bcbceSSrinivas Kandagatla case CDC_WSA_RX0_RX_PATH_SEC5: 561*809bcbceSSrinivas Kandagatla case CDC_WSA_RX0_RX_PATH_SEC6: 562*809bcbceSSrinivas Kandagatla case CDC_WSA_RX0_RX_PATH_SEC7: 563*809bcbceSSrinivas Kandagatla case CDC_WSA_RX0_RX_PATH_MIX_SEC0: 564*809bcbceSSrinivas Kandagatla case CDC_WSA_RX0_RX_PATH_MIX_SEC1: 565*809bcbceSSrinivas Kandagatla case CDC_WSA_RX0_RX_PATH_DSMDEM_CTL: 566*809bcbceSSrinivas Kandagatla case CDC_WSA_RX1_RX_PATH_CTL: 567*809bcbceSSrinivas Kandagatla case CDC_WSA_RX1_RX_PATH_CFG0: 568*809bcbceSSrinivas Kandagatla case CDC_WSA_RX1_RX_PATH_CFG1: 569*809bcbceSSrinivas Kandagatla case CDC_WSA_RX1_RX_PATH_CFG2: 570*809bcbceSSrinivas Kandagatla case CDC_WSA_RX1_RX_PATH_CFG3: 571*809bcbceSSrinivas Kandagatla case CDC_WSA_RX1_RX_VOL_CTL: 572*809bcbceSSrinivas Kandagatla case CDC_WSA_RX1_RX_PATH_MIX_CTL: 573*809bcbceSSrinivas Kandagatla case CDC_WSA_RX1_RX_PATH_MIX_CFG: 574*809bcbceSSrinivas Kandagatla case CDC_WSA_RX1_RX_VOL_MIX_CTL: 575*809bcbceSSrinivas Kandagatla case CDC_WSA_RX1_RX_PATH_SEC0: 576*809bcbceSSrinivas Kandagatla case CDC_WSA_RX1_RX_PATH_SEC1: 577*809bcbceSSrinivas Kandagatla case CDC_WSA_RX1_RX_PATH_SEC2: 578*809bcbceSSrinivas Kandagatla case CDC_WSA_RX1_RX_PATH_SEC3: 579*809bcbceSSrinivas Kandagatla case CDC_WSA_RX1_RX_PATH_SEC5: 580*809bcbceSSrinivas Kandagatla case CDC_WSA_RX1_RX_PATH_SEC6: 581*809bcbceSSrinivas Kandagatla case CDC_WSA_RX1_RX_PATH_SEC7: 582*809bcbceSSrinivas Kandagatla case CDC_WSA_RX1_RX_PATH_MIX_SEC0: 583*809bcbceSSrinivas Kandagatla case CDC_WSA_RX1_RX_PATH_MIX_SEC1: 584*809bcbceSSrinivas Kandagatla case CDC_WSA_RX1_RX_PATH_DSMDEM_CTL: 585*809bcbceSSrinivas Kandagatla case CDC_WSA_BOOST0_BOOST_PATH_CTL: 586*809bcbceSSrinivas Kandagatla case CDC_WSA_BOOST0_BOOST_CTL: 587*809bcbceSSrinivas Kandagatla case CDC_WSA_BOOST0_BOOST_CFG1: 588*809bcbceSSrinivas Kandagatla case CDC_WSA_BOOST0_BOOST_CFG2: 589*809bcbceSSrinivas Kandagatla case CDC_WSA_BOOST1_BOOST_PATH_CTL: 590*809bcbceSSrinivas Kandagatla case CDC_WSA_BOOST1_BOOST_CTL: 591*809bcbceSSrinivas Kandagatla case CDC_WSA_BOOST1_BOOST_CFG1: 592*809bcbceSSrinivas Kandagatla case CDC_WSA_BOOST1_BOOST_CFG2: 593*809bcbceSSrinivas Kandagatla case CDC_WSA_COMPANDER0_CTL0: 594*809bcbceSSrinivas Kandagatla case CDC_WSA_COMPANDER0_CTL1: 595*809bcbceSSrinivas Kandagatla case CDC_WSA_COMPANDER0_CTL2: 596*809bcbceSSrinivas Kandagatla case CDC_WSA_COMPANDER0_CTL3: 597*809bcbceSSrinivas Kandagatla case CDC_WSA_COMPANDER0_CTL4: 598*809bcbceSSrinivas Kandagatla case CDC_WSA_COMPANDER0_CTL5: 599*809bcbceSSrinivas Kandagatla case CDC_WSA_COMPANDER0_CTL7: 600*809bcbceSSrinivas Kandagatla case CDC_WSA_COMPANDER1_CTL0: 601*809bcbceSSrinivas Kandagatla case CDC_WSA_COMPANDER1_CTL1: 602*809bcbceSSrinivas Kandagatla case CDC_WSA_COMPANDER1_CTL2: 603*809bcbceSSrinivas Kandagatla case CDC_WSA_COMPANDER1_CTL3: 604*809bcbceSSrinivas Kandagatla case CDC_WSA_COMPANDER1_CTL4: 605*809bcbceSSrinivas Kandagatla case CDC_WSA_COMPANDER1_CTL5: 606*809bcbceSSrinivas Kandagatla case CDC_WSA_COMPANDER1_CTL7: 607*809bcbceSSrinivas Kandagatla case CDC_WSA_SOFTCLIP0_CRC: 608*809bcbceSSrinivas Kandagatla case CDC_WSA_SOFTCLIP0_SOFTCLIP_CTRL: 609*809bcbceSSrinivas Kandagatla case CDC_WSA_SOFTCLIP1_CRC: 610*809bcbceSSrinivas Kandagatla case CDC_WSA_SOFTCLIP1_SOFTCLIP_CTRL: 611*809bcbceSSrinivas Kandagatla case CDC_WSA_EC_HQ0_EC_REF_HQ_PATH_CTL: 612*809bcbceSSrinivas Kandagatla case CDC_WSA_EC_HQ0_EC_REF_HQ_CFG0: 613*809bcbceSSrinivas Kandagatla case CDC_WSA_EC_HQ1_EC_REF_HQ_PATH_CTL: 614*809bcbceSSrinivas Kandagatla case CDC_WSA_EC_HQ1_EC_REF_HQ_CFG0: 615*809bcbceSSrinivas Kandagatla case CDC_WSA_SPLINE_ASRC0_CLK_RST_CTL: 616*809bcbceSSrinivas Kandagatla case CDC_WSA_SPLINE_ASRC0_CTL0: 617*809bcbceSSrinivas Kandagatla case CDC_WSA_SPLINE_ASRC0_CTL1: 618*809bcbceSSrinivas Kandagatla case CDC_WSA_SPLINE_ASRC0_FIFO_CTL: 619*809bcbceSSrinivas Kandagatla case CDC_WSA_SPLINE_ASRC1_CLK_RST_CTL: 620*809bcbceSSrinivas Kandagatla case CDC_WSA_SPLINE_ASRC1_CTL0: 621*809bcbceSSrinivas Kandagatla case CDC_WSA_SPLINE_ASRC1_CTL1: 622*809bcbceSSrinivas Kandagatla case CDC_WSA_SPLINE_ASRC1_FIFO_CTL: 623*809bcbceSSrinivas Kandagatla return true; 624*809bcbceSSrinivas Kandagatla } 625*809bcbceSSrinivas Kandagatla 626*809bcbceSSrinivas Kandagatla return false; 627*809bcbceSSrinivas Kandagatla } 628*809bcbceSSrinivas Kandagatla 629*809bcbceSSrinivas Kandagatla static bool wsa_is_writeable_register(struct device *dev, unsigned int reg) 630*809bcbceSSrinivas Kandagatla { 631*809bcbceSSrinivas Kandagatla bool ret; 632*809bcbceSSrinivas Kandagatla 633*809bcbceSSrinivas Kandagatla ret = wsa_is_rw_register(dev, reg); 634*809bcbceSSrinivas Kandagatla if (!ret) 635*809bcbceSSrinivas Kandagatla return wsa_is_wronly_register(dev, reg); 636*809bcbceSSrinivas Kandagatla 637*809bcbceSSrinivas Kandagatla return ret; 638*809bcbceSSrinivas Kandagatla } 639*809bcbceSSrinivas Kandagatla 640*809bcbceSSrinivas Kandagatla static bool wsa_is_readable_register(struct device *dev, unsigned int reg) 641*809bcbceSSrinivas Kandagatla { 642*809bcbceSSrinivas Kandagatla switch (reg) { 643*809bcbceSSrinivas Kandagatla case CDC_WSA_INTR_CTRL_CLR_COMMIT: 644*809bcbceSSrinivas Kandagatla case CDC_WSA_INTR_CTRL_PIN1_CLEAR0: 645*809bcbceSSrinivas Kandagatla case CDC_WSA_INTR_CTRL_PIN2_CLEAR0: 646*809bcbceSSrinivas Kandagatla case CDC_WSA_INTR_CTRL_PIN1_STATUS0: 647*809bcbceSSrinivas Kandagatla case CDC_WSA_INTR_CTRL_PIN2_STATUS0: 648*809bcbceSSrinivas Kandagatla case CDC_WSA_COMPANDER0_CTL6: 649*809bcbceSSrinivas Kandagatla case CDC_WSA_COMPANDER1_CTL6: 650*809bcbceSSrinivas Kandagatla case CDC_WSA_SPLINE_ASRC0_STATUS_FMIN_CNTR_LSB: 651*809bcbceSSrinivas Kandagatla case CDC_WSA_SPLINE_ASRC0_STATUS_FMIN_CNTR_MSB: 652*809bcbceSSrinivas Kandagatla case CDC_WSA_SPLINE_ASRC0_STATUS_FMAX_CNTR_LSB: 653*809bcbceSSrinivas Kandagatla case CDC_WSA_SPLINE_ASRC0_STATUS_FMAX_CNTR_MSB: 654*809bcbceSSrinivas Kandagatla case CDC_WSA_SPLINE_ASRC0_STATUS_FIFO: 655*809bcbceSSrinivas Kandagatla case CDC_WSA_SPLINE_ASRC1_STATUS_FMIN_CNTR_LSB: 656*809bcbceSSrinivas Kandagatla case CDC_WSA_SPLINE_ASRC1_STATUS_FMIN_CNTR_MSB: 657*809bcbceSSrinivas Kandagatla case CDC_WSA_SPLINE_ASRC1_STATUS_FMAX_CNTR_LSB: 658*809bcbceSSrinivas Kandagatla case CDC_WSA_SPLINE_ASRC1_STATUS_FMAX_CNTR_MSB: 659*809bcbceSSrinivas Kandagatla case CDC_WSA_SPLINE_ASRC1_STATUS_FIFO: 660*809bcbceSSrinivas Kandagatla return true; 661*809bcbceSSrinivas Kandagatla } 662*809bcbceSSrinivas Kandagatla 663*809bcbceSSrinivas Kandagatla return wsa_is_rw_register(dev, reg); 664*809bcbceSSrinivas Kandagatla } 665*809bcbceSSrinivas Kandagatla 666*809bcbceSSrinivas Kandagatla static bool wsa_is_volatile_register(struct device *dev, unsigned int reg) 667*809bcbceSSrinivas Kandagatla { 668*809bcbceSSrinivas Kandagatla /* Update volatile list for rx/tx macros */ 669*809bcbceSSrinivas Kandagatla switch (reg) { 670*809bcbceSSrinivas Kandagatla case CDC_WSA_INTR_CTRL_PIN1_STATUS0: 671*809bcbceSSrinivas Kandagatla case CDC_WSA_INTR_CTRL_PIN2_STATUS0: 672*809bcbceSSrinivas Kandagatla case CDC_WSA_COMPANDER0_CTL6: 673*809bcbceSSrinivas Kandagatla case CDC_WSA_COMPANDER1_CTL6: 674*809bcbceSSrinivas Kandagatla case CDC_WSA_SPLINE_ASRC0_STATUS_FMIN_CNTR_LSB: 675*809bcbceSSrinivas Kandagatla case CDC_WSA_SPLINE_ASRC0_STATUS_FMIN_CNTR_MSB: 676*809bcbceSSrinivas Kandagatla case CDC_WSA_SPLINE_ASRC0_STATUS_FMAX_CNTR_LSB: 677*809bcbceSSrinivas Kandagatla case CDC_WSA_SPLINE_ASRC0_STATUS_FMAX_CNTR_MSB: 678*809bcbceSSrinivas Kandagatla case CDC_WSA_SPLINE_ASRC0_STATUS_FIFO: 679*809bcbceSSrinivas Kandagatla case CDC_WSA_SPLINE_ASRC1_STATUS_FMIN_CNTR_LSB: 680*809bcbceSSrinivas Kandagatla case CDC_WSA_SPLINE_ASRC1_STATUS_FMIN_CNTR_MSB: 681*809bcbceSSrinivas Kandagatla case CDC_WSA_SPLINE_ASRC1_STATUS_FMAX_CNTR_LSB: 682*809bcbceSSrinivas Kandagatla case CDC_WSA_SPLINE_ASRC1_STATUS_FMAX_CNTR_MSB: 683*809bcbceSSrinivas Kandagatla case CDC_WSA_SPLINE_ASRC1_STATUS_FIFO: 684*809bcbceSSrinivas Kandagatla return true; 685*809bcbceSSrinivas Kandagatla } 686*809bcbceSSrinivas Kandagatla return false; 687*809bcbceSSrinivas Kandagatla } 688*809bcbceSSrinivas Kandagatla 689*809bcbceSSrinivas Kandagatla static const struct regmap_config wsa_regmap_config = { 690*809bcbceSSrinivas Kandagatla .name = "wsa_macro", 691*809bcbceSSrinivas Kandagatla .reg_bits = 16, 692*809bcbceSSrinivas Kandagatla .val_bits = 32, /* 8 but with 32 bit read/write */ 693*809bcbceSSrinivas Kandagatla .reg_stride = 4, 694*809bcbceSSrinivas Kandagatla .cache_type = REGCACHE_FLAT, 695*809bcbceSSrinivas Kandagatla .reg_defaults = wsa_defaults, 696*809bcbceSSrinivas Kandagatla .num_reg_defaults = ARRAY_SIZE(wsa_defaults), 697*809bcbceSSrinivas Kandagatla .max_register = WSA_MAX_OFFSET, 698*809bcbceSSrinivas Kandagatla .writeable_reg = wsa_is_writeable_register, 699*809bcbceSSrinivas Kandagatla .volatile_reg = wsa_is_volatile_register, 700*809bcbceSSrinivas Kandagatla .readable_reg = wsa_is_readable_register, 701*809bcbceSSrinivas Kandagatla }; 702*809bcbceSSrinivas Kandagatla 703*809bcbceSSrinivas Kandagatla /** 704*809bcbceSSrinivas Kandagatla * wsa_macro_set_spkr_mode - Configures speaker compander and smartboost 705*809bcbceSSrinivas Kandagatla * settings based on speaker mode. 706*809bcbceSSrinivas Kandagatla * 707*809bcbceSSrinivas Kandagatla * @component: codec instance 708*809bcbceSSrinivas Kandagatla * @mode: Indicates speaker configuration mode. 709*809bcbceSSrinivas Kandagatla * 710*809bcbceSSrinivas Kandagatla * Returns 0 on success or -EINVAL on error. 711*809bcbceSSrinivas Kandagatla */ 712*809bcbceSSrinivas Kandagatla int wsa_macro_set_spkr_mode(struct snd_soc_component *component, int mode) 713*809bcbceSSrinivas Kandagatla { 714*809bcbceSSrinivas Kandagatla struct wsa_macro *wsa = snd_soc_component_get_drvdata(component); 715*809bcbceSSrinivas Kandagatla 716*809bcbceSSrinivas Kandagatla wsa->spkr_mode = mode; 717*809bcbceSSrinivas Kandagatla 718*809bcbceSSrinivas Kandagatla switch (mode) { 719*809bcbceSSrinivas Kandagatla case WSA_MACRO_SPKR_MODE_1: 720*809bcbceSSrinivas Kandagatla snd_soc_component_update_bits(component, CDC_WSA_COMPANDER0_CTL3, 0x80, 0x00); 721*809bcbceSSrinivas Kandagatla snd_soc_component_update_bits(component, CDC_WSA_COMPANDER1_CTL3, 0x80, 0x00); 722*809bcbceSSrinivas Kandagatla snd_soc_component_update_bits(component, CDC_WSA_COMPANDER0_CTL7, 0x01, 0x00); 723*809bcbceSSrinivas Kandagatla snd_soc_component_update_bits(component, CDC_WSA_COMPANDER1_CTL7, 0x01, 0x00); 724*809bcbceSSrinivas Kandagatla snd_soc_component_update_bits(component, CDC_WSA_BOOST0_BOOST_CTL, 0x7C, 0x44); 725*809bcbceSSrinivas Kandagatla snd_soc_component_update_bits(component, CDC_WSA_BOOST1_BOOST_CTL, 0x7C, 0x44); 726*809bcbceSSrinivas Kandagatla break; 727*809bcbceSSrinivas Kandagatla default: 728*809bcbceSSrinivas Kandagatla snd_soc_component_update_bits(component, CDC_WSA_COMPANDER0_CTL3, 0x80, 0x80); 729*809bcbceSSrinivas Kandagatla snd_soc_component_update_bits(component, CDC_WSA_COMPANDER1_CTL3, 0x80, 0x80); 730*809bcbceSSrinivas Kandagatla snd_soc_component_update_bits(component, CDC_WSA_COMPANDER0_CTL7, 0x01, 0x01); 731*809bcbceSSrinivas Kandagatla snd_soc_component_update_bits(component, CDC_WSA_COMPANDER1_CTL7, 0x01, 0x01); 732*809bcbceSSrinivas Kandagatla snd_soc_component_update_bits(component, CDC_WSA_BOOST0_BOOST_CTL, 0x7C, 0x58); 733*809bcbceSSrinivas Kandagatla snd_soc_component_update_bits(component, CDC_WSA_BOOST1_BOOST_CTL, 0x7C, 0x58); 734*809bcbceSSrinivas Kandagatla break; 735*809bcbceSSrinivas Kandagatla } 736*809bcbceSSrinivas Kandagatla return 0; 737*809bcbceSSrinivas Kandagatla } 738*809bcbceSSrinivas Kandagatla EXPORT_SYMBOL(wsa_macro_set_spkr_mode); 739*809bcbceSSrinivas Kandagatla 740*809bcbceSSrinivas Kandagatla static int wsa_macro_set_prim_interpolator_rate(struct snd_soc_dai *dai, 741*809bcbceSSrinivas Kandagatla u8 int_prim_fs_rate_reg_val, 742*809bcbceSSrinivas Kandagatla u32 sample_rate) 743*809bcbceSSrinivas Kandagatla { 744*809bcbceSSrinivas Kandagatla u8 int_1_mix1_inp; 745*809bcbceSSrinivas Kandagatla u32 j, port; 746*809bcbceSSrinivas Kandagatla u16 int_mux_cfg0, int_mux_cfg1; 747*809bcbceSSrinivas Kandagatla u16 int_fs_reg; 748*809bcbceSSrinivas Kandagatla u8 int_mux_cfg0_val, int_mux_cfg1_val; 749*809bcbceSSrinivas Kandagatla u8 inp0_sel, inp1_sel, inp2_sel; 750*809bcbceSSrinivas Kandagatla struct snd_soc_component *component = dai->component; 751*809bcbceSSrinivas Kandagatla struct wsa_macro *wsa = snd_soc_component_get_drvdata(component); 752*809bcbceSSrinivas Kandagatla 753*809bcbceSSrinivas Kandagatla for_each_set_bit(port, &wsa->active_ch_mask[dai->id], WSA_MACRO_RX_MAX) { 754*809bcbceSSrinivas Kandagatla int_1_mix1_inp = port; 755*809bcbceSSrinivas Kandagatla if ((int_1_mix1_inp < WSA_MACRO_RX0) || (int_1_mix1_inp > WSA_MACRO_RX_MIX1)) { 756*809bcbceSSrinivas Kandagatla dev_err(component->dev, "%s: Invalid RX port, Dai ID is %d\n", 757*809bcbceSSrinivas Kandagatla __func__, dai->id); 758*809bcbceSSrinivas Kandagatla return -EINVAL; 759*809bcbceSSrinivas Kandagatla } 760*809bcbceSSrinivas Kandagatla 761*809bcbceSSrinivas Kandagatla int_mux_cfg0 = CDC_WSA_RX_INP_MUX_RX_INT0_CFG0; 762*809bcbceSSrinivas Kandagatla 763*809bcbceSSrinivas Kandagatla /* 764*809bcbceSSrinivas Kandagatla * Loop through all interpolator MUX inputs and find out 765*809bcbceSSrinivas Kandagatla * to which interpolator input, the cdc_dma rx port 766*809bcbceSSrinivas Kandagatla * is connected 767*809bcbceSSrinivas Kandagatla */ 768*809bcbceSSrinivas Kandagatla for (j = 0; j < NUM_INTERPOLATORS; j++) { 769*809bcbceSSrinivas Kandagatla int_mux_cfg1 = int_mux_cfg0 + WSA_MACRO_MUX_CFG1_OFFSET; 770*809bcbceSSrinivas Kandagatla int_mux_cfg0_val = snd_soc_component_read(component, 771*809bcbceSSrinivas Kandagatla int_mux_cfg0); 772*809bcbceSSrinivas Kandagatla int_mux_cfg1_val = snd_soc_component_read(component, 773*809bcbceSSrinivas Kandagatla int_mux_cfg1); 774*809bcbceSSrinivas Kandagatla inp0_sel = int_mux_cfg0_val & WSA_MACRO_MUX_INP_MASK1; 775*809bcbceSSrinivas Kandagatla inp1_sel = (int_mux_cfg0_val >> WSA_MACRO_MUX_INP_SHFT) & 776*809bcbceSSrinivas Kandagatla WSA_MACRO_MUX_INP_MASK1; 777*809bcbceSSrinivas Kandagatla inp2_sel = (int_mux_cfg1_val >> WSA_MACRO_MUX_INP_SHFT) & 778*809bcbceSSrinivas Kandagatla WSA_MACRO_MUX_INP_MASK1; 779*809bcbceSSrinivas Kandagatla if ((inp0_sel == int_1_mix1_inp + INTn_1_INP_SEL_RX0) || 780*809bcbceSSrinivas Kandagatla (inp1_sel == int_1_mix1_inp + INTn_1_INP_SEL_RX0) || 781*809bcbceSSrinivas Kandagatla (inp2_sel == int_1_mix1_inp + INTn_1_INP_SEL_RX0)) { 782*809bcbceSSrinivas Kandagatla int_fs_reg = CDC_WSA_RX0_RX_PATH_CTL + 783*809bcbceSSrinivas Kandagatla WSA_MACRO_RX_PATH_OFFSET * j; 784*809bcbceSSrinivas Kandagatla /* sample_rate is in Hz */ 785*809bcbceSSrinivas Kandagatla snd_soc_component_update_bits(component, int_fs_reg, 786*809bcbceSSrinivas Kandagatla WSA_MACRO_FS_RATE_MASK, 787*809bcbceSSrinivas Kandagatla int_prim_fs_rate_reg_val); 788*809bcbceSSrinivas Kandagatla } 789*809bcbceSSrinivas Kandagatla int_mux_cfg0 += WSA_MACRO_MUX_CFG_OFFSET; 790*809bcbceSSrinivas Kandagatla } 791*809bcbceSSrinivas Kandagatla } 792*809bcbceSSrinivas Kandagatla 793*809bcbceSSrinivas Kandagatla return 0; 794*809bcbceSSrinivas Kandagatla } 795*809bcbceSSrinivas Kandagatla 796*809bcbceSSrinivas Kandagatla static int wsa_macro_set_mix_interpolator_rate(struct snd_soc_dai *dai, 797*809bcbceSSrinivas Kandagatla u8 int_mix_fs_rate_reg_val, 798*809bcbceSSrinivas Kandagatla u32 sample_rate) 799*809bcbceSSrinivas Kandagatla { 800*809bcbceSSrinivas Kandagatla u8 int_2_inp; 801*809bcbceSSrinivas Kandagatla u32 j, port; 802*809bcbceSSrinivas Kandagatla u16 int_mux_cfg1, int_fs_reg; 803*809bcbceSSrinivas Kandagatla u8 int_mux_cfg1_val; 804*809bcbceSSrinivas Kandagatla struct snd_soc_component *component = dai->component; 805*809bcbceSSrinivas Kandagatla struct wsa_macro *wsa = snd_soc_component_get_drvdata(component); 806*809bcbceSSrinivas Kandagatla 807*809bcbceSSrinivas Kandagatla for_each_set_bit(port, &wsa->active_ch_mask[dai->id], WSA_MACRO_RX_MAX) { 808*809bcbceSSrinivas Kandagatla int_2_inp = port; 809*809bcbceSSrinivas Kandagatla if ((int_2_inp < WSA_MACRO_RX0) || (int_2_inp > WSA_MACRO_RX_MIX1)) { 810*809bcbceSSrinivas Kandagatla dev_err(component->dev, "%s: Invalid RX port, Dai ID is %d\n", 811*809bcbceSSrinivas Kandagatla __func__, dai->id); 812*809bcbceSSrinivas Kandagatla return -EINVAL; 813*809bcbceSSrinivas Kandagatla } 814*809bcbceSSrinivas Kandagatla 815*809bcbceSSrinivas Kandagatla int_mux_cfg1 = CDC_WSA_RX_INP_MUX_RX_INT0_CFG1; 816*809bcbceSSrinivas Kandagatla for (j = 0; j < NUM_INTERPOLATORS; j++) { 817*809bcbceSSrinivas Kandagatla int_mux_cfg1_val = snd_soc_component_read(component, 818*809bcbceSSrinivas Kandagatla int_mux_cfg1) & 819*809bcbceSSrinivas Kandagatla WSA_MACRO_MUX_INP_MASK1; 820*809bcbceSSrinivas Kandagatla if (int_mux_cfg1_val == int_2_inp + INTn_2_INP_SEL_RX0) { 821*809bcbceSSrinivas Kandagatla int_fs_reg = CDC_WSA_RX0_RX_PATH_MIX_CTL + 822*809bcbceSSrinivas Kandagatla WSA_MACRO_RX_PATH_OFFSET * j; 823*809bcbceSSrinivas Kandagatla 824*809bcbceSSrinivas Kandagatla snd_soc_component_update_bits(component, 825*809bcbceSSrinivas Kandagatla int_fs_reg, 826*809bcbceSSrinivas Kandagatla WSA_MACRO_FS_RATE_MASK, 827*809bcbceSSrinivas Kandagatla int_mix_fs_rate_reg_val); 828*809bcbceSSrinivas Kandagatla } 829*809bcbceSSrinivas Kandagatla int_mux_cfg1 += WSA_MACRO_MUX_CFG_OFFSET; 830*809bcbceSSrinivas Kandagatla } 831*809bcbceSSrinivas Kandagatla } 832*809bcbceSSrinivas Kandagatla return 0; 833*809bcbceSSrinivas Kandagatla } 834*809bcbceSSrinivas Kandagatla 835*809bcbceSSrinivas Kandagatla static int wsa_macro_set_interpolator_rate(struct snd_soc_dai *dai, 836*809bcbceSSrinivas Kandagatla u32 sample_rate) 837*809bcbceSSrinivas Kandagatla { 838*809bcbceSSrinivas Kandagatla int rate_val = 0; 839*809bcbceSSrinivas Kandagatla int i, ret; 840*809bcbceSSrinivas Kandagatla 841*809bcbceSSrinivas Kandagatla /* set mixing path rate */ 842*809bcbceSSrinivas Kandagatla for (i = 0; i < ARRAY_SIZE(int_mix_sample_rate_val); i++) { 843*809bcbceSSrinivas Kandagatla if (sample_rate == int_mix_sample_rate_val[i].sample_rate) { 844*809bcbceSSrinivas Kandagatla rate_val = int_mix_sample_rate_val[i].rate_val; 845*809bcbceSSrinivas Kandagatla break; 846*809bcbceSSrinivas Kandagatla } 847*809bcbceSSrinivas Kandagatla } 848*809bcbceSSrinivas Kandagatla if ((i == ARRAY_SIZE(int_mix_sample_rate_val)) || (rate_val < 0)) 849*809bcbceSSrinivas Kandagatla goto prim_rate; 850*809bcbceSSrinivas Kandagatla 851*809bcbceSSrinivas Kandagatla ret = wsa_macro_set_mix_interpolator_rate(dai, (u8) rate_val, sample_rate); 852*809bcbceSSrinivas Kandagatla prim_rate: 853*809bcbceSSrinivas Kandagatla /* set primary path sample rate */ 854*809bcbceSSrinivas Kandagatla for (i = 0; i < ARRAY_SIZE(int_prim_sample_rate_val); i++) { 855*809bcbceSSrinivas Kandagatla if (sample_rate == int_prim_sample_rate_val[i].sample_rate) { 856*809bcbceSSrinivas Kandagatla rate_val = int_prim_sample_rate_val[i].rate_val; 857*809bcbceSSrinivas Kandagatla break; 858*809bcbceSSrinivas Kandagatla } 859*809bcbceSSrinivas Kandagatla } 860*809bcbceSSrinivas Kandagatla if ((i == ARRAY_SIZE(int_prim_sample_rate_val)) || (rate_val < 0)) 861*809bcbceSSrinivas Kandagatla return -EINVAL; 862*809bcbceSSrinivas Kandagatla 863*809bcbceSSrinivas Kandagatla ret = wsa_macro_set_prim_interpolator_rate(dai, (u8) rate_val, sample_rate); 864*809bcbceSSrinivas Kandagatla 865*809bcbceSSrinivas Kandagatla return ret; 866*809bcbceSSrinivas Kandagatla } 867*809bcbceSSrinivas Kandagatla 868*809bcbceSSrinivas Kandagatla static int wsa_macro_hw_params(struct snd_pcm_substream *substream, 869*809bcbceSSrinivas Kandagatla struct snd_pcm_hw_params *params, 870*809bcbceSSrinivas Kandagatla struct snd_soc_dai *dai) 871*809bcbceSSrinivas Kandagatla { 872*809bcbceSSrinivas Kandagatla struct snd_soc_component *component = dai->component; 873*809bcbceSSrinivas Kandagatla int ret; 874*809bcbceSSrinivas Kandagatla 875*809bcbceSSrinivas Kandagatla switch (substream->stream) { 876*809bcbceSSrinivas Kandagatla case SNDRV_PCM_STREAM_PLAYBACK: 877*809bcbceSSrinivas Kandagatla ret = wsa_macro_set_interpolator_rate(dai, params_rate(params)); 878*809bcbceSSrinivas Kandagatla if (ret) { 879*809bcbceSSrinivas Kandagatla dev_err(component->dev, 880*809bcbceSSrinivas Kandagatla "%s: cannot set sample rate: %u\n", 881*809bcbceSSrinivas Kandagatla __func__, params_rate(params)); 882*809bcbceSSrinivas Kandagatla return ret; 883*809bcbceSSrinivas Kandagatla } 884*809bcbceSSrinivas Kandagatla break; 885*809bcbceSSrinivas Kandagatla default: 886*809bcbceSSrinivas Kandagatla break; 887*809bcbceSSrinivas Kandagatla } 888*809bcbceSSrinivas Kandagatla return 0; 889*809bcbceSSrinivas Kandagatla } 890*809bcbceSSrinivas Kandagatla 891*809bcbceSSrinivas Kandagatla static int wsa_macro_get_channel_map(struct snd_soc_dai *dai, 892*809bcbceSSrinivas Kandagatla unsigned int *tx_num, unsigned int *tx_slot, 893*809bcbceSSrinivas Kandagatla unsigned int *rx_num, unsigned int *rx_slot) 894*809bcbceSSrinivas Kandagatla { 895*809bcbceSSrinivas Kandagatla struct snd_soc_component *component = dai->component; 896*809bcbceSSrinivas Kandagatla struct wsa_macro *wsa = snd_soc_component_get_drvdata(component); 897*809bcbceSSrinivas Kandagatla u16 val, mask = 0, cnt = 0, temp; 898*809bcbceSSrinivas Kandagatla 899*809bcbceSSrinivas Kandagatla switch (dai->id) { 900*809bcbceSSrinivas Kandagatla case WSA_MACRO_AIF_VI: 901*809bcbceSSrinivas Kandagatla *tx_slot = wsa->active_ch_mask[dai->id]; 902*809bcbceSSrinivas Kandagatla *tx_num = wsa->active_ch_cnt[dai->id]; 903*809bcbceSSrinivas Kandagatla break; 904*809bcbceSSrinivas Kandagatla case WSA_MACRO_AIF1_PB: 905*809bcbceSSrinivas Kandagatla case WSA_MACRO_AIF_MIX1_PB: 906*809bcbceSSrinivas Kandagatla for_each_set_bit(temp, &wsa->active_ch_mask[dai->id], 907*809bcbceSSrinivas Kandagatla WSA_MACRO_RX_MAX) { 908*809bcbceSSrinivas Kandagatla mask |= (1 << temp); 909*809bcbceSSrinivas Kandagatla if (++cnt == WSA_MACRO_MAX_DMA_CH_PER_PORT) 910*809bcbceSSrinivas Kandagatla break; 911*809bcbceSSrinivas Kandagatla } 912*809bcbceSSrinivas Kandagatla if (mask & 0x0C) 913*809bcbceSSrinivas Kandagatla mask = mask >> 0x2; 914*809bcbceSSrinivas Kandagatla *rx_slot = mask; 915*809bcbceSSrinivas Kandagatla *rx_num = cnt; 916*809bcbceSSrinivas Kandagatla break; 917*809bcbceSSrinivas Kandagatla case WSA_MACRO_AIF_ECHO: 918*809bcbceSSrinivas Kandagatla val = snd_soc_component_read(component, CDC_WSA_RX_INP_MUX_RX_MIX_CFG0); 919*809bcbceSSrinivas Kandagatla if (val & WSA_MACRO_EC_MIX_TX1_MASK) { 920*809bcbceSSrinivas Kandagatla mask |= 0x2; 921*809bcbceSSrinivas Kandagatla cnt++; 922*809bcbceSSrinivas Kandagatla } 923*809bcbceSSrinivas Kandagatla if (val & WSA_MACRO_EC_MIX_TX0_MASK) { 924*809bcbceSSrinivas Kandagatla mask |= 0x1; 925*809bcbceSSrinivas Kandagatla cnt++; 926*809bcbceSSrinivas Kandagatla } 927*809bcbceSSrinivas Kandagatla *tx_slot = mask; 928*809bcbceSSrinivas Kandagatla *tx_num = cnt; 929*809bcbceSSrinivas Kandagatla break; 930*809bcbceSSrinivas Kandagatla default: 931*809bcbceSSrinivas Kandagatla dev_err(component->dev, "%s: Invalid AIF\n", __func__); 932*809bcbceSSrinivas Kandagatla break; 933*809bcbceSSrinivas Kandagatla } 934*809bcbceSSrinivas Kandagatla return 0; 935*809bcbceSSrinivas Kandagatla } 936*809bcbceSSrinivas Kandagatla 937*809bcbceSSrinivas Kandagatla static struct snd_soc_dai_ops wsa_macro_dai_ops = { 938*809bcbceSSrinivas Kandagatla .hw_params = wsa_macro_hw_params, 939*809bcbceSSrinivas Kandagatla .get_channel_map = wsa_macro_get_channel_map, 940*809bcbceSSrinivas Kandagatla }; 941*809bcbceSSrinivas Kandagatla 942*809bcbceSSrinivas Kandagatla static struct snd_soc_dai_driver wsa_macro_dai[] = { 943*809bcbceSSrinivas Kandagatla { 944*809bcbceSSrinivas Kandagatla .name = "wsa_macro_rx1", 945*809bcbceSSrinivas Kandagatla .id = WSA_MACRO_AIF1_PB, 946*809bcbceSSrinivas Kandagatla .playback = { 947*809bcbceSSrinivas Kandagatla .stream_name = "WSA_AIF1 Playback", 948*809bcbceSSrinivas Kandagatla .rates = WSA_MACRO_RX_RATES, 949*809bcbceSSrinivas Kandagatla .formats = WSA_MACRO_RX_FORMATS, 950*809bcbceSSrinivas Kandagatla .rate_max = 384000, 951*809bcbceSSrinivas Kandagatla .rate_min = 8000, 952*809bcbceSSrinivas Kandagatla .channels_min = 1, 953*809bcbceSSrinivas Kandagatla .channels_max = 2, 954*809bcbceSSrinivas Kandagatla }, 955*809bcbceSSrinivas Kandagatla .ops = &wsa_macro_dai_ops, 956*809bcbceSSrinivas Kandagatla }, 957*809bcbceSSrinivas Kandagatla { 958*809bcbceSSrinivas Kandagatla .name = "wsa_macro_rx_mix", 959*809bcbceSSrinivas Kandagatla .id = WSA_MACRO_AIF_MIX1_PB, 960*809bcbceSSrinivas Kandagatla .playback = { 961*809bcbceSSrinivas Kandagatla .stream_name = "WSA_AIF_MIX1 Playback", 962*809bcbceSSrinivas Kandagatla .rates = WSA_MACRO_RX_MIX_RATES, 963*809bcbceSSrinivas Kandagatla .formats = WSA_MACRO_RX_FORMATS, 964*809bcbceSSrinivas Kandagatla .rate_max = 192000, 965*809bcbceSSrinivas Kandagatla .rate_min = 48000, 966*809bcbceSSrinivas Kandagatla .channels_min = 1, 967*809bcbceSSrinivas Kandagatla .channels_max = 2, 968*809bcbceSSrinivas Kandagatla }, 969*809bcbceSSrinivas Kandagatla .ops = &wsa_macro_dai_ops, 970*809bcbceSSrinivas Kandagatla }, 971*809bcbceSSrinivas Kandagatla { 972*809bcbceSSrinivas Kandagatla .name = "wsa_macro_vifeedback", 973*809bcbceSSrinivas Kandagatla .id = WSA_MACRO_AIF_VI, 974*809bcbceSSrinivas Kandagatla .capture = { 975*809bcbceSSrinivas Kandagatla .stream_name = "WSA_AIF_VI Capture", 976*809bcbceSSrinivas Kandagatla .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_48000, 977*809bcbceSSrinivas Kandagatla .formats = WSA_MACRO_RX_FORMATS, 978*809bcbceSSrinivas Kandagatla .rate_max = 48000, 979*809bcbceSSrinivas Kandagatla .rate_min = 8000, 980*809bcbceSSrinivas Kandagatla .channels_min = 1, 981*809bcbceSSrinivas Kandagatla .channels_max = 4, 982*809bcbceSSrinivas Kandagatla }, 983*809bcbceSSrinivas Kandagatla .ops = &wsa_macro_dai_ops, 984*809bcbceSSrinivas Kandagatla }, 985*809bcbceSSrinivas Kandagatla { 986*809bcbceSSrinivas Kandagatla .name = "wsa_macro_echo", 987*809bcbceSSrinivas Kandagatla .id = WSA_MACRO_AIF_ECHO, 988*809bcbceSSrinivas Kandagatla .capture = { 989*809bcbceSSrinivas Kandagatla .stream_name = "WSA_AIF_ECHO Capture", 990*809bcbceSSrinivas Kandagatla .rates = WSA_MACRO_ECHO_RATES, 991*809bcbceSSrinivas Kandagatla .formats = WSA_MACRO_ECHO_FORMATS, 992*809bcbceSSrinivas Kandagatla .rate_max = 48000, 993*809bcbceSSrinivas Kandagatla .rate_min = 8000, 994*809bcbceSSrinivas Kandagatla .channels_min = 1, 995*809bcbceSSrinivas Kandagatla .channels_max = 2, 996*809bcbceSSrinivas Kandagatla }, 997*809bcbceSSrinivas Kandagatla .ops = &wsa_macro_dai_ops, 998*809bcbceSSrinivas Kandagatla }, 999*809bcbceSSrinivas Kandagatla }; 1000*809bcbceSSrinivas Kandagatla 1001*809bcbceSSrinivas Kandagatla static void wsa_macro_mclk_enable(struct wsa_macro *wsa, bool mclk_enable) 1002*809bcbceSSrinivas Kandagatla { 1003*809bcbceSSrinivas Kandagatla struct regmap *regmap = wsa->regmap; 1004*809bcbceSSrinivas Kandagatla 1005*809bcbceSSrinivas Kandagatla if (mclk_enable) { 1006*809bcbceSSrinivas Kandagatla if (wsa->wsa_mclk_users == 0) { 1007*809bcbceSSrinivas Kandagatla regcache_mark_dirty(regmap); 1008*809bcbceSSrinivas Kandagatla regcache_sync(regmap); 1009*809bcbceSSrinivas Kandagatla /* 9.6MHz MCLK, set value 0x00 if other frequency */ 1010*809bcbceSSrinivas Kandagatla regmap_update_bits(regmap, CDC_WSA_TOP_FREQ_MCLK, 0x01, 0x01); 1011*809bcbceSSrinivas Kandagatla regmap_update_bits(regmap, 1012*809bcbceSSrinivas Kandagatla CDC_WSA_CLK_RST_CTRL_MCLK_CONTROL, 1013*809bcbceSSrinivas Kandagatla CDC_WSA_MCLK_EN_MASK, 1014*809bcbceSSrinivas Kandagatla CDC_WSA_MCLK_ENABLE); 1015*809bcbceSSrinivas Kandagatla regmap_update_bits(regmap, 1016*809bcbceSSrinivas Kandagatla CDC_WSA_CLK_RST_CTRL_FS_CNT_CONTROL, 1017*809bcbceSSrinivas Kandagatla CDC_WSA_FS_CNT_EN_MASK, 1018*809bcbceSSrinivas Kandagatla CDC_WSA_FS_CNT_ENABLE); 1019*809bcbceSSrinivas Kandagatla } 1020*809bcbceSSrinivas Kandagatla wsa->wsa_mclk_users++; 1021*809bcbceSSrinivas Kandagatla } else { 1022*809bcbceSSrinivas Kandagatla if (wsa->wsa_mclk_users <= 0) { 1023*809bcbceSSrinivas Kandagatla dev_err(wsa->dev, "clock already disabled\n"); 1024*809bcbceSSrinivas Kandagatla wsa->wsa_mclk_users = 0; 1025*809bcbceSSrinivas Kandagatla return; 1026*809bcbceSSrinivas Kandagatla } 1027*809bcbceSSrinivas Kandagatla wsa->wsa_mclk_users--; 1028*809bcbceSSrinivas Kandagatla if (wsa->wsa_mclk_users == 0) { 1029*809bcbceSSrinivas Kandagatla regmap_update_bits(regmap, 1030*809bcbceSSrinivas Kandagatla CDC_WSA_CLK_RST_CTRL_FS_CNT_CONTROL, 1031*809bcbceSSrinivas Kandagatla CDC_WSA_FS_CNT_EN_MASK, 1032*809bcbceSSrinivas Kandagatla CDC_WSA_FS_CNT_DISABLE); 1033*809bcbceSSrinivas Kandagatla regmap_update_bits(regmap, 1034*809bcbceSSrinivas Kandagatla CDC_WSA_CLK_RST_CTRL_MCLK_CONTROL, 1035*809bcbceSSrinivas Kandagatla CDC_WSA_MCLK_EN_MASK, 1036*809bcbceSSrinivas Kandagatla CDC_WSA_MCLK_DISABLE); 1037*809bcbceSSrinivas Kandagatla } 1038*809bcbceSSrinivas Kandagatla } 1039*809bcbceSSrinivas Kandagatla } 1040*809bcbceSSrinivas Kandagatla 1041*809bcbceSSrinivas Kandagatla static int wsa_macro_get_ec_hq(struct snd_kcontrol *kcontrol, 1042*809bcbceSSrinivas Kandagatla struct snd_ctl_elem_value *ucontrol) 1043*809bcbceSSrinivas Kandagatla { 1044*809bcbceSSrinivas Kandagatla 1045*809bcbceSSrinivas Kandagatla struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); 1046*809bcbceSSrinivas Kandagatla int ec_tx = ((struct soc_mixer_control *) kcontrol->private_value)->shift; 1047*809bcbceSSrinivas Kandagatla struct wsa_macro *wsa = snd_soc_component_get_drvdata(component); 1048*809bcbceSSrinivas Kandagatla 1049*809bcbceSSrinivas Kandagatla ucontrol->value.integer.value[0] = wsa->ec_hq[ec_tx]; 1050*809bcbceSSrinivas Kandagatla 1051*809bcbceSSrinivas Kandagatla return 0; 1052*809bcbceSSrinivas Kandagatla } 1053*809bcbceSSrinivas Kandagatla 1054*809bcbceSSrinivas Kandagatla static int wsa_macro_set_ec_hq(struct snd_kcontrol *kcontrol, 1055*809bcbceSSrinivas Kandagatla struct snd_ctl_elem_value *ucontrol) 1056*809bcbceSSrinivas Kandagatla { 1057*809bcbceSSrinivas Kandagatla struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); 1058*809bcbceSSrinivas Kandagatla int ec_tx = ((struct soc_mixer_control *) kcontrol->private_value)->shift; 1059*809bcbceSSrinivas Kandagatla int value = ucontrol->value.integer.value[0]; 1060*809bcbceSSrinivas Kandagatla struct wsa_macro *wsa = snd_soc_component_get_drvdata(component); 1061*809bcbceSSrinivas Kandagatla 1062*809bcbceSSrinivas Kandagatla wsa->ec_hq[ec_tx] = value; 1063*809bcbceSSrinivas Kandagatla 1064*809bcbceSSrinivas Kandagatla return 0; 1065*809bcbceSSrinivas Kandagatla } 1066*809bcbceSSrinivas Kandagatla 1067*809bcbceSSrinivas Kandagatla static int wsa_macro_get_compander(struct snd_kcontrol *kcontrol, 1068*809bcbceSSrinivas Kandagatla struct snd_ctl_elem_value *ucontrol) 1069*809bcbceSSrinivas Kandagatla { 1070*809bcbceSSrinivas Kandagatla 1071*809bcbceSSrinivas Kandagatla struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); 1072*809bcbceSSrinivas Kandagatla int comp = ((struct soc_mixer_control *) kcontrol->private_value)->shift; 1073*809bcbceSSrinivas Kandagatla struct wsa_macro *wsa = snd_soc_component_get_drvdata(component); 1074*809bcbceSSrinivas Kandagatla 1075*809bcbceSSrinivas Kandagatla ucontrol->value.integer.value[0] = wsa->comp_enabled[comp]; 1076*809bcbceSSrinivas Kandagatla return 0; 1077*809bcbceSSrinivas Kandagatla } 1078*809bcbceSSrinivas Kandagatla 1079*809bcbceSSrinivas Kandagatla static int wsa_macro_set_compander(struct snd_kcontrol *kcontrol, 1080*809bcbceSSrinivas Kandagatla struct snd_ctl_elem_value *ucontrol) 1081*809bcbceSSrinivas Kandagatla { 1082*809bcbceSSrinivas Kandagatla struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); 1083*809bcbceSSrinivas Kandagatla int comp = ((struct soc_mixer_control *) kcontrol->private_value)->shift; 1084*809bcbceSSrinivas Kandagatla int value = ucontrol->value.integer.value[0]; 1085*809bcbceSSrinivas Kandagatla struct wsa_macro *wsa = snd_soc_component_get_drvdata(component); 1086*809bcbceSSrinivas Kandagatla 1087*809bcbceSSrinivas Kandagatla wsa->comp_enabled[comp] = value; 1088*809bcbceSSrinivas Kandagatla 1089*809bcbceSSrinivas Kandagatla return 0; 1090*809bcbceSSrinivas Kandagatla } 1091*809bcbceSSrinivas Kandagatla 1092*809bcbceSSrinivas Kandagatla static int wsa_macro_ear_spkr_pa_gain_get(struct snd_kcontrol *kcontrol, 1093*809bcbceSSrinivas Kandagatla struct snd_ctl_elem_value *ucontrol) 1094*809bcbceSSrinivas Kandagatla { 1095*809bcbceSSrinivas Kandagatla struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); 1096*809bcbceSSrinivas Kandagatla struct wsa_macro *wsa = snd_soc_component_get_drvdata(component); 1097*809bcbceSSrinivas Kandagatla 1098*809bcbceSSrinivas Kandagatla ucontrol->value.integer.value[0] = wsa->ear_spkr_gain; 1099*809bcbceSSrinivas Kandagatla 1100*809bcbceSSrinivas Kandagatla return 0; 1101*809bcbceSSrinivas Kandagatla } 1102*809bcbceSSrinivas Kandagatla 1103*809bcbceSSrinivas Kandagatla static int wsa_macro_ear_spkr_pa_gain_put(struct snd_kcontrol *kcontrol, 1104*809bcbceSSrinivas Kandagatla struct snd_ctl_elem_value *ucontrol) 1105*809bcbceSSrinivas Kandagatla { 1106*809bcbceSSrinivas Kandagatla struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); 1107*809bcbceSSrinivas Kandagatla struct wsa_macro *wsa = snd_soc_component_get_drvdata(component); 1108*809bcbceSSrinivas Kandagatla 1109*809bcbceSSrinivas Kandagatla wsa->ear_spkr_gain = ucontrol->value.integer.value[0]; 1110*809bcbceSSrinivas Kandagatla 1111*809bcbceSSrinivas Kandagatla return 0; 1112*809bcbceSSrinivas Kandagatla } 1113*809bcbceSSrinivas Kandagatla 1114*809bcbceSSrinivas Kandagatla static int wsa_macro_soft_clip_enable_get(struct snd_kcontrol *kcontrol, 1115*809bcbceSSrinivas Kandagatla struct snd_ctl_elem_value *ucontrol) 1116*809bcbceSSrinivas Kandagatla { 1117*809bcbceSSrinivas Kandagatla struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); 1118*809bcbceSSrinivas Kandagatla struct wsa_macro *wsa = snd_soc_component_get_drvdata(component); 1119*809bcbceSSrinivas Kandagatla int path = ((struct soc_mixer_control *)kcontrol->private_value)->shift; 1120*809bcbceSSrinivas Kandagatla 1121*809bcbceSSrinivas Kandagatla ucontrol->value.integer.value[0] = wsa->is_softclip_on[path]; 1122*809bcbceSSrinivas Kandagatla 1123*809bcbceSSrinivas Kandagatla return 0; 1124*809bcbceSSrinivas Kandagatla } 1125*809bcbceSSrinivas Kandagatla 1126*809bcbceSSrinivas Kandagatla static int wsa_macro_soft_clip_enable_put(struct snd_kcontrol *kcontrol, 1127*809bcbceSSrinivas Kandagatla struct snd_ctl_elem_value *ucontrol) 1128*809bcbceSSrinivas Kandagatla { 1129*809bcbceSSrinivas Kandagatla struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); 1130*809bcbceSSrinivas Kandagatla struct wsa_macro *wsa = snd_soc_component_get_drvdata(component); 1131*809bcbceSSrinivas Kandagatla int path = ((struct soc_mixer_control *) kcontrol->private_value)->shift; 1132*809bcbceSSrinivas Kandagatla 1133*809bcbceSSrinivas Kandagatla wsa->is_softclip_on[path] = ucontrol->value.integer.value[0]; 1134*809bcbceSSrinivas Kandagatla 1135*809bcbceSSrinivas Kandagatla return 0; 1136*809bcbceSSrinivas Kandagatla } 1137*809bcbceSSrinivas Kandagatla 1138*809bcbceSSrinivas Kandagatla static const struct snd_kcontrol_new wsa_macro_snd_controls[] = { 1139*809bcbceSSrinivas Kandagatla SOC_ENUM_EXT("EAR SPKR PA Gain", wsa_macro_ear_spkr_pa_gain_enum, 1140*809bcbceSSrinivas Kandagatla wsa_macro_ear_spkr_pa_gain_get, 1141*809bcbceSSrinivas Kandagatla wsa_macro_ear_spkr_pa_gain_put), 1142*809bcbceSSrinivas Kandagatla SOC_SINGLE_EXT("WSA_Softclip0 Enable", SND_SOC_NOPM, 1143*809bcbceSSrinivas Kandagatla WSA_MACRO_SOFTCLIP0, 1, 0, 1144*809bcbceSSrinivas Kandagatla wsa_macro_soft_clip_enable_get, 1145*809bcbceSSrinivas Kandagatla wsa_macro_soft_clip_enable_put), 1146*809bcbceSSrinivas Kandagatla SOC_SINGLE_EXT("WSA_Softclip1 Enable", SND_SOC_NOPM, 1147*809bcbceSSrinivas Kandagatla WSA_MACRO_SOFTCLIP1, 1, 0, 1148*809bcbceSSrinivas Kandagatla wsa_macro_soft_clip_enable_get, 1149*809bcbceSSrinivas Kandagatla wsa_macro_soft_clip_enable_put), 1150*809bcbceSSrinivas Kandagatla 1151*809bcbceSSrinivas Kandagatla SOC_SINGLE_S8_TLV("WSA_RX0 Digital Volume", CDC_WSA_RX0_RX_VOL_CTL, 1152*809bcbceSSrinivas Kandagatla -84, 40, digital_gain), 1153*809bcbceSSrinivas Kandagatla SOC_SINGLE_S8_TLV("WSA_RX1 Digital Volume", CDC_WSA_RX1_RX_VOL_CTL, 1154*809bcbceSSrinivas Kandagatla -84, 40, digital_gain), 1155*809bcbceSSrinivas Kandagatla 1156*809bcbceSSrinivas Kandagatla SOC_SINGLE("WSA_RX0 Digital Mute", CDC_WSA_RX0_RX_PATH_CTL, 4, 1, 0), 1157*809bcbceSSrinivas Kandagatla SOC_SINGLE("WSA_RX1 Digital Mute", CDC_WSA_RX1_RX_PATH_CTL, 4, 1, 0), 1158*809bcbceSSrinivas Kandagatla SOC_SINGLE("WSA_RX0_MIX Digital Mute", CDC_WSA_RX0_RX_PATH_MIX_CTL, 4, 1159*809bcbceSSrinivas Kandagatla 1, 0), 1160*809bcbceSSrinivas Kandagatla SOC_SINGLE("WSA_RX1_MIX Digital Mute", CDC_WSA_RX1_RX_PATH_MIX_CTL, 4, 1161*809bcbceSSrinivas Kandagatla 1, 0), 1162*809bcbceSSrinivas Kandagatla SOC_SINGLE_EXT("WSA_COMP1 Switch", SND_SOC_NOPM, WSA_MACRO_COMP1, 1, 0, 1163*809bcbceSSrinivas Kandagatla wsa_macro_get_compander, wsa_macro_set_compander), 1164*809bcbceSSrinivas Kandagatla SOC_SINGLE_EXT("WSA_COMP2 Switch", SND_SOC_NOPM, WSA_MACRO_COMP2, 1, 0, 1165*809bcbceSSrinivas Kandagatla wsa_macro_get_compander, wsa_macro_set_compander), 1166*809bcbceSSrinivas Kandagatla SOC_SINGLE_EXT("WSA_RX0 EC_HQ Switch", SND_SOC_NOPM, WSA_MACRO_RX0, 1, 0, 1167*809bcbceSSrinivas Kandagatla wsa_macro_get_ec_hq, wsa_macro_set_ec_hq), 1168*809bcbceSSrinivas Kandagatla SOC_SINGLE_EXT("WSA_RX1 EC_HQ Switch", SND_SOC_NOPM, WSA_MACRO_RX1, 1, 0, 1169*809bcbceSSrinivas Kandagatla wsa_macro_get_ec_hq, wsa_macro_set_ec_hq), 1170*809bcbceSSrinivas Kandagatla }; 1171*809bcbceSSrinivas Kandagatla 1172*809bcbceSSrinivas Kandagatla static int wsa_swrm_clock(struct wsa_macro *wsa, bool enable) 1173*809bcbceSSrinivas Kandagatla { 1174*809bcbceSSrinivas Kandagatla struct regmap *regmap = wsa->regmap; 1175*809bcbceSSrinivas Kandagatla 1176*809bcbceSSrinivas Kandagatla if (enable) { 1177*809bcbceSSrinivas Kandagatla wsa_macro_mclk_enable(wsa, true); 1178*809bcbceSSrinivas Kandagatla 1179*809bcbceSSrinivas Kandagatla /* reset swr ip */ 1180*809bcbceSSrinivas Kandagatla if (wsa->reset_swr) 1181*809bcbceSSrinivas Kandagatla regmap_update_bits(regmap, 1182*809bcbceSSrinivas Kandagatla CDC_WSA_CLK_RST_CTRL_SWR_CONTROL, 1183*809bcbceSSrinivas Kandagatla CDC_WSA_SWR_RST_EN_MASK, 1184*809bcbceSSrinivas Kandagatla CDC_WSA_SWR_RST_ENABLE); 1185*809bcbceSSrinivas Kandagatla 1186*809bcbceSSrinivas Kandagatla regmap_update_bits(regmap, CDC_WSA_CLK_RST_CTRL_SWR_CONTROL, 1187*809bcbceSSrinivas Kandagatla CDC_WSA_SWR_CLK_EN_MASK, 1188*809bcbceSSrinivas Kandagatla CDC_WSA_SWR_CLK_ENABLE); 1189*809bcbceSSrinivas Kandagatla 1190*809bcbceSSrinivas Kandagatla /* Bring out of reset */ 1191*809bcbceSSrinivas Kandagatla if (wsa->reset_swr) 1192*809bcbceSSrinivas Kandagatla regmap_update_bits(regmap, 1193*809bcbceSSrinivas Kandagatla CDC_WSA_CLK_RST_CTRL_SWR_CONTROL, 1194*809bcbceSSrinivas Kandagatla CDC_WSA_SWR_RST_EN_MASK, 1195*809bcbceSSrinivas Kandagatla CDC_WSA_SWR_RST_DISABLE); 1196*809bcbceSSrinivas Kandagatla wsa->reset_swr = false; 1197*809bcbceSSrinivas Kandagatla } else { 1198*809bcbceSSrinivas Kandagatla regmap_update_bits(regmap, CDC_WSA_CLK_RST_CTRL_SWR_CONTROL, 1199*809bcbceSSrinivas Kandagatla CDC_WSA_SWR_CLK_EN_MASK, 0); 1200*809bcbceSSrinivas Kandagatla wsa_macro_mclk_enable(wsa, false); 1201*809bcbceSSrinivas Kandagatla } 1202*809bcbceSSrinivas Kandagatla 1203*809bcbceSSrinivas Kandagatla return 0; 1204*809bcbceSSrinivas Kandagatla } 1205*809bcbceSSrinivas Kandagatla 1206*809bcbceSSrinivas Kandagatla static int wsa_macro_component_probe(struct snd_soc_component *comp) 1207*809bcbceSSrinivas Kandagatla { 1208*809bcbceSSrinivas Kandagatla struct wsa_macro *wsa = snd_soc_component_get_drvdata(comp); 1209*809bcbceSSrinivas Kandagatla 1210*809bcbceSSrinivas Kandagatla snd_soc_component_init_regmap(comp, wsa->regmap); 1211*809bcbceSSrinivas Kandagatla 1212*809bcbceSSrinivas Kandagatla wsa->spkr_gain_offset = WSA_MACRO_GAIN_OFFSET_M1P5_DB; 1213*809bcbceSSrinivas Kandagatla 1214*809bcbceSSrinivas Kandagatla /* set SPKR rate to FS_2P4_3P072 */ 1215*809bcbceSSrinivas Kandagatla snd_soc_component_update_bits(comp, CDC_WSA_RX0_RX_PATH_CFG1, 1216*809bcbceSSrinivas Kandagatla CDC_WSA_RX_PATH_SPKR_RATE_MASK, 1217*809bcbceSSrinivas Kandagatla CDC_WSA_RX_PATH_SPKR_RATE_FS_2P4_3P072); 1218*809bcbceSSrinivas Kandagatla 1219*809bcbceSSrinivas Kandagatla snd_soc_component_update_bits(comp, CDC_WSA_RX1_RX_PATH_CFG1, 1220*809bcbceSSrinivas Kandagatla CDC_WSA_RX_PATH_SPKR_RATE_MASK, 1221*809bcbceSSrinivas Kandagatla CDC_WSA_RX_PATH_SPKR_RATE_FS_2P4_3P072); 1222*809bcbceSSrinivas Kandagatla 1223*809bcbceSSrinivas Kandagatla wsa_macro_set_spkr_mode(comp, WSA_MACRO_SPKR_MODE_1); 1224*809bcbceSSrinivas Kandagatla 1225*809bcbceSSrinivas Kandagatla return 0; 1226*809bcbceSSrinivas Kandagatla } 1227*809bcbceSSrinivas Kandagatla 1228*809bcbceSSrinivas Kandagatla static int swclk_gate_enable(struct clk_hw *hw) 1229*809bcbceSSrinivas Kandagatla { 1230*809bcbceSSrinivas Kandagatla return wsa_swrm_clock(to_wsa_macro(hw), true); 1231*809bcbceSSrinivas Kandagatla } 1232*809bcbceSSrinivas Kandagatla 1233*809bcbceSSrinivas Kandagatla static void swclk_gate_disable(struct clk_hw *hw) 1234*809bcbceSSrinivas Kandagatla { 1235*809bcbceSSrinivas Kandagatla wsa_swrm_clock(to_wsa_macro(hw), false); 1236*809bcbceSSrinivas Kandagatla } 1237*809bcbceSSrinivas Kandagatla 1238*809bcbceSSrinivas Kandagatla static int swclk_gate_is_enabled(struct clk_hw *hw) 1239*809bcbceSSrinivas Kandagatla { 1240*809bcbceSSrinivas Kandagatla struct wsa_macro *wsa = to_wsa_macro(hw); 1241*809bcbceSSrinivas Kandagatla int ret, val; 1242*809bcbceSSrinivas Kandagatla 1243*809bcbceSSrinivas Kandagatla regmap_read(wsa->regmap, CDC_WSA_CLK_RST_CTRL_SWR_CONTROL, &val); 1244*809bcbceSSrinivas Kandagatla ret = val & BIT(0); 1245*809bcbceSSrinivas Kandagatla 1246*809bcbceSSrinivas Kandagatla return ret; 1247*809bcbceSSrinivas Kandagatla } 1248*809bcbceSSrinivas Kandagatla 1249*809bcbceSSrinivas Kandagatla static unsigned long swclk_recalc_rate(struct clk_hw *hw, 1250*809bcbceSSrinivas Kandagatla unsigned long parent_rate) 1251*809bcbceSSrinivas Kandagatla { 1252*809bcbceSSrinivas Kandagatla return parent_rate / 2; 1253*809bcbceSSrinivas Kandagatla } 1254*809bcbceSSrinivas Kandagatla 1255*809bcbceSSrinivas Kandagatla static const struct clk_ops swclk_gate_ops = { 1256*809bcbceSSrinivas Kandagatla .prepare = swclk_gate_enable, 1257*809bcbceSSrinivas Kandagatla .unprepare = swclk_gate_disable, 1258*809bcbceSSrinivas Kandagatla .is_enabled = swclk_gate_is_enabled, 1259*809bcbceSSrinivas Kandagatla .recalc_rate = swclk_recalc_rate, 1260*809bcbceSSrinivas Kandagatla }; 1261*809bcbceSSrinivas Kandagatla 1262*809bcbceSSrinivas Kandagatla static struct clk *wsa_macro_register_mclk_output(struct wsa_macro *wsa) 1263*809bcbceSSrinivas Kandagatla { 1264*809bcbceSSrinivas Kandagatla struct device *dev = wsa->dev; 1265*809bcbceSSrinivas Kandagatla struct device_node *np = dev->of_node; 1266*809bcbceSSrinivas Kandagatla const char *parent_clk_name; 1267*809bcbceSSrinivas Kandagatla const char *clk_name = "mclk"; 1268*809bcbceSSrinivas Kandagatla struct clk_hw *hw; 1269*809bcbceSSrinivas Kandagatla struct clk_init_data init; 1270*809bcbceSSrinivas Kandagatla int ret; 1271*809bcbceSSrinivas Kandagatla 1272*809bcbceSSrinivas Kandagatla parent_clk_name = __clk_get_name(wsa->clks[2].clk); 1273*809bcbceSSrinivas Kandagatla 1274*809bcbceSSrinivas Kandagatla init.name = clk_name; 1275*809bcbceSSrinivas Kandagatla init.ops = &swclk_gate_ops; 1276*809bcbceSSrinivas Kandagatla init.flags = 0; 1277*809bcbceSSrinivas Kandagatla init.parent_names = &parent_clk_name; 1278*809bcbceSSrinivas Kandagatla init.num_parents = 1; 1279*809bcbceSSrinivas Kandagatla wsa->hw.init = &init; 1280*809bcbceSSrinivas Kandagatla hw = &wsa->hw; 1281*809bcbceSSrinivas Kandagatla ret = clk_hw_register(wsa->dev, hw); 1282*809bcbceSSrinivas Kandagatla if (ret) 1283*809bcbceSSrinivas Kandagatla return ERR_PTR(ret); 1284*809bcbceSSrinivas Kandagatla 1285*809bcbceSSrinivas Kandagatla of_clk_add_provider(np, of_clk_src_simple_get, hw->clk); 1286*809bcbceSSrinivas Kandagatla 1287*809bcbceSSrinivas Kandagatla return NULL; 1288*809bcbceSSrinivas Kandagatla } 1289*809bcbceSSrinivas Kandagatla 1290*809bcbceSSrinivas Kandagatla static const struct snd_soc_component_driver wsa_macro_component_drv = { 1291*809bcbceSSrinivas Kandagatla .name = "WSA MACRO", 1292*809bcbceSSrinivas Kandagatla .probe = wsa_macro_component_probe, 1293*809bcbceSSrinivas Kandagatla .controls = wsa_macro_snd_controls, 1294*809bcbceSSrinivas Kandagatla .num_controls = ARRAY_SIZE(wsa_macro_snd_controls), 1295*809bcbceSSrinivas Kandagatla }; 1296*809bcbceSSrinivas Kandagatla 1297*809bcbceSSrinivas Kandagatla static int wsa_macro_probe(struct platform_device *pdev) 1298*809bcbceSSrinivas Kandagatla { 1299*809bcbceSSrinivas Kandagatla struct device *dev = &pdev->dev; 1300*809bcbceSSrinivas Kandagatla struct wsa_macro *wsa; 1301*809bcbceSSrinivas Kandagatla void __iomem *base; 1302*809bcbceSSrinivas Kandagatla int ret; 1303*809bcbceSSrinivas Kandagatla 1304*809bcbceSSrinivas Kandagatla wsa = devm_kzalloc(dev, sizeof(*wsa), GFP_KERNEL); 1305*809bcbceSSrinivas Kandagatla if (!wsa) 1306*809bcbceSSrinivas Kandagatla return -ENOMEM; 1307*809bcbceSSrinivas Kandagatla 1308*809bcbceSSrinivas Kandagatla wsa->clks[0].id = "macro"; 1309*809bcbceSSrinivas Kandagatla wsa->clks[1].id = "dcodec"; 1310*809bcbceSSrinivas Kandagatla wsa->clks[2].id = "mclk"; 1311*809bcbceSSrinivas Kandagatla wsa->clks[3].id = "npl"; 1312*809bcbceSSrinivas Kandagatla wsa->clks[4].id = "fsgen"; 1313*809bcbceSSrinivas Kandagatla 1314*809bcbceSSrinivas Kandagatla ret = devm_clk_bulk_get(dev, WSA_NUM_CLKS_MAX, wsa->clks); 1315*809bcbceSSrinivas Kandagatla if (ret) { 1316*809bcbceSSrinivas Kandagatla dev_err(dev, "Error getting WSA Clocks (%d)\n", ret); 1317*809bcbceSSrinivas Kandagatla return ret; 1318*809bcbceSSrinivas Kandagatla } 1319*809bcbceSSrinivas Kandagatla 1320*809bcbceSSrinivas Kandagatla base = devm_platform_ioremap_resource(pdev, 0); 1321*809bcbceSSrinivas Kandagatla if (IS_ERR(base)) 1322*809bcbceSSrinivas Kandagatla return PTR_ERR(base); 1323*809bcbceSSrinivas Kandagatla 1324*809bcbceSSrinivas Kandagatla wsa->regmap = devm_regmap_init_mmio(dev, base, &wsa_regmap_config); 1325*809bcbceSSrinivas Kandagatla 1326*809bcbceSSrinivas Kandagatla dev_set_drvdata(dev, wsa); 1327*809bcbceSSrinivas Kandagatla 1328*809bcbceSSrinivas Kandagatla wsa->reset_swr = true; 1329*809bcbceSSrinivas Kandagatla wsa->dev = dev; 1330*809bcbceSSrinivas Kandagatla 1331*809bcbceSSrinivas Kandagatla /* set MCLK and NPL rates */ 1332*809bcbceSSrinivas Kandagatla clk_set_rate(wsa->clks[2].clk, WSA_MACRO_MCLK_FREQ); 1333*809bcbceSSrinivas Kandagatla clk_set_rate(wsa->clks[3].clk, WSA_MACRO_MCLK_FREQ); 1334*809bcbceSSrinivas Kandagatla 1335*809bcbceSSrinivas Kandagatla ret = clk_bulk_prepare_enable(WSA_NUM_CLKS_MAX, wsa->clks); 1336*809bcbceSSrinivas Kandagatla if (ret) 1337*809bcbceSSrinivas Kandagatla return ret; 1338*809bcbceSSrinivas Kandagatla 1339*809bcbceSSrinivas Kandagatla wsa_macro_register_mclk_output(wsa); 1340*809bcbceSSrinivas Kandagatla 1341*809bcbceSSrinivas Kandagatla ret = devm_snd_soc_register_component(dev, &wsa_macro_component_drv, 1342*809bcbceSSrinivas Kandagatla wsa_macro_dai, 1343*809bcbceSSrinivas Kandagatla ARRAY_SIZE(wsa_macro_dai)); 1344*809bcbceSSrinivas Kandagatla if (ret) 1345*809bcbceSSrinivas Kandagatla goto err; 1346*809bcbceSSrinivas Kandagatla 1347*809bcbceSSrinivas Kandagatla return ret; 1348*809bcbceSSrinivas Kandagatla err: 1349*809bcbceSSrinivas Kandagatla clk_bulk_disable_unprepare(WSA_NUM_CLKS_MAX, wsa->clks); 1350*809bcbceSSrinivas Kandagatla 1351*809bcbceSSrinivas Kandagatla return ret; 1352*809bcbceSSrinivas Kandagatla 1353*809bcbceSSrinivas Kandagatla } 1354*809bcbceSSrinivas Kandagatla 1355*809bcbceSSrinivas Kandagatla static int wsa_macro_remove(struct platform_device *pdev) 1356*809bcbceSSrinivas Kandagatla { 1357*809bcbceSSrinivas Kandagatla struct wsa_macro *wsa = dev_get_drvdata(&pdev->dev); 1358*809bcbceSSrinivas Kandagatla 1359*809bcbceSSrinivas Kandagatla of_clk_del_provider(pdev->dev.of_node); 1360*809bcbceSSrinivas Kandagatla 1361*809bcbceSSrinivas Kandagatla clk_bulk_disable_unprepare(WSA_NUM_CLKS_MAX, wsa->clks); 1362*809bcbceSSrinivas Kandagatla 1363*809bcbceSSrinivas Kandagatla return 0; 1364*809bcbceSSrinivas Kandagatla } 1365*809bcbceSSrinivas Kandagatla 1366*809bcbceSSrinivas Kandagatla static const struct of_device_id wsa_macro_dt_match[] = { 1367*809bcbceSSrinivas Kandagatla {.compatible = "qcom,sm8250-lpass-wsa-macro"}, 1368*809bcbceSSrinivas Kandagatla {} 1369*809bcbceSSrinivas Kandagatla }; 1370*809bcbceSSrinivas Kandagatla MODULE_DEVICE_TABLE(of, wsa_macro_dt_match); 1371*809bcbceSSrinivas Kandagatla 1372*809bcbceSSrinivas Kandagatla static struct platform_driver wsa_macro_driver = { 1373*809bcbceSSrinivas Kandagatla .driver = { 1374*809bcbceSSrinivas Kandagatla .name = "wsa_macro", 1375*809bcbceSSrinivas Kandagatla .of_match_table = wsa_macro_dt_match, 1376*809bcbceSSrinivas Kandagatla }, 1377*809bcbceSSrinivas Kandagatla .probe = wsa_macro_probe, 1378*809bcbceSSrinivas Kandagatla .remove = wsa_macro_remove, 1379*809bcbceSSrinivas Kandagatla }; 1380*809bcbceSSrinivas Kandagatla 1381*809bcbceSSrinivas Kandagatla module_platform_driver(wsa_macro_driver); 1382*809bcbceSSrinivas Kandagatla MODULE_DESCRIPTION("WSA macro driver"); 1383*809bcbceSSrinivas Kandagatla MODULE_LICENSE("GPL"); 1384