4033 lines · c
1// SPDX-License-Identifier: GPL-2.0-only2// Copyright (c) 2018-2020, The Linux Foundation. All rights reserved.3 4#include <linux/cleanup.h>5#include <linux/module.h>6#include <linux/init.h>7#include <linux/io.h>8#include <linux/platform_device.h>9#include <linux/pm_runtime.h>10#include <linux/clk.h>11#include <sound/soc.h>12#include <sound/pcm.h>13#include <sound/pcm_params.h>14#include <sound/soc-dapm.h>15#include <sound/tlv.h>16#include <linux/of_clk.h>17#include <linux/clk-provider.h>18 19#include "lpass-macro-common.h"20 21#define CDC_RX_TOP_TOP_CFG0 (0x0000)22#define CDC_RX_TOP_SWR_CTRL (0x0008)23#define CDC_RX_TOP_DEBUG (0x000C)24#define CDC_RX_TOP_DEBUG_BUS (0x0010)25#define CDC_RX_TOP_DEBUG_EN0 (0x0014)26#define CDC_RX_TOP_DEBUG_EN1 (0x0018)27#define CDC_RX_TOP_DEBUG_EN2 (0x001C)28#define CDC_RX_TOP_HPHL_COMP_WR_LSB (0x0020)29#define CDC_RX_TOP_HPHL_COMP_WR_MSB (0x0024)30#define CDC_RX_TOP_HPHL_COMP_LUT (0x0028)31#define CDC_RX_TOP_HPH_LUT_BYPASS_MASK BIT(7)32#define CDC_RX_TOP_HPHL_COMP_RD_LSB (0x002C)33#define CDC_RX_TOP_HPHL_COMP_RD_MSB (0x0030)34#define CDC_RX_TOP_HPHR_COMP_WR_LSB (0x0034)35#define CDC_RX_TOP_HPHR_COMP_WR_MSB (0x0038)36#define CDC_RX_TOP_HPHR_COMP_LUT (0x003C)37#define CDC_RX_TOP_HPHR_COMP_RD_LSB (0x0040)38#define CDC_RX_TOP_HPHR_COMP_RD_MSB (0x0044)39#define CDC_RX_TOP_DSD0_DEBUG_CFG0 (0x0070)40#define CDC_RX_TOP_DSD0_DEBUG_CFG1 (0x0074)41#define CDC_RX_TOP_DSD0_DEBUG_CFG2 (0x0078)42#define CDC_RX_TOP_DSD0_DEBUG_CFG3 (0x007C)43#define CDC_RX_TOP_DSD1_DEBUG_CFG0 (0x0080)44#define CDC_RX_TOP_DSD1_DEBUG_CFG1 (0x0084)45#define CDC_RX_TOP_DSD1_DEBUG_CFG2 (0x0088)46#define CDC_RX_TOP_DSD1_DEBUG_CFG3 (0x008C)47#define CDC_RX_TOP_RX_I2S_CTL (0x0090)48#define CDC_RX_TOP_TX_I2S2_CTL (0x0094)49#define CDC_RX_TOP_I2S_CLK (0x0098)50#define CDC_RX_TOP_I2S_RESET (0x009C)51#define CDC_RX_TOP_I2S_MUX (0x00A0)52#define CDC_RX_CLK_RST_CTRL_MCLK_CONTROL (0x0100)53#define CDC_RX_CLK_MCLK_EN_MASK BIT(0)54#define CDC_RX_CLK_MCLK_ENABLE BIT(0)55#define CDC_RX_CLK_MCLK2_EN_MASK BIT(1)56#define CDC_RX_CLK_MCLK2_ENABLE BIT(1)57#define CDC_RX_CLK_RST_CTRL_FS_CNT_CONTROL (0x0104)58#define CDC_RX_FS_MCLK_CNT_EN_MASK BIT(0)59#define CDC_RX_FS_MCLK_CNT_ENABLE BIT(0)60#define CDC_RX_FS_MCLK_CNT_CLR_MASK BIT(1)61#define CDC_RX_FS_MCLK_CNT_CLR BIT(1)62#define CDC_RX_CLK_RST_CTRL_SWR_CONTROL (0x0108)63#define CDC_RX_SWR_CLK_EN_MASK BIT(0)64#define CDC_RX_SWR_RESET_MASK BIT(1)65#define CDC_RX_SWR_RESET BIT(1)66#define CDC_RX_CLK_RST_CTRL_DSD_CONTROL (0x010C)67#define CDC_RX_CLK_RST_CTRL_ASRC_SHARE_CONTROL (0x0110)68#define CDC_RX_SOFTCLIP_CRC (0x0140)69#define CDC_RX_SOFTCLIP_CLK_EN_MASK BIT(0)70#define CDC_RX_SOFTCLIP_SOFTCLIP_CTRL (0x0144)71#define CDC_RX_SOFTCLIP_EN_MASK BIT(0)72#define CDC_RX_INP_MUX_RX_INT0_CFG0 (0x0180)73#define CDC_RX_INTX_1_MIX_INP0_SEL_MASK GENMASK(3, 0)74#define CDC_RX_INTX_1_MIX_INP1_SEL_MASK GENMASK(7, 4)75#define CDC_RX_INP_MUX_RX_INT0_CFG1 (0x0184)76#define CDC_RX_INTX_2_SEL_MASK GENMASK(3, 0)77#define CDC_RX_INTX_1_MIX_INP2_SEL_MASK GENMASK(7, 4)78#define CDC_RX_INP_MUX_RX_INT1_CFG0 (0x0188)79#define CDC_RX_INP_MUX_RX_INT1_CFG1 (0x018C)80#define CDC_RX_INP_MUX_RX_INT2_CFG0 (0x0190)81#define CDC_RX_INP_MUX_RX_INT2_CFG1 (0x0194)82#define CDC_RX_INP_MUX_RX_MIX_CFG4 (0x0198)83#define CDC_RX_INP_MUX_RX_MIX_CFG5 (0x019C)84#define CDC_RX_INP_MUX_SIDETONE_SRC_CFG0 (0x01A0)85#define CDC_RX_CLSH_CRC (0x0200)86#define CDC_RX_CLSH_CLK_EN_MASK BIT(0)87#define CDC_RX_CLSH_DLY_CTRL (0x0204)88#define CDC_RX_CLSH_DECAY_CTRL (0x0208)89#define CDC_RX_CLSH_DECAY_RATE_MASK GENMASK(2, 0)90#define CDC_RX_CLSH_HPH_V_PA (0x020C)91#define CDC_RX_CLSH_HPH_V_PA_MIN_MASK GENMASK(5, 0)92#define CDC_RX_CLSH_EAR_V_PA (0x0210)93#define CDC_RX_CLSH_HPH_V_HD (0x0214)94#define CDC_RX_CLSH_EAR_V_HD (0x0218)95#define CDC_RX_CLSH_K1_MSB (0x021C)96#define CDC_RX_CLSH_K1_MSB_COEFF_MASK GENMASK(3, 0)97#define CDC_RX_CLSH_K1_LSB (0x0220)98#define CDC_RX_CLSH_K2_MSB (0x0224)99#define CDC_RX_CLSH_K2_LSB (0x0228)100#define CDC_RX_CLSH_IDLE_CTRL (0x022C)101#define CDC_RX_CLSH_IDLE_HPH (0x0230)102#define CDC_RX_CLSH_IDLE_EAR (0x0234)103#define CDC_RX_CLSH_TEST0 (0x0238)104#define CDC_RX_CLSH_TEST1 (0x023C)105#define CDC_RX_CLSH_OVR_VREF (0x0240)106#define CDC_RX_CLSH_CLSG_CTL (0x0244)107#define CDC_RX_CLSH_CLSG_CFG1 (0x0248)108#define CDC_RX_CLSH_CLSG_CFG2 (0x024C)109#define CDC_RX_BCL_VBAT_PATH_CTL (0x0280)110#define CDC_RX_BCL_VBAT_CFG (0x0284)111#define CDC_RX_BCL_VBAT_ADC_CAL1 (0x0288)112#define CDC_RX_BCL_VBAT_ADC_CAL2 (0x028C)113#define CDC_RX_BCL_VBAT_ADC_CAL3 (0x0290)114#define CDC_RX_BCL_VBAT_PK_EST1 (0x0294)115#define CDC_RX_BCL_VBAT_PK_EST2 (0x0298)116#define CDC_RX_BCL_VBAT_PK_EST3 (0x029C)117#define CDC_RX_BCL_VBAT_RF_PROC1 (0x02A0)118#define CDC_RX_BCL_VBAT_RF_PROC2 (0x02A4)119#define CDC_RX_BCL_VBAT_TAC1 (0x02A8)120#define CDC_RX_BCL_VBAT_TAC2 (0x02AC)121#define CDC_RX_BCL_VBAT_TAC3 (0x02B0)122#define CDC_RX_BCL_VBAT_TAC4 (0x02B4)123#define CDC_RX_BCL_VBAT_GAIN_UPD1 (0x02B8)124#define CDC_RX_BCL_VBAT_GAIN_UPD2 (0x02BC)125#define CDC_RX_BCL_VBAT_GAIN_UPD3 (0x02C0)126#define CDC_RX_BCL_VBAT_GAIN_UPD4 (0x02C4)127#define CDC_RX_BCL_VBAT_GAIN_UPD5 (0x02C8)128#define CDC_RX_BCL_VBAT_DEBUG1 (0x02CC)129#define CDC_RX_BCL_VBAT_GAIN_UPD_MON (0x02D0)130#define CDC_RX_BCL_VBAT_GAIN_MON_VAL (0x02D4)131#define CDC_RX_BCL_VBAT_BAN (0x02D8)132#define CDC_RX_BCL_VBAT_BCL_GAIN_UPD1 (0x02DC)133#define CDC_RX_BCL_VBAT_BCL_GAIN_UPD2 (0x02E0)134#define CDC_RX_BCL_VBAT_BCL_GAIN_UPD3 (0x02E4)135#define CDC_RX_BCL_VBAT_BCL_GAIN_UPD4 (0x02E8)136#define CDC_RX_BCL_VBAT_BCL_GAIN_UPD5 (0x02EC)137#define CDC_RX_BCL_VBAT_BCL_GAIN_UPD6 (0x02F0)138#define CDC_RX_BCL_VBAT_BCL_GAIN_UPD7 (0x02F4)139#define CDC_RX_BCL_VBAT_BCL_GAIN_UPD8 (0x02F8)140#define CDC_RX_BCL_VBAT_BCL_GAIN_UPD9 (0x02FC)141#define CDC_RX_BCL_VBAT_ATTN1 (0x0300)142#define CDC_RX_BCL_VBAT_ATTN2 (0x0304)143#define CDC_RX_BCL_VBAT_ATTN3 (0x0308)144#define CDC_RX_BCL_VBAT_DECODE_CTL1 (0x030C)145#define CDC_RX_BCL_VBAT_DECODE_CTL2 (0x0310)146#define CDC_RX_BCL_VBAT_DECODE_CFG1 (0x0314)147#define CDC_RX_BCL_VBAT_DECODE_CFG2 (0x0318)148#define CDC_RX_BCL_VBAT_DECODE_CFG3 (0x031C)149#define CDC_RX_BCL_VBAT_DECODE_CFG4 (0x0320)150#define CDC_RX_BCL_VBAT_DECODE_ST (0x0324)151#define CDC_RX_INTR_CTRL_CFG (0x0340)152#define CDC_RX_INTR_CTRL_CLR_COMMIT (0x0344)153#define CDC_RX_INTR_CTRL_PIN1_MASK0 (0x0360)154#define CDC_RX_INTR_CTRL_PIN1_STATUS0 (0x0368)155#define CDC_RX_INTR_CTRL_PIN1_CLEAR0 (0x0370)156#define CDC_RX_INTR_CTRL_PIN2_MASK0 (0x0380)157#define CDC_RX_INTR_CTRL_PIN2_STATUS0 (0x0388)158#define CDC_RX_INTR_CTRL_PIN2_CLEAR0 (0x0390)159#define CDC_RX_INTR_CTRL_LEVEL0 (0x03C0)160#define CDC_RX_INTR_CTRL_BYPASS0 (0x03C8)161#define CDC_RX_INTR_CTRL_SET0 (0x03D0)162#define CDC_RX_RXn_RX_PATH_CTL(rx, n) (0x0400 + rx->rxn_reg_stride * n)163#define CDC_RX_RX0_RX_PATH_CTL (0x0400)164#define CDC_RX_PATH_RESET_EN_MASK BIT(6)165#define CDC_RX_PATH_CLK_EN_MASK BIT(5)166#define CDC_RX_PATH_CLK_ENABLE BIT(5)167#define CDC_RX_PATH_PGA_MUTE_MASK BIT(4)168#define CDC_RX_PATH_PGA_MUTE_ENABLE BIT(4)169#define CDC_RX_PATH_PCM_RATE_MASK GENMASK(3, 0)170#define CDC_RX_RXn_RX_PATH_CFG0(rx, n) (0x0404 + rx->rxn_reg_stride * n)171#define CDC_RX_RXn_COMP_EN_MASK BIT(1)172#define CDC_RX_RX0_RX_PATH_CFG0 (0x0404)173#define CDC_RX_RXn_CLSH_EN_MASK BIT(6)174#define CDC_RX_DLY_ZN_EN_MASK BIT(3)175#define CDC_RX_DLY_ZN_ENABLE BIT(3)176#define CDC_RX_RXn_HD2_EN_MASK BIT(2)177#define CDC_RX_RXn_RX_PATH_CFG1(rx, n) (0x0408 + rx->rxn_reg_stride * n)178#define CDC_RX_RXn_SIDETONE_EN_MASK BIT(4)179#define CDC_RX_RX0_RX_PATH_CFG1 (0x0408)180#define CDC_RX_RX0_HPH_L_EAR_SEL_MASK BIT(1)181#define CDC_RX_RXn_RX_PATH_CFG2(rx, n) (0x040C + rx->rxn_reg_stride * n)182#define CDC_RX_RXn_HPF_CUT_FREQ_MASK GENMASK(1, 0)183#define CDC_RX_RX0_RX_PATH_CFG2 (0x040C)184#define CDC_RX_RXn_RX_PATH_CFG3(rx, n) (0x0410 + rx->rxn_reg_stride * n)185#define CDC_RX_RX0_RX_PATH_CFG3 (0x0410)186#define CDC_RX_DC_COEFF_SEL_MASK GENMASK(1, 0)187#define CDC_RX_DC_COEFF_SEL_TWO 0x2188#define CDC_RX_RXn_RX_VOL_CTL(rx, n) (0x0414 + rx->rxn_reg_stride * n)189#define CDC_RX_RX0_RX_VOL_CTL (0x0414)190#define CDC_RX_RXn_RX_PATH_MIX_CTL(rx, n) (0x0418 + rx->rxn_reg_stride * n)191#define CDC_RX_RXn_MIX_PCM_RATE_MASK GENMASK(3, 0)192#define CDC_RX_RXn_MIX_RESET_MASK BIT(6)193#define CDC_RX_RXn_MIX_RESET BIT(6)194#define CDC_RX_RXn_MIX_CLK_EN_MASK BIT(5)195#define CDC_RX_RX0_RX_PATH_MIX_CTL (0x0418)196#define CDC_RX_RX0_RX_PATH_MIX_CFG (0x041C)197#define CDC_RX_RXn_RX_VOL_MIX_CTL(rx, n) (0x0420 + rx->rxn_reg_stride * n)198#define CDC_RX_RX0_RX_VOL_MIX_CTL (0x0420)199#define CDC_RX_RX0_RX_PATH_SEC1 (0x0424)200#define CDC_RX_RX0_RX_PATH_SEC2 (0x0428)201#define CDC_RX_RX0_RX_PATH_SEC3 (0x042C)202#define CDC_RX_RXn_RX_PATH_SEC3(rx, n) (0x042c + rx->rxn_reg_stride * n)203#define CDC_RX_RX0_RX_PATH_SEC4 (0x0430)204#define CDC_RX_RX0_RX_PATH_SEC7 (0x0434)205#define CDC_RX_RXn_RX_PATH_SEC7(rx, n) \206 (0x0434 + (rx->rxn_reg_stride * n) + ((n > 1) ? rx->rxn_reg_stride2 : 0))207#define CDC_RX_DSM_OUT_DELAY_SEL_MASK GENMASK(2, 0)208#define CDC_RX_DSM_OUT_DELAY_TWO_SAMPLE 0x2209#define CDC_RX_RX0_RX_PATH_MIX_SEC0 (0x0438)210#define CDC_RX_RX0_RX_PATH_MIX_SEC1 (0x043C)211#define CDC_RX_RXn_RX_PATH_DSM_CTL(rx, n) \212 (0x0440 + (rx->rxn_reg_stride * n) + ((n > 1) ? rx->rxn_reg_stride2 : 0))213#define CDC_RX_RXn_DSM_CLK_EN_MASK BIT(0)214#define CDC_RX_RX0_RX_PATH_DSM_CTL (0x0440)215#define CDC_RX_RX0_RX_PATH_DSM_DATA1 (0x0444)216#define CDC_RX_RX0_RX_PATH_DSM_DATA2 (0x0448)217#define CDC_RX_RX0_RX_PATH_DSM_DATA3 (0x044C)218#define CDC_RX_RX0_RX_PATH_DSM_DATA4 (0x0450)219#define CDC_RX_RX0_RX_PATH_DSM_DATA5 (0x0454)220#define CDC_RX_RX0_RX_PATH_DSM_DATA6 (0x0458)221/* RX offsets prior to 2.5 codec version */222#define CDC_RX_RX1_RX_PATH_CTL (0x0480)223#define CDC_RX_RX1_RX_PATH_CFG0 (0x0484)224#define CDC_RX_RX1_RX_PATH_CFG1 (0x0488)225#define CDC_RX_RX1_RX_PATH_CFG2 (0x048C)226#define CDC_RX_RX1_RX_PATH_CFG3 (0x0490)227#define CDC_RX_RX1_RX_VOL_CTL (0x0494)228#define CDC_RX_RX1_RX_PATH_MIX_CTL (0x0498)229#define CDC_RX_RX1_RX_PATH_MIX_CFG (0x049C)230#define CDC_RX_RX1_RX_VOL_MIX_CTL (0x04A0)231#define CDC_RX_RX1_RX_PATH_SEC1 (0x04A4)232#define CDC_RX_RX1_RX_PATH_SEC2 (0x04A8)233#define CDC_RX_RX1_RX_PATH_SEC3 (0x04AC)234#define CDC_RX_RXn_HD2_ALPHA_MASK GENMASK(5, 2)235#define CDC_RX_RX1_RX_PATH_SEC4 (0x04B0)236#define CDC_RX_RX1_RX_PATH_SEC7 (0x04B4)237#define CDC_RX_RX1_RX_PATH_MIX_SEC0 (0x04B8)238#define CDC_RX_RX1_RX_PATH_MIX_SEC1 (0x04BC)239#define CDC_RX_RX1_RX_PATH_DSM_CTL (0x04C0)240#define CDC_RX_RX1_RX_PATH_DSM_DATA1 (0x04C4)241#define CDC_RX_RX1_RX_PATH_DSM_DATA2 (0x04C8)242#define CDC_RX_RX1_RX_PATH_DSM_DATA3 (0x04CC)243#define CDC_RX_RX1_RX_PATH_DSM_DATA4 (0x04D0)244#define CDC_RX_RX1_RX_PATH_DSM_DATA5 (0x04D4)245#define CDC_RX_RX1_RX_PATH_DSM_DATA6 (0x04D8)246#define CDC_RX_RX2_RX_PATH_CTL (0x0500)247#define CDC_RX_RX2_RX_PATH_CFG0 (0x0504)248#define CDC_RX_RX2_CLSH_EN_MASK BIT(4)249#define CDC_RX_RX2_DLY_Z_EN_MASK BIT(3)250#define CDC_RX_RX2_RX_PATH_CFG1 (0x0508)251#define CDC_RX_RX2_RX_PATH_CFG2 (0x050C)252#define CDC_RX_RX2_RX_PATH_CFG3 (0x0510)253#define CDC_RX_RX2_RX_VOL_CTL (0x0514)254#define CDC_RX_RX2_RX_PATH_MIX_CTL (0x0518)255#define CDC_RX_RX2_RX_PATH_MIX_CFG (0x051C)256#define CDC_RX_RX2_RX_VOL_MIX_CTL (0x0520)257#define CDC_RX_RX2_RX_PATH_SEC0 (0x0524)258#define CDC_RX_RX2_RX_PATH_SEC1 (0x0528)259#define CDC_RX_RX2_RX_PATH_SEC2 (0x052C)260#define CDC_RX_RX2_RX_PATH_SEC3 (0x0530)261#define CDC_RX_RX2_RX_PATH_SEC4 (0x0534)262#define CDC_RX_RX2_RX_PATH_SEC5 (0x0538)263#define CDC_RX_RX2_RX_PATH_SEC6 (0x053C)264#define CDC_RX_RX2_RX_PATH_SEC7 (0x0540)265#define CDC_RX_RX2_RX_PATH_MIX_SEC0 (0x0544)266#define CDC_RX_RX2_RX_PATH_MIX_SEC1 (0x0548)267#define CDC_RX_RX2_RX_PATH_DSM_CTL (0x054C)268 269/* LPASS CODEC version 2.5 rx reg offsets */270#define CDC_2_5_RX_RX1_RX_PATH_CTL (0x04c0)271#define CDC_2_5_RX_RX1_RX_PATH_CFG0 (0x04c4)272#define CDC_2_5_RX_RX1_RX_PATH_CFG1 (0x04c8)273#define CDC_2_5_RX_RX1_RX_PATH_CFG2 (0x04cC)274#define CDC_2_5_RX_RX1_RX_PATH_CFG3 (0x04d0)275#define CDC_2_5_RX_RX1_RX_VOL_CTL (0x04d4)276#define CDC_2_5_RX_RX1_RX_PATH_MIX_CTL (0x04d8)277#define CDC_2_5_RX_RX1_RX_PATH_MIX_CFG (0x04dC)278#define CDC_2_5_RX_RX1_RX_VOL_MIX_CTL (0x04e0)279#define CDC_2_5_RX_RX1_RX_PATH_SEC1 (0x04e4)280#define CDC_2_5_RX_RX1_RX_PATH_SEC2 (0x04e8)281#define CDC_2_5_RX_RX1_RX_PATH_SEC3 (0x04eC)282#define CDC_2_5_RX_RX1_RX_PATH_SEC4 (0x04f0)283#define CDC_2_5_RX_RX1_RX_PATH_SEC7 (0x04f4)284#define CDC_2_5_RX_RX1_RX_PATH_MIX_SEC0 (0x04f8)285#define CDC_2_5_RX_RX1_RX_PATH_MIX_SEC1 (0x04fC)286#define CDC_2_5_RX_RX1_RX_PATH_DSM_CTL (0x0500)287#define CDC_2_5_RX_RX1_RX_PATH_DSM_DATA1 (0x0504)288#define CDC_2_5_RX_RX1_RX_PATH_DSM_DATA2 (0x0508)289#define CDC_2_5_RX_RX1_RX_PATH_DSM_DATA3 (0x050C)290#define CDC_2_5_RX_RX1_RX_PATH_DSM_DATA4 (0x0510)291#define CDC_2_5_RX_RX1_RX_PATH_DSM_DATA5 (0x0514)292#define CDC_2_5_RX_RX1_RX_PATH_DSM_DATA6 (0x0518)293 294#define CDC_2_5_RX_RX2_RX_PATH_CTL (0x0580)295#define CDC_2_5_RX_RX2_RX_PATH_CFG0 (0x0584)296#define CDC_2_5_RX_RX2_RX_PATH_CFG1 (0x0588)297#define CDC_2_5_RX_RX2_RX_PATH_CFG2 (0x058C)298#define CDC_2_5_RX_RX2_RX_PATH_CFG3 (0x0590)299#define CDC_2_5_RX_RX2_RX_VOL_CTL (0x0594)300#define CDC_2_5_RX_RX2_RX_PATH_MIX_CTL (0x0598)301#define CDC_2_5_RX_RX2_RX_PATH_MIX_CFG (0x059C)302#define CDC_2_5_RX_RX2_RX_VOL_MIX_CTL (0x05a0)303#define CDC_2_5_RX_RX2_RX_PATH_SEC0 (0x05a4)304#define CDC_2_5_RX_RX2_RX_PATH_SEC1 (0x05a8)305#define CDC_2_5_RX_RX2_RX_PATH_SEC2 (0x05aC)306#define CDC_2_5_RX_RX2_RX_PATH_SEC3 (0x05b0)307#define CDC_2_5_RX_RX2_RX_PATH_SEC4 (0x05b4)308#define CDC_2_5_RX_RX2_RX_PATH_SEC5 (0x05b8)309#define CDC_2_5_RX_RX2_RX_PATH_SEC6 (0x05bC)310#define CDC_2_5_RX_RX2_RX_PATH_SEC7 (0x05c0)311#define CDC_2_5_RX_RX2_RX_PATH_MIX_SEC0 (0x05c4)312#define CDC_2_5_RX_RX2_RX_PATH_MIX_SEC1 (0x05c8)313#define CDC_2_5_RX_RX2_RX_PATH_DSM_CTL (0x05cC)314 315#define CDC_RX_IDLE_DETECT_PATH_CTL (0x0780)316#define CDC_RX_IDLE_DETECT_CFG0 (0x0784)317#define CDC_RX_IDLE_DETECT_CFG1 (0x0788)318#define CDC_RX_IDLE_DETECT_CFG2 (0x078C)319#define CDC_RX_IDLE_DETECT_CFG3 (0x0790)320#define CDC_RX_COMPANDERn_CTL0(n) (0x0800 + 0x40 * n)321#define CDC_RX_COMPANDERn_CLK_EN_MASK BIT(0)322#define CDC_RX_COMPANDERn_SOFT_RST_MASK BIT(1)323#define CDC_RX_COMPANDERn_HALT_MASK BIT(2)324#define CDC_RX_COMPANDER0_CTL0 (0x0800)325#define CDC_RX_COMPANDER0_CTL1 (0x0804)326#define CDC_RX_COMPANDER0_CTL2 (0x0808)327#define CDC_RX_COMPANDER0_CTL3 (0x080C)328#define CDC_RX_COMPANDER0_CTL4 (0x0810)329#define CDC_RX_COMPANDER0_CTL5 (0x0814)330#define CDC_RX_COMPANDER0_CTL6 (0x0818)331#define CDC_RX_COMPANDER0_CTL7 (0x081C)332#define CDC_RX_COMPANDER1_CTL0 (0x0840)333#define CDC_RX_COMPANDER1_CTL1 (0x0844)334#define CDC_RX_COMPANDER1_CTL2 (0x0848)335#define CDC_RX_COMPANDER1_CTL3 (0x084C)336#define CDC_RX_COMPANDER1_CTL4 (0x0850)337#define CDC_RX_COMPANDER1_CTL5 (0x0854)338#define CDC_RX_COMPANDER1_CTL6 (0x0858)339#define CDC_RX_COMPANDER1_CTL7 (0x085C)340#define CDC_RX_COMPANDER1_HPH_LOW_PWR_MODE_MASK BIT(5)341#define CDC_RX_SIDETONE_IIR0_IIR_PATH_CTL (0x0A00)342#define CDC_RX_SIDETONE_IIR0_IIR_GAIN_B1_CTL (0x0A04)343#define CDC_RX_SIDETONE_IIR0_IIR_GAIN_B2_CTL (0x0A08)344#define CDC_RX_SIDETONE_IIR0_IIR_GAIN_B3_CTL (0x0A0C)345#define CDC_RX_SIDETONE_IIR0_IIR_GAIN_B4_CTL (0x0A10)346#define CDC_RX_SIDETONE_IIR0_IIR_GAIN_B5_CTL (0x0A14)347#define CDC_RX_SIDETONE_IIR0_IIR_GAIN_B6_CTL (0x0A18)348#define CDC_RX_SIDETONE_IIR0_IIR_GAIN_B7_CTL (0x0A1C)349#define CDC_RX_SIDETONE_IIR0_IIR_GAIN_B8_CTL (0x0A20)350#define CDC_RX_SIDETONE_IIR0_IIR_CTL (0x0A24)351#define CDC_RX_SIDETONE_IIR0_IIR_GAIN_TIMER_CTL (0x0A28)352#define CDC_RX_SIDETONE_IIR0_IIR_COEF_B1_CTL (0x0A2C)353#define CDC_RX_SIDETONE_IIR0_IIR_COEF_B2_CTL (0x0A30)354#define CDC_RX_SIDETONE_IIR1_IIR_PATH_CTL (0x0A80)355#define CDC_RX_SIDETONE_IIR1_IIR_GAIN_B1_CTL (0x0A84)356#define CDC_RX_SIDETONE_IIR1_IIR_GAIN_B2_CTL (0x0A88)357#define CDC_RX_SIDETONE_IIR1_IIR_GAIN_B3_CTL (0x0A8C)358#define CDC_RX_SIDETONE_IIR1_IIR_GAIN_B4_CTL (0x0A90)359#define CDC_RX_SIDETONE_IIR1_IIR_GAIN_B5_CTL (0x0A94)360#define CDC_RX_SIDETONE_IIR1_IIR_GAIN_B6_CTL (0x0A98)361#define CDC_RX_SIDETONE_IIR1_IIR_GAIN_B7_CTL (0x0A9C)362#define CDC_RX_SIDETONE_IIR1_IIR_GAIN_B8_CTL (0x0AA0)363#define CDC_RX_SIDETONE_IIR1_IIR_CTL (0x0AA4)364#define CDC_RX_SIDETONE_IIR1_IIR_GAIN_TIMER_CTL (0x0AA8)365#define CDC_RX_SIDETONE_IIR1_IIR_COEF_B1_CTL (0x0AAC)366#define CDC_RX_SIDETONE_IIR1_IIR_COEF_B2_CTL (0x0AB0)367#define CDC_RX_IIR_INP_MUX_IIR0_MIX_CFG0 (0x0B00)368#define CDC_RX_IIR_INP_MUX_IIR0_MIX_CFG1 (0x0B04)369#define CDC_RX_IIR_INP_MUX_IIR0_MIX_CFG2 (0x0B08)370#define CDC_RX_IIR_INP_MUX_IIR0_MIX_CFG3 (0x0B0C)371#define CDC_RX_IIR_INP_MUX_IIR1_MIX_CFG0 (0x0B10)372#define CDC_RX_IIR_INP_MUX_IIR1_MIX_CFG1 (0x0B14)373#define CDC_RX_IIR_INP_MUX_IIR1_MIX_CFG2 (0x0B18)374#define CDC_RX_IIR_INP_MUX_IIR1_MIX_CFG3 (0x0B1C)375#define CDC_RX_SIDETONE_SRC0_ST_SRC_PATH_CTL (0x0B40)376#define CDC_RX_SIDETONE_SRC0_ST_SRC_PATH_CFG1 (0x0B44)377#define CDC_RX_SIDETONE_SRC1_ST_SRC_PATH_CTL (0x0B50)378#define CDC_RX_SIDETONE_SRC1_ST_SRC_PATH_CFG1 (0x0B54)379#define CDC_RX_EC_REF_HQ0_EC_REF_HQ_PATH_CTL (0x0C00)380#define CDC_RX_EC_REF_HQ0_EC_REF_HQ_CFG0 (0x0C04)381#define CDC_RX_EC_REF_HQ1_EC_REF_HQ_PATH_CTL (0x0C40)382#define CDC_RX_EC_REF_HQ1_EC_REF_HQ_CFG0 (0x0C44)383#define CDC_RX_EC_REF_HQ2_EC_REF_HQ_PATH_CTL (0x0C80)384#define CDC_RX_EC_REF_HQ2_EC_REF_HQ_CFG0 (0x0C84)385#define CDC_RX_EC_ASRC0_CLK_RST_CTL (0x0D00)386#define CDC_RX_EC_ASRC0_CTL0 (0x0D04)387#define CDC_RX_EC_ASRC0_CTL1 (0x0D08)388#define CDC_RX_EC_ASRC0_FIFO_CTL (0x0D0C)389#define CDC_RX_EC_ASRC0_STATUS_FMIN_CNTR_LSB (0x0D10)390#define CDC_RX_EC_ASRC0_STATUS_FMIN_CNTR_MSB (0x0D14)391#define CDC_RX_EC_ASRC0_STATUS_FMAX_CNTR_LSB (0x0D18)392#define CDC_RX_EC_ASRC0_STATUS_FMAX_CNTR_MSB (0x0D1C)393#define CDC_RX_EC_ASRC0_STATUS_FIFO (0x0D20)394#define CDC_RX_EC_ASRC1_CLK_RST_CTL (0x0D40)395#define CDC_RX_EC_ASRC1_CTL0 (0x0D44)396#define CDC_RX_EC_ASRC1_CTL1 (0x0D48)397#define CDC_RX_EC_ASRC1_FIFO_CTL (0x0D4C)398#define CDC_RX_EC_ASRC1_STATUS_FMIN_CNTR_LSB (0x0D50)399#define CDC_RX_EC_ASRC1_STATUS_FMIN_CNTR_MSB (0x0D54)400#define CDC_RX_EC_ASRC1_STATUS_FMAX_CNTR_LSB (0x0D58)401#define CDC_RX_EC_ASRC1_STATUS_FMAX_CNTR_MSB (0x0D5C)402#define CDC_RX_EC_ASRC1_STATUS_FIFO (0x0D60)403#define CDC_RX_EC_ASRC2_CLK_RST_CTL (0x0D80)404#define CDC_RX_EC_ASRC2_CTL0 (0x0D84)405#define CDC_RX_EC_ASRC2_CTL1 (0x0D88)406#define CDC_RX_EC_ASRC2_FIFO_CTL (0x0D8C)407#define CDC_RX_EC_ASRC2_STATUS_FMIN_CNTR_LSB (0x0D90)408#define CDC_RX_EC_ASRC2_STATUS_FMIN_CNTR_MSB (0x0D94)409#define CDC_RX_EC_ASRC2_STATUS_FMAX_CNTR_LSB (0x0D98)410#define CDC_RX_EC_ASRC2_STATUS_FMAX_CNTR_MSB (0x0D9C)411#define CDC_RX_EC_ASRC2_STATUS_FIFO (0x0DA0)412#define CDC_RX_DSD0_PATH_CTL (0x0F00)413#define CDC_RX_DSD0_CFG0 (0x0F04)414#define CDC_RX_DSD0_CFG1 (0x0F08)415#define CDC_RX_DSD0_CFG2 (0x0F0C)416#define CDC_RX_DSD1_PATH_CTL (0x0F80)417#define CDC_RX_DSD1_CFG0 (0x0F84)418#define CDC_RX_DSD1_CFG1 (0x0F88)419#define CDC_RX_DSD1_CFG2 (0x0F8C)420#define RX_MAX_OFFSET (0x0F8C)421 422#define MCLK_FREQ 19200000423 424#define RX_MACRO_RATES (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 |\425 SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 |\426 SNDRV_PCM_RATE_96000 | SNDRV_PCM_RATE_192000 |\427 SNDRV_PCM_RATE_384000)428/* Fractional Rates */429#define RX_MACRO_FRAC_RATES (SNDRV_PCM_RATE_44100 | SNDRV_PCM_RATE_88200 |\430 SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800)431 432#define RX_MACRO_FORMATS (SNDRV_PCM_FMTBIT_S16_LE |\433 SNDRV_PCM_FMTBIT_S24_LE |\434 SNDRV_PCM_FMTBIT_S24_3LE | SNDRV_PCM_FMTBIT_S32_LE)435 436#define RX_MACRO_ECHO_RATES (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 |\437 SNDRV_PCM_RATE_48000)438#define RX_MACRO_ECHO_FORMATS (SNDRV_PCM_FMTBIT_S16_LE |\439 SNDRV_PCM_FMTBIT_S24_LE |\440 SNDRV_PCM_FMTBIT_S24_3LE)441 442#define RX_MACRO_MAX_DMA_CH_PER_PORT 2443 444#define RX_MACRO_EC_MIX_TX0_MASK 0xf0445#define RX_MACRO_EC_MIX_TX1_MASK 0x0f446#define RX_MACRO_EC_MIX_TX2_MASK 0x0f447 448#define COMP_MAX_COEFF 25449#define RX_NUM_CLKS_MAX 5450 451struct comp_coeff_val {452 u8 lsb;453 u8 msb;454};455 456enum {457 HPH_ULP,458 HPH_LOHIFI,459 HPH_MODE_MAX,460};461 462static const struct comp_coeff_val comp_coeff_table[HPH_MODE_MAX][COMP_MAX_COEFF] = {463 {464 {0x40, 0x00},465 {0x4C, 0x00},466 {0x5A, 0x00},467 {0x6B, 0x00},468 {0x7F, 0x00},469 {0x97, 0x00},470 {0xB3, 0x00},471 {0xD5, 0x00},472 {0xFD, 0x00},473 {0x2D, 0x01},474 {0x66, 0x01},475 {0xA7, 0x01},476 {0xF8, 0x01},477 {0x57, 0x02},478 {0xC7, 0x02},479 {0x4B, 0x03},480 {0xE9, 0x03},481 {0xA3, 0x04},482 {0x7D, 0x05},483 {0x90, 0x06},484 {0xD1, 0x07},485 {0x49, 0x09},486 {0x00, 0x0B},487 {0x01, 0x0D},488 {0x59, 0x0F},489 },490 {491 {0x40, 0x00},492 {0x4C, 0x00},493 {0x5A, 0x00},494 {0x6B, 0x00},495 {0x80, 0x00},496 {0x98, 0x00},497 {0xB4, 0x00},498 {0xD5, 0x00},499 {0xFE, 0x00},500 {0x2E, 0x01},501 {0x66, 0x01},502 {0xA9, 0x01},503 {0xF8, 0x01},504 {0x56, 0x02},505 {0xC4, 0x02},506 {0x4F, 0x03},507 {0xF0, 0x03},508 {0xAE, 0x04},509 {0x8B, 0x05},510 {0x8E, 0x06},511 {0xBC, 0x07},512 {0x56, 0x09},513 {0x0F, 0x0B},514 {0x13, 0x0D},515 {0x6F, 0x0F},516 },517};518 519enum {520 INTERP_HPHL,521 INTERP_HPHR,522 INTERP_AUX,523 INTERP_MAX524};525 526enum {527 RX_MACRO_RX0,528 RX_MACRO_RX1,529 RX_MACRO_RX2,530 RX_MACRO_RX3,531 RX_MACRO_RX4,532 RX_MACRO_RX5,533 RX_MACRO_PORTS_MAX534};535 536enum {537 RX_MACRO_COMP1, /* HPH_L */538 RX_MACRO_COMP2, /* HPH_R */539 RX_MACRO_COMP_MAX540};541 542enum {543 RX_MACRO_EC0_MUX = 0,544 RX_MACRO_EC1_MUX,545 RX_MACRO_EC2_MUX,546 RX_MACRO_EC_MUX_MAX,547};548 549enum {550 INTn_1_INP_SEL_ZERO = 0,551 INTn_1_INP_SEL_DEC0,552 INTn_1_INP_SEL_DEC1,553 INTn_1_INP_SEL_IIR0,554 INTn_1_INP_SEL_IIR1,555 INTn_1_INP_SEL_RX0,556 INTn_1_INP_SEL_RX1,557 INTn_1_INP_SEL_RX2,558 INTn_1_INP_SEL_RX3,559 INTn_1_INP_SEL_RX4,560 INTn_1_INP_SEL_RX5,561};562 563enum {564 INTn_2_INP_SEL_ZERO = 0,565 INTn_2_INP_SEL_RX0,566 INTn_2_INP_SEL_RX1,567 INTn_2_INP_SEL_RX2,568 INTn_2_INP_SEL_RX3,569 INTn_2_INP_SEL_RX4,570 INTn_2_INP_SEL_RX5,571};572 573enum {574 INTERP_MAIN_PATH,575 INTERP_MIX_PATH,576};577 578/* Codec supports 2 IIR filters */579enum {580 IIR0 = 0,581 IIR1,582 IIR_MAX,583};584 585/* Each IIR has 5 Filter Stages */586enum {587 BAND1 = 0,588 BAND2,589 BAND3,590 BAND4,591 BAND5,592 BAND_MAX,593};594 595#define RX_MACRO_IIR_FILTER_SIZE (sizeof(u32) * BAND_MAX)596 597#define RX_MACRO_IIR_FILTER_CTL(xname, iidx, bidx) \598{ \599 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \600 .info = rx_macro_iir_filter_info, \601 .get = rx_macro_get_iir_band_audio_mixer, \602 .put = rx_macro_put_iir_band_audio_mixer, \603 .private_value = (unsigned long)&(struct wcd_iir_filter_ctl) { \604 .iir_idx = iidx, \605 .band_idx = bidx, \606 .bytes_ext = {.max = RX_MACRO_IIR_FILTER_SIZE, }, \607 } \608}609 610struct interp_sample_rate {611 int sample_rate;612 int rate_val;613};614 615static struct interp_sample_rate sr_val_tbl[] = {616 {8000, 0x0}, {16000, 0x1}, {32000, 0x3}, {48000, 0x4}, {96000, 0x5},617 {192000, 0x6}, {384000, 0x7}, {44100, 0x9}, {88200, 0xA},618 {176400, 0xB}, {352800, 0xC},619};620 621enum {622 RX_MACRO_AIF_INVALID = 0,623 RX_MACRO_AIF1_PB,624 RX_MACRO_AIF2_PB,625 RX_MACRO_AIF3_PB,626 RX_MACRO_AIF4_PB,627 RX_MACRO_AIF_ECHO,628 RX_MACRO_MAX_DAIS,629};630 631enum {632 RX_MACRO_AIF1_CAP = 0,633 RX_MACRO_AIF2_CAP,634 RX_MACRO_AIF3_CAP,635 RX_MACRO_MAX_AIF_CAP_DAIS636};637 638struct rx_macro {639 struct device *dev;640 int comp_enabled[RX_MACRO_COMP_MAX];641 /* Main path clock users count */642 int main_clk_users[INTERP_MAX];643 int rx_port_value[RX_MACRO_PORTS_MAX];644 u16 prim_int_users[INTERP_MAX];645 int rx_mclk_users;646 int clsh_users;647 int rx_mclk_cnt;648 enum lpass_codec_version codec_version;649 int rxn_reg_stride;650 int rxn_reg_stride2;651 bool is_ear_mode_on;652 bool hph_pwr_mode;653 bool hph_hd2_mode;654 struct snd_soc_component *component;655 unsigned long active_ch_mask[RX_MACRO_MAX_DAIS];656 unsigned long active_ch_cnt[RX_MACRO_MAX_DAIS];657 u16 bit_width[RX_MACRO_MAX_DAIS];658 int is_softclip_on;659 int is_aux_hpf_on;660 int softclip_clk_users;661 struct lpass_macro *pds;662 struct regmap *regmap;663 struct clk *mclk;664 struct clk *npl;665 struct clk *macro;666 struct clk *dcodec;667 struct clk *fsgen;668 struct clk_hw hw;669};670#define to_rx_macro(_hw) container_of(_hw, struct rx_macro, hw)671 672struct wcd_iir_filter_ctl {673 unsigned int iir_idx;674 unsigned int band_idx;675 struct soc_bytes_ext bytes_ext;676};677 678static const DECLARE_TLV_DB_SCALE(digital_gain, -8400, 100, -8400);679 680static const char * const rx_int_mix_mux_text[] = {681 "ZERO", "RX0", "RX1", "RX2", "RX3", "RX4", "RX5"682};683 684static const char * const rx_prim_mix_text[] = {685 "ZERO", "DEC0", "DEC1", "IIR0", "IIR1", "RX0", "RX1", "RX2",686 "RX3", "RX4", "RX5"687};688 689static const char * const rx_sidetone_mix_text[] = {690 "ZERO", "SRC0", "SRC1", "SRC_SUM"691};692 693static const char * const iir_inp_mux_text[] = {694 "ZERO", "DEC0", "DEC1", "DEC2", "DEC3",695 "RX0", "RX1", "RX2", "RX3", "RX4", "RX5"696};697 698static const char * const rx_int_dem_inp_mux_text[] = {699 "NORMAL_DSM_OUT", "CLSH_DSM_OUT",700};701 702static const char * const rx_int0_1_interp_mux_text[] = {703 "ZERO", "RX INT0_1 MIX1",704};705 706static const char * const rx_int1_1_interp_mux_text[] = {707 "ZERO", "RX INT1_1 MIX1",708};709 710static const char * const rx_int2_1_interp_mux_text[] = {711 "ZERO", "RX INT2_1 MIX1",712};713 714static const char * const rx_int0_2_interp_mux_text[] = {715 "ZERO", "RX INT0_2 MUX",716};717 718static const char * const rx_int1_2_interp_mux_text[] = {719 "ZERO", "RX INT1_2 MUX",720};721 722static const char * const rx_int2_2_interp_mux_text[] = {723 "ZERO", "RX INT2_2 MUX",724};725 726static const char *const rx_macro_mux_text[] = {727 "ZERO", "AIF1_PB", "AIF2_PB", "AIF3_PB", "AIF4_PB"728};729 730static const char *const rx_macro_hph_pwr_mode_text[] = {731 "ULP", "LOHIFI"732};733 734static const char * const rx_echo_mux_text[] = {735 "ZERO", "RX_MIX0", "RX_MIX1", "RX_MIX2"736};737 738static const struct soc_enum rx_macro_hph_pwr_mode_enum =739 SOC_ENUM_SINGLE_EXT(2, rx_macro_hph_pwr_mode_text);740static const struct soc_enum rx_mix_tx2_mux_enum =741 SOC_ENUM_SINGLE(CDC_RX_INP_MUX_RX_MIX_CFG5, 0, 4, rx_echo_mux_text);742static const struct soc_enum rx_mix_tx1_mux_enum =743 SOC_ENUM_SINGLE(CDC_RX_INP_MUX_RX_MIX_CFG4, 0, 4, rx_echo_mux_text);744static const struct soc_enum rx_mix_tx0_mux_enum =745 SOC_ENUM_SINGLE(CDC_RX_INP_MUX_RX_MIX_CFG4, 4, 4, rx_echo_mux_text);746 747static SOC_ENUM_SINGLE_DECL(rx_int0_2_enum, CDC_RX_INP_MUX_RX_INT0_CFG1, 0,748 rx_int_mix_mux_text);749static SOC_ENUM_SINGLE_DECL(rx_int1_2_enum, CDC_RX_INP_MUX_RX_INT1_CFG1, 0,750 rx_int_mix_mux_text);751static SOC_ENUM_SINGLE_DECL(rx_int2_2_enum, CDC_RX_INP_MUX_RX_INT2_CFG1, 0,752 rx_int_mix_mux_text);753 754static SOC_ENUM_SINGLE_DECL(rx_int0_1_mix_inp0_enum, CDC_RX_INP_MUX_RX_INT0_CFG0, 0,755 rx_prim_mix_text);756static SOC_ENUM_SINGLE_DECL(rx_int0_1_mix_inp1_enum, CDC_RX_INP_MUX_RX_INT0_CFG0, 4,757 rx_prim_mix_text);758static SOC_ENUM_SINGLE_DECL(rx_int0_1_mix_inp2_enum, CDC_RX_INP_MUX_RX_INT0_CFG1, 4,759 rx_prim_mix_text);760static SOC_ENUM_SINGLE_DECL(rx_int1_1_mix_inp0_enum, CDC_RX_INP_MUX_RX_INT1_CFG0, 0,761 rx_prim_mix_text);762static SOC_ENUM_SINGLE_DECL(rx_int1_1_mix_inp1_enum, CDC_RX_INP_MUX_RX_INT1_CFG0, 4,763 rx_prim_mix_text);764static SOC_ENUM_SINGLE_DECL(rx_int1_1_mix_inp2_enum, CDC_RX_INP_MUX_RX_INT1_CFG1, 4,765 rx_prim_mix_text);766static SOC_ENUM_SINGLE_DECL(rx_int2_1_mix_inp0_enum, CDC_RX_INP_MUX_RX_INT2_CFG0, 0,767 rx_prim_mix_text);768static SOC_ENUM_SINGLE_DECL(rx_int2_1_mix_inp1_enum, CDC_RX_INP_MUX_RX_INT2_CFG0, 4,769 rx_prim_mix_text);770static SOC_ENUM_SINGLE_DECL(rx_int2_1_mix_inp2_enum, CDC_RX_INP_MUX_RX_INT2_CFG1, 4,771 rx_prim_mix_text);772 773static SOC_ENUM_SINGLE_DECL(rx_int0_mix2_inp_enum, CDC_RX_INP_MUX_SIDETONE_SRC_CFG0, 2,774 rx_sidetone_mix_text);775static SOC_ENUM_SINGLE_DECL(rx_int1_mix2_inp_enum, CDC_RX_INP_MUX_SIDETONE_SRC_CFG0, 4,776 rx_sidetone_mix_text);777static SOC_ENUM_SINGLE_DECL(rx_int2_mix2_inp_enum, CDC_RX_INP_MUX_SIDETONE_SRC_CFG0, 6,778 rx_sidetone_mix_text);779static SOC_ENUM_SINGLE_DECL(iir0_inp0_enum, CDC_RX_IIR_INP_MUX_IIR0_MIX_CFG0, 0,780 iir_inp_mux_text);781static SOC_ENUM_SINGLE_DECL(iir0_inp1_enum, CDC_RX_IIR_INP_MUX_IIR0_MIX_CFG1, 0,782 iir_inp_mux_text);783static SOC_ENUM_SINGLE_DECL(iir0_inp2_enum, CDC_RX_IIR_INP_MUX_IIR0_MIX_CFG2, 0,784 iir_inp_mux_text);785static SOC_ENUM_SINGLE_DECL(iir0_inp3_enum, CDC_RX_IIR_INP_MUX_IIR0_MIX_CFG3, 0,786 iir_inp_mux_text);787static SOC_ENUM_SINGLE_DECL(iir1_inp0_enum, CDC_RX_IIR_INP_MUX_IIR1_MIX_CFG0, 0,788 iir_inp_mux_text);789static SOC_ENUM_SINGLE_DECL(iir1_inp1_enum, CDC_RX_IIR_INP_MUX_IIR1_MIX_CFG1, 0,790 iir_inp_mux_text);791static SOC_ENUM_SINGLE_DECL(iir1_inp2_enum, CDC_RX_IIR_INP_MUX_IIR1_MIX_CFG2, 0,792 iir_inp_mux_text);793static SOC_ENUM_SINGLE_DECL(iir1_inp3_enum, CDC_RX_IIR_INP_MUX_IIR1_MIX_CFG3, 0,794 iir_inp_mux_text);795 796static SOC_ENUM_SINGLE_DECL(rx_int0_1_interp_enum, SND_SOC_NOPM, 0,797 rx_int0_1_interp_mux_text);798static SOC_ENUM_SINGLE_DECL(rx_int1_1_interp_enum, SND_SOC_NOPM, 0,799 rx_int1_1_interp_mux_text);800static SOC_ENUM_SINGLE_DECL(rx_int2_1_interp_enum, SND_SOC_NOPM, 0,801 rx_int2_1_interp_mux_text);802static SOC_ENUM_SINGLE_DECL(rx_int0_2_interp_enum, SND_SOC_NOPM, 0,803 rx_int0_2_interp_mux_text);804static SOC_ENUM_SINGLE_DECL(rx_int1_2_interp_enum, SND_SOC_NOPM, 0,805 rx_int1_2_interp_mux_text);806static SOC_ENUM_SINGLE_DECL(rx_int2_2_interp_enum, SND_SOC_NOPM, 0,807 rx_int2_2_interp_mux_text);808static SOC_ENUM_SINGLE_DECL(rx_int0_dem_inp_enum, CDC_RX_RX0_RX_PATH_CFG1, 0,809 rx_int_dem_inp_mux_text);810static SOC_ENUM_SINGLE_DECL(rx_int1_dem_inp_enum, CDC_RX_RX1_RX_PATH_CFG1, 0,811 rx_int_dem_inp_mux_text);812static SOC_ENUM_SINGLE_DECL(rx_2_5_int1_dem_inp_enum, CDC_2_5_RX_RX1_RX_PATH_CFG1, 0,813 rx_int_dem_inp_mux_text);814 815static SOC_ENUM_SINGLE_DECL(rx_macro_rx0_enum, SND_SOC_NOPM, 0, rx_macro_mux_text);816static SOC_ENUM_SINGLE_DECL(rx_macro_rx1_enum, SND_SOC_NOPM, 0, rx_macro_mux_text);817static SOC_ENUM_SINGLE_DECL(rx_macro_rx2_enum, SND_SOC_NOPM, 0, rx_macro_mux_text);818static SOC_ENUM_SINGLE_DECL(rx_macro_rx3_enum, SND_SOC_NOPM, 0, rx_macro_mux_text);819static SOC_ENUM_SINGLE_DECL(rx_macro_rx4_enum, SND_SOC_NOPM, 0, rx_macro_mux_text);820static SOC_ENUM_SINGLE_DECL(rx_macro_rx5_enum, SND_SOC_NOPM, 0, rx_macro_mux_text);821 822static const struct snd_kcontrol_new rx_mix_tx1_mux =823 SOC_DAPM_ENUM("RX MIX TX1_MUX Mux", rx_mix_tx1_mux_enum);824static const struct snd_kcontrol_new rx_mix_tx2_mux = 825 SOC_DAPM_ENUM("RX MIX TX2_MUX Mux", rx_mix_tx2_mux_enum);826static const struct snd_kcontrol_new rx_int0_2_mux =827 SOC_DAPM_ENUM("rx_int0_2", rx_int0_2_enum);828static const struct snd_kcontrol_new rx_int1_2_mux =829 SOC_DAPM_ENUM("rx_int1_2", rx_int1_2_enum);830static const struct snd_kcontrol_new rx_int2_2_mux =831 SOC_DAPM_ENUM("rx_int2_2", rx_int2_2_enum);832static const struct snd_kcontrol_new rx_int0_1_mix_inp0_mux =833 SOC_DAPM_ENUM("rx_int0_1_mix_inp0", rx_int0_1_mix_inp0_enum);834static const struct snd_kcontrol_new rx_int0_1_mix_inp1_mux =835 SOC_DAPM_ENUM("rx_int0_1_mix_inp1", rx_int0_1_mix_inp1_enum);836static const struct snd_kcontrol_new rx_int0_1_mix_inp2_mux =837 SOC_DAPM_ENUM("rx_int0_1_mix_inp2", rx_int0_1_mix_inp2_enum);838static const struct snd_kcontrol_new rx_int1_1_mix_inp0_mux =839 SOC_DAPM_ENUM("rx_int1_1_mix_inp0", rx_int1_1_mix_inp0_enum);840static const struct snd_kcontrol_new rx_int1_1_mix_inp1_mux =841 SOC_DAPM_ENUM("rx_int1_1_mix_inp1", rx_int1_1_mix_inp1_enum);842static const struct snd_kcontrol_new rx_int1_1_mix_inp2_mux =843 SOC_DAPM_ENUM("rx_int1_1_mix_inp2", rx_int1_1_mix_inp2_enum);844static const struct snd_kcontrol_new rx_int2_1_mix_inp0_mux =845 SOC_DAPM_ENUM("rx_int2_1_mix_inp0", rx_int2_1_mix_inp0_enum);846static const struct snd_kcontrol_new rx_int2_1_mix_inp1_mux =847 SOC_DAPM_ENUM("rx_int2_1_mix_inp1", rx_int2_1_mix_inp1_enum);848static const struct snd_kcontrol_new rx_int2_1_mix_inp2_mux =849 SOC_DAPM_ENUM("rx_int2_1_mix_inp2", rx_int2_1_mix_inp2_enum);850static const struct snd_kcontrol_new rx_int0_mix2_inp_mux =851 SOC_DAPM_ENUM("rx_int0_mix2_inp", rx_int0_mix2_inp_enum);852static const struct snd_kcontrol_new rx_int1_mix2_inp_mux =853 SOC_DAPM_ENUM("rx_int1_mix2_inp", rx_int1_mix2_inp_enum);854static const struct snd_kcontrol_new rx_int2_mix2_inp_mux =855 SOC_DAPM_ENUM("rx_int2_mix2_inp", rx_int2_mix2_inp_enum);856static const struct snd_kcontrol_new iir0_inp0_mux =857 SOC_DAPM_ENUM("iir0_inp0", iir0_inp0_enum);858static const struct snd_kcontrol_new iir0_inp1_mux =859 SOC_DAPM_ENUM("iir0_inp1", iir0_inp1_enum);860static const struct snd_kcontrol_new iir0_inp2_mux =861 SOC_DAPM_ENUM("iir0_inp2", iir0_inp2_enum);862static const struct snd_kcontrol_new iir0_inp3_mux =863 SOC_DAPM_ENUM("iir0_inp3", iir0_inp3_enum);864static const struct snd_kcontrol_new iir1_inp0_mux =865 SOC_DAPM_ENUM("iir1_inp0", iir1_inp0_enum);866static const struct snd_kcontrol_new iir1_inp1_mux =867 SOC_DAPM_ENUM("iir1_inp1", iir1_inp1_enum);868static const struct snd_kcontrol_new iir1_inp2_mux =869 SOC_DAPM_ENUM("iir1_inp2", iir1_inp2_enum);870static const struct snd_kcontrol_new iir1_inp3_mux =871 SOC_DAPM_ENUM("iir1_inp3", iir1_inp3_enum);872static const struct snd_kcontrol_new rx_int0_1_interp_mux =873 SOC_DAPM_ENUM("rx_int0_1_interp", rx_int0_1_interp_enum);874static const struct snd_kcontrol_new rx_int1_1_interp_mux =875 SOC_DAPM_ENUM("rx_int1_1_interp", rx_int1_1_interp_enum);876static const struct snd_kcontrol_new rx_int2_1_interp_mux =877 SOC_DAPM_ENUM("rx_int2_1_interp", rx_int2_1_interp_enum);878static const struct snd_kcontrol_new rx_int0_2_interp_mux =879 SOC_DAPM_ENUM("rx_int0_2_interp", rx_int0_2_interp_enum);880static const struct snd_kcontrol_new rx_int1_2_interp_mux =881 SOC_DAPM_ENUM("rx_int1_2_interp", rx_int1_2_interp_enum);882static const struct snd_kcontrol_new rx_int2_2_interp_mux =883 SOC_DAPM_ENUM("rx_int2_2_interp", rx_int2_2_interp_enum);884static const struct snd_kcontrol_new rx_mix_tx0_mux =885 SOC_DAPM_ENUM("RX MIX TX0_MUX Mux", rx_mix_tx0_mux_enum);886 887static const struct reg_default rx_defaults[] = {888 /* RX Macro */889 { CDC_RX_TOP_TOP_CFG0, 0x00 },890 { CDC_RX_TOP_SWR_CTRL, 0x00 },891 { CDC_RX_TOP_DEBUG, 0x00 },892 { CDC_RX_TOP_DEBUG_BUS, 0x00 },893 { CDC_RX_TOP_DEBUG_EN0, 0x00 },894 { CDC_RX_TOP_DEBUG_EN1, 0x00 },895 { CDC_RX_TOP_DEBUG_EN2, 0x00 },896 { CDC_RX_TOP_HPHL_COMP_WR_LSB, 0x00 },897 { CDC_RX_TOP_HPHL_COMP_WR_MSB, 0x00 },898 { CDC_RX_TOP_HPHL_COMP_LUT, 0x00 },899 { CDC_RX_TOP_HPHL_COMP_RD_LSB, 0x00 },900 { CDC_RX_TOP_HPHL_COMP_RD_MSB, 0x00 },901 { CDC_RX_TOP_HPHR_COMP_WR_LSB, 0x00 },902 { CDC_RX_TOP_HPHR_COMP_WR_MSB, 0x00 },903 { CDC_RX_TOP_HPHR_COMP_LUT, 0x00 },904 { CDC_RX_TOP_HPHR_COMP_RD_LSB, 0x00 },905 { CDC_RX_TOP_HPHR_COMP_RD_MSB, 0x00 },906 { CDC_RX_TOP_DSD0_DEBUG_CFG0, 0x11 },907 { CDC_RX_TOP_DSD0_DEBUG_CFG1, 0x20 },908 { CDC_RX_TOP_DSD0_DEBUG_CFG2, 0x00 },909 { CDC_RX_TOP_DSD0_DEBUG_CFG3, 0x00 },910 { CDC_RX_TOP_DSD1_DEBUG_CFG0, 0x11 },911 { CDC_RX_TOP_DSD1_DEBUG_CFG1, 0x20 },912 { CDC_RX_TOP_DSD1_DEBUG_CFG2, 0x00 },913 { CDC_RX_TOP_DSD1_DEBUG_CFG3, 0x00 },914 { CDC_RX_TOP_RX_I2S_CTL, 0x0C },915 { CDC_RX_TOP_TX_I2S2_CTL, 0x0C },916 { CDC_RX_TOP_I2S_CLK, 0x0C },917 { CDC_RX_TOP_I2S_RESET, 0x00 },918 { CDC_RX_TOP_I2S_MUX, 0x00 },919 { CDC_RX_CLK_RST_CTRL_MCLK_CONTROL, 0x00 },920 { CDC_RX_CLK_RST_CTRL_FS_CNT_CONTROL, 0x00 },921 { CDC_RX_CLK_RST_CTRL_SWR_CONTROL, 0x00 },922 { CDC_RX_CLK_RST_CTRL_DSD_CONTROL, 0x00 },923 { CDC_RX_CLK_RST_CTRL_ASRC_SHARE_CONTROL, 0x08 },924 { CDC_RX_SOFTCLIP_CRC, 0x00 },925 { CDC_RX_SOFTCLIP_SOFTCLIP_CTRL, 0x38 },926 { CDC_RX_INP_MUX_RX_INT0_CFG0, 0x00 },927 { CDC_RX_INP_MUX_RX_INT0_CFG1, 0x00 },928 { CDC_RX_INP_MUX_RX_INT1_CFG0, 0x00 },929 { CDC_RX_INP_MUX_RX_INT1_CFG1, 0x00 },930 { CDC_RX_INP_MUX_RX_INT2_CFG0, 0x00 },931 { CDC_RX_INP_MUX_RX_INT2_CFG1, 0x00 },932 { CDC_RX_INP_MUX_RX_MIX_CFG4, 0x00 },933 { CDC_RX_INP_MUX_RX_MIX_CFG5, 0x00 },934 { CDC_RX_INP_MUX_SIDETONE_SRC_CFG0, 0x00 },935 { CDC_RX_CLSH_CRC, 0x00 },936 { CDC_RX_CLSH_DLY_CTRL, 0x03 },937 { CDC_RX_CLSH_DECAY_CTRL, 0x02 },938 { CDC_RX_CLSH_HPH_V_PA, 0x1C },939 { CDC_RX_CLSH_EAR_V_PA, 0x39 },940 { CDC_RX_CLSH_HPH_V_HD, 0x0C },941 { CDC_RX_CLSH_EAR_V_HD, 0x0C },942 { CDC_RX_CLSH_K1_MSB, 0x01 },943 { CDC_RX_CLSH_K1_LSB, 0x00 },944 { CDC_RX_CLSH_K2_MSB, 0x00 },945 { CDC_RX_CLSH_K2_LSB, 0x80 },946 { CDC_RX_CLSH_IDLE_CTRL, 0x00 },947 { CDC_RX_CLSH_IDLE_HPH, 0x00 },948 { CDC_RX_CLSH_IDLE_EAR, 0x00 },949 { CDC_RX_CLSH_TEST0, 0x07 },950 { CDC_RX_CLSH_TEST1, 0x00 },951 { CDC_RX_CLSH_OVR_VREF, 0x00 },952 { CDC_RX_CLSH_CLSG_CTL, 0x02 },953 { CDC_RX_CLSH_CLSG_CFG1, 0x9A },954 { CDC_RX_CLSH_CLSG_CFG2, 0x10 },955 { CDC_RX_BCL_VBAT_PATH_CTL, 0x00 },956 { CDC_RX_BCL_VBAT_CFG, 0x10 },957 { CDC_RX_BCL_VBAT_ADC_CAL1, 0x00 },958 { CDC_RX_BCL_VBAT_ADC_CAL2, 0x00 },959 { CDC_RX_BCL_VBAT_ADC_CAL3, 0x04 },960 { CDC_RX_BCL_VBAT_PK_EST1, 0xE0 },961 { CDC_RX_BCL_VBAT_PK_EST2, 0x01 },962 { CDC_RX_BCL_VBAT_PK_EST3, 0x40 },963 { CDC_RX_BCL_VBAT_RF_PROC1, 0x2A },964 { CDC_RX_BCL_VBAT_RF_PROC2, 0x00 },965 { CDC_RX_BCL_VBAT_TAC1, 0x00 },966 { CDC_RX_BCL_VBAT_TAC2, 0x18 },967 { CDC_RX_BCL_VBAT_TAC3, 0x18 },968 { CDC_RX_BCL_VBAT_TAC4, 0x03 },969 { CDC_RX_BCL_VBAT_GAIN_UPD1, 0x01 },970 { CDC_RX_BCL_VBAT_GAIN_UPD2, 0x00 },971 { CDC_RX_BCL_VBAT_GAIN_UPD3, 0x00 },972 { CDC_RX_BCL_VBAT_GAIN_UPD4, 0x64 },973 { CDC_RX_BCL_VBAT_GAIN_UPD5, 0x01 },974 { CDC_RX_BCL_VBAT_DEBUG1, 0x00 },975 { CDC_RX_BCL_VBAT_GAIN_UPD_MON, 0x00 },976 { CDC_RX_BCL_VBAT_GAIN_MON_VAL, 0x00 },977 { CDC_RX_BCL_VBAT_BAN, 0x0C },978 { CDC_RX_BCL_VBAT_BCL_GAIN_UPD1, 0x00 },979 { CDC_RX_BCL_VBAT_BCL_GAIN_UPD2, 0x77 },980 { CDC_RX_BCL_VBAT_BCL_GAIN_UPD3, 0x01 },981 { CDC_RX_BCL_VBAT_BCL_GAIN_UPD4, 0x00 },982 { CDC_RX_BCL_VBAT_BCL_GAIN_UPD5, 0x4B },983 { CDC_RX_BCL_VBAT_BCL_GAIN_UPD6, 0x00 },984 { CDC_RX_BCL_VBAT_BCL_GAIN_UPD7, 0x01 },985 { CDC_RX_BCL_VBAT_BCL_GAIN_UPD8, 0x00 },986 { CDC_RX_BCL_VBAT_BCL_GAIN_UPD9, 0x00 },987 { CDC_RX_BCL_VBAT_ATTN1, 0x04 },988 { CDC_RX_BCL_VBAT_ATTN2, 0x08 },989 { CDC_RX_BCL_VBAT_ATTN3, 0x0C },990 { CDC_RX_BCL_VBAT_DECODE_CTL1, 0xE0 },991 { CDC_RX_BCL_VBAT_DECODE_CTL2, 0x00 },992 { CDC_RX_BCL_VBAT_DECODE_CFG1, 0x00 },993 { CDC_RX_BCL_VBAT_DECODE_CFG2, 0x00 },994 { CDC_RX_BCL_VBAT_DECODE_CFG3, 0x00 },995 { CDC_RX_BCL_VBAT_DECODE_CFG4, 0x00 },996 { CDC_RX_BCL_VBAT_DECODE_ST, 0x00 },997 { CDC_RX_INTR_CTRL_CFG, 0x00 },998 { CDC_RX_INTR_CTRL_CLR_COMMIT, 0x00 },999 { CDC_RX_INTR_CTRL_PIN1_MASK0, 0xFF },1000 { CDC_RX_INTR_CTRL_PIN1_STATUS0, 0x00 },1001 { CDC_RX_INTR_CTRL_PIN1_CLEAR0, 0x00 },1002 { CDC_RX_INTR_CTRL_PIN2_MASK0, 0xFF },1003 { CDC_RX_INTR_CTRL_PIN2_STATUS0, 0x00 },1004 { CDC_RX_INTR_CTRL_PIN2_CLEAR0, 0x00 },1005 { CDC_RX_INTR_CTRL_LEVEL0, 0x00 },1006 { CDC_RX_INTR_CTRL_BYPASS0, 0x00 },1007 { CDC_RX_INTR_CTRL_SET0, 0x00 },1008 { CDC_RX_RX0_RX_PATH_CTL, 0x04 },1009 { CDC_RX_RX0_RX_PATH_CFG0, 0x00 },1010 { CDC_RX_RX0_RX_PATH_CFG1, 0x64 },1011 { CDC_RX_RX0_RX_PATH_CFG2, 0x8F },1012 { CDC_RX_RX0_RX_PATH_CFG3, 0x00 },1013 { CDC_RX_RX0_RX_VOL_CTL, 0x00 },1014 { CDC_RX_RX0_RX_PATH_MIX_CTL, 0x04 },1015 { CDC_RX_RX0_RX_PATH_MIX_CFG, 0x7E },1016 { CDC_RX_RX0_RX_VOL_MIX_CTL, 0x00 },1017 { CDC_RX_RX0_RX_PATH_SEC1, 0x08 },1018 { CDC_RX_RX0_RX_PATH_SEC2, 0x00 },1019 { CDC_RX_RX0_RX_PATH_SEC3, 0x00 },1020 { CDC_RX_RX0_RX_PATH_SEC4, 0x00 },1021 { CDC_RX_RX0_RX_PATH_SEC7, 0x00 },1022 { CDC_RX_RX0_RX_PATH_MIX_SEC0, 0x08 },1023 { CDC_RX_RX0_RX_PATH_MIX_SEC1, 0x00 },1024 { CDC_RX_RX0_RX_PATH_DSM_CTL, 0x08 },1025 { CDC_RX_RX0_RX_PATH_DSM_DATA1, 0x00 },1026 { CDC_RX_RX0_RX_PATH_DSM_DATA2, 0x00 },1027 { CDC_RX_RX0_RX_PATH_DSM_DATA3, 0x00 },1028 { CDC_RX_RX0_RX_PATH_DSM_DATA4, 0x55 },1029 { CDC_RX_RX0_RX_PATH_DSM_DATA5, 0x55 },1030 { CDC_RX_RX0_RX_PATH_DSM_DATA6, 0x55 },1031 { CDC_RX_IDLE_DETECT_PATH_CTL, 0x00 },1032 { CDC_RX_IDLE_DETECT_CFG0, 0x07 },1033 { CDC_RX_IDLE_DETECT_CFG1, 0x3C },1034 { CDC_RX_IDLE_DETECT_CFG2, 0x00 },1035 { CDC_RX_IDLE_DETECT_CFG3, 0x00 },1036 { CDC_RX_COMPANDER0_CTL0, 0x60 },1037 { CDC_RX_COMPANDER0_CTL1, 0xDB },1038 { CDC_RX_COMPANDER0_CTL2, 0xFF },1039 { CDC_RX_COMPANDER0_CTL3, 0x35 },1040 { CDC_RX_COMPANDER0_CTL4, 0xFF },1041 { CDC_RX_COMPANDER0_CTL5, 0x00 },1042 { CDC_RX_COMPANDER0_CTL6, 0x01 },1043 { CDC_RX_COMPANDER0_CTL7, 0x28 },1044 { CDC_RX_COMPANDER1_CTL0, 0x60 },1045 { CDC_RX_COMPANDER1_CTL1, 0xDB },1046 { CDC_RX_COMPANDER1_CTL2, 0xFF },1047 { CDC_RX_COMPANDER1_CTL3, 0x35 },1048 { CDC_RX_COMPANDER1_CTL4, 0xFF },1049 { CDC_RX_COMPANDER1_CTL5, 0x00 },1050 { CDC_RX_COMPANDER1_CTL6, 0x01 },1051 { CDC_RX_COMPANDER1_CTL7, 0x28 },1052 { CDC_RX_SIDETONE_IIR0_IIR_PATH_CTL, 0x00 },1053 { CDC_RX_SIDETONE_IIR0_IIR_GAIN_B1_CTL, 0x00 },1054 { CDC_RX_SIDETONE_IIR0_IIR_GAIN_B2_CTL, 0x00 },1055 { CDC_RX_SIDETONE_IIR0_IIR_GAIN_B3_CTL, 0x00 },1056 { CDC_RX_SIDETONE_IIR0_IIR_GAIN_B4_CTL, 0x00 },1057 { CDC_RX_SIDETONE_IIR0_IIR_GAIN_B5_CTL, 0x00 },1058 { CDC_RX_SIDETONE_IIR0_IIR_GAIN_B6_CTL, 0x00 },1059 { CDC_RX_SIDETONE_IIR0_IIR_GAIN_B7_CTL, 0x00 },1060 { CDC_RX_SIDETONE_IIR0_IIR_GAIN_B8_CTL, 0x00 },1061 { CDC_RX_SIDETONE_IIR0_IIR_CTL, 0x40 },1062 { CDC_RX_SIDETONE_IIR0_IIR_GAIN_TIMER_CTL, 0x00 },1063 { CDC_RX_SIDETONE_IIR0_IIR_COEF_B1_CTL, 0x00 },1064 { CDC_RX_SIDETONE_IIR0_IIR_COEF_B2_CTL, 0x00 },1065 { CDC_RX_SIDETONE_IIR1_IIR_PATH_CTL, 0x00 },1066 { CDC_RX_SIDETONE_IIR1_IIR_GAIN_B1_CTL, 0x00 },1067 { CDC_RX_SIDETONE_IIR1_IIR_GAIN_B2_CTL, 0x00 },1068 { CDC_RX_SIDETONE_IIR1_IIR_GAIN_B3_CTL, 0x00 },1069 { CDC_RX_SIDETONE_IIR1_IIR_GAIN_B4_CTL, 0x00 },1070 { CDC_RX_SIDETONE_IIR1_IIR_GAIN_B5_CTL, 0x00 },1071 { CDC_RX_SIDETONE_IIR1_IIR_GAIN_B6_CTL, 0x00 },1072 { CDC_RX_SIDETONE_IIR1_IIR_GAIN_B7_CTL, 0x00 },1073 { CDC_RX_SIDETONE_IIR1_IIR_GAIN_B8_CTL, 0x00 },1074 { CDC_RX_SIDETONE_IIR1_IIR_CTL, 0x40 },1075 { CDC_RX_SIDETONE_IIR1_IIR_GAIN_TIMER_CTL, 0x00 },1076 { CDC_RX_SIDETONE_IIR1_IIR_COEF_B1_CTL, 0x00 },1077 { CDC_RX_SIDETONE_IIR1_IIR_COEF_B2_CTL, 0x00 },1078 { CDC_RX_IIR_INP_MUX_IIR0_MIX_CFG0, 0x00 },1079 { CDC_RX_IIR_INP_MUX_IIR0_MIX_CFG1, 0x00 },1080 { CDC_RX_IIR_INP_MUX_IIR0_MIX_CFG2, 0x00 },1081 { CDC_RX_IIR_INP_MUX_IIR0_MIX_CFG3, 0x00 },1082 { CDC_RX_IIR_INP_MUX_IIR1_MIX_CFG0, 0x00 },1083 { CDC_RX_IIR_INP_MUX_IIR1_MIX_CFG1, 0x00 },1084 { CDC_RX_IIR_INP_MUX_IIR1_MIX_CFG2, 0x00 },1085 { CDC_RX_IIR_INP_MUX_IIR1_MIX_CFG3, 0x00 },1086 { CDC_RX_SIDETONE_SRC0_ST_SRC_PATH_CTL, 0x04 },1087 { CDC_RX_SIDETONE_SRC0_ST_SRC_PATH_CFG1, 0x00 },1088 { CDC_RX_SIDETONE_SRC1_ST_SRC_PATH_CTL, 0x04 },1089 { CDC_RX_SIDETONE_SRC1_ST_SRC_PATH_CFG1, 0x00 },1090 { CDC_RX_EC_REF_HQ0_EC_REF_HQ_PATH_CTL, 0x00 },1091 { CDC_RX_EC_REF_HQ0_EC_REF_HQ_CFG0, 0x01 },1092 { CDC_RX_EC_REF_HQ1_EC_REF_HQ_PATH_CTL, 0x00 },1093 { CDC_RX_EC_REF_HQ1_EC_REF_HQ_CFG0, 0x01 },1094 { CDC_RX_EC_REF_HQ2_EC_REF_HQ_PATH_CTL, 0x00 },1095 { CDC_RX_EC_REF_HQ2_EC_REF_HQ_CFG0, 0x01 },1096 { CDC_RX_EC_ASRC0_CLK_RST_CTL, 0x00 },1097 { CDC_RX_EC_ASRC0_CTL0, 0x00 },1098 { CDC_RX_EC_ASRC0_CTL1, 0x00 },1099 { CDC_RX_EC_ASRC0_FIFO_CTL, 0xA8 },1100 { CDC_RX_EC_ASRC0_STATUS_FMIN_CNTR_LSB, 0x00 },1101 { CDC_RX_EC_ASRC0_STATUS_FMIN_CNTR_MSB, 0x00 },1102 { CDC_RX_EC_ASRC0_STATUS_FMAX_CNTR_LSB, 0x00 },1103 { CDC_RX_EC_ASRC0_STATUS_FMAX_CNTR_MSB, 0x00 },1104 { CDC_RX_EC_ASRC0_STATUS_FIFO, 0x00 },1105 { CDC_RX_EC_ASRC1_CLK_RST_CTL, 0x00 },1106 { CDC_RX_EC_ASRC1_CTL0, 0x00 },1107 { CDC_RX_EC_ASRC1_CTL1, 0x00 },1108 { CDC_RX_EC_ASRC1_FIFO_CTL, 0xA8 },1109 { CDC_RX_EC_ASRC1_STATUS_FMIN_CNTR_LSB, 0x00 },1110 { CDC_RX_EC_ASRC1_STATUS_FMIN_CNTR_MSB, 0x00 },1111 { CDC_RX_EC_ASRC1_STATUS_FMAX_CNTR_LSB, 0x00 },1112 { CDC_RX_EC_ASRC1_STATUS_FMAX_CNTR_MSB, 0x00 },1113 { CDC_RX_EC_ASRC1_STATUS_FIFO, 0x00 },1114 { CDC_RX_EC_ASRC2_CLK_RST_CTL, 0x00 },1115 { CDC_RX_EC_ASRC2_CTL0, 0x00 },1116 { CDC_RX_EC_ASRC2_CTL1, 0x00 },1117 { CDC_RX_EC_ASRC2_FIFO_CTL, 0xA8 },1118 { CDC_RX_EC_ASRC2_STATUS_FMIN_CNTR_LSB, 0x00 },1119 { CDC_RX_EC_ASRC2_STATUS_FMIN_CNTR_MSB, 0x00 },1120 { CDC_RX_EC_ASRC2_STATUS_FMAX_CNTR_LSB, 0x00 },1121 { CDC_RX_EC_ASRC2_STATUS_FMAX_CNTR_MSB, 0x00 },1122 { CDC_RX_EC_ASRC2_STATUS_FIFO, 0x00 },1123 { CDC_RX_DSD0_PATH_CTL, 0x00 },1124 { CDC_RX_DSD0_CFG0, 0x00 },1125 { CDC_RX_DSD0_CFG1, 0x62 },1126 { CDC_RX_DSD0_CFG2, 0x96 },1127 { CDC_RX_DSD1_PATH_CTL, 0x00 },1128 { CDC_RX_DSD1_CFG0, 0x00 },1129 { CDC_RX_DSD1_CFG1, 0x62 },1130 { CDC_RX_DSD1_CFG2, 0x96 },1131};1132 1133static const struct reg_default rx_2_5_defaults[] = {1134 { CDC_2_5_RX_RX1_RX_PATH_CTL, 0x04 },1135 { CDC_2_5_RX_RX1_RX_PATH_CFG0, 0x00 },1136 { CDC_2_5_RX_RX1_RX_PATH_CFG1, 0x64 },1137 { CDC_2_5_RX_RX1_RX_PATH_CFG2, 0x8F },1138 { CDC_2_5_RX_RX1_RX_PATH_CFG3, 0x00 },1139 { CDC_2_5_RX_RX1_RX_VOL_CTL, 0x00 },1140 { CDC_2_5_RX_RX1_RX_PATH_MIX_CTL, 0x04 },1141 { CDC_2_5_RX_RX1_RX_PATH_MIX_CFG, 0x7E },1142 { CDC_2_5_RX_RX1_RX_VOL_MIX_CTL, 0x00 },1143 { CDC_2_5_RX_RX1_RX_PATH_SEC1, 0x08 },1144 { CDC_2_5_RX_RX1_RX_PATH_SEC2, 0x00 },1145 { CDC_2_5_RX_RX1_RX_PATH_SEC3, 0x00 },1146 { CDC_2_5_RX_RX1_RX_PATH_SEC4, 0x00 },1147 { CDC_2_5_RX_RX1_RX_PATH_SEC7, 0x00 },1148 { CDC_2_5_RX_RX1_RX_PATH_MIX_SEC0, 0x08 },1149 { CDC_2_5_RX_RX1_RX_PATH_MIX_SEC1, 0x00 },1150 { CDC_2_5_RX_RX1_RX_PATH_DSM_CTL, 0x08 },1151 { CDC_2_5_RX_RX1_RX_PATH_DSM_DATA1, 0x00 },1152 { CDC_2_5_RX_RX1_RX_PATH_DSM_DATA2, 0x00 },1153 { CDC_2_5_RX_RX1_RX_PATH_DSM_DATA3, 0x00 },1154 { CDC_2_5_RX_RX1_RX_PATH_DSM_DATA4, 0x55 },1155 { CDC_2_5_RX_RX1_RX_PATH_DSM_DATA5, 0x55 },1156 { CDC_2_5_RX_RX1_RX_PATH_DSM_DATA6, 0x55 },1157 { CDC_2_5_RX_RX2_RX_PATH_CTL, 0x04 },1158 { CDC_2_5_RX_RX2_RX_PATH_CFG0, 0x00 },1159 { CDC_2_5_RX_RX2_RX_PATH_CFG1, 0x64 },1160 { CDC_2_5_RX_RX2_RX_PATH_CFG2, 0x8F },1161 { CDC_2_5_RX_RX2_RX_PATH_CFG3, 0x00 },1162 { CDC_2_5_RX_RX2_RX_VOL_CTL, 0x00 },1163 { CDC_2_5_RX_RX2_RX_PATH_MIX_CTL, 0x04 },1164 { CDC_2_5_RX_RX2_RX_PATH_MIX_CFG, 0x7E },1165 { CDC_2_5_RX_RX2_RX_VOL_MIX_CTL, 0x00 },1166 { CDC_2_5_RX_RX2_RX_PATH_SEC0, 0x04 },1167 { CDC_2_5_RX_RX2_RX_PATH_SEC1, 0x08 },1168 { CDC_2_5_RX_RX2_RX_PATH_SEC2, 0x00 },1169 { CDC_2_5_RX_RX2_RX_PATH_SEC3, 0x00 },1170 { CDC_2_5_RX_RX2_RX_PATH_SEC4, 0x00 },1171 { CDC_2_5_RX_RX2_RX_PATH_SEC5, 0x00 },1172 { CDC_2_5_RX_RX2_RX_PATH_SEC6, 0x00 },1173 { CDC_2_5_RX_RX2_RX_PATH_SEC7, 0x00 },1174 { CDC_2_5_RX_RX2_RX_PATH_MIX_SEC0, 0x08 },1175 { CDC_2_5_RX_RX2_RX_PATH_MIX_SEC1, 0x00 },1176 { CDC_2_5_RX_RX2_RX_PATH_DSM_CTL, 0x00 },1177};1178 1179static const struct reg_default rx_pre_2_5_defaults[] = {1180 { CDC_RX_RX1_RX_PATH_CTL, 0x04 },1181 { CDC_RX_RX1_RX_PATH_CFG0, 0x00 },1182 { CDC_RX_RX1_RX_PATH_CFG1, 0x64 },1183 { CDC_RX_RX1_RX_PATH_CFG2, 0x8F },1184 { CDC_RX_RX1_RX_PATH_CFG3, 0x00 },1185 { CDC_RX_RX1_RX_VOL_CTL, 0x00 },1186 { CDC_RX_RX1_RX_PATH_MIX_CTL, 0x04 },1187 { CDC_RX_RX1_RX_PATH_MIX_CFG, 0x7E },1188 { CDC_RX_RX1_RX_VOL_MIX_CTL, 0x00 },1189 { CDC_RX_RX1_RX_PATH_SEC1, 0x08 },1190 { CDC_RX_RX1_RX_PATH_SEC2, 0x00 },1191 { CDC_RX_RX1_RX_PATH_SEC3, 0x00 },1192 { CDC_RX_RX1_RX_PATH_SEC4, 0x00 },1193 { CDC_RX_RX1_RX_PATH_SEC7, 0x00 },1194 { CDC_RX_RX1_RX_PATH_MIX_SEC0, 0x08 },1195 { CDC_RX_RX1_RX_PATH_MIX_SEC1, 0x00 },1196 { CDC_RX_RX1_RX_PATH_DSM_CTL, 0x08 },1197 { CDC_RX_RX1_RX_PATH_DSM_DATA1, 0x00 },1198 { CDC_RX_RX1_RX_PATH_DSM_DATA2, 0x00 },1199 { CDC_RX_RX1_RX_PATH_DSM_DATA3, 0x00 },1200 { CDC_RX_RX1_RX_PATH_DSM_DATA4, 0x55 },1201 { CDC_RX_RX1_RX_PATH_DSM_DATA5, 0x55 },1202 { CDC_RX_RX1_RX_PATH_DSM_DATA6, 0x55 },1203 { CDC_RX_RX2_RX_PATH_CTL, 0x04 },1204 { CDC_RX_RX2_RX_PATH_CFG0, 0x00 },1205 { CDC_RX_RX2_RX_PATH_CFG1, 0x64 },1206 { CDC_RX_RX2_RX_PATH_CFG2, 0x8F },1207 { CDC_RX_RX2_RX_PATH_CFG3, 0x00 },1208 { CDC_RX_RX2_RX_VOL_CTL, 0x00 },1209 { CDC_RX_RX2_RX_PATH_MIX_CTL, 0x04 },1210 { CDC_RX_RX2_RX_PATH_MIX_CFG, 0x7E },1211 { CDC_RX_RX2_RX_VOL_MIX_CTL, 0x00 },1212 { CDC_RX_RX2_RX_PATH_SEC0, 0x04 },1213 { CDC_RX_RX2_RX_PATH_SEC1, 0x08 },1214 { CDC_RX_RX2_RX_PATH_SEC2, 0x00 },1215 { CDC_RX_RX2_RX_PATH_SEC3, 0x00 },1216 { CDC_RX_RX2_RX_PATH_SEC4, 0x00 },1217 { CDC_RX_RX2_RX_PATH_SEC5, 0x00 },1218 { CDC_RX_RX2_RX_PATH_SEC6, 0x00 },1219 { CDC_RX_RX2_RX_PATH_SEC7, 0x00 },1220 { CDC_RX_RX2_RX_PATH_MIX_SEC0, 0x08 },1221 { CDC_RX_RX2_RX_PATH_MIX_SEC1, 0x00 },1222 { CDC_RX_RX2_RX_PATH_DSM_CTL, 0x00 },1223 1224};1225 1226static bool rx_is_wronly_register(struct device *dev,1227 unsigned int reg)1228{1229 switch (reg) {1230 case CDC_RX_BCL_VBAT_GAIN_UPD_MON:1231 case CDC_RX_INTR_CTRL_CLR_COMMIT:1232 case CDC_RX_INTR_CTRL_PIN1_CLEAR0:1233 case CDC_RX_INTR_CTRL_PIN2_CLEAR0:1234 return true;1235 }1236 1237 return false;1238}1239 1240static bool rx_is_volatile_register(struct device *dev, unsigned int reg)1241{1242 /* Update volatile list for rx/tx macros */1243 switch (reg) {1244 case CDC_RX_TOP_HPHL_COMP_RD_LSB:1245 case CDC_RX_TOP_HPHL_COMP_WR_LSB:1246 case CDC_RX_TOP_HPHL_COMP_RD_MSB:1247 case CDC_RX_TOP_HPHL_COMP_WR_MSB:1248 case CDC_RX_TOP_HPHR_COMP_RD_LSB:1249 case CDC_RX_TOP_HPHR_COMP_WR_LSB:1250 case CDC_RX_TOP_HPHR_COMP_RD_MSB:1251 case CDC_RX_TOP_HPHR_COMP_WR_MSB:1252 case CDC_RX_TOP_DSD0_DEBUG_CFG2:1253 case CDC_RX_TOP_DSD1_DEBUG_CFG2:1254 case CDC_RX_BCL_VBAT_GAIN_MON_VAL:1255 case CDC_RX_BCL_VBAT_DECODE_ST:1256 case CDC_RX_INTR_CTRL_PIN1_STATUS0:1257 case CDC_RX_INTR_CTRL_PIN2_STATUS0:1258 case CDC_RX_COMPANDER0_CTL6:1259 case CDC_RX_COMPANDER1_CTL6:1260 case CDC_RX_EC_ASRC0_STATUS_FMIN_CNTR_LSB:1261 case CDC_RX_EC_ASRC0_STATUS_FMIN_CNTR_MSB:1262 case CDC_RX_EC_ASRC0_STATUS_FMAX_CNTR_LSB:1263 case CDC_RX_EC_ASRC0_STATUS_FMAX_CNTR_MSB:1264 case CDC_RX_EC_ASRC0_STATUS_FIFO:1265 case CDC_RX_EC_ASRC1_STATUS_FMIN_CNTR_LSB:1266 case CDC_RX_EC_ASRC1_STATUS_FMIN_CNTR_MSB:1267 case CDC_RX_EC_ASRC1_STATUS_FMAX_CNTR_LSB:1268 case CDC_RX_EC_ASRC1_STATUS_FMAX_CNTR_MSB:1269 case CDC_RX_EC_ASRC1_STATUS_FIFO:1270 case CDC_RX_EC_ASRC2_STATUS_FMIN_CNTR_LSB:1271 case CDC_RX_EC_ASRC2_STATUS_FMIN_CNTR_MSB:1272 case CDC_RX_EC_ASRC2_STATUS_FMAX_CNTR_LSB:1273 case CDC_RX_EC_ASRC2_STATUS_FMAX_CNTR_MSB:1274 case CDC_RX_EC_ASRC2_STATUS_FIFO:1275 return true;1276 }1277 return false;1278}1279 1280static bool rx_pre_2_5_is_rw_register(struct device *dev, unsigned int reg)1281{1282 switch (reg) {1283 case CDC_RX_RX1_RX_PATH_CTL:1284 case CDC_RX_RX1_RX_PATH_CFG0:1285 case CDC_RX_RX1_RX_PATH_CFG1:1286 case CDC_RX_RX1_RX_PATH_CFG2:1287 case CDC_RX_RX1_RX_PATH_CFG3:1288 case CDC_RX_RX1_RX_VOL_CTL:1289 case CDC_RX_RX1_RX_PATH_MIX_CTL:1290 case CDC_RX_RX1_RX_PATH_MIX_CFG:1291 case CDC_RX_RX1_RX_VOL_MIX_CTL:1292 case CDC_RX_RX1_RX_PATH_SEC1:1293 case CDC_RX_RX1_RX_PATH_SEC2:1294 case CDC_RX_RX1_RX_PATH_SEC3:1295 case CDC_RX_RX1_RX_PATH_SEC4:1296 case CDC_RX_RX1_RX_PATH_SEC7:1297 case CDC_RX_RX1_RX_PATH_MIX_SEC0:1298 case CDC_RX_RX1_RX_PATH_MIX_SEC1:1299 case CDC_RX_RX1_RX_PATH_DSM_CTL:1300 case CDC_RX_RX1_RX_PATH_DSM_DATA1:1301 case CDC_RX_RX1_RX_PATH_DSM_DATA2:1302 case CDC_RX_RX1_RX_PATH_DSM_DATA3:1303 case CDC_RX_RX1_RX_PATH_DSM_DATA4:1304 case CDC_RX_RX1_RX_PATH_DSM_DATA5:1305 case CDC_RX_RX1_RX_PATH_DSM_DATA6:1306 case CDC_RX_RX2_RX_PATH_CTL:1307 case CDC_RX_RX2_RX_PATH_CFG0:1308 case CDC_RX_RX2_RX_PATH_CFG1:1309 case CDC_RX_RX2_RX_PATH_CFG2:1310 case CDC_RX_RX2_RX_PATH_CFG3:1311 case CDC_RX_RX2_RX_VOL_CTL:1312 case CDC_RX_RX2_RX_PATH_MIX_CTL:1313 case CDC_RX_RX2_RX_PATH_MIX_CFG:1314 case CDC_RX_RX2_RX_VOL_MIX_CTL:1315 case CDC_RX_RX2_RX_PATH_SEC0:1316 case CDC_RX_RX2_RX_PATH_SEC1:1317 case CDC_RX_RX2_RX_PATH_SEC2:1318 case CDC_RX_RX2_RX_PATH_SEC3:1319 case CDC_RX_RX2_RX_PATH_SEC4:1320 case CDC_RX_RX2_RX_PATH_SEC5:1321 case CDC_RX_RX2_RX_PATH_SEC6:1322 case CDC_RX_RX2_RX_PATH_SEC7:1323 case CDC_RX_RX2_RX_PATH_MIX_SEC0:1324 case CDC_RX_RX2_RX_PATH_MIX_SEC1:1325 case CDC_RX_RX2_RX_PATH_DSM_CTL:1326 return true;1327 }1328 1329 return false;1330}1331 1332static bool rx_2_5_is_rw_register(struct device *dev, unsigned int reg)1333{1334 switch (reg) {1335 case CDC_2_5_RX_RX1_RX_PATH_CTL:1336 case CDC_2_5_RX_RX1_RX_PATH_CFG0:1337 case CDC_2_5_RX_RX1_RX_PATH_CFG1:1338 case CDC_2_5_RX_RX1_RX_PATH_CFG2:1339 case CDC_2_5_RX_RX1_RX_PATH_CFG3:1340 case CDC_2_5_RX_RX1_RX_VOL_CTL:1341 case CDC_2_5_RX_RX1_RX_PATH_MIX_CTL:1342 case CDC_2_5_RX_RX1_RX_PATH_MIX_CFG:1343 case CDC_2_5_RX_RX1_RX_VOL_MIX_CTL:1344 case CDC_2_5_RX_RX1_RX_PATH_SEC1:1345 case CDC_2_5_RX_RX1_RX_PATH_SEC2:1346 case CDC_2_5_RX_RX1_RX_PATH_SEC3:1347 case CDC_2_5_RX_RX1_RX_PATH_SEC4:1348 case CDC_2_5_RX_RX1_RX_PATH_SEC7:1349 case CDC_2_5_RX_RX1_RX_PATH_MIX_SEC0:1350 case CDC_2_5_RX_RX1_RX_PATH_MIX_SEC1:1351 case CDC_2_5_RX_RX1_RX_PATH_DSM_CTL:1352 case CDC_2_5_RX_RX1_RX_PATH_DSM_DATA1:1353 case CDC_2_5_RX_RX1_RX_PATH_DSM_DATA2:1354 case CDC_2_5_RX_RX1_RX_PATH_DSM_DATA3:1355 case CDC_2_5_RX_RX1_RX_PATH_DSM_DATA4:1356 case CDC_2_5_RX_RX1_RX_PATH_DSM_DATA5:1357 case CDC_2_5_RX_RX1_RX_PATH_DSM_DATA6:1358 case CDC_2_5_RX_RX2_RX_PATH_CTL:1359 case CDC_2_5_RX_RX2_RX_PATH_CFG0:1360 case CDC_2_5_RX_RX2_RX_PATH_CFG1:1361 case CDC_2_5_RX_RX2_RX_PATH_CFG2:1362 case CDC_2_5_RX_RX2_RX_PATH_CFG3:1363 case CDC_2_5_RX_RX2_RX_VOL_CTL:1364 case CDC_2_5_RX_RX2_RX_PATH_MIX_CTL:1365 case CDC_2_5_RX_RX2_RX_PATH_MIX_CFG:1366 case CDC_2_5_RX_RX2_RX_VOL_MIX_CTL:1367 case CDC_2_5_RX_RX2_RX_PATH_SEC0:1368 case CDC_2_5_RX_RX2_RX_PATH_SEC1:1369 case CDC_2_5_RX_RX2_RX_PATH_SEC2:1370 case CDC_2_5_RX_RX2_RX_PATH_SEC3:1371 case CDC_2_5_RX_RX2_RX_PATH_SEC4:1372 case CDC_2_5_RX_RX2_RX_PATH_SEC5:1373 case CDC_2_5_RX_RX2_RX_PATH_SEC6:1374 case CDC_2_5_RX_RX2_RX_PATH_SEC7:1375 case CDC_2_5_RX_RX2_RX_PATH_MIX_SEC0:1376 case CDC_2_5_RX_RX2_RX_PATH_MIX_SEC1:1377 case CDC_2_5_RX_RX2_RX_PATH_DSM_CTL:1378 return true;1379 }1380 1381 return false;1382}1383 1384static bool rx_is_rw_register(struct device *dev, unsigned int reg)1385{1386 struct rx_macro *rx = dev_get_drvdata(dev);1387 1388 switch (reg) {1389 case CDC_RX_TOP_TOP_CFG0:1390 case CDC_RX_TOP_SWR_CTRL:1391 case CDC_RX_TOP_DEBUG:1392 case CDC_RX_TOP_DEBUG_BUS:1393 case CDC_RX_TOP_DEBUG_EN0:1394 case CDC_RX_TOP_DEBUG_EN1:1395 case CDC_RX_TOP_DEBUG_EN2:1396 case CDC_RX_TOP_HPHL_COMP_WR_LSB:1397 case CDC_RX_TOP_HPHL_COMP_WR_MSB:1398 case CDC_RX_TOP_HPHL_COMP_LUT:1399 case CDC_RX_TOP_HPHR_COMP_WR_LSB:1400 case CDC_RX_TOP_HPHR_COMP_WR_MSB:1401 case CDC_RX_TOP_HPHR_COMP_LUT:1402 case CDC_RX_TOP_DSD0_DEBUG_CFG0:1403 case CDC_RX_TOP_DSD0_DEBUG_CFG1:1404 case CDC_RX_TOP_DSD0_DEBUG_CFG3:1405 case CDC_RX_TOP_DSD1_DEBUG_CFG0:1406 case CDC_RX_TOP_DSD1_DEBUG_CFG1:1407 case CDC_RX_TOP_DSD1_DEBUG_CFG3:1408 case CDC_RX_TOP_RX_I2S_CTL:1409 case CDC_RX_TOP_TX_I2S2_CTL:1410 case CDC_RX_TOP_I2S_CLK:1411 case CDC_RX_TOP_I2S_RESET:1412 case CDC_RX_TOP_I2S_MUX:1413 case CDC_RX_CLK_RST_CTRL_MCLK_CONTROL:1414 case CDC_RX_CLK_RST_CTRL_FS_CNT_CONTROL:1415 case CDC_RX_CLK_RST_CTRL_SWR_CONTROL:1416 case CDC_RX_CLK_RST_CTRL_DSD_CONTROL:1417 case CDC_RX_CLK_RST_CTRL_ASRC_SHARE_CONTROL:1418 case CDC_RX_SOFTCLIP_CRC:1419 case CDC_RX_SOFTCLIP_SOFTCLIP_CTRL:1420 case CDC_RX_INP_MUX_RX_INT0_CFG0:1421 case CDC_RX_INP_MUX_RX_INT0_CFG1:1422 case CDC_RX_INP_MUX_RX_INT1_CFG0:1423 case CDC_RX_INP_MUX_RX_INT1_CFG1:1424 case CDC_RX_INP_MUX_RX_INT2_CFG0:1425 case CDC_RX_INP_MUX_RX_INT2_CFG1:1426 case CDC_RX_INP_MUX_RX_MIX_CFG4:1427 case CDC_RX_INP_MUX_RX_MIX_CFG5:1428 case CDC_RX_INP_MUX_SIDETONE_SRC_CFG0:1429 case CDC_RX_CLSH_CRC:1430 case CDC_RX_CLSH_DLY_CTRL:1431 case CDC_RX_CLSH_DECAY_CTRL:1432 case CDC_RX_CLSH_HPH_V_PA:1433 case CDC_RX_CLSH_EAR_V_PA:1434 case CDC_RX_CLSH_HPH_V_HD:1435 case CDC_RX_CLSH_EAR_V_HD:1436 case CDC_RX_CLSH_K1_MSB:1437 case CDC_RX_CLSH_K1_LSB:1438 case CDC_RX_CLSH_K2_MSB:1439 case CDC_RX_CLSH_K2_LSB:1440 case CDC_RX_CLSH_IDLE_CTRL:1441 case CDC_RX_CLSH_IDLE_HPH:1442 case CDC_RX_CLSH_IDLE_EAR:1443 case CDC_RX_CLSH_TEST0:1444 case CDC_RX_CLSH_TEST1:1445 case CDC_RX_CLSH_OVR_VREF:1446 case CDC_RX_CLSH_CLSG_CTL:1447 case CDC_RX_CLSH_CLSG_CFG1:1448 case CDC_RX_CLSH_CLSG_CFG2:1449 case CDC_RX_BCL_VBAT_PATH_CTL:1450 case CDC_RX_BCL_VBAT_CFG:1451 case CDC_RX_BCL_VBAT_ADC_CAL1:1452 case CDC_RX_BCL_VBAT_ADC_CAL2:1453 case CDC_RX_BCL_VBAT_ADC_CAL3:1454 case CDC_RX_BCL_VBAT_PK_EST1:1455 case CDC_RX_BCL_VBAT_PK_EST2:1456 case CDC_RX_BCL_VBAT_PK_EST3:1457 case CDC_RX_BCL_VBAT_RF_PROC1:1458 case CDC_RX_BCL_VBAT_RF_PROC2:1459 case CDC_RX_BCL_VBAT_TAC1:1460 case CDC_RX_BCL_VBAT_TAC2:1461 case CDC_RX_BCL_VBAT_TAC3:1462 case CDC_RX_BCL_VBAT_TAC4:1463 case CDC_RX_BCL_VBAT_GAIN_UPD1:1464 case CDC_RX_BCL_VBAT_GAIN_UPD2:1465 case CDC_RX_BCL_VBAT_GAIN_UPD3:1466 case CDC_RX_BCL_VBAT_GAIN_UPD4:1467 case CDC_RX_BCL_VBAT_GAIN_UPD5:1468 case CDC_RX_BCL_VBAT_DEBUG1:1469 case CDC_RX_BCL_VBAT_BAN:1470 case CDC_RX_BCL_VBAT_BCL_GAIN_UPD1:1471 case CDC_RX_BCL_VBAT_BCL_GAIN_UPD2:1472 case CDC_RX_BCL_VBAT_BCL_GAIN_UPD3:1473 case CDC_RX_BCL_VBAT_BCL_GAIN_UPD4:1474 case CDC_RX_BCL_VBAT_BCL_GAIN_UPD5:1475 case CDC_RX_BCL_VBAT_BCL_GAIN_UPD6:1476 case CDC_RX_BCL_VBAT_BCL_GAIN_UPD7:1477 case CDC_RX_BCL_VBAT_BCL_GAIN_UPD8:1478 case CDC_RX_BCL_VBAT_BCL_GAIN_UPD9:1479 case CDC_RX_BCL_VBAT_ATTN1:1480 case CDC_RX_BCL_VBAT_ATTN2:1481 case CDC_RX_BCL_VBAT_ATTN3:1482 case CDC_RX_BCL_VBAT_DECODE_CTL1:1483 case CDC_RX_BCL_VBAT_DECODE_CTL2:1484 case CDC_RX_BCL_VBAT_DECODE_CFG1:1485 case CDC_RX_BCL_VBAT_DECODE_CFG2:1486 case CDC_RX_BCL_VBAT_DECODE_CFG3:1487 case CDC_RX_BCL_VBAT_DECODE_CFG4:1488 case CDC_RX_INTR_CTRL_CFG:1489 case CDC_RX_INTR_CTRL_PIN1_MASK0:1490 case CDC_RX_INTR_CTRL_PIN2_MASK0:1491 case CDC_RX_INTR_CTRL_LEVEL0:1492 case CDC_RX_INTR_CTRL_BYPASS0:1493 case CDC_RX_INTR_CTRL_SET0:1494 case CDC_RX_RX0_RX_PATH_CTL:1495 case CDC_RX_RX0_RX_PATH_CFG0:1496 case CDC_RX_RX0_RX_PATH_CFG1:1497 case CDC_RX_RX0_RX_PATH_CFG2:1498 case CDC_RX_RX0_RX_PATH_CFG3:1499 case CDC_RX_RX0_RX_VOL_CTL:1500 case CDC_RX_RX0_RX_PATH_MIX_CTL:1501 case CDC_RX_RX0_RX_PATH_MIX_CFG:1502 case CDC_RX_RX0_RX_VOL_MIX_CTL:1503 case CDC_RX_RX0_RX_PATH_SEC1:1504 case CDC_RX_RX0_RX_PATH_SEC2:1505 case CDC_RX_RX0_RX_PATH_SEC3:1506 case CDC_RX_RX0_RX_PATH_SEC4:1507 case CDC_RX_RX0_RX_PATH_SEC7:1508 case CDC_RX_RX0_RX_PATH_MIX_SEC0:1509 case CDC_RX_RX0_RX_PATH_MIX_SEC1:1510 case CDC_RX_RX0_RX_PATH_DSM_CTL:1511 case CDC_RX_RX0_RX_PATH_DSM_DATA1:1512 case CDC_RX_RX0_RX_PATH_DSM_DATA2:1513 case CDC_RX_RX0_RX_PATH_DSM_DATA3:1514 case CDC_RX_RX0_RX_PATH_DSM_DATA4:1515 case CDC_RX_RX0_RX_PATH_DSM_DATA5:1516 case CDC_RX_RX0_RX_PATH_DSM_DATA6:1517 case CDC_RX_IDLE_DETECT_PATH_CTL:1518 case CDC_RX_IDLE_DETECT_CFG0:1519 case CDC_RX_IDLE_DETECT_CFG1:1520 case CDC_RX_IDLE_DETECT_CFG2:1521 case CDC_RX_IDLE_DETECT_CFG3:1522 case CDC_RX_COMPANDER0_CTL0:1523 case CDC_RX_COMPANDER0_CTL1:1524 case CDC_RX_COMPANDER0_CTL2:1525 case CDC_RX_COMPANDER0_CTL3:1526 case CDC_RX_COMPANDER0_CTL4:1527 case CDC_RX_COMPANDER0_CTL5:1528 case CDC_RX_COMPANDER0_CTL7:1529 case CDC_RX_COMPANDER1_CTL0:1530 case CDC_RX_COMPANDER1_CTL1:1531 case CDC_RX_COMPANDER1_CTL2:1532 case CDC_RX_COMPANDER1_CTL3:1533 case CDC_RX_COMPANDER1_CTL4:1534 case CDC_RX_COMPANDER1_CTL5:1535 case CDC_RX_COMPANDER1_CTL7:1536 case CDC_RX_SIDETONE_IIR0_IIR_PATH_CTL:1537 case CDC_RX_SIDETONE_IIR0_IIR_GAIN_B1_CTL:1538 case CDC_RX_SIDETONE_IIR0_IIR_GAIN_B2_CTL:1539 case CDC_RX_SIDETONE_IIR0_IIR_GAIN_B3_CTL:1540 case CDC_RX_SIDETONE_IIR0_IIR_GAIN_B4_CTL:1541 case CDC_RX_SIDETONE_IIR0_IIR_GAIN_B5_CTL:1542 case CDC_RX_SIDETONE_IIR0_IIR_GAIN_B6_CTL:1543 case CDC_RX_SIDETONE_IIR0_IIR_GAIN_B7_CTL:1544 case CDC_RX_SIDETONE_IIR0_IIR_GAIN_B8_CTL:1545 case CDC_RX_SIDETONE_IIR0_IIR_CTL:1546 case CDC_RX_SIDETONE_IIR0_IIR_GAIN_TIMER_CTL:1547 case CDC_RX_SIDETONE_IIR0_IIR_COEF_B1_CTL:1548 case CDC_RX_SIDETONE_IIR0_IIR_COEF_B2_CTL:1549 case CDC_RX_SIDETONE_IIR1_IIR_PATH_CTL:1550 case CDC_RX_SIDETONE_IIR1_IIR_GAIN_B1_CTL:1551 case CDC_RX_SIDETONE_IIR1_IIR_GAIN_B2_CTL:1552 case CDC_RX_SIDETONE_IIR1_IIR_GAIN_B3_CTL:1553 case CDC_RX_SIDETONE_IIR1_IIR_GAIN_B4_CTL:1554 case CDC_RX_SIDETONE_IIR1_IIR_GAIN_B5_CTL:1555 case CDC_RX_SIDETONE_IIR1_IIR_GAIN_B6_CTL:1556 case CDC_RX_SIDETONE_IIR1_IIR_GAIN_B7_CTL:1557 case CDC_RX_SIDETONE_IIR1_IIR_GAIN_B8_CTL:1558 case CDC_RX_SIDETONE_IIR1_IIR_CTL:1559 case CDC_RX_SIDETONE_IIR1_IIR_GAIN_TIMER_CTL:1560 case CDC_RX_SIDETONE_IIR1_IIR_COEF_B1_CTL:1561 case CDC_RX_SIDETONE_IIR1_IIR_COEF_B2_CTL:1562 case CDC_RX_IIR_INP_MUX_IIR0_MIX_CFG0:1563 case CDC_RX_IIR_INP_MUX_IIR0_MIX_CFG1:1564 case CDC_RX_IIR_INP_MUX_IIR0_MIX_CFG2:1565 case CDC_RX_IIR_INP_MUX_IIR0_MIX_CFG3:1566 case CDC_RX_IIR_INP_MUX_IIR1_MIX_CFG0:1567 case CDC_RX_IIR_INP_MUX_IIR1_MIX_CFG1:1568 case CDC_RX_IIR_INP_MUX_IIR1_MIX_CFG2:1569 case CDC_RX_IIR_INP_MUX_IIR1_MIX_CFG3:1570 case CDC_RX_SIDETONE_SRC0_ST_SRC_PATH_CTL:1571 case CDC_RX_SIDETONE_SRC0_ST_SRC_PATH_CFG1:1572 case CDC_RX_SIDETONE_SRC1_ST_SRC_PATH_CTL:1573 case CDC_RX_SIDETONE_SRC1_ST_SRC_PATH_CFG1:1574 case CDC_RX_EC_REF_HQ0_EC_REF_HQ_PATH_CTL:1575 case CDC_RX_EC_REF_HQ0_EC_REF_HQ_CFG0:1576 case CDC_RX_EC_REF_HQ1_EC_REF_HQ_PATH_CTL:1577 case CDC_RX_EC_REF_HQ1_EC_REF_HQ_CFG0:1578 case CDC_RX_EC_REF_HQ2_EC_REF_HQ_PATH_CTL:1579 case CDC_RX_EC_REF_HQ2_EC_REF_HQ_CFG0:1580 case CDC_RX_EC_ASRC0_CLK_RST_CTL:1581 case CDC_RX_EC_ASRC0_CTL0:1582 case CDC_RX_EC_ASRC0_CTL1:1583 case CDC_RX_EC_ASRC0_FIFO_CTL:1584 case CDC_RX_EC_ASRC1_CLK_RST_CTL:1585 case CDC_RX_EC_ASRC1_CTL0:1586 case CDC_RX_EC_ASRC1_CTL1:1587 case CDC_RX_EC_ASRC1_FIFO_CTL:1588 case CDC_RX_EC_ASRC2_CLK_RST_CTL:1589 case CDC_RX_EC_ASRC2_CTL0:1590 case CDC_RX_EC_ASRC2_CTL1:1591 case CDC_RX_EC_ASRC2_FIFO_CTL:1592 case CDC_RX_DSD0_PATH_CTL:1593 case CDC_RX_DSD0_CFG0:1594 case CDC_RX_DSD0_CFG1:1595 case CDC_RX_DSD0_CFG2:1596 case CDC_RX_DSD1_PATH_CTL:1597 case CDC_RX_DSD1_CFG0:1598 case CDC_RX_DSD1_CFG1:1599 case CDC_RX_DSD1_CFG2:1600 return true;1601 }1602 1603 switch (rx->codec_version) {1604 case LPASS_CODEC_VERSION_1_0:1605 case LPASS_CODEC_VERSION_1_1:1606 case LPASS_CODEC_VERSION_1_2:1607 case LPASS_CODEC_VERSION_2_0:1608 case LPASS_CODEC_VERSION_2_1:1609 return rx_pre_2_5_is_rw_register(dev, reg);1610 case LPASS_CODEC_VERSION_2_5:1611 case LPASS_CODEC_VERSION_2_6:1612 case LPASS_CODEC_VERSION_2_7:1613 case LPASS_CODEC_VERSION_2_8:1614 return rx_2_5_is_rw_register(dev, reg);1615 default:1616 break;1617 }1618 1619 return false;1620}1621 1622static bool rx_is_writeable_register(struct device *dev, unsigned int reg)1623{1624 bool ret;1625 1626 ret = rx_is_rw_register(dev, reg);1627 if (!ret)1628 return rx_is_wronly_register(dev, reg);1629 1630 return ret;1631}1632 1633static bool rx_is_readable_register(struct device *dev, unsigned int reg)1634{1635 switch (reg) {1636 case CDC_RX_TOP_HPHL_COMP_RD_LSB:1637 case CDC_RX_TOP_HPHL_COMP_RD_MSB:1638 case CDC_RX_TOP_HPHR_COMP_RD_LSB:1639 case CDC_RX_TOP_HPHR_COMP_RD_MSB:1640 case CDC_RX_TOP_DSD0_DEBUG_CFG2:1641 case CDC_RX_TOP_DSD1_DEBUG_CFG2:1642 case CDC_RX_BCL_VBAT_GAIN_MON_VAL:1643 case CDC_RX_BCL_VBAT_DECODE_ST:1644 case CDC_RX_INTR_CTRL_PIN1_STATUS0:1645 case CDC_RX_INTR_CTRL_PIN2_STATUS0:1646 case CDC_RX_COMPANDER0_CTL6:1647 case CDC_RX_COMPANDER1_CTL6:1648 case CDC_RX_EC_ASRC0_STATUS_FMIN_CNTR_LSB:1649 case CDC_RX_EC_ASRC0_STATUS_FMIN_CNTR_MSB:1650 case CDC_RX_EC_ASRC0_STATUS_FMAX_CNTR_LSB:1651 case CDC_RX_EC_ASRC0_STATUS_FMAX_CNTR_MSB:1652 case CDC_RX_EC_ASRC0_STATUS_FIFO:1653 case CDC_RX_EC_ASRC1_STATUS_FMIN_CNTR_LSB:1654 case CDC_RX_EC_ASRC1_STATUS_FMIN_CNTR_MSB:1655 case CDC_RX_EC_ASRC1_STATUS_FMAX_CNTR_LSB:1656 case CDC_RX_EC_ASRC1_STATUS_FMAX_CNTR_MSB:1657 case CDC_RX_EC_ASRC1_STATUS_FIFO:1658 case CDC_RX_EC_ASRC2_STATUS_FMIN_CNTR_LSB:1659 case CDC_RX_EC_ASRC2_STATUS_FMIN_CNTR_MSB:1660 case CDC_RX_EC_ASRC2_STATUS_FMAX_CNTR_LSB:1661 case CDC_RX_EC_ASRC2_STATUS_FMAX_CNTR_MSB:1662 case CDC_RX_EC_ASRC2_STATUS_FIFO:1663 return true;1664 }1665 1666 return rx_is_rw_register(dev, reg);1667}1668 1669static const struct regmap_config rx_regmap_config = {1670 .name = "rx_macro",1671 .reg_bits = 16,1672 .val_bits = 32, /* 8 but with 32 bit read/write */1673 .reg_stride = 4,1674 .cache_type = REGCACHE_FLAT,1675 .max_register = RX_MAX_OFFSET,1676 .writeable_reg = rx_is_writeable_register,1677 .volatile_reg = rx_is_volatile_register,1678 .readable_reg = rx_is_readable_register,1679};1680 1681static int rx_macro_int_dem_inp_mux_put(struct snd_kcontrol *kcontrol,1682 struct snd_ctl_elem_value *ucontrol)1683{1684 struct snd_soc_dapm_widget *widget = snd_soc_dapm_kcontrol_widget(kcontrol);1685 struct snd_soc_component *component = snd_soc_dapm_to_component(widget->dapm);1686 struct rx_macro *rx = snd_soc_component_get_drvdata(component);1687 struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;1688 unsigned short look_ahead_dly_reg;1689 unsigned int val;1690 1691 val = ucontrol->value.enumerated.item[0];1692 1693 if (e->reg == CDC_RX_RXn_RX_PATH_CFG1(rx, 0))1694 look_ahead_dly_reg = CDC_RX_RXn_RX_PATH_CFG0(rx, 0);1695 else if (e->reg == CDC_RX_RXn_RX_PATH_CFG1(rx, 1))1696 look_ahead_dly_reg = CDC_RX_RXn_RX_PATH_CFG0(rx, 1);1697 1698 /* Set Look Ahead Delay */1699 if (val)1700 snd_soc_component_update_bits(component, look_ahead_dly_reg,1701 CDC_RX_DLY_ZN_EN_MASK,1702 CDC_RX_DLY_ZN_ENABLE);1703 else1704 snd_soc_component_update_bits(component, look_ahead_dly_reg,1705 CDC_RX_DLY_ZN_EN_MASK, 0);1706 /* Set DEM INP Select */1707 return snd_soc_dapm_put_enum_double(kcontrol, ucontrol);1708}1709 1710static const struct snd_kcontrol_new rx_int0_dem_inp_mux =1711 SOC_DAPM_ENUM_EXT("rx_int0_dem_inp", rx_int0_dem_inp_enum,1712 snd_soc_dapm_get_enum_double, rx_macro_int_dem_inp_mux_put);1713static const struct snd_kcontrol_new rx_int1_dem_inp_mux =1714 SOC_DAPM_ENUM_EXT("rx_int1_dem_inp", rx_int1_dem_inp_enum,1715 snd_soc_dapm_get_enum_double, rx_macro_int_dem_inp_mux_put);1716 1717static const struct snd_kcontrol_new rx_2_5_int1_dem_inp_mux =1718 SOC_DAPM_ENUM_EXT("rx_int1_dem_inp", rx_2_5_int1_dem_inp_enum,1719 snd_soc_dapm_get_enum_double, rx_macro_int_dem_inp_mux_put);1720 1721static int rx_macro_set_prim_interpolator_rate(struct snd_soc_dai *dai,1722 int rate_reg_val, u32 sample_rate)1723{1724 1725 u8 int_1_mix1_inp;1726 u32 j, port;1727 u16 int_mux_cfg0, int_mux_cfg1;1728 u16 int_fs_reg;1729 u8 inp0_sel, inp1_sel, inp2_sel;1730 struct snd_soc_component *component = dai->component;1731 struct rx_macro *rx = snd_soc_component_get_drvdata(component);1732 1733 for_each_set_bit(port, &rx->active_ch_mask[dai->id], RX_MACRO_PORTS_MAX) {1734 int_1_mix1_inp = port;1735 int_mux_cfg0 = CDC_RX_INP_MUX_RX_INT0_CFG0;1736 /*1737 * Loop through all interpolator MUX inputs and find out1738 * to which interpolator input, the rx port1739 * is connected1740 */1741 for (j = 0; j < INTERP_MAX; j++) {1742 int_mux_cfg1 = int_mux_cfg0 + 4;1743 1744 inp0_sel = snd_soc_component_read_field(component, int_mux_cfg0,1745 CDC_RX_INTX_1_MIX_INP0_SEL_MASK);1746 inp1_sel = snd_soc_component_read_field(component, int_mux_cfg0,1747 CDC_RX_INTX_1_MIX_INP1_SEL_MASK);1748 inp2_sel = snd_soc_component_read_field(component, int_mux_cfg1,1749 CDC_RX_INTX_1_MIX_INP2_SEL_MASK);1750 1751 if ((inp0_sel == int_1_mix1_inp + INTn_1_INP_SEL_RX0) ||1752 (inp1_sel == int_1_mix1_inp + INTn_1_INP_SEL_RX0) ||1753 (inp2_sel == int_1_mix1_inp + INTn_1_INP_SEL_RX0)) {1754 int_fs_reg = CDC_RX_RXn_RX_PATH_CTL(rx, j);1755 /* sample_rate is in Hz */1756 snd_soc_component_update_bits(component, int_fs_reg,1757 CDC_RX_PATH_PCM_RATE_MASK,1758 rate_reg_val);1759 }1760 int_mux_cfg0 += 8;1761 }1762 }1763 1764 return 0;1765}1766 1767static int rx_macro_set_mix_interpolator_rate(struct snd_soc_dai *dai,1768 int rate_reg_val, u32 sample_rate)1769{1770 1771 u8 int_2_inp;1772 u32 j, port;1773 u16 int_mux_cfg1, int_fs_reg;1774 u8 int_mux_cfg1_val;1775 struct snd_soc_component *component = dai->component;1776 struct rx_macro *rx = snd_soc_component_get_drvdata(component);1777 1778 for_each_set_bit(port, &rx->active_ch_mask[dai->id], RX_MACRO_PORTS_MAX) {1779 int_2_inp = port;1780 1781 int_mux_cfg1 = CDC_RX_INP_MUX_RX_INT0_CFG1;1782 for (j = 0; j < INTERP_MAX; j++) {1783 int_mux_cfg1_val = snd_soc_component_read_field(component, int_mux_cfg1,1784 CDC_RX_INTX_2_SEL_MASK);1785 1786 if (int_mux_cfg1_val == int_2_inp + INTn_2_INP_SEL_RX0) {1787 int_fs_reg = CDC_RX_RXn_RX_PATH_MIX_CTL(rx, j);1788 snd_soc_component_update_bits(component, int_fs_reg,1789 CDC_RX_RXn_MIX_PCM_RATE_MASK,1790 rate_reg_val);1791 }1792 int_mux_cfg1 += 8;1793 }1794 }1795 return 0;1796}1797 1798static int rx_macro_set_interpolator_rate(struct snd_soc_dai *dai,1799 u32 sample_rate)1800{1801 int rate_val = 0;1802 int i, ret;1803 1804 for (i = 0; i < ARRAY_SIZE(sr_val_tbl); i++)1805 if (sample_rate == sr_val_tbl[i].sample_rate)1806 rate_val = sr_val_tbl[i].rate_val;1807 1808 ret = rx_macro_set_prim_interpolator_rate(dai, rate_val, sample_rate);1809 if (ret)1810 return ret;1811 1812 ret = rx_macro_set_mix_interpolator_rate(dai, rate_val, sample_rate);1813 1814 return ret;1815}1816 1817static int rx_macro_hw_params(struct snd_pcm_substream *substream,1818 struct snd_pcm_hw_params *params,1819 struct snd_soc_dai *dai)1820{1821 struct snd_soc_component *component = dai->component;1822 struct rx_macro *rx = snd_soc_component_get_drvdata(component);1823 int ret;1824 1825 switch (substream->stream) {1826 case SNDRV_PCM_STREAM_PLAYBACK:1827 ret = rx_macro_set_interpolator_rate(dai, params_rate(params));1828 if (ret) {1829 dev_err(component->dev, "%s: cannot set sample rate: %u\n",1830 __func__, params_rate(params));1831 return ret;1832 }1833 rx->bit_width[dai->id] = params_width(params);1834 break;1835 default:1836 break;1837 }1838 return 0;1839}1840 1841static int rx_macro_get_channel_map(const struct snd_soc_dai *dai,1842 unsigned int *tx_num, unsigned int *tx_slot,1843 unsigned int *rx_num, unsigned int *rx_slot)1844{1845 struct snd_soc_component *component = dai->component;1846 struct rx_macro *rx = snd_soc_component_get_drvdata(component);1847 u16 val, mask = 0, cnt = 0, temp;1848 1849 switch (dai->id) {1850 case RX_MACRO_AIF1_PB:1851 case RX_MACRO_AIF2_PB:1852 case RX_MACRO_AIF3_PB:1853 case RX_MACRO_AIF4_PB:1854 for_each_set_bit(temp, &rx->active_ch_mask[dai->id],1855 RX_MACRO_PORTS_MAX) {1856 mask |= (1 << temp);1857 if (++cnt == RX_MACRO_MAX_DMA_CH_PER_PORT)1858 break;1859 }1860 /*1861 * CDC_DMA_RX_0 port drives RX0/RX1 -- ch_mask 0x1/0x2/0x31862 * CDC_DMA_RX_1 port drives RX2/RX3 -- ch_mask 0x1/0x2/0x31863 * CDC_DMA_RX_2 port drives RX4 -- ch_mask 0x11864 * CDC_DMA_RX_3 port drives RX5 -- ch_mask 0x11865 * AIFn can pair to any CDC_DMA_RX_n port.1866 * In general, below convention is used::1867 * CDC_DMA_RX_0(AIF1)/CDC_DMA_RX_1(AIF2)/1868 * CDC_DMA_RX_2(AIF3)/CDC_DMA_RX_3(AIF4)1869 */1870 if (mask & 0x0C)1871 mask = mask >> 2;1872 if ((mask & 0x10) || (mask & 0x20))1873 mask = 0x1;1874 *rx_slot = mask;1875 *rx_num = rx->active_ch_cnt[dai->id];1876 break;1877 case RX_MACRO_AIF_ECHO:1878 val = snd_soc_component_read(component, CDC_RX_INP_MUX_RX_MIX_CFG4);1879 if (val & RX_MACRO_EC_MIX_TX0_MASK) {1880 mask |= 0x1;1881 cnt++;1882 }1883 if (val & RX_MACRO_EC_MIX_TX1_MASK) {1884 mask |= 0x2;1885 cnt++;1886 }1887 val = snd_soc_component_read(component,1888 CDC_RX_INP_MUX_RX_MIX_CFG5);1889 if (val & RX_MACRO_EC_MIX_TX2_MASK) {1890 mask |= 0x4;1891 cnt++;1892 }1893 *tx_slot = mask;1894 *tx_num = cnt;1895 break;1896 default:1897 dev_err(component->dev, "%s: Invalid AIF\n", __func__);1898 break;1899 }1900 return 0;1901}1902 1903static int rx_macro_digital_mute(struct snd_soc_dai *dai, int mute, int stream)1904{1905 struct snd_soc_component *component = dai->component;1906 struct rx_macro *rx = snd_soc_component_get_drvdata(component);1907 uint16_t j, reg, mix_reg, dsm_reg;1908 u16 int_mux_cfg0, int_mux_cfg1;1909 u8 int_mux_cfg0_val, int_mux_cfg1_val;1910 1911 switch (dai->id) {1912 case RX_MACRO_AIF1_PB:1913 case RX_MACRO_AIF2_PB:1914 case RX_MACRO_AIF3_PB:1915 case RX_MACRO_AIF4_PB:1916 for (j = 0; j < INTERP_MAX; j++) {1917 reg = CDC_RX_RXn_RX_PATH_CTL(rx, j);1918 mix_reg = CDC_RX_RXn_RX_PATH_MIX_CTL(rx, j);1919 dsm_reg = CDC_RX_RXn_RX_PATH_DSM_CTL(rx, j);1920 1921 if (mute) {1922 snd_soc_component_update_bits(component, reg,1923 CDC_RX_PATH_PGA_MUTE_MASK,1924 CDC_RX_PATH_PGA_MUTE_ENABLE);1925 snd_soc_component_update_bits(component, mix_reg,1926 CDC_RX_PATH_PGA_MUTE_MASK,1927 CDC_RX_PATH_PGA_MUTE_ENABLE);1928 } else {1929 snd_soc_component_update_bits(component, reg,1930 CDC_RX_PATH_PGA_MUTE_MASK, 0x0);1931 snd_soc_component_update_bits(component, mix_reg,1932 CDC_RX_PATH_PGA_MUTE_MASK, 0x0);1933 }1934 1935 int_mux_cfg0 = CDC_RX_INP_MUX_RX_INT0_CFG0 + j * 8;1936 int_mux_cfg1 = int_mux_cfg0 + 4;1937 int_mux_cfg0_val = snd_soc_component_read(component, int_mux_cfg0);1938 int_mux_cfg1_val = snd_soc_component_read(component, int_mux_cfg1);1939 1940 if (snd_soc_component_read(component, dsm_reg) & 0x01) {1941 if (int_mux_cfg0_val || (int_mux_cfg1_val & 0xF0))1942 snd_soc_component_update_bits(component, reg, 0x20, 0x20);1943 if (int_mux_cfg1_val & 0x0F) {1944 snd_soc_component_update_bits(component, reg, 0x20, 0x20);1945 snd_soc_component_update_bits(component, mix_reg, 0x20,1946 0x20);1947 }1948 }1949 }1950 break;1951 default:1952 break;1953 }1954 return 0;1955}1956 1957static const struct snd_soc_dai_ops rx_macro_dai_ops = {1958 .hw_params = rx_macro_hw_params,1959 .get_channel_map = rx_macro_get_channel_map,1960 .mute_stream = rx_macro_digital_mute,1961};1962 1963static struct snd_soc_dai_driver rx_macro_dai[] = {1964 {1965 .name = "rx_macro_rx1",1966 .id = RX_MACRO_AIF1_PB,1967 .playback = {1968 .stream_name = "RX_MACRO_AIF1 Playback",1969 .rates = RX_MACRO_RATES | RX_MACRO_FRAC_RATES,1970 .formats = RX_MACRO_FORMATS,1971 .rate_max = 384000,1972 .rate_min = 8000,1973 .channels_min = 1,1974 .channels_max = 2,1975 },1976 .ops = &rx_macro_dai_ops,1977 },1978 {1979 .name = "rx_macro_rx2",1980 .id = RX_MACRO_AIF2_PB,1981 .playback = {1982 .stream_name = "RX_MACRO_AIF2 Playback",1983 .rates = RX_MACRO_RATES | RX_MACRO_FRAC_RATES,1984 .formats = RX_MACRO_FORMATS,1985 .rate_max = 384000,1986 .rate_min = 8000,1987 .channels_min = 1,1988 .channels_max = 2,1989 },1990 .ops = &rx_macro_dai_ops,1991 },1992 {1993 .name = "rx_macro_rx3",1994 .id = RX_MACRO_AIF3_PB,1995 .playback = {1996 .stream_name = "RX_MACRO_AIF3 Playback",1997 .rates = RX_MACRO_RATES | RX_MACRO_FRAC_RATES,1998 .formats = RX_MACRO_FORMATS,1999 .rate_max = 384000,2000 .rate_min = 8000,2001 .channels_min = 1,2002 .channels_max = 2,2003 },2004 .ops = &rx_macro_dai_ops,2005 },2006 {2007 .name = "rx_macro_rx4",2008 .id = RX_MACRO_AIF4_PB,2009 .playback = {2010 .stream_name = "RX_MACRO_AIF4 Playback",2011 .rates = RX_MACRO_RATES | RX_MACRO_FRAC_RATES,2012 .formats = RX_MACRO_FORMATS,2013 .rate_max = 384000,2014 .rate_min = 8000,2015 .channels_min = 1,2016 .channels_max = 2,2017 },2018 .ops = &rx_macro_dai_ops,2019 },2020 {2021 .name = "rx_macro_echo",2022 .id = RX_MACRO_AIF_ECHO,2023 .capture = {2024 .stream_name = "RX_AIF_ECHO Capture",2025 .rates = RX_MACRO_ECHO_RATES,2026 .formats = RX_MACRO_ECHO_FORMATS,2027 .rate_max = 48000,2028 .rate_min = 8000,2029 .channels_min = 1,2030 .channels_max = 3,2031 },2032 .ops = &rx_macro_dai_ops,2033 },2034};2035 2036static void rx_macro_mclk_enable(struct rx_macro *rx, bool mclk_enable)2037{2038 struct regmap *regmap = rx->regmap;2039 2040 if (mclk_enable) {2041 if (rx->rx_mclk_users == 0) {2042 regmap_update_bits(regmap, CDC_RX_CLK_RST_CTRL_MCLK_CONTROL,2043 CDC_RX_CLK_MCLK_EN_MASK |2044 CDC_RX_CLK_MCLK2_EN_MASK,2045 CDC_RX_CLK_MCLK_ENABLE |2046 CDC_RX_CLK_MCLK2_ENABLE);2047 regmap_update_bits(regmap, CDC_RX_CLK_RST_CTRL_FS_CNT_CONTROL,2048 CDC_RX_FS_MCLK_CNT_CLR_MASK, 0x00);2049 regmap_update_bits(regmap, CDC_RX_CLK_RST_CTRL_FS_CNT_CONTROL,2050 CDC_RX_FS_MCLK_CNT_EN_MASK,2051 CDC_RX_FS_MCLK_CNT_ENABLE);2052 regcache_mark_dirty(regmap);2053 regcache_sync(regmap);2054 }2055 rx->rx_mclk_users++;2056 } else {2057 if (rx->rx_mclk_users <= 0) {2058 dev_err(rx->dev, "%s: clock already disabled\n", __func__);2059 rx->rx_mclk_users = 0;2060 return;2061 }2062 rx->rx_mclk_users--;2063 if (rx->rx_mclk_users == 0) {2064 regmap_update_bits(regmap, CDC_RX_CLK_RST_CTRL_FS_CNT_CONTROL,2065 CDC_RX_FS_MCLK_CNT_EN_MASK, 0x0);2066 regmap_update_bits(regmap, CDC_RX_CLK_RST_CTRL_FS_CNT_CONTROL,2067 CDC_RX_FS_MCLK_CNT_CLR_MASK,2068 CDC_RX_FS_MCLK_CNT_CLR);2069 regmap_update_bits(regmap, CDC_RX_CLK_RST_CTRL_MCLK_CONTROL,2070 CDC_RX_CLK_MCLK_EN_MASK |2071 CDC_RX_CLK_MCLK2_EN_MASK, 0x0);2072 }2073 }2074}2075 2076static int rx_macro_mclk_event(struct snd_soc_dapm_widget *w,2077 struct snd_kcontrol *kcontrol, int event)2078{2079 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);2080 struct rx_macro *rx = snd_soc_component_get_drvdata(component);2081 int ret = 0;2082 2083 switch (event) {2084 case SND_SOC_DAPM_PRE_PMU:2085 rx_macro_mclk_enable(rx, true);2086 break;2087 case SND_SOC_DAPM_POST_PMD:2088 rx_macro_mclk_enable(rx, false);2089 break;2090 default:2091 dev_err(component->dev, "%s: invalid DAPM event %d\n", __func__, event);2092 ret = -EINVAL;2093 }2094 return ret;2095}2096 2097static bool rx_macro_adie_lb(struct snd_soc_component *component,2098 int interp_idx)2099{2100 u16 int_mux_cfg0, int_mux_cfg1;2101 u8 int_n_inp0, int_n_inp1, int_n_inp2;2102 2103 int_mux_cfg0 = CDC_RX_INP_MUX_RX_INT0_CFG0 + interp_idx * 8;2104 int_mux_cfg1 = int_mux_cfg0 + 4;2105 2106 int_n_inp0 = snd_soc_component_read_field(component, int_mux_cfg0,2107 CDC_RX_INTX_1_MIX_INP0_SEL_MASK);2108 int_n_inp1 = snd_soc_component_read_field(component, int_mux_cfg0,2109 CDC_RX_INTX_1_MIX_INP1_SEL_MASK);2110 int_n_inp2 = snd_soc_component_read_field(component, int_mux_cfg1,2111 CDC_RX_INTX_1_MIX_INP2_SEL_MASK);2112 2113 if (int_n_inp0 == INTn_1_INP_SEL_DEC0 ||2114 int_n_inp0 == INTn_1_INP_SEL_DEC1 ||2115 int_n_inp0 == INTn_1_INP_SEL_IIR0 ||2116 int_n_inp0 == INTn_1_INP_SEL_IIR1)2117 return true;2118 2119 if (int_n_inp1 == INTn_1_INP_SEL_DEC0 ||2120 int_n_inp1 == INTn_1_INP_SEL_DEC1 ||2121 int_n_inp1 == INTn_1_INP_SEL_IIR0 ||2122 int_n_inp1 == INTn_1_INP_SEL_IIR1)2123 return true;2124 2125 if (int_n_inp2 == INTn_1_INP_SEL_DEC0 ||2126 int_n_inp2 == INTn_1_INP_SEL_DEC1 ||2127 int_n_inp2 == INTn_1_INP_SEL_IIR0 ||2128 int_n_inp2 == INTn_1_INP_SEL_IIR1)2129 return true;2130 2131 return false;2132}2133 2134static int rx_macro_enable_interp_clk(struct snd_soc_component *component,2135 int event, int interp_idx);2136static int rx_macro_enable_main_path(struct snd_soc_dapm_widget *w,2137 struct snd_kcontrol *kcontrol,2138 int event)2139{2140 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);2141 struct rx_macro *rx = snd_soc_component_get_drvdata(component);2142 u16 gain_reg, reg;2143 2144 reg = CDC_RX_RXn_RX_PATH_CTL(rx, w->shift);2145 gain_reg = CDC_RX_RXn_RX_VOL_CTL(rx, w->shift);2146 2147 switch (event) {2148 case SND_SOC_DAPM_PRE_PMU:2149 rx_macro_enable_interp_clk(component, event, w->shift);2150 if (rx_macro_adie_lb(component, w->shift))2151 snd_soc_component_update_bits(component, reg,2152 CDC_RX_PATH_CLK_EN_MASK,2153 CDC_RX_PATH_CLK_ENABLE);2154 break;2155 case SND_SOC_DAPM_POST_PMU:2156 snd_soc_component_write(component, gain_reg,2157 snd_soc_component_read(component, gain_reg));2158 break;2159 case SND_SOC_DAPM_POST_PMD:2160 rx_macro_enable_interp_clk(component, event, w->shift);2161 break;2162 }2163 2164 return 0;2165}2166 2167static int rx_macro_config_compander(struct snd_soc_component *component,2168 struct rx_macro *rx,2169 int comp, int event)2170{2171 u8 pcm_rate, val;2172 2173 /* AUX does not have compander */2174 if (comp == INTERP_AUX)2175 return 0;2176 2177 pcm_rate = snd_soc_component_read(component, CDC_RX_RXn_RX_PATH_CTL(rx, comp)) & 0x0F;2178 if (pcm_rate < 0x06)2179 val = 0x03;2180 else if (pcm_rate < 0x08)2181 val = 0x01;2182 else if (pcm_rate < 0x0B)2183 val = 0x02;2184 else2185 val = 0x00;2186 2187 if (SND_SOC_DAPM_EVENT_ON(event))2188 snd_soc_component_update_bits(component, CDC_RX_RXn_RX_PATH_CFG3(rx, comp),2189 CDC_RX_DC_COEFF_SEL_MASK, val);2190 2191 if (SND_SOC_DAPM_EVENT_OFF(event))2192 snd_soc_component_update_bits(component, CDC_RX_RXn_RX_PATH_CFG3(rx, comp),2193 CDC_RX_DC_COEFF_SEL_MASK, 0x3);2194 if (!rx->comp_enabled[comp])2195 return 0;2196 2197 if (SND_SOC_DAPM_EVENT_ON(event)) {2198 /* Enable Compander Clock */2199 snd_soc_component_write_field(component, CDC_RX_COMPANDERn_CTL0(comp),2200 CDC_RX_COMPANDERn_CLK_EN_MASK, 0x1);2201 snd_soc_component_write_field(component, CDC_RX_COMPANDERn_CTL0(comp),2202 CDC_RX_COMPANDERn_SOFT_RST_MASK, 0x1);2203 snd_soc_component_write_field(component, CDC_RX_COMPANDERn_CTL0(comp),2204 CDC_RX_COMPANDERn_SOFT_RST_MASK, 0x0);2205 snd_soc_component_write_field(component, CDC_RX_RXn_RX_PATH_CFG0(rx, comp),2206 CDC_RX_RXn_COMP_EN_MASK, 0x1);2207 }2208 2209 if (SND_SOC_DAPM_EVENT_OFF(event)) {2210 snd_soc_component_write_field(component, CDC_RX_COMPANDERn_CTL0(comp),2211 CDC_RX_COMPANDERn_HALT_MASK, 0x1);2212 snd_soc_component_write_field(component, CDC_RX_RXn_RX_PATH_CFG0(rx, comp),2213 CDC_RX_RXn_COMP_EN_MASK, 0x0);2214 snd_soc_component_write_field(component, CDC_RX_COMPANDERn_CTL0(comp),2215 CDC_RX_COMPANDERn_CLK_EN_MASK, 0x0);2216 snd_soc_component_write_field(component, CDC_RX_COMPANDERn_CTL0(comp),2217 CDC_RX_COMPANDERn_HALT_MASK, 0x0);2218 }2219 2220 return 0;2221}2222 2223static int rx_macro_load_compander_coeff(struct snd_soc_component *component,2224 struct rx_macro *rx,2225 int comp, int event)2226{2227 u16 comp_coeff_lsb_reg, comp_coeff_msb_reg;2228 int i;2229 int hph_pwr_mode;2230 2231 /* AUX does not have compander */2232 if (comp == INTERP_AUX)2233 return 0;2234 2235 if (!rx->comp_enabled[comp])2236 return 0;2237 2238 if (comp == INTERP_HPHL) {2239 comp_coeff_lsb_reg = CDC_RX_TOP_HPHL_COMP_WR_LSB;2240 comp_coeff_msb_reg = CDC_RX_TOP_HPHL_COMP_WR_MSB;2241 } else if (comp == INTERP_HPHR) {2242 comp_coeff_lsb_reg = CDC_RX_TOP_HPHR_COMP_WR_LSB;2243 comp_coeff_msb_reg = CDC_RX_TOP_HPHR_COMP_WR_MSB;2244 } else {2245 /* compander coefficients are loaded only for hph path */2246 return 0;2247 }2248 2249 hph_pwr_mode = rx->hph_pwr_mode;2250 2251 if (SND_SOC_DAPM_EVENT_ON(event)) {2252 /* Load Compander Coeff */2253 for (i = 0; i < COMP_MAX_COEFF; i++) {2254 snd_soc_component_write(component, comp_coeff_lsb_reg,2255 comp_coeff_table[hph_pwr_mode][i].lsb);2256 snd_soc_component_write(component, comp_coeff_msb_reg,2257 comp_coeff_table[hph_pwr_mode][i].msb);2258 }2259 }2260 2261 return 0;2262}2263 2264static void rx_macro_enable_softclip_clk(struct snd_soc_component *component,2265 struct rx_macro *rx, bool enable)2266{2267 if (enable) {2268 if (rx->softclip_clk_users == 0)2269 snd_soc_component_write_field(component, CDC_RX_SOFTCLIP_CRC,2270 CDC_RX_SOFTCLIP_CLK_EN_MASK, 1);2271 rx->softclip_clk_users++;2272 } else {2273 rx->softclip_clk_users--;2274 if (rx->softclip_clk_users == 0)2275 snd_soc_component_write_field(component, CDC_RX_SOFTCLIP_CRC,2276 CDC_RX_SOFTCLIP_CLK_EN_MASK, 0);2277 }2278}2279 2280static int rx_macro_config_softclip(struct snd_soc_component *component,2281 struct rx_macro *rx, int event)2282{2283 2284 if (!rx->is_softclip_on)2285 return 0;2286 2287 if (SND_SOC_DAPM_EVENT_ON(event)) {2288 /* Enable Softclip clock */2289 rx_macro_enable_softclip_clk(component, rx, true);2290 /* Enable Softclip control */2291 snd_soc_component_write_field(component, CDC_RX_SOFTCLIP_SOFTCLIP_CTRL,2292 CDC_RX_SOFTCLIP_EN_MASK, 0x01);2293 }2294 2295 if (SND_SOC_DAPM_EVENT_OFF(event)) {2296 snd_soc_component_write_field(component, CDC_RX_SOFTCLIP_SOFTCLIP_CTRL,2297 CDC_RX_SOFTCLIP_EN_MASK, 0x0);2298 rx_macro_enable_softclip_clk(component, rx, false);2299 }2300 2301 return 0;2302}2303 2304static int rx_macro_config_aux_hpf(struct snd_soc_component *component,2305 struct rx_macro *rx, int event)2306{2307 if (SND_SOC_DAPM_EVENT_ON(event)) {2308 /* Update Aux HPF control */2309 if (!rx->is_aux_hpf_on)2310 snd_soc_component_update_bits(component,2311 CDC_RX_RXn_RX_PATH_CFG1(rx, 2), 0x04, 0x00);2312 }2313 2314 if (SND_SOC_DAPM_EVENT_OFF(event)) {2315 /* Reset to default (HPF=ON) */2316 snd_soc_component_update_bits(component,2317 CDC_RX_RXn_RX_PATH_CFG1(rx, 2), 0x04, 0x04);2318 }2319 2320 return 0;2321}2322 2323static inline void rx_macro_enable_clsh_block(struct rx_macro *rx, bool enable)2324{2325 if ((enable && ++rx->clsh_users == 1) || (!enable && --rx->clsh_users == 0))2326 snd_soc_component_update_bits(rx->component, CDC_RX_CLSH_CRC,2327 CDC_RX_CLSH_CLK_EN_MASK, enable);2328 if (rx->clsh_users < 0)2329 rx->clsh_users = 0;2330}2331 2332static int rx_macro_config_classh(struct snd_soc_component *component,2333 struct rx_macro *rx,2334 int interp_n, int event)2335{2336 if (SND_SOC_DAPM_EVENT_OFF(event)) {2337 rx_macro_enable_clsh_block(rx, false);2338 return 0;2339 }2340 2341 if (!SND_SOC_DAPM_EVENT_ON(event))2342 return 0;2343 2344 rx_macro_enable_clsh_block(rx, true);2345 if (interp_n == INTERP_HPHL ||2346 interp_n == INTERP_HPHR) {2347 /*2348 * These K1 values depend on the Headphone Impedance2349 * For now it is assumed to be 16 ohm2350 */2351 snd_soc_component_write(component, CDC_RX_CLSH_K1_LSB, 0xc0);2352 snd_soc_component_write_field(component, CDC_RX_CLSH_K1_MSB,2353 CDC_RX_CLSH_K1_MSB_COEFF_MASK, 0);2354 }2355 switch (interp_n) {2356 case INTERP_HPHL:2357 if (rx->is_ear_mode_on)2358 snd_soc_component_update_bits(component,2359 CDC_RX_CLSH_HPH_V_PA,2360 CDC_RX_CLSH_HPH_V_PA_MIN_MASK, 0x39);2361 else2362 snd_soc_component_update_bits(component,2363 CDC_RX_CLSH_HPH_V_PA,2364 CDC_RX_CLSH_HPH_V_PA_MIN_MASK, 0x1c);2365 snd_soc_component_update_bits(component,2366 CDC_RX_CLSH_DECAY_CTRL,2367 CDC_RX_CLSH_DECAY_RATE_MASK, 0x0);2368 snd_soc_component_write_field(component,2369 CDC_RX_RXn_RX_PATH_CFG0(rx, 0),2370 CDC_RX_RXn_CLSH_EN_MASK, 0x1);2371 break;2372 case INTERP_HPHR:2373 if (rx->is_ear_mode_on)2374 snd_soc_component_update_bits(component,2375 CDC_RX_CLSH_HPH_V_PA,2376 CDC_RX_CLSH_HPH_V_PA_MIN_MASK, 0x39);2377 else2378 snd_soc_component_update_bits(component,2379 CDC_RX_CLSH_HPH_V_PA,2380 CDC_RX_CLSH_HPH_V_PA_MIN_MASK, 0x1c);2381 snd_soc_component_update_bits(component,2382 CDC_RX_CLSH_DECAY_CTRL,2383 CDC_RX_CLSH_DECAY_RATE_MASK, 0x0);2384 snd_soc_component_write_field(component,2385 CDC_RX_RXn_RX_PATH_CFG0(rx, 1),2386 CDC_RX_RXn_CLSH_EN_MASK, 0x1);2387 break;2388 case INTERP_AUX:2389 snd_soc_component_update_bits(component,2390 CDC_RX_RXn_RX_PATH_CFG0(rx, 2),2391 CDC_RX_RX2_DLY_Z_EN_MASK, 1);2392 snd_soc_component_write_field(component,2393 CDC_RX_RXn_RX_PATH_CFG0(rx, 2),2394 CDC_RX_RX2_CLSH_EN_MASK, 1);2395 break;2396 }2397 2398 return 0;2399}2400 2401static void rx_macro_hd2_control(struct snd_soc_component *component,2402 u16 interp_idx, int event)2403{2404 struct rx_macro *rx = snd_soc_component_get_drvdata(component);2405 u16 hd2_scale_reg, hd2_enable_reg;2406 2407 switch (interp_idx) {2408 case INTERP_HPHL:2409 hd2_scale_reg = CDC_RX_RXn_RX_PATH_SEC3(rx, 0);2410 hd2_enable_reg = CDC_RX_RXn_RX_PATH_CFG0(rx, 0);2411 break;2412 case INTERP_HPHR:2413 hd2_scale_reg = CDC_RX_RXn_RX_PATH_SEC3(rx, 1);2414 hd2_enable_reg = CDC_RX_RXn_RX_PATH_CFG0(rx, 1);2415 break;2416 }2417 2418 if (hd2_enable_reg && SND_SOC_DAPM_EVENT_ON(event)) {2419 snd_soc_component_update_bits(component, hd2_scale_reg,2420 CDC_RX_RXn_HD2_ALPHA_MASK, 0x14);2421 snd_soc_component_write_field(component, hd2_enable_reg,2422 CDC_RX_RXn_HD2_EN_MASK, 1);2423 }2424 2425 if (hd2_enable_reg && SND_SOC_DAPM_EVENT_OFF(event)) {2426 snd_soc_component_write_field(component, hd2_enable_reg,2427 CDC_RX_RXn_HD2_EN_MASK, 0);2428 snd_soc_component_update_bits(component, hd2_scale_reg,2429 CDC_RX_RXn_HD2_ALPHA_MASK, 0x0);2430 }2431}2432 2433static int rx_macro_get_compander(struct snd_kcontrol *kcontrol,2434 struct snd_ctl_elem_value *ucontrol)2435{2436 struct snd_soc_component *component =2437 snd_soc_kcontrol_component(kcontrol);2438 int comp = ((struct soc_mixer_control *) kcontrol->private_value)->shift;2439 struct rx_macro *rx = snd_soc_component_get_drvdata(component);2440 2441 ucontrol->value.integer.value[0] = rx->comp_enabled[comp];2442 return 0;2443}2444 2445static int rx_macro_set_compander(struct snd_kcontrol *kcontrol,2446 struct snd_ctl_elem_value *ucontrol)2447{2448 struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);2449 int comp = ((struct soc_mixer_control *) kcontrol->private_value)->shift;2450 int value = ucontrol->value.integer.value[0];2451 struct rx_macro *rx = snd_soc_component_get_drvdata(component);2452 2453 rx->comp_enabled[comp] = value;2454 2455 return 0;2456}2457 2458static int rx_macro_mux_get(struct snd_kcontrol *kcontrol,2459 struct snd_ctl_elem_value *ucontrol)2460{2461 struct snd_soc_dapm_widget *widget = snd_soc_dapm_kcontrol_widget(kcontrol);2462 struct snd_soc_component *component = snd_soc_dapm_to_component(widget->dapm);2463 struct rx_macro *rx = snd_soc_component_get_drvdata(component);2464 2465 ucontrol->value.enumerated.item[0] =2466 rx->rx_port_value[widget->shift];2467 return 0;2468}2469 2470static int rx_macro_mux_put(struct snd_kcontrol *kcontrol,2471 struct snd_ctl_elem_value *ucontrol)2472{2473 struct snd_soc_dapm_widget *widget = snd_soc_dapm_kcontrol_widget(kcontrol);2474 struct snd_soc_component *component = snd_soc_dapm_to_component(widget->dapm);2475 struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;2476 struct snd_soc_dapm_update *update = NULL;2477 u32 rx_port_value = ucontrol->value.enumerated.item[0];2478 u32 aif_rst;2479 struct rx_macro *rx = snd_soc_component_get_drvdata(component);2480 2481 aif_rst = rx->rx_port_value[widget->shift];2482 if (!rx_port_value) {2483 if (aif_rst == 0)2484 return 0;2485 if (aif_rst > RX_MACRO_AIF4_PB) {2486 dev_err(component->dev, "%s: Invalid AIF reset\n", __func__);2487 return 0;2488 }2489 }2490 rx->rx_port_value[widget->shift] = rx_port_value;2491 2492 switch (rx_port_value) {2493 case 0:2494 if (rx->active_ch_cnt[aif_rst]) {2495 clear_bit(widget->shift,2496 &rx->active_ch_mask[aif_rst]);2497 rx->active_ch_cnt[aif_rst]--;2498 }2499 break;2500 case 1:2501 case 2:2502 case 3:2503 case 4:2504 set_bit(widget->shift,2505 &rx->active_ch_mask[rx_port_value]);2506 rx->active_ch_cnt[rx_port_value]++;2507 break;2508 default:2509 dev_err(component->dev,2510 "%s:Invalid AIF_ID for RX_MACRO MUX %d\n",2511 __func__, rx_port_value);2512 goto err;2513 }2514 2515 snd_soc_dapm_mux_update_power(widget->dapm, kcontrol,2516 rx_port_value, e, update);2517 return 0;2518err:2519 return -EINVAL;2520}2521 2522static const struct snd_kcontrol_new rx_macro_rx0_mux =2523 SOC_DAPM_ENUM_EXT("rx_macro_rx0", rx_macro_rx0_enum,2524 rx_macro_mux_get, rx_macro_mux_put);2525static const struct snd_kcontrol_new rx_macro_rx1_mux =2526 SOC_DAPM_ENUM_EXT("rx_macro_rx1", rx_macro_rx1_enum,2527 rx_macro_mux_get, rx_macro_mux_put);2528static const struct snd_kcontrol_new rx_macro_rx2_mux =2529 SOC_DAPM_ENUM_EXT("rx_macro_rx2", rx_macro_rx2_enum,2530 rx_macro_mux_get, rx_macro_mux_put);2531static const struct snd_kcontrol_new rx_macro_rx3_mux =2532 SOC_DAPM_ENUM_EXT("rx_macro_rx3", rx_macro_rx3_enum,2533 rx_macro_mux_get, rx_macro_mux_put);2534static const struct snd_kcontrol_new rx_macro_rx4_mux =2535 SOC_DAPM_ENUM_EXT("rx_macro_rx4", rx_macro_rx4_enum,2536 rx_macro_mux_get, rx_macro_mux_put);2537static const struct snd_kcontrol_new rx_macro_rx5_mux =2538 SOC_DAPM_ENUM_EXT("rx_macro_rx5", rx_macro_rx5_enum,2539 rx_macro_mux_get, rx_macro_mux_put);2540 2541static int rx_macro_get_ear_mode(struct snd_kcontrol *kcontrol,2542 struct snd_ctl_elem_value *ucontrol)2543{2544 struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);2545 struct rx_macro *rx = snd_soc_component_get_drvdata(component);2546 2547 ucontrol->value.integer.value[0] = rx->is_ear_mode_on;2548 return 0;2549}2550 2551static int rx_macro_put_ear_mode(struct snd_kcontrol *kcontrol,2552 struct snd_ctl_elem_value *ucontrol)2553{2554 struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);2555 struct rx_macro *rx = snd_soc_component_get_drvdata(component);2556 2557 rx->is_ear_mode_on = (!ucontrol->value.integer.value[0] ? false : true);2558 return 0;2559}2560 2561static int rx_macro_get_hph_hd2_mode(struct snd_kcontrol *kcontrol,2562 struct snd_ctl_elem_value *ucontrol)2563{2564 struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);2565 struct rx_macro *rx = snd_soc_component_get_drvdata(component);2566 2567 ucontrol->value.integer.value[0] = rx->hph_hd2_mode;2568 return 0;2569}2570 2571static int rx_macro_put_hph_hd2_mode(struct snd_kcontrol *kcontrol,2572 struct snd_ctl_elem_value *ucontrol)2573{2574 struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);2575 struct rx_macro *rx = snd_soc_component_get_drvdata(component);2576 2577 rx->hph_hd2_mode = ucontrol->value.integer.value[0];2578 return 0;2579}2580 2581static int rx_macro_get_hph_pwr_mode(struct snd_kcontrol *kcontrol,2582 struct snd_ctl_elem_value *ucontrol)2583{2584 struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);2585 struct rx_macro *rx = snd_soc_component_get_drvdata(component);2586 2587 ucontrol->value.enumerated.item[0] = rx->hph_pwr_mode;2588 return 0;2589}2590 2591static int rx_macro_put_hph_pwr_mode(struct snd_kcontrol *kcontrol,2592 struct snd_ctl_elem_value *ucontrol)2593{2594 struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);2595 struct rx_macro *rx = snd_soc_component_get_drvdata(component);2596 2597 rx->hph_pwr_mode = ucontrol->value.enumerated.item[0];2598 return 0;2599}2600 2601static int rx_macro_soft_clip_enable_get(struct snd_kcontrol *kcontrol,2602 struct snd_ctl_elem_value *ucontrol)2603{2604 struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);2605 struct rx_macro *rx = snd_soc_component_get_drvdata(component);2606 2607 ucontrol->value.integer.value[0] = rx->is_softclip_on;2608 2609 return 0;2610}2611 2612static int rx_macro_soft_clip_enable_put(struct snd_kcontrol *kcontrol,2613 struct snd_ctl_elem_value *ucontrol)2614{2615 struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);2616 struct rx_macro *rx = snd_soc_component_get_drvdata(component);2617 2618 rx->is_softclip_on = ucontrol->value.integer.value[0];2619 2620 return 0;2621}2622 2623static int rx_macro_aux_hpf_mode_get(struct snd_kcontrol *kcontrol,2624 struct snd_ctl_elem_value *ucontrol)2625{2626 struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);2627 struct rx_macro *rx = snd_soc_component_get_drvdata(component);2628 2629 ucontrol->value.integer.value[0] = rx->is_aux_hpf_on;2630 2631 return 0;2632}2633 2634static int rx_macro_aux_hpf_mode_put(struct snd_kcontrol *kcontrol,2635 struct snd_ctl_elem_value *ucontrol)2636{2637 struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);2638 struct rx_macro *rx = snd_soc_component_get_drvdata(component);2639 2640 rx->is_aux_hpf_on = ucontrol->value.integer.value[0];2641 2642 return 0;2643}2644 2645static int rx_macro_hphdelay_lutbypass(struct snd_soc_component *component,2646 struct rx_macro *rx,2647 u16 interp_idx, int event)2648{2649 u16 hph_lut_bypass_reg;2650 u16 hph_comp_ctrl7;2651 2652 switch (interp_idx) {2653 case INTERP_HPHL:2654 hph_lut_bypass_reg = CDC_RX_TOP_HPHL_COMP_LUT;2655 hph_comp_ctrl7 = CDC_RX_COMPANDER0_CTL7;2656 break;2657 case INTERP_HPHR:2658 hph_lut_bypass_reg = CDC_RX_TOP_HPHR_COMP_LUT;2659 hph_comp_ctrl7 = CDC_RX_COMPANDER1_CTL7;2660 break;2661 default:2662 return -EINVAL;2663 }2664 2665 if (hph_lut_bypass_reg && SND_SOC_DAPM_EVENT_ON(event)) {2666 if (interp_idx == INTERP_HPHL) {2667 if (rx->is_ear_mode_on)2668 snd_soc_component_write_field(component,2669 CDC_RX_RXn_RX_PATH_CFG1(rx, 0),2670 CDC_RX_RX0_HPH_L_EAR_SEL_MASK, 0x1);2671 else2672 snd_soc_component_write_field(component,2673 hph_lut_bypass_reg,2674 CDC_RX_TOP_HPH_LUT_BYPASS_MASK, 1);2675 } else {2676 snd_soc_component_write_field(component, hph_lut_bypass_reg,2677 CDC_RX_TOP_HPH_LUT_BYPASS_MASK, 1);2678 }2679 if (rx->hph_pwr_mode)2680 snd_soc_component_write_field(component, hph_comp_ctrl7,2681 CDC_RX_COMPANDER1_HPH_LOW_PWR_MODE_MASK, 0x0);2682 }2683 2684 if (hph_lut_bypass_reg && SND_SOC_DAPM_EVENT_OFF(event)) {2685 snd_soc_component_write_field(component,2686 CDC_RX_RXn_RX_PATH_CFG1(rx, 0),2687 CDC_RX_RX0_HPH_L_EAR_SEL_MASK, 0x0);2688 snd_soc_component_update_bits(component, hph_lut_bypass_reg,2689 CDC_RX_TOP_HPH_LUT_BYPASS_MASK, 0);2690 snd_soc_component_write_field(component, hph_comp_ctrl7,2691 CDC_RX_COMPANDER1_HPH_LOW_PWR_MODE_MASK, 0x1);2692 }2693 2694 return 0;2695}2696 2697static int rx_macro_enable_interp_clk(struct snd_soc_component *component,2698 int event, int interp_idx)2699{2700 u16 main_reg, dsm_reg, rx_cfg2_reg;2701 struct rx_macro *rx = snd_soc_component_get_drvdata(component);2702 2703 main_reg = CDC_RX_RXn_RX_PATH_CTL(rx, interp_idx);2704 dsm_reg = CDC_RX_RXn_RX_PATH_DSM_CTL(rx, interp_idx);2705 rx_cfg2_reg = CDC_RX_RXn_RX_PATH_CFG2(rx, interp_idx);2706 2707 if (SND_SOC_DAPM_EVENT_ON(event)) {2708 if (rx->main_clk_users[interp_idx] == 0) {2709 /* Main path PGA mute enable */2710 snd_soc_component_write_field(component, main_reg,2711 CDC_RX_PATH_PGA_MUTE_MASK, 0x1);2712 snd_soc_component_write_field(component, dsm_reg,2713 CDC_RX_RXn_DSM_CLK_EN_MASK, 0x1);2714 snd_soc_component_update_bits(component, rx_cfg2_reg,2715 CDC_RX_RXn_HPF_CUT_FREQ_MASK, 0x03);2716 rx_macro_load_compander_coeff(component, rx, interp_idx, event);2717 if (rx->hph_hd2_mode)2718 rx_macro_hd2_control(component, interp_idx, event);2719 rx_macro_hphdelay_lutbypass(component, rx, interp_idx, event);2720 rx_macro_config_compander(component, rx, interp_idx, event);2721 if (interp_idx == INTERP_AUX) {2722 rx_macro_config_softclip(component, rx, event);2723 rx_macro_config_aux_hpf(component, rx, event);2724 }2725 rx_macro_config_classh(component, rx, interp_idx, event);2726 }2727 rx->main_clk_users[interp_idx]++;2728 }2729 2730 if (SND_SOC_DAPM_EVENT_OFF(event)) {2731 rx->main_clk_users[interp_idx]--;2732 if (rx->main_clk_users[interp_idx] <= 0) {2733 rx->main_clk_users[interp_idx] = 0;2734 /* Main path PGA mute enable */2735 snd_soc_component_write_field(component, main_reg,2736 CDC_RX_PATH_PGA_MUTE_MASK, 0x1);2737 /* Clk Disable */2738 snd_soc_component_write_field(component, dsm_reg,2739 CDC_RX_RXn_DSM_CLK_EN_MASK, 0);2740 snd_soc_component_write_field(component, main_reg,2741 CDC_RX_PATH_CLK_EN_MASK, 0);2742 /* Reset enable and disable */2743 snd_soc_component_write_field(component, main_reg,2744 CDC_RX_PATH_RESET_EN_MASK, 1);2745 snd_soc_component_write_field(component, main_reg,2746 CDC_RX_PATH_RESET_EN_MASK, 0);2747 /* Reset rate to 48K*/2748 snd_soc_component_update_bits(component, main_reg,2749 CDC_RX_PATH_PCM_RATE_MASK,2750 0x04);2751 snd_soc_component_update_bits(component, rx_cfg2_reg,2752 CDC_RX_RXn_HPF_CUT_FREQ_MASK, 0x00);2753 rx_macro_config_classh(component, rx, interp_idx, event);2754 rx_macro_config_compander(component, rx, interp_idx, event);2755 if (interp_idx == INTERP_AUX) {2756 rx_macro_config_softclip(component, rx, event);2757 rx_macro_config_aux_hpf(component, rx, event);2758 }2759 rx_macro_hphdelay_lutbypass(component, rx, interp_idx, event);2760 if (rx->hph_hd2_mode)2761 rx_macro_hd2_control(component, interp_idx, event);2762 }2763 }2764 2765 return rx->main_clk_users[interp_idx];2766}2767 2768static int rx_macro_enable_mix_path(struct snd_soc_dapm_widget *w,2769 struct snd_kcontrol *kcontrol, int event)2770{2771 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);2772 struct rx_macro *rx = snd_soc_component_get_drvdata(component);2773 u16 gain_reg, mix_reg;2774 2775 gain_reg = CDC_RX_RXn_RX_VOL_MIX_CTL(rx, w->shift);2776 mix_reg = CDC_RX_RXn_RX_PATH_MIX_CTL(rx, w->shift);2777 2778 switch (event) {2779 case SND_SOC_DAPM_PRE_PMU:2780 rx_macro_enable_interp_clk(component, event, w->shift);2781 break;2782 case SND_SOC_DAPM_POST_PMU:2783 snd_soc_component_write(component, gain_reg,2784 snd_soc_component_read(component, gain_reg));2785 break;2786 case SND_SOC_DAPM_POST_PMD:2787 /* Clk Disable */2788 snd_soc_component_update_bits(component, mix_reg,2789 CDC_RX_RXn_MIX_CLK_EN_MASK, 0x00);2790 rx_macro_enable_interp_clk(component, event, w->shift);2791 /* Reset enable and disable */2792 snd_soc_component_update_bits(component, mix_reg,2793 CDC_RX_RXn_MIX_RESET_MASK,2794 CDC_RX_RXn_MIX_RESET);2795 snd_soc_component_update_bits(component, mix_reg,2796 CDC_RX_RXn_MIX_RESET_MASK, 0x00);2797 break;2798 }2799 2800 return 0;2801}2802 2803static int rx_macro_enable_rx_path_clk(struct snd_soc_dapm_widget *w,2804 struct snd_kcontrol *kcontrol, int event)2805{2806 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);2807 struct rx_macro *rx = snd_soc_component_get_drvdata(component);2808 2809 switch (event) {2810 case SND_SOC_DAPM_PRE_PMU:2811 rx_macro_enable_interp_clk(component, event, w->shift);2812 snd_soc_component_write_field(component, CDC_RX_RXn_RX_PATH_CFG1(rx, w->shift),2813 CDC_RX_RXn_SIDETONE_EN_MASK, 1);2814 snd_soc_component_write_field(component, CDC_RX_RXn_RX_PATH_CTL(rx, w->shift),2815 CDC_RX_PATH_CLK_EN_MASK, 1);2816 break;2817 case SND_SOC_DAPM_POST_PMD:2818 snd_soc_component_write_field(component, CDC_RX_RXn_RX_PATH_CFG1(rx, w->shift),2819 CDC_RX_RXn_SIDETONE_EN_MASK, 0);2820 rx_macro_enable_interp_clk(component, event, w->shift);2821 break;2822 default:2823 break;2824 }2825 return 0;2826}2827 2828static int rx_macro_set_iir_gain(struct snd_soc_dapm_widget *w,2829 struct snd_kcontrol *kcontrol, int event)2830{2831 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);2832 2833 switch (event) {2834 case SND_SOC_DAPM_POST_PMU: /* fall through */2835 case SND_SOC_DAPM_PRE_PMD:2836 if (strnstr(w->name, "IIR0", sizeof("IIR0"))) {2837 snd_soc_component_write(component,2838 CDC_RX_SIDETONE_IIR0_IIR_GAIN_B1_CTL,2839 snd_soc_component_read(component,2840 CDC_RX_SIDETONE_IIR0_IIR_GAIN_B1_CTL));2841 snd_soc_component_write(component,2842 CDC_RX_SIDETONE_IIR0_IIR_GAIN_B2_CTL,2843 snd_soc_component_read(component,2844 CDC_RX_SIDETONE_IIR0_IIR_GAIN_B2_CTL));2845 snd_soc_component_write(component,2846 CDC_RX_SIDETONE_IIR0_IIR_GAIN_B3_CTL,2847 snd_soc_component_read(component,2848 CDC_RX_SIDETONE_IIR0_IIR_GAIN_B3_CTL));2849 snd_soc_component_write(component,2850 CDC_RX_SIDETONE_IIR0_IIR_GAIN_B4_CTL,2851 snd_soc_component_read(component,2852 CDC_RX_SIDETONE_IIR0_IIR_GAIN_B4_CTL));2853 } else {2854 snd_soc_component_write(component,2855 CDC_RX_SIDETONE_IIR1_IIR_GAIN_B1_CTL,2856 snd_soc_component_read(component,2857 CDC_RX_SIDETONE_IIR1_IIR_GAIN_B1_CTL));2858 snd_soc_component_write(component,2859 CDC_RX_SIDETONE_IIR1_IIR_GAIN_B2_CTL,2860 snd_soc_component_read(component,2861 CDC_RX_SIDETONE_IIR1_IIR_GAIN_B2_CTL));2862 snd_soc_component_write(component,2863 CDC_RX_SIDETONE_IIR1_IIR_GAIN_B3_CTL,2864 snd_soc_component_read(component,2865 CDC_RX_SIDETONE_IIR1_IIR_GAIN_B3_CTL));2866 snd_soc_component_write(component,2867 CDC_RX_SIDETONE_IIR1_IIR_GAIN_B4_CTL,2868 snd_soc_component_read(component,2869 CDC_RX_SIDETONE_IIR1_IIR_GAIN_B4_CTL));2870 }2871 break;2872 }2873 return 0;2874}2875 2876static uint32_t get_iir_band_coeff(struct snd_soc_component *component,2877 int iir_idx, int band_idx, int coeff_idx)2878{2879 u32 value;2880 int reg, b2_reg;2881 2882 /* Address does not automatically update if reading */2883 reg = CDC_RX_SIDETONE_IIR0_IIR_COEF_B1_CTL + 0x80 * iir_idx;2884 b2_reg = CDC_RX_SIDETONE_IIR0_IIR_COEF_B2_CTL + 0x80 * iir_idx;2885 2886 snd_soc_component_write(component, reg,2887 ((band_idx * BAND_MAX + coeff_idx) *2888 sizeof(uint32_t)) & 0x7F);2889 2890 value = snd_soc_component_read(component, b2_reg);2891 snd_soc_component_write(component, reg,2892 ((band_idx * BAND_MAX + coeff_idx)2893 * sizeof(uint32_t) + 1) & 0x7F);2894 2895 value |= (snd_soc_component_read(component, b2_reg) << 8);2896 snd_soc_component_write(component, reg,2897 ((band_idx * BAND_MAX + coeff_idx)2898 * sizeof(uint32_t) + 2) & 0x7F);2899 2900 value |= (snd_soc_component_read(component, b2_reg) << 16);2901 snd_soc_component_write(component, reg,2902 ((band_idx * BAND_MAX + coeff_idx)2903 * sizeof(uint32_t) + 3) & 0x7F);2904 2905 /* Mask bits top 2 bits since they are reserved */2906 value |= (snd_soc_component_read(component, b2_reg) << 24);2907 return value;2908}2909 2910static void set_iir_band_coeff(struct snd_soc_component *component,2911 int iir_idx, int band_idx, uint32_t value)2912{2913 int reg = CDC_RX_SIDETONE_IIR0_IIR_COEF_B2_CTL + 0x80 * iir_idx;2914 2915 snd_soc_component_write(component, reg, (value & 0xFF));2916 snd_soc_component_write(component, reg, (value >> 8) & 0xFF);2917 snd_soc_component_write(component, reg, (value >> 16) & 0xFF);2918 /* Mask top 2 bits, 7-8 are reserved */2919 snd_soc_component_write(component, reg, (value >> 24) & 0x3F);2920}2921 2922static int rx_macro_put_iir_band_audio_mixer(2923 struct snd_kcontrol *kcontrol,2924 struct snd_ctl_elem_value *ucontrol)2925{2926 struct snd_soc_component *component =2927 snd_soc_kcontrol_component(kcontrol);2928 struct wcd_iir_filter_ctl *ctl =2929 (struct wcd_iir_filter_ctl *)kcontrol->private_value;2930 struct soc_bytes_ext *params = &ctl->bytes_ext;2931 int iir_idx = ctl->iir_idx;2932 int band_idx = ctl->band_idx;2933 u32 coeff[BAND_MAX];2934 int reg = CDC_RX_SIDETONE_IIR0_IIR_COEF_B1_CTL + 0x80 * iir_idx;2935 2936 memcpy(&coeff[0], ucontrol->value.bytes.data, params->max);2937 2938 /* Mask top bit it is reserved */2939 /* Updates addr automatically for each B2 write */2940 snd_soc_component_write(component, reg, (band_idx * BAND_MAX *2941 sizeof(uint32_t)) & 0x7F);2942 2943 set_iir_band_coeff(component, iir_idx, band_idx, coeff[0]);2944 set_iir_band_coeff(component, iir_idx, band_idx, coeff[1]);2945 set_iir_band_coeff(component, iir_idx, band_idx, coeff[2]);2946 set_iir_band_coeff(component, iir_idx, band_idx, coeff[3]);2947 set_iir_band_coeff(component, iir_idx, band_idx, coeff[4]);2948 2949 return 0;2950}2951 2952static int rx_macro_get_iir_band_audio_mixer(struct snd_kcontrol *kcontrol,2953 struct snd_ctl_elem_value *ucontrol)2954{2955 struct snd_soc_component *component =2956 snd_soc_kcontrol_component(kcontrol);2957 struct wcd_iir_filter_ctl *ctl =2958 (struct wcd_iir_filter_ctl *)kcontrol->private_value;2959 struct soc_bytes_ext *params = &ctl->bytes_ext;2960 int iir_idx = ctl->iir_idx;2961 int band_idx = ctl->band_idx;2962 u32 coeff[BAND_MAX];2963 2964 coeff[0] = get_iir_band_coeff(component, iir_idx, band_idx, 0);2965 coeff[1] = get_iir_band_coeff(component, iir_idx, band_idx, 1);2966 coeff[2] = get_iir_band_coeff(component, iir_idx, band_idx, 2);2967 coeff[3] = get_iir_band_coeff(component, iir_idx, band_idx, 3);2968 coeff[4] = get_iir_band_coeff(component, iir_idx, band_idx, 4);2969 2970 memcpy(ucontrol->value.bytes.data, &coeff[0], params->max);2971 2972 return 0;2973}2974 2975static int rx_macro_iir_filter_info(struct snd_kcontrol *kcontrol,2976 struct snd_ctl_elem_info *ucontrol)2977{2978 struct wcd_iir_filter_ctl *ctl =2979 (struct wcd_iir_filter_ctl *)kcontrol->private_value;2980 struct soc_bytes_ext *params = &ctl->bytes_ext;2981 2982 ucontrol->type = SNDRV_CTL_ELEM_TYPE_BYTES;2983 ucontrol->count = params->max;2984 2985 return 0;2986}2987 2988static const struct snd_kcontrol_new rx_macro_def_snd_controls[] = {2989 SOC_SINGLE_S8_TLV("RX_RX1 Digital Volume", CDC_RX_RX1_RX_VOL_CTL,2990 -84, 40, digital_gain),2991 SOC_SINGLE_S8_TLV("RX_RX2 Digital Volume", CDC_RX_RX2_RX_VOL_CTL,2992 -84, 40, digital_gain),2993 SOC_SINGLE_S8_TLV("RX_RX1 Mix Digital Volume", CDC_RX_RX1_RX_VOL_MIX_CTL,2994 -84, 40, digital_gain),2995 SOC_SINGLE_S8_TLV("RX_RX2 Mix Digital Volume", CDC_RX_RX2_RX_VOL_MIX_CTL,2996 -84, 40, digital_gain),2997};2998 2999static const struct snd_kcontrol_new rx_macro_2_5_snd_controls[] = {3000 3001 SOC_SINGLE_S8_TLV("RX_RX1 Digital Volume", CDC_2_5_RX_RX1_RX_VOL_CTL,3002 -84, 40, digital_gain),3003 SOC_SINGLE_S8_TLV("RX_RX2 Digital Volume", CDC_2_5_RX_RX2_RX_VOL_CTL,3004 -84, 40, digital_gain),3005 SOC_SINGLE_S8_TLV("RX_RX1 Mix Digital Volume", CDC_2_5_RX_RX1_RX_VOL_MIX_CTL,3006 -84, 40, digital_gain),3007 SOC_SINGLE_S8_TLV("RX_RX2 Mix Digital Volume", CDC_2_5_RX_RX2_RX_VOL_MIX_CTL,3008 -84, 40, digital_gain),3009};3010 3011static const struct snd_kcontrol_new rx_macro_snd_controls[] = {3012 SOC_SINGLE_S8_TLV("RX_RX0 Digital Volume", CDC_RX_RX0_RX_VOL_CTL,3013 -84, 40, digital_gain),3014 SOC_SINGLE_S8_TLV("RX_RX0 Mix Digital Volume", CDC_RX_RX0_RX_VOL_MIX_CTL,3015 -84, 40, digital_gain),3016 SOC_SINGLE_EXT("RX_COMP1 Switch", SND_SOC_NOPM, RX_MACRO_COMP1, 1, 0,3017 rx_macro_get_compander, rx_macro_set_compander),3018 SOC_SINGLE_EXT("RX_COMP2 Switch", SND_SOC_NOPM, RX_MACRO_COMP2, 1, 0,3019 rx_macro_get_compander, rx_macro_set_compander),3020 3021 SOC_SINGLE_EXT("RX_EAR Mode Switch", SND_SOC_NOPM, 0, 1, 0,3022 rx_macro_get_ear_mode, rx_macro_put_ear_mode),3023 3024 SOC_SINGLE_EXT("RX_HPH HD2 Mode Switch", SND_SOC_NOPM, 0, 1, 0,3025 rx_macro_get_hph_hd2_mode, rx_macro_put_hph_hd2_mode),3026 3027 SOC_ENUM_EXT("RX_HPH PWR Mode", rx_macro_hph_pwr_mode_enum,3028 rx_macro_get_hph_pwr_mode, rx_macro_put_hph_pwr_mode),3029 3030 SOC_SINGLE_EXT("RX_Softclip Switch", SND_SOC_NOPM, 0, 1, 0,3031 rx_macro_soft_clip_enable_get,3032 rx_macro_soft_clip_enable_put),3033 SOC_SINGLE_EXT("AUX_HPF Switch", SND_SOC_NOPM, 0, 1, 0,3034 rx_macro_aux_hpf_mode_get,3035 rx_macro_aux_hpf_mode_put),3036 3037 SOC_SINGLE_S8_TLV("IIR0 INP0 Volume",3038 CDC_RX_SIDETONE_IIR0_IIR_GAIN_B1_CTL, -84, 40,3039 digital_gain),3040 SOC_SINGLE_S8_TLV("IIR0 INP1 Volume",3041 CDC_RX_SIDETONE_IIR0_IIR_GAIN_B2_CTL, -84, 40,3042 digital_gain),3043 SOC_SINGLE_S8_TLV("IIR0 INP2 Volume",3044 CDC_RX_SIDETONE_IIR0_IIR_GAIN_B3_CTL, -84, 40,3045 digital_gain),3046 SOC_SINGLE_S8_TLV("IIR0 INP3 Volume",3047 CDC_RX_SIDETONE_IIR0_IIR_GAIN_B4_CTL, -84, 40,3048 digital_gain),3049 SOC_SINGLE_S8_TLV("IIR1 INP0 Volume",3050 CDC_RX_SIDETONE_IIR1_IIR_GAIN_B1_CTL, -84, 40,3051 digital_gain),3052 SOC_SINGLE_S8_TLV("IIR1 INP1 Volume",3053 CDC_RX_SIDETONE_IIR1_IIR_GAIN_B2_CTL, -84, 40,3054 digital_gain),3055 SOC_SINGLE_S8_TLV("IIR1 INP2 Volume",3056 CDC_RX_SIDETONE_IIR1_IIR_GAIN_B3_CTL, -84, 40,3057 digital_gain),3058 SOC_SINGLE_S8_TLV("IIR1 INP3 Volume",3059 CDC_RX_SIDETONE_IIR1_IIR_GAIN_B4_CTL, -84, 40,3060 digital_gain),3061 3062 SOC_SINGLE("IIR1 Band1 Switch", CDC_RX_SIDETONE_IIR0_IIR_CTL,3063 0, 1, 0),3064 SOC_SINGLE("IIR1 Band2 Switch", CDC_RX_SIDETONE_IIR0_IIR_CTL,3065 1, 1, 0),3066 SOC_SINGLE("IIR1 Band3 Switch", CDC_RX_SIDETONE_IIR0_IIR_CTL,3067 2, 1, 0),3068 SOC_SINGLE("IIR1 Band4 Switch", CDC_RX_SIDETONE_IIR0_IIR_CTL,3069 3, 1, 0),3070 SOC_SINGLE("IIR1 Band5 Switch", CDC_RX_SIDETONE_IIR0_IIR_CTL,3071 4, 1, 0),3072 SOC_SINGLE("IIR2 Band1 Switch", CDC_RX_SIDETONE_IIR1_IIR_CTL,3073 0, 1, 0),3074 SOC_SINGLE("IIR2 Band2 Switch", CDC_RX_SIDETONE_IIR1_IIR_CTL,3075 1, 1, 0),3076 SOC_SINGLE("IIR2 Band3 Switch", CDC_RX_SIDETONE_IIR1_IIR_CTL,3077 2, 1, 0),3078 SOC_SINGLE("IIR2 Band4 Switch", CDC_RX_SIDETONE_IIR1_IIR_CTL,3079 3, 1, 0),3080 SOC_SINGLE("IIR2 Band5 Switch", CDC_RX_SIDETONE_IIR1_IIR_CTL,3081 4, 1, 0),3082 3083 RX_MACRO_IIR_FILTER_CTL("IIR0 Band1", IIR0, BAND1),3084 RX_MACRO_IIR_FILTER_CTL("IIR0 Band2", IIR0, BAND2),3085 RX_MACRO_IIR_FILTER_CTL("IIR0 Band3", IIR0, BAND3),3086 RX_MACRO_IIR_FILTER_CTL("IIR0 Band4", IIR0, BAND4),3087 RX_MACRO_IIR_FILTER_CTL("IIR0 Band5", IIR0, BAND5),3088 3089 RX_MACRO_IIR_FILTER_CTL("IIR1 Band1", IIR1, BAND1),3090 RX_MACRO_IIR_FILTER_CTL("IIR1 Band2", IIR1, BAND2),3091 RX_MACRO_IIR_FILTER_CTL("IIR1 Band3", IIR1, BAND3),3092 RX_MACRO_IIR_FILTER_CTL("IIR1 Band4", IIR1, BAND4),3093 RX_MACRO_IIR_FILTER_CTL("IIR1 Band5", IIR1, BAND5),3094 3095};3096 3097static int rx_macro_enable_echo(struct snd_soc_dapm_widget *w,3098 struct snd_kcontrol *kcontrol,3099 int event)3100{3101 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);3102 u16 val, ec_hq_reg;3103 int ec_tx = -1;3104 3105 val = snd_soc_component_read(component,3106 CDC_RX_INP_MUX_RX_MIX_CFG4);3107 if (!(snd_soc_dapm_widget_name_cmp(w, "RX MIX TX0 MUX")))3108 ec_tx = ((val & 0xf0) >> 0x4) - 1;3109 else if (!(snd_soc_dapm_widget_name_cmp(w, "RX MIX TX1 MUX")))3110 ec_tx = (val & 0x0f) - 1;3111 3112 val = snd_soc_component_read(component,3113 CDC_RX_INP_MUX_RX_MIX_CFG5);3114 if (!(snd_soc_dapm_widget_name_cmp(w, "RX MIX TX2 MUX")))3115 ec_tx = (val & 0x0f) - 1;3116 3117 if (ec_tx < 0 || (ec_tx >= RX_MACRO_EC_MUX_MAX)) {3118 dev_err(component->dev, "%s: EC mix control not set correctly\n",3119 __func__);3120 return -EINVAL;3121 }3122 ec_hq_reg = CDC_RX_EC_REF_HQ0_EC_REF_HQ_PATH_CTL +3123 0x40 * ec_tx;3124 snd_soc_component_update_bits(component, ec_hq_reg, 0x01, 0x01);3125 ec_hq_reg = CDC_RX_EC_REF_HQ0_EC_REF_HQ_CFG0 +3126 0x40 * ec_tx;3127 /* default set to 48k */3128 snd_soc_component_update_bits(component, ec_hq_reg, 0x1E, 0x08);3129 3130 return 0;3131}3132 3133static const struct snd_soc_dapm_widget rx_macro_2_5_dapm_widgets[] = {3134 SND_SOC_DAPM_MUX("RX INT1 DEM MUX", SND_SOC_NOPM, 0, 0,3135 &rx_2_5_int1_dem_inp_mux),3136};3137 3138static const struct snd_soc_dapm_widget rx_macro_def_dapm_widgets[] = {3139 SND_SOC_DAPM_MUX("RX INT1 DEM MUX", SND_SOC_NOPM, 0, 0,3140 &rx_int1_dem_inp_mux),3141};3142 3143static const struct snd_soc_dapm_widget rx_macro_dapm_widgets[] = {3144 SND_SOC_DAPM_AIF_IN("RX AIF1 PB", "RX_MACRO_AIF1 Playback", 0,3145 SND_SOC_NOPM, 0, 0),3146 3147 SND_SOC_DAPM_AIF_IN("RX AIF2 PB", "RX_MACRO_AIF2 Playback", 0,3148 SND_SOC_NOPM, 0, 0),3149 3150 SND_SOC_DAPM_AIF_IN("RX AIF3 PB", "RX_MACRO_AIF3 Playback", 0,3151 SND_SOC_NOPM, 0, 0),3152 3153 SND_SOC_DAPM_AIF_IN("RX AIF4 PB", "RX_MACRO_AIF4 Playback", 0,3154 SND_SOC_NOPM, 0, 0),3155 3156 SND_SOC_DAPM_AIF_OUT("RX AIF_ECHO", "RX_AIF_ECHO Capture", 0,3157 SND_SOC_NOPM, 0, 0),3158 3159 SND_SOC_DAPM_MUX("RX_MACRO RX0 MUX", SND_SOC_NOPM, RX_MACRO_RX0, 0,3160 &rx_macro_rx0_mux),3161 SND_SOC_DAPM_MUX("RX_MACRO RX1 MUX", SND_SOC_NOPM, RX_MACRO_RX1, 0,3162 &rx_macro_rx1_mux),3163 SND_SOC_DAPM_MUX("RX_MACRO RX2 MUX", SND_SOC_NOPM, RX_MACRO_RX2, 0,3164 &rx_macro_rx2_mux),3165 SND_SOC_DAPM_MUX("RX_MACRO RX3 MUX", SND_SOC_NOPM, RX_MACRO_RX3, 0,3166 &rx_macro_rx3_mux),3167 SND_SOC_DAPM_MUX("RX_MACRO RX4 MUX", SND_SOC_NOPM, RX_MACRO_RX4, 0,3168 &rx_macro_rx4_mux),3169 SND_SOC_DAPM_MUX("RX_MACRO RX5 MUX", SND_SOC_NOPM, RX_MACRO_RX5, 0,3170 &rx_macro_rx5_mux),3171 3172 SND_SOC_DAPM_MIXER("RX_RX0", SND_SOC_NOPM, 0, 0, NULL, 0),3173 SND_SOC_DAPM_MIXER("RX_RX1", SND_SOC_NOPM, 0, 0, NULL, 0),3174 SND_SOC_DAPM_MIXER("RX_RX2", SND_SOC_NOPM, 0, 0, NULL, 0),3175 SND_SOC_DAPM_MIXER("RX_RX3", SND_SOC_NOPM, 0, 0, NULL, 0),3176 SND_SOC_DAPM_MIXER("RX_RX4", SND_SOC_NOPM, 0, 0, NULL, 0),3177 SND_SOC_DAPM_MIXER("RX_RX5", SND_SOC_NOPM, 0, 0, NULL, 0),3178 3179 SND_SOC_DAPM_MUX("IIR0 INP0 MUX", SND_SOC_NOPM, 0, 0, &iir0_inp0_mux),3180 SND_SOC_DAPM_MUX("IIR0 INP1 MUX", SND_SOC_NOPM, 0, 0, &iir0_inp1_mux),3181 SND_SOC_DAPM_MUX("IIR0 INP2 MUX", SND_SOC_NOPM, 0, 0, &iir0_inp2_mux),3182 SND_SOC_DAPM_MUX("IIR0 INP3 MUX", SND_SOC_NOPM, 0, 0, &iir0_inp3_mux),3183 SND_SOC_DAPM_MUX("IIR1 INP0 MUX", SND_SOC_NOPM, 0, 0, &iir1_inp0_mux),3184 SND_SOC_DAPM_MUX("IIR1 INP1 MUX", SND_SOC_NOPM, 0, 0, &iir1_inp1_mux),3185 SND_SOC_DAPM_MUX("IIR1 INP2 MUX", SND_SOC_NOPM, 0, 0, &iir1_inp2_mux),3186 SND_SOC_DAPM_MUX("IIR1 INP3 MUX", SND_SOC_NOPM, 0, 0, &iir1_inp3_mux),3187 3188 SND_SOC_DAPM_MUX_E("RX MIX TX0 MUX", SND_SOC_NOPM,3189 RX_MACRO_EC0_MUX, 0,3190 &rx_mix_tx0_mux, rx_macro_enable_echo,3191 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),3192 SND_SOC_DAPM_MUX_E("RX MIX TX1 MUX", SND_SOC_NOPM,3193 RX_MACRO_EC1_MUX, 0,3194 &rx_mix_tx1_mux, rx_macro_enable_echo,3195 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),3196 SND_SOC_DAPM_MUX_E("RX MIX TX2 MUX", SND_SOC_NOPM,3197 RX_MACRO_EC2_MUX, 0,3198 &rx_mix_tx2_mux, rx_macro_enable_echo,3199 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),3200 3201 SND_SOC_DAPM_MIXER_E("IIR0", CDC_RX_SIDETONE_IIR0_IIR_PATH_CTL,3202 4, 0, NULL, 0, rx_macro_set_iir_gain,3203 SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD),3204 SND_SOC_DAPM_MIXER_E("IIR1", CDC_RX_SIDETONE_IIR1_IIR_PATH_CTL,3205 4, 0, NULL, 0, rx_macro_set_iir_gain,3206 SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD),3207 SND_SOC_DAPM_MIXER("SRC0", CDC_RX_SIDETONE_SRC0_ST_SRC_PATH_CTL,3208 4, 0, NULL, 0),3209 SND_SOC_DAPM_MIXER("SRC1", CDC_RX_SIDETONE_SRC1_ST_SRC_PATH_CTL,3210 4, 0, NULL, 0),3211 3212 SND_SOC_DAPM_MUX("RX INT0 DEM MUX", SND_SOC_NOPM, 0, 0,3213 &rx_int0_dem_inp_mux),3214 3215 SND_SOC_DAPM_MUX_E("RX INT0_2 MUX", SND_SOC_NOPM, INTERP_HPHL, 0,3216 &rx_int0_2_mux, rx_macro_enable_mix_path,3217 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |3218 SND_SOC_DAPM_POST_PMD),3219 SND_SOC_DAPM_MUX_E("RX INT1_2 MUX", SND_SOC_NOPM, INTERP_HPHR, 0,3220 &rx_int1_2_mux, rx_macro_enable_mix_path,3221 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |3222 SND_SOC_DAPM_POST_PMD),3223 SND_SOC_DAPM_MUX_E("RX INT2_2 MUX", SND_SOC_NOPM, INTERP_AUX, 0,3224 &rx_int2_2_mux, rx_macro_enable_mix_path,3225 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |3226 SND_SOC_DAPM_POST_PMD),3227 3228 SND_SOC_DAPM_MUX("RX INT0_1 MIX1 INP0", SND_SOC_NOPM, 0, 0, &rx_int0_1_mix_inp0_mux),3229 SND_SOC_DAPM_MUX("RX INT0_1 MIX1 INP1", SND_SOC_NOPM, 0, 0, &rx_int0_1_mix_inp1_mux),3230 SND_SOC_DAPM_MUX("RX INT0_1 MIX1 INP2", SND_SOC_NOPM, 0, 0, &rx_int0_1_mix_inp2_mux),3231 SND_SOC_DAPM_MUX("RX INT1_1 MIX1 INP0", SND_SOC_NOPM, 0, 0, &rx_int1_1_mix_inp0_mux),3232 SND_SOC_DAPM_MUX("RX INT1_1 MIX1 INP1", SND_SOC_NOPM, 0, 0, &rx_int1_1_mix_inp1_mux),3233 SND_SOC_DAPM_MUX("RX INT1_1 MIX1 INP2", SND_SOC_NOPM, 0, 0, &rx_int1_1_mix_inp2_mux),3234 SND_SOC_DAPM_MUX("RX INT2_1 MIX1 INP0", SND_SOC_NOPM, 0, 0, &rx_int2_1_mix_inp0_mux),3235 SND_SOC_DAPM_MUX("RX INT2_1 MIX1 INP1", SND_SOC_NOPM, 0, 0, &rx_int2_1_mix_inp1_mux),3236 SND_SOC_DAPM_MUX("RX INT2_1 MIX1 INP2", SND_SOC_NOPM, 0, 0, &rx_int2_1_mix_inp2_mux),3237 3238 SND_SOC_DAPM_MUX_E("RX INT0_1 INTERP", SND_SOC_NOPM, INTERP_HPHL, 0,3239 &rx_int0_1_interp_mux, rx_macro_enable_main_path,3240 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |3241 SND_SOC_DAPM_POST_PMD),3242 SND_SOC_DAPM_MUX_E("RX INT1_1 INTERP", SND_SOC_NOPM, INTERP_HPHR, 0,3243 &rx_int1_1_interp_mux, rx_macro_enable_main_path,3244 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |3245 SND_SOC_DAPM_POST_PMD),3246 SND_SOC_DAPM_MUX_E("RX INT2_1 INTERP", SND_SOC_NOPM, INTERP_AUX, 0,3247 &rx_int2_1_interp_mux, rx_macro_enable_main_path,3248 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |3249 SND_SOC_DAPM_POST_PMD),3250 3251 SND_SOC_DAPM_MUX("RX INT0_2 INTERP", SND_SOC_NOPM, 0, 0,3252 &rx_int0_2_interp_mux),3253 SND_SOC_DAPM_MUX("RX INT1_2 INTERP", SND_SOC_NOPM, 0, 0,3254 &rx_int1_2_interp_mux),3255 SND_SOC_DAPM_MUX("RX INT2_2 INTERP", SND_SOC_NOPM, 0, 0,3256 &rx_int2_2_interp_mux),3257 3258 SND_SOC_DAPM_MIXER("RX INT0_1 MIX1", SND_SOC_NOPM, 0, 0, NULL, 0),3259 SND_SOC_DAPM_MIXER("RX INT0 SEC MIX", SND_SOC_NOPM, 0, 0, NULL, 0),3260 SND_SOC_DAPM_MIXER("RX INT1_1 MIX1", SND_SOC_NOPM, 0, 0, NULL, 0),3261 SND_SOC_DAPM_MIXER("RX INT1 SEC MIX", SND_SOC_NOPM, 0, 0, NULL, 0),3262 SND_SOC_DAPM_MIXER("RX INT2_1 MIX1", SND_SOC_NOPM, 0, 0, NULL, 0),3263 SND_SOC_DAPM_MIXER("RX INT2 SEC MIX", SND_SOC_NOPM, 0, 0, NULL, 0),3264 3265 SND_SOC_DAPM_MUX_E("RX INT0 MIX2 INP", SND_SOC_NOPM, INTERP_HPHL,3266 0, &rx_int0_mix2_inp_mux, rx_macro_enable_rx_path_clk,3267 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),3268 SND_SOC_DAPM_MUX_E("RX INT1 MIX2 INP", SND_SOC_NOPM, INTERP_HPHR,3269 0, &rx_int1_mix2_inp_mux, rx_macro_enable_rx_path_clk,3270 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),3271 SND_SOC_DAPM_MUX_E("RX INT2 MIX2 INP", SND_SOC_NOPM, INTERP_AUX,3272 0, &rx_int2_mix2_inp_mux, rx_macro_enable_rx_path_clk,3273 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),3274 3275 SND_SOC_DAPM_MIXER("RX INT0 MIX2", SND_SOC_NOPM, 0, 0, NULL, 0),3276 SND_SOC_DAPM_MIXER("RX INT1 MIX2", SND_SOC_NOPM, 0, 0, NULL, 0),3277 SND_SOC_DAPM_MIXER("RX INT2 MIX2", SND_SOC_NOPM, 0, 0, NULL, 0),3278 3279 SND_SOC_DAPM_OUTPUT("HPHL_OUT"),3280 SND_SOC_DAPM_OUTPUT("HPHR_OUT"),3281 SND_SOC_DAPM_OUTPUT("AUX_OUT"),3282 3283 SND_SOC_DAPM_INPUT("RX_TX DEC0_INP"),3284 SND_SOC_DAPM_INPUT("RX_TX DEC1_INP"),3285 SND_SOC_DAPM_INPUT("RX_TX DEC2_INP"),3286 SND_SOC_DAPM_INPUT("RX_TX DEC3_INP"),3287 3288 SND_SOC_DAPM_SUPPLY_S("RX_MCLK", 0, SND_SOC_NOPM, 0, 0,3289 rx_macro_mclk_event, SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),3290};3291 3292static const struct snd_soc_dapm_route rx_audio_map[] = {3293 {"RX AIF1 PB", NULL, "RX_MCLK"},3294 {"RX AIF2 PB", NULL, "RX_MCLK"},3295 {"RX AIF3 PB", NULL, "RX_MCLK"},3296 {"RX AIF4 PB", NULL, "RX_MCLK"},3297 3298 {"RX_MACRO RX0 MUX", "AIF1_PB", "RX AIF1 PB"},3299 {"RX_MACRO RX1 MUX", "AIF1_PB", "RX AIF1 PB"},3300 {"RX_MACRO RX2 MUX", "AIF1_PB", "RX AIF1 PB"},3301 {"RX_MACRO RX3 MUX", "AIF1_PB", "RX AIF1 PB"},3302 {"RX_MACRO RX4 MUX", "AIF1_PB", "RX AIF1 PB"},3303 {"RX_MACRO RX5 MUX", "AIF1_PB", "RX AIF1 PB"},3304 3305 {"RX_MACRO RX0 MUX", "AIF2_PB", "RX AIF2 PB"},3306 {"RX_MACRO RX1 MUX", "AIF2_PB", "RX AIF2 PB"},3307 {"RX_MACRO RX2 MUX", "AIF2_PB", "RX AIF2 PB"},3308 {"RX_MACRO RX3 MUX", "AIF2_PB", "RX AIF2 PB"},3309 {"RX_MACRO RX4 MUX", "AIF2_PB", "RX AIF2 PB"},3310 {"RX_MACRO RX5 MUX", "AIF2_PB", "RX AIF2 PB"},3311 3312 {"RX_MACRO RX0 MUX", "AIF3_PB", "RX AIF3 PB"},3313 {"RX_MACRO RX1 MUX", "AIF3_PB", "RX AIF3 PB"},3314 {"RX_MACRO RX2 MUX", "AIF3_PB", "RX AIF3 PB"},3315 {"RX_MACRO RX3 MUX", "AIF3_PB", "RX AIF3 PB"},3316 {"RX_MACRO RX4 MUX", "AIF3_PB", "RX AIF3 PB"},3317 {"RX_MACRO RX5 MUX", "AIF3_PB", "RX AIF3 PB"},3318 3319 {"RX_MACRO RX0 MUX", "AIF4_PB", "RX AIF4 PB"},3320 {"RX_MACRO RX1 MUX", "AIF4_PB", "RX AIF4 PB"},3321 {"RX_MACRO RX2 MUX", "AIF4_PB", "RX AIF4 PB"},3322 {"RX_MACRO RX3 MUX", "AIF4_PB", "RX AIF4 PB"},3323 {"RX_MACRO RX4 MUX", "AIF4_PB", "RX AIF4 PB"},3324 {"RX_MACRO RX5 MUX", "AIF4_PB", "RX AIF4 PB"},3325 3326 {"RX_RX0", NULL, "RX_MACRO RX0 MUX"},3327 {"RX_RX1", NULL, "RX_MACRO RX1 MUX"},3328 {"RX_RX2", NULL, "RX_MACRO RX2 MUX"},3329 {"RX_RX3", NULL, "RX_MACRO RX3 MUX"},3330 {"RX_RX4", NULL, "RX_MACRO RX4 MUX"},3331 {"RX_RX5", NULL, "RX_MACRO RX5 MUX"},3332 3333 {"RX INT0_1 MIX1 INP0", "RX0", "RX_RX0"},3334 {"RX INT0_1 MIX1 INP0", "RX1", "RX_RX1"},3335 {"RX INT0_1 MIX1 INP0", "RX2", "RX_RX2"},3336 {"RX INT0_1 MIX1 INP0", "RX3", "RX_RX3"},3337 {"RX INT0_1 MIX1 INP0", "RX4", "RX_RX4"},3338 {"RX INT0_1 MIX1 INP0", "RX5", "RX_RX5"},3339 {"RX INT0_1 MIX1 INP0", "IIR0", "IIR0"},3340 {"RX INT0_1 MIX1 INP0", "IIR1", "IIR1"},3341 {"RX INT0_1 MIX1 INP0", "DEC0", "RX_TX DEC0_INP"},3342 {"RX INT0_1 MIX1 INP0", "DEC1", "RX_TX DEC1_INP"},3343 {"RX INT0_1 MIX1 INP1", "RX0", "RX_RX0"},3344 {"RX INT0_1 MIX1 INP1", "RX1", "RX_RX1"},3345 {"RX INT0_1 MIX1 INP1", "RX2", "RX_RX2"},3346 {"RX INT0_1 MIX1 INP1", "RX3", "RX_RX3"},3347 {"RX INT0_1 MIX1 INP1", "RX4", "RX_RX4"},3348 {"RX INT0_1 MIX1 INP1", "RX5", "RX_RX5"},3349 {"RX INT0_1 MIX1 INP1", "IIR0", "IIR0"},3350 {"RX INT0_1 MIX1 INP1", "IIR1", "IIR1"},3351 {"RX INT0_1 MIX1 INP1", "DEC0", "RX_TX DEC0_INP"},3352 {"RX INT0_1 MIX1 INP1", "DEC1", "RX_TX DEC1_INP"},3353 {"RX INT0_1 MIX1 INP2", "RX0", "RX_RX0"},3354 {"RX INT0_1 MIX1 INP2", "RX1", "RX_RX1"},3355 {"RX INT0_1 MIX1 INP2", "RX2", "RX_RX2"},3356 {"RX INT0_1 MIX1 INP2", "RX3", "RX_RX3"},3357 {"RX INT0_1 MIX1 INP2", "RX4", "RX_RX4"},3358 {"RX INT0_1 MIX1 INP2", "RX5", "RX_RX5"},3359 {"RX INT0_1 MIX1 INP2", "IIR0", "IIR0"},3360 {"RX INT0_1 MIX1 INP2", "IIR1", "IIR1"},3361 {"RX INT0_1 MIX1 INP2", "DEC0", "RX_TX DEC0_INP"},3362 {"RX INT0_1 MIX1 INP2", "DEC1", "RX_TX DEC1_INP"},3363 3364 {"RX INT1_1 MIX1 INP0", "RX0", "RX_RX0"},3365 {"RX INT1_1 MIX1 INP0", "RX1", "RX_RX1"},3366 {"RX INT1_1 MIX1 INP0", "RX2", "RX_RX2"},3367 {"RX INT1_1 MIX1 INP0", "RX3", "RX_RX3"},3368 {"RX INT1_1 MIX1 INP0", "RX4", "RX_RX4"},3369 {"RX INT1_1 MIX1 INP0", "RX5", "RX_RX5"},3370 {"RX INT1_1 MIX1 INP0", "IIR0", "IIR0"},3371 {"RX INT1_1 MIX1 INP0", "IIR1", "IIR1"},3372 {"RX INT1_1 MIX1 INP0", "DEC0", "RX_TX DEC0_INP"},3373 {"RX INT1_1 MIX1 INP0", "DEC1", "RX_TX DEC1_INP"},3374 {"RX INT1_1 MIX1 INP1", "RX0", "RX_RX0"},3375 {"RX INT1_1 MIX1 INP1", "RX1", "RX_RX1"},3376 {"RX INT1_1 MIX1 INP1", "RX2", "RX_RX2"},3377 {"RX INT1_1 MIX1 INP1", "RX3", "RX_RX3"},3378 {"RX INT1_1 MIX1 INP1", "RX4", "RX_RX4"},3379 {"RX INT1_1 MIX1 INP1", "RX5", "RX_RX5"},3380 {"RX INT1_1 MIX1 INP1", "IIR0", "IIR0"},3381 {"RX INT1_1 MIX1 INP1", "IIR1", "IIR1"},3382 {"RX INT1_1 MIX1 INP1", "DEC0", "RX_TX DEC0_INP"},3383 {"RX INT1_1 MIX1 INP1", "DEC1", "RX_TX DEC1_INP"},3384 {"RX INT1_1 MIX1 INP2", "RX0", "RX_RX0"},3385 {"RX INT1_1 MIX1 INP2", "RX1", "RX_RX1"},3386 {"RX INT1_1 MIX1 INP2", "RX2", "RX_RX2"},3387 {"RX INT1_1 MIX1 INP2", "RX3", "RX_RX3"},3388 {"RX INT1_1 MIX1 INP2", "RX4", "RX_RX4"},3389 {"RX INT1_1 MIX1 INP2", "RX5", "RX_RX5"},3390 {"RX INT1_1 MIX1 INP2", "IIR0", "IIR0"},3391 {"RX INT1_1 MIX1 INP2", "IIR1", "IIR1"},3392 {"RX INT1_1 MIX1 INP2", "DEC0", "RX_TX DEC0_INP"},3393 {"RX INT1_1 MIX1 INP2", "DEC1", "RX_TX DEC1_INP"},3394 3395 {"RX INT2_1 MIX1 INP0", "RX0", "RX_RX0"},3396 {"RX INT2_1 MIX1 INP0", "RX1", "RX_RX1"},3397 {"RX INT2_1 MIX1 INP0", "RX2", "RX_RX2"},3398 {"RX INT2_1 MIX1 INP0", "RX3", "RX_RX3"},3399 {"RX INT2_1 MIX1 INP0", "RX4", "RX_RX4"},3400 {"RX INT2_1 MIX1 INP0", "RX5", "RX_RX5"},3401 {"RX INT2_1 MIX1 INP0", "IIR0", "IIR0"},3402 {"RX INT2_1 MIX1 INP0", "IIR1", "IIR1"},3403 {"RX INT2_1 MIX1 INP0", "DEC0", "RX_TX DEC0_INP"},3404 {"RX INT2_1 MIX1 INP0", "DEC1", "RX_TX DEC1_INP"},3405 {"RX INT2_1 MIX1 INP1", "RX0", "RX_RX0"},3406 {"RX INT2_1 MIX1 INP1", "RX1", "RX_RX1"},3407 {"RX INT2_1 MIX1 INP1", "RX2", "RX_RX2"},3408 {"RX INT2_1 MIX1 INP1", "RX3", "RX_RX3"},3409 {"RX INT2_1 MIX1 INP1", "RX4", "RX_RX4"},3410 {"RX INT2_1 MIX1 INP1", "RX5", "RX_RX5"},3411 {"RX INT2_1 MIX1 INP1", "IIR0", "IIR0"},3412 {"RX INT2_1 MIX1 INP1", "IIR1", "IIR1"},3413 {"RX INT2_1 MIX1 INP1", "DEC0", "RX_TX DEC0_INP"},3414 {"RX INT2_1 MIX1 INP1", "DEC1", "RX_TX DEC1_INP"},3415 {"RX INT2_1 MIX1 INP2", "RX0", "RX_RX0"},3416 {"RX INT2_1 MIX1 INP2", "RX1", "RX_RX1"},3417 {"RX INT2_1 MIX1 INP2", "RX2", "RX_RX2"},3418 {"RX INT2_1 MIX1 INP2", "RX3", "RX_RX3"},3419 {"RX INT2_1 MIX1 INP2", "RX4", "RX_RX4"},3420 {"RX INT2_1 MIX1 INP2", "RX5", "RX_RX5"},3421 {"RX INT2_1 MIX1 INP2", "IIR0", "IIR0"},3422 {"RX INT2_1 MIX1 INP2", "IIR1", "IIR1"},3423 {"RX INT2_1 MIX1 INP2", "DEC0", "RX_TX DEC0_INP"},3424 {"RX INT2_1 MIX1 INP2", "DEC1", "RX_TX DEC1_INP"},3425 3426 {"RX INT0_1 MIX1", NULL, "RX INT0_1 MIX1 INP0"},3427 {"RX INT0_1 MIX1", NULL, "RX INT0_1 MIX1 INP1"},3428 {"RX INT0_1 MIX1", NULL, "RX INT0_1 MIX1 INP2"},3429 {"RX INT1_1 MIX1", NULL, "RX INT1_1 MIX1 INP0"},3430 {"RX INT1_1 MIX1", NULL, "RX INT1_1 MIX1 INP1"},3431 {"RX INT1_1 MIX1", NULL, "RX INT1_1 MIX1 INP2"},3432 {"RX INT2_1 MIX1", NULL, "RX INT2_1 MIX1 INP0"},3433 {"RX INT2_1 MIX1", NULL, "RX INT2_1 MIX1 INP1"},3434 {"RX INT2_1 MIX1", NULL, "RX INT2_1 MIX1 INP2"},3435 3436 {"RX MIX TX0 MUX", "RX_MIX0", "RX INT0 SEC MIX"},3437 {"RX MIX TX0 MUX", "RX_MIX1", "RX INT1 SEC MIX"},3438 {"RX MIX TX0 MUX", "RX_MIX2", "RX INT2 SEC MIX"},3439 {"RX MIX TX1 MUX", "RX_MIX0", "RX INT0 SEC MIX"},3440 {"RX MIX TX1 MUX", "RX_MIX1", "RX INT1 SEC MIX"},3441 {"RX MIX TX1 MUX", "RX_MIX2", "RX INT2 SEC MIX"},3442 {"RX MIX TX2 MUX", "RX_MIX0", "RX INT0 SEC MIX"},3443 {"RX MIX TX2 MUX", "RX_MIX1", "RX INT1 SEC MIX"},3444 {"RX MIX TX2 MUX", "RX_MIX2", "RX INT2 SEC MIX"},3445 {"RX AIF_ECHO", NULL, "RX MIX TX0 MUX"},3446 {"RX AIF_ECHO", NULL, "RX MIX TX1 MUX"},3447 {"RX AIF_ECHO", NULL, "RX MIX TX2 MUX"},3448 {"RX AIF_ECHO", NULL, "RX_MCLK"},3449 3450 /* Mixing path INT0 */3451 {"RX INT0_2 MUX", "RX0", "RX_RX0"},3452 {"RX INT0_2 MUX", "RX1", "RX_RX1"},3453 {"RX INT0_2 MUX", "RX2", "RX_RX2"},3454 {"RX INT0_2 MUX", "RX3", "RX_RX3"},3455 {"RX INT0_2 MUX", "RX4", "RX_RX4"},3456 {"RX INT0_2 MUX", "RX5", "RX_RX5"},3457 {"RX INT0_2 INTERP", NULL, "RX INT0_2 MUX"},3458 {"RX INT0 SEC MIX", NULL, "RX INT0_2 INTERP"},3459 3460 /* Mixing path INT1 */3461 {"RX INT1_2 MUX", "RX0", "RX_RX0"},3462 {"RX INT1_2 MUX", "RX1", "RX_RX1"},3463 {"RX INT1_2 MUX", "RX2", "RX_RX2"},3464 {"RX INT1_2 MUX", "RX3", "RX_RX3"},3465 {"RX INT1_2 MUX", "RX4", "RX_RX4"},3466 {"RX INT1_2 MUX", "RX5", "RX_RX5"},3467 {"RX INT1_2 INTERP", NULL, "RX INT1_2 MUX"},3468 {"RX INT1 SEC MIX", NULL, "RX INT1_2 INTERP"},3469 3470 /* Mixing path INT2 */3471 {"RX INT2_2 MUX", "RX0", "RX_RX0"},3472 {"RX INT2_2 MUX", "RX1", "RX_RX1"},3473 {"RX INT2_2 MUX", "RX2", "RX_RX2"},3474 {"RX INT2_2 MUX", "RX3", "RX_RX3"},3475 {"RX INT2_2 MUX", "RX4", "RX_RX4"},3476 {"RX INT2_2 MUX", "RX5", "RX_RX5"},3477 {"RX INT2_2 INTERP", NULL, "RX INT2_2 MUX"},3478 {"RX INT2 SEC MIX", NULL, "RX INT2_2 INTERP"},3479 3480 {"RX INT0_1 INTERP", NULL, "RX INT0_1 MIX1"},3481 {"RX INT0 SEC MIX", NULL, "RX INT0_1 INTERP"},3482 {"RX INT0 MIX2", NULL, "RX INT0 SEC MIX"},3483 {"RX INT0 MIX2", NULL, "RX INT0 MIX2 INP"},3484 {"RX INT0 DEM MUX", "CLSH_DSM_OUT", "RX INT0 MIX2"},3485 {"HPHL_OUT", NULL, "RX INT0 DEM MUX"},3486 {"HPHL_OUT", NULL, "RX_MCLK"},3487 3488 {"RX INT1_1 INTERP", NULL, "RX INT1_1 MIX1"},3489 {"RX INT1 SEC MIX", NULL, "RX INT1_1 INTERP"},3490 {"RX INT1 MIX2", NULL, "RX INT1 SEC MIX"},3491 {"RX INT1 MIX2", NULL, "RX INT1 MIX2 INP"},3492 {"RX INT1 DEM MUX", "CLSH_DSM_OUT", "RX INT1 MIX2"},3493 {"HPHR_OUT", NULL, "RX INT1 DEM MUX"},3494 {"HPHR_OUT", NULL, "RX_MCLK"},3495 3496 {"RX INT2_1 INTERP", NULL, "RX INT2_1 MIX1"},3497 3498 {"RX INT2 SEC MIX", NULL, "RX INT2_1 INTERP"},3499 {"RX INT2 MIX2", NULL, "RX INT2 SEC MIX"},3500 {"RX INT2 MIX2", NULL, "RX INT2 MIX2 INP"},3501 {"AUX_OUT", NULL, "RX INT2 MIX2"},3502 {"AUX_OUT", NULL, "RX_MCLK"},3503 3504 {"IIR0", NULL, "RX_MCLK"},3505 {"IIR0", NULL, "IIR0 INP0 MUX"},3506 {"IIR0 INP0 MUX", "DEC0", "RX_TX DEC0_INP"},3507 {"IIR0 INP0 MUX", "DEC1", "RX_TX DEC1_INP"},3508 {"IIR0 INP0 MUX", "DEC2", "RX_TX DEC2_INP"},3509 {"IIR0 INP0 MUX", "DEC3", "RX_TX DEC3_INP"},3510 {"IIR0 INP0 MUX", "RX0", "RX_RX0"},3511 {"IIR0 INP0 MUX", "RX1", "RX_RX1"},3512 {"IIR0 INP0 MUX", "RX2", "RX_RX2"},3513 {"IIR0 INP0 MUX", "RX3", "RX_RX3"},3514 {"IIR0 INP0 MUX", "RX4", "RX_RX4"},3515 {"IIR0 INP0 MUX", "RX5", "RX_RX5"},3516 {"IIR0", NULL, "IIR0 INP1 MUX"},3517 {"IIR0 INP1 MUX", "DEC0", "RX_TX DEC0_INP"},3518 {"IIR0 INP1 MUX", "DEC1", "RX_TX DEC1_INP"},3519 {"IIR0 INP1 MUX", "DEC2", "RX_TX DEC2_INP"},3520 {"IIR0 INP1 MUX", "DEC3", "RX_TX DEC3_INP"},3521 {"IIR0 INP1 MUX", "RX0", "RX_RX0"},3522 {"IIR0 INP1 MUX", "RX1", "RX_RX1"},3523 {"IIR0 INP1 MUX", "RX2", "RX_RX2"},3524 {"IIR0 INP1 MUX", "RX3", "RX_RX3"},3525 {"IIR0 INP1 MUX", "RX4", "RX_RX4"},3526 {"IIR0 INP1 MUX", "RX5", "RX_RX5"},3527 {"IIR0", NULL, "IIR0 INP2 MUX"},3528 {"IIR0 INP2 MUX", "DEC0", "RX_TX DEC0_INP"},3529 {"IIR0 INP2 MUX", "DEC1", "RX_TX DEC1_INP"},3530 {"IIR0 INP2 MUX", "DEC2", "RX_TX DEC2_INP"},3531 {"IIR0 INP2 MUX", "DEC3", "RX_TX DEC3_INP"},3532 {"IIR0 INP2 MUX", "RX0", "RX_RX0"},3533 {"IIR0 INP2 MUX", "RX1", "RX_RX1"},3534 {"IIR0 INP2 MUX", "RX2", "RX_RX2"},3535 {"IIR0 INP2 MUX", "RX3", "RX_RX3"},3536 {"IIR0 INP2 MUX", "RX4", "RX_RX4"},3537 {"IIR0 INP2 MUX", "RX5", "RX_RX5"},3538 {"IIR0", NULL, "IIR0 INP3 MUX"},3539 {"IIR0 INP3 MUX", "DEC0", "RX_TX DEC0_INP"},3540 {"IIR0 INP3 MUX", "DEC1", "RX_TX DEC1_INP"},3541 {"IIR0 INP3 MUX", "DEC2", "RX_TX DEC2_INP"},3542 {"IIR0 INP3 MUX", "DEC3", "RX_TX DEC3_INP"},3543 {"IIR0 INP3 MUX", "RX0", "RX_RX0"},3544 {"IIR0 INP3 MUX", "RX1", "RX_RX1"},3545 {"IIR0 INP3 MUX", "RX2", "RX_RX2"},3546 {"IIR0 INP3 MUX", "RX3", "RX_RX3"},3547 {"IIR0 INP3 MUX", "RX4", "RX_RX4"},3548 {"IIR0 INP3 MUX", "RX5", "RX_RX5"},3549 3550 {"IIR1", NULL, "RX_MCLK"},3551 {"IIR1", NULL, "IIR1 INP0 MUX"},3552 {"IIR1 INP0 MUX", "DEC0", "RX_TX DEC0_INP"},3553 {"IIR1 INP0 MUX", "DEC1", "RX_TX DEC1_INP"},3554 {"IIR1 INP0 MUX", "DEC2", "RX_TX DEC2_INP"},3555 {"IIR1 INP0 MUX", "DEC3", "RX_TX DEC3_INP"},3556 {"IIR1 INP0 MUX", "RX0", "RX_RX0"},3557 {"IIR1 INP0 MUX", "RX1", "RX_RX1"},3558 {"IIR1 INP0 MUX", "RX2", "RX_RX2"},3559 {"IIR1 INP0 MUX", "RX3", "RX_RX3"},3560 {"IIR1 INP0 MUX", "RX4", "RX_RX4"},3561 {"IIR1 INP0 MUX", "RX5", "RX_RX5"},3562 {"IIR1", NULL, "IIR1 INP1 MUX"},3563 {"IIR1 INP1 MUX", "DEC0", "RX_TX DEC0_INP"},3564 {"IIR1 INP1 MUX", "DEC1", "RX_TX DEC1_INP"},3565 {"IIR1 INP1 MUX", "DEC2", "RX_TX DEC2_INP"},3566 {"IIR1 INP1 MUX", "DEC3", "RX_TX DEC3_INP"},3567 {"IIR1 INP1 MUX", "RX0", "RX_RX0"},3568 {"IIR1 INP1 MUX", "RX1", "RX_RX1"},3569 {"IIR1 INP1 MUX", "RX2", "RX_RX2"},3570 {"IIR1 INP1 MUX", "RX3", "RX_RX3"},3571 {"IIR1 INP1 MUX", "RX4", "RX_RX4"},3572 {"IIR1 INP1 MUX", "RX5", "RX_RX5"},3573 {"IIR1", NULL, "IIR1 INP2 MUX"},3574 {"IIR1 INP2 MUX", "DEC0", "RX_TX DEC0_INP"},3575 {"IIR1 INP2 MUX", "DEC1", "RX_TX DEC1_INP"},3576 {"IIR1 INP2 MUX", "DEC2", "RX_TX DEC2_INP"},3577 {"IIR1 INP2 MUX", "DEC3", "RX_TX DEC3_INP"},3578 {"IIR1 INP2 MUX", "RX0", "RX_RX0"},3579 {"IIR1 INP2 MUX", "RX1", "RX_RX1"},3580 {"IIR1 INP2 MUX", "RX2", "RX_RX2"},3581 {"IIR1 INP2 MUX", "RX3", "RX_RX3"},3582 {"IIR1 INP2 MUX", "RX4", "RX_RX4"},3583 {"IIR1 INP2 MUX", "RX5", "RX_RX5"},3584 {"IIR1", NULL, "IIR1 INP3 MUX"},3585 {"IIR1 INP3 MUX", "DEC0", "RX_TX DEC0_INP"},3586 {"IIR1 INP3 MUX", "DEC1", "RX_TX DEC1_INP"},3587 {"IIR1 INP3 MUX", "DEC2", "RX_TX DEC2_INP"},3588 {"IIR1 INP3 MUX", "DEC3", "RX_TX DEC3_INP"},3589 {"IIR1 INP3 MUX", "RX0", "RX_RX0"},3590 {"IIR1 INP3 MUX", "RX1", "RX_RX1"},3591 {"IIR1 INP3 MUX", "RX2", "RX_RX2"},3592 {"IIR1 INP3 MUX", "RX3", "RX_RX3"},3593 {"IIR1 INP3 MUX", "RX4", "RX_RX4"},3594 {"IIR1 INP3 MUX", "RX5", "RX_RX5"},3595 3596 {"SRC0", NULL, "IIR0"},3597 {"SRC1", NULL, "IIR1"},3598 {"RX INT0 MIX2 INP", "SRC0", "SRC0"},3599 {"RX INT0 MIX2 INP", "SRC1", "SRC1"},3600 {"RX INT1 MIX2 INP", "SRC0", "SRC0"},3601 {"RX INT1 MIX2 INP", "SRC1", "SRC1"},3602 {"RX INT2 MIX2 INP", "SRC0", "SRC0"},3603 {"RX INT2 MIX2 INP", "SRC1", "SRC1"},3604};3605 3606static int rx_macro_component_probe(struct snd_soc_component *component)3607{3608 struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(component);3609 struct rx_macro *rx = snd_soc_component_get_drvdata(component);3610 const struct snd_soc_dapm_widget *widgets;3611 const struct snd_kcontrol_new *controls;3612 unsigned int num_controls, num_widgets;3613 int ret;3614 3615 snd_soc_component_init_regmap(component, rx->regmap);3616 3617 snd_soc_component_update_bits(component, CDC_RX_RXn_RX_PATH_SEC7(rx, 0),3618 CDC_RX_DSM_OUT_DELAY_SEL_MASK,3619 CDC_RX_DSM_OUT_DELAY_TWO_SAMPLE);3620 snd_soc_component_update_bits(component, CDC_RX_RXn_RX_PATH_SEC7(rx, 1),3621 CDC_RX_DSM_OUT_DELAY_SEL_MASK,3622 CDC_RX_DSM_OUT_DELAY_TWO_SAMPLE);3623 snd_soc_component_update_bits(component, CDC_RX_RXn_RX_PATH_SEC7(rx, 2),3624 CDC_RX_DSM_OUT_DELAY_SEL_MASK,3625 CDC_RX_DSM_OUT_DELAY_TWO_SAMPLE);3626 snd_soc_component_update_bits(component, CDC_RX_RXn_RX_PATH_CFG3(rx, 0),3627 CDC_RX_DC_COEFF_SEL_MASK,3628 CDC_RX_DC_COEFF_SEL_TWO);3629 snd_soc_component_update_bits(component, CDC_RX_RXn_RX_PATH_CFG3(rx, 1),3630 CDC_RX_DC_COEFF_SEL_MASK,3631 CDC_RX_DC_COEFF_SEL_TWO);3632 snd_soc_component_update_bits(component, CDC_RX_RXn_RX_PATH_CFG3(rx, 2),3633 CDC_RX_DC_COEFF_SEL_MASK,3634 CDC_RX_DC_COEFF_SEL_TWO);3635 3636 switch (rx->codec_version) {3637 case LPASS_CODEC_VERSION_1_0:3638 case LPASS_CODEC_VERSION_1_1:3639 case LPASS_CODEC_VERSION_1_2:3640 case LPASS_CODEC_VERSION_2_0:3641 case LPASS_CODEC_VERSION_2_1:3642 controls = rx_macro_def_snd_controls;3643 num_controls = ARRAY_SIZE(rx_macro_def_snd_controls);3644 widgets = rx_macro_def_dapm_widgets;3645 num_widgets = ARRAY_SIZE(rx_macro_def_dapm_widgets);3646 break;3647 case LPASS_CODEC_VERSION_2_5:3648 case LPASS_CODEC_VERSION_2_6:3649 case LPASS_CODEC_VERSION_2_7:3650 case LPASS_CODEC_VERSION_2_8:3651 controls = rx_macro_2_5_snd_controls;3652 num_controls = ARRAY_SIZE(rx_macro_2_5_snd_controls);3653 widgets = rx_macro_2_5_dapm_widgets;3654 num_widgets = ARRAY_SIZE(rx_macro_2_5_dapm_widgets);3655 break;3656 default:3657 return -EINVAL;3658 }3659 3660 rx->component = component;3661 3662 ret = snd_soc_add_component_controls(component, controls, num_controls);3663 if (ret)3664 return ret;3665 3666 return snd_soc_dapm_new_controls(dapm, widgets, num_widgets);3667}3668 3669static int swclk_gate_enable(struct clk_hw *hw)3670{3671 struct rx_macro *rx = to_rx_macro(hw);3672 int ret;3673 3674 ret = clk_prepare_enable(rx->mclk);3675 if (ret) {3676 dev_err(rx->dev, "unable to prepare mclk\n");3677 return ret;3678 }3679 3680 rx_macro_mclk_enable(rx, true);3681 3682 regmap_update_bits(rx->regmap, CDC_RX_CLK_RST_CTRL_SWR_CONTROL,3683 CDC_RX_SWR_CLK_EN_MASK, 1);3684 3685 return 0;3686}3687 3688static void swclk_gate_disable(struct clk_hw *hw)3689{3690 struct rx_macro *rx = to_rx_macro(hw);3691 3692 regmap_update_bits(rx->regmap, CDC_RX_CLK_RST_CTRL_SWR_CONTROL, 3693 CDC_RX_SWR_CLK_EN_MASK, 0);3694 3695 rx_macro_mclk_enable(rx, false);3696 clk_disable_unprepare(rx->mclk);3697}3698 3699static int swclk_gate_is_enabled(struct clk_hw *hw)3700{3701 struct rx_macro *rx = to_rx_macro(hw);3702 int ret, val;3703 3704 regmap_read(rx->regmap, CDC_RX_CLK_RST_CTRL_SWR_CONTROL, &val);3705 ret = val & BIT(0);3706 3707 return ret;3708}3709 3710static unsigned long swclk_recalc_rate(struct clk_hw *hw,3711 unsigned long parent_rate)3712{3713 return parent_rate / 2;3714}3715 3716static const struct clk_ops swclk_gate_ops = {3717 .prepare = swclk_gate_enable,3718 .unprepare = swclk_gate_disable,3719 .is_enabled = swclk_gate_is_enabled,3720 .recalc_rate = swclk_recalc_rate,3721 3722};3723 3724static int rx_macro_register_mclk_output(struct rx_macro *rx)3725{3726 struct device *dev = rx->dev;3727 const char *parent_clk_name = NULL;3728 const char *clk_name = "lpass-rx-mclk";3729 struct clk_hw *hw;3730 struct clk_init_data init;3731 int ret;3732 3733 if (rx->npl)3734 parent_clk_name = __clk_get_name(rx->npl);3735 else3736 parent_clk_name = __clk_get_name(rx->mclk);3737 3738 init.name = clk_name;3739 init.ops = &swclk_gate_ops;3740 init.flags = 0;3741 init.parent_names = &parent_clk_name;3742 init.num_parents = 1;3743 rx->hw.init = &init;3744 hw = &rx->hw;3745 ret = devm_clk_hw_register(rx->dev, hw);3746 if (ret)3747 return ret;3748 3749 return devm_of_clk_add_hw_provider(dev, of_clk_hw_simple_get, hw);3750}3751 3752static const struct snd_soc_component_driver rx_macro_component_drv = {3753 .name = "RX-MACRO",3754 .probe = rx_macro_component_probe,3755 .controls = rx_macro_snd_controls,3756 .num_controls = ARRAY_SIZE(rx_macro_snd_controls),3757 .dapm_widgets = rx_macro_dapm_widgets,3758 .num_dapm_widgets = ARRAY_SIZE(rx_macro_dapm_widgets),3759 .dapm_routes = rx_audio_map,3760 .num_dapm_routes = ARRAY_SIZE(rx_audio_map),3761};3762 3763static int rx_macro_probe(struct platform_device *pdev)3764{3765 struct device *dev = &pdev->dev;3766 kernel_ulong_t flags;3767 struct rx_macro *rx;3768 void __iomem *base;3769 int ret, def_count;3770 3771 flags = (kernel_ulong_t)device_get_match_data(dev);3772 3773 rx = devm_kzalloc(dev, sizeof(*rx), GFP_KERNEL);3774 if (!rx)3775 return -ENOMEM;3776 3777 rx->macro = devm_clk_get_optional(dev, "macro");3778 if (IS_ERR(rx->macro))3779 return dev_err_probe(dev, PTR_ERR(rx->macro), "unable to get macro clock\n");3780 3781 rx->dcodec = devm_clk_get_optional(dev, "dcodec");3782 if (IS_ERR(rx->dcodec))3783 return dev_err_probe(dev, PTR_ERR(rx->dcodec), "unable to get dcodec clock\n");3784 3785 rx->mclk = devm_clk_get(dev, "mclk");3786 if (IS_ERR(rx->mclk))3787 return dev_err_probe(dev, PTR_ERR(rx->mclk), "unable to get mclk clock\n");3788 3789 if (flags & LPASS_MACRO_FLAG_HAS_NPL_CLOCK) {3790 rx->npl = devm_clk_get(dev, "npl");3791 if (IS_ERR(rx->npl))3792 return dev_err_probe(dev, PTR_ERR(rx->npl), "unable to get npl clock\n");3793 }3794 3795 rx->fsgen = devm_clk_get(dev, "fsgen");3796 if (IS_ERR(rx->fsgen))3797 return dev_err_probe(dev, PTR_ERR(rx->fsgen), "unable to get fsgen clock\n");3798 3799 rx->pds = lpass_macro_pds_init(dev);3800 if (IS_ERR(rx->pds))3801 return PTR_ERR(rx->pds);3802 3803 ret = devm_add_action_or_reset(dev, lpass_macro_pds_exit_action, rx->pds);3804 if (ret)3805 return ret;3806 3807 base = devm_platform_ioremap_resource(pdev, 0);3808 if (IS_ERR(base))3809 return PTR_ERR(base);3810 3811 rx->codec_version = lpass_macro_get_codec_version();3812 struct reg_default *reg_defaults __free(kfree) = NULL;3813 3814 switch (rx->codec_version) {3815 case LPASS_CODEC_VERSION_1_0:3816 case LPASS_CODEC_VERSION_1_1:3817 case LPASS_CODEC_VERSION_1_2:3818 case LPASS_CODEC_VERSION_2_0:3819 case LPASS_CODEC_VERSION_2_1:3820 rx->rxn_reg_stride = 0x80;3821 rx->rxn_reg_stride2 = 0xc;3822 def_count = ARRAY_SIZE(rx_defaults) + ARRAY_SIZE(rx_pre_2_5_defaults);3823 reg_defaults = kmalloc_array(def_count, sizeof(struct reg_default), GFP_KERNEL);3824 if (!reg_defaults)3825 return -ENOMEM;3826 memcpy(®_defaults[0], rx_defaults, sizeof(rx_defaults));3827 memcpy(®_defaults[ARRAY_SIZE(rx_defaults)],3828 rx_pre_2_5_defaults, sizeof(rx_pre_2_5_defaults));3829 break;3830 case LPASS_CODEC_VERSION_2_5:3831 case LPASS_CODEC_VERSION_2_6:3832 case LPASS_CODEC_VERSION_2_7:3833 case LPASS_CODEC_VERSION_2_8:3834 rx->rxn_reg_stride = 0xc0;3835 rx->rxn_reg_stride2 = 0x0;3836 def_count = ARRAY_SIZE(rx_defaults) + ARRAY_SIZE(rx_2_5_defaults);3837 reg_defaults = kmalloc_array(def_count, sizeof(struct reg_default), GFP_KERNEL);3838 if (!reg_defaults)3839 return -ENOMEM;3840 memcpy(®_defaults[0], rx_defaults, sizeof(rx_defaults));3841 memcpy(®_defaults[ARRAY_SIZE(rx_defaults)],3842 rx_2_5_defaults, sizeof(rx_2_5_defaults));3843 break;3844 default:3845 dev_err(dev, "Unsupported Codec version (%d)\n", rx->codec_version);3846 return -EINVAL;3847 }3848 3849 struct regmap_config *reg_config __free(kfree) = kmemdup(&rx_regmap_config,3850 sizeof(*reg_config),3851 GFP_KERNEL);3852 if (!reg_config)3853 return -ENOMEM;3854 3855 reg_config->reg_defaults = reg_defaults;3856 reg_config->num_reg_defaults = def_count;3857 3858 rx->regmap = devm_regmap_init_mmio(dev, base, reg_config);3859 if (IS_ERR(rx->regmap))3860 return PTR_ERR(rx->regmap);3861 3862 dev_set_drvdata(dev, rx);3863 3864 rx->dev = dev;3865 3866 /* set MCLK and NPL rates */3867 clk_set_rate(rx->mclk, MCLK_FREQ);3868 clk_set_rate(rx->npl, MCLK_FREQ);3869 3870 ret = clk_prepare_enable(rx->macro);3871 if (ret)3872 return ret;3873 3874 ret = clk_prepare_enable(rx->dcodec);3875 if (ret)3876 goto err_dcodec;3877 3878 ret = clk_prepare_enable(rx->mclk);3879 if (ret)3880 goto err_mclk;3881 3882 ret = clk_prepare_enable(rx->npl);3883 if (ret)3884 goto err_npl;3885 3886 ret = clk_prepare_enable(rx->fsgen);3887 if (ret)3888 goto err_fsgen;3889 3890 /* reset swr block */3891 regmap_update_bits(rx->regmap, CDC_RX_CLK_RST_CTRL_SWR_CONTROL,3892 CDC_RX_SWR_RESET_MASK,3893 CDC_RX_SWR_RESET);3894 3895 regmap_update_bits(rx->regmap, CDC_RX_CLK_RST_CTRL_SWR_CONTROL,3896 CDC_RX_SWR_CLK_EN_MASK, 1);3897 3898 regmap_update_bits(rx->regmap, CDC_RX_CLK_RST_CTRL_SWR_CONTROL,3899 CDC_RX_SWR_RESET_MASK, 0);3900 3901 ret = devm_snd_soc_register_component(dev, &rx_macro_component_drv,3902 rx_macro_dai,3903 ARRAY_SIZE(rx_macro_dai));3904 if (ret)3905 goto err_clkout;3906 3907 3908 pm_runtime_set_autosuspend_delay(dev, 3000);3909 pm_runtime_use_autosuspend(dev);3910 pm_runtime_mark_last_busy(dev);3911 pm_runtime_set_active(dev);3912 pm_runtime_enable(dev);3913 3914 ret = rx_macro_register_mclk_output(rx);3915 if (ret)3916 goto err_clkout;3917 3918 return 0;3919 3920err_clkout:3921 clk_disable_unprepare(rx->fsgen);3922err_fsgen:3923 clk_disable_unprepare(rx->npl);3924err_npl:3925 clk_disable_unprepare(rx->mclk);3926err_mclk:3927 clk_disable_unprepare(rx->dcodec);3928err_dcodec:3929 clk_disable_unprepare(rx->macro);3930 3931 return ret;3932}3933 3934static void rx_macro_remove(struct platform_device *pdev)3935{3936 struct rx_macro *rx = dev_get_drvdata(&pdev->dev);3937 3938 clk_disable_unprepare(rx->mclk);3939 clk_disable_unprepare(rx->npl);3940 clk_disable_unprepare(rx->fsgen);3941 clk_disable_unprepare(rx->macro);3942 clk_disable_unprepare(rx->dcodec);3943}3944 3945static const struct of_device_id rx_macro_dt_match[] = {3946 {3947 .compatible = "qcom,sc7280-lpass-rx-macro",3948 .data = (void *)LPASS_MACRO_FLAG_HAS_NPL_CLOCK,3949 3950 }, {3951 .compatible = "qcom,sm8250-lpass-rx-macro",3952 .data = (void *)LPASS_MACRO_FLAG_HAS_NPL_CLOCK,3953 }, {3954 .compatible = "qcom,sm8450-lpass-rx-macro",3955 .data = (void *)LPASS_MACRO_FLAG_HAS_NPL_CLOCK,3956 }, {3957 .compatible = "qcom,sm8550-lpass-rx-macro",3958 }, {3959 .compatible = "qcom,sc8280xp-lpass-rx-macro",3960 .data = (void *)LPASS_MACRO_FLAG_HAS_NPL_CLOCK,3961 },3962 { }3963};3964MODULE_DEVICE_TABLE(of, rx_macro_dt_match);3965 3966static int __maybe_unused rx_macro_runtime_suspend(struct device *dev)3967{3968 struct rx_macro *rx = dev_get_drvdata(dev);3969 3970 regcache_cache_only(rx->regmap, true);3971 regcache_mark_dirty(rx->regmap);3972 3973 clk_disable_unprepare(rx->fsgen);3974 clk_disable_unprepare(rx->npl);3975 clk_disable_unprepare(rx->mclk);3976 3977 return 0;3978}3979 3980static int __maybe_unused rx_macro_runtime_resume(struct device *dev)3981{3982 struct rx_macro *rx = dev_get_drvdata(dev);3983 int ret;3984 3985 ret = clk_prepare_enable(rx->mclk);3986 if (ret) {3987 dev_err(dev, "unable to prepare mclk\n");3988 return ret;3989 }3990 3991 ret = clk_prepare_enable(rx->npl);3992 if (ret) {3993 dev_err(dev, "unable to prepare mclkx2\n");3994 goto err_npl;3995 }3996 3997 ret = clk_prepare_enable(rx->fsgen);3998 if (ret) {3999 dev_err(dev, "unable to prepare fsgen\n");4000 goto err_fsgen;4001 }4002 regcache_cache_only(rx->regmap, false);4003 regcache_sync(rx->regmap);4004 4005 return 0;4006err_fsgen:4007 clk_disable_unprepare(rx->npl);4008err_npl:4009 clk_disable_unprepare(rx->mclk);4010 4011 return ret;4012}4013 4014static const struct dev_pm_ops rx_macro_pm_ops = {4015 SET_RUNTIME_PM_OPS(rx_macro_runtime_suspend, rx_macro_runtime_resume, NULL)4016};4017 4018static struct platform_driver rx_macro_driver = {4019 .driver = {4020 .name = "rx_macro",4021 .of_match_table = rx_macro_dt_match,4022 .suppress_bind_attrs = true,4023 .pm = &rx_macro_pm_ops,4024 },4025 .probe = rx_macro_probe,4026 .remove = rx_macro_remove,4027};4028 4029module_platform_driver(rx_macro_driver);4030 4031MODULE_DESCRIPTION("RX macro driver");4032MODULE_LICENSE("GPL");4033