162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only 262306a36Sopenharmony_ci// Copyright (c) 2018-2020, The Linux Foundation. All rights reserved. 362306a36Sopenharmony_ci 462306a36Sopenharmony_ci#include <linux/module.h> 562306a36Sopenharmony_ci#include <linux/init.h> 662306a36Sopenharmony_ci#include <linux/io.h> 762306a36Sopenharmony_ci#include <linux/of.h> 862306a36Sopenharmony_ci#include <linux/platform_device.h> 962306a36Sopenharmony_ci#include <linux/clk.h> 1062306a36Sopenharmony_ci#include <linux/of_clk.h> 1162306a36Sopenharmony_ci#include <linux/clk-provider.h> 1262306a36Sopenharmony_ci#include <sound/soc.h> 1362306a36Sopenharmony_ci#include <sound/soc-dapm.h> 1462306a36Sopenharmony_ci#include <linux/pm_runtime.h> 1562306a36Sopenharmony_ci#include <linux/of_platform.h> 1662306a36Sopenharmony_ci#include <sound/tlv.h> 1762306a36Sopenharmony_ci 1862306a36Sopenharmony_ci#include "lpass-macro-common.h" 1962306a36Sopenharmony_ci#include "lpass-wsa-macro.h" 2062306a36Sopenharmony_ci 2162306a36Sopenharmony_ci#define CDC_WSA_CLK_RST_CTRL_MCLK_CONTROL (0x0000) 2262306a36Sopenharmony_ci#define CDC_WSA_MCLK_EN_MASK BIT(0) 2362306a36Sopenharmony_ci#define CDC_WSA_MCLK_ENABLE BIT(0) 2462306a36Sopenharmony_ci#define CDC_WSA_MCLK_DISABLE 0 2562306a36Sopenharmony_ci#define CDC_WSA_CLK_RST_CTRL_FS_CNT_CONTROL (0x0004) 2662306a36Sopenharmony_ci#define CDC_WSA_FS_CNT_EN_MASK BIT(0) 2762306a36Sopenharmony_ci#define CDC_WSA_FS_CNT_ENABLE BIT(0) 2862306a36Sopenharmony_ci#define CDC_WSA_FS_CNT_DISABLE 0 2962306a36Sopenharmony_ci#define CDC_WSA_CLK_RST_CTRL_SWR_CONTROL (0x0008) 3062306a36Sopenharmony_ci#define CDC_WSA_SWR_CLK_EN_MASK BIT(0) 3162306a36Sopenharmony_ci#define CDC_WSA_SWR_CLK_ENABLE BIT(0) 3262306a36Sopenharmony_ci#define CDC_WSA_SWR_RST_EN_MASK BIT(1) 3362306a36Sopenharmony_ci#define CDC_WSA_SWR_RST_ENABLE BIT(1) 3462306a36Sopenharmony_ci#define CDC_WSA_SWR_RST_DISABLE 0 3562306a36Sopenharmony_ci#define CDC_WSA_TOP_TOP_CFG0 (0x0080) 3662306a36Sopenharmony_ci#define CDC_WSA_TOP_TOP_CFG1 (0x0084) 3762306a36Sopenharmony_ci#define CDC_WSA_TOP_FREQ_MCLK (0x0088) 3862306a36Sopenharmony_ci#define CDC_WSA_TOP_DEBUG_BUS_SEL (0x008C) 3962306a36Sopenharmony_ci#define CDC_WSA_TOP_DEBUG_EN0 (0x0090) 4062306a36Sopenharmony_ci#define CDC_WSA_TOP_DEBUG_EN1 (0x0094) 4162306a36Sopenharmony_ci#define CDC_WSA_TOP_DEBUG_DSM_LB (0x0098) 4262306a36Sopenharmony_ci#define CDC_WSA_TOP_RX_I2S_CTL (0x009C) 4362306a36Sopenharmony_ci#define CDC_WSA_TOP_TX_I2S_CTL (0x00A0) 4462306a36Sopenharmony_ci#define CDC_WSA_TOP_I2S_CLK (0x00A4) 4562306a36Sopenharmony_ci#define CDC_WSA_TOP_I2S_RESET (0x00A8) 4662306a36Sopenharmony_ci#define CDC_WSA_RX_INP_MUX_RX_INT0_CFG0 (0x0100) 4762306a36Sopenharmony_ci#define CDC_WSA_RX_INTX_1_MIX_INP0_SEL_MASK GENMASK(2, 0) 4862306a36Sopenharmony_ci#define CDC_WSA_RX_INTX_1_MIX_INP1_SEL_MASK GENMASK(5, 3) 4962306a36Sopenharmony_ci#define CDC_WSA_RX_INP_MUX_RX_INT0_CFG1 (0x0104) 5062306a36Sopenharmony_ci#define CDC_WSA_RX_INTX_2_SEL_MASK GENMASK(2, 0) 5162306a36Sopenharmony_ci#define CDC_WSA_RX_INTX_1_MIX_INP2_SEL_MASK GENMASK(5, 3) 5262306a36Sopenharmony_ci#define CDC_WSA_RX_INP_MUX_RX_INT1_CFG0 (0x0108) 5362306a36Sopenharmony_ci#define CDC_WSA_RX_INP_MUX_RX_INT1_CFG1 (0x010C) 5462306a36Sopenharmony_ci#define CDC_WSA_RX_INP_MUX_RX_MIX_CFG0 (0x0110) 5562306a36Sopenharmony_ci#define CDC_WSA_RX_MIX_TX1_SEL_MASK GENMASK(5, 3) 5662306a36Sopenharmony_ci#define CDC_WSA_RX_MIX_TX1_SEL_SHFT 3 5762306a36Sopenharmony_ci#define CDC_WSA_RX_MIX_TX0_SEL_MASK GENMASK(2, 0) 5862306a36Sopenharmony_ci#define CDC_WSA_RX_INP_MUX_RX_EC_CFG0 (0x0114) 5962306a36Sopenharmony_ci#define CDC_WSA_RX_INP_MUX_SOFTCLIP_CFG0 (0x0118) 6062306a36Sopenharmony_ci#define CDC_WSA_TX0_SPKR_PROT_PATH_CTL (0x0244) 6162306a36Sopenharmony_ci#define CDC_WSA_TX_SPKR_PROT_RESET_MASK BIT(5) 6262306a36Sopenharmony_ci#define CDC_WSA_TX_SPKR_PROT_RESET BIT(5) 6362306a36Sopenharmony_ci#define CDC_WSA_TX_SPKR_PROT_NO_RESET 0 6462306a36Sopenharmony_ci#define CDC_WSA_TX_SPKR_PROT_CLK_EN_MASK BIT(4) 6562306a36Sopenharmony_ci#define CDC_WSA_TX_SPKR_PROT_CLK_ENABLE BIT(4) 6662306a36Sopenharmony_ci#define CDC_WSA_TX_SPKR_PROT_CLK_DISABLE 0 6762306a36Sopenharmony_ci#define CDC_WSA_TX_SPKR_PROT_PCM_RATE_MASK GENMASK(3, 0) 6862306a36Sopenharmony_ci#define CDC_WSA_TX_SPKR_PROT_PCM_RATE_8K 0 6962306a36Sopenharmony_ci#define CDC_WSA_TX0_SPKR_PROT_PATH_CFG0 (0x0248) 7062306a36Sopenharmony_ci#define CDC_WSA_TX1_SPKR_PROT_PATH_CTL (0x0264) 7162306a36Sopenharmony_ci#define CDC_WSA_TX1_SPKR_PROT_PATH_CFG0 (0x0268) 7262306a36Sopenharmony_ci#define CDC_WSA_TX2_SPKR_PROT_PATH_CTL (0x0284) 7362306a36Sopenharmony_ci#define CDC_WSA_TX2_SPKR_PROT_PATH_CFG0 (0x0288) 7462306a36Sopenharmony_ci#define CDC_WSA_TX3_SPKR_PROT_PATH_CTL (0x02A4) 7562306a36Sopenharmony_ci#define CDC_WSA_TX3_SPKR_PROT_PATH_CFG0 (0x02A8) 7662306a36Sopenharmony_ci#define CDC_WSA_INTR_CTRL_CFG (0x0340) 7762306a36Sopenharmony_ci#define CDC_WSA_INTR_CTRL_CLR_COMMIT (0x0344) 7862306a36Sopenharmony_ci#define CDC_WSA_INTR_CTRL_PIN1_MASK0 (0x0360) 7962306a36Sopenharmony_ci#define CDC_WSA_INTR_CTRL_PIN1_STATUS0 (0x0368) 8062306a36Sopenharmony_ci#define CDC_WSA_INTR_CTRL_PIN1_CLEAR0 (0x0370) 8162306a36Sopenharmony_ci#define CDC_WSA_INTR_CTRL_PIN2_MASK0 (0x0380) 8262306a36Sopenharmony_ci#define CDC_WSA_INTR_CTRL_PIN2_STATUS0 (0x0388) 8362306a36Sopenharmony_ci#define CDC_WSA_INTR_CTRL_PIN2_CLEAR0 (0x0390) 8462306a36Sopenharmony_ci#define CDC_WSA_INTR_CTRL_LEVEL0 (0x03C0) 8562306a36Sopenharmony_ci#define CDC_WSA_INTR_CTRL_BYPASS0 (0x03C8) 8662306a36Sopenharmony_ci#define CDC_WSA_INTR_CTRL_SET0 (0x03D0) 8762306a36Sopenharmony_ci#define CDC_WSA_RX0_RX_PATH_CTL (0x0400) 8862306a36Sopenharmony_ci#define CDC_WSA_RX_PATH_CLK_EN_MASK BIT(5) 8962306a36Sopenharmony_ci#define CDC_WSA_RX_PATH_CLK_ENABLE BIT(5) 9062306a36Sopenharmony_ci#define CDC_WSA_RX_PATH_CLK_DISABLE 0 9162306a36Sopenharmony_ci#define CDC_WSA_RX_PATH_PGA_MUTE_EN_MASK BIT(4) 9262306a36Sopenharmony_ci#define CDC_WSA_RX_PATH_PGA_MUTE_ENABLE BIT(4) 9362306a36Sopenharmony_ci#define CDC_WSA_RX_PATH_PGA_MUTE_DISABLE 0 9462306a36Sopenharmony_ci#define CDC_WSA_RX0_RX_PATH_CFG0 (0x0404) 9562306a36Sopenharmony_ci#define CDC_WSA_RX_PATH_COMP_EN_MASK BIT(1) 9662306a36Sopenharmony_ci#define CDC_WSA_RX_PATH_COMP_ENABLE BIT(1) 9762306a36Sopenharmony_ci#define CDC_WSA_RX_PATH_HD2_EN_MASK BIT(2) 9862306a36Sopenharmony_ci#define CDC_WSA_RX_PATH_HD2_ENABLE BIT(2) 9962306a36Sopenharmony_ci#define CDC_WSA_RX_PATH_SPKR_RATE_MASK BIT(3) 10062306a36Sopenharmony_ci#define CDC_WSA_RX_PATH_SPKR_RATE_FS_2P4_3P072 BIT(3) 10162306a36Sopenharmony_ci#define CDC_WSA_RX0_RX_PATH_CFG1 (0x0408) 10262306a36Sopenharmony_ci#define CDC_WSA_RX_PATH_SMART_BST_EN_MASK BIT(0) 10362306a36Sopenharmony_ci#define CDC_WSA_RX_PATH_SMART_BST_ENABLE BIT(0) 10462306a36Sopenharmony_ci#define CDC_WSA_RX_PATH_SMART_BST_DISABLE 0 10562306a36Sopenharmony_ci#define CDC_WSA_RX0_RX_PATH_CFG2 (0x040C) 10662306a36Sopenharmony_ci#define CDC_WSA_RX0_RX_PATH_CFG3 (0x0410) 10762306a36Sopenharmony_ci#define CDC_WSA_RX_DC_DCOEFF_MASK GENMASK(1, 0) 10862306a36Sopenharmony_ci#define CDC_WSA_RX0_RX_VOL_CTL (0x0414) 10962306a36Sopenharmony_ci#define CDC_WSA_RX0_RX_PATH_MIX_CTL (0x0418) 11062306a36Sopenharmony_ci#define CDC_WSA_RX_PATH_MIX_CLK_EN_MASK BIT(5) 11162306a36Sopenharmony_ci#define CDC_WSA_RX_PATH_MIX_CLK_ENABLE BIT(5) 11262306a36Sopenharmony_ci#define CDC_WSA_RX_PATH_MIX_CLK_DISABLE 0 11362306a36Sopenharmony_ci#define CDC_WSA_RX0_RX_PATH_MIX_CFG (0x041C) 11462306a36Sopenharmony_ci#define CDC_WSA_RX0_RX_VOL_MIX_CTL (0x0420) 11562306a36Sopenharmony_ci#define CDC_WSA_RX0_RX_PATH_SEC0 (0x0424) 11662306a36Sopenharmony_ci#define CDC_WSA_RX0_RX_PATH_SEC1 (0x0428) 11762306a36Sopenharmony_ci#define CDC_WSA_RX_PGA_HALF_DB_MASK BIT(0) 11862306a36Sopenharmony_ci#define CDC_WSA_RX_PGA_HALF_DB_ENABLE BIT(0) 11962306a36Sopenharmony_ci#define CDC_WSA_RX_PGA_HALF_DB_DISABLE 0 12062306a36Sopenharmony_ci#define CDC_WSA_RX0_RX_PATH_SEC2 (0x042C) 12162306a36Sopenharmony_ci#define CDC_WSA_RX0_RX_PATH_SEC3 (0x0430) 12262306a36Sopenharmony_ci#define CDC_WSA_RX_PATH_HD2_SCALE_MASK GENMASK(1, 0) 12362306a36Sopenharmony_ci#define CDC_WSA_RX_PATH_HD2_ALPHA_MASK GENMASK(5, 2) 12462306a36Sopenharmony_ci#define CDC_WSA_RX0_RX_PATH_SEC5 (0x0438) 12562306a36Sopenharmony_ci#define CDC_WSA_RX0_RX_PATH_SEC6 (0x043C) 12662306a36Sopenharmony_ci#define CDC_WSA_RX0_RX_PATH_SEC7 (0x0440) 12762306a36Sopenharmony_ci#define CDC_WSA_RX0_RX_PATH_MIX_SEC0 (0x0444) 12862306a36Sopenharmony_ci#define CDC_WSA_RX0_RX_PATH_MIX_SEC1 (0x0448) 12962306a36Sopenharmony_ci#define CDC_WSA_RX0_RX_PATH_DSMDEM_CTL (0x044C) 13062306a36Sopenharmony_ci#define CDC_WSA_RX_DSMDEM_CLK_EN_MASK BIT(0) 13162306a36Sopenharmony_ci#define CDC_WSA_RX_DSMDEM_CLK_ENABLE BIT(0) 13262306a36Sopenharmony_ci#define CDC_WSA_RX1_RX_PATH_CTL (0x0480) 13362306a36Sopenharmony_ci#define CDC_WSA_RX1_RX_PATH_CFG0 (0x0484) 13462306a36Sopenharmony_ci#define CDC_WSA_RX1_RX_PATH_CFG1 (0x0488) 13562306a36Sopenharmony_ci#define CDC_WSA_RX1_RX_PATH_CFG2 (0x048C) 13662306a36Sopenharmony_ci#define CDC_WSA_RX1_RX_PATH_CFG3 (0x0490) 13762306a36Sopenharmony_ci#define CDC_WSA_RX1_RX_VOL_CTL (0x0494) 13862306a36Sopenharmony_ci#define CDC_WSA_RX1_RX_PATH_MIX_CTL (0x0498) 13962306a36Sopenharmony_ci#define CDC_WSA_RX1_RX_PATH_MIX_CFG (0x049C) 14062306a36Sopenharmony_ci#define CDC_WSA_RX1_RX_VOL_MIX_CTL (0x04A0) 14162306a36Sopenharmony_ci#define CDC_WSA_RX1_RX_PATH_SEC0 (0x04A4) 14262306a36Sopenharmony_ci#define CDC_WSA_RX1_RX_PATH_SEC1 (0x04A8) 14362306a36Sopenharmony_ci#define CDC_WSA_RX1_RX_PATH_SEC2 (0x04AC) 14462306a36Sopenharmony_ci#define CDC_WSA_RX1_RX_PATH_SEC3 (0x04B0) 14562306a36Sopenharmony_ci#define CDC_WSA_RX1_RX_PATH_SEC5 (0x04B8) 14662306a36Sopenharmony_ci#define CDC_WSA_RX1_RX_PATH_SEC6 (0x04BC) 14762306a36Sopenharmony_ci#define CDC_WSA_RX1_RX_PATH_SEC7 (0x04C0) 14862306a36Sopenharmony_ci#define CDC_WSA_RX1_RX_PATH_MIX_SEC0 (0x04C4) 14962306a36Sopenharmony_ci#define CDC_WSA_RX1_RX_PATH_MIX_SEC1 (0x04C8) 15062306a36Sopenharmony_ci#define CDC_WSA_RX1_RX_PATH_DSMDEM_CTL (0x04CC) 15162306a36Sopenharmony_ci#define CDC_WSA_BOOST0_BOOST_PATH_CTL (0x0500) 15262306a36Sopenharmony_ci#define CDC_WSA_BOOST_PATH_CLK_EN_MASK BIT(4) 15362306a36Sopenharmony_ci#define CDC_WSA_BOOST_PATH_CLK_ENABLE BIT(4) 15462306a36Sopenharmony_ci#define CDC_WSA_BOOST_PATH_CLK_DISABLE 0 15562306a36Sopenharmony_ci#define CDC_WSA_BOOST0_BOOST_CTL (0x0504) 15662306a36Sopenharmony_ci#define CDC_WSA_BOOST0_BOOST_CFG1 (0x0508) 15762306a36Sopenharmony_ci#define CDC_WSA_BOOST0_BOOST_CFG2 (0x050C) 15862306a36Sopenharmony_ci#define CDC_WSA_BOOST1_BOOST_PATH_CTL (0x0540) 15962306a36Sopenharmony_ci#define CDC_WSA_BOOST1_BOOST_CTL (0x0544) 16062306a36Sopenharmony_ci#define CDC_WSA_BOOST1_BOOST_CFG1 (0x0548) 16162306a36Sopenharmony_ci#define CDC_WSA_BOOST1_BOOST_CFG2 (0x054C) 16262306a36Sopenharmony_ci#define CDC_WSA_COMPANDER0_CTL0 (0x0580) 16362306a36Sopenharmony_ci#define CDC_WSA_COMPANDER_CLK_EN_MASK BIT(0) 16462306a36Sopenharmony_ci#define CDC_WSA_COMPANDER_CLK_ENABLE BIT(0) 16562306a36Sopenharmony_ci#define CDC_WSA_COMPANDER_SOFT_RST_MASK BIT(1) 16662306a36Sopenharmony_ci#define CDC_WSA_COMPANDER_SOFT_RST_ENABLE BIT(1) 16762306a36Sopenharmony_ci#define CDC_WSA_COMPANDER_HALT_MASK BIT(2) 16862306a36Sopenharmony_ci#define CDC_WSA_COMPANDER_HALT BIT(2) 16962306a36Sopenharmony_ci#define CDC_WSA_COMPANDER0_CTL1 (0x0584) 17062306a36Sopenharmony_ci#define CDC_WSA_COMPANDER0_CTL2 (0x0588) 17162306a36Sopenharmony_ci#define CDC_WSA_COMPANDER0_CTL3 (0x058C) 17262306a36Sopenharmony_ci#define CDC_WSA_COMPANDER0_CTL4 (0x0590) 17362306a36Sopenharmony_ci#define CDC_WSA_COMPANDER0_CTL5 (0x0594) 17462306a36Sopenharmony_ci#define CDC_WSA_COMPANDER0_CTL6 (0x0598) 17562306a36Sopenharmony_ci#define CDC_WSA_COMPANDER0_CTL7 (0x059C) 17662306a36Sopenharmony_ci#define CDC_WSA_COMPANDER1_CTL0 (0x05C0) 17762306a36Sopenharmony_ci#define CDC_WSA_COMPANDER1_CTL1 (0x05C4) 17862306a36Sopenharmony_ci#define CDC_WSA_COMPANDER1_CTL2 (0x05C8) 17962306a36Sopenharmony_ci#define CDC_WSA_COMPANDER1_CTL3 (0x05CC) 18062306a36Sopenharmony_ci#define CDC_WSA_COMPANDER1_CTL4 (0x05D0) 18162306a36Sopenharmony_ci#define CDC_WSA_COMPANDER1_CTL5 (0x05D4) 18262306a36Sopenharmony_ci#define CDC_WSA_COMPANDER1_CTL6 (0x05D8) 18362306a36Sopenharmony_ci#define CDC_WSA_COMPANDER1_CTL7 (0x05DC) 18462306a36Sopenharmony_ci#define CDC_WSA_SOFTCLIP0_CRC (0x0600) 18562306a36Sopenharmony_ci#define CDC_WSA_SOFTCLIP_CLK_EN_MASK BIT(0) 18662306a36Sopenharmony_ci#define CDC_WSA_SOFTCLIP_CLK_ENABLE BIT(0) 18762306a36Sopenharmony_ci#define CDC_WSA_SOFTCLIP0_SOFTCLIP_CTRL (0x0604) 18862306a36Sopenharmony_ci#define CDC_WSA_SOFTCLIP_EN_MASK BIT(0) 18962306a36Sopenharmony_ci#define CDC_WSA_SOFTCLIP_ENABLE BIT(0) 19062306a36Sopenharmony_ci#define CDC_WSA_SOFTCLIP1_CRC (0x0640) 19162306a36Sopenharmony_ci#define CDC_WSA_SOFTCLIP1_SOFTCLIP_CTRL (0x0644) 19262306a36Sopenharmony_ci#define CDC_WSA_EC_HQ0_EC_REF_HQ_PATH_CTL (0x0680) 19362306a36Sopenharmony_ci#define CDC_WSA_EC_HQ_EC_CLK_EN_MASK BIT(0) 19462306a36Sopenharmony_ci#define CDC_WSA_EC_HQ_EC_CLK_ENABLE BIT(0) 19562306a36Sopenharmony_ci#define CDC_WSA_EC_HQ0_EC_REF_HQ_CFG0 (0x0684) 19662306a36Sopenharmony_ci#define CDC_WSA_EC_HQ_EC_REF_PCM_RATE_MASK GENMASK(4, 1) 19762306a36Sopenharmony_ci#define CDC_WSA_EC_HQ_EC_REF_PCM_RATE_48K BIT(3) 19862306a36Sopenharmony_ci#define CDC_WSA_EC_HQ1_EC_REF_HQ_PATH_CTL (0x06C0) 19962306a36Sopenharmony_ci#define CDC_WSA_EC_HQ1_EC_REF_HQ_CFG0 (0x06C4) 20062306a36Sopenharmony_ci#define CDC_WSA_SPLINE_ASRC0_CLK_RST_CTL (0x0700) 20162306a36Sopenharmony_ci#define CDC_WSA_SPLINE_ASRC0_CTL0 (0x0704) 20262306a36Sopenharmony_ci#define CDC_WSA_SPLINE_ASRC0_CTL1 (0x0708) 20362306a36Sopenharmony_ci#define CDC_WSA_SPLINE_ASRC0_FIFO_CTL (0x070C) 20462306a36Sopenharmony_ci#define CDC_WSA_SPLINE_ASRC0_STATUS_FMIN_CNTR_LSB (0x0710) 20562306a36Sopenharmony_ci#define CDC_WSA_SPLINE_ASRC0_STATUS_FMIN_CNTR_MSB (0x0714) 20662306a36Sopenharmony_ci#define CDC_WSA_SPLINE_ASRC0_STATUS_FMAX_CNTR_LSB (0x0718) 20762306a36Sopenharmony_ci#define CDC_WSA_SPLINE_ASRC0_STATUS_FMAX_CNTR_MSB (0x071C) 20862306a36Sopenharmony_ci#define CDC_WSA_SPLINE_ASRC0_STATUS_FIFO (0x0720) 20962306a36Sopenharmony_ci#define CDC_WSA_SPLINE_ASRC1_CLK_RST_CTL (0x0740) 21062306a36Sopenharmony_ci#define CDC_WSA_SPLINE_ASRC1_CTL0 (0x0744) 21162306a36Sopenharmony_ci#define CDC_WSA_SPLINE_ASRC1_CTL1 (0x0748) 21262306a36Sopenharmony_ci#define CDC_WSA_SPLINE_ASRC1_FIFO_CTL (0x074C) 21362306a36Sopenharmony_ci#define CDC_WSA_SPLINE_ASRC1_STATUS_FMIN_CNTR_LSB (0x0750) 21462306a36Sopenharmony_ci#define CDC_WSA_SPLINE_ASRC1_STATUS_FMIN_CNTR_MSB (0x0754) 21562306a36Sopenharmony_ci#define CDC_WSA_SPLINE_ASRC1_STATUS_FMAX_CNTR_LSB (0x0758) 21662306a36Sopenharmony_ci#define CDC_WSA_SPLINE_ASRC1_STATUS_FMAX_CNTR_MSB (0x075C) 21762306a36Sopenharmony_ci#define CDC_WSA_SPLINE_ASRC1_STATUS_FIFO (0x0760) 21862306a36Sopenharmony_ci#define WSA_MAX_OFFSET (0x0760) 21962306a36Sopenharmony_ci 22062306a36Sopenharmony_ci#define WSA_MACRO_RX_RATES (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 |\ 22162306a36Sopenharmony_ci SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 |\ 22262306a36Sopenharmony_ci SNDRV_PCM_RATE_96000 | SNDRV_PCM_RATE_192000) 22362306a36Sopenharmony_ci#define WSA_MACRO_RX_MIX_RATES (SNDRV_PCM_RATE_48000 |\ 22462306a36Sopenharmony_ci SNDRV_PCM_RATE_96000 | SNDRV_PCM_RATE_192000) 22562306a36Sopenharmony_ci#define WSA_MACRO_RX_FORMATS (SNDRV_PCM_FMTBIT_S16_LE |\ 22662306a36Sopenharmony_ci SNDRV_PCM_FMTBIT_S24_LE |\ 22762306a36Sopenharmony_ci SNDRV_PCM_FMTBIT_S24_3LE | SNDRV_PCM_FMTBIT_S32_LE) 22862306a36Sopenharmony_ci 22962306a36Sopenharmony_ci#define WSA_MACRO_ECHO_RATES (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 |\ 23062306a36Sopenharmony_ci SNDRV_PCM_RATE_48000) 23162306a36Sopenharmony_ci#define WSA_MACRO_ECHO_FORMATS (SNDRV_PCM_FMTBIT_S16_LE |\ 23262306a36Sopenharmony_ci SNDRV_PCM_FMTBIT_S24_LE |\ 23362306a36Sopenharmony_ci SNDRV_PCM_FMTBIT_S24_3LE) 23462306a36Sopenharmony_ci 23562306a36Sopenharmony_ci#define NUM_INTERPOLATORS 2 23662306a36Sopenharmony_ci#define WSA_NUM_CLKS_MAX 5 23762306a36Sopenharmony_ci#define WSA_MACRO_MCLK_FREQ 19200000 23862306a36Sopenharmony_ci#define WSA_MACRO_MUX_INP_MASK2 0x38 23962306a36Sopenharmony_ci#define WSA_MACRO_MUX_CFG_OFFSET 0x8 24062306a36Sopenharmony_ci#define WSA_MACRO_MUX_CFG1_OFFSET 0x4 24162306a36Sopenharmony_ci#define WSA_MACRO_RX_COMP_OFFSET 0x40 24262306a36Sopenharmony_ci#define WSA_MACRO_RX_SOFTCLIP_OFFSET 0x40 24362306a36Sopenharmony_ci#define WSA_MACRO_RX_PATH_OFFSET 0x80 24462306a36Sopenharmony_ci#define WSA_MACRO_RX_PATH_CFG3_OFFSET 0x10 24562306a36Sopenharmony_ci#define WSA_MACRO_RX_PATH_DSMDEM_OFFSET 0x4C 24662306a36Sopenharmony_ci#define WSA_MACRO_FS_RATE_MASK 0x0F 24762306a36Sopenharmony_ci#define WSA_MACRO_EC_MIX_TX0_MASK 0x03 24862306a36Sopenharmony_ci#define WSA_MACRO_EC_MIX_TX1_MASK 0x18 24962306a36Sopenharmony_ci#define WSA_MACRO_MAX_DMA_CH_PER_PORT 0x2 25062306a36Sopenharmony_ci 25162306a36Sopenharmony_cienum { 25262306a36Sopenharmony_ci WSA_MACRO_GAIN_OFFSET_M1P5_DB, 25362306a36Sopenharmony_ci WSA_MACRO_GAIN_OFFSET_0_DB, 25462306a36Sopenharmony_ci}; 25562306a36Sopenharmony_cienum { 25662306a36Sopenharmony_ci WSA_MACRO_RX0 = 0, 25762306a36Sopenharmony_ci WSA_MACRO_RX1, 25862306a36Sopenharmony_ci WSA_MACRO_RX_MIX, 25962306a36Sopenharmony_ci WSA_MACRO_RX_MIX0 = WSA_MACRO_RX_MIX, 26062306a36Sopenharmony_ci WSA_MACRO_RX_MIX1, 26162306a36Sopenharmony_ci WSA_MACRO_RX_MAX, 26262306a36Sopenharmony_ci}; 26362306a36Sopenharmony_ci 26462306a36Sopenharmony_cienum { 26562306a36Sopenharmony_ci WSA_MACRO_TX0 = 0, 26662306a36Sopenharmony_ci WSA_MACRO_TX1, 26762306a36Sopenharmony_ci WSA_MACRO_TX_MAX, 26862306a36Sopenharmony_ci}; 26962306a36Sopenharmony_ci 27062306a36Sopenharmony_cienum { 27162306a36Sopenharmony_ci WSA_MACRO_EC0_MUX = 0, 27262306a36Sopenharmony_ci WSA_MACRO_EC1_MUX, 27362306a36Sopenharmony_ci WSA_MACRO_EC_MUX_MAX, 27462306a36Sopenharmony_ci}; 27562306a36Sopenharmony_ci 27662306a36Sopenharmony_cienum { 27762306a36Sopenharmony_ci WSA_MACRO_COMP1, /* SPK_L */ 27862306a36Sopenharmony_ci WSA_MACRO_COMP2, /* SPK_R */ 27962306a36Sopenharmony_ci WSA_MACRO_COMP_MAX 28062306a36Sopenharmony_ci}; 28162306a36Sopenharmony_ci 28262306a36Sopenharmony_cienum { 28362306a36Sopenharmony_ci WSA_MACRO_SOFTCLIP0, /* RX0 */ 28462306a36Sopenharmony_ci WSA_MACRO_SOFTCLIP1, /* RX1 */ 28562306a36Sopenharmony_ci WSA_MACRO_SOFTCLIP_MAX 28662306a36Sopenharmony_ci}; 28762306a36Sopenharmony_ci 28862306a36Sopenharmony_cienum { 28962306a36Sopenharmony_ci INTn_1_INP_SEL_ZERO = 0, 29062306a36Sopenharmony_ci INTn_1_INP_SEL_RX0, 29162306a36Sopenharmony_ci INTn_1_INP_SEL_RX1, 29262306a36Sopenharmony_ci INTn_1_INP_SEL_RX2, 29362306a36Sopenharmony_ci INTn_1_INP_SEL_RX3, 29462306a36Sopenharmony_ci INTn_1_INP_SEL_DEC0, 29562306a36Sopenharmony_ci INTn_1_INP_SEL_DEC1, 29662306a36Sopenharmony_ci}; 29762306a36Sopenharmony_ci 29862306a36Sopenharmony_cienum { 29962306a36Sopenharmony_ci INTn_2_INP_SEL_ZERO = 0, 30062306a36Sopenharmony_ci INTn_2_INP_SEL_RX0, 30162306a36Sopenharmony_ci INTn_2_INP_SEL_RX1, 30262306a36Sopenharmony_ci INTn_2_INP_SEL_RX2, 30362306a36Sopenharmony_ci INTn_2_INP_SEL_RX3, 30462306a36Sopenharmony_ci}; 30562306a36Sopenharmony_ci 30662306a36Sopenharmony_cistruct interp_sample_rate { 30762306a36Sopenharmony_ci int sample_rate; 30862306a36Sopenharmony_ci int rate_val; 30962306a36Sopenharmony_ci}; 31062306a36Sopenharmony_ci 31162306a36Sopenharmony_cistatic struct interp_sample_rate int_prim_sample_rate_val[] = { 31262306a36Sopenharmony_ci {8000, 0x0}, /* 8K */ 31362306a36Sopenharmony_ci {16000, 0x1}, /* 16K */ 31462306a36Sopenharmony_ci {24000, -EINVAL},/* 24K */ 31562306a36Sopenharmony_ci {32000, 0x3}, /* 32K */ 31662306a36Sopenharmony_ci {48000, 0x4}, /* 48K */ 31762306a36Sopenharmony_ci {96000, 0x5}, /* 96K */ 31862306a36Sopenharmony_ci {192000, 0x6}, /* 192K */ 31962306a36Sopenharmony_ci {384000, 0x7}, /* 384K */ 32062306a36Sopenharmony_ci {44100, 0x8}, /* 44.1K */ 32162306a36Sopenharmony_ci}; 32262306a36Sopenharmony_ci 32362306a36Sopenharmony_cistatic struct interp_sample_rate int_mix_sample_rate_val[] = { 32462306a36Sopenharmony_ci {48000, 0x4}, /* 48K */ 32562306a36Sopenharmony_ci {96000, 0x5}, /* 96K */ 32662306a36Sopenharmony_ci {192000, 0x6}, /* 192K */ 32762306a36Sopenharmony_ci}; 32862306a36Sopenharmony_ci 32962306a36Sopenharmony_cienum { 33062306a36Sopenharmony_ci WSA_MACRO_AIF_INVALID = 0, 33162306a36Sopenharmony_ci WSA_MACRO_AIF1_PB, 33262306a36Sopenharmony_ci WSA_MACRO_AIF_MIX1_PB, 33362306a36Sopenharmony_ci WSA_MACRO_AIF_VI, 33462306a36Sopenharmony_ci WSA_MACRO_AIF_ECHO, 33562306a36Sopenharmony_ci WSA_MACRO_MAX_DAIS, 33662306a36Sopenharmony_ci}; 33762306a36Sopenharmony_ci 33862306a36Sopenharmony_cistruct wsa_macro { 33962306a36Sopenharmony_ci struct device *dev; 34062306a36Sopenharmony_ci int comp_enabled[WSA_MACRO_COMP_MAX]; 34162306a36Sopenharmony_ci int ec_hq[WSA_MACRO_RX1 + 1]; 34262306a36Sopenharmony_ci u16 prim_int_users[WSA_MACRO_RX1 + 1]; 34362306a36Sopenharmony_ci u16 wsa_mclk_users; 34462306a36Sopenharmony_ci unsigned long active_ch_mask[WSA_MACRO_MAX_DAIS]; 34562306a36Sopenharmony_ci unsigned long active_ch_cnt[WSA_MACRO_MAX_DAIS]; 34662306a36Sopenharmony_ci int rx_port_value[WSA_MACRO_RX_MAX]; 34762306a36Sopenharmony_ci int ear_spkr_gain; 34862306a36Sopenharmony_ci int spkr_gain_offset; 34962306a36Sopenharmony_ci int spkr_mode; 35062306a36Sopenharmony_ci int is_softclip_on[WSA_MACRO_SOFTCLIP_MAX]; 35162306a36Sopenharmony_ci int softclip_clk_users[WSA_MACRO_SOFTCLIP_MAX]; 35262306a36Sopenharmony_ci struct regmap *regmap; 35362306a36Sopenharmony_ci struct clk *mclk; 35462306a36Sopenharmony_ci struct clk *npl; 35562306a36Sopenharmony_ci struct clk *macro; 35662306a36Sopenharmony_ci struct clk *dcodec; 35762306a36Sopenharmony_ci struct clk *fsgen; 35862306a36Sopenharmony_ci struct clk_hw hw; 35962306a36Sopenharmony_ci}; 36062306a36Sopenharmony_ci#define to_wsa_macro(_hw) container_of(_hw, struct wsa_macro, hw) 36162306a36Sopenharmony_ci 36262306a36Sopenharmony_cistatic const DECLARE_TLV_DB_SCALE(digital_gain, -8400, 100, -8400); 36362306a36Sopenharmony_ci 36462306a36Sopenharmony_cistatic const char *const rx_text[] = { 36562306a36Sopenharmony_ci "ZERO", "RX0", "RX1", "RX_MIX0", "RX_MIX1", "DEC0", "DEC1" 36662306a36Sopenharmony_ci}; 36762306a36Sopenharmony_ci 36862306a36Sopenharmony_cistatic const char *const rx_mix_text[] = { 36962306a36Sopenharmony_ci "ZERO", "RX0", "RX1", "RX_MIX0", "RX_MIX1" 37062306a36Sopenharmony_ci}; 37162306a36Sopenharmony_ci 37262306a36Sopenharmony_cistatic const char *const rx_mix_ec_text[] = { 37362306a36Sopenharmony_ci "ZERO", "RX_MIX_TX0", "RX_MIX_TX1" 37462306a36Sopenharmony_ci}; 37562306a36Sopenharmony_ci 37662306a36Sopenharmony_cistatic const char *const rx_mux_text[] = { 37762306a36Sopenharmony_ci "ZERO", "AIF1_PB", "AIF_MIX1_PB" 37862306a36Sopenharmony_ci}; 37962306a36Sopenharmony_ci 38062306a36Sopenharmony_cistatic const char *const rx_sidetone_mix_text[] = { 38162306a36Sopenharmony_ci "ZERO", "SRC0" 38262306a36Sopenharmony_ci}; 38362306a36Sopenharmony_ci 38462306a36Sopenharmony_cistatic const char * const wsa_macro_ear_spkr_pa_gain_text[] = { 38562306a36Sopenharmony_ci "G_DEFAULT", "G_0_DB", "G_1_DB", "G_2_DB", "G_3_DB", 38662306a36Sopenharmony_ci "G_4_DB", "G_5_DB", "G_6_DB" 38762306a36Sopenharmony_ci}; 38862306a36Sopenharmony_ci 38962306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_EXT_DECL(wsa_macro_ear_spkr_pa_gain_enum, 39062306a36Sopenharmony_ci wsa_macro_ear_spkr_pa_gain_text); 39162306a36Sopenharmony_ci 39262306a36Sopenharmony_ci/* RX INT0 */ 39362306a36Sopenharmony_cistatic const struct soc_enum rx0_prim_inp0_chain_enum = 39462306a36Sopenharmony_ci SOC_ENUM_SINGLE(CDC_WSA_RX_INP_MUX_RX_INT0_CFG0, 39562306a36Sopenharmony_ci 0, 7, rx_text); 39662306a36Sopenharmony_ci 39762306a36Sopenharmony_cistatic const struct soc_enum rx0_prim_inp1_chain_enum = 39862306a36Sopenharmony_ci SOC_ENUM_SINGLE(CDC_WSA_RX_INP_MUX_RX_INT0_CFG0, 39962306a36Sopenharmony_ci 3, 7, rx_text); 40062306a36Sopenharmony_ci 40162306a36Sopenharmony_cistatic const struct soc_enum rx0_prim_inp2_chain_enum = 40262306a36Sopenharmony_ci SOC_ENUM_SINGLE(CDC_WSA_RX_INP_MUX_RX_INT0_CFG1, 40362306a36Sopenharmony_ci 3, 7, rx_text); 40462306a36Sopenharmony_ci 40562306a36Sopenharmony_cistatic const struct soc_enum rx0_mix_chain_enum = 40662306a36Sopenharmony_ci SOC_ENUM_SINGLE(CDC_WSA_RX_INP_MUX_RX_INT0_CFG1, 40762306a36Sopenharmony_ci 0, 5, rx_mix_text); 40862306a36Sopenharmony_ci 40962306a36Sopenharmony_cistatic const struct soc_enum rx0_sidetone_mix_enum = 41062306a36Sopenharmony_ci SOC_ENUM_SINGLE(SND_SOC_NOPM, 0, 2, rx_sidetone_mix_text); 41162306a36Sopenharmony_ci 41262306a36Sopenharmony_cistatic const struct snd_kcontrol_new rx0_prim_inp0_mux = 41362306a36Sopenharmony_ci SOC_DAPM_ENUM("WSA_RX0 INP0 Mux", rx0_prim_inp0_chain_enum); 41462306a36Sopenharmony_ci 41562306a36Sopenharmony_cistatic const struct snd_kcontrol_new rx0_prim_inp1_mux = 41662306a36Sopenharmony_ci SOC_DAPM_ENUM("WSA_RX0 INP1 Mux", rx0_prim_inp1_chain_enum); 41762306a36Sopenharmony_ci 41862306a36Sopenharmony_cistatic const struct snd_kcontrol_new rx0_prim_inp2_mux = 41962306a36Sopenharmony_ci SOC_DAPM_ENUM("WSA_RX0 INP2 Mux", rx0_prim_inp2_chain_enum); 42062306a36Sopenharmony_ci 42162306a36Sopenharmony_cistatic const struct snd_kcontrol_new rx0_mix_mux = 42262306a36Sopenharmony_ci SOC_DAPM_ENUM("WSA_RX0 MIX Mux", rx0_mix_chain_enum); 42362306a36Sopenharmony_ci 42462306a36Sopenharmony_cistatic const struct snd_kcontrol_new rx0_sidetone_mix_mux = 42562306a36Sopenharmony_ci SOC_DAPM_ENUM("WSA_RX0 SIDETONE MIX Mux", rx0_sidetone_mix_enum); 42662306a36Sopenharmony_ci 42762306a36Sopenharmony_ci/* RX INT1 */ 42862306a36Sopenharmony_cistatic const struct soc_enum rx1_prim_inp0_chain_enum = 42962306a36Sopenharmony_ci SOC_ENUM_SINGLE(CDC_WSA_RX_INP_MUX_RX_INT1_CFG0, 43062306a36Sopenharmony_ci 0, 7, rx_text); 43162306a36Sopenharmony_ci 43262306a36Sopenharmony_cistatic const struct soc_enum rx1_prim_inp1_chain_enum = 43362306a36Sopenharmony_ci SOC_ENUM_SINGLE(CDC_WSA_RX_INP_MUX_RX_INT1_CFG0, 43462306a36Sopenharmony_ci 3, 7, rx_text); 43562306a36Sopenharmony_ci 43662306a36Sopenharmony_cistatic const struct soc_enum rx1_prim_inp2_chain_enum = 43762306a36Sopenharmony_ci SOC_ENUM_SINGLE(CDC_WSA_RX_INP_MUX_RX_INT1_CFG1, 43862306a36Sopenharmony_ci 3, 7, rx_text); 43962306a36Sopenharmony_ci 44062306a36Sopenharmony_cistatic const struct soc_enum rx1_mix_chain_enum = 44162306a36Sopenharmony_ci SOC_ENUM_SINGLE(CDC_WSA_RX_INP_MUX_RX_INT1_CFG1, 44262306a36Sopenharmony_ci 0, 5, rx_mix_text); 44362306a36Sopenharmony_ci 44462306a36Sopenharmony_cistatic const struct snd_kcontrol_new rx1_prim_inp0_mux = 44562306a36Sopenharmony_ci SOC_DAPM_ENUM("WSA_RX1 INP0 Mux", rx1_prim_inp0_chain_enum); 44662306a36Sopenharmony_ci 44762306a36Sopenharmony_cistatic const struct snd_kcontrol_new rx1_prim_inp1_mux = 44862306a36Sopenharmony_ci SOC_DAPM_ENUM("WSA_RX1 INP1 Mux", rx1_prim_inp1_chain_enum); 44962306a36Sopenharmony_ci 45062306a36Sopenharmony_cistatic const struct snd_kcontrol_new rx1_prim_inp2_mux = 45162306a36Sopenharmony_ci SOC_DAPM_ENUM("WSA_RX1 INP2 Mux", rx1_prim_inp2_chain_enum); 45262306a36Sopenharmony_ci 45362306a36Sopenharmony_cistatic const struct snd_kcontrol_new rx1_mix_mux = 45462306a36Sopenharmony_ci SOC_DAPM_ENUM("WSA_RX1 MIX Mux", rx1_mix_chain_enum); 45562306a36Sopenharmony_ci 45662306a36Sopenharmony_cistatic const struct soc_enum rx_mix_ec0_enum = 45762306a36Sopenharmony_ci SOC_ENUM_SINGLE(CDC_WSA_RX_INP_MUX_RX_MIX_CFG0, 45862306a36Sopenharmony_ci 0, 3, rx_mix_ec_text); 45962306a36Sopenharmony_ci 46062306a36Sopenharmony_cistatic const struct soc_enum rx_mix_ec1_enum = 46162306a36Sopenharmony_ci SOC_ENUM_SINGLE(CDC_WSA_RX_INP_MUX_RX_MIX_CFG0, 46262306a36Sopenharmony_ci 3, 3, rx_mix_ec_text); 46362306a36Sopenharmony_ci 46462306a36Sopenharmony_cistatic const struct snd_kcontrol_new rx_mix_ec0_mux = 46562306a36Sopenharmony_ci SOC_DAPM_ENUM("WSA RX_MIX EC0_Mux", rx_mix_ec0_enum); 46662306a36Sopenharmony_ci 46762306a36Sopenharmony_cistatic const struct snd_kcontrol_new rx_mix_ec1_mux = 46862306a36Sopenharmony_ci SOC_DAPM_ENUM("WSA RX_MIX EC1_Mux", rx_mix_ec1_enum); 46962306a36Sopenharmony_ci 47062306a36Sopenharmony_cistatic const struct reg_default wsa_defaults[] = { 47162306a36Sopenharmony_ci /* WSA Macro */ 47262306a36Sopenharmony_ci { CDC_WSA_CLK_RST_CTRL_MCLK_CONTROL, 0x00}, 47362306a36Sopenharmony_ci { CDC_WSA_CLK_RST_CTRL_FS_CNT_CONTROL, 0x00}, 47462306a36Sopenharmony_ci { CDC_WSA_CLK_RST_CTRL_SWR_CONTROL, 0x00}, 47562306a36Sopenharmony_ci { CDC_WSA_TOP_TOP_CFG0, 0x00}, 47662306a36Sopenharmony_ci { CDC_WSA_TOP_TOP_CFG1, 0x00}, 47762306a36Sopenharmony_ci { CDC_WSA_TOP_FREQ_MCLK, 0x00}, 47862306a36Sopenharmony_ci { CDC_WSA_TOP_DEBUG_BUS_SEL, 0x00}, 47962306a36Sopenharmony_ci { CDC_WSA_TOP_DEBUG_EN0, 0x00}, 48062306a36Sopenharmony_ci { CDC_WSA_TOP_DEBUG_EN1, 0x00}, 48162306a36Sopenharmony_ci { CDC_WSA_TOP_DEBUG_DSM_LB, 0x88}, 48262306a36Sopenharmony_ci { CDC_WSA_TOP_RX_I2S_CTL, 0x0C}, 48362306a36Sopenharmony_ci { CDC_WSA_TOP_TX_I2S_CTL, 0x0C}, 48462306a36Sopenharmony_ci { CDC_WSA_TOP_I2S_CLK, 0x02}, 48562306a36Sopenharmony_ci { CDC_WSA_TOP_I2S_RESET, 0x00}, 48662306a36Sopenharmony_ci { CDC_WSA_RX_INP_MUX_RX_INT0_CFG0, 0x00}, 48762306a36Sopenharmony_ci { CDC_WSA_RX_INP_MUX_RX_INT0_CFG1, 0x00}, 48862306a36Sopenharmony_ci { CDC_WSA_RX_INP_MUX_RX_INT1_CFG0, 0x00}, 48962306a36Sopenharmony_ci { CDC_WSA_RX_INP_MUX_RX_INT1_CFG1, 0x00}, 49062306a36Sopenharmony_ci { CDC_WSA_RX_INP_MUX_RX_MIX_CFG0, 0x00}, 49162306a36Sopenharmony_ci { CDC_WSA_RX_INP_MUX_RX_EC_CFG0, 0x00}, 49262306a36Sopenharmony_ci { CDC_WSA_RX_INP_MUX_SOFTCLIP_CFG0, 0x00}, 49362306a36Sopenharmony_ci { CDC_WSA_TX0_SPKR_PROT_PATH_CTL, 0x02}, 49462306a36Sopenharmony_ci { CDC_WSA_TX0_SPKR_PROT_PATH_CFG0, 0x00}, 49562306a36Sopenharmony_ci { CDC_WSA_TX1_SPKR_PROT_PATH_CTL, 0x02}, 49662306a36Sopenharmony_ci { CDC_WSA_TX1_SPKR_PROT_PATH_CFG0, 0x00}, 49762306a36Sopenharmony_ci { CDC_WSA_TX2_SPKR_PROT_PATH_CTL, 0x02}, 49862306a36Sopenharmony_ci { CDC_WSA_TX2_SPKR_PROT_PATH_CFG0, 0x00}, 49962306a36Sopenharmony_ci { CDC_WSA_TX3_SPKR_PROT_PATH_CTL, 0x02}, 50062306a36Sopenharmony_ci { CDC_WSA_TX3_SPKR_PROT_PATH_CFG0, 0x00}, 50162306a36Sopenharmony_ci { CDC_WSA_INTR_CTRL_CFG, 0x00}, 50262306a36Sopenharmony_ci { CDC_WSA_INTR_CTRL_CLR_COMMIT, 0x00}, 50362306a36Sopenharmony_ci { CDC_WSA_INTR_CTRL_PIN1_MASK0, 0xFF}, 50462306a36Sopenharmony_ci { CDC_WSA_INTR_CTRL_PIN1_STATUS0, 0x00}, 50562306a36Sopenharmony_ci { CDC_WSA_INTR_CTRL_PIN1_CLEAR0, 0x00}, 50662306a36Sopenharmony_ci { CDC_WSA_INTR_CTRL_PIN2_MASK0, 0xFF}, 50762306a36Sopenharmony_ci { CDC_WSA_INTR_CTRL_PIN2_STATUS0, 0x00}, 50862306a36Sopenharmony_ci { CDC_WSA_INTR_CTRL_PIN2_CLEAR0, 0x00}, 50962306a36Sopenharmony_ci { CDC_WSA_INTR_CTRL_LEVEL0, 0x00}, 51062306a36Sopenharmony_ci { CDC_WSA_INTR_CTRL_BYPASS0, 0x00}, 51162306a36Sopenharmony_ci { CDC_WSA_INTR_CTRL_SET0, 0x00}, 51262306a36Sopenharmony_ci { CDC_WSA_RX0_RX_PATH_CTL, 0x04}, 51362306a36Sopenharmony_ci { CDC_WSA_RX0_RX_PATH_CFG0, 0x00}, 51462306a36Sopenharmony_ci { CDC_WSA_RX0_RX_PATH_CFG1, 0x64}, 51562306a36Sopenharmony_ci { CDC_WSA_RX0_RX_PATH_CFG2, 0x8F}, 51662306a36Sopenharmony_ci { CDC_WSA_RX0_RX_PATH_CFG3, 0x00}, 51762306a36Sopenharmony_ci { CDC_WSA_RX0_RX_VOL_CTL, 0x00}, 51862306a36Sopenharmony_ci { CDC_WSA_RX0_RX_PATH_MIX_CTL, 0x04}, 51962306a36Sopenharmony_ci { CDC_WSA_RX0_RX_PATH_MIX_CFG, 0x7E}, 52062306a36Sopenharmony_ci { CDC_WSA_RX0_RX_VOL_MIX_CTL, 0x00}, 52162306a36Sopenharmony_ci { CDC_WSA_RX0_RX_PATH_SEC0, 0x04}, 52262306a36Sopenharmony_ci { CDC_WSA_RX0_RX_PATH_SEC1, 0x08}, 52362306a36Sopenharmony_ci { CDC_WSA_RX0_RX_PATH_SEC2, 0x00}, 52462306a36Sopenharmony_ci { CDC_WSA_RX0_RX_PATH_SEC3, 0x00}, 52562306a36Sopenharmony_ci { CDC_WSA_RX0_RX_PATH_SEC5, 0x00}, 52662306a36Sopenharmony_ci { CDC_WSA_RX0_RX_PATH_SEC6, 0x00}, 52762306a36Sopenharmony_ci { CDC_WSA_RX0_RX_PATH_SEC7, 0x00}, 52862306a36Sopenharmony_ci { CDC_WSA_RX0_RX_PATH_MIX_SEC0, 0x08}, 52962306a36Sopenharmony_ci { CDC_WSA_RX0_RX_PATH_MIX_SEC1, 0x00}, 53062306a36Sopenharmony_ci { CDC_WSA_RX0_RX_PATH_DSMDEM_CTL, 0x00}, 53162306a36Sopenharmony_ci { CDC_WSA_RX1_RX_PATH_CFG0, 0x00}, 53262306a36Sopenharmony_ci { CDC_WSA_RX1_RX_PATH_CFG1, 0x64}, 53362306a36Sopenharmony_ci { CDC_WSA_RX1_RX_PATH_CFG2, 0x8F}, 53462306a36Sopenharmony_ci { CDC_WSA_RX1_RX_PATH_CFG3, 0x00}, 53562306a36Sopenharmony_ci { CDC_WSA_RX1_RX_VOL_CTL, 0x00}, 53662306a36Sopenharmony_ci { CDC_WSA_RX1_RX_PATH_MIX_CTL, 0x04}, 53762306a36Sopenharmony_ci { CDC_WSA_RX1_RX_PATH_MIX_CFG, 0x7E}, 53862306a36Sopenharmony_ci { CDC_WSA_RX1_RX_VOL_MIX_CTL, 0x00}, 53962306a36Sopenharmony_ci { CDC_WSA_RX1_RX_PATH_SEC0, 0x04}, 54062306a36Sopenharmony_ci { CDC_WSA_RX1_RX_PATH_SEC1, 0x08}, 54162306a36Sopenharmony_ci { CDC_WSA_RX1_RX_PATH_SEC2, 0x00}, 54262306a36Sopenharmony_ci { CDC_WSA_RX1_RX_PATH_SEC3, 0x00}, 54362306a36Sopenharmony_ci { CDC_WSA_RX1_RX_PATH_SEC5, 0x00}, 54462306a36Sopenharmony_ci { CDC_WSA_RX1_RX_PATH_SEC6, 0x00}, 54562306a36Sopenharmony_ci { CDC_WSA_RX1_RX_PATH_SEC7, 0x00}, 54662306a36Sopenharmony_ci { CDC_WSA_RX1_RX_PATH_MIX_SEC0, 0x08}, 54762306a36Sopenharmony_ci { CDC_WSA_RX1_RX_PATH_MIX_SEC1, 0x00}, 54862306a36Sopenharmony_ci { CDC_WSA_RX1_RX_PATH_DSMDEM_CTL, 0x00}, 54962306a36Sopenharmony_ci { CDC_WSA_BOOST0_BOOST_PATH_CTL, 0x00}, 55062306a36Sopenharmony_ci { CDC_WSA_BOOST0_BOOST_CTL, 0xD0}, 55162306a36Sopenharmony_ci { CDC_WSA_BOOST0_BOOST_CFG1, 0x89}, 55262306a36Sopenharmony_ci { CDC_WSA_BOOST0_BOOST_CFG2, 0x04}, 55362306a36Sopenharmony_ci { CDC_WSA_BOOST1_BOOST_PATH_CTL, 0x00}, 55462306a36Sopenharmony_ci { CDC_WSA_BOOST1_BOOST_CTL, 0xD0}, 55562306a36Sopenharmony_ci { CDC_WSA_BOOST1_BOOST_CFG1, 0x89}, 55662306a36Sopenharmony_ci { CDC_WSA_BOOST1_BOOST_CFG2, 0x04}, 55762306a36Sopenharmony_ci { CDC_WSA_COMPANDER0_CTL0, 0x60}, 55862306a36Sopenharmony_ci { CDC_WSA_COMPANDER0_CTL1, 0xDB}, 55962306a36Sopenharmony_ci { CDC_WSA_COMPANDER0_CTL2, 0xFF}, 56062306a36Sopenharmony_ci { CDC_WSA_COMPANDER0_CTL3, 0x35}, 56162306a36Sopenharmony_ci { CDC_WSA_COMPANDER0_CTL4, 0xFF}, 56262306a36Sopenharmony_ci { CDC_WSA_COMPANDER0_CTL5, 0x00}, 56362306a36Sopenharmony_ci { CDC_WSA_COMPANDER0_CTL6, 0x01}, 56462306a36Sopenharmony_ci { CDC_WSA_COMPANDER0_CTL7, 0x28}, 56562306a36Sopenharmony_ci { CDC_WSA_COMPANDER1_CTL0, 0x60}, 56662306a36Sopenharmony_ci { CDC_WSA_COMPANDER1_CTL1, 0xDB}, 56762306a36Sopenharmony_ci { CDC_WSA_COMPANDER1_CTL2, 0xFF}, 56862306a36Sopenharmony_ci { CDC_WSA_COMPANDER1_CTL3, 0x35}, 56962306a36Sopenharmony_ci { CDC_WSA_COMPANDER1_CTL4, 0xFF}, 57062306a36Sopenharmony_ci { CDC_WSA_COMPANDER1_CTL5, 0x00}, 57162306a36Sopenharmony_ci { CDC_WSA_COMPANDER1_CTL6, 0x01}, 57262306a36Sopenharmony_ci { CDC_WSA_COMPANDER1_CTL7, 0x28}, 57362306a36Sopenharmony_ci { CDC_WSA_SOFTCLIP0_CRC, 0x00}, 57462306a36Sopenharmony_ci { CDC_WSA_SOFTCLIP0_SOFTCLIP_CTRL, 0x38}, 57562306a36Sopenharmony_ci { CDC_WSA_SOFTCLIP1_CRC, 0x00}, 57662306a36Sopenharmony_ci { CDC_WSA_SOFTCLIP1_SOFTCLIP_CTRL, 0x38}, 57762306a36Sopenharmony_ci { CDC_WSA_EC_HQ0_EC_REF_HQ_PATH_CTL, 0x00}, 57862306a36Sopenharmony_ci { CDC_WSA_EC_HQ0_EC_REF_HQ_CFG0, 0x01}, 57962306a36Sopenharmony_ci { CDC_WSA_EC_HQ1_EC_REF_HQ_PATH_CTL, 0x00}, 58062306a36Sopenharmony_ci { CDC_WSA_EC_HQ1_EC_REF_HQ_CFG0, 0x01}, 58162306a36Sopenharmony_ci { CDC_WSA_SPLINE_ASRC0_CLK_RST_CTL, 0x00}, 58262306a36Sopenharmony_ci { CDC_WSA_SPLINE_ASRC0_CTL0, 0x00}, 58362306a36Sopenharmony_ci { CDC_WSA_SPLINE_ASRC0_CTL1, 0x00}, 58462306a36Sopenharmony_ci { CDC_WSA_SPLINE_ASRC0_FIFO_CTL, 0xA8}, 58562306a36Sopenharmony_ci { CDC_WSA_SPLINE_ASRC0_STATUS_FMIN_CNTR_LSB, 0x00}, 58662306a36Sopenharmony_ci { CDC_WSA_SPLINE_ASRC0_STATUS_FMIN_CNTR_MSB, 0x00}, 58762306a36Sopenharmony_ci { CDC_WSA_SPLINE_ASRC0_STATUS_FMAX_CNTR_LSB, 0x00}, 58862306a36Sopenharmony_ci { CDC_WSA_SPLINE_ASRC0_STATUS_FMAX_CNTR_MSB, 0x00}, 58962306a36Sopenharmony_ci { CDC_WSA_SPLINE_ASRC0_STATUS_FIFO, 0x00}, 59062306a36Sopenharmony_ci { CDC_WSA_SPLINE_ASRC1_CLK_RST_CTL, 0x00}, 59162306a36Sopenharmony_ci { CDC_WSA_SPLINE_ASRC1_CTL0, 0x00}, 59262306a36Sopenharmony_ci { CDC_WSA_SPLINE_ASRC1_CTL1, 0x00}, 59362306a36Sopenharmony_ci { CDC_WSA_SPLINE_ASRC1_FIFO_CTL, 0xA8}, 59462306a36Sopenharmony_ci { CDC_WSA_SPLINE_ASRC1_STATUS_FMIN_CNTR_LSB, 0x00}, 59562306a36Sopenharmony_ci { CDC_WSA_SPLINE_ASRC1_STATUS_FMIN_CNTR_MSB, 0x00}, 59662306a36Sopenharmony_ci { CDC_WSA_SPLINE_ASRC1_STATUS_FMAX_CNTR_LSB, 0x00}, 59762306a36Sopenharmony_ci { CDC_WSA_SPLINE_ASRC1_STATUS_FMAX_CNTR_MSB, 0x00}, 59862306a36Sopenharmony_ci { CDC_WSA_SPLINE_ASRC1_STATUS_FIFO, 0x00}, 59962306a36Sopenharmony_ci}; 60062306a36Sopenharmony_ci 60162306a36Sopenharmony_cistatic bool wsa_is_wronly_register(struct device *dev, 60262306a36Sopenharmony_ci unsigned int reg) 60362306a36Sopenharmony_ci{ 60462306a36Sopenharmony_ci switch (reg) { 60562306a36Sopenharmony_ci case CDC_WSA_INTR_CTRL_CLR_COMMIT: 60662306a36Sopenharmony_ci case CDC_WSA_INTR_CTRL_PIN1_CLEAR0: 60762306a36Sopenharmony_ci case CDC_WSA_INTR_CTRL_PIN2_CLEAR0: 60862306a36Sopenharmony_ci return true; 60962306a36Sopenharmony_ci } 61062306a36Sopenharmony_ci 61162306a36Sopenharmony_ci return false; 61262306a36Sopenharmony_ci} 61362306a36Sopenharmony_ci 61462306a36Sopenharmony_cistatic bool wsa_is_rw_register(struct device *dev, unsigned int reg) 61562306a36Sopenharmony_ci{ 61662306a36Sopenharmony_ci switch (reg) { 61762306a36Sopenharmony_ci case CDC_WSA_CLK_RST_CTRL_MCLK_CONTROL: 61862306a36Sopenharmony_ci case CDC_WSA_CLK_RST_CTRL_FS_CNT_CONTROL: 61962306a36Sopenharmony_ci case CDC_WSA_CLK_RST_CTRL_SWR_CONTROL: 62062306a36Sopenharmony_ci case CDC_WSA_TOP_TOP_CFG0: 62162306a36Sopenharmony_ci case CDC_WSA_TOP_TOP_CFG1: 62262306a36Sopenharmony_ci case CDC_WSA_TOP_FREQ_MCLK: 62362306a36Sopenharmony_ci case CDC_WSA_TOP_DEBUG_BUS_SEL: 62462306a36Sopenharmony_ci case CDC_WSA_TOP_DEBUG_EN0: 62562306a36Sopenharmony_ci case CDC_WSA_TOP_DEBUG_EN1: 62662306a36Sopenharmony_ci case CDC_WSA_TOP_DEBUG_DSM_LB: 62762306a36Sopenharmony_ci case CDC_WSA_TOP_RX_I2S_CTL: 62862306a36Sopenharmony_ci case CDC_WSA_TOP_TX_I2S_CTL: 62962306a36Sopenharmony_ci case CDC_WSA_TOP_I2S_CLK: 63062306a36Sopenharmony_ci case CDC_WSA_TOP_I2S_RESET: 63162306a36Sopenharmony_ci case CDC_WSA_RX_INP_MUX_RX_INT0_CFG0: 63262306a36Sopenharmony_ci case CDC_WSA_RX_INP_MUX_RX_INT0_CFG1: 63362306a36Sopenharmony_ci case CDC_WSA_RX_INP_MUX_RX_INT1_CFG0: 63462306a36Sopenharmony_ci case CDC_WSA_RX_INP_MUX_RX_INT1_CFG1: 63562306a36Sopenharmony_ci case CDC_WSA_RX_INP_MUX_RX_MIX_CFG0: 63662306a36Sopenharmony_ci case CDC_WSA_RX_INP_MUX_RX_EC_CFG0: 63762306a36Sopenharmony_ci case CDC_WSA_RX_INP_MUX_SOFTCLIP_CFG0: 63862306a36Sopenharmony_ci case CDC_WSA_TX0_SPKR_PROT_PATH_CTL: 63962306a36Sopenharmony_ci case CDC_WSA_TX0_SPKR_PROT_PATH_CFG0: 64062306a36Sopenharmony_ci case CDC_WSA_TX1_SPKR_PROT_PATH_CTL: 64162306a36Sopenharmony_ci case CDC_WSA_TX1_SPKR_PROT_PATH_CFG0: 64262306a36Sopenharmony_ci case CDC_WSA_TX2_SPKR_PROT_PATH_CTL: 64362306a36Sopenharmony_ci case CDC_WSA_TX2_SPKR_PROT_PATH_CFG0: 64462306a36Sopenharmony_ci case CDC_WSA_TX3_SPKR_PROT_PATH_CTL: 64562306a36Sopenharmony_ci case CDC_WSA_TX3_SPKR_PROT_PATH_CFG0: 64662306a36Sopenharmony_ci case CDC_WSA_INTR_CTRL_CFG: 64762306a36Sopenharmony_ci case CDC_WSA_INTR_CTRL_PIN1_MASK0: 64862306a36Sopenharmony_ci case CDC_WSA_INTR_CTRL_PIN2_MASK0: 64962306a36Sopenharmony_ci case CDC_WSA_INTR_CTRL_LEVEL0: 65062306a36Sopenharmony_ci case CDC_WSA_INTR_CTRL_BYPASS0: 65162306a36Sopenharmony_ci case CDC_WSA_INTR_CTRL_SET0: 65262306a36Sopenharmony_ci case CDC_WSA_RX0_RX_PATH_CTL: 65362306a36Sopenharmony_ci case CDC_WSA_RX0_RX_PATH_CFG0: 65462306a36Sopenharmony_ci case CDC_WSA_RX0_RX_PATH_CFG1: 65562306a36Sopenharmony_ci case CDC_WSA_RX0_RX_PATH_CFG2: 65662306a36Sopenharmony_ci case CDC_WSA_RX0_RX_PATH_CFG3: 65762306a36Sopenharmony_ci case CDC_WSA_RX0_RX_VOL_CTL: 65862306a36Sopenharmony_ci case CDC_WSA_RX0_RX_PATH_MIX_CTL: 65962306a36Sopenharmony_ci case CDC_WSA_RX0_RX_PATH_MIX_CFG: 66062306a36Sopenharmony_ci case CDC_WSA_RX0_RX_VOL_MIX_CTL: 66162306a36Sopenharmony_ci case CDC_WSA_RX0_RX_PATH_SEC0: 66262306a36Sopenharmony_ci case CDC_WSA_RX0_RX_PATH_SEC1: 66362306a36Sopenharmony_ci case CDC_WSA_RX0_RX_PATH_SEC2: 66462306a36Sopenharmony_ci case CDC_WSA_RX0_RX_PATH_SEC3: 66562306a36Sopenharmony_ci case CDC_WSA_RX0_RX_PATH_SEC5: 66662306a36Sopenharmony_ci case CDC_WSA_RX0_RX_PATH_SEC6: 66762306a36Sopenharmony_ci case CDC_WSA_RX0_RX_PATH_SEC7: 66862306a36Sopenharmony_ci case CDC_WSA_RX0_RX_PATH_MIX_SEC0: 66962306a36Sopenharmony_ci case CDC_WSA_RX0_RX_PATH_MIX_SEC1: 67062306a36Sopenharmony_ci case CDC_WSA_RX0_RX_PATH_DSMDEM_CTL: 67162306a36Sopenharmony_ci case CDC_WSA_RX1_RX_PATH_CTL: 67262306a36Sopenharmony_ci case CDC_WSA_RX1_RX_PATH_CFG0: 67362306a36Sopenharmony_ci case CDC_WSA_RX1_RX_PATH_CFG1: 67462306a36Sopenharmony_ci case CDC_WSA_RX1_RX_PATH_CFG2: 67562306a36Sopenharmony_ci case CDC_WSA_RX1_RX_PATH_CFG3: 67662306a36Sopenharmony_ci case CDC_WSA_RX1_RX_VOL_CTL: 67762306a36Sopenharmony_ci case CDC_WSA_RX1_RX_PATH_MIX_CTL: 67862306a36Sopenharmony_ci case CDC_WSA_RX1_RX_PATH_MIX_CFG: 67962306a36Sopenharmony_ci case CDC_WSA_RX1_RX_VOL_MIX_CTL: 68062306a36Sopenharmony_ci case CDC_WSA_RX1_RX_PATH_SEC0: 68162306a36Sopenharmony_ci case CDC_WSA_RX1_RX_PATH_SEC1: 68262306a36Sopenharmony_ci case CDC_WSA_RX1_RX_PATH_SEC2: 68362306a36Sopenharmony_ci case CDC_WSA_RX1_RX_PATH_SEC3: 68462306a36Sopenharmony_ci case CDC_WSA_RX1_RX_PATH_SEC5: 68562306a36Sopenharmony_ci case CDC_WSA_RX1_RX_PATH_SEC6: 68662306a36Sopenharmony_ci case CDC_WSA_RX1_RX_PATH_SEC7: 68762306a36Sopenharmony_ci case CDC_WSA_RX1_RX_PATH_MIX_SEC0: 68862306a36Sopenharmony_ci case CDC_WSA_RX1_RX_PATH_MIX_SEC1: 68962306a36Sopenharmony_ci case CDC_WSA_RX1_RX_PATH_DSMDEM_CTL: 69062306a36Sopenharmony_ci case CDC_WSA_BOOST0_BOOST_PATH_CTL: 69162306a36Sopenharmony_ci case CDC_WSA_BOOST0_BOOST_CTL: 69262306a36Sopenharmony_ci case CDC_WSA_BOOST0_BOOST_CFG1: 69362306a36Sopenharmony_ci case CDC_WSA_BOOST0_BOOST_CFG2: 69462306a36Sopenharmony_ci case CDC_WSA_BOOST1_BOOST_PATH_CTL: 69562306a36Sopenharmony_ci case CDC_WSA_BOOST1_BOOST_CTL: 69662306a36Sopenharmony_ci case CDC_WSA_BOOST1_BOOST_CFG1: 69762306a36Sopenharmony_ci case CDC_WSA_BOOST1_BOOST_CFG2: 69862306a36Sopenharmony_ci case CDC_WSA_COMPANDER0_CTL0: 69962306a36Sopenharmony_ci case CDC_WSA_COMPANDER0_CTL1: 70062306a36Sopenharmony_ci case CDC_WSA_COMPANDER0_CTL2: 70162306a36Sopenharmony_ci case CDC_WSA_COMPANDER0_CTL3: 70262306a36Sopenharmony_ci case CDC_WSA_COMPANDER0_CTL4: 70362306a36Sopenharmony_ci case CDC_WSA_COMPANDER0_CTL5: 70462306a36Sopenharmony_ci case CDC_WSA_COMPANDER0_CTL7: 70562306a36Sopenharmony_ci case CDC_WSA_COMPANDER1_CTL0: 70662306a36Sopenharmony_ci case CDC_WSA_COMPANDER1_CTL1: 70762306a36Sopenharmony_ci case CDC_WSA_COMPANDER1_CTL2: 70862306a36Sopenharmony_ci case CDC_WSA_COMPANDER1_CTL3: 70962306a36Sopenharmony_ci case CDC_WSA_COMPANDER1_CTL4: 71062306a36Sopenharmony_ci case CDC_WSA_COMPANDER1_CTL5: 71162306a36Sopenharmony_ci case CDC_WSA_COMPANDER1_CTL7: 71262306a36Sopenharmony_ci case CDC_WSA_SOFTCLIP0_CRC: 71362306a36Sopenharmony_ci case CDC_WSA_SOFTCLIP0_SOFTCLIP_CTRL: 71462306a36Sopenharmony_ci case CDC_WSA_SOFTCLIP1_CRC: 71562306a36Sopenharmony_ci case CDC_WSA_SOFTCLIP1_SOFTCLIP_CTRL: 71662306a36Sopenharmony_ci case CDC_WSA_EC_HQ0_EC_REF_HQ_PATH_CTL: 71762306a36Sopenharmony_ci case CDC_WSA_EC_HQ0_EC_REF_HQ_CFG0: 71862306a36Sopenharmony_ci case CDC_WSA_EC_HQ1_EC_REF_HQ_PATH_CTL: 71962306a36Sopenharmony_ci case CDC_WSA_EC_HQ1_EC_REF_HQ_CFG0: 72062306a36Sopenharmony_ci case CDC_WSA_SPLINE_ASRC0_CLK_RST_CTL: 72162306a36Sopenharmony_ci case CDC_WSA_SPLINE_ASRC0_CTL0: 72262306a36Sopenharmony_ci case CDC_WSA_SPLINE_ASRC0_CTL1: 72362306a36Sopenharmony_ci case CDC_WSA_SPLINE_ASRC0_FIFO_CTL: 72462306a36Sopenharmony_ci case CDC_WSA_SPLINE_ASRC1_CLK_RST_CTL: 72562306a36Sopenharmony_ci case CDC_WSA_SPLINE_ASRC1_CTL0: 72662306a36Sopenharmony_ci case CDC_WSA_SPLINE_ASRC1_CTL1: 72762306a36Sopenharmony_ci case CDC_WSA_SPLINE_ASRC1_FIFO_CTL: 72862306a36Sopenharmony_ci return true; 72962306a36Sopenharmony_ci } 73062306a36Sopenharmony_ci 73162306a36Sopenharmony_ci return false; 73262306a36Sopenharmony_ci} 73362306a36Sopenharmony_ci 73462306a36Sopenharmony_cistatic bool wsa_is_writeable_register(struct device *dev, unsigned int reg) 73562306a36Sopenharmony_ci{ 73662306a36Sopenharmony_ci bool ret; 73762306a36Sopenharmony_ci 73862306a36Sopenharmony_ci ret = wsa_is_rw_register(dev, reg); 73962306a36Sopenharmony_ci if (!ret) 74062306a36Sopenharmony_ci return wsa_is_wronly_register(dev, reg); 74162306a36Sopenharmony_ci 74262306a36Sopenharmony_ci return ret; 74362306a36Sopenharmony_ci} 74462306a36Sopenharmony_ci 74562306a36Sopenharmony_cistatic bool wsa_is_readable_register(struct device *dev, unsigned int reg) 74662306a36Sopenharmony_ci{ 74762306a36Sopenharmony_ci switch (reg) { 74862306a36Sopenharmony_ci case CDC_WSA_INTR_CTRL_CLR_COMMIT: 74962306a36Sopenharmony_ci case CDC_WSA_INTR_CTRL_PIN1_CLEAR0: 75062306a36Sopenharmony_ci case CDC_WSA_INTR_CTRL_PIN2_CLEAR0: 75162306a36Sopenharmony_ci case CDC_WSA_INTR_CTRL_PIN1_STATUS0: 75262306a36Sopenharmony_ci case CDC_WSA_INTR_CTRL_PIN2_STATUS0: 75362306a36Sopenharmony_ci case CDC_WSA_COMPANDER0_CTL6: 75462306a36Sopenharmony_ci case CDC_WSA_COMPANDER1_CTL6: 75562306a36Sopenharmony_ci case CDC_WSA_SPLINE_ASRC0_STATUS_FMIN_CNTR_LSB: 75662306a36Sopenharmony_ci case CDC_WSA_SPLINE_ASRC0_STATUS_FMIN_CNTR_MSB: 75762306a36Sopenharmony_ci case CDC_WSA_SPLINE_ASRC0_STATUS_FMAX_CNTR_LSB: 75862306a36Sopenharmony_ci case CDC_WSA_SPLINE_ASRC0_STATUS_FMAX_CNTR_MSB: 75962306a36Sopenharmony_ci case CDC_WSA_SPLINE_ASRC0_STATUS_FIFO: 76062306a36Sopenharmony_ci case CDC_WSA_SPLINE_ASRC1_STATUS_FMIN_CNTR_LSB: 76162306a36Sopenharmony_ci case CDC_WSA_SPLINE_ASRC1_STATUS_FMIN_CNTR_MSB: 76262306a36Sopenharmony_ci case CDC_WSA_SPLINE_ASRC1_STATUS_FMAX_CNTR_LSB: 76362306a36Sopenharmony_ci case CDC_WSA_SPLINE_ASRC1_STATUS_FMAX_CNTR_MSB: 76462306a36Sopenharmony_ci case CDC_WSA_SPLINE_ASRC1_STATUS_FIFO: 76562306a36Sopenharmony_ci return true; 76662306a36Sopenharmony_ci } 76762306a36Sopenharmony_ci 76862306a36Sopenharmony_ci return wsa_is_rw_register(dev, reg); 76962306a36Sopenharmony_ci} 77062306a36Sopenharmony_ci 77162306a36Sopenharmony_cistatic bool wsa_is_volatile_register(struct device *dev, unsigned int reg) 77262306a36Sopenharmony_ci{ 77362306a36Sopenharmony_ci /* Update volatile list for rx/tx macros */ 77462306a36Sopenharmony_ci switch (reg) { 77562306a36Sopenharmony_ci case CDC_WSA_INTR_CTRL_PIN1_STATUS0: 77662306a36Sopenharmony_ci case CDC_WSA_INTR_CTRL_PIN2_STATUS0: 77762306a36Sopenharmony_ci case CDC_WSA_COMPANDER0_CTL6: 77862306a36Sopenharmony_ci case CDC_WSA_COMPANDER1_CTL6: 77962306a36Sopenharmony_ci case CDC_WSA_SPLINE_ASRC0_STATUS_FMIN_CNTR_LSB: 78062306a36Sopenharmony_ci case CDC_WSA_SPLINE_ASRC0_STATUS_FMIN_CNTR_MSB: 78162306a36Sopenharmony_ci case CDC_WSA_SPLINE_ASRC0_STATUS_FMAX_CNTR_LSB: 78262306a36Sopenharmony_ci case CDC_WSA_SPLINE_ASRC0_STATUS_FMAX_CNTR_MSB: 78362306a36Sopenharmony_ci case CDC_WSA_SPLINE_ASRC0_STATUS_FIFO: 78462306a36Sopenharmony_ci case CDC_WSA_SPLINE_ASRC1_STATUS_FMIN_CNTR_LSB: 78562306a36Sopenharmony_ci case CDC_WSA_SPLINE_ASRC1_STATUS_FMIN_CNTR_MSB: 78662306a36Sopenharmony_ci case CDC_WSA_SPLINE_ASRC1_STATUS_FMAX_CNTR_LSB: 78762306a36Sopenharmony_ci case CDC_WSA_SPLINE_ASRC1_STATUS_FMAX_CNTR_MSB: 78862306a36Sopenharmony_ci case CDC_WSA_SPLINE_ASRC1_STATUS_FIFO: 78962306a36Sopenharmony_ci return true; 79062306a36Sopenharmony_ci } 79162306a36Sopenharmony_ci return false; 79262306a36Sopenharmony_ci} 79362306a36Sopenharmony_ci 79462306a36Sopenharmony_cistatic const struct regmap_config wsa_regmap_config = { 79562306a36Sopenharmony_ci .name = "wsa_macro", 79662306a36Sopenharmony_ci .reg_bits = 16, 79762306a36Sopenharmony_ci .val_bits = 32, /* 8 but with 32 bit read/write */ 79862306a36Sopenharmony_ci .reg_stride = 4, 79962306a36Sopenharmony_ci .cache_type = REGCACHE_FLAT, 80062306a36Sopenharmony_ci .reg_defaults = wsa_defaults, 80162306a36Sopenharmony_ci .num_reg_defaults = ARRAY_SIZE(wsa_defaults), 80262306a36Sopenharmony_ci .max_register = WSA_MAX_OFFSET, 80362306a36Sopenharmony_ci .writeable_reg = wsa_is_writeable_register, 80462306a36Sopenharmony_ci .volatile_reg = wsa_is_volatile_register, 80562306a36Sopenharmony_ci .readable_reg = wsa_is_readable_register, 80662306a36Sopenharmony_ci}; 80762306a36Sopenharmony_ci 80862306a36Sopenharmony_ci/** 80962306a36Sopenharmony_ci * wsa_macro_set_spkr_mode - Configures speaker compander and smartboost 81062306a36Sopenharmony_ci * settings based on speaker mode. 81162306a36Sopenharmony_ci * 81262306a36Sopenharmony_ci * @component: codec instance 81362306a36Sopenharmony_ci * @mode: Indicates speaker configuration mode. 81462306a36Sopenharmony_ci * 81562306a36Sopenharmony_ci * Returns 0 on success or -EINVAL on error. 81662306a36Sopenharmony_ci */ 81762306a36Sopenharmony_ciint wsa_macro_set_spkr_mode(struct snd_soc_component *component, int mode) 81862306a36Sopenharmony_ci{ 81962306a36Sopenharmony_ci struct wsa_macro *wsa = snd_soc_component_get_drvdata(component); 82062306a36Sopenharmony_ci 82162306a36Sopenharmony_ci wsa->spkr_mode = mode; 82262306a36Sopenharmony_ci 82362306a36Sopenharmony_ci switch (mode) { 82462306a36Sopenharmony_ci case WSA_MACRO_SPKR_MODE_1: 82562306a36Sopenharmony_ci snd_soc_component_update_bits(component, CDC_WSA_COMPANDER0_CTL3, 0x80, 0x00); 82662306a36Sopenharmony_ci snd_soc_component_update_bits(component, CDC_WSA_COMPANDER1_CTL3, 0x80, 0x00); 82762306a36Sopenharmony_ci snd_soc_component_update_bits(component, CDC_WSA_COMPANDER0_CTL7, 0x01, 0x00); 82862306a36Sopenharmony_ci snd_soc_component_update_bits(component, CDC_WSA_COMPANDER1_CTL7, 0x01, 0x00); 82962306a36Sopenharmony_ci snd_soc_component_update_bits(component, CDC_WSA_BOOST0_BOOST_CTL, 0x7C, 0x44); 83062306a36Sopenharmony_ci snd_soc_component_update_bits(component, CDC_WSA_BOOST1_BOOST_CTL, 0x7C, 0x44); 83162306a36Sopenharmony_ci break; 83262306a36Sopenharmony_ci default: 83362306a36Sopenharmony_ci snd_soc_component_update_bits(component, CDC_WSA_COMPANDER0_CTL3, 0x80, 0x80); 83462306a36Sopenharmony_ci snd_soc_component_update_bits(component, CDC_WSA_COMPANDER1_CTL3, 0x80, 0x80); 83562306a36Sopenharmony_ci snd_soc_component_update_bits(component, CDC_WSA_COMPANDER0_CTL7, 0x01, 0x01); 83662306a36Sopenharmony_ci snd_soc_component_update_bits(component, CDC_WSA_COMPANDER1_CTL7, 0x01, 0x01); 83762306a36Sopenharmony_ci snd_soc_component_update_bits(component, CDC_WSA_BOOST0_BOOST_CTL, 0x7C, 0x58); 83862306a36Sopenharmony_ci snd_soc_component_update_bits(component, CDC_WSA_BOOST1_BOOST_CTL, 0x7C, 0x58); 83962306a36Sopenharmony_ci break; 84062306a36Sopenharmony_ci } 84162306a36Sopenharmony_ci return 0; 84262306a36Sopenharmony_ci} 84362306a36Sopenharmony_ciEXPORT_SYMBOL(wsa_macro_set_spkr_mode); 84462306a36Sopenharmony_ci 84562306a36Sopenharmony_cistatic int wsa_macro_set_prim_interpolator_rate(struct snd_soc_dai *dai, 84662306a36Sopenharmony_ci u8 int_prim_fs_rate_reg_val, 84762306a36Sopenharmony_ci u32 sample_rate) 84862306a36Sopenharmony_ci{ 84962306a36Sopenharmony_ci u8 int_1_mix1_inp; 85062306a36Sopenharmony_ci u32 j, port; 85162306a36Sopenharmony_ci u16 int_mux_cfg0, int_mux_cfg1; 85262306a36Sopenharmony_ci u16 int_fs_reg; 85362306a36Sopenharmony_ci u8 inp0_sel, inp1_sel, inp2_sel; 85462306a36Sopenharmony_ci struct snd_soc_component *component = dai->component; 85562306a36Sopenharmony_ci struct wsa_macro *wsa = snd_soc_component_get_drvdata(component); 85662306a36Sopenharmony_ci 85762306a36Sopenharmony_ci for_each_set_bit(port, &wsa->active_ch_mask[dai->id], WSA_MACRO_RX_MAX) { 85862306a36Sopenharmony_ci int_1_mix1_inp = port; 85962306a36Sopenharmony_ci if ((int_1_mix1_inp < WSA_MACRO_RX0) || (int_1_mix1_inp > WSA_MACRO_RX_MIX1)) { 86062306a36Sopenharmony_ci dev_err(component->dev, "%s: Invalid RX port, Dai ID is %d\n", 86162306a36Sopenharmony_ci __func__, dai->id); 86262306a36Sopenharmony_ci return -EINVAL; 86362306a36Sopenharmony_ci } 86462306a36Sopenharmony_ci 86562306a36Sopenharmony_ci int_mux_cfg0 = CDC_WSA_RX_INP_MUX_RX_INT0_CFG0; 86662306a36Sopenharmony_ci 86762306a36Sopenharmony_ci /* 86862306a36Sopenharmony_ci * Loop through all interpolator MUX inputs and find out 86962306a36Sopenharmony_ci * to which interpolator input, the cdc_dma rx port 87062306a36Sopenharmony_ci * is connected 87162306a36Sopenharmony_ci */ 87262306a36Sopenharmony_ci for (j = 0; j < NUM_INTERPOLATORS; j++) { 87362306a36Sopenharmony_ci int_mux_cfg1 = int_mux_cfg0 + WSA_MACRO_MUX_CFG1_OFFSET; 87462306a36Sopenharmony_ci inp0_sel = snd_soc_component_read_field(component, int_mux_cfg0, 87562306a36Sopenharmony_ci CDC_WSA_RX_INTX_1_MIX_INP0_SEL_MASK); 87662306a36Sopenharmony_ci inp1_sel = snd_soc_component_read_field(component, int_mux_cfg0, 87762306a36Sopenharmony_ci CDC_WSA_RX_INTX_1_MIX_INP1_SEL_MASK); 87862306a36Sopenharmony_ci inp2_sel = snd_soc_component_read_field(component, int_mux_cfg1, 87962306a36Sopenharmony_ci CDC_WSA_RX_INTX_1_MIX_INP2_SEL_MASK); 88062306a36Sopenharmony_ci 88162306a36Sopenharmony_ci if ((inp0_sel == int_1_mix1_inp + INTn_1_INP_SEL_RX0) || 88262306a36Sopenharmony_ci (inp1_sel == int_1_mix1_inp + INTn_1_INP_SEL_RX0) || 88362306a36Sopenharmony_ci (inp2_sel == int_1_mix1_inp + INTn_1_INP_SEL_RX0)) { 88462306a36Sopenharmony_ci int_fs_reg = CDC_WSA_RX0_RX_PATH_CTL + 88562306a36Sopenharmony_ci WSA_MACRO_RX_PATH_OFFSET * j; 88662306a36Sopenharmony_ci /* sample_rate is in Hz */ 88762306a36Sopenharmony_ci snd_soc_component_update_bits(component, int_fs_reg, 88862306a36Sopenharmony_ci WSA_MACRO_FS_RATE_MASK, 88962306a36Sopenharmony_ci int_prim_fs_rate_reg_val); 89062306a36Sopenharmony_ci } 89162306a36Sopenharmony_ci int_mux_cfg0 += WSA_MACRO_MUX_CFG_OFFSET; 89262306a36Sopenharmony_ci } 89362306a36Sopenharmony_ci } 89462306a36Sopenharmony_ci 89562306a36Sopenharmony_ci return 0; 89662306a36Sopenharmony_ci} 89762306a36Sopenharmony_ci 89862306a36Sopenharmony_cistatic int wsa_macro_set_mix_interpolator_rate(struct snd_soc_dai *dai, 89962306a36Sopenharmony_ci u8 int_mix_fs_rate_reg_val, 90062306a36Sopenharmony_ci u32 sample_rate) 90162306a36Sopenharmony_ci{ 90262306a36Sopenharmony_ci u8 int_2_inp; 90362306a36Sopenharmony_ci u32 j, port; 90462306a36Sopenharmony_ci u16 int_mux_cfg1, int_fs_reg; 90562306a36Sopenharmony_ci u8 int_mux_cfg1_val; 90662306a36Sopenharmony_ci struct snd_soc_component *component = dai->component; 90762306a36Sopenharmony_ci struct wsa_macro *wsa = snd_soc_component_get_drvdata(component); 90862306a36Sopenharmony_ci 90962306a36Sopenharmony_ci for_each_set_bit(port, &wsa->active_ch_mask[dai->id], WSA_MACRO_RX_MAX) { 91062306a36Sopenharmony_ci int_2_inp = port; 91162306a36Sopenharmony_ci if ((int_2_inp < WSA_MACRO_RX0) || (int_2_inp > WSA_MACRO_RX_MIX1)) { 91262306a36Sopenharmony_ci dev_err(component->dev, "%s: Invalid RX port, Dai ID is %d\n", 91362306a36Sopenharmony_ci __func__, dai->id); 91462306a36Sopenharmony_ci return -EINVAL; 91562306a36Sopenharmony_ci } 91662306a36Sopenharmony_ci 91762306a36Sopenharmony_ci int_mux_cfg1 = CDC_WSA_RX_INP_MUX_RX_INT0_CFG1; 91862306a36Sopenharmony_ci for (j = 0; j < NUM_INTERPOLATORS; j++) { 91962306a36Sopenharmony_ci int_mux_cfg1_val = snd_soc_component_read_field(component, int_mux_cfg1, 92062306a36Sopenharmony_ci CDC_WSA_RX_INTX_2_SEL_MASK); 92162306a36Sopenharmony_ci 92262306a36Sopenharmony_ci if (int_mux_cfg1_val == int_2_inp + INTn_2_INP_SEL_RX0) { 92362306a36Sopenharmony_ci int_fs_reg = CDC_WSA_RX0_RX_PATH_MIX_CTL + 92462306a36Sopenharmony_ci WSA_MACRO_RX_PATH_OFFSET * j; 92562306a36Sopenharmony_ci 92662306a36Sopenharmony_ci snd_soc_component_update_bits(component, 92762306a36Sopenharmony_ci int_fs_reg, 92862306a36Sopenharmony_ci WSA_MACRO_FS_RATE_MASK, 92962306a36Sopenharmony_ci int_mix_fs_rate_reg_val); 93062306a36Sopenharmony_ci } 93162306a36Sopenharmony_ci int_mux_cfg1 += WSA_MACRO_MUX_CFG_OFFSET; 93262306a36Sopenharmony_ci } 93362306a36Sopenharmony_ci } 93462306a36Sopenharmony_ci return 0; 93562306a36Sopenharmony_ci} 93662306a36Sopenharmony_ci 93762306a36Sopenharmony_cistatic int wsa_macro_set_interpolator_rate(struct snd_soc_dai *dai, 93862306a36Sopenharmony_ci u32 sample_rate) 93962306a36Sopenharmony_ci{ 94062306a36Sopenharmony_ci int rate_val = 0; 94162306a36Sopenharmony_ci int i, ret; 94262306a36Sopenharmony_ci 94362306a36Sopenharmony_ci /* set mixing path rate */ 94462306a36Sopenharmony_ci for (i = 0; i < ARRAY_SIZE(int_mix_sample_rate_val); i++) { 94562306a36Sopenharmony_ci if (sample_rate == int_mix_sample_rate_val[i].sample_rate) { 94662306a36Sopenharmony_ci rate_val = int_mix_sample_rate_val[i].rate_val; 94762306a36Sopenharmony_ci break; 94862306a36Sopenharmony_ci } 94962306a36Sopenharmony_ci } 95062306a36Sopenharmony_ci if ((i == ARRAY_SIZE(int_mix_sample_rate_val)) || (rate_val < 0)) 95162306a36Sopenharmony_ci goto prim_rate; 95262306a36Sopenharmony_ci 95362306a36Sopenharmony_ci ret = wsa_macro_set_mix_interpolator_rate(dai, (u8) rate_val, sample_rate); 95462306a36Sopenharmony_ci if (ret < 0) 95562306a36Sopenharmony_ci return ret; 95662306a36Sopenharmony_ciprim_rate: 95762306a36Sopenharmony_ci /* set primary path sample rate */ 95862306a36Sopenharmony_ci for (i = 0; i < ARRAY_SIZE(int_prim_sample_rate_val); i++) { 95962306a36Sopenharmony_ci if (sample_rate == int_prim_sample_rate_val[i].sample_rate) { 96062306a36Sopenharmony_ci rate_val = int_prim_sample_rate_val[i].rate_val; 96162306a36Sopenharmony_ci break; 96262306a36Sopenharmony_ci } 96362306a36Sopenharmony_ci } 96462306a36Sopenharmony_ci if ((i == ARRAY_SIZE(int_prim_sample_rate_val)) || (rate_val < 0)) 96562306a36Sopenharmony_ci return -EINVAL; 96662306a36Sopenharmony_ci 96762306a36Sopenharmony_ci ret = wsa_macro_set_prim_interpolator_rate(dai, (u8) rate_val, sample_rate); 96862306a36Sopenharmony_ci 96962306a36Sopenharmony_ci return ret; 97062306a36Sopenharmony_ci} 97162306a36Sopenharmony_ci 97262306a36Sopenharmony_cistatic int wsa_macro_hw_params(struct snd_pcm_substream *substream, 97362306a36Sopenharmony_ci struct snd_pcm_hw_params *params, 97462306a36Sopenharmony_ci struct snd_soc_dai *dai) 97562306a36Sopenharmony_ci{ 97662306a36Sopenharmony_ci struct snd_soc_component *component = dai->component; 97762306a36Sopenharmony_ci int ret; 97862306a36Sopenharmony_ci 97962306a36Sopenharmony_ci switch (substream->stream) { 98062306a36Sopenharmony_ci case SNDRV_PCM_STREAM_PLAYBACK: 98162306a36Sopenharmony_ci ret = wsa_macro_set_interpolator_rate(dai, params_rate(params)); 98262306a36Sopenharmony_ci if (ret) { 98362306a36Sopenharmony_ci dev_err(component->dev, 98462306a36Sopenharmony_ci "%s: cannot set sample rate: %u\n", 98562306a36Sopenharmony_ci __func__, params_rate(params)); 98662306a36Sopenharmony_ci return ret; 98762306a36Sopenharmony_ci } 98862306a36Sopenharmony_ci break; 98962306a36Sopenharmony_ci default: 99062306a36Sopenharmony_ci break; 99162306a36Sopenharmony_ci } 99262306a36Sopenharmony_ci return 0; 99362306a36Sopenharmony_ci} 99462306a36Sopenharmony_ci 99562306a36Sopenharmony_cistatic int wsa_macro_get_channel_map(struct snd_soc_dai *dai, 99662306a36Sopenharmony_ci unsigned int *tx_num, unsigned int *tx_slot, 99762306a36Sopenharmony_ci unsigned int *rx_num, unsigned int *rx_slot) 99862306a36Sopenharmony_ci{ 99962306a36Sopenharmony_ci struct snd_soc_component *component = dai->component; 100062306a36Sopenharmony_ci struct wsa_macro *wsa = snd_soc_component_get_drvdata(component); 100162306a36Sopenharmony_ci u16 val, mask = 0, cnt = 0, temp; 100262306a36Sopenharmony_ci 100362306a36Sopenharmony_ci switch (dai->id) { 100462306a36Sopenharmony_ci case WSA_MACRO_AIF_VI: 100562306a36Sopenharmony_ci *tx_slot = wsa->active_ch_mask[dai->id]; 100662306a36Sopenharmony_ci *tx_num = wsa->active_ch_cnt[dai->id]; 100762306a36Sopenharmony_ci break; 100862306a36Sopenharmony_ci case WSA_MACRO_AIF1_PB: 100962306a36Sopenharmony_ci case WSA_MACRO_AIF_MIX1_PB: 101062306a36Sopenharmony_ci for_each_set_bit(temp, &wsa->active_ch_mask[dai->id], 101162306a36Sopenharmony_ci WSA_MACRO_RX_MAX) { 101262306a36Sopenharmony_ci mask |= (1 << temp); 101362306a36Sopenharmony_ci if (++cnt == WSA_MACRO_MAX_DMA_CH_PER_PORT) 101462306a36Sopenharmony_ci break; 101562306a36Sopenharmony_ci } 101662306a36Sopenharmony_ci if (mask & 0x0C) 101762306a36Sopenharmony_ci mask = mask >> 0x2; 101862306a36Sopenharmony_ci *rx_slot = mask; 101962306a36Sopenharmony_ci *rx_num = cnt; 102062306a36Sopenharmony_ci break; 102162306a36Sopenharmony_ci case WSA_MACRO_AIF_ECHO: 102262306a36Sopenharmony_ci val = snd_soc_component_read(component, CDC_WSA_RX_INP_MUX_RX_MIX_CFG0); 102362306a36Sopenharmony_ci if (val & WSA_MACRO_EC_MIX_TX1_MASK) { 102462306a36Sopenharmony_ci mask |= 0x2; 102562306a36Sopenharmony_ci cnt++; 102662306a36Sopenharmony_ci } 102762306a36Sopenharmony_ci if (val & WSA_MACRO_EC_MIX_TX0_MASK) { 102862306a36Sopenharmony_ci mask |= 0x1; 102962306a36Sopenharmony_ci cnt++; 103062306a36Sopenharmony_ci } 103162306a36Sopenharmony_ci *tx_slot = mask; 103262306a36Sopenharmony_ci *tx_num = cnt; 103362306a36Sopenharmony_ci break; 103462306a36Sopenharmony_ci default: 103562306a36Sopenharmony_ci dev_err(component->dev, "%s: Invalid AIF\n", __func__); 103662306a36Sopenharmony_ci break; 103762306a36Sopenharmony_ci } 103862306a36Sopenharmony_ci return 0; 103962306a36Sopenharmony_ci} 104062306a36Sopenharmony_ci 104162306a36Sopenharmony_cistatic const struct snd_soc_dai_ops wsa_macro_dai_ops = { 104262306a36Sopenharmony_ci .hw_params = wsa_macro_hw_params, 104362306a36Sopenharmony_ci .get_channel_map = wsa_macro_get_channel_map, 104462306a36Sopenharmony_ci}; 104562306a36Sopenharmony_ci 104662306a36Sopenharmony_cistatic struct snd_soc_dai_driver wsa_macro_dai[] = { 104762306a36Sopenharmony_ci { 104862306a36Sopenharmony_ci .name = "wsa_macro_rx1", 104962306a36Sopenharmony_ci .id = WSA_MACRO_AIF1_PB, 105062306a36Sopenharmony_ci .playback = { 105162306a36Sopenharmony_ci .stream_name = "WSA_AIF1 Playback", 105262306a36Sopenharmony_ci .rates = WSA_MACRO_RX_RATES, 105362306a36Sopenharmony_ci .formats = WSA_MACRO_RX_FORMATS, 105462306a36Sopenharmony_ci .rate_max = 384000, 105562306a36Sopenharmony_ci .rate_min = 8000, 105662306a36Sopenharmony_ci .channels_min = 1, 105762306a36Sopenharmony_ci .channels_max = 2, 105862306a36Sopenharmony_ci }, 105962306a36Sopenharmony_ci .ops = &wsa_macro_dai_ops, 106062306a36Sopenharmony_ci }, 106162306a36Sopenharmony_ci { 106262306a36Sopenharmony_ci .name = "wsa_macro_rx_mix", 106362306a36Sopenharmony_ci .id = WSA_MACRO_AIF_MIX1_PB, 106462306a36Sopenharmony_ci .playback = { 106562306a36Sopenharmony_ci .stream_name = "WSA_AIF_MIX1 Playback", 106662306a36Sopenharmony_ci .rates = WSA_MACRO_RX_MIX_RATES, 106762306a36Sopenharmony_ci .formats = WSA_MACRO_RX_FORMATS, 106862306a36Sopenharmony_ci .rate_max = 192000, 106962306a36Sopenharmony_ci .rate_min = 48000, 107062306a36Sopenharmony_ci .channels_min = 1, 107162306a36Sopenharmony_ci .channels_max = 2, 107262306a36Sopenharmony_ci }, 107362306a36Sopenharmony_ci .ops = &wsa_macro_dai_ops, 107462306a36Sopenharmony_ci }, 107562306a36Sopenharmony_ci { 107662306a36Sopenharmony_ci .name = "wsa_macro_vifeedback", 107762306a36Sopenharmony_ci .id = WSA_MACRO_AIF_VI, 107862306a36Sopenharmony_ci .capture = { 107962306a36Sopenharmony_ci .stream_name = "WSA_AIF_VI Capture", 108062306a36Sopenharmony_ci .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_48000, 108162306a36Sopenharmony_ci .formats = WSA_MACRO_RX_FORMATS, 108262306a36Sopenharmony_ci .rate_max = 48000, 108362306a36Sopenharmony_ci .rate_min = 8000, 108462306a36Sopenharmony_ci .channels_min = 1, 108562306a36Sopenharmony_ci .channels_max = 4, 108662306a36Sopenharmony_ci }, 108762306a36Sopenharmony_ci .ops = &wsa_macro_dai_ops, 108862306a36Sopenharmony_ci }, 108962306a36Sopenharmony_ci { 109062306a36Sopenharmony_ci .name = "wsa_macro_echo", 109162306a36Sopenharmony_ci .id = WSA_MACRO_AIF_ECHO, 109262306a36Sopenharmony_ci .capture = { 109362306a36Sopenharmony_ci .stream_name = "WSA_AIF_ECHO Capture", 109462306a36Sopenharmony_ci .rates = WSA_MACRO_ECHO_RATES, 109562306a36Sopenharmony_ci .formats = WSA_MACRO_ECHO_FORMATS, 109662306a36Sopenharmony_ci .rate_max = 48000, 109762306a36Sopenharmony_ci .rate_min = 8000, 109862306a36Sopenharmony_ci .channels_min = 1, 109962306a36Sopenharmony_ci .channels_max = 2, 110062306a36Sopenharmony_ci }, 110162306a36Sopenharmony_ci .ops = &wsa_macro_dai_ops, 110262306a36Sopenharmony_ci }, 110362306a36Sopenharmony_ci}; 110462306a36Sopenharmony_ci 110562306a36Sopenharmony_cistatic void wsa_macro_mclk_enable(struct wsa_macro *wsa, bool mclk_enable) 110662306a36Sopenharmony_ci{ 110762306a36Sopenharmony_ci struct regmap *regmap = wsa->regmap; 110862306a36Sopenharmony_ci 110962306a36Sopenharmony_ci if (mclk_enable) { 111062306a36Sopenharmony_ci if (wsa->wsa_mclk_users == 0) { 111162306a36Sopenharmony_ci regcache_mark_dirty(regmap); 111262306a36Sopenharmony_ci regcache_sync(regmap); 111362306a36Sopenharmony_ci /* 9.6MHz MCLK, set value 0x00 if other frequency */ 111462306a36Sopenharmony_ci regmap_update_bits(regmap, CDC_WSA_TOP_FREQ_MCLK, 0x01, 0x01); 111562306a36Sopenharmony_ci regmap_update_bits(regmap, 111662306a36Sopenharmony_ci CDC_WSA_CLK_RST_CTRL_MCLK_CONTROL, 111762306a36Sopenharmony_ci CDC_WSA_MCLK_EN_MASK, 111862306a36Sopenharmony_ci CDC_WSA_MCLK_ENABLE); 111962306a36Sopenharmony_ci regmap_update_bits(regmap, 112062306a36Sopenharmony_ci CDC_WSA_CLK_RST_CTRL_FS_CNT_CONTROL, 112162306a36Sopenharmony_ci CDC_WSA_FS_CNT_EN_MASK, 112262306a36Sopenharmony_ci CDC_WSA_FS_CNT_ENABLE); 112362306a36Sopenharmony_ci } 112462306a36Sopenharmony_ci wsa->wsa_mclk_users++; 112562306a36Sopenharmony_ci } else { 112662306a36Sopenharmony_ci if (wsa->wsa_mclk_users <= 0) { 112762306a36Sopenharmony_ci dev_err(wsa->dev, "clock already disabled\n"); 112862306a36Sopenharmony_ci wsa->wsa_mclk_users = 0; 112962306a36Sopenharmony_ci return; 113062306a36Sopenharmony_ci } 113162306a36Sopenharmony_ci wsa->wsa_mclk_users--; 113262306a36Sopenharmony_ci if (wsa->wsa_mclk_users == 0) { 113362306a36Sopenharmony_ci regmap_update_bits(regmap, 113462306a36Sopenharmony_ci CDC_WSA_CLK_RST_CTRL_FS_CNT_CONTROL, 113562306a36Sopenharmony_ci CDC_WSA_FS_CNT_EN_MASK, 113662306a36Sopenharmony_ci CDC_WSA_FS_CNT_DISABLE); 113762306a36Sopenharmony_ci regmap_update_bits(regmap, 113862306a36Sopenharmony_ci CDC_WSA_CLK_RST_CTRL_MCLK_CONTROL, 113962306a36Sopenharmony_ci CDC_WSA_MCLK_EN_MASK, 114062306a36Sopenharmony_ci CDC_WSA_MCLK_DISABLE); 114162306a36Sopenharmony_ci } 114262306a36Sopenharmony_ci } 114362306a36Sopenharmony_ci} 114462306a36Sopenharmony_ci 114562306a36Sopenharmony_cistatic int wsa_macro_mclk_event(struct snd_soc_dapm_widget *w, 114662306a36Sopenharmony_ci struct snd_kcontrol *kcontrol, int event) 114762306a36Sopenharmony_ci{ 114862306a36Sopenharmony_ci struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); 114962306a36Sopenharmony_ci struct wsa_macro *wsa = snd_soc_component_get_drvdata(component); 115062306a36Sopenharmony_ci 115162306a36Sopenharmony_ci wsa_macro_mclk_enable(wsa, event == SND_SOC_DAPM_PRE_PMU); 115262306a36Sopenharmony_ci return 0; 115362306a36Sopenharmony_ci} 115462306a36Sopenharmony_ci 115562306a36Sopenharmony_cistatic int wsa_macro_enable_vi_feedback(struct snd_soc_dapm_widget *w, 115662306a36Sopenharmony_ci struct snd_kcontrol *kcontrol, 115762306a36Sopenharmony_ci int event) 115862306a36Sopenharmony_ci{ 115962306a36Sopenharmony_ci struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); 116062306a36Sopenharmony_ci struct wsa_macro *wsa = snd_soc_component_get_drvdata(component); 116162306a36Sopenharmony_ci u32 tx_reg0, tx_reg1; 116262306a36Sopenharmony_ci 116362306a36Sopenharmony_ci if (test_bit(WSA_MACRO_TX0, &wsa->active_ch_mask[WSA_MACRO_AIF_VI])) { 116462306a36Sopenharmony_ci tx_reg0 = CDC_WSA_TX0_SPKR_PROT_PATH_CTL; 116562306a36Sopenharmony_ci tx_reg1 = CDC_WSA_TX1_SPKR_PROT_PATH_CTL; 116662306a36Sopenharmony_ci } else if (test_bit(WSA_MACRO_TX1, &wsa->active_ch_mask[WSA_MACRO_AIF_VI])) { 116762306a36Sopenharmony_ci tx_reg0 = CDC_WSA_TX2_SPKR_PROT_PATH_CTL; 116862306a36Sopenharmony_ci tx_reg1 = CDC_WSA_TX3_SPKR_PROT_PATH_CTL; 116962306a36Sopenharmony_ci } 117062306a36Sopenharmony_ci 117162306a36Sopenharmony_ci switch (event) { 117262306a36Sopenharmony_ci case SND_SOC_DAPM_POST_PMU: 117362306a36Sopenharmony_ci /* Enable V&I sensing */ 117462306a36Sopenharmony_ci snd_soc_component_update_bits(component, tx_reg0, 117562306a36Sopenharmony_ci CDC_WSA_TX_SPKR_PROT_RESET_MASK, 117662306a36Sopenharmony_ci CDC_WSA_TX_SPKR_PROT_RESET); 117762306a36Sopenharmony_ci snd_soc_component_update_bits(component, tx_reg1, 117862306a36Sopenharmony_ci CDC_WSA_TX_SPKR_PROT_RESET_MASK, 117962306a36Sopenharmony_ci CDC_WSA_TX_SPKR_PROT_RESET); 118062306a36Sopenharmony_ci snd_soc_component_update_bits(component, tx_reg0, 118162306a36Sopenharmony_ci CDC_WSA_TX_SPKR_PROT_PCM_RATE_MASK, 118262306a36Sopenharmony_ci CDC_WSA_TX_SPKR_PROT_PCM_RATE_8K); 118362306a36Sopenharmony_ci snd_soc_component_update_bits(component, tx_reg1, 118462306a36Sopenharmony_ci CDC_WSA_TX_SPKR_PROT_PCM_RATE_MASK, 118562306a36Sopenharmony_ci CDC_WSA_TX_SPKR_PROT_PCM_RATE_8K); 118662306a36Sopenharmony_ci snd_soc_component_update_bits(component, tx_reg0, 118762306a36Sopenharmony_ci CDC_WSA_TX_SPKR_PROT_CLK_EN_MASK, 118862306a36Sopenharmony_ci CDC_WSA_TX_SPKR_PROT_CLK_ENABLE); 118962306a36Sopenharmony_ci snd_soc_component_update_bits(component, tx_reg1, 119062306a36Sopenharmony_ci CDC_WSA_TX_SPKR_PROT_CLK_EN_MASK, 119162306a36Sopenharmony_ci CDC_WSA_TX_SPKR_PROT_CLK_ENABLE); 119262306a36Sopenharmony_ci snd_soc_component_update_bits(component, tx_reg0, 119362306a36Sopenharmony_ci CDC_WSA_TX_SPKR_PROT_RESET_MASK, 119462306a36Sopenharmony_ci CDC_WSA_TX_SPKR_PROT_NO_RESET); 119562306a36Sopenharmony_ci snd_soc_component_update_bits(component, tx_reg1, 119662306a36Sopenharmony_ci CDC_WSA_TX_SPKR_PROT_RESET_MASK, 119762306a36Sopenharmony_ci CDC_WSA_TX_SPKR_PROT_NO_RESET); 119862306a36Sopenharmony_ci break; 119962306a36Sopenharmony_ci case SND_SOC_DAPM_POST_PMD: 120062306a36Sopenharmony_ci /* Disable V&I sensing */ 120162306a36Sopenharmony_ci snd_soc_component_update_bits(component, tx_reg0, 120262306a36Sopenharmony_ci CDC_WSA_TX_SPKR_PROT_RESET_MASK, 120362306a36Sopenharmony_ci CDC_WSA_TX_SPKR_PROT_RESET); 120462306a36Sopenharmony_ci snd_soc_component_update_bits(component, tx_reg1, 120562306a36Sopenharmony_ci CDC_WSA_TX_SPKR_PROT_RESET_MASK, 120662306a36Sopenharmony_ci CDC_WSA_TX_SPKR_PROT_RESET); 120762306a36Sopenharmony_ci snd_soc_component_update_bits(component, tx_reg0, 120862306a36Sopenharmony_ci CDC_WSA_TX_SPKR_PROT_CLK_EN_MASK, 120962306a36Sopenharmony_ci CDC_WSA_TX_SPKR_PROT_CLK_DISABLE); 121062306a36Sopenharmony_ci snd_soc_component_update_bits(component, tx_reg1, 121162306a36Sopenharmony_ci CDC_WSA_TX_SPKR_PROT_CLK_EN_MASK, 121262306a36Sopenharmony_ci CDC_WSA_TX_SPKR_PROT_CLK_DISABLE); 121362306a36Sopenharmony_ci break; 121462306a36Sopenharmony_ci } 121562306a36Sopenharmony_ci 121662306a36Sopenharmony_ci return 0; 121762306a36Sopenharmony_ci} 121862306a36Sopenharmony_ci 121962306a36Sopenharmony_cistatic int wsa_macro_enable_mix_path(struct snd_soc_dapm_widget *w, 122062306a36Sopenharmony_ci struct snd_kcontrol *kcontrol, int event) 122162306a36Sopenharmony_ci{ 122262306a36Sopenharmony_ci struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); 122362306a36Sopenharmony_ci u16 path_reg, gain_reg; 122462306a36Sopenharmony_ci int val; 122562306a36Sopenharmony_ci 122662306a36Sopenharmony_ci switch (w->shift) { 122762306a36Sopenharmony_ci case WSA_MACRO_RX_MIX0: 122862306a36Sopenharmony_ci path_reg = CDC_WSA_RX0_RX_PATH_MIX_CTL; 122962306a36Sopenharmony_ci gain_reg = CDC_WSA_RX0_RX_VOL_MIX_CTL; 123062306a36Sopenharmony_ci break; 123162306a36Sopenharmony_ci case WSA_MACRO_RX_MIX1: 123262306a36Sopenharmony_ci path_reg = CDC_WSA_RX1_RX_PATH_MIX_CTL; 123362306a36Sopenharmony_ci gain_reg = CDC_WSA_RX1_RX_VOL_MIX_CTL; 123462306a36Sopenharmony_ci break; 123562306a36Sopenharmony_ci default: 123662306a36Sopenharmony_ci return 0; 123762306a36Sopenharmony_ci } 123862306a36Sopenharmony_ci 123962306a36Sopenharmony_ci switch (event) { 124062306a36Sopenharmony_ci case SND_SOC_DAPM_POST_PMU: 124162306a36Sopenharmony_ci val = snd_soc_component_read(component, gain_reg); 124262306a36Sopenharmony_ci snd_soc_component_write(component, gain_reg, val); 124362306a36Sopenharmony_ci break; 124462306a36Sopenharmony_ci case SND_SOC_DAPM_POST_PMD: 124562306a36Sopenharmony_ci snd_soc_component_update_bits(component, path_reg, 124662306a36Sopenharmony_ci CDC_WSA_RX_PATH_MIX_CLK_EN_MASK, 124762306a36Sopenharmony_ci CDC_WSA_RX_PATH_MIX_CLK_DISABLE); 124862306a36Sopenharmony_ci break; 124962306a36Sopenharmony_ci } 125062306a36Sopenharmony_ci 125162306a36Sopenharmony_ci return 0; 125262306a36Sopenharmony_ci} 125362306a36Sopenharmony_ci 125462306a36Sopenharmony_cistatic void wsa_macro_hd2_control(struct snd_soc_component *component, 125562306a36Sopenharmony_ci u16 reg, int event) 125662306a36Sopenharmony_ci{ 125762306a36Sopenharmony_ci u16 hd2_scale_reg; 125862306a36Sopenharmony_ci u16 hd2_enable_reg; 125962306a36Sopenharmony_ci 126062306a36Sopenharmony_ci if (reg == CDC_WSA_RX0_RX_PATH_CTL) { 126162306a36Sopenharmony_ci hd2_scale_reg = CDC_WSA_RX0_RX_PATH_SEC3; 126262306a36Sopenharmony_ci hd2_enable_reg = CDC_WSA_RX0_RX_PATH_CFG0; 126362306a36Sopenharmony_ci } 126462306a36Sopenharmony_ci if (reg == CDC_WSA_RX1_RX_PATH_CTL) { 126562306a36Sopenharmony_ci hd2_scale_reg = CDC_WSA_RX1_RX_PATH_SEC3; 126662306a36Sopenharmony_ci hd2_enable_reg = CDC_WSA_RX1_RX_PATH_CFG0; 126762306a36Sopenharmony_ci } 126862306a36Sopenharmony_ci 126962306a36Sopenharmony_ci if (hd2_enable_reg && SND_SOC_DAPM_EVENT_ON(event)) { 127062306a36Sopenharmony_ci snd_soc_component_update_bits(component, hd2_scale_reg, 127162306a36Sopenharmony_ci CDC_WSA_RX_PATH_HD2_ALPHA_MASK, 127262306a36Sopenharmony_ci 0x10); 127362306a36Sopenharmony_ci snd_soc_component_update_bits(component, hd2_scale_reg, 127462306a36Sopenharmony_ci CDC_WSA_RX_PATH_HD2_SCALE_MASK, 127562306a36Sopenharmony_ci 0x1); 127662306a36Sopenharmony_ci snd_soc_component_update_bits(component, hd2_enable_reg, 127762306a36Sopenharmony_ci CDC_WSA_RX_PATH_HD2_EN_MASK, 127862306a36Sopenharmony_ci CDC_WSA_RX_PATH_HD2_ENABLE); 127962306a36Sopenharmony_ci } 128062306a36Sopenharmony_ci 128162306a36Sopenharmony_ci if (hd2_enable_reg && SND_SOC_DAPM_EVENT_OFF(event)) { 128262306a36Sopenharmony_ci snd_soc_component_update_bits(component, hd2_enable_reg, 128362306a36Sopenharmony_ci CDC_WSA_RX_PATH_HD2_EN_MASK, 0); 128462306a36Sopenharmony_ci snd_soc_component_update_bits(component, hd2_scale_reg, 128562306a36Sopenharmony_ci CDC_WSA_RX_PATH_HD2_SCALE_MASK, 128662306a36Sopenharmony_ci 0); 128762306a36Sopenharmony_ci snd_soc_component_update_bits(component, hd2_scale_reg, 128862306a36Sopenharmony_ci CDC_WSA_RX_PATH_HD2_ALPHA_MASK, 128962306a36Sopenharmony_ci 0); 129062306a36Sopenharmony_ci } 129162306a36Sopenharmony_ci} 129262306a36Sopenharmony_ci 129362306a36Sopenharmony_cistatic int wsa_macro_config_compander(struct snd_soc_component *component, 129462306a36Sopenharmony_ci int comp, int event) 129562306a36Sopenharmony_ci{ 129662306a36Sopenharmony_ci u16 comp_ctl0_reg, rx_path_cfg0_reg; 129762306a36Sopenharmony_ci struct wsa_macro *wsa = snd_soc_component_get_drvdata(component); 129862306a36Sopenharmony_ci 129962306a36Sopenharmony_ci if (!wsa->comp_enabled[comp]) 130062306a36Sopenharmony_ci return 0; 130162306a36Sopenharmony_ci 130262306a36Sopenharmony_ci comp_ctl0_reg = CDC_WSA_COMPANDER0_CTL0 + 130362306a36Sopenharmony_ci (comp * WSA_MACRO_RX_COMP_OFFSET); 130462306a36Sopenharmony_ci rx_path_cfg0_reg = CDC_WSA_RX0_RX_PATH_CFG0 + 130562306a36Sopenharmony_ci (comp * WSA_MACRO_RX_PATH_OFFSET); 130662306a36Sopenharmony_ci 130762306a36Sopenharmony_ci if (SND_SOC_DAPM_EVENT_ON(event)) { 130862306a36Sopenharmony_ci /* Enable Compander Clock */ 130962306a36Sopenharmony_ci snd_soc_component_update_bits(component, comp_ctl0_reg, 131062306a36Sopenharmony_ci CDC_WSA_COMPANDER_CLK_EN_MASK, 131162306a36Sopenharmony_ci CDC_WSA_COMPANDER_CLK_ENABLE); 131262306a36Sopenharmony_ci snd_soc_component_update_bits(component, comp_ctl0_reg, 131362306a36Sopenharmony_ci CDC_WSA_COMPANDER_SOFT_RST_MASK, 131462306a36Sopenharmony_ci CDC_WSA_COMPANDER_SOFT_RST_ENABLE); 131562306a36Sopenharmony_ci snd_soc_component_update_bits(component, comp_ctl0_reg, 131662306a36Sopenharmony_ci CDC_WSA_COMPANDER_SOFT_RST_MASK, 131762306a36Sopenharmony_ci 0); 131862306a36Sopenharmony_ci snd_soc_component_update_bits(component, rx_path_cfg0_reg, 131962306a36Sopenharmony_ci CDC_WSA_RX_PATH_COMP_EN_MASK, 132062306a36Sopenharmony_ci CDC_WSA_RX_PATH_COMP_ENABLE); 132162306a36Sopenharmony_ci } 132262306a36Sopenharmony_ci 132362306a36Sopenharmony_ci if (SND_SOC_DAPM_EVENT_OFF(event)) { 132462306a36Sopenharmony_ci snd_soc_component_update_bits(component, comp_ctl0_reg, 132562306a36Sopenharmony_ci CDC_WSA_COMPANDER_HALT_MASK, 132662306a36Sopenharmony_ci CDC_WSA_COMPANDER_HALT); 132762306a36Sopenharmony_ci snd_soc_component_update_bits(component, rx_path_cfg0_reg, 132862306a36Sopenharmony_ci CDC_WSA_RX_PATH_COMP_EN_MASK, 0); 132962306a36Sopenharmony_ci snd_soc_component_update_bits(component, comp_ctl0_reg, 133062306a36Sopenharmony_ci CDC_WSA_COMPANDER_SOFT_RST_MASK, 133162306a36Sopenharmony_ci CDC_WSA_COMPANDER_SOFT_RST_ENABLE); 133262306a36Sopenharmony_ci snd_soc_component_update_bits(component, comp_ctl0_reg, 133362306a36Sopenharmony_ci CDC_WSA_COMPANDER_SOFT_RST_MASK, 133462306a36Sopenharmony_ci 0); 133562306a36Sopenharmony_ci snd_soc_component_update_bits(component, comp_ctl0_reg, 133662306a36Sopenharmony_ci CDC_WSA_COMPANDER_CLK_EN_MASK, 0); 133762306a36Sopenharmony_ci snd_soc_component_update_bits(component, comp_ctl0_reg, 133862306a36Sopenharmony_ci CDC_WSA_COMPANDER_HALT_MASK, 0); 133962306a36Sopenharmony_ci } 134062306a36Sopenharmony_ci 134162306a36Sopenharmony_ci return 0; 134262306a36Sopenharmony_ci} 134362306a36Sopenharmony_ci 134462306a36Sopenharmony_cistatic void wsa_macro_enable_softclip_clk(struct snd_soc_component *component, 134562306a36Sopenharmony_ci struct wsa_macro *wsa, 134662306a36Sopenharmony_ci int path, 134762306a36Sopenharmony_ci bool enable) 134862306a36Sopenharmony_ci{ 134962306a36Sopenharmony_ci u16 softclip_clk_reg = CDC_WSA_SOFTCLIP0_CRC + 135062306a36Sopenharmony_ci (path * WSA_MACRO_RX_SOFTCLIP_OFFSET); 135162306a36Sopenharmony_ci u8 softclip_mux_mask = (1 << path); 135262306a36Sopenharmony_ci u8 softclip_mux_value = (1 << path); 135362306a36Sopenharmony_ci 135462306a36Sopenharmony_ci if (enable) { 135562306a36Sopenharmony_ci if (wsa->softclip_clk_users[path] == 0) { 135662306a36Sopenharmony_ci snd_soc_component_update_bits(component, 135762306a36Sopenharmony_ci softclip_clk_reg, 135862306a36Sopenharmony_ci CDC_WSA_SOFTCLIP_CLK_EN_MASK, 135962306a36Sopenharmony_ci CDC_WSA_SOFTCLIP_CLK_ENABLE); 136062306a36Sopenharmony_ci snd_soc_component_update_bits(component, 136162306a36Sopenharmony_ci CDC_WSA_RX_INP_MUX_SOFTCLIP_CFG0, 136262306a36Sopenharmony_ci softclip_mux_mask, softclip_mux_value); 136362306a36Sopenharmony_ci } 136462306a36Sopenharmony_ci wsa->softclip_clk_users[path]++; 136562306a36Sopenharmony_ci } else { 136662306a36Sopenharmony_ci wsa->softclip_clk_users[path]--; 136762306a36Sopenharmony_ci if (wsa->softclip_clk_users[path] == 0) { 136862306a36Sopenharmony_ci snd_soc_component_update_bits(component, 136962306a36Sopenharmony_ci softclip_clk_reg, 137062306a36Sopenharmony_ci CDC_WSA_SOFTCLIP_CLK_EN_MASK, 137162306a36Sopenharmony_ci 0); 137262306a36Sopenharmony_ci snd_soc_component_update_bits(component, 137362306a36Sopenharmony_ci CDC_WSA_RX_INP_MUX_SOFTCLIP_CFG0, 137462306a36Sopenharmony_ci softclip_mux_mask, 0x00); 137562306a36Sopenharmony_ci } 137662306a36Sopenharmony_ci } 137762306a36Sopenharmony_ci} 137862306a36Sopenharmony_ci 137962306a36Sopenharmony_cistatic int wsa_macro_config_softclip(struct snd_soc_component *component, 138062306a36Sopenharmony_ci int path, int event) 138162306a36Sopenharmony_ci{ 138262306a36Sopenharmony_ci u16 softclip_ctrl_reg; 138362306a36Sopenharmony_ci struct wsa_macro *wsa = snd_soc_component_get_drvdata(component); 138462306a36Sopenharmony_ci int softclip_path = 0; 138562306a36Sopenharmony_ci 138662306a36Sopenharmony_ci if (path == WSA_MACRO_COMP1) 138762306a36Sopenharmony_ci softclip_path = WSA_MACRO_SOFTCLIP0; 138862306a36Sopenharmony_ci else if (path == WSA_MACRO_COMP2) 138962306a36Sopenharmony_ci softclip_path = WSA_MACRO_SOFTCLIP1; 139062306a36Sopenharmony_ci 139162306a36Sopenharmony_ci if (!wsa->is_softclip_on[softclip_path]) 139262306a36Sopenharmony_ci return 0; 139362306a36Sopenharmony_ci 139462306a36Sopenharmony_ci softclip_ctrl_reg = CDC_WSA_SOFTCLIP0_SOFTCLIP_CTRL + 139562306a36Sopenharmony_ci (softclip_path * WSA_MACRO_RX_SOFTCLIP_OFFSET); 139662306a36Sopenharmony_ci 139762306a36Sopenharmony_ci if (SND_SOC_DAPM_EVENT_ON(event)) { 139862306a36Sopenharmony_ci /* Enable Softclip clock and mux */ 139962306a36Sopenharmony_ci wsa_macro_enable_softclip_clk(component, wsa, softclip_path, 140062306a36Sopenharmony_ci true); 140162306a36Sopenharmony_ci /* Enable Softclip control */ 140262306a36Sopenharmony_ci snd_soc_component_update_bits(component, softclip_ctrl_reg, 140362306a36Sopenharmony_ci CDC_WSA_SOFTCLIP_EN_MASK, 140462306a36Sopenharmony_ci CDC_WSA_SOFTCLIP_ENABLE); 140562306a36Sopenharmony_ci } 140662306a36Sopenharmony_ci 140762306a36Sopenharmony_ci if (SND_SOC_DAPM_EVENT_OFF(event)) { 140862306a36Sopenharmony_ci snd_soc_component_update_bits(component, softclip_ctrl_reg, 140962306a36Sopenharmony_ci CDC_WSA_SOFTCLIP_EN_MASK, 0); 141062306a36Sopenharmony_ci wsa_macro_enable_softclip_clk(component, wsa, softclip_path, 141162306a36Sopenharmony_ci false); 141262306a36Sopenharmony_ci } 141362306a36Sopenharmony_ci 141462306a36Sopenharmony_ci return 0; 141562306a36Sopenharmony_ci} 141662306a36Sopenharmony_ci 141762306a36Sopenharmony_cistatic bool wsa_macro_adie_lb(struct snd_soc_component *component, 141862306a36Sopenharmony_ci int interp_idx) 141962306a36Sopenharmony_ci{ 142062306a36Sopenharmony_ci u16 int_mux_cfg0, int_mux_cfg1; 142162306a36Sopenharmony_ci u8 int_n_inp0, int_n_inp1, int_n_inp2; 142262306a36Sopenharmony_ci 142362306a36Sopenharmony_ci int_mux_cfg0 = CDC_WSA_RX_INP_MUX_RX_INT0_CFG0 + interp_idx * 8; 142462306a36Sopenharmony_ci int_mux_cfg1 = int_mux_cfg0 + 4; 142562306a36Sopenharmony_ci 142662306a36Sopenharmony_ci int_n_inp0 = snd_soc_component_read_field(component, int_mux_cfg0, 142762306a36Sopenharmony_ci CDC_WSA_RX_INTX_1_MIX_INP0_SEL_MASK); 142862306a36Sopenharmony_ci if (int_n_inp0 == INTn_1_INP_SEL_DEC0 || 142962306a36Sopenharmony_ci int_n_inp0 == INTn_1_INP_SEL_DEC1) 143062306a36Sopenharmony_ci return true; 143162306a36Sopenharmony_ci 143262306a36Sopenharmony_ci int_n_inp1 = snd_soc_component_read_field(component, int_mux_cfg0, 143362306a36Sopenharmony_ci CDC_WSA_RX_INTX_1_MIX_INP1_SEL_MASK); 143462306a36Sopenharmony_ci if (int_n_inp1 == INTn_1_INP_SEL_DEC0 || 143562306a36Sopenharmony_ci int_n_inp1 == INTn_1_INP_SEL_DEC1) 143662306a36Sopenharmony_ci return true; 143762306a36Sopenharmony_ci 143862306a36Sopenharmony_ci int_n_inp2 = snd_soc_component_read_field(component, int_mux_cfg1, 143962306a36Sopenharmony_ci CDC_WSA_RX_INTX_1_MIX_INP2_SEL_MASK); 144062306a36Sopenharmony_ci if (int_n_inp2 == INTn_1_INP_SEL_DEC0 || 144162306a36Sopenharmony_ci int_n_inp2 == INTn_1_INP_SEL_DEC1) 144262306a36Sopenharmony_ci return true; 144362306a36Sopenharmony_ci 144462306a36Sopenharmony_ci return false; 144562306a36Sopenharmony_ci} 144662306a36Sopenharmony_ci 144762306a36Sopenharmony_cistatic int wsa_macro_enable_main_path(struct snd_soc_dapm_widget *w, 144862306a36Sopenharmony_ci struct snd_kcontrol *kcontrol, 144962306a36Sopenharmony_ci int event) 145062306a36Sopenharmony_ci{ 145162306a36Sopenharmony_ci struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); 145262306a36Sopenharmony_ci u16 reg; 145362306a36Sopenharmony_ci 145462306a36Sopenharmony_ci reg = CDC_WSA_RX0_RX_PATH_CTL + WSA_MACRO_RX_PATH_OFFSET * w->shift; 145562306a36Sopenharmony_ci switch (event) { 145662306a36Sopenharmony_ci case SND_SOC_DAPM_PRE_PMU: 145762306a36Sopenharmony_ci if (wsa_macro_adie_lb(component, w->shift)) { 145862306a36Sopenharmony_ci snd_soc_component_update_bits(component, reg, 145962306a36Sopenharmony_ci CDC_WSA_RX_PATH_CLK_EN_MASK, 146062306a36Sopenharmony_ci CDC_WSA_RX_PATH_CLK_ENABLE); 146162306a36Sopenharmony_ci } 146262306a36Sopenharmony_ci break; 146362306a36Sopenharmony_ci default: 146462306a36Sopenharmony_ci break; 146562306a36Sopenharmony_ci } 146662306a36Sopenharmony_ci return 0; 146762306a36Sopenharmony_ci} 146862306a36Sopenharmony_ci 146962306a36Sopenharmony_cistatic int wsa_macro_interp_get_primary_reg(u16 reg, u16 *ind) 147062306a36Sopenharmony_ci{ 147162306a36Sopenharmony_ci u16 prim_int_reg = 0; 147262306a36Sopenharmony_ci 147362306a36Sopenharmony_ci switch (reg) { 147462306a36Sopenharmony_ci case CDC_WSA_RX0_RX_PATH_CTL: 147562306a36Sopenharmony_ci case CDC_WSA_RX0_RX_PATH_MIX_CTL: 147662306a36Sopenharmony_ci prim_int_reg = CDC_WSA_RX0_RX_PATH_CTL; 147762306a36Sopenharmony_ci *ind = 0; 147862306a36Sopenharmony_ci break; 147962306a36Sopenharmony_ci case CDC_WSA_RX1_RX_PATH_CTL: 148062306a36Sopenharmony_ci case CDC_WSA_RX1_RX_PATH_MIX_CTL: 148162306a36Sopenharmony_ci prim_int_reg = CDC_WSA_RX1_RX_PATH_CTL; 148262306a36Sopenharmony_ci *ind = 1; 148362306a36Sopenharmony_ci break; 148462306a36Sopenharmony_ci } 148562306a36Sopenharmony_ci 148662306a36Sopenharmony_ci return prim_int_reg; 148762306a36Sopenharmony_ci} 148862306a36Sopenharmony_ci 148962306a36Sopenharmony_cistatic int wsa_macro_enable_prim_interpolator(struct snd_soc_component *component, 149062306a36Sopenharmony_ci u16 reg, int event) 149162306a36Sopenharmony_ci{ 149262306a36Sopenharmony_ci u16 prim_int_reg; 149362306a36Sopenharmony_ci u16 ind = 0; 149462306a36Sopenharmony_ci struct wsa_macro *wsa = snd_soc_component_get_drvdata(component); 149562306a36Sopenharmony_ci 149662306a36Sopenharmony_ci prim_int_reg = wsa_macro_interp_get_primary_reg(reg, &ind); 149762306a36Sopenharmony_ci 149862306a36Sopenharmony_ci switch (event) { 149962306a36Sopenharmony_ci case SND_SOC_DAPM_PRE_PMU: 150062306a36Sopenharmony_ci wsa->prim_int_users[ind]++; 150162306a36Sopenharmony_ci if (wsa->prim_int_users[ind] == 1) { 150262306a36Sopenharmony_ci snd_soc_component_update_bits(component, 150362306a36Sopenharmony_ci prim_int_reg + WSA_MACRO_RX_PATH_CFG3_OFFSET, 150462306a36Sopenharmony_ci CDC_WSA_RX_DC_DCOEFF_MASK, 150562306a36Sopenharmony_ci 0x3); 150662306a36Sopenharmony_ci snd_soc_component_update_bits(component, prim_int_reg, 150762306a36Sopenharmony_ci CDC_WSA_RX_PATH_PGA_MUTE_EN_MASK, 150862306a36Sopenharmony_ci CDC_WSA_RX_PATH_PGA_MUTE_ENABLE); 150962306a36Sopenharmony_ci wsa_macro_hd2_control(component, prim_int_reg, event); 151062306a36Sopenharmony_ci snd_soc_component_update_bits(component, 151162306a36Sopenharmony_ci prim_int_reg + WSA_MACRO_RX_PATH_DSMDEM_OFFSET, 151262306a36Sopenharmony_ci CDC_WSA_RX_DSMDEM_CLK_EN_MASK, 151362306a36Sopenharmony_ci CDC_WSA_RX_DSMDEM_CLK_ENABLE); 151462306a36Sopenharmony_ci } 151562306a36Sopenharmony_ci if ((reg != prim_int_reg) && 151662306a36Sopenharmony_ci ((snd_soc_component_read( 151762306a36Sopenharmony_ci component, prim_int_reg)) & 0x10)) 151862306a36Sopenharmony_ci snd_soc_component_update_bits(component, reg, 151962306a36Sopenharmony_ci 0x10, 0x10); 152062306a36Sopenharmony_ci break; 152162306a36Sopenharmony_ci case SND_SOC_DAPM_POST_PMD: 152262306a36Sopenharmony_ci wsa->prim_int_users[ind]--; 152362306a36Sopenharmony_ci if (wsa->prim_int_users[ind] == 0) { 152462306a36Sopenharmony_ci snd_soc_component_update_bits(component, 152562306a36Sopenharmony_ci prim_int_reg + WSA_MACRO_RX_PATH_DSMDEM_OFFSET, 152662306a36Sopenharmony_ci CDC_WSA_RX_DSMDEM_CLK_EN_MASK, 0); 152762306a36Sopenharmony_ci wsa_macro_hd2_control(component, prim_int_reg, event); 152862306a36Sopenharmony_ci } 152962306a36Sopenharmony_ci break; 153062306a36Sopenharmony_ci } 153162306a36Sopenharmony_ci 153262306a36Sopenharmony_ci return 0; 153362306a36Sopenharmony_ci} 153462306a36Sopenharmony_ci 153562306a36Sopenharmony_cistatic int wsa_macro_config_ear_spkr_gain(struct snd_soc_component *component, 153662306a36Sopenharmony_ci struct wsa_macro *wsa, 153762306a36Sopenharmony_ci int event, int gain_reg) 153862306a36Sopenharmony_ci{ 153962306a36Sopenharmony_ci int comp_gain_offset, val; 154062306a36Sopenharmony_ci 154162306a36Sopenharmony_ci switch (wsa->spkr_mode) { 154262306a36Sopenharmony_ci /* Compander gain in WSA_MACRO_SPKR_MODE1 case is 12 dB */ 154362306a36Sopenharmony_ci case WSA_MACRO_SPKR_MODE_1: 154462306a36Sopenharmony_ci comp_gain_offset = -12; 154562306a36Sopenharmony_ci break; 154662306a36Sopenharmony_ci /* Default case compander gain is 15 dB */ 154762306a36Sopenharmony_ci default: 154862306a36Sopenharmony_ci comp_gain_offset = -15; 154962306a36Sopenharmony_ci break; 155062306a36Sopenharmony_ci } 155162306a36Sopenharmony_ci 155262306a36Sopenharmony_ci switch (event) { 155362306a36Sopenharmony_ci case SND_SOC_DAPM_POST_PMU: 155462306a36Sopenharmony_ci /* Apply ear spkr gain only if compander is enabled */ 155562306a36Sopenharmony_ci if (wsa->comp_enabled[WSA_MACRO_COMP1] && 155662306a36Sopenharmony_ci (gain_reg == CDC_WSA_RX0_RX_VOL_CTL) && 155762306a36Sopenharmony_ci (wsa->ear_spkr_gain != 0)) { 155862306a36Sopenharmony_ci /* For example, val is -8(-12+5-1) for 4dB of gain */ 155962306a36Sopenharmony_ci val = comp_gain_offset + wsa->ear_spkr_gain - 1; 156062306a36Sopenharmony_ci snd_soc_component_write(component, gain_reg, val); 156162306a36Sopenharmony_ci } 156262306a36Sopenharmony_ci break; 156362306a36Sopenharmony_ci case SND_SOC_DAPM_POST_PMD: 156462306a36Sopenharmony_ci /* 156562306a36Sopenharmony_ci * Reset RX0 volume to 0 dB if compander is enabled and 156662306a36Sopenharmony_ci * ear_spkr_gain is non-zero. 156762306a36Sopenharmony_ci */ 156862306a36Sopenharmony_ci if (wsa->comp_enabled[WSA_MACRO_COMP1] && 156962306a36Sopenharmony_ci (gain_reg == CDC_WSA_RX0_RX_VOL_CTL) && 157062306a36Sopenharmony_ci (wsa->ear_spkr_gain != 0)) { 157162306a36Sopenharmony_ci snd_soc_component_write(component, gain_reg, 0x0); 157262306a36Sopenharmony_ci } 157362306a36Sopenharmony_ci break; 157462306a36Sopenharmony_ci } 157562306a36Sopenharmony_ci 157662306a36Sopenharmony_ci return 0; 157762306a36Sopenharmony_ci} 157862306a36Sopenharmony_ci 157962306a36Sopenharmony_cistatic int wsa_macro_enable_interpolator(struct snd_soc_dapm_widget *w, 158062306a36Sopenharmony_ci struct snd_kcontrol *kcontrol, 158162306a36Sopenharmony_ci int event) 158262306a36Sopenharmony_ci{ 158362306a36Sopenharmony_ci struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); 158462306a36Sopenharmony_ci u16 gain_reg; 158562306a36Sopenharmony_ci u16 reg; 158662306a36Sopenharmony_ci int val; 158762306a36Sopenharmony_ci struct wsa_macro *wsa = snd_soc_component_get_drvdata(component); 158862306a36Sopenharmony_ci 158962306a36Sopenharmony_ci if (w->shift == WSA_MACRO_COMP1) { 159062306a36Sopenharmony_ci reg = CDC_WSA_RX0_RX_PATH_CTL; 159162306a36Sopenharmony_ci gain_reg = CDC_WSA_RX0_RX_VOL_CTL; 159262306a36Sopenharmony_ci } else if (w->shift == WSA_MACRO_COMP2) { 159362306a36Sopenharmony_ci reg = CDC_WSA_RX1_RX_PATH_CTL; 159462306a36Sopenharmony_ci gain_reg = CDC_WSA_RX1_RX_VOL_CTL; 159562306a36Sopenharmony_ci } 159662306a36Sopenharmony_ci 159762306a36Sopenharmony_ci switch (event) { 159862306a36Sopenharmony_ci case SND_SOC_DAPM_PRE_PMU: 159962306a36Sopenharmony_ci /* Reset if needed */ 160062306a36Sopenharmony_ci wsa_macro_enable_prim_interpolator(component, reg, event); 160162306a36Sopenharmony_ci break; 160262306a36Sopenharmony_ci case SND_SOC_DAPM_POST_PMU: 160362306a36Sopenharmony_ci wsa_macro_config_compander(component, w->shift, event); 160462306a36Sopenharmony_ci wsa_macro_config_softclip(component, w->shift, event); 160562306a36Sopenharmony_ci /* apply gain after int clk is enabled */ 160662306a36Sopenharmony_ci if ((wsa->spkr_gain_offset == WSA_MACRO_GAIN_OFFSET_M1P5_DB) && 160762306a36Sopenharmony_ci (wsa->comp_enabled[WSA_MACRO_COMP1] || 160862306a36Sopenharmony_ci wsa->comp_enabled[WSA_MACRO_COMP2])) { 160962306a36Sopenharmony_ci snd_soc_component_update_bits(component, 161062306a36Sopenharmony_ci CDC_WSA_RX0_RX_PATH_SEC1, 161162306a36Sopenharmony_ci CDC_WSA_RX_PGA_HALF_DB_MASK, 161262306a36Sopenharmony_ci CDC_WSA_RX_PGA_HALF_DB_ENABLE); 161362306a36Sopenharmony_ci snd_soc_component_update_bits(component, 161462306a36Sopenharmony_ci CDC_WSA_RX0_RX_PATH_MIX_SEC0, 161562306a36Sopenharmony_ci CDC_WSA_RX_PGA_HALF_DB_MASK, 161662306a36Sopenharmony_ci CDC_WSA_RX_PGA_HALF_DB_ENABLE); 161762306a36Sopenharmony_ci snd_soc_component_update_bits(component, 161862306a36Sopenharmony_ci CDC_WSA_RX1_RX_PATH_SEC1, 161962306a36Sopenharmony_ci CDC_WSA_RX_PGA_HALF_DB_MASK, 162062306a36Sopenharmony_ci CDC_WSA_RX_PGA_HALF_DB_ENABLE); 162162306a36Sopenharmony_ci snd_soc_component_update_bits(component, 162262306a36Sopenharmony_ci CDC_WSA_RX1_RX_PATH_MIX_SEC0, 162362306a36Sopenharmony_ci CDC_WSA_RX_PGA_HALF_DB_MASK, 162462306a36Sopenharmony_ci CDC_WSA_RX_PGA_HALF_DB_ENABLE); 162562306a36Sopenharmony_ci } 162662306a36Sopenharmony_ci val = snd_soc_component_read(component, gain_reg); 162762306a36Sopenharmony_ci snd_soc_component_write(component, gain_reg, val); 162862306a36Sopenharmony_ci wsa_macro_config_ear_spkr_gain(component, wsa, 162962306a36Sopenharmony_ci event, gain_reg); 163062306a36Sopenharmony_ci break; 163162306a36Sopenharmony_ci case SND_SOC_DAPM_POST_PMD: 163262306a36Sopenharmony_ci wsa_macro_config_compander(component, w->shift, event); 163362306a36Sopenharmony_ci wsa_macro_config_softclip(component, w->shift, event); 163462306a36Sopenharmony_ci wsa_macro_enable_prim_interpolator(component, reg, event); 163562306a36Sopenharmony_ci if ((wsa->spkr_gain_offset == WSA_MACRO_GAIN_OFFSET_M1P5_DB) && 163662306a36Sopenharmony_ci (wsa->comp_enabled[WSA_MACRO_COMP1] || 163762306a36Sopenharmony_ci wsa->comp_enabled[WSA_MACRO_COMP2])) { 163862306a36Sopenharmony_ci snd_soc_component_update_bits(component, 163962306a36Sopenharmony_ci CDC_WSA_RX0_RX_PATH_SEC1, 164062306a36Sopenharmony_ci CDC_WSA_RX_PGA_HALF_DB_MASK, 164162306a36Sopenharmony_ci CDC_WSA_RX_PGA_HALF_DB_DISABLE); 164262306a36Sopenharmony_ci snd_soc_component_update_bits(component, 164362306a36Sopenharmony_ci CDC_WSA_RX0_RX_PATH_MIX_SEC0, 164462306a36Sopenharmony_ci CDC_WSA_RX_PGA_HALF_DB_MASK, 164562306a36Sopenharmony_ci CDC_WSA_RX_PGA_HALF_DB_DISABLE); 164662306a36Sopenharmony_ci snd_soc_component_update_bits(component, 164762306a36Sopenharmony_ci CDC_WSA_RX1_RX_PATH_SEC1, 164862306a36Sopenharmony_ci CDC_WSA_RX_PGA_HALF_DB_MASK, 164962306a36Sopenharmony_ci CDC_WSA_RX_PGA_HALF_DB_DISABLE); 165062306a36Sopenharmony_ci snd_soc_component_update_bits(component, 165162306a36Sopenharmony_ci CDC_WSA_RX1_RX_PATH_MIX_SEC0, 165262306a36Sopenharmony_ci CDC_WSA_RX_PGA_HALF_DB_MASK, 165362306a36Sopenharmony_ci CDC_WSA_RX_PGA_HALF_DB_DISABLE); 165462306a36Sopenharmony_ci } 165562306a36Sopenharmony_ci wsa_macro_config_ear_spkr_gain(component, wsa, 165662306a36Sopenharmony_ci event, gain_reg); 165762306a36Sopenharmony_ci break; 165862306a36Sopenharmony_ci } 165962306a36Sopenharmony_ci 166062306a36Sopenharmony_ci return 0; 166162306a36Sopenharmony_ci} 166262306a36Sopenharmony_ci 166362306a36Sopenharmony_cistatic int wsa_macro_spk_boost_event(struct snd_soc_dapm_widget *w, 166462306a36Sopenharmony_ci struct snd_kcontrol *kcontrol, 166562306a36Sopenharmony_ci int event) 166662306a36Sopenharmony_ci{ 166762306a36Sopenharmony_ci struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); 166862306a36Sopenharmony_ci u16 boost_path_ctl, boost_path_cfg1; 166962306a36Sopenharmony_ci u16 reg, reg_mix; 167062306a36Sopenharmony_ci 167162306a36Sopenharmony_ci if (!snd_soc_dapm_widget_name_cmp(w, "WSA_RX INT0 CHAIN")) { 167262306a36Sopenharmony_ci boost_path_ctl = CDC_WSA_BOOST0_BOOST_PATH_CTL; 167362306a36Sopenharmony_ci boost_path_cfg1 = CDC_WSA_RX0_RX_PATH_CFG1; 167462306a36Sopenharmony_ci reg = CDC_WSA_RX0_RX_PATH_CTL; 167562306a36Sopenharmony_ci reg_mix = CDC_WSA_RX0_RX_PATH_MIX_CTL; 167662306a36Sopenharmony_ci } else if (!snd_soc_dapm_widget_name_cmp(w, "WSA_RX INT1 CHAIN")) { 167762306a36Sopenharmony_ci boost_path_ctl = CDC_WSA_BOOST1_BOOST_PATH_CTL; 167862306a36Sopenharmony_ci boost_path_cfg1 = CDC_WSA_RX1_RX_PATH_CFG1; 167962306a36Sopenharmony_ci reg = CDC_WSA_RX1_RX_PATH_CTL; 168062306a36Sopenharmony_ci reg_mix = CDC_WSA_RX1_RX_PATH_MIX_CTL; 168162306a36Sopenharmony_ci } else { 168262306a36Sopenharmony_ci dev_warn(component->dev, "Incorrect widget name in the driver\n"); 168362306a36Sopenharmony_ci return -EINVAL; 168462306a36Sopenharmony_ci } 168562306a36Sopenharmony_ci 168662306a36Sopenharmony_ci switch (event) { 168762306a36Sopenharmony_ci case SND_SOC_DAPM_PRE_PMU: 168862306a36Sopenharmony_ci snd_soc_component_update_bits(component, boost_path_cfg1, 168962306a36Sopenharmony_ci CDC_WSA_RX_PATH_SMART_BST_EN_MASK, 169062306a36Sopenharmony_ci CDC_WSA_RX_PATH_SMART_BST_ENABLE); 169162306a36Sopenharmony_ci snd_soc_component_update_bits(component, boost_path_ctl, 169262306a36Sopenharmony_ci CDC_WSA_BOOST_PATH_CLK_EN_MASK, 169362306a36Sopenharmony_ci CDC_WSA_BOOST_PATH_CLK_ENABLE); 169462306a36Sopenharmony_ci if ((snd_soc_component_read(component, reg_mix)) & 0x10) 169562306a36Sopenharmony_ci snd_soc_component_update_bits(component, reg_mix, 169662306a36Sopenharmony_ci 0x10, 0x00); 169762306a36Sopenharmony_ci break; 169862306a36Sopenharmony_ci case SND_SOC_DAPM_POST_PMU: 169962306a36Sopenharmony_ci snd_soc_component_update_bits(component, reg, 0x10, 0x00); 170062306a36Sopenharmony_ci break; 170162306a36Sopenharmony_ci case SND_SOC_DAPM_POST_PMD: 170262306a36Sopenharmony_ci snd_soc_component_update_bits(component, boost_path_ctl, 170362306a36Sopenharmony_ci CDC_WSA_BOOST_PATH_CLK_EN_MASK, 170462306a36Sopenharmony_ci CDC_WSA_BOOST_PATH_CLK_DISABLE); 170562306a36Sopenharmony_ci snd_soc_component_update_bits(component, boost_path_cfg1, 170662306a36Sopenharmony_ci CDC_WSA_RX_PATH_SMART_BST_EN_MASK, 170762306a36Sopenharmony_ci CDC_WSA_RX_PATH_SMART_BST_DISABLE); 170862306a36Sopenharmony_ci break; 170962306a36Sopenharmony_ci } 171062306a36Sopenharmony_ci 171162306a36Sopenharmony_ci return 0; 171262306a36Sopenharmony_ci} 171362306a36Sopenharmony_ci 171462306a36Sopenharmony_cistatic int wsa_macro_enable_echo(struct snd_soc_dapm_widget *w, 171562306a36Sopenharmony_ci struct snd_kcontrol *kcontrol, 171662306a36Sopenharmony_ci int event) 171762306a36Sopenharmony_ci{ 171862306a36Sopenharmony_ci struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); 171962306a36Sopenharmony_ci struct wsa_macro *wsa = snd_soc_component_get_drvdata(component); 172062306a36Sopenharmony_ci u16 val, ec_tx, ec_hq_reg; 172162306a36Sopenharmony_ci 172262306a36Sopenharmony_ci val = snd_soc_component_read(component, CDC_WSA_RX_INP_MUX_RX_MIX_CFG0); 172362306a36Sopenharmony_ci 172462306a36Sopenharmony_ci switch (w->shift) { 172562306a36Sopenharmony_ci case WSA_MACRO_EC0_MUX: 172662306a36Sopenharmony_ci val = val & CDC_WSA_RX_MIX_TX0_SEL_MASK; 172762306a36Sopenharmony_ci ec_tx = val - 1; 172862306a36Sopenharmony_ci break; 172962306a36Sopenharmony_ci case WSA_MACRO_EC1_MUX: 173062306a36Sopenharmony_ci val = val & CDC_WSA_RX_MIX_TX1_SEL_MASK; 173162306a36Sopenharmony_ci ec_tx = (val >> CDC_WSA_RX_MIX_TX1_SEL_SHFT) - 1; 173262306a36Sopenharmony_ci break; 173362306a36Sopenharmony_ci default: 173462306a36Sopenharmony_ci dev_err(component->dev, "%s: Invalid shift %u\n", 173562306a36Sopenharmony_ci __func__, w->shift); 173662306a36Sopenharmony_ci return -EINVAL; 173762306a36Sopenharmony_ci } 173862306a36Sopenharmony_ci 173962306a36Sopenharmony_ci if (wsa->ec_hq[ec_tx]) { 174062306a36Sopenharmony_ci ec_hq_reg = CDC_WSA_EC_HQ0_EC_REF_HQ_PATH_CTL + 0x40 * ec_tx; 174162306a36Sopenharmony_ci snd_soc_component_update_bits(component, ec_hq_reg, 174262306a36Sopenharmony_ci CDC_WSA_EC_HQ_EC_CLK_EN_MASK, 174362306a36Sopenharmony_ci CDC_WSA_EC_HQ_EC_CLK_ENABLE); 174462306a36Sopenharmony_ci ec_hq_reg = CDC_WSA_EC_HQ0_EC_REF_HQ_CFG0 + 0x40 * ec_tx; 174562306a36Sopenharmony_ci /* default set to 48k */ 174662306a36Sopenharmony_ci snd_soc_component_update_bits(component, ec_hq_reg, 174762306a36Sopenharmony_ci CDC_WSA_EC_HQ_EC_REF_PCM_RATE_MASK, 174862306a36Sopenharmony_ci CDC_WSA_EC_HQ_EC_REF_PCM_RATE_48K); 174962306a36Sopenharmony_ci } 175062306a36Sopenharmony_ci 175162306a36Sopenharmony_ci return 0; 175262306a36Sopenharmony_ci} 175362306a36Sopenharmony_ci 175462306a36Sopenharmony_cistatic int wsa_macro_get_ec_hq(struct snd_kcontrol *kcontrol, 175562306a36Sopenharmony_ci struct snd_ctl_elem_value *ucontrol) 175662306a36Sopenharmony_ci{ 175762306a36Sopenharmony_ci 175862306a36Sopenharmony_ci struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); 175962306a36Sopenharmony_ci int ec_tx = ((struct soc_mixer_control *) kcontrol->private_value)->shift; 176062306a36Sopenharmony_ci struct wsa_macro *wsa = snd_soc_component_get_drvdata(component); 176162306a36Sopenharmony_ci 176262306a36Sopenharmony_ci ucontrol->value.integer.value[0] = wsa->ec_hq[ec_tx]; 176362306a36Sopenharmony_ci 176462306a36Sopenharmony_ci return 0; 176562306a36Sopenharmony_ci} 176662306a36Sopenharmony_ci 176762306a36Sopenharmony_cistatic int wsa_macro_set_ec_hq(struct snd_kcontrol *kcontrol, 176862306a36Sopenharmony_ci struct snd_ctl_elem_value *ucontrol) 176962306a36Sopenharmony_ci{ 177062306a36Sopenharmony_ci struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); 177162306a36Sopenharmony_ci int ec_tx = ((struct soc_mixer_control *) kcontrol->private_value)->shift; 177262306a36Sopenharmony_ci int value = ucontrol->value.integer.value[0]; 177362306a36Sopenharmony_ci struct wsa_macro *wsa = snd_soc_component_get_drvdata(component); 177462306a36Sopenharmony_ci 177562306a36Sopenharmony_ci wsa->ec_hq[ec_tx] = value; 177662306a36Sopenharmony_ci 177762306a36Sopenharmony_ci return 0; 177862306a36Sopenharmony_ci} 177962306a36Sopenharmony_ci 178062306a36Sopenharmony_cistatic int wsa_macro_get_compander(struct snd_kcontrol *kcontrol, 178162306a36Sopenharmony_ci struct snd_ctl_elem_value *ucontrol) 178262306a36Sopenharmony_ci{ 178362306a36Sopenharmony_ci 178462306a36Sopenharmony_ci struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); 178562306a36Sopenharmony_ci int comp = ((struct soc_mixer_control *) kcontrol->private_value)->shift; 178662306a36Sopenharmony_ci struct wsa_macro *wsa = snd_soc_component_get_drvdata(component); 178762306a36Sopenharmony_ci 178862306a36Sopenharmony_ci ucontrol->value.integer.value[0] = wsa->comp_enabled[comp]; 178962306a36Sopenharmony_ci return 0; 179062306a36Sopenharmony_ci} 179162306a36Sopenharmony_ci 179262306a36Sopenharmony_cistatic int wsa_macro_set_compander(struct snd_kcontrol *kcontrol, 179362306a36Sopenharmony_ci struct snd_ctl_elem_value *ucontrol) 179462306a36Sopenharmony_ci{ 179562306a36Sopenharmony_ci struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); 179662306a36Sopenharmony_ci int comp = ((struct soc_mixer_control *) kcontrol->private_value)->shift; 179762306a36Sopenharmony_ci int value = ucontrol->value.integer.value[0]; 179862306a36Sopenharmony_ci struct wsa_macro *wsa = snd_soc_component_get_drvdata(component); 179962306a36Sopenharmony_ci 180062306a36Sopenharmony_ci wsa->comp_enabled[comp] = value; 180162306a36Sopenharmony_ci 180262306a36Sopenharmony_ci return 0; 180362306a36Sopenharmony_ci} 180462306a36Sopenharmony_ci 180562306a36Sopenharmony_cistatic int wsa_macro_ear_spkr_pa_gain_get(struct snd_kcontrol *kcontrol, 180662306a36Sopenharmony_ci struct snd_ctl_elem_value *ucontrol) 180762306a36Sopenharmony_ci{ 180862306a36Sopenharmony_ci struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); 180962306a36Sopenharmony_ci struct wsa_macro *wsa = snd_soc_component_get_drvdata(component); 181062306a36Sopenharmony_ci 181162306a36Sopenharmony_ci ucontrol->value.integer.value[0] = wsa->ear_spkr_gain; 181262306a36Sopenharmony_ci 181362306a36Sopenharmony_ci return 0; 181462306a36Sopenharmony_ci} 181562306a36Sopenharmony_ci 181662306a36Sopenharmony_cistatic int wsa_macro_ear_spkr_pa_gain_put(struct snd_kcontrol *kcontrol, 181762306a36Sopenharmony_ci struct snd_ctl_elem_value *ucontrol) 181862306a36Sopenharmony_ci{ 181962306a36Sopenharmony_ci struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); 182062306a36Sopenharmony_ci struct wsa_macro *wsa = snd_soc_component_get_drvdata(component); 182162306a36Sopenharmony_ci 182262306a36Sopenharmony_ci wsa->ear_spkr_gain = ucontrol->value.integer.value[0]; 182362306a36Sopenharmony_ci 182462306a36Sopenharmony_ci return 0; 182562306a36Sopenharmony_ci} 182662306a36Sopenharmony_ci 182762306a36Sopenharmony_cistatic int wsa_macro_rx_mux_get(struct snd_kcontrol *kcontrol, 182862306a36Sopenharmony_ci struct snd_ctl_elem_value *ucontrol) 182962306a36Sopenharmony_ci{ 183062306a36Sopenharmony_ci struct snd_soc_dapm_widget *widget = 183162306a36Sopenharmony_ci snd_soc_dapm_kcontrol_widget(kcontrol); 183262306a36Sopenharmony_ci struct snd_soc_component *component = 183362306a36Sopenharmony_ci snd_soc_dapm_to_component(widget->dapm); 183462306a36Sopenharmony_ci struct wsa_macro *wsa = snd_soc_component_get_drvdata(component); 183562306a36Sopenharmony_ci 183662306a36Sopenharmony_ci ucontrol->value.integer.value[0] = 183762306a36Sopenharmony_ci wsa->rx_port_value[widget->shift]; 183862306a36Sopenharmony_ci return 0; 183962306a36Sopenharmony_ci} 184062306a36Sopenharmony_ci 184162306a36Sopenharmony_cistatic int wsa_macro_rx_mux_put(struct snd_kcontrol *kcontrol, 184262306a36Sopenharmony_ci struct snd_ctl_elem_value *ucontrol) 184362306a36Sopenharmony_ci{ 184462306a36Sopenharmony_ci struct snd_soc_dapm_widget *widget = 184562306a36Sopenharmony_ci snd_soc_dapm_kcontrol_widget(kcontrol); 184662306a36Sopenharmony_ci struct snd_soc_component *component = 184762306a36Sopenharmony_ci snd_soc_dapm_to_component(widget->dapm); 184862306a36Sopenharmony_ci struct soc_enum *e = (struct soc_enum *)kcontrol->private_value; 184962306a36Sopenharmony_ci struct snd_soc_dapm_update *update = NULL; 185062306a36Sopenharmony_ci u32 rx_port_value = ucontrol->value.integer.value[0]; 185162306a36Sopenharmony_ci u32 bit_input; 185262306a36Sopenharmony_ci u32 aif_rst; 185362306a36Sopenharmony_ci struct wsa_macro *wsa = snd_soc_component_get_drvdata(component); 185462306a36Sopenharmony_ci 185562306a36Sopenharmony_ci aif_rst = wsa->rx_port_value[widget->shift]; 185662306a36Sopenharmony_ci if (!rx_port_value) { 185762306a36Sopenharmony_ci if (aif_rst == 0) 185862306a36Sopenharmony_ci return 0; 185962306a36Sopenharmony_ci if (aif_rst >= WSA_MACRO_RX_MAX) { 186062306a36Sopenharmony_ci dev_err(component->dev, "%s: Invalid AIF reset\n", __func__); 186162306a36Sopenharmony_ci return 0; 186262306a36Sopenharmony_ci } 186362306a36Sopenharmony_ci } 186462306a36Sopenharmony_ci wsa->rx_port_value[widget->shift] = rx_port_value; 186562306a36Sopenharmony_ci 186662306a36Sopenharmony_ci bit_input = widget->shift; 186762306a36Sopenharmony_ci 186862306a36Sopenharmony_ci switch (rx_port_value) { 186962306a36Sopenharmony_ci case 0: 187062306a36Sopenharmony_ci if (wsa->active_ch_cnt[aif_rst]) { 187162306a36Sopenharmony_ci clear_bit(bit_input, 187262306a36Sopenharmony_ci &wsa->active_ch_mask[aif_rst]); 187362306a36Sopenharmony_ci wsa->active_ch_cnt[aif_rst]--; 187462306a36Sopenharmony_ci } 187562306a36Sopenharmony_ci break; 187662306a36Sopenharmony_ci case 1: 187762306a36Sopenharmony_ci case 2: 187862306a36Sopenharmony_ci set_bit(bit_input, 187962306a36Sopenharmony_ci &wsa->active_ch_mask[rx_port_value]); 188062306a36Sopenharmony_ci wsa->active_ch_cnt[rx_port_value]++; 188162306a36Sopenharmony_ci break; 188262306a36Sopenharmony_ci default: 188362306a36Sopenharmony_ci dev_err(component->dev, 188462306a36Sopenharmony_ci "%s: Invalid AIF_ID for WSA RX MUX %d\n", 188562306a36Sopenharmony_ci __func__, rx_port_value); 188662306a36Sopenharmony_ci return -EINVAL; 188762306a36Sopenharmony_ci } 188862306a36Sopenharmony_ci 188962306a36Sopenharmony_ci snd_soc_dapm_mux_update_power(widget->dapm, kcontrol, 189062306a36Sopenharmony_ci rx_port_value, e, update); 189162306a36Sopenharmony_ci return 0; 189262306a36Sopenharmony_ci} 189362306a36Sopenharmony_ci 189462306a36Sopenharmony_cistatic int wsa_macro_soft_clip_enable_get(struct snd_kcontrol *kcontrol, 189562306a36Sopenharmony_ci struct snd_ctl_elem_value *ucontrol) 189662306a36Sopenharmony_ci{ 189762306a36Sopenharmony_ci struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); 189862306a36Sopenharmony_ci struct wsa_macro *wsa = snd_soc_component_get_drvdata(component); 189962306a36Sopenharmony_ci int path = ((struct soc_mixer_control *)kcontrol->private_value)->shift; 190062306a36Sopenharmony_ci 190162306a36Sopenharmony_ci ucontrol->value.integer.value[0] = wsa->is_softclip_on[path]; 190262306a36Sopenharmony_ci 190362306a36Sopenharmony_ci return 0; 190462306a36Sopenharmony_ci} 190562306a36Sopenharmony_ci 190662306a36Sopenharmony_cistatic int wsa_macro_soft_clip_enable_put(struct snd_kcontrol *kcontrol, 190762306a36Sopenharmony_ci struct snd_ctl_elem_value *ucontrol) 190862306a36Sopenharmony_ci{ 190962306a36Sopenharmony_ci struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); 191062306a36Sopenharmony_ci struct wsa_macro *wsa = snd_soc_component_get_drvdata(component); 191162306a36Sopenharmony_ci int path = ((struct soc_mixer_control *) kcontrol->private_value)->shift; 191262306a36Sopenharmony_ci 191362306a36Sopenharmony_ci wsa->is_softclip_on[path] = ucontrol->value.integer.value[0]; 191462306a36Sopenharmony_ci 191562306a36Sopenharmony_ci return 0; 191662306a36Sopenharmony_ci} 191762306a36Sopenharmony_ci 191862306a36Sopenharmony_cistatic const struct snd_kcontrol_new wsa_macro_snd_controls[] = { 191962306a36Sopenharmony_ci SOC_ENUM_EXT("EAR SPKR PA Gain", wsa_macro_ear_spkr_pa_gain_enum, 192062306a36Sopenharmony_ci wsa_macro_ear_spkr_pa_gain_get, 192162306a36Sopenharmony_ci wsa_macro_ear_spkr_pa_gain_put), 192262306a36Sopenharmony_ci SOC_SINGLE_EXT("WSA_Softclip0 Enable", SND_SOC_NOPM, 192362306a36Sopenharmony_ci WSA_MACRO_SOFTCLIP0, 1, 0, 192462306a36Sopenharmony_ci wsa_macro_soft_clip_enable_get, 192562306a36Sopenharmony_ci wsa_macro_soft_clip_enable_put), 192662306a36Sopenharmony_ci SOC_SINGLE_EXT("WSA_Softclip1 Enable", SND_SOC_NOPM, 192762306a36Sopenharmony_ci WSA_MACRO_SOFTCLIP1, 1, 0, 192862306a36Sopenharmony_ci wsa_macro_soft_clip_enable_get, 192962306a36Sopenharmony_ci wsa_macro_soft_clip_enable_put), 193062306a36Sopenharmony_ci 193162306a36Sopenharmony_ci SOC_SINGLE_S8_TLV("WSA_RX0 Digital Volume", CDC_WSA_RX0_RX_VOL_CTL, 193262306a36Sopenharmony_ci -84, 40, digital_gain), 193362306a36Sopenharmony_ci SOC_SINGLE_S8_TLV("WSA_RX1 Digital Volume", CDC_WSA_RX1_RX_VOL_CTL, 193462306a36Sopenharmony_ci -84, 40, digital_gain), 193562306a36Sopenharmony_ci 193662306a36Sopenharmony_ci SOC_SINGLE("WSA_RX0 Digital Mute", CDC_WSA_RX0_RX_PATH_CTL, 4, 1, 0), 193762306a36Sopenharmony_ci SOC_SINGLE("WSA_RX1 Digital Mute", CDC_WSA_RX1_RX_PATH_CTL, 4, 1, 0), 193862306a36Sopenharmony_ci SOC_SINGLE("WSA_RX0_MIX Digital Mute", CDC_WSA_RX0_RX_PATH_MIX_CTL, 4, 193962306a36Sopenharmony_ci 1, 0), 194062306a36Sopenharmony_ci SOC_SINGLE("WSA_RX1_MIX Digital Mute", CDC_WSA_RX1_RX_PATH_MIX_CTL, 4, 194162306a36Sopenharmony_ci 1, 0), 194262306a36Sopenharmony_ci SOC_SINGLE_EXT("WSA_COMP1 Switch", SND_SOC_NOPM, WSA_MACRO_COMP1, 1, 0, 194362306a36Sopenharmony_ci wsa_macro_get_compander, wsa_macro_set_compander), 194462306a36Sopenharmony_ci SOC_SINGLE_EXT("WSA_COMP2 Switch", SND_SOC_NOPM, WSA_MACRO_COMP2, 1, 0, 194562306a36Sopenharmony_ci wsa_macro_get_compander, wsa_macro_set_compander), 194662306a36Sopenharmony_ci SOC_SINGLE_EXT("WSA_RX0 EC_HQ Switch", SND_SOC_NOPM, WSA_MACRO_RX0, 1, 0, 194762306a36Sopenharmony_ci wsa_macro_get_ec_hq, wsa_macro_set_ec_hq), 194862306a36Sopenharmony_ci SOC_SINGLE_EXT("WSA_RX1 EC_HQ Switch", SND_SOC_NOPM, WSA_MACRO_RX1, 1, 0, 194962306a36Sopenharmony_ci wsa_macro_get_ec_hq, wsa_macro_set_ec_hq), 195062306a36Sopenharmony_ci}; 195162306a36Sopenharmony_ci 195262306a36Sopenharmony_cistatic const struct soc_enum rx_mux_enum = 195362306a36Sopenharmony_ci SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(rx_mux_text), rx_mux_text); 195462306a36Sopenharmony_ci 195562306a36Sopenharmony_cistatic const struct snd_kcontrol_new rx_mux[WSA_MACRO_RX_MAX] = { 195662306a36Sopenharmony_ci SOC_DAPM_ENUM_EXT("WSA RX0 Mux", rx_mux_enum, 195762306a36Sopenharmony_ci wsa_macro_rx_mux_get, wsa_macro_rx_mux_put), 195862306a36Sopenharmony_ci SOC_DAPM_ENUM_EXT("WSA RX1 Mux", rx_mux_enum, 195962306a36Sopenharmony_ci wsa_macro_rx_mux_get, wsa_macro_rx_mux_put), 196062306a36Sopenharmony_ci SOC_DAPM_ENUM_EXT("WSA RX_MIX0 Mux", rx_mux_enum, 196162306a36Sopenharmony_ci wsa_macro_rx_mux_get, wsa_macro_rx_mux_put), 196262306a36Sopenharmony_ci SOC_DAPM_ENUM_EXT("WSA RX_MIX1 Mux", rx_mux_enum, 196362306a36Sopenharmony_ci wsa_macro_rx_mux_get, wsa_macro_rx_mux_put), 196462306a36Sopenharmony_ci}; 196562306a36Sopenharmony_ci 196662306a36Sopenharmony_cistatic int wsa_macro_vi_feed_mixer_get(struct snd_kcontrol *kcontrol, 196762306a36Sopenharmony_ci struct snd_ctl_elem_value *ucontrol) 196862306a36Sopenharmony_ci{ 196962306a36Sopenharmony_ci struct snd_soc_dapm_widget *widget = snd_soc_dapm_kcontrol_widget(kcontrol); 197062306a36Sopenharmony_ci struct snd_soc_component *component = snd_soc_dapm_to_component(widget->dapm); 197162306a36Sopenharmony_ci struct soc_mixer_control *mixer = (struct soc_mixer_control *)kcontrol->private_value; 197262306a36Sopenharmony_ci struct wsa_macro *wsa = snd_soc_component_get_drvdata(component); 197362306a36Sopenharmony_ci u32 spk_tx_id = mixer->shift; 197462306a36Sopenharmony_ci u32 dai_id = widget->shift; 197562306a36Sopenharmony_ci 197662306a36Sopenharmony_ci if (test_bit(spk_tx_id, &wsa->active_ch_mask[dai_id])) 197762306a36Sopenharmony_ci ucontrol->value.integer.value[0] = 1; 197862306a36Sopenharmony_ci else 197962306a36Sopenharmony_ci ucontrol->value.integer.value[0] = 0; 198062306a36Sopenharmony_ci 198162306a36Sopenharmony_ci return 0; 198262306a36Sopenharmony_ci} 198362306a36Sopenharmony_ci 198462306a36Sopenharmony_cistatic int wsa_macro_vi_feed_mixer_put(struct snd_kcontrol *kcontrol, 198562306a36Sopenharmony_ci struct snd_ctl_elem_value *ucontrol) 198662306a36Sopenharmony_ci{ 198762306a36Sopenharmony_ci struct snd_soc_dapm_widget *widget = snd_soc_dapm_kcontrol_widget(kcontrol); 198862306a36Sopenharmony_ci struct snd_soc_component *component = snd_soc_dapm_to_component(widget->dapm); 198962306a36Sopenharmony_ci struct soc_mixer_control *mixer = (struct soc_mixer_control *)kcontrol->private_value; 199062306a36Sopenharmony_ci struct wsa_macro *wsa = snd_soc_component_get_drvdata(component); 199162306a36Sopenharmony_ci u32 enable = ucontrol->value.integer.value[0]; 199262306a36Sopenharmony_ci u32 spk_tx_id = mixer->shift; 199362306a36Sopenharmony_ci 199462306a36Sopenharmony_ci if (enable) { 199562306a36Sopenharmony_ci if (spk_tx_id == WSA_MACRO_TX0 && 199662306a36Sopenharmony_ci !test_bit(WSA_MACRO_TX0, 199762306a36Sopenharmony_ci &wsa->active_ch_mask[WSA_MACRO_AIF_VI])) { 199862306a36Sopenharmony_ci set_bit(WSA_MACRO_TX0, 199962306a36Sopenharmony_ci &wsa->active_ch_mask[WSA_MACRO_AIF_VI]); 200062306a36Sopenharmony_ci wsa->active_ch_cnt[WSA_MACRO_AIF_VI]++; 200162306a36Sopenharmony_ci } 200262306a36Sopenharmony_ci if (spk_tx_id == WSA_MACRO_TX1 && 200362306a36Sopenharmony_ci !test_bit(WSA_MACRO_TX1, 200462306a36Sopenharmony_ci &wsa->active_ch_mask[WSA_MACRO_AIF_VI])) { 200562306a36Sopenharmony_ci set_bit(WSA_MACRO_TX1, 200662306a36Sopenharmony_ci &wsa->active_ch_mask[WSA_MACRO_AIF_VI]); 200762306a36Sopenharmony_ci wsa->active_ch_cnt[WSA_MACRO_AIF_VI]++; 200862306a36Sopenharmony_ci } 200962306a36Sopenharmony_ci } else { 201062306a36Sopenharmony_ci if (spk_tx_id == WSA_MACRO_TX0 && 201162306a36Sopenharmony_ci test_bit(WSA_MACRO_TX0, 201262306a36Sopenharmony_ci &wsa->active_ch_mask[WSA_MACRO_AIF_VI])) { 201362306a36Sopenharmony_ci clear_bit(WSA_MACRO_TX0, 201462306a36Sopenharmony_ci &wsa->active_ch_mask[WSA_MACRO_AIF_VI]); 201562306a36Sopenharmony_ci wsa->active_ch_cnt[WSA_MACRO_AIF_VI]--; 201662306a36Sopenharmony_ci } 201762306a36Sopenharmony_ci if (spk_tx_id == WSA_MACRO_TX1 && 201862306a36Sopenharmony_ci test_bit(WSA_MACRO_TX1, 201962306a36Sopenharmony_ci &wsa->active_ch_mask[WSA_MACRO_AIF_VI])) { 202062306a36Sopenharmony_ci clear_bit(WSA_MACRO_TX1, 202162306a36Sopenharmony_ci &wsa->active_ch_mask[WSA_MACRO_AIF_VI]); 202262306a36Sopenharmony_ci wsa->active_ch_cnt[WSA_MACRO_AIF_VI]--; 202362306a36Sopenharmony_ci } 202462306a36Sopenharmony_ci } 202562306a36Sopenharmony_ci snd_soc_dapm_mixer_update_power(widget->dapm, kcontrol, enable, NULL); 202662306a36Sopenharmony_ci 202762306a36Sopenharmony_ci return 0; 202862306a36Sopenharmony_ci} 202962306a36Sopenharmony_ci 203062306a36Sopenharmony_cistatic const struct snd_kcontrol_new aif_vi_mixer[] = { 203162306a36Sopenharmony_ci SOC_SINGLE_EXT("WSA_SPKR_VI_1", SND_SOC_NOPM, WSA_MACRO_TX0, 1, 0, 203262306a36Sopenharmony_ci wsa_macro_vi_feed_mixer_get, 203362306a36Sopenharmony_ci wsa_macro_vi_feed_mixer_put), 203462306a36Sopenharmony_ci SOC_SINGLE_EXT("WSA_SPKR_VI_2", SND_SOC_NOPM, WSA_MACRO_TX1, 1, 0, 203562306a36Sopenharmony_ci wsa_macro_vi_feed_mixer_get, 203662306a36Sopenharmony_ci wsa_macro_vi_feed_mixer_put), 203762306a36Sopenharmony_ci}; 203862306a36Sopenharmony_ci 203962306a36Sopenharmony_cistatic const struct snd_soc_dapm_widget wsa_macro_dapm_widgets[] = { 204062306a36Sopenharmony_ci SND_SOC_DAPM_AIF_IN("WSA AIF1 PB", "WSA_AIF1 Playback", 0, 204162306a36Sopenharmony_ci SND_SOC_NOPM, 0, 0), 204262306a36Sopenharmony_ci SND_SOC_DAPM_AIF_IN("WSA AIF_MIX1 PB", "WSA_AIF_MIX1 Playback", 0, 204362306a36Sopenharmony_ci SND_SOC_NOPM, 0, 0), 204462306a36Sopenharmony_ci 204562306a36Sopenharmony_ci SND_SOC_DAPM_AIF_OUT_E("WSA AIF_VI", "WSA_AIF_VI Capture", 0, 204662306a36Sopenharmony_ci SND_SOC_NOPM, WSA_MACRO_AIF_VI, 0, 204762306a36Sopenharmony_ci wsa_macro_enable_vi_feedback, 204862306a36Sopenharmony_ci SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD), 204962306a36Sopenharmony_ci SND_SOC_DAPM_AIF_OUT("WSA AIF_ECHO", "WSA_AIF_ECHO Capture", 0, 205062306a36Sopenharmony_ci SND_SOC_NOPM, 0, 0), 205162306a36Sopenharmony_ci 205262306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("WSA_AIF_VI Mixer", SND_SOC_NOPM, WSA_MACRO_AIF_VI, 205362306a36Sopenharmony_ci 0, aif_vi_mixer, ARRAY_SIZE(aif_vi_mixer)), 205462306a36Sopenharmony_ci SND_SOC_DAPM_MUX_E("WSA RX_MIX EC0_MUX", SND_SOC_NOPM, 205562306a36Sopenharmony_ci WSA_MACRO_EC0_MUX, 0, 205662306a36Sopenharmony_ci &rx_mix_ec0_mux, wsa_macro_enable_echo, 205762306a36Sopenharmony_ci SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), 205862306a36Sopenharmony_ci SND_SOC_DAPM_MUX_E("WSA RX_MIX EC1_MUX", SND_SOC_NOPM, 205962306a36Sopenharmony_ci WSA_MACRO_EC1_MUX, 0, 206062306a36Sopenharmony_ci &rx_mix_ec1_mux, wsa_macro_enable_echo, 206162306a36Sopenharmony_ci SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), 206262306a36Sopenharmony_ci 206362306a36Sopenharmony_ci SND_SOC_DAPM_MUX("WSA RX0 MUX", SND_SOC_NOPM, WSA_MACRO_RX0, 0, 206462306a36Sopenharmony_ci &rx_mux[WSA_MACRO_RX0]), 206562306a36Sopenharmony_ci SND_SOC_DAPM_MUX("WSA RX1 MUX", SND_SOC_NOPM, WSA_MACRO_RX1, 0, 206662306a36Sopenharmony_ci &rx_mux[WSA_MACRO_RX1]), 206762306a36Sopenharmony_ci SND_SOC_DAPM_MUX("WSA RX_MIX0 MUX", SND_SOC_NOPM, WSA_MACRO_RX_MIX0, 0, 206862306a36Sopenharmony_ci &rx_mux[WSA_MACRO_RX_MIX0]), 206962306a36Sopenharmony_ci SND_SOC_DAPM_MUX("WSA RX_MIX1 MUX", SND_SOC_NOPM, WSA_MACRO_RX_MIX1, 0, 207062306a36Sopenharmony_ci &rx_mux[WSA_MACRO_RX_MIX1]), 207162306a36Sopenharmony_ci 207262306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("WSA RX0", SND_SOC_NOPM, 0, 0, NULL, 0), 207362306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("WSA RX1", SND_SOC_NOPM, 0, 0, NULL, 0), 207462306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("WSA RX_MIX0", SND_SOC_NOPM, 0, 0, NULL, 0), 207562306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("WSA RX_MIX1", SND_SOC_NOPM, 0, 0, NULL, 0), 207662306a36Sopenharmony_ci 207762306a36Sopenharmony_ci SND_SOC_DAPM_MUX("WSA_RX0 INP0", SND_SOC_NOPM, 0, 0, &rx0_prim_inp0_mux), 207862306a36Sopenharmony_ci SND_SOC_DAPM_MUX("WSA_RX0 INP1", SND_SOC_NOPM, 0, 0, &rx0_prim_inp1_mux), 207962306a36Sopenharmony_ci SND_SOC_DAPM_MUX("WSA_RX0 INP2", SND_SOC_NOPM, 0, 0, &rx0_prim_inp2_mux), 208062306a36Sopenharmony_ci SND_SOC_DAPM_MUX_E("WSA_RX0 MIX INP", SND_SOC_NOPM, WSA_MACRO_RX_MIX0, 208162306a36Sopenharmony_ci 0, &rx0_mix_mux, wsa_macro_enable_mix_path, 208262306a36Sopenharmony_ci SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), 208362306a36Sopenharmony_ci SND_SOC_DAPM_MUX("WSA_RX1 INP0", SND_SOC_NOPM, 0, 0, &rx1_prim_inp0_mux), 208462306a36Sopenharmony_ci SND_SOC_DAPM_MUX("WSA_RX1 INP1", SND_SOC_NOPM, 0, 0, &rx1_prim_inp1_mux), 208562306a36Sopenharmony_ci SND_SOC_DAPM_MUX("WSA_RX1 INP2", SND_SOC_NOPM, 0, 0, &rx1_prim_inp2_mux), 208662306a36Sopenharmony_ci SND_SOC_DAPM_MUX_E("WSA_RX1 MIX INP", SND_SOC_NOPM, WSA_MACRO_RX_MIX1, 208762306a36Sopenharmony_ci 0, &rx1_mix_mux, wsa_macro_enable_mix_path, 208862306a36Sopenharmony_ci SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), 208962306a36Sopenharmony_ci 209062306a36Sopenharmony_ci SND_SOC_DAPM_MIXER_E("WSA_RX INT0 MIX", SND_SOC_NOPM, 0, 0, NULL, 0, 209162306a36Sopenharmony_ci wsa_macro_enable_main_path, SND_SOC_DAPM_PRE_PMU), 209262306a36Sopenharmony_ci SND_SOC_DAPM_MIXER_E("WSA_RX INT1 MIX", SND_SOC_NOPM, 1, 0, NULL, 0, 209362306a36Sopenharmony_ci wsa_macro_enable_main_path, SND_SOC_DAPM_PRE_PMU), 209462306a36Sopenharmony_ci 209562306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("WSA_RX INT0 SEC MIX", SND_SOC_NOPM, 0, 0, NULL, 0), 209662306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("WSA_RX INT1 SEC MIX", SND_SOC_NOPM, 0, 0, NULL, 0), 209762306a36Sopenharmony_ci 209862306a36Sopenharmony_ci SND_SOC_DAPM_MUX("WSA_RX0 INT0 SIDETONE MIX", CDC_WSA_RX0_RX_PATH_CFG1, 209962306a36Sopenharmony_ci 4, 0, &rx0_sidetone_mix_mux), 210062306a36Sopenharmony_ci 210162306a36Sopenharmony_ci SND_SOC_DAPM_INPUT("WSA SRC0_INP"), 210262306a36Sopenharmony_ci SND_SOC_DAPM_INPUT("WSA_TX DEC0_INP"), 210362306a36Sopenharmony_ci SND_SOC_DAPM_INPUT("WSA_TX DEC1_INP"), 210462306a36Sopenharmony_ci 210562306a36Sopenharmony_ci SND_SOC_DAPM_MIXER_E("WSA_RX INT0 INTERP", SND_SOC_NOPM, 210662306a36Sopenharmony_ci WSA_MACRO_COMP1, 0, NULL, 0, 210762306a36Sopenharmony_ci wsa_macro_enable_interpolator, 210862306a36Sopenharmony_ci SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | 210962306a36Sopenharmony_ci SND_SOC_DAPM_POST_PMD), 211062306a36Sopenharmony_ci 211162306a36Sopenharmony_ci SND_SOC_DAPM_MIXER_E("WSA_RX INT1 INTERP", SND_SOC_NOPM, 211262306a36Sopenharmony_ci WSA_MACRO_COMP2, 0, NULL, 0, 211362306a36Sopenharmony_ci wsa_macro_enable_interpolator, 211462306a36Sopenharmony_ci SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | 211562306a36Sopenharmony_ci SND_SOC_DAPM_POST_PMD), 211662306a36Sopenharmony_ci 211762306a36Sopenharmony_ci SND_SOC_DAPM_MIXER_E("WSA_RX INT0 CHAIN", SND_SOC_NOPM, 0, 0, 211862306a36Sopenharmony_ci NULL, 0, wsa_macro_spk_boost_event, 211962306a36Sopenharmony_ci SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | 212062306a36Sopenharmony_ci SND_SOC_DAPM_POST_PMD), 212162306a36Sopenharmony_ci 212262306a36Sopenharmony_ci SND_SOC_DAPM_MIXER_E("WSA_RX INT1 CHAIN", SND_SOC_NOPM, 0, 0, 212362306a36Sopenharmony_ci NULL, 0, wsa_macro_spk_boost_event, 212462306a36Sopenharmony_ci SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | 212562306a36Sopenharmony_ci SND_SOC_DAPM_POST_PMD), 212662306a36Sopenharmony_ci 212762306a36Sopenharmony_ci SND_SOC_DAPM_INPUT("VIINPUT_WSA"), 212862306a36Sopenharmony_ci SND_SOC_DAPM_OUTPUT("WSA_SPK1 OUT"), 212962306a36Sopenharmony_ci SND_SOC_DAPM_OUTPUT("WSA_SPK2 OUT"), 213062306a36Sopenharmony_ci 213162306a36Sopenharmony_ci SND_SOC_DAPM_SUPPLY("WSA_RX0_CLK", CDC_WSA_RX0_RX_PATH_CTL, 5, 0, NULL, 0), 213262306a36Sopenharmony_ci SND_SOC_DAPM_SUPPLY("WSA_RX1_CLK", CDC_WSA_RX1_RX_PATH_CTL, 5, 0, NULL, 0), 213362306a36Sopenharmony_ci SND_SOC_DAPM_SUPPLY("WSA_RX_MIX0_CLK", CDC_WSA_RX0_RX_PATH_MIX_CTL, 5, 0, NULL, 0), 213462306a36Sopenharmony_ci SND_SOC_DAPM_SUPPLY("WSA_RX_MIX1_CLK", CDC_WSA_RX1_RX_PATH_MIX_CTL, 5, 0, NULL, 0), 213562306a36Sopenharmony_ci SND_SOC_DAPM_SUPPLY_S("WSA_MCLK", 0, SND_SOC_NOPM, 0, 0, 213662306a36Sopenharmony_ci wsa_macro_mclk_event, 213762306a36Sopenharmony_ci SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), 213862306a36Sopenharmony_ci}; 213962306a36Sopenharmony_ci 214062306a36Sopenharmony_cistatic const struct snd_soc_dapm_route wsa_audio_map[] = { 214162306a36Sopenharmony_ci /* VI Feedback */ 214262306a36Sopenharmony_ci {"WSA_AIF_VI Mixer", "WSA_SPKR_VI_1", "VIINPUT_WSA"}, 214362306a36Sopenharmony_ci {"WSA_AIF_VI Mixer", "WSA_SPKR_VI_2", "VIINPUT_WSA"}, 214462306a36Sopenharmony_ci {"WSA AIF_VI", NULL, "WSA_AIF_VI Mixer"}, 214562306a36Sopenharmony_ci {"WSA AIF_VI", NULL, "WSA_MCLK"}, 214662306a36Sopenharmony_ci 214762306a36Sopenharmony_ci {"WSA RX_MIX EC0_MUX", "RX_MIX_TX0", "WSA_RX INT0 SEC MIX"}, 214862306a36Sopenharmony_ci {"WSA RX_MIX EC1_MUX", "RX_MIX_TX0", "WSA_RX INT0 SEC MIX"}, 214962306a36Sopenharmony_ci {"WSA RX_MIX EC0_MUX", "RX_MIX_TX1", "WSA_RX INT1 SEC MIX"}, 215062306a36Sopenharmony_ci {"WSA RX_MIX EC1_MUX", "RX_MIX_TX1", "WSA_RX INT1 SEC MIX"}, 215162306a36Sopenharmony_ci {"WSA AIF_ECHO", NULL, "WSA RX_MIX EC0_MUX"}, 215262306a36Sopenharmony_ci {"WSA AIF_ECHO", NULL, "WSA RX_MIX EC1_MUX"}, 215362306a36Sopenharmony_ci {"WSA AIF_ECHO", NULL, "WSA_MCLK"}, 215462306a36Sopenharmony_ci 215562306a36Sopenharmony_ci {"WSA AIF1 PB", NULL, "WSA_MCLK"}, 215662306a36Sopenharmony_ci {"WSA AIF_MIX1 PB", NULL, "WSA_MCLK"}, 215762306a36Sopenharmony_ci 215862306a36Sopenharmony_ci {"WSA RX0 MUX", "AIF1_PB", "WSA AIF1 PB"}, 215962306a36Sopenharmony_ci {"WSA RX1 MUX", "AIF1_PB", "WSA AIF1 PB"}, 216062306a36Sopenharmony_ci {"WSA RX_MIX0 MUX", "AIF1_PB", "WSA AIF1 PB"}, 216162306a36Sopenharmony_ci {"WSA RX_MIX1 MUX", "AIF1_PB", "WSA AIF1 PB"}, 216262306a36Sopenharmony_ci 216362306a36Sopenharmony_ci {"WSA RX0 MUX", "AIF_MIX1_PB", "WSA AIF_MIX1 PB"}, 216462306a36Sopenharmony_ci {"WSA RX1 MUX", "AIF_MIX1_PB", "WSA AIF_MIX1 PB"}, 216562306a36Sopenharmony_ci {"WSA RX_MIX0 MUX", "AIF_MIX1_PB", "WSA AIF_MIX1 PB"}, 216662306a36Sopenharmony_ci {"WSA RX_MIX1 MUX", "AIF_MIX1_PB", "WSA AIF_MIX1 PB"}, 216762306a36Sopenharmony_ci 216862306a36Sopenharmony_ci {"WSA RX0", NULL, "WSA RX0 MUX"}, 216962306a36Sopenharmony_ci {"WSA RX1", NULL, "WSA RX1 MUX"}, 217062306a36Sopenharmony_ci {"WSA RX_MIX0", NULL, "WSA RX_MIX0 MUX"}, 217162306a36Sopenharmony_ci {"WSA RX_MIX1", NULL, "WSA RX_MIX1 MUX"}, 217262306a36Sopenharmony_ci 217362306a36Sopenharmony_ci {"WSA RX0", NULL, "WSA_RX0_CLK"}, 217462306a36Sopenharmony_ci {"WSA RX1", NULL, "WSA_RX1_CLK"}, 217562306a36Sopenharmony_ci {"WSA RX_MIX0", NULL, "WSA_RX_MIX0_CLK"}, 217662306a36Sopenharmony_ci {"WSA RX_MIX1", NULL, "WSA_RX_MIX1_CLK"}, 217762306a36Sopenharmony_ci 217862306a36Sopenharmony_ci {"WSA_RX0 INP0", "RX0", "WSA RX0"}, 217962306a36Sopenharmony_ci {"WSA_RX0 INP0", "RX1", "WSA RX1"}, 218062306a36Sopenharmony_ci {"WSA_RX0 INP0", "RX_MIX0", "WSA RX_MIX0"}, 218162306a36Sopenharmony_ci {"WSA_RX0 INP0", "RX_MIX1", "WSA RX_MIX1"}, 218262306a36Sopenharmony_ci {"WSA_RX0 INP0", "DEC0", "WSA_TX DEC0_INP"}, 218362306a36Sopenharmony_ci {"WSA_RX0 INP0", "DEC1", "WSA_TX DEC1_INP"}, 218462306a36Sopenharmony_ci {"WSA_RX INT0 MIX", NULL, "WSA_RX0 INP0"}, 218562306a36Sopenharmony_ci 218662306a36Sopenharmony_ci {"WSA_RX0 INP1", "RX0", "WSA RX0"}, 218762306a36Sopenharmony_ci {"WSA_RX0 INP1", "RX1", "WSA RX1"}, 218862306a36Sopenharmony_ci {"WSA_RX0 INP1", "RX_MIX0", "WSA RX_MIX0"}, 218962306a36Sopenharmony_ci {"WSA_RX0 INP1", "RX_MIX1", "WSA RX_MIX1"}, 219062306a36Sopenharmony_ci {"WSA_RX0 INP1", "DEC0", "WSA_TX DEC0_INP"}, 219162306a36Sopenharmony_ci {"WSA_RX0 INP1", "DEC1", "WSA_TX DEC1_INP"}, 219262306a36Sopenharmony_ci {"WSA_RX INT0 MIX", NULL, "WSA_RX0 INP1"}, 219362306a36Sopenharmony_ci 219462306a36Sopenharmony_ci {"WSA_RX0 INP2", "RX0", "WSA RX0"}, 219562306a36Sopenharmony_ci {"WSA_RX0 INP2", "RX1", "WSA RX1"}, 219662306a36Sopenharmony_ci {"WSA_RX0 INP2", "RX_MIX0", "WSA RX_MIX0"}, 219762306a36Sopenharmony_ci {"WSA_RX0 INP2", "RX_MIX1", "WSA RX_MIX1"}, 219862306a36Sopenharmony_ci {"WSA_RX0 INP2", "DEC0", "WSA_TX DEC0_INP"}, 219962306a36Sopenharmony_ci {"WSA_RX0 INP2", "DEC1", "WSA_TX DEC1_INP"}, 220062306a36Sopenharmony_ci {"WSA_RX INT0 MIX", NULL, "WSA_RX0 INP2"}, 220162306a36Sopenharmony_ci 220262306a36Sopenharmony_ci {"WSA_RX0 MIX INP", "RX0", "WSA RX0"}, 220362306a36Sopenharmony_ci {"WSA_RX0 MIX INP", "RX1", "WSA RX1"}, 220462306a36Sopenharmony_ci {"WSA_RX0 MIX INP", "RX_MIX0", "WSA RX_MIX0"}, 220562306a36Sopenharmony_ci {"WSA_RX0 MIX INP", "RX_MIX1", "WSA RX_MIX1"}, 220662306a36Sopenharmony_ci {"WSA_RX INT0 SEC MIX", NULL, "WSA_RX0 MIX INP"}, 220762306a36Sopenharmony_ci 220862306a36Sopenharmony_ci {"WSA_RX INT0 SEC MIX", NULL, "WSA_RX INT0 MIX"}, 220962306a36Sopenharmony_ci {"WSA_RX INT0 INTERP", NULL, "WSA_RX INT0 SEC MIX"}, 221062306a36Sopenharmony_ci {"WSA_RX0 INT0 SIDETONE MIX", "SRC0", "WSA SRC0_INP"}, 221162306a36Sopenharmony_ci {"WSA_RX INT0 INTERP", NULL, "WSA_RX0 INT0 SIDETONE MIX"}, 221262306a36Sopenharmony_ci {"WSA_RX INT0 CHAIN", NULL, "WSA_RX INT0 INTERP"}, 221362306a36Sopenharmony_ci 221462306a36Sopenharmony_ci {"WSA_SPK1 OUT", NULL, "WSA_RX INT0 CHAIN"}, 221562306a36Sopenharmony_ci {"WSA_SPK1 OUT", NULL, "WSA_MCLK"}, 221662306a36Sopenharmony_ci 221762306a36Sopenharmony_ci {"WSA_RX1 INP0", "RX0", "WSA RX0"}, 221862306a36Sopenharmony_ci {"WSA_RX1 INP0", "RX1", "WSA RX1"}, 221962306a36Sopenharmony_ci {"WSA_RX1 INP0", "RX_MIX0", "WSA RX_MIX0"}, 222062306a36Sopenharmony_ci {"WSA_RX1 INP0", "RX_MIX1", "WSA RX_MIX1"}, 222162306a36Sopenharmony_ci {"WSA_RX1 INP0", "DEC0", "WSA_TX DEC0_INP"}, 222262306a36Sopenharmony_ci {"WSA_RX1 INP0", "DEC1", "WSA_TX DEC1_INP"}, 222362306a36Sopenharmony_ci {"WSA_RX INT1 MIX", NULL, "WSA_RX1 INP0"}, 222462306a36Sopenharmony_ci 222562306a36Sopenharmony_ci {"WSA_RX1 INP1", "RX0", "WSA RX0"}, 222662306a36Sopenharmony_ci {"WSA_RX1 INP1", "RX1", "WSA RX1"}, 222762306a36Sopenharmony_ci {"WSA_RX1 INP1", "RX_MIX0", "WSA RX_MIX0"}, 222862306a36Sopenharmony_ci {"WSA_RX1 INP1", "RX_MIX1", "WSA RX_MIX1"}, 222962306a36Sopenharmony_ci {"WSA_RX1 INP1", "DEC0", "WSA_TX DEC0_INP"}, 223062306a36Sopenharmony_ci {"WSA_RX1 INP1", "DEC1", "WSA_TX DEC1_INP"}, 223162306a36Sopenharmony_ci {"WSA_RX INT1 MIX", NULL, "WSA_RX1 INP1"}, 223262306a36Sopenharmony_ci 223362306a36Sopenharmony_ci {"WSA_RX1 INP2", "RX0", "WSA RX0"}, 223462306a36Sopenharmony_ci {"WSA_RX1 INP2", "RX1", "WSA RX1"}, 223562306a36Sopenharmony_ci {"WSA_RX1 INP2", "RX_MIX0", "WSA RX_MIX0"}, 223662306a36Sopenharmony_ci {"WSA_RX1 INP2", "RX_MIX1", "WSA RX_MIX1"}, 223762306a36Sopenharmony_ci {"WSA_RX1 INP2", "DEC0", "WSA_TX DEC0_INP"}, 223862306a36Sopenharmony_ci {"WSA_RX1 INP2", "DEC1", "WSA_TX DEC1_INP"}, 223962306a36Sopenharmony_ci {"WSA_RX INT1 MIX", NULL, "WSA_RX1 INP2"}, 224062306a36Sopenharmony_ci 224162306a36Sopenharmony_ci {"WSA_RX1 MIX INP", "RX0", "WSA RX0"}, 224262306a36Sopenharmony_ci {"WSA_RX1 MIX INP", "RX1", "WSA RX1"}, 224362306a36Sopenharmony_ci {"WSA_RX1 MIX INP", "RX_MIX0", "WSA RX_MIX0"}, 224462306a36Sopenharmony_ci {"WSA_RX1 MIX INP", "RX_MIX1", "WSA RX_MIX1"}, 224562306a36Sopenharmony_ci {"WSA_RX INT1 SEC MIX", NULL, "WSA_RX1 MIX INP"}, 224662306a36Sopenharmony_ci 224762306a36Sopenharmony_ci {"WSA_RX INT1 SEC MIX", NULL, "WSA_RX INT1 MIX"}, 224862306a36Sopenharmony_ci {"WSA_RX INT1 INTERP", NULL, "WSA_RX INT1 SEC MIX"}, 224962306a36Sopenharmony_ci 225062306a36Sopenharmony_ci {"WSA_RX INT1 CHAIN", NULL, "WSA_RX INT1 INTERP"}, 225162306a36Sopenharmony_ci {"WSA_SPK2 OUT", NULL, "WSA_RX INT1 CHAIN"}, 225262306a36Sopenharmony_ci {"WSA_SPK2 OUT", NULL, "WSA_MCLK"}, 225362306a36Sopenharmony_ci}; 225462306a36Sopenharmony_ci 225562306a36Sopenharmony_cistatic int wsa_swrm_clock(struct wsa_macro *wsa, bool enable) 225662306a36Sopenharmony_ci{ 225762306a36Sopenharmony_ci struct regmap *regmap = wsa->regmap; 225862306a36Sopenharmony_ci 225962306a36Sopenharmony_ci if (enable) { 226062306a36Sopenharmony_ci int ret; 226162306a36Sopenharmony_ci 226262306a36Sopenharmony_ci ret = clk_prepare_enable(wsa->mclk); 226362306a36Sopenharmony_ci if (ret) { 226462306a36Sopenharmony_ci dev_err(wsa->dev, "failed to enable mclk\n"); 226562306a36Sopenharmony_ci return ret; 226662306a36Sopenharmony_ci } 226762306a36Sopenharmony_ci wsa_macro_mclk_enable(wsa, true); 226862306a36Sopenharmony_ci 226962306a36Sopenharmony_ci regmap_update_bits(regmap, CDC_WSA_CLK_RST_CTRL_SWR_CONTROL, 227062306a36Sopenharmony_ci CDC_WSA_SWR_CLK_EN_MASK, 227162306a36Sopenharmony_ci CDC_WSA_SWR_CLK_ENABLE); 227262306a36Sopenharmony_ci 227362306a36Sopenharmony_ci } else { 227462306a36Sopenharmony_ci regmap_update_bits(regmap, CDC_WSA_CLK_RST_CTRL_SWR_CONTROL, 227562306a36Sopenharmony_ci CDC_WSA_SWR_CLK_EN_MASK, 0); 227662306a36Sopenharmony_ci wsa_macro_mclk_enable(wsa, false); 227762306a36Sopenharmony_ci clk_disable_unprepare(wsa->mclk); 227862306a36Sopenharmony_ci } 227962306a36Sopenharmony_ci 228062306a36Sopenharmony_ci return 0; 228162306a36Sopenharmony_ci} 228262306a36Sopenharmony_ci 228362306a36Sopenharmony_cistatic int wsa_macro_component_probe(struct snd_soc_component *comp) 228462306a36Sopenharmony_ci{ 228562306a36Sopenharmony_ci struct wsa_macro *wsa = snd_soc_component_get_drvdata(comp); 228662306a36Sopenharmony_ci 228762306a36Sopenharmony_ci snd_soc_component_init_regmap(comp, wsa->regmap); 228862306a36Sopenharmony_ci 228962306a36Sopenharmony_ci wsa->spkr_gain_offset = WSA_MACRO_GAIN_OFFSET_M1P5_DB; 229062306a36Sopenharmony_ci 229162306a36Sopenharmony_ci /* set SPKR rate to FS_2P4_3P072 */ 229262306a36Sopenharmony_ci snd_soc_component_update_bits(comp, CDC_WSA_RX0_RX_PATH_CFG1, 229362306a36Sopenharmony_ci CDC_WSA_RX_PATH_SPKR_RATE_MASK, 229462306a36Sopenharmony_ci CDC_WSA_RX_PATH_SPKR_RATE_FS_2P4_3P072); 229562306a36Sopenharmony_ci 229662306a36Sopenharmony_ci snd_soc_component_update_bits(comp, CDC_WSA_RX1_RX_PATH_CFG1, 229762306a36Sopenharmony_ci CDC_WSA_RX_PATH_SPKR_RATE_MASK, 229862306a36Sopenharmony_ci CDC_WSA_RX_PATH_SPKR_RATE_FS_2P4_3P072); 229962306a36Sopenharmony_ci 230062306a36Sopenharmony_ci wsa_macro_set_spkr_mode(comp, WSA_MACRO_SPKR_MODE_1); 230162306a36Sopenharmony_ci 230262306a36Sopenharmony_ci return 0; 230362306a36Sopenharmony_ci} 230462306a36Sopenharmony_ci 230562306a36Sopenharmony_cistatic int swclk_gate_enable(struct clk_hw *hw) 230662306a36Sopenharmony_ci{ 230762306a36Sopenharmony_ci return wsa_swrm_clock(to_wsa_macro(hw), true); 230862306a36Sopenharmony_ci} 230962306a36Sopenharmony_ci 231062306a36Sopenharmony_cistatic void swclk_gate_disable(struct clk_hw *hw) 231162306a36Sopenharmony_ci{ 231262306a36Sopenharmony_ci wsa_swrm_clock(to_wsa_macro(hw), false); 231362306a36Sopenharmony_ci} 231462306a36Sopenharmony_ci 231562306a36Sopenharmony_cistatic int swclk_gate_is_enabled(struct clk_hw *hw) 231662306a36Sopenharmony_ci{ 231762306a36Sopenharmony_ci struct wsa_macro *wsa = to_wsa_macro(hw); 231862306a36Sopenharmony_ci int ret, val; 231962306a36Sopenharmony_ci 232062306a36Sopenharmony_ci regmap_read(wsa->regmap, CDC_WSA_CLK_RST_CTRL_SWR_CONTROL, &val); 232162306a36Sopenharmony_ci ret = val & BIT(0); 232262306a36Sopenharmony_ci 232362306a36Sopenharmony_ci return ret; 232462306a36Sopenharmony_ci} 232562306a36Sopenharmony_ci 232662306a36Sopenharmony_cistatic unsigned long swclk_recalc_rate(struct clk_hw *hw, 232762306a36Sopenharmony_ci unsigned long parent_rate) 232862306a36Sopenharmony_ci{ 232962306a36Sopenharmony_ci return parent_rate / 2; 233062306a36Sopenharmony_ci} 233162306a36Sopenharmony_ci 233262306a36Sopenharmony_cistatic const struct clk_ops swclk_gate_ops = { 233362306a36Sopenharmony_ci .prepare = swclk_gate_enable, 233462306a36Sopenharmony_ci .unprepare = swclk_gate_disable, 233562306a36Sopenharmony_ci .is_enabled = swclk_gate_is_enabled, 233662306a36Sopenharmony_ci .recalc_rate = swclk_recalc_rate, 233762306a36Sopenharmony_ci}; 233862306a36Sopenharmony_ci 233962306a36Sopenharmony_cistatic int wsa_macro_register_mclk_output(struct wsa_macro *wsa) 234062306a36Sopenharmony_ci{ 234162306a36Sopenharmony_ci struct device *dev = wsa->dev; 234262306a36Sopenharmony_ci const char *parent_clk_name; 234362306a36Sopenharmony_ci struct clk_hw *hw; 234462306a36Sopenharmony_ci struct clk_init_data init; 234562306a36Sopenharmony_ci int ret; 234662306a36Sopenharmony_ci 234762306a36Sopenharmony_ci if (wsa->npl) 234862306a36Sopenharmony_ci parent_clk_name = __clk_get_name(wsa->npl); 234962306a36Sopenharmony_ci else 235062306a36Sopenharmony_ci parent_clk_name = __clk_get_name(wsa->mclk); 235162306a36Sopenharmony_ci 235262306a36Sopenharmony_ci init.name = "mclk"; 235362306a36Sopenharmony_ci of_property_read_string(dev_of_node(dev), "clock-output-names", 235462306a36Sopenharmony_ci &init.name); 235562306a36Sopenharmony_ci init.ops = &swclk_gate_ops; 235662306a36Sopenharmony_ci init.flags = 0; 235762306a36Sopenharmony_ci init.parent_names = &parent_clk_name; 235862306a36Sopenharmony_ci init.num_parents = 1; 235962306a36Sopenharmony_ci wsa->hw.init = &init; 236062306a36Sopenharmony_ci hw = &wsa->hw; 236162306a36Sopenharmony_ci ret = clk_hw_register(wsa->dev, hw); 236262306a36Sopenharmony_ci if (ret) 236362306a36Sopenharmony_ci return ret; 236462306a36Sopenharmony_ci 236562306a36Sopenharmony_ci return devm_of_clk_add_hw_provider(dev, of_clk_hw_simple_get, hw); 236662306a36Sopenharmony_ci} 236762306a36Sopenharmony_ci 236862306a36Sopenharmony_cistatic const struct snd_soc_component_driver wsa_macro_component_drv = { 236962306a36Sopenharmony_ci .name = "WSA MACRO", 237062306a36Sopenharmony_ci .probe = wsa_macro_component_probe, 237162306a36Sopenharmony_ci .controls = wsa_macro_snd_controls, 237262306a36Sopenharmony_ci .num_controls = ARRAY_SIZE(wsa_macro_snd_controls), 237362306a36Sopenharmony_ci .dapm_widgets = wsa_macro_dapm_widgets, 237462306a36Sopenharmony_ci .num_dapm_widgets = ARRAY_SIZE(wsa_macro_dapm_widgets), 237562306a36Sopenharmony_ci .dapm_routes = wsa_audio_map, 237662306a36Sopenharmony_ci .num_dapm_routes = ARRAY_SIZE(wsa_audio_map), 237762306a36Sopenharmony_ci}; 237862306a36Sopenharmony_ci 237962306a36Sopenharmony_cistatic int wsa_macro_probe(struct platform_device *pdev) 238062306a36Sopenharmony_ci{ 238162306a36Sopenharmony_ci struct device *dev = &pdev->dev; 238262306a36Sopenharmony_ci struct wsa_macro *wsa; 238362306a36Sopenharmony_ci kernel_ulong_t flags; 238462306a36Sopenharmony_ci void __iomem *base; 238562306a36Sopenharmony_ci int ret; 238662306a36Sopenharmony_ci 238762306a36Sopenharmony_ci flags = (kernel_ulong_t)device_get_match_data(dev); 238862306a36Sopenharmony_ci 238962306a36Sopenharmony_ci wsa = devm_kzalloc(dev, sizeof(*wsa), GFP_KERNEL); 239062306a36Sopenharmony_ci if (!wsa) 239162306a36Sopenharmony_ci return -ENOMEM; 239262306a36Sopenharmony_ci 239362306a36Sopenharmony_ci wsa->macro = devm_clk_get_optional(dev, "macro"); 239462306a36Sopenharmony_ci if (IS_ERR(wsa->macro)) 239562306a36Sopenharmony_ci return dev_err_probe(dev, PTR_ERR(wsa->macro), "unable to get macro clock\n"); 239662306a36Sopenharmony_ci 239762306a36Sopenharmony_ci wsa->dcodec = devm_clk_get_optional(dev, "dcodec"); 239862306a36Sopenharmony_ci if (IS_ERR(wsa->dcodec)) 239962306a36Sopenharmony_ci return dev_err_probe(dev, PTR_ERR(wsa->dcodec), "unable to get dcodec clock\n"); 240062306a36Sopenharmony_ci 240162306a36Sopenharmony_ci wsa->mclk = devm_clk_get(dev, "mclk"); 240262306a36Sopenharmony_ci if (IS_ERR(wsa->mclk)) 240362306a36Sopenharmony_ci return dev_err_probe(dev, PTR_ERR(wsa->mclk), "unable to get mclk clock\n"); 240462306a36Sopenharmony_ci 240562306a36Sopenharmony_ci if (flags & LPASS_MACRO_FLAG_HAS_NPL_CLOCK) { 240662306a36Sopenharmony_ci wsa->npl = devm_clk_get(dev, "npl"); 240762306a36Sopenharmony_ci if (IS_ERR(wsa->npl)) 240862306a36Sopenharmony_ci return dev_err_probe(dev, PTR_ERR(wsa->npl), "unable to get npl clock\n"); 240962306a36Sopenharmony_ci } 241062306a36Sopenharmony_ci 241162306a36Sopenharmony_ci wsa->fsgen = devm_clk_get(dev, "fsgen"); 241262306a36Sopenharmony_ci if (IS_ERR(wsa->fsgen)) 241362306a36Sopenharmony_ci return dev_err_probe(dev, PTR_ERR(wsa->fsgen), "unable to get fsgen clock\n"); 241462306a36Sopenharmony_ci 241562306a36Sopenharmony_ci base = devm_platform_ioremap_resource(pdev, 0); 241662306a36Sopenharmony_ci if (IS_ERR(base)) 241762306a36Sopenharmony_ci return PTR_ERR(base); 241862306a36Sopenharmony_ci 241962306a36Sopenharmony_ci wsa->regmap = devm_regmap_init_mmio(dev, base, &wsa_regmap_config); 242062306a36Sopenharmony_ci if (IS_ERR(wsa->regmap)) 242162306a36Sopenharmony_ci return PTR_ERR(wsa->regmap); 242262306a36Sopenharmony_ci 242362306a36Sopenharmony_ci dev_set_drvdata(dev, wsa); 242462306a36Sopenharmony_ci 242562306a36Sopenharmony_ci wsa->dev = dev; 242662306a36Sopenharmony_ci 242762306a36Sopenharmony_ci /* set MCLK and NPL rates */ 242862306a36Sopenharmony_ci clk_set_rate(wsa->mclk, WSA_MACRO_MCLK_FREQ); 242962306a36Sopenharmony_ci clk_set_rate(wsa->npl, WSA_MACRO_MCLK_FREQ); 243062306a36Sopenharmony_ci 243162306a36Sopenharmony_ci ret = clk_prepare_enable(wsa->macro); 243262306a36Sopenharmony_ci if (ret) 243362306a36Sopenharmony_ci goto err; 243462306a36Sopenharmony_ci 243562306a36Sopenharmony_ci ret = clk_prepare_enable(wsa->dcodec); 243662306a36Sopenharmony_ci if (ret) 243762306a36Sopenharmony_ci goto err_dcodec; 243862306a36Sopenharmony_ci 243962306a36Sopenharmony_ci ret = clk_prepare_enable(wsa->mclk); 244062306a36Sopenharmony_ci if (ret) 244162306a36Sopenharmony_ci goto err_mclk; 244262306a36Sopenharmony_ci 244362306a36Sopenharmony_ci ret = clk_prepare_enable(wsa->npl); 244462306a36Sopenharmony_ci if (ret) 244562306a36Sopenharmony_ci goto err_npl; 244662306a36Sopenharmony_ci 244762306a36Sopenharmony_ci ret = clk_prepare_enable(wsa->fsgen); 244862306a36Sopenharmony_ci if (ret) 244962306a36Sopenharmony_ci goto err_fsgen; 245062306a36Sopenharmony_ci 245162306a36Sopenharmony_ci /* reset swr ip */ 245262306a36Sopenharmony_ci regmap_update_bits(wsa->regmap, CDC_WSA_CLK_RST_CTRL_SWR_CONTROL, 245362306a36Sopenharmony_ci CDC_WSA_SWR_RST_EN_MASK, CDC_WSA_SWR_RST_ENABLE); 245462306a36Sopenharmony_ci 245562306a36Sopenharmony_ci regmap_update_bits(wsa->regmap, CDC_WSA_CLK_RST_CTRL_SWR_CONTROL, 245662306a36Sopenharmony_ci CDC_WSA_SWR_CLK_EN_MASK, CDC_WSA_SWR_CLK_ENABLE); 245762306a36Sopenharmony_ci 245862306a36Sopenharmony_ci /* Bring out of reset */ 245962306a36Sopenharmony_ci regmap_update_bits(wsa->regmap, CDC_WSA_CLK_RST_CTRL_SWR_CONTROL, 246062306a36Sopenharmony_ci CDC_WSA_SWR_RST_EN_MASK, CDC_WSA_SWR_RST_DISABLE); 246162306a36Sopenharmony_ci 246262306a36Sopenharmony_ci ret = devm_snd_soc_register_component(dev, &wsa_macro_component_drv, 246362306a36Sopenharmony_ci wsa_macro_dai, 246462306a36Sopenharmony_ci ARRAY_SIZE(wsa_macro_dai)); 246562306a36Sopenharmony_ci if (ret) 246662306a36Sopenharmony_ci goto err_clkout; 246762306a36Sopenharmony_ci 246862306a36Sopenharmony_ci pm_runtime_set_autosuspend_delay(dev, 3000); 246962306a36Sopenharmony_ci pm_runtime_use_autosuspend(dev); 247062306a36Sopenharmony_ci pm_runtime_mark_last_busy(dev); 247162306a36Sopenharmony_ci pm_runtime_set_active(dev); 247262306a36Sopenharmony_ci pm_runtime_enable(dev); 247362306a36Sopenharmony_ci 247462306a36Sopenharmony_ci ret = wsa_macro_register_mclk_output(wsa); 247562306a36Sopenharmony_ci if (ret) 247662306a36Sopenharmony_ci goto err_clkout; 247762306a36Sopenharmony_ci 247862306a36Sopenharmony_ci return 0; 247962306a36Sopenharmony_ci 248062306a36Sopenharmony_cierr_clkout: 248162306a36Sopenharmony_ci clk_disable_unprepare(wsa->fsgen); 248262306a36Sopenharmony_cierr_fsgen: 248362306a36Sopenharmony_ci clk_disable_unprepare(wsa->npl); 248462306a36Sopenharmony_cierr_npl: 248562306a36Sopenharmony_ci clk_disable_unprepare(wsa->mclk); 248662306a36Sopenharmony_cierr_mclk: 248762306a36Sopenharmony_ci clk_disable_unprepare(wsa->dcodec); 248862306a36Sopenharmony_cierr_dcodec: 248962306a36Sopenharmony_ci clk_disable_unprepare(wsa->macro); 249062306a36Sopenharmony_cierr: 249162306a36Sopenharmony_ci return ret; 249262306a36Sopenharmony_ci 249362306a36Sopenharmony_ci} 249462306a36Sopenharmony_ci 249562306a36Sopenharmony_cistatic void wsa_macro_remove(struct platform_device *pdev) 249662306a36Sopenharmony_ci{ 249762306a36Sopenharmony_ci struct wsa_macro *wsa = dev_get_drvdata(&pdev->dev); 249862306a36Sopenharmony_ci 249962306a36Sopenharmony_ci clk_disable_unprepare(wsa->macro); 250062306a36Sopenharmony_ci clk_disable_unprepare(wsa->dcodec); 250162306a36Sopenharmony_ci clk_disable_unprepare(wsa->mclk); 250262306a36Sopenharmony_ci clk_disable_unprepare(wsa->npl); 250362306a36Sopenharmony_ci clk_disable_unprepare(wsa->fsgen); 250462306a36Sopenharmony_ci} 250562306a36Sopenharmony_ci 250662306a36Sopenharmony_cistatic int __maybe_unused wsa_macro_runtime_suspend(struct device *dev) 250762306a36Sopenharmony_ci{ 250862306a36Sopenharmony_ci struct wsa_macro *wsa = dev_get_drvdata(dev); 250962306a36Sopenharmony_ci 251062306a36Sopenharmony_ci regcache_cache_only(wsa->regmap, true); 251162306a36Sopenharmony_ci regcache_mark_dirty(wsa->regmap); 251262306a36Sopenharmony_ci 251362306a36Sopenharmony_ci clk_disable_unprepare(wsa->fsgen); 251462306a36Sopenharmony_ci clk_disable_unprepare(wsa->npl); 251562306a36Sopenharmony_ci clk_disable_unprepare(wsa->mclk); 251662306a36Sopenharmony_ci 251762306a36Sopenharmony_ci return 0; 251862306a36Sopenharmony_ci} 251962306a36Sopenharmony_ci 252062306a36Sopenharmony_cistatic int __maybe_unused wsa_macro_runtime_resume(struct device *dev) 252162306a36Sopenharmony_ci{ 252262306a36Sopenharmony_ci struct wsa_macro *wsa = dev_get_drvdata(dev); 252362306a36Sopenharmony_ci int ret; 252462306a36Sopenharmony_ci 252562306a36Sopenharmony_ci ret = clk_prepare_enable(wsa->mclk); 252662306a36Sopenharmony_ci if (ret) { 252762306a36Sopenharmony_ci dev_err(dev, "unable to prepare mclk\n"); 252862306a36Sopenharmony_ci return ret; 252962306a36Sopenharmony_ci } 253062306a36Sopenharmony_ci 253162306a36Sopenharmony_ci ret = clk_prepare_enable(wsa->npl); 253262306a36Sopenharmony_ci if (ret) { 253362306a36Sopenharmony_ci dev_err(dev, "unable to prepare mclkx2\n"); 253462306a36Sopenharmony_ci goto err_npl; 253562306a36Sopenharmony_ci } 253662306a36Sopenharmony_ci 253762306a36Sopenharmony_ci ret = clk_prepare_enable(wsa->fsgen); 253862306a36Sopenharmony_ci if (ret) { 253962306a36Sopenharmony_ci dev_err(dev, "unable to prepare fsgen\n"); 254062306a36Sopenharmony_ci goto err_fsgen; 254162306a36Sopenharmony_ci } 254262306a36Sopenharmony_ci 254362306a36Sopenharmony_ci regcache_cache_only(wsa->regmap, false); 254462306a36Sopenharmony_ci regcache_sync(wsa->regmap); 254562306a36Sopenharmony_ci 254662306a36Sopenharmony_ci return 0; 254762306a36Sopenharmony_cierr_fsgen: 254862306a36Sopenharmony_ci clk_disable_unprepare(wsa->npl); 254962306a36Sopenharmony_cierr_npl: 255062306a36Sopenharmony_ci clk_disable_unprepare(wsa->mclk); 255162306a36Sopenharmony_ci 255262306a36Sopenharmony_ci return ret; 255362306a36Sopenharmony_ci} 255462306a36Sopenharmony_ci 255562306a36Sopenharmony_cistatic const struct dev_pm_ops wsa_macro_pm_ops = { 255662306a36Sopenharmony_ci SET_RUNTIME_PM_OPS(wsa_macro_runtime_suspend, wsa_macro_runtime_resume, NULL) 255762306a36Sopenharmony_ci}; 255862306a36Sopenharmony_ci 255962306a36Sopenharmony_cistatic const struct of_device_id wsa_macro_dt_match[] = { 256062306a36Sopenharmony_ci { 256162306a36Sopenharmony_ci .compatible = "qcom,sc7280-lpass-wsa-macro", 256262306a36Sopenharmony_ci .data = (void *)LPASS_MACRO_FLAG_HAS_NPL_CLOCK, 256362306a36Sopenharmony_ci }, { 256462306a36Sopenharmony_ci .compatible = "qcom,sm8250-lpass-wsa-macro", 256562306a36Sopenharmony_ci .data = (void *)LPASS_MACRO_FLAG_HAS_NPL_CLOCK, 256662306a36Sopenharmony_ci }, { 256762306a36Sopenharmony_ci .compatible = "qcom,sm8450-lpass-wsa-macro", 256862306a36Sopenharmony_ci .data = (void *)LPASS_MACRO_FLAG_HAS_NPL_CLOCK, 256962306a36Sopenharmony_ci }, { 257062306a36Sopenharmony_ci .compatible = "qcom,sm8550-lpass-wsa-macro", 257162306a36Sopenharmony_ci }, { 257262306a36Sopenharmony_ci .compatible = "qcom,sc8280xp-lpass-wsa-macro", 257362306a36Sopenharmony_ci .data = (void *)LPASS_MACRO_FLAG_HAS_NPL_CLOCK, 257462306a36Sopenharmony_ci }, 257562306a36Sopenharmony_ci {} 257662306a36Sopenharmony_ci}; 257762306a36Sopenharmony_ciMODULE_DEVICE_TABLE(of, wsa_macro_dt_match); 257862306a36Sopenharmony_ci 257962306a36Sopenharmony_cistatic struct platform_driver wsa_macro_driver = { 258062306a36Sopenharmony_ci .driver = { 258162306a36Sopenharmony_ci .name = "wsa_macro", 258262306a36Sopenharmony_ci .of_match_table = wsa_macro_dt_match, 258362306a36Sopenharmony_ci .pm = &wsa_macro_pm_ops, 258462306a36Sopenharmony_ci }, 258562306a36Sopenharmony_ci .probe = wsa_macro_probe, 258662306a36Sopenharmony_ci .remove_new = wsa_macro_remove, 258762306a36Sopenharmony_ci}; 258862306a36Sopenharmony_ci 258962306a36Sopenharmony_cimodule_platform_driver(wsa_macro_driver); 259062306a36Sopenharmony_ciMODULE_DESCRIPTION("WSA macro driver"); 259162306a36Sopenharmony_ciMODULE_LICENSE("GPL"); 2592