cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

cs47l24.c (46890B)


      1// SPDX-License-Identifier: GPL-2.0-only
      2/*
      3 * cs47l24.h  --  ALSA SoC Audio driver for Cirrus Logic CS47L24
      4 *
      5 * Copyright 2015 Cirrus Logic Inc.
      6 *
      7 * Author: Richard Fitzgerald <rf@opensource.wolfsonmicro.com>
      8 */
      9
     10#include <linux/module.h>
     11#include <linux/moduleparam.h>
     12#include <linux/init.h>
     13#include <linux/delay.h>
     14#include <linux/pm.h>
     15#include <linux/pm_runtime.h>
     16#include <linux/regmap.h>
     17#include <linux/slab.h>
     18#include <sound/core.h>
     19#include <sound/pcm.h>
     20#include <sound/pcm_params.h>
     21#include <sound/soc.h>
     22#include <sound/jack.h>
     23#include <sound/initval.h>
     24#include <sound/tlv.h>
     25
     26#include <linux/mfd/arizona/core.h>
     27#include <linux/mfd/arizona/registers.h>
     28
     29#include "arizona.h"
     30#include "wm_adsp.h"
     31#include "cs47l24.h"
     32
     33#define DRV_NAME "cs47l24-codec"
     34
     35struct cs47l24_priv {
     36	struct arizona_priv core;
     37	struct arizona_fll fll[2];
     38};
     39
     40static const struct cs_dsp_region cs47l24_dsp2_regions[] = {
     41	{ .type = WMFW_ADSP2_PM, .base = 0x200000 },
     42	{ .type = WMFW_ADSP2_ZM, .base = 0x280000 },
     43	{ .type = WMFW_ADSP2_XM, .base = 0x290000 },
     44	{ .type = WMFW_ADSP2_YM, .base = 0x2a8000 },
     45};
     46
     47static const struct cs_dsp_region cs47l24_dsp3_regions[] = {
     48	{ .type = WMFW_ADSP2_PM, .base = 0x300000 },
     49	{ .type = WMFW_ADSP2_ZM, .base = 0x380000 },
     50	{ .type = WMFW_ADSP2_XM, .base = 0x390000 },
     51	{ .type = WMFW_ADSP2_YM, .base = 0x3a8000 },
     52};
     53
     54static const struct cs_dsp_region *cs47l24_dsp_regions[] = {
     55	cs47l24_dsp2_regions,
     56	cs47l24_dsp3_regions,
     57};
     58
     59static int cs47l24_adsp_power_ev(struct snd_soc_dapm_widget *w,
     60				 struct snd_kcontrol *kcontrol, int event)
     61{
     62	struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
     63	struct arizona *arizona = dev_get_drvdata(component->dev->parent);
     64	unsigned int v;
     65	int ret;
     66
     67	ret = regmap_read(arizona->regmap, ARIZONA_SYSTEM_CLOCK_1, &v);
     68	if (ret != 0) {
     69		dev_err(component->dev, "Failed to read SYSCLK state: %d\n", ret);
     70		return ret;
     71	}
     72
     73	v = (v & ARIZONA_SYSCLK_FREQ_MASK) >> ARIZONA_SYSCLK_FREQ_SHIFT;
     74
     75	wm_adsp2_set_dspclk(w, v);
     76
     77	return wm_adsp_early_event(w, kcontrol, event);
     78}
     79
     80static DECLARE_TLV_DB_SCALE(eq_tlv, -1200, 100, 0);
     81static DECLARE_TLV_DB_SCALE(digital_tlv, -6400, 50, 0);
     82static DECLARE_TLV_DB_SCALE(noise_tlv, -13200, 600, 0);
     83static DECLARE_TLV_DB_SCALE(ng_tlv, -10200, 600, 0);
     84
     85#define CS47L24_NG_SRC(name, base) \
     86	SOC_SINGLE(name " NG HPOUT1L Switch",  base,  0, 1, 0), \
     87	SOC_SINGLE(name " NG HPOUT1R Switch",  base,  1, 1, 0), \
     88	SOC_SINGLE(name " NG SPKOUT Switch",  base,  6, 1, 0)
     89
     90static const struct snd_kcontrol_new cs47l24_snd_controls[] = {
     91SOC_ENUM("IN1 OSR", arizona_in_dmic_osr[0]),
     92SOC_ENUM("IN2 OSR", arizona_in_dmic_osr[1]),
     93
     94SOC_ENUM("IN HPF Cutoff Frequency", arizona_in_hpf_cut_enum),
     95
     96SOC_SINGLE("IN1L HPF Switch", ARIZONA_IN1L_CONTROL,
     97	   ARIZONA_IN1L_HPF_SHIFT, 1, 0),
     98SOC_SINGLE("IN1R HPF Switch", ARIZONA_IN1R_CONTROL,
     99	   ARIZONA_IN1R_HPF_SHIFT, 1, 0),
    100SOC_SINGLE("IN2L HPF Switch", ARIZONA_IN2L_CONTROL,
    101	   ARIZONA_IN2L_HPF_SHIFT, 1, 0),
    102SOC_SINGLE("IN2R HPF Switch", ARIZONA_IN2R_CONTROL,
    103	   ARIZONA_IN2R_HPF_SHIFT, 1, 0),
    104
    105SOC_SINGLE_TLV("IN1L Digital Volume", ARIZONA_ADC_DIGITAL_VOLUME_1L,
    106	       ARIZONA_IN1L_DIG_VOL_SHIFT, 0xbf, 0, digital_tlv),
    107SOC_SINGLE_TLV("IN1R Digital Volume", ARIZONA_ADC_DIGITAL_VOLUME_1R,
    108	       ARIZONA_IN1R_DIG_VOL_SHIFT, 0xbf, 0, digital_tlv),
    109SOC_SINGLE_TLV("IN2L Digital Volume", ARIZONA_ADC_DIGITAL_VOLUME_2L,
    110	       ARIZONA_IN2L_DIG_VOL_SHIFT, 0xbf, 0, digital_tlv),
    111SOC_SINGLE_TLV("IN2R Digital Volume", ARIZONA_ADC_DIGITAL_VOLUME_2R,
    112	       ARIZONA_IN2R_DIG_VOL_SHIFT, 0xbf, 0, digital_tlv),
    113
    114SOC_ENUM("Input Ramp Up", arizona_in_vi_ramp),
    115SOC_ENUM("Input Ramp Down", arizona_in_vd_ramp),
    116
    117ARIZONA_MIXER_CONTROLS("EQ1", ARIZONA_EQ1MIX_INPUT_1_SOURCE),
    118ARIZONA_MIXER_CONTROLS("EQ2", ARIZONA_EQ2MIX_INPUT_1_SOURCE),
    119
    120ARIZONA_EQ_CONTROL("EQ1 Coefficients", ARIZONA_EQ1_2),
    121SOC_SINGLE_TLV("EQ1 B1 Volume", ARIZONA_EQ1_1, ARIZONA_EQ1_B1_GAIN_SHIFT,
    122	       24, 0, eq_tlv),
    123SOC_SINGLE_TLV("EQ1 B2 Volume", ARIZONA_EQ1_1, ARIZONA_EQ1_B2_GAIN_SHIFT,
    124	       24, 0, eq_tlv),
    125SOC_SINGLE_TLV("EQ1 B3 Volume", ARIZONA_EQ1_1, ARIZONA_EQ1_B3_GAIN_SHIFT,
    126	       24, 0, eq_tlv),
    127SOC_SINGLE_TLV("EQ1 B4 Volume", ARIZONA_EQ1_2, ARIZONA_EQ1_B4_GAIN_SHIFT,
    128	       24, 0, eq_tlv),
    129SOC_SINGLE_TLV("EQ1 B5 Volume", ARIZONA_EQ1_2, ARIZONA_EQ1_B5_GAIN_SHIFT,
    130	       24, 0, eq_tlv),
    131
    132ARIZONA_EQ_CONTROL("EQ2 Coefficients", ARIZONA_EQ2_2),
    133SOC_SINGLE_TLV("EQ2 B1 Volume", ARIZONA_EQ2_1, ARIZONA_EQ2_B1_GAIN_SHIFT,
    134	       24, 0, eq_tlv),
    135SOC_SINGLE_TLV("EQ2 B2 Volume", ARIZONA_EQ2_1, ARIZONA_EQ2_B2_GAIN_SHIFT,
    136	       24, 0, eq_tlv),
    137SOC_SINGLE_TLV("EQ2 B3 Volume", ARIZONA_EQ2_1, ARIZONA_EQ2_B3_GAIN_SHIFT,
    138	       24, 0, eq_tlv),
    139SOC_SINGLE_TLV("EQ2 B4 Volume", ARIZONA_EQ2_2, ARIZONA_EQ2_B4_GAIN_SHIFT,
    140	       24, 0, eq_tlv),
    141SOC_SINGLE_TLV("EQ2 B5 Volume", ARIZONA_EQ2_2, ARIZONA_EQ2_B5_GAIN_SHIFT,
    142	       24, 0, eq_tlv),
    143
    144ARIZONA_MIXER_CONTROLS("DRC1L", ARIZONA_DRC1LMIX_INPUT_1_SOURCE),
    145ARIZONA_MIXER_CONTROLS("DRC1R", ARIZONA_DRC1RMIX_INPUT_1_SOURCE),
    146ARIZONA_MIXER_CONTROLS("DRC2L", ARIZONA_DRC2LMIX_INPUT_1_SOURCE),
    147ARIZONA_MIXER_CONTROLS("DRC2R", ARIZONA_DRC2RMIX_INPUT_1_SOURCE),
    148
    149SND_SOC_BYTES_MASK("DRC1", ARIZONA_DRC1_CTRL1, 5,
    150		   ARIZONA_DRC1R_ENA | ARIZONA_DRC1L_ENA),
    151SND_SOC_BYTES_MASK("DRC2", ARIZONA_DRC2_CTRL1, 5,
    152		   ARIZONA_DRC2R_ENA | ARIZONA_DRC2L_ENA),
    153
    154ARIZONA_MIXER_CONTROLS("LHPF1", ARIZONA_HPLP1MIX_INPUT_1_SOURCE),
    155ARIZONA_MIXER_CONTROLS("LHPF2", ARIZONA_HPLP2MIX_INPUT_1_SOURCE),
    156ARIZONA_MIXER_CONTROLS("LHPF3", ARIZONA_HPLP3MIX_INPUT_1_SOURCE),
    157ARIZONA_MIXER_CONTROLS("LHPF4", ARIZONA_HPLP4MIX_INPUT_1_SOURCE),
    158
    159ARIZONA_LHPF_CONTROL("LHPF1 Coefficients", ARIZONA_HPLPF1_2),
    160ARIZONA_LHPF_CONTROL("LHPF2 Coefficients", ARIZONA_HPLPF2_2),
    161ARIZONA_LHPF_CONTROL("LHPF3 Coefficients", ARIZONA_HPLPF3_2),
    162ARIZONA_LHPF_CONTROL("LHPF4 Coefficients", ARIZONA_HPLPF4_2),
    163
    164SOC_ENUM("LHPF1 Mode", arizona_lhpf1_mode),
    165SOC_ENUM("LHPF2 Mode", arizona_lhpf2_mode),
    166SOC_ENUM("LHPF3 Mode", arizona_lhpf3_mode),
    167SOC_ENUM("LHPF4 Mode", arizona_lhpf4_mode),
    168
    169SOC_ENUM("ISRC1 FSL", arizona_isrc_fsl[0]),
    170SOC_ENUM("ISRC2 FSL", arizona_isrc_fsl[1]),
    171SOC_ENUM("ISRC3 FSL", arizona_isrc_fsl[2]),
    172SOC_ENUM("ISRC1 FSH", arizona_isrc_fsh[0]),
    173SOC_ENUM("ISRC2 FSH", arizona_isrc_fsh[1]),
    174SOC_ENUM("ISRC3 FSH", arizona_isrc_fsh[2]),
    175SOC_ENUM("ASRC RATE 1", arizona_asrc_rate1),
    176
    177WM_ADSP2_PRELOAD_SWITCH("DSP2", 2),
    178WM_ADSP2_PRELOAD_SWITCH("DSP3", 3),
    179
    180ARIZONA_MIXER_CONTROLS("DSP2L", ARIZONA_DSP2LMIX_INPUT_1_SOURCE),
    181ARIZONA_MIXER_CONTROLS("DSP2R", ARIZONA_DSP2RMIX_INPUT_1_SOURCE),
    182ARIZONA_MIXER_CONTROLS("DSP3L", ARIZONA_DSP3LMIX_INPUT_1_SOURCE),
    183ARIZONA_MIXER_CONTROLS("DSP3R", ARIZONA_DSP3RMIX_INPUT_1_SOURCE),
    184
    185SOC_SINGLE_TLV("Noise Generator Volume", ARIZONA_COMFORT_NOISE_GENERATOR,
    186	       ARIZONA_NOISE_GEN_GAIN_SHIFT, 0x16, 0, noise_tlv),
    187
    188ARIZONA_MIXER_CONTROLS("HPOUT1L", ARIZONA_OUT1LMIX_INPUT_1_SOURCE),
    189ARIZONA_MIXER_CONTROLS("HPOUT1R", ARIZONA_OUT1RMIX_INPUT_1_SOURCE),
    190ARIZONA_MIXER_CONTROLS("SPKOUT", ARIZONA_OUT4LMIX_INPUT_1_SOURCE),
    191
    192SOC_SINGLE("HPOUT1 SC Protect Switch", ARIZONA_HP1_SHORT_CIRCUIT_CTRL,
    193	   ARIZONA_HP1_SC_ENA_SHIFT, 1, 0),
    194
    195SOC_DOUBLE_R("HPOUT1 Digital Switch", ARIZONA_DAC_DIGITAL_VOLUME_1L,
    196	     ARIZONA_DAC_DIGITAL_VOLUME_1R, ARIZONA_OUT1L_MUTE_SHIFT, 1, 1),
    197SOC_SINGLE("Speaker Digital Switch", ARIZONA_DAC_DIGITAL_VOLUME_4L,
    198	   ARIZONA_OUT4L_MUTE_SHIFT, 1, 1),
    199
    200SOC_DOUBLE_R_TLV("HPOUT1 Digital Volume", ARIZONA_DAC_DIGITAL_VOLUME_1L,
    201		 ARIZONA_DAC_DIGITAL_VOLUME_1R, ARIZONA_OUT1L_VOL_SHIFT,
    202		 0xbf, 0, digital_tlv),
    203SOC_SINGLE_TLV("Speaker Digital Volume", ARIZONA_DAC_DIGITAL_VOLUME_4L,
    204	       ARIZONA_OUT4L_VOL_SHIFT, 0xbf, 0, digital_tlv),
    205
    206SOC_ENUM("Output Ramp Up", arizona_out_vi_ramp),
    207SOC_ENUM("Output Ramp Down", arizona_out_vd_ramp),
    208
    209SOC_SINGLE("Noise Gate Switch", ARIZONA_NOISE_GATE_CONTROL,
    210	   ARIZONA_NGATE_ENA_SHIFT, 1, 0),
    211SOC_SINGLE_TLV("Noise Gate Threshold Volume", ARIZONA_NOISE_GATE_CONTROL,
    212	       ARIZONA_NGATE_THR_SHIFT, 7, 1, ng_tlv),
    213SOC_ENUM("Noise Gate Hold", arizona_ng_hold),
    214
    215CS47L24_NG_SRC("HPOUT1L", ARIZONA_NOISE_GATE_SELECT_1L),
    216CS47L24_NG_SRC("HPOUT1R", ARIZONA_NOISE_GATE_SELECT_1R),
    217CS47L24_NG_SRC("SPKOUT", ARIZONA_NOISE_GATE_SELECT_4L),
    218
    219ARIZONA_MIXER_CONTROLS("AIF1TX1", ARIZONA_AIF1TX1MIX_INPUT_1_SOURCE),
    220ARIZONA_MIXER_CONTROLS("AIF1TX2", ARIZONA_AIF1TX2MIX_INPUT_1_SOURCE),
    221ARIZONA_MIXER_CONTROLS("AIF1TX3", ARIZONA_AIF1TX3MIX_INPUT_1_SOURCE),
    222ARIZONA_MIXER_CONTROLS("AIF1TX4", ARIZONA_AIF1TX4MIX_INPUT_1_SOURCE),
    223ARIZONA_MIXER_CONTROLS("AIF1TX5", ARIZONA_AIF1TX5MIX_INPUT_1_SOURCE),
    224ARIZONA_MIXER_CONTROLS("AIF1TX6", ARIZONA_AIF1TX6MIX_INPUT_1_SOURCE),
    225ARIZONA_MIXER_CONTROLS("AIF1TX7", ARIZONA_AIF1TX7MIX_INPUT_1_SOURCE),
    226ARIZONA_MIXER_CONTROLS("AIF1TX8", ARIZONA_AIF1TX8MIX_INPUT_1_SOURCE),
    227
    228ARIZONA_MIXER_CONTROLS("AIF2TX1", ARIZONA_AIF2TX1MIX_INPUT_1_SOURCE),
    229ARIZONA_MIXER_CONTROLS("AIF2TX2", ARIZONA_AIF2TX2MIX_INPUT_1_SOURCE),
    230ARIZONA_MIXER_CONTROLS("AIF2TX3", ARIZONA_AIF2TX3MIX_INPUT_1_SOURCE),
    231ARIZONA_MIXER_CONTROLS("AIF2TX4", ARIZONA_AIF2TX4MIX_INPUT_1_SOURCE),
    232ARIZONA_MIXER_CONTROLS("AIF2TX5", ARIZONA_AIF2TX5MIX_INPUT_1_SOURCE),
    233ARIZONA_MIXER_CONTROLS("AIF2TX6", ARIZONA_AIF2TX6MIX_INPUT_1_SOURCE),
    234
    235ARIZONA_MIXER_CONTROLS("AIF3TX1", ARIZONA_AIF3TX1MIX_INPUT_1_SOURCE),
    236ARIZONA_MIXER_CONTROLS("AIF3TX2", ARIZONA_AIF3TX2MIX_INPUT_1_SOURCE),
    237
    238WM_ADSP_FW_CONTROL("DSP2", 1),
    239WM_ADSP_FW_CONTROL("DSP3", 2),
    240};
    241
    242ARIZONA_MIXER_ENUMS(EQ1, ARIZONA_EQ1MIX_INPUT_1_SOURCE);
    243ARIZONA_MIXER_ENUMS(EQ2, ARIZONA_EQ2MIX_INPUT_1_SOURCE);
    244
    245ARIZONA_MIXER_ENUMS(DRC1L, ARIZONA_DRC1LMIX_INPUT_1_SOURCE);
    246ARIZONA_MIXER_ENUMS(DRC1R, ARIZONA_DRC1RMIX_INPUT_1_SOURCE);
    247ARIZONA_MIXER_ENUMS(DRC2L, ARIZONA_DRC2LMIX_INPUT_1_SOURCE);
    248ARIZONA_MIXER_ENUMS(DRC2R, ARIZONA_DRC2RMIX_INPUT_1_SOURCE);
    249
    250ARIZONA_MIXER_ENUMS(LHPF1, ARIZONA_HPLP1MIX_INPUT_1_SOURCE);
    251ARIZONA_MIXER_ENUMS(LHPF2, ARIZONA_HPLP2MIX_INPUT_1_SOURCE);
    252ARIZONA_MIXER_ENUMS(LHPF3, ARIZONA_HPLP3MIX_INPUT_1_SOURCE);
    253ARIZONA_MIXER_ENUMS(LHPF4, ARIZONA_HPLP4MIX_INPUT_1_SOURCE);
    254
    255ARIZONA_MIXER_ENUMS(DSP2L, ARIZONA_DSP2LMIX_INPUT_1_SOURCE);
    256ARIZONA_MIXER_ENUMS(DSP2R, ARIZONA_DSP2RMIX_INPUT_1_SOURCE);
    257ARIZONA_DSP_AUX_ENUMS(DSP2, ARIZONA_DSP2AUX1MIX_INPUT_1_SOURCE);
    258
    259ARIZONA_MIXER_ENUMS(DSP3L, ARIZONA_DSP3LMIX_INPUT_1_SOURCE);
    260ARIZONA_MIXER_ENUMS(DSP3R, ARIZONA_DSP3RMIX_INPUT_1_SOURCE);
    261ARIZONA_DSP_AUX_ENUMS(DSP3, ARIZONA_DSP3AUX1MIX_INPUT_1_SOURCE);
    262
    263ARIZONA_MIXER_ENUMS(PWM1, ARIZONA_PWM1MIX_INPUT_1_SOURCE);
    264ARIZONA_MIXER_ENUMS(PWM2, ARIZONA_PWM2MIX_INPUT_1_SOURCE);
    265
    266ARIZONA_MIXER_ENUMS(OUT1L, ARIZONA_OUT1LMIX_INPUT_1_SOURCE);
    267ARIZONA_MIXER_ENUMS(OUT1R, ARIZONA_OUT1RMIX_INPUT_1_SOURCE);
    268ARIZONA_MIXER_ENUMS(SPKOUT, ARIZONA_OUT4LMIX_INPUT_1_SOURCE);
    269
    270ARIZONA_MIXER_ENUMS(AIF1TX1, ARIZONA_AIF1TX1MIX_INPUT_1_SOURCE);
    271ARIZONA_MIXER_ENUMS(AIF1TX2, ARIZONA_AIF1TX2MIX_INPUT_1_SOURCE);
    272ARIZONA_MIXER_ENUMS(AIF1TX3, ARIZONA_AIF1TX3MIX_INPUT_1_SOURCE);
    273ARIZONA_MIXER_ENUMS(AIF1TX4, ARIZONA_AIF1TX4MIX_INPUT_1_SOURCE);
    274ARIZONA_MIXER_ENUMS(AIF1TX5, ARIZONA_AIF1TX5MIX_INPUT_1_SOURCE);
    275ARIZONA_MIXER_ENUMS(AIF1TX6, ARIZONA_AIF1TX6MIX_INPUT_1_SOURCE);
    276ARIZONA_MIXER_ENUMS(AIF1TX7, ARIZONA_AIF1TX7MIX_INPUT_1_SOURCE);
    277ARIZONA_MIXER_ENUMS(AIF1TX8, ARIZONA_AIF1TX8MIX_INPUT_1_SOURCE);
    278
    279ARIZONA_MIXER_ENUMS(AIF2TX1, ARIZONA_AIF2TX1MIX_INPUT_1_SOURCE);
    280ARIZONA_MIXER_ENUMS(AIF2TX2, ARIZONA_AIF2TX2MIX_INPUT_1_SOURCE);
    281ARIZONA_MIXER_ENUMS(AIF2TX3, ARIZONA_AIF2TX3MIX_INPUT_1_SOURCE);
    282ARIZONA_MIXER_ENUMS(AIF2TX4, ARIZONA_AIF2TX4MIX_INPUT_1_SOURCE);
    283ARIZONA_MIXER_ENUMS(AIF2TX5, ARIZONA_AIF2TX5MIX_INPUT_1_SOURCE);
    284ARIZONA_MIXER_ENUMS(AIF2TX6, ARIZONA_AIF2TX6MIX_INPUT_1_SOURCE);
    285
    286ARIZONA_MIXER_ENUMS(AIF3TX1, ARIZONA_AIF3TX1MIX_INPUT_1_SOURCE);
    287ARIZONA_MIXER_ENUMS(AIF3TX2, ARIZONA_AIF3TX2MIX_INPUT_1_SOURCE);
    288
    289ARIZONA_MUX_ENUMS(ASRC1L, ARIZONA_ASRC1LMIX_INPUT_1_SOURCE);
    290ARIZONA_MUX_ENUMS(ASRC1R, ARIZONA_ASRC1RMIX_INPUT_1_SOURCE);
    291ARIZONA_MUX_ENUMS(ASRC2L, ARIZONA_ASRC2LMIX_INPUT_1_SOURCE);
    292ARIZONA_MUX_ENUMS(ASRC2R, ARIZONA_ASRC2RMIX_INPUT_1_SOURCE);
    293
    294ARIZONA_MUX_ENUMS(ISRC1INT1, ARIZONA_ISRC1INT1MIX_INPUT_1_SOURCE);
    295ARIZONA_MUX_ENUMS(ISRC1INT2, ARIZONA_ISRC1INT2MIX_INPUT_1_SOURCE);
    296ARIZONA_MUX_ENUMS(ISRC1INT3, ARIZONA_ISRC1INT3MIX_INPUT_1_SOURCE);
    297ARIZONA_MUX_ENUMS(ISRC1INT4, ARIZONA_ISRC1INT4MIX_INPUT_1_SOURCE);
    298
    299ARIZONA_MUX_ENUMS(ISRC1DEC1, ARIZONA_ISRC1DEC1MIX_INPUT_1_SOURCE);
    300ARIZONA_MUX_ENUMS(ISRC1DEC2, ARIZONA_ISRC1DEC2MIX_INPUT_1_SOURCE);
    301ARIZONA_MUX_ENUMS(ISRC1DEC3, ARIZONA_ISRC1DEC3MIX_INPUT_1_SOURCE);
    302ARIZONA_MUX_ENUMS(ISRC1DEC4, ARIZONA_ISRC1DEC4MIX_INPUT_1_SOURCE);
    303
    304ARIZONA_MUX_ENUMS(ISRC2INT1, ARIZONA_ISRC2INT1MIX_INPUT_1_SOURCE);
    305ARIZONA_MUX_ENUMS(ISRC2INT2, ARIZONA_ISRC2INT2MIX_INPUT_1_SOURCE);
    306ARIZONA_MUX_ENUMS(ISRC2INT3, ARIZONA_ISRC2INT3MIX_INPUT_1_SOURCE);
    307ARIZONA_MUX_ENUMS(ISRC2INT4, ARIZONA_ISRC2INT4MIX_INPUT_1_SOURCE);
    308
    309ARIZONA_MUX_ENUMS(ISRC2DEC1, ARIZONA_ISRC2DEC1MIX_INPUT_1_SOURCE);
    310ARIZONA_MUX_ENUMS(ISRC2DEC2, ARIZONA_ISRC2DEC2MIX_INPUT_1_SOURCE);
    311ARIZONA_MUX_ENUMS(ISRC2DEC3, ARIZONA_ISRC2DEC3MIX_INPUT_1_SOURCE);
    312ARIZONA_MUX_ENUMS(ISRC2DEC4, ARIZONA_ISRC2DEC4MIX_INPUT_1_SOURCE);
    313
    314ARIZONA_MUX_ENUMS(ISRC3INT1, ARIZONA_ISRC3INT1MIX_INPUT_1_SOURCE);
    315ARIZONA_MUX_ENUMS(ISRC3INT2, ARIZONA_ISRC3INT2MIX_INPUT_1_SOURCE);
    316ARIZONA_MUX_ENUMS(ISRC3INT3, ARIZONA_ISRC3INT3MIX_INPUT_1_SOURCE);
    317ARIZONA_MUX_ENUMS(ISRC3INT4, ARIZONA_ISRC3INT4MIX_INPUT_1_SOURCE);
    318
    319ARIZONA_MUX_ENUMS(ISRC3DEC1, ARIZONA_ISRC3DEC1MIX_INPUT_1_SOURCE);
    320ARIZONA_MUX_ENUMS(ISRC3DEC2, ARIZONA_ISRC3DEC2MIX_INPUT_1_SOURCE);
    321ARIZONA_MUX_ENUMS(ISRC3DEC3, ARIZONA_ISRC3DEC3MIX_INPUT_1_SOURCE);
    322ARIZONA_MUX_ENUMS(ISRC3DEC4, ARIZONA_ISRC3DEC4MIX_INPUT_1_SOURCE);
    323
    324static const char * const cs47l24_aec_loopback_texts[] = {
    325	"HPOUT1L", "HPOUT1R", "SPKOUT",
    326};
    327
    328static const unsigned int cs47l24_aec_loopback_values[] = {
    329	0, 1, 6,
    330};
    331
    332static const struct soc_enum cs47l24_aec_loopback =
    333	SOC_VALUE_ENUM_SINGLE(ARIZONA_DAC_AEC_CONTROL_1,
    334			      ARIZONA_AEC_LOOPBACK_SRC_SHIFT, 0xf,
    335			      ARRAY_SIZE(cs47l24_aec_loopback_texts),
    336			      cs47l24_aec_loopback_texts,
    337			      cs47l24_aec_loopback_values);
    338
    339static const struct snd_kcontrol_new cs47l24_aec_loopback_mux =
    340	SOC_DAPM_ENUM("AEC Loopback", cs47l24_aec_loopback);
    341
    342static const struct snd_soc_dapm_widget cs47l24_dapm_widgets[] = {
    343SND_SOC_DAPM_SUPPLY("SYSCLK", ARIZONA_SYSTEM_CLOCK_1,
    344		    ARIZONA_SYSCLK_ENA_SHIFT, 0, arizona_clk_ev,
    345		    SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
    346SND_SOC_DAPM_SUPPLY("ASYNCCLK", ARIZONA_ASYNC_CLOCK_1,
    347		    ARIZONA_ASYNC_CLK_ENA_SHIFT, 0, arizona_clk_ev,
    348		    SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
    349SND_SOC_DAPM_SUPPLY("OPCLK", ARIZONA_OUTPUT_SYSTEM_CLOCK,
    350		    ARIZONA_OPCLK_ENA_SHIFT, 0, NULL, 0),
    351SND_SOC_DAPM_SUPPLY("ASYNCOPCLK", ARIZONA_OUTPUT_ASYNC_CLOCK,
    352		    ARIZONA_OPCLK_ASYNC_ENA_SHIFT, 0, NULL, 0),
    353
    354SND_SOC_DAPM_REGULATOR_SUPPLY("CPVDD", 20, 0),
    355SND_SOC_DAPM_REGULATOR_SUPPLY("MICVDD", 0, SND_SOC_DAPM_REGULATOR_BYPASS),
    356SND_SOC_DAPM_REGULATOR_SUPPLY("SPKVDD", 0, 0),
    357
    358SND_SOC_DAPM_SIGGEN("TONE"),
    359SND_SOC_DAPM_SIGGEN("NOISE"),
    360SND_SOC_DAPM_SIGGEN("HAPTICS"),
    361
    362SND_SOC_DAPM_INPUT("IN1L"),
    363SND_SOC_DAPM_INPUT("IN1R"),
    364SND_SOC_DAPM_INPUT("IN2L"),
    365SND_SOC_DAPM_INPUT("IN2R"),
    366
    367SND_SOC_DAPM_OUTPUT("DRC1 Signal Activity"),
    368SND_SOC_DAPM_OUTPUT("DRC2 Signal Activity"),
    369
    370SND_SOC_DAPM_OUTPUT("DSP Voice Trigger"),
    371
    372SND_SOC_DAPM_SWITCH("DSP3 Voice Trigger", SND_SOC_NOPM, 2, 0,
    373		    &arizona_voice_trigger_switch[2]),
    374
    375SND_SOC_DAPM_PGA_E("IN1L PGA", ARIZONA_INPUT_ENABLES, ARIZONA_IN1L_ENA_SHIFT,
    376		   0, NULL, 0, arizona_in_ev,
    377		   SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD |
    378		   SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU),
    379SND_SOC_DAPM_PGA_E("IN1R PGA", ARIZONA_INPUT_ENABLES, ARIZONA_IN1R_ENA_SHIFT,
    380		   0, NULL, 0, arizona_in_ev,
    381		   SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD |
    382		   SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU),
    383SND_SOC_DAPM_PGA_E("IN2L PGA", ARIZONA_INPUT_ENABLES, ARIZONA_IN2L_ENA_SHIFT,
    384		   0, NULL, 0, arizona_in_ev,
    385		   SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD |
    386		   SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU),
    387SND_SOC_DAPM_PGA_E("IN2R PGA", ARIZONA_INPUT_ENABLES, ARIZONA_IN2R_ENA_SHIFT,
    388		   0, NULL, 0, arizona_in_ev,
    389		   SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD |
    390		   SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU),
    391
    392SND_SOC_DAPM_SUPPLY("MICBIAS1", ARIZONA_MIC_BIAS_CTRL_1,
    393		    ARIZONA_MICB1_ENA_SHIFT, 0, NULL, 0),
    394SND_SOC_DAPM_SUPPLY("MICBIAS2", ARIZONA_MIC_BIAS_CTRL_2,
    395		    ARIZONA_MICB1_ENA_SHIFT, 0, NULL, 0),
    396
    397SND_SOC_DAPM_PGA("Noise Generator", ARIZONA_COMFORT_NOISE_GENERATOR,
    398		 ARIZONA_NOISE_GEN_ENA_SHIFT, 0, NULL, 0),
    399
    400SND_SOC_DAPM_PGA("Tone Generator 1", ARIZONA_TONE_GENERATOR_1,
    401		 ARIZONA_TONE1_ENA_SHIFT, 0, NULL, 0),
    402SND_SOC_DAPM_PGA("Tone Generator 2", ARIZONA_TONE_GENERATOR_1,
    403		 ARIZONA_TONE2_ENA_SHIFT, 0, NULL, 0),
    404
    405SND_SOC_DAPM_PGA("EQ1", ARIZONA_EQ1_1, ARIZONA_EQ1_ENA_SHIFT, 0, NULL, 0),
    406SND_SOC_DAPM_PGA("EQ2", ARIZONA_EQ2_1, ARIZONA_EQ2_ENA_SHIFT, 0, NULL, 0),
    407
    408SND_SOC_DAPM_PGA("DRC1L", ARIZONA_DRC1_CTRL1, ARIZONA_DRC1L_ENA_SHIFT, 0,
    409		 NULL, 0),
    410SND_SOC_DAPM_PGA("DRC1R", ARIZONA_DRC1_CTRL1, ARIZONA_DRC1R_ENA_SHIFT, 0,
    411		 NULL, 0),
    412SND_SOC_DAPM_PGA("DRC2L", ARIZONA_DRC2_CTRL1, ARIZONA_DRC2L_ENA_SHIFT, 0,
    413		 NULL, 0),
    414SND_SOC_DAPM_PGA("DRC2R", ARIZONA_DRC2_CTRL1, ARIZONA_DRC2R_ENA_SHIFT, 0,
    415		 NULL, 0),
    416
    417SND_SOC_DAPM_PGA("LHPF1", ARIZONA_HPLPF1_1, ARIZONA_LHPF1_ENA_SHIFT, 0,
    418		 NULL, 0),
    419SND_SOC_DAPM_PGA("LHPF2", ARIZONA_HPLPF2_1, ARIZONA_LHPF2_ENA_SHIFT, 0,
    420		 NULL, 0),
    421SND_SOC_DAPM_PGA("LHPF3", ARIZONA_HPLPF3_1, ARIZONA_LHPF3_ENA_SHIFT, 0,
    422		 NULL, 0),
    423SND_SOC_DAPM_PGA("LHPF4", ARIZONA_HPLPF4_1, ARIZONA_LHPF4_ENA_SHIFT, 0,
    424		 NULL, 0),
    425
    426SND_SOC_DAPM_PGA("PWM1 Driver", ARIZONA_PWM_DRIVE_1, ARIZONA_PWM1_ENA_SHIFT,
    427		 0, NULL, 0),
    428SND_SOC_DAPM_PGA("PWM2 Driver", ARIZONA_PWM_DRIVE_1, ARIZONA_PWM2_ENA_SHIFT,
    429		 0, NULL, 0),
    430
    431SND_SOC_DAPM_PGA("ASRC1L", ARIZONA_ASRC_ENABLE, ARIZONA_ASRC1L_ENA_SHIFT, 0,
    432		 NULL, 0),
    433SND_SOC_DAPM_PGA("ASRC1R", ARIZONA_ASRC_ENABLE, ARIZONA_ASRC1R_ENA_SHIFT, 0,
    434		 NULL, 0),
    435SND_SOC_DAPM_PGA("ASRC2L", ARIZONA_ASRC_ENABLE, ARIZONA_ASRC2L_ENA_SHIFT, 0,
    436		 NULL, 0),
    437SND_SOC_DAPM_PGA("ASRC2R", ARIZONA_ASRC_ENABLE, ARIZONA_ASRC2R_ENA_SHIFT, 0,
    438		 NULL, 0),
    439
    440WM_ADSP2("DSP2", 1, cs47l24_adsp_power_ev),
    441WM_ADSP2("DSP3", 2, cs47l24_adsp_power_ev),
    442
    443SND_SOC_DAPM_PGA("ISRC1INT1", ARIZONA_ISRC_1_CTRL_3,
    444		 ARIZONA_ISRC1_INT0_ENA_SHIFT, 0, NULL, 0),
    445SND_SOC_DAPM_PGA("ISRC1INT2", ARIZONA_ISRC_1_CTRL_3,
    446		 ARIZONA_ISRC1_INT1_ENA_SHIFT, 0, NULL, 0),
    447SND_SOC_DAPM_PGA("ISRC1INT3", ARIZONA_ISRC_1_CTRL_3,
    448		 ARIZONA_ISRC1_INT2_ENA_SHIFT, 0, NULL, 0),
    449SND_SOC_DAPM_PGA("ISRC1INT4", ARIZONA_ISRC_1_CTRL_3,
    450		 ARIZONA_ISRC1_INT3_ENA_SHIFT, 0, NULL, 0),
    451
    452SND_SOC_DAPM_PGA("ISRC1DEC1", ARIZONA_ISRC_1_CTRL_3,
    453		 ARIZONA_ISRC1_DEC0_ENA_SHIFT, 0, NULL, 0),
    454SND_SOC_DAPM_PGA("ISRC1DEC2", ARIZONA_ISRC_1_CTRL_3,
    455		 ARIZONA_ISRC1_DEC1_ENA_SHIFT, 0, NULL, 0),
    456SND_SOC_DAPM_PGA("ISRC1DEC3", ARIZONA_ISRC_1_CTRL_3,
    457		 ARIZONA_ISRC1_DEC2_ENA_SHIFT, 0, NULL, 0),
    458SND_SOC_DAPM_PGA("ISRC1DEC4", ARIZONA_ISRC_1_CTRL_3,
    459		 ARIZONA_ISRC1_DEC3_ENA_SHIFT, 0, NULL, 0),
    460
    461SND_SOC_DAPM_PGA("ISRC2INT1", ARIZONA_ISRC_2_CTRL_3,
    462		 ARIZONA_ISRC2_INT0_ENA_SHIFT, 0, NULL, 0),
    463SND_SOC_DAPM_PGA("ISRC2INT2", ARIZONA_ISRC_2_CTRL_3,
    464		 ARIZONA_ISRC2_INT1_ENA_SHIFT, 0, NULL, 0),
    465SND_SOC_DAPM_PGA("ISRC2INT3", ARIZONA_ISRC_2_CTRL_3,
    466		 ARIZONA_ISRC2_INT2_ENA_SHIFT, 0, NULL, 0),
    467SND_SOC_DAPM_PGA("ISRC2INT4", ARIZONA_ISRC_2_CTRL_3,
    468		 ARIZONA_ISRC2_INT3_ENA_SHIFT, 0, NULL, 0),
    469
    470SND_SOC_DAPM_PGA("ISRC2DEC1", ARIZONA_ISRC_2_CTRL_3,
    471		 ARIZONA_ISRC2_DEC0_ENA_SHIFT, 0, NULL, 0),
    472SND_SOC_DAPM_PGA("ISRC2DEC2", ARIZONA_ISRC_2_CTRL_3,
    473		 ARIZONA_ISRC2_DEC1_ENA_SHIFT, 0, NULL, 0),
    474SND_SOC_DAPM_PGA("ISRC2DEC3", ARIZONA_ISRC_2_CTRL_3,
    475		 ARIZONA_ISRC2_DEC2_ENA_SHIFT, 0, NULL, 0),
    476SND_SOC_DAPM_PGA("ISRC2DEC4", ARIZONA_ISRC_2_CTRL_3,
    477		 ARIZONA_ISRC2_DEC3_ENA_SHIFT, 0, NULL, 0),
    478
    479SND_SOC_DAPM_PGA("ISRC3INT1", ARIZONA_ISRC_3_CTRL_3,
    480		 ARIZONA_ISRC3_INT0_ENA_SHIFT, 0, NULL, 0),
    481SND_SOC_DAPM_PGA("ISRC3INT2", ARIZONA_ISRC_3_CTRL_3,
    482		 ARIZONA_ISRC3_INT1_ENA_SHIFT, 0, NULL, 0),
    483SND_SOC_DAPM_PGA("ISRC3INT3", ARIZONA_ISRC_3_CTRL_3,
    484		 ARIZONA_ISRC3_INT2_ENA_SHIFT, 0, NULL, 0),
    485SND_SOC_DAPM_PGA("ISRC3INT4", ARIZONA_ISRC_3_CTRL_3,
    486		 ARIZONA_ISRC3_INT3_ENA_SHIFT, 0, NULL, 0),
    487
    488SND_SOC_DAPM_PGA("ISRC3DEC1", ARIZONA_ISRC_3_CTRL_3,
    489		 ARIZONA_ISRC3_DEC0_ENA_SHIFT, 0, NULL, 0),
    490SND_SOC_DAPM_PGA("ISRC3DEC2", ARIZONA_ISRC_3_CTRL_3,
    491		 ARIZONA_ISRC3_DEC1_ENA_SHIFT, 0, NULL, 0),
    492SND_SOC_DAPM_PGA("ISRC3DEC3", ARIZONA_ISRC_3_CTRL_3,
    493		 ARIZONA_ISRC3_DEC2_ENA_SHIFT, 0, NULL, 0),
    494SND_SOC_DAPM_PGA("ISRC3DEC4", ARIZONA_ISRC_3_CTRL_3,
    495		 ARIZONA_ISRC3_DEC3_ENA_SHIFT, 0, NULL, 0),
    496
    497SND_SOC_DAPM_MUX("AEC Loopback", ARIZONA_DAC_AEC_CONTROL_1,
    498		 ARIZONA_AEC_LOOPBACK_ENA_SHIFT, 0, &cs47l24_aec_loopback_mux),
    499
    500SND_SOC_DAPM_AIF_OUT("AIF1TX1", NULL, 0,
    501		     ARIZONA_AIF1_TX_ENABLES, ARIZONA_AIF1TX1_ENA_SHIFT, 0),
    502SND_SOC_DAPM_AIF_OUT("AIF1TX2", NULL, 1,
    503		     ARIZONA_AIF1_TX_ENABLES, ARIZONA_AIF1TX2_ENA_SHIFT, 0),
    504SND_SOC_DAPM_AIF_OUT("AIF1TX3", NULL, 2,
    505		     ARIZONA_AIF1_TX_ENABLES, ARIZONA_AIF1TX3_ENA_SHIFT, 0),
    506SND_SOC_DAPM_AIF_OUT("AIF1TX4", NULL, 3,
    507		     ARIZONA_AIF1_TX_ENABLES, ARIZONA_AIF1TX4_ENA_SHIFT, 0),
    508SND_SOC_DAPM_AIF_OUT("AIF1TX5", NULL, 4,
    509		     ARIZONA_AIF1_TX_ENABLES, ARIZONA_AIF1TX5_ENA_SHIFT, 0),
    510SND_SOC_DAPM_AIF_OUT("AIF1TX6", NULL, 5,
    511		     ARIZONA_AIF1_TX_ENABLES, ARIZONA_AIF1TX6_ENA_SHIFT, 0),
    512SND_SOC_DAPM_AIF_OUT("AIF1TX7", NULL, 6,
    513		     ARIZONA_AIF1_TX_ENABLES, ARIZONA_AIF1TX7_ENA_SHIFT, 0),
    514SND_SOC_DAPM_AIF_OUT("AIF1TX8", NULL, 7,
    515		     ARIZONA_AIF1_TX_ENABLES, ARIZONA_AIF1TX8_ENA_SHIFT, 0),
    516
    517SND_SOC_DAPM_AIF_IN("AIF1RX1", NULL, 0,
    518		    ARIZONA_AIF1_RX_ENABLES, ARIZONA_AIF1RX1_ENA_SHIFT, 0),
    519SND_SOC_DAPM_AIF_IN("AIF1RX2", NULL, 1,
    520		    ARIZONA_AIF1_RX_ENABLES, ARIZONA_AIF1RX2_ENA_SHIFT, 0),
    521SND_SOC_DAPM_AIF_IN("AIF1RX3", NULL, 2,
    522		    ARIZONA_AIF1_RX_ENABLES, ARIZONA_AIF1RX3_ENA_SHIFT, 0),
    523SND_SOC_DAPM_AIF_IN("AIF1RX4", NULL, 3,
    524		    ARIZONA_AIF1_RX_ENABLES, ARIZONA_AIF1RX4_ENA_SHIFT, 0),
    525SND_SOC_DAPM_AIF_IN("AIF1RX5", NULL, 4,
    526		    ARIZONA_AIF1_RX_ENABLES, ARIZONA_AIF1RX5_ENA_SHIFT, 0),
    527SND_SOC_DAPM_AIF_IN("AIF1RX6", NULL, 5,
    528		    ARIZONA_AIF1_RX_ENABLES, ARIZONA_AIF1RX6_ENA_SHIFT, 0),
    529SND_SOC_DAPM_AIF_IN("AIF1RX7", NULL, 6,
    530		    ARIZONA_AIF1_RX_ENABLES, ARIZONA_AIF1RX7_ENA_SHIFT, 0),
    531SND_SOC_DAPM_AIF_IN("AIF1RX8", NULL, 7,
    532		    ARIZONA_AIF1_RX_ENABLES, ARIZONA_AIF1RX8_ENA_SHIFT, 0),
    533
    534SND_SOC_DAPM_AIF_OUT("AIF2TX1", NULL, 0,
    535		     ARIZONA_AIF2_TX_ENABLES, ARIZONA_AIF2TX1_ENA_SHIFT, 0),
    536SND_SOC_DAPM_AIF_OUT("AIF2TX2", NULL, 1,
    537		     ARIZONA_AIF2_TX_ENABLES, ARIZONA_AIF2TX2_ENA_SHIFT, 0),
    538SND_SOC_DAPM_AIF_OUT("AIF2TX3", NULL, 2,
    539		     ARIZONA_AIF2_TX_ENABLES, ARIZONA_AIF2TX3_ENA_SHIFT, 0),
    540SND_SOC_DAPM_AIF_OUT("AIF2TX4", NULL, 3,
    541		     ARIZONA_AIF2_TX_ENABLES, ARIZONA_AIF2TX4_ENA_SHIFT, 0),
    542SND_SOC_DAPM_AIF_OUT("AIF2TX5", NULL, 4,
    543		     ARIZONA_AIF2_TX_ENABLES, ARIZONA_AIF2TX5_ENA_SHIFT, 0),
    544SND_SOC_DAPM_AIF_OUT("AIF2TX6", NULL, 5,
    545		     ARIZONA_AIF2_TX_ENABLES, ARIZONA_AIF2TX6_ENA_SHIFT, 0),
    546
    547SND_SOC_DAPM_AIF_IN("AIF2RX1", NULL, 0,
    548		    ARIZONA_AIF2_RX_ENABLES, ARIZONA_AIF2RX1_ENA_SHIFT, 0),
    549SND_SOC_DAPM_AIF_IN("AIF2RX2", NULL, 1,
    550		    ARIZONA_AIF2_RX_ENABLES, ARIZONA_AIF2RX2_ENA_SHIFT, 0),
    551SND_SOC_DAPM_AIF_IN("AIF2RX3", NULL, 2,
    552		    ARIZONA_AIF2_RX_ENABLES, ARIZONA_AIF2RX3_ENA_SHIFT, 0),
    553SND_SOC_DAPM_AIF_IN("AIF2RX4", NULL, 3,
    554		    ARIZONA_AIF2_RX_ENABLES, ARIZONA_AIF2RX4_ENA_SHIFT, 0),
    555SND_SOC_DAPM_AIF_IN("AIF2RX5", NULL, 4,
    556		    ARIZONA_AIF2_RX_ENABLES, ARIZONA_AIF2RX5_ENA_SHIFT, 0),
    557SND_SOC_DAPM_AIF_IN("AIF2RX6", NULL, 5,
    558		    ARIZONA_AIF2_RX_ENABLES, ARIZONA_AIF2RX6_ENA_SHIFT, 0),
    559
    560SND_SOC_DAPM_AIF_OUT("AIF3TX1", NULL, 0,
    561		     ARIZONA_AIF3_TX_ENABLES, ARIZONA_AIF3TX1_ENA_SHIFT, 0),
    562SND_SOC_DAPM_AIF_OUT("AIF3TX2", NULL, 1,
    563		     ARIZONA_AIF3_TX_ENABLES, ARIZONA_AIF3TX2_ENA_SHIFT, 0),
    564
    565SND_SOC_DAPM_AIF_IN("AIF3RX1", NULL, 0,
    566		    ARIZONA_AIF3_RX_ENABLES, ARIZONA_AIF3RX1_ENA_SHIFT, 0),
    567SND_SOC_DAPM_AIF_IN("AIF3RX2", NULL, 1,
    568		    ARIZONA_AIF3_RX_ENABLES, ARIZONA_AIF3RX2_ENA_SHIFT, 0),
    569
    570SND_SOC_DAPM_PGA_E("OUT1L", SND_SOC_NOPM,
    571		   ARIZONA_OUT1L_ENA_SHIFT, 0, NULL, 0, arizona_hp_ev,
    572		   SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD |
    573		   SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU),
    574SND_SOC_DAPM_PGA_E("OUT1R", SND_SOC_NOPM,
    575		   ARIZONA_OUT1R_ENA_SHIFT, 0, NULL, 0, arizona_hp_ev,
    576		   SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD |
    577		   SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU),
    578
    579ARIZONA_MIXER_WIDGETS(EQ1, "EQ1"),
    580ARIZONA_MIXER_WIDGETS(EQ2, "EQ2"),
    581
    582ARIZONA_MIXER_WIDGETS(DRC1L, "DRC1L"),
    583ARIZONA_MIXER_WIDGETS(DRC1R, "DRC1R"),
    584ARIZONA_MIXER_WIDGETS(DRC2L, "DRC2L"),
    585ARIZONA_MIXER_WIDGETS(DRC2R, "DRC2R"),
    586
    587ARIZONA_MIXER_WIDGETS(LHPF1, "LHPF1"),
    588ARIZONA_MIXER_WIDGETS(LHPF2, "LHPF2"),
    589ARIZONA_MIXER_WIDGETS(LHPF3, "LHPF3"),
    590ARIZONA_MIXER_WIDGETS(LHPF4, "LHPF4"),
    591
    592ARIZONA_MIXER_WIDGETS(PWM1, "PWM1"),
    593ARIZONA_MIXER_WIDGETS(PWM2, "PWM2"),
    594
    595ARIZONA_MIXER_WIDGETS(OUT1L, "HPOUT1L"),
    596ARIZONA_MIXER_WIDGETS(OUT1R, "HPOUT1R"),
    597ARIZONA_MIXER_WIDGETS(SPKOUT, "SPKOUT"),
    598
    599ARIZONA_MIXER_WIDGETS(AIF1TX1, "AIF1TX1"),
    600ARIZONA_MIXER_WIDGETS(AIF1TX2, "AIF1TX2"),
    601ARIZONA_MIXER_WIDGETS(AIF1TX3, "AIF1TX3"),
    602ARIZONA_MIXER_WIDGETS(AIF1TX4, "AIF1TX4"),
    603ARIZONA_MIXER_WIDGETS(AIF1TX5, "AIF1TX5"),
    604ARIZONA_MIXER_WIDGETS(AIF1TX6, "AIF1TX6"),
    605ARIZONA_MIXER_WIDGETS(AIF1TX7, "AIF1TX7"),
    606ARIZONA_MIXER_WIDGETS(AIF1TX8, "AIF1TX8"),
    607
    608ARIZONA_MIXER_WIDGETS(AIF2TX1, "AIF2TX1"),
    609ARIZONA_MIXER_WIDGETS(AIF2TX2, "AIF2TX2"),
    610ARIZONA_MIXER_WIDGETS(AIF2TX3, "AIF2TX3"),
    611ARIZONA_MIXER_WIDGETS(AIF2TX4, "AIF2TX4"),
    612ARIZONA_MIXER_WIDGETS(AIF2TX5, "AIF2TX5"),
    613ARIZONA_MIXER_WIDGETS(AIF2TX6, "AIF2TX6"),
    614
    615ARIZONA_MIXER_WIDGETS(AIF3TX1, "AIF3TX1"),
    616ARIZONA_MIXER_WIDGETS(AIF3TX2, "AIF3TX2"),
    617
    618ARIZONA_MUX_WIDGETS(ASRC1L, "ASRC1L"),
    619ARIZONA_MUX_WIDGETS(ASRC1R, "ASRC1R"),
    620ARIZONA_MUX_WIDGETS(ASRC2L, "ASRC2L"),
    621ARIZONA_MUX_WIDGETS(ASRC2R, "ASRC2R"),
    622
    623ARIZONA_DSP_WIDGETS(DSP2, "DSP2"),
    624ARIZONA_DSP_WIDGETS(DSP3, "DSP3"),
    625
    626ARIZONA_MUX_WIDGETS(ISRC1DEC1, "ISRC1DEC1"),
    627ARIZONA_MUX_WIDGETS(ISRC1DEC2, "ISRC1DEC2"),
    628ARIZONA_MUX_WIDGETS(ISRC1DEC3, "ISRC1DEC3"),
    629ARIZONA_MUX_WIDGETS(ISRC1DEC4, "ISRC1DEC4"),
    630
    631ARIZONA_MUX_WIDGETS(ISRC1INT1, "ISRC1INT1"),
    632ARIZONA_MUX_WIDGETS(ISRC1INT2, "ISRC1INT2"),
    633ARIZONA_MUX_WIDGETS(ISRC1INT3, "ISRC1INT3"),
    634ARIZONA_MUX_WIDGETS(ISRC1INT4, "ISRC1INT4"),
    635
    636ARIZONA_MUX_WIDGETS(ISRC2DEC1, "ISRC2DEC1"),
    637ARIZONA_MUX_WIDGETS(ISRC2DEC2, "ISRC2DEC2"),
    638ARIZONA_MUX_WIDGETS(ISRC2DEC3, "ISRC2DEC3"),
    639ARIZONA_MUX_WIDGETS(ISRC2DEC4, "ISRC2DEC4"),
    640
    641ARIZONA_MUX_WIDGETS(ISRC2INT1, "ISRC2INT1"),
    642ARIZONA_MUX_WIDGETS(ISRC2INT2, "ISRC2INT2"),
    643ARIZONA_MUX_WIDGETS(ISRC2INT3, "ISRC2INT3"),
    644ARIZONA_MUX_WIDGETS(ISRC2INT4, "ISRC2INT4"),
    645
    646ARIZONA_MUX_WIDGETS(ISRC3DEC1, "ISRC3DEC1"),
    647ARIZONA_MUX_WIDGETS(ISRC3DEC2, "ISRC3DEC2"),
    648ARIZONA_MUX_WIDGETS(ISRC3DEC3, "ISRC3DEC3"),
    649ARIZONA_MUX_WIDGETS(ISRC3DEC4, "ISRC3DEC4"),
    650
    651ARIZONA_MUX_WIDGETS(ISRC3INT1, "ISRC3INT1"),
    652ARIZONA_MUX_WIDGETS(ISRC3INT2, "ISRC3INT2"),
    653ARIZONA_MUX_WIDGETS(ISRC3INT3, "ISRC3INT3"),
    654ARIZONA_MUX_WIDGETS(ISRC3INT4, "ISRC3INT4"),
    655
    656SND_SOC_DAPM_OUTPUT("HPOUT1L"),
    657SND_SOC_DAPM_OUTPUT("HPOUT1R"),
    658SND_SOC_DAPM_OUTPUT("SPKOUTN"),
    659SND_SOC_DAPM_OUTPUT("SPKOUTP"),
    660
    661SND_SOC_DAPM_OUTPUT("MICSUPP"),
    662};
    663
    664#define ARIZONA_MIXER_INPUT_ROUTES(name)	\
    665	{ name, "Noise Generator", "Noise Generator" }, \
    666	{ name, "Tone Generator 1", "Tone Generator 1" }, \
    667	{ name, "Tone Generator 2", "Tone Generator 2" }, \
    668	{ name, "Haptics", "HAPTICS" }, \
    669	{ name, "AEC", "AEC Loopback" }, \
    670	{ name, "IN1L", "IN1L PGA" }, \
    671	{ name, "IN1R", "IN1R PGA" }, \
    672	{ name, "IN2L", "IN2L PGA" }, \
    673	{ name, "IN2R", "IN2R PGA" }, \
    674	{ name, "AIF1RX1", "AIF1RX1" }, \
    675	{ name, "AIF1RX2", "AIF1RX2" }, \
    676	{ name, "AIF1RX3", "AIF1RX3" }, \
    677	{ name, "AIF1RX4", "AIF1RX4" }, \
    678	{ name, "AIF1RX5", "AIF1RX5" }, \
    679	{ name, "AIF1RX6", "AIF1RX6" }, \
    680	{ name, "AIF1RX7", "AIF1RX7" }, \
    681	{ name, "AIF1RX8", "AIF1RX8" }, \
    682	{ name, "AIF2RX1", "AIF2RX1" }, \
    683	{ name, "AIF2RX2", "AIF2RX2" }, \
    684	{ name, "AIF2RX3", "AIF2RX3" }, \
    685	{ name, "AIF2RX4", "AIF2RX4" }, \
    686	{ name, "AIF2RX5", "AIF2RX5" }, \
    687	{ name, "AIF2RX6", "AIF2RX6" }, \
    688	{ name, "AIF3RX1", "AIF3RX1" }, \
    689	{ name, "AIF3RX2", "AIF3RX2" }, \
    690	{ name, "EQ1", "EQ1" }, \
    691	{ name, "EQ2", "EQ2" }, \
    692	{ name, "DRC1L", "DRC1L" }, \
    693	{ name, "DRC1R", "DRC1R" }, \
    694	{ name, "DRC2L", "DRC2L" }, \
    695	{ name, "DRC2R", "DRC2R" }, \
    696	{ name, "LHPF1", "LHPF1" }, \
    697	{ name, "LHPF2", "LHPF2" }, \
    698	{ name, "LHPF3", "LHPF3" }, \
    699	{ name, "LHPF4", "LHPF4" }, \
    700	{ name, "ASRC1L", "ASRC1L" }, \
    701	{ name, "ASRC1R", "ASRC1R" }, \
    702	{ name, "ASRC2L", "ASRC2L" }, \
    703	{ name, "ASRC2R", "ASRC2R" }, \
    704	{ name, "ISRC1DEC1", "ISRC1DEC1" }, \
    705	{ name, "ISRC1DEC2", "ISRC1DEC2" }, \
    706	{ name, "ISRC1DEC3", "ISRC1DEC3" }, \
    707	{ name, "ISRC1DEC4", "ISRC1DEC4" }, \
    708	{ name, "ISRC1INT1", "ISRC1INT1" }, \
    709	{ name, "ISRC1INT2", "ISRC1INT2" }, \
    710	{ name, "ISRC1INT3", "ISRC1INT3" }, \
    711	{ name, "ISRC1INT4", "ISRC1INT4" }, \
    712	{ name, "ISRC2DEC1", "ISRC2DEC1" }, \
    713	{ name, "ISRC2DEC2", "ISRC2DEC2" }, \
    714	{ name, "ISRC2DEC3", "ISRC2DEC3" }, \
    715	{ name, "ISRC2DEC4", "ISRC2DEC4" }, \
    716	{ name, "ISRC2INT1", "ISRC2INT1" }, \
    717	{ name, "ISRC2INT2", "ISRC2INT2" }, \
    718	{ name, "ISRC2INT3", "ISRC2INT3" }, \
    719	{ name, "ISRC2INT4", "ISRC2INT4" }, \
    720	{ name, "ISRC3DEC1", "ISRC3DEC1" }, \
    721	{ name, "ISRC3DEC2", "ISRC3DEC2" }, \
    722	{ name, "ISRC3DEC3", "ISRC3DEC3" }, \
    723	{ name, "ISRC3DEC4", "ISRC3DEC4" }, \
    724	{ name, "ISRC3INT1", "ISRC3INT1" }, \
    725	{ name, "ISRC3INT2", "ISRC3INT2" }, \
    726	{ name, "ISRC3INT3", "ISRC3INT3" }, \
    727	{ name, "ISRC3INT4", "ISRC3INT4" }, \
    728	{ name, "DSP2.1", "DSP2" }, \
    729	{ name, "DSP2.2", "DSP2" }, \
    730	{ name, "DSP2.3", "DSP2" }, \
    731	{ name, "DSP2.4", "DSP2" }, \
    732	{ name, "DSP2.5", "DSP2" }, \
    733	{ name, "DSP2.6", "DSP2" }, \
    734	{ name, "DSP3.1", "DSP3" }, \
    735	{ name, "DSP3.2", "DSP3" }, \
    736	{ name, "DSP3.3", "DSP3" }, \
    737	{ name, "DSP3.4", "DSP3" }, \
    738	{ name, "DSP3.5", "DSP3" }, \
    739	{ name, "DSP3.6", "DSP3" }
    740
    741static const struct snd_soc_dapm_route cs47l24_dapm_routes[] = {
    742	{ "OUT1L", NULL, "CPVDD" },
    743	{ "OUT1R", NULL, "CPVDD" },
    744
    745	{ "OUT4L", NULL, "SPKVDD" },
    746
    747	{ "OUT1L", NULL, "SYSCLK" },
    748	{ "OUT1R", NULL, "SYSCLK" },
    749	{ "OUT4L", NULL, "SYSCLK" },
    750
    751	{ "IN1L", NULL, "SYSCLK" },
    752	{ "IN1R", NULL, "SYSCLK" },
    753	{ "IN2L", NULL, "SYSCLK" },
    754	{ "IN2R", NULL, "SYSCLK" },
    755
    756	{ "ASRC1L", NULL, "SYSCLK" },
    757	{ "ASRC1R", NULL, "SYSCLK" },
    758	{ "ASRC2L", NULL, "SYSCLK" },
    759	{ "ASRC2R", NULL, "SYSCLK" },
    760
    761	{ "ASRC1L", NULL, "ASYNCCLK" },
    762	{ "ASRC1R", NULL, "ASYNCCLK" },
    763	{ "ASRC2L", NULL, "ASYNCCLK" },
    764	{ "ASRC2R", NULL, "ASYNCCLK" },
    765
    766	{ "MICBIAS1", NULL, "MICVDD" },
    767	{ "MICBIAS2", NULL, "MICVDD" },
    768
    769	{ "Noise Generator", NULL, "SYSCLK" },
    770	{ "Tone Generator 1", NULL, "SYSCLK" },
    771	{ "Tone Generator 2", NULL, "SYSCLK" },
    772
    773	{ "Noise Generator", NULL, "NOISE" },
    774	{ "Tone Generator 1", NULL, "TONE" },
    775	{ "Tone Generator 2", NULL, "TONE" },
    776
    777	{ "AIF1 Capture", NULL, "AIF1TX1" },
    778	{ "AIF1 Capture", NULL, "AIF1TX2" },
    779	{ "AIF1 Capture", NULL, "AIF1TX3" },
    780	{ "AIF1 Capture", NULL, "AIF1TX4" },
    781	{ "AIF1 Capture", NULL, "AIF1TX5" },
    782	{ "AIF1 Capture", NULL, "AIF1TX6" },
    783	{ "AIF1 Capture", NULL, "AIF1TX7" },
    784	{ "AIF1 Capture", NULL, "AIF1TX8" },
    785
    786	{ "AIF1RX1", NULL, "AIF1 Playback" },
    787	{ "AIF1RX2", NULL, "AIF1 Playback" },
    788	{ "AIF1RX3", NULL, "AIF1 Playback" },
    789	{ "AIF1RX4", NULL, "AIF1 Playback" },
    790	{ "AIF1RX5", NULL, "AIF1 Playback" },
    791	{ "AIF1RX6", NULL, "AIF1 Playback" },
    792	{ "AIF1RX7", NULL, "AIF1 Playback" },
    793	{ "AIF1RX8", NULL, "AIF1 Playback" },
    794
    795	{ "AIF2 Capture", NULL, "AIF2TX1" },
    796	{ "AIF2 Capture", NULL, "AIF2TX2" },
    797	{ "AIF2 Capture", NULL, "AIF2TX3" },
    798	{ "AIF2 Capture", NULL, "AIF2TX4" },
    799	{ "AIF2 Capture", NULL, "AIF2TX5" },
    800	{ "AIF2 Capture", NULL, "AIF2TX6" },
    801
    802	{ "AIF2RX1", NULL, "AIF2 Playback" },
    803	{ "AIF2RX2", NULL, "AIF2 Playback" },
    804	{ "AIF2RX3", NULL, "AIF2 Playback" },
    805	{ "AIF2RX4", NULL, "AIF2 Playback" },
    806	{ "AIF2RX5", NULL, "AIF2 Playback" },
    807	{ "AIF2RX6", NULL, "AIF2 Playback" },
    808
    809	{ "AIF3 Capture", NULL, "AIF3TX1" },
    810	{ "AIF3 Capture", NULL, "AIF3TX2" },
    811
    812	{ "AIF3RX1", NULL, "AIF3 Playback" },
    813	{ "AIF3RX2", NULL, "AIF3 Playback" },
    814
    815	{ "AIF1 Playback", NULL, "SYSCLK" },
    816	{ "AIF2 Playback", NULL, "SYSCLK" },
    817	{ "AIF3 Playback", NULL, "SYSCLK" },
    818
    819	{ "AIF1 Capture", NULL, "SYSCLK" },
    820	{ "AIF2 Capture", NULL, "SYSCLK" },
    821	{ "AIF3 Capture", NULL, "SYSCLK" },
    822
    823	{ "Voice Control DSP", NULL, "DSP3" },
    824
    825	{ "IN1L PGA", NULL, "IN1L" },
    826	{ "IN1R PGA", NULL, "IN1R" },
    827
    828	{ "IN2L PGA", NULL, "IN2L" },
    829	{ "IN2R PGA", NULL, "IN2R" },
    830
    831	{ "Audio Trace DSP", NULL, "DSP2" },
    832
    833	ARIZONA_MIXER_ROUTES("OUT1L", "HPOUT1L"),
    834	ARIZONA_MIXER_ROUTES("OUT1R", "HPOUT1R"),
    835
    836	ARIZONA_MIXER_ROUTES("OUT4L", "SPKOUT"),
    837
    838	ARIZONA_MIXER_ROUTES("PWM1 Driver", "PWM1"),
    839	ARIZONA_MIXER_ROUTES("PWM2 Driver", "PWM2"),
    840
    841	ARIZONA_MIXER_ROUTES("AIF1TX1", "AIF1TX1"),
    842	ARIZONA_MIXER_ROUTES("AIF1TX2", "AIF1TX2"),
    843	ARIZONA_MIXER_ROUTES("AIF1TX3", "AIF1TX3"),
    844	ARIZONA_MIXER_ROUTES("AIF1TX4", "AIF1TX4"),
    845	ARIZONA_MIXER_ROUTES("AIF1TX5", "AIF1TX5"),
    846	ARIZONA_MIXER_ROUTES("AIF1TX6", "AIF1TX6"),
    847	ARIZONA_MIXER_ROUTES("AIF1TX7", "AIF1TX7"),
    848	ARIZONA_MIXER_ROUTES("AIF1TX8", "AIF1TX8"),
    849
    850	ARIZONA_MIXER_ROUTES("AIF2TX1", "AIF2TX1"),
    851	ARIZONA_MIXER_ROUTES("AIF2TX2", "AIF2TX2"),
    852	ARIZONA_MIXER_ROUTES("AIF2TX3", "AIF2TX3"),
    853	ARIZONA_MIXER_ROUTES("AIF2TX4", "AIF2TX4"),
    854	ARIZONA_MIXER_ROUTES("AIF2TX5", "AIF2TX5"),
    855	ARIZONA_MIXER_ROUTES("AIF2TX6", "AIF2TX6"),
    856
    857	ARIZONA_MIXER_ROUTES("AIF3TX1", "AIF3TX1"),
    858	ARIZONA_MIXER_ROUTES("AIF3TX2", "AIF3TX2"),
    859
    860	ARIZONA_MIXER_ROUTES("EQ1", "EQ1"),
    861	ARIZONA_MIXER_ROUTES("EQ2", "EQ2"),
    862
    863	ARIZONA_MIXER_ROUTES("DRC1L", "DRC1L"),
    864	ARIZONA_MIXER_ROUTES("DRC1R", "DRC1R"),
    865	ARIZONA_MIXER_ROUTES("DRC2L", "DRC2L"),
    866	ARIZONA_MIXER_ROUTES("DRC2R", "DRC2R"),
    867
    868	ARIZONA_MIXER_ROUTES("LHPF1", "LHPF1"),
    869	ARIZONA_MIXER_ROUTES("LHPF2", "LHPF2"),
    870	ARIZONA_MIXER_ROUTES("LHPF3", "LHPF3"),
    871	ARIZONA_MIXER_ROUTES("LHPF4", "LHPF4"),
    872
    873	ARIZONA_MUX_ROUTES("ASRC1L", "ASRC1L"),
    874	ARIZONA_MUX_ROUTES("ASRC1R", "ASRC1R"),
    875	ARIZONA_MUX_ROUTES("ASRC2L", "ASRC2L"),
    876	ARIZONA_MUX_ROUTES("ASRC2R", "ASRC2R"),
    877
    878	ARIZONA_DSP_ROUTES("DSP2"),
    879	ARIZONA_DSP_ROUTES("DSP3"),
    880
    881	ARIZONA_MUX_ROUTES("ISRC1INT1", "ISRC1INT1"),
    882	ARIZONA_MUX_ROUTES("ISRC1INT2", "ISRC1INT2"),
    883	ARIZONA_MUX_ROUTES("ISRC1INT3", "ISRC1INT3"),
    884	ARIZONA_MUX_ROUTES("ISRC1INT4", "ISRC1INT4"),
    885
    886	ARIZONA_MUX_ROUTES("ISRC1DEC1", "ISRC1DEC1"),
    887	ARIZONA_MUX_ROUTES("ISRC1DEC2", "ISRC1DEC2"),
    888	ARIZONA_MUX_ROUTES("ISRC1DEC3", "ISRC1DEC3"),
    889	ARIZONA_MUX_ROUTES("ISRC1DEC4", "ISRC1DEC4"),
    890
    891	ARIZONA_MUX_ROUTES("ISRC2INT1", "ISRC2INT1"),
    892	ARIZONA_MUX_ROUTES("ISRC2INT2", "ISRC2INT2"),
    893	ARIZONA_MUX_ROUTES("ISRC2INT3", "ISRC2INT3"),
    894	ARIZONA_MUX_ROUTES("ISRC2INT4", "ISRC2INT4"),
    895
    896	ARIZONA_MUX_ROUTES("ISRC2DEC1", "ISRC2DEC1"),
    897	ARIZONA_MUX_ROUTES("ISRC2DEC2", "ISRC2DEC2"),
    898	ARIZONA_MUX_ROUTES("ISRC2DEC3", "ISRC2DEC3"),
    899	ARIZONA_MUX_ROUTES("ISRC2DEC4", "ISRC2DEC4"),
    900
    901	ARIZONA_MUX_ROUTES("ISRC3INT1", "ISRC3INT1"),
    902	ARIZONA_MUX_ROUTES("ISRC3INT2", "ISRC3INT2"),
    903	ARIZONA_MUX_ROUTES("ISRC3INT3", "ISRC3INT3"),
    904	ARIZONA_MUX_ROUTES("ISRC3INT4", "ISRC3INT4"),
    905
    906	ARIZONA_MUX_ROUTES("ISRC3DEC1", "ISRC3DEC1"),
    907	ARIZONA_MUX_ROUTES("ISRC3DEC2", "ISRC3DEC2"),
    908	ARIZONA_MUX_ROUTES("ISRC3DEC3", "ISRC3DEC3"),
    909	ARIZONA_MUX_ROUTES("ISRC3DEC4", "ISRC3DEC4"),
    910
    911	{ "AEC Loopback", "HPOUT1L", "OUT1L" },
    912	{ "AEC Loopback", "HPOUT1R", "OUT1R" },
    913	{ "HPOUT1L", NULL, "OUT1L" },
    914	{ "HPOUT1R", NULL, "OUT1R" },
    915
    916	{ "AEC Loopback", "SPKOUT", "OUT4L" },
    917	{ "SPKOUTN", NULL, "OUT4L" },
    918	{ "SPKOUTP", NULL, "OUT4L" },
    919
    920	{ "MICSUPP", NULL, "SYSCLK" },
    921
    922	{ "DRC1 Signal Activity", NULL, "SYSCLK" },
    923	{ "DRC2 Signal Activity", NULL, "SYSCLK" },
    924	{ "DRC1 Signal Activity", NULL, "DRC1L" },
    925	{ "DRC1 Signal Activity", NULL, "DRC1R" },
    926	{ "DRC2 Signal Activity", NULL, "DRC2L" },
    927	{ "DRC2 Signal Activity", NULL, "DRC2R" },
    928
    929	{ "DSP Voice Trigger", NULL, "SYSCLK" },
    930	{ "DSP Voice Trigger", NULL, "DSP3 Voice Trigger" },
    931	{ "DSP3 Voice Trigger", "Switch", "DSP3" },
    932};
    933
    934static int cs47l24_set_fll(struct snd_soc_component *component, int fll_id,
    935			   int source, unsigned int Fref, unsigned int Fout)
    936{
    937	struct cs47l24_priv *cs47l24 = snd_soc_component_get_drvdata(component);
    938
    939	switch (fll_id) {
    940	case CS47L24_FLL1:
    941		return arizona_set_fll(&cs47l24->fll[0], source, Fref, Fout);
    942	case CS47L24_FLL2:
    943		return arizona_set_fll(&cs47l24->fll[1], source, Fref, Fout);
    944	case CS47L24_FLL1_REFCLK:
    945		return arizona_set_fll_refclk(&cs47l24->fll[0], source, Fref,
    946					      Fout);
    947	case CS47L24_FLL2_REFCLK:
    948		return arizona_set_fll_refclk(&cs47l24->fll[1], source, Fref,
    949					      Fout);
    950	default:
    951		return -EINVAL;
    952	}
    953}
    954
    955#define CS47L24_RATES SNDRV_PCM_RATE_KNOT
    956
    957#define CS47L24_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE |\
    958			 SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S32_LE)
    959
    960static struct snd_soc_dai_driver cs47l24_dai[] = {
    961	{
    962		.name = "cs47l24-aif1",
    963		.id = 1,
    964		.base = ARIZONA_AIF1_BCLK_CTRL,
    965		.playback = {
    966			.stream_name = "AIF1 Playback",
    967			.channels_min = 1,
    968			.channels_max = 8,
    969			.rates = CS47L24_RATES,
    970			.formats = CS47L24_FORMATS,
    971		},
    972		.capture = {
    973			 .stream_name = "AIF1 Capture",
    974			 .channels_min = 1,
    975			 .channels_max = 8,
    976			 .rates = CS47L24_RATES,
    977			 .formats = CS47L24_FORMATS,
    978		 },
    979		.ops = &arizona_dai_ops,
    980		.symmetric_rate = 1,
    981		.symmetric_sample_bits = 1,
    982	},
    983	{
    984		.name = "cs47l24-aif2",
    985		.id = 2,
    986		.base = ARIZONA_AIF2_BCLK_CTRL,
    987		.playback = {
    988			.stream_name = "AIF2 Playback",
    989			.channels_min = 1,
    990			.channels_max = 6,
    991			.rates = CS47L24_RATES,
    992			.formats = CS47L24_FORMATS,
    993		},
    994		.capture = {
    995			 .stream_name = "AIF2 Capture",
    996			 .channels_min = 1,
    997			 .channels_max = 6,
    998			 .rates = CS47L24_RATES,
    999			 .formats = CS47L24_FORMATS,
   1000		 },
   1001		.ops = &arizona_dai_ops,
   1002		.symmetric_rate = 1,
   1003		.symmetric_sample_bits = 1,
   1004	},
   1005	{
   1006		.name = "cs47l24-aif3",
   1007		.id = 3,
   1008		.base = ARIZONA_AIF3_BCLK_CTRL,
   1009		.playback = {
   1010			.stream_name = "AIF3 Playback",
   1011			.channels_min = 1,
   1012			.channels_max = 2,
   1013			.rates = CS47L24_RATES,
   1014			.formats = CS47L24_FORMATS,
   1015		},
   1016		.capture = {
   1017			 .stream_name = "AIF3 Capture",
   1018			 .channels_min = 1,
   1019			 .channels_max = 2,
   1020			 .rates = CS47L24_RATES,
   1021			 .formats = CS47L24_FORMATS,
   1022		 },
   1023		.ops = &arizona_dai_ops,
   1024		.symmetric_rate = 1,
   1025		.symmetric_sample_bits = 1,
   1026	},
   1027	{
   1028		.name = "cs47l24-cpu-voicectrl",
   1029		.capture = {
   1030			.stream_name = "Voice Control CPU",
   1031			.channels_min = 1,
   1032			.channels_max = 1,
   1033			.rates = CS47L24_RATES,
   1034			.formats = CS47L24_FORMATS,
   1035		},
   1036		.compress_new = snd_soc_new_compress,
   1037	},
   1038	{
   1039		.name = "cs47l24-dsp-voicectrl",
   1040		.capture = {
   1041			.stream_name = "Voice Control DSP",
   1042			.channels_min = 1,
   1043			.channels_max = 1,
   1044			.rates = CS47L24_RATES,
   1045			.formats = CS47L24_FORMATS,
   1046		},
   1047	},
   1048	{
   1049		.name = "cs47l24-cpu-trace",
   1050		.capture = {
   1051			.stream_name = "Audio Trace CPU",
   1052			.channels_min = 1,
   1053			.channels_max = 6,
   1054			.rates = CS47L24_RATES,
   1055			.formats = CS47L24_FORMATS,
   1056		},
   1057		.compress_new = snd_soc_new_compress,
   1058	},
   1059	{
   1060		.name = "cs47l24-dsp-trace",
   1061		.capture = {
   1062			.stream_name = "Audio Trace DSP",
   1063			.channels_min = 1,
   1064			.channels_max = 6,
   1065			.rates = CS47L24_RATES,
   1066			.formats = CS47L24_FORMATS,
   1067		},
   1068	},
   1069};
   1070
   1071static int cs47l24_open(struct snd_soc_component *component,
   1072			struct snd_compr_stream *stream)
   1073{
   1074	struct snd_soc_pcm_runtime *rtd = stream->private_data;
   1075	struct cs47l24_priv *priv = snd_soc_component_get_drvdata(component);
   1076	struct arizona *arizona = priv->core.arizona;
   1077	int n_adsp;
   1078
   1079	if (strcmp(asoc_rtd_to_codec(rtd, 0)->name, "cs47l24-dsp-voicectrl") == 0) {
   1080		n_adsp = 2;
   1081	} else if (strcmp(asoc_rtd_to_codec(rtd, 0)->name, "cs47l24-dsp-trace") == 0) {
   1082		n_adsp = 1;
   1083	} else {
   1084		dev_err(arizona->dev,
   1085			"No suitable compressed stream for DAI '%s'\n",
   1086			asoc_rtd_to_codec(rtd, 0)->name);
   1087		return -EINVAL;
   1088	}
   1089
   1090	return wm_adsp_compr_open(&priv->core.adsp[n_adsp], stream);
   1091}
   1092
   1093static irqreturn_t cs47l24_adsp2_irq(int irq, void *data)
   1094{
   1095	struct cs47l24_priv *priv = data;
   1096	struct arizona *arizona = priv->core.arizona;
   1097	struct arizona_voice_trigger_info info;
   1098	int serviced = 0;
   1099	int i, ret;
   1100
   1101	for (i = 1; i <= 2; ++i) {
   1102		ret = wm_adsp_compr_handle_irq(&priv->core.adsp[i]);
   1103		if (ret != -ENODEV)
   1104			serviced++;
   1105		if (ret == WM_ADSP_COMPR_VOICE_TRIGGER) {
   1106			info.core = i;
   1107			arizona_call_notifiers(arizona,
   1108					       ARIZONA_NOTIFY_VOICE_TRIGGER,
   1109					       &info);
   1110		}
   1111	}
   1112
   1113	if (!serviced) {
   1114		dev_err(arizona->dev, "Spurious compressed data IRQ\n");
   1115		return IRQ_NONE;
   1116	}
   1117
   1118	return IRQ_HANDLED;
   1119}
   1120
   1121static int cs47l24_component_probe(struct snd_soc_component *component)
   1122{
   1123	struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(component);
   1124	struct cs47l24_priv *priv = snd_soc_component_get_drvdata(component);
   1125	struct arizona *arizona = priv->core.arizona;
   1126	int ret;
   1127
   1128	arizona->dapm = dapm;
   1129	snd_soc_component_init_regmap(component, arizona->regmap);
   1130
   1131	ret = arizona_init_spk(component);
   1132	if (ret < 0)
   1133		return ret;
   1134
   1135	arizona_init_gpio(component);
   1136	arizona_init_mono(component);
   1137
   1138	ret = wm_adsp2_component_probe(&priv->core.adsp[1], component);
   1139	if (ret)
   1140		goto err_adsp2_codec_probe;
   1141
   1142	ret = wm_adsp2_component_probe(&priv->core.adsp[2], component);
   1143	if (ret)
   1144		goto err_adsp2_codec_probe;
   1145
   1146	ret = snd_soc_add_component_controls(component,
   1147					     &arizona_adsp2_rate_controls[1],
   1148					     2);
   1149	if (ret)
   1150		goto err_adsp2_codec_probe;
   1151
   1152	snd_soc_component_disable_pin(component, "HAPTICS");
   1153
   1154	return 0;
   1155
   1156err_adsp2_codec_probe:
   1157	wm_adsp2_component_remove(&priv->core.adsp[1], component);
   1158	wm_adsp2_component_remove(&priv->core.adsp[2], component);
   1159
   1160	return ret;
   1161}
   1162
   1163static void cs47l24_component_remove(struct snd_soc_component *component)
   1164{
   1165	struct cs47l24_priv *priv = snd_soc_component_get_drvdata(component);
   1166
   1167	wm_adsp2_component_remove(&priv->core.adsp[1], component);
   1168	wm_adsp2_component_remove(&priv->core.adsp[2], component);
   1169
   1170	priv->core.arizona->dapm = NULL;
   1171}
   1172
   1173#define CS47L24_DIG_VU 0x0200
   1174
   1175static unsigned int cs47l24_digital_vu[] = {
   1176	ARIZONA_DAC_DIGITAL_VOLUME_1L,
   1177	ARIZONA_DAC_DIGITAL_VOLUME_1R,
   1178	ARIZONA_DAC_DIGITAL_VOLUME_4L,
   1179};
   1180
   1181static const struct snd_compress_ops cs47l24_compress_ops = {
   1182	.open		= cs47l24_open,
   1183	.free		= wm_adsp_compr_free,
   1184	.set_params	= wm_adsp_compr_set_params,
   1185	.get_caps	= wm_adsp_compr_get_caps,
   1186	.trigger	= wm_adsp_compr_trigger,
   1187	.pointer	= wm_adsp_compr_pointer,
   1188	.copy		= wm_adsp_compr_copy,
   1189};
   1190
   1191static const struct snd_soc_component_driver soc_component_dev_cs47l24 = {
   1192	.probe			= cs47l24_component_probe,
   1193	.remove			= cs47l24_component_remove,
   1194	.set_sysclk		= arizona_set_sysclk,
   1195	.set_pll		= cs47l24_set_fll,
   1196	.name			= DRV_NAME,
   1197	.compress_ops		= &cs47l24_compress_ops,
   1198	.controls		= cs47l24_snd_controls,
   1199	.num_controls		= ARRAY_SIZE(cs47l24_snd_controls),
   1200	.dapm_widgets		= cs47l24_dapm_widgets,
   1201	.num_dapm_widgets	= ARRAY_SIZE(cs47l24_dapm_widgets),
   1202	.dapm_routes		= cs47l24_dapm_routes,
   1203	.num_dapm_routes	= ARRAY_SIZE(cs47l24_dapm_routes),
   1204	.use_pmdown_time	= 1,
   1205	.endianness		= 1,
   1206	.non_legacy_dai_naming	= 1,
   1207};
   1208
   1209static int cs47l24_probe(struct platform_device *pdev)
   1210{
   1211	struct arizona *arizona = dev_get_drvdata(pdev->dev.parent);
   1212	struct cs47l24_priv *cs47l24;
   1213	int i, ret;
   1214
   1215	BUILD_BUG_ON(ARRAY_SIZE(cs47l24_dai) > ARIZONA_MAX_DAI);
   1216
   1217	cs47l24 = devm_kzalloc(&pdev->dev, sizeof(struct cs47l24_priv),
   1218			       GFP_KERNEL);
   1219	if (!cs47l24)
   1220		return -ENOMEM;
   1221
   1222	if (IS_ENABLED(CONFIG_OF)) {
   1223		if (!dev_get_platdata(arizona->dev)) {
   1224			ret = arizona_of_get_audio_pdata(arizona);
   1225			if (ret < 0)
   1226				return ret;
   1227		}
   1228	}
   1229
   1230	platform_set_drvdata(pdev, cs47l24);
   1231
   1232	cs47l24->core.arizona = arizona;
   1233	cs47l24->core.num_inputs = 4;
   1234
   1235	for (i = 1; i <= 2; i++) {
   1236		cs47l24->core.adsp[i].part = "cs47l24";
   1237		cs47l24->core.adsp[i].cs_dsp.num = i + 1;
   1238		cs47l24->core.adsp[i].cs_dsp.type = WMFW_ADSP2;
   1239		cs47l24->core.adsp[i].cs_dsp.dev = arizona->dev;
   1240		cs47l24->core.adsp[i].cs_dsp.regmap = arizona->regmap;
   1241
   1242		cs47l24->core.adsp[i].cs_dsp.base = ARIZONA_DSP1_CONTROL_1 +
   1243					     (0x100 * i);
   1244		cs47l24->core.adsp[i].cs_dsp.mem = cs47l24_dsp_regions[i - 1];
   1245		cs47l24->core.adsp[i].cs_dsp.num_mems =
   1246				ARRAY_SIZE(cs47l24_dsp2_regions);
   1247
   1248		ret = wm_adsp2_init(&cs47l24->core.adsp[i]);
   1249		if (ret != 0)
   1250			return ret;
   1251	}
   1252
   1253	for (i = 0; i < ARRAY_SIZE(cs47l24->fll); i++)
   1254		cs47l24->fll[i].vco_mult = 3;
   1255
   1256	arizona_init_fll(arizona, 1, ARIZONA_FLL1_CONTROL_1 - 1,
   1257			 ARIZONA_IRQ_FLL1_LOCK, ARIZONA_IRQ_FLL1_CLOCK_OK,
   1258			 &cs47l24->fll[0]);
   1259	arizona_init_fll(arizona, 2, ARIZONA_FLL2_CONTROL_1 - 1,
   1260			 ARIZONA_IRQ_FLL2_LOCK, ARIZONA_IRQ_FLL2_CLOCK_OK,
   1261			 &cs47l24->fll[1]);
   1262
   1263	/* SR2 fixed at 8kHz, SR3 fixed at 16kHz */
   1264	regmap_update_bits(arizona->regmap, ARIZONA_SAMPLE_RATE_2,
   1265			   ARIZONA_SAMPLE_RATE_2_MASK, 0x11);
   1266	regmap_update_bits(arizona->regmap, ARIZONA_SAMPLE_RATE_3,
   1267			   ARIZONA_SAMPLE_RATE_3_MASK, 0x12);
   1268
   1269	for (i = 0; i < ARRAY_SIZE(cs47l24_dai); i++)
   1270		arizona_init_dai(&cs47l24->core, i);
   1271
   1272	/* Latch volume update bits */
   1273	for (i = 0; i < ARRAY_SIZE(cs47l24_digital_vu); i++)
   1274		regmap_update_bits(arizona->regmap, cs47l24_digital_vu[i],
   1275				   CS47L24_DIG_VU, CS47L24_DIG_VU);
   1276
   1277	pm_runtime_enable(&pdev->dev);
   1278	pm_runtime_idle(&pdev->dev);
   1279
   1280	ret = arizona_request_irq(arizona, ARIZONA_IRQ_DSP_IRQ1,
   1281				  "ADSP2 Compressed IRQ", cs47l24_adsp2_irq,
   1282				  cs47l24);
   1283	if (ret != 0) {
   1284		dev_err(&pdev->dev, "Failed to request DSP IRQ: %d\n", ret);
   1285		return ret;
   1286	}
   1287
   1288	ret = arizona_set_irq_wake(arizona, ARIZONA_IRQ_DSP_IRQ1, 1);
   1289	if (ret != 0)
   1290		dev_warn(&pdev->dev,
   1291			 "Failed to set compressed IRQ as a wake source: %d\n",
   1292			 ret);
   1293
   1294	arizona_init_common(arizona);
   1295
   1296	ret = arizona_init_vol_limit(arizona);
   1297	if (ret < 0)
   1298		goto err_dsp_irq;
   1299	ret = arizona_init_spk_irqs(arizona);
   1300	if (ret < 0)
   1301		goto err_dsp_irq;
   1302
   1303	ret = devm_snd_soc_register_component(&pdev->dev,
   1304					      &soc_component_dev_cs47l24,
   1305					      cs47l24_dai,
   1306					      ARRAY_SIZE(cs47l24_dai));
   1307	if (ret < 0) {
   1308		dev_err(&pdev->dev, "Failed to register component: %d\n", ret);
   1309		goto err_spk_irqs;
   1310	}
   1311
   1312	return ret;
   1313
   1314err_spk_irqs:
   1315	arizona_free_spk_irqs(arizona);
   1316err_dsp_irq:
   1317	arizona_set_irq_wake(arizona, ARIZONA_IRQ_DSP_IRQ1, 0);
   1318	arizona_free_irq(arizona, ARIZONA_IRQ_DSP_IRQ1, cs47l24);
   1319
   1320	return ret;
   1321}
   1322
   1323static int cs47l24_remove(struct platform_device *pdev)
   1324{
   1325	struct cs47l24_priv *cs47l24 = platform_get_drvdata(pdev);
   1326	struct arizona *arizona = cs47l24->core.arizona;
   1327
   1328	pm_runtime_disable(&pdev->dev);
   1329
   1330	wm_adsp2_remove(&cs47l24->core.adsp[1]);
   1331	wm_adsp2_remove(&cs47l24->core.adsp[2]);
   1332
   1333	arizona_free_spk_irqs(arizona);
   1334
   1335	arizona_set_irq_wake(arizona, ARIZONA_IRQ_DSP_IRQ1, 0);
   1336	arizona_free_irq(arizona, ARIZONA_IRQ_DSP_IRQ1, cs47l24);
   1337
   1338	return 0;
   1339}
   1340
   1341static struct platform_driver cs47l24_codec_driver = {
   1342	.driver = {
   1343		.name = "cs47l24-codec",
   1344	},
   1345	.probe = cs47l24_probe,
   1346	.remove = cs47l24_remove,
   1347};
   1348
   1349module_platform_driver(cs47l24_codec_driver);
   1350
   1351MODULE_DESCRIPTION("ASoC CS47L24 driver");
   1352MODULE_AUTHOR("Richard Fitzgerald <rf@opensource.wolfsonmicro.com>");
   1353MODULE_LICENSE("GPL v2");
   1354MODULE_ALIAS("platform:cs47l24-codec");