brintos

brintos / linux-shallow public Read only

0
0
Text · 58.5 KiB · 85555c7 Raw
1782 lines · c
1// SPDX-License-Identifier: GPL-2.0-only2//3// ALSA SoC Audio driver for CS47L35 codec4//5// Copyright (C) 2015-2019 Cirrus Logic, Inc. and6//                         Cirrus Logic International Semiconductor Ltd.7//8 9#include <linux/delay.h>10#include <linux/device.h>11#include <linux/init.h>12#include <linux/module.h>13#include <linux/moduleparam.h>14#include <linux/pm.h>15#include <linux/pm_runtime.h>16#include <linux/regmap.h>17#include <sound/core.h>18#include <sound/pcm.h>19#include <sound/pcm_params.h>20#include <sound/soc.h>21#include <sound/tlv.h>22 23#include <linux/irqchip/irq-madera.h>24#include <linux/mfd/madera/core.h>25#include <linux/mfd/madera/registers.h>26 27#include "madera.h"28#include "wm_adsp.h"29 30#define CS47L35_NUM_ADSP	331#define CS47L35_MONO_OUTPUTS	132 33#define DRV_NAME "cs47l35-codec"34 35struct cs47l35 {36	struct madera_priv core;37	struct madera_fll fll;38};39 40static const struct cs_dsp_region cs47l35_dsp1_regions[] = {41	{ .type = WMFW_ADSP2_PM, .base = 0x080000 },42	{ .type = WMFW_ADSP2_ZM, .base = 0x0e0000 },43	{ .type = WMFW_ADSP2_XM, .base = 0x0a0000 },44	{ .type = WMFW_ADSP2_YM, .base = 0x0c0000 },45};46 47static const struct cs_dsp_region cs47l35_dsp2_regions[] = {48	{ .type = WMFW_ADSP2_PM, .base = 0x100000 },49	{ .type = WMFW_ADSP2_ZM, .base = 0x160000 },50	{ .type = WMFW_ADSP2_XM, .base = 0x120000 },51	{ .type = WMFW_ADSP2_YM, .base = 0x140000 },52};53 54static const struct cs_dsp_region cs47l35_dsp3_regions[] = {55	{ .type = WMFW_ADSP2_PM, .base = 0x180000 },56	{ .type = WMFW_ADSP2_ZM, .base = 0x1e0000 },57	{ .type = WMFW_ADSP2_XM, .base = 0x1a0000 },58	{ .type = WMFW_ADSP2_YM, .base = 0x1c0000 },59};60 61static const struct cs_dsp_region *cs47l35_dsp_regions[] = {62	cs47l35_dsp1_regions,63	cs47l35_dsp2_regions,64	cs47l35_dsp3_regions,65};66 67static const int wm_adsp2_control_bases[] = {68	MADERA_DSP1_CONFIG_1,69	MADERA_DSP2_CONFIG_1,70	MADERA_DSP3_CONFIG_1,71};72 73static const char * const cs47l35_outdemux_texts[] = {74	"HPOUT",75	"EPOUT",76};77 78static SOC_ENUM_SINGLE_DECL(cs47l35_outdemux_enum, SND_SOC_NOPM, 0,79			    cs47l35_outdemux_texts);80 81static const struct snd_kcontrol_new cs47l35_outdemux =82	SOC_DAPM_ENUM_EXT("HPOUT1 Demux", cs47l35_outdemux_enum,83			  madera_out1_demux_get, madera_out1_demux_put);84 85static int cs47l35_adsp_power_ev(struct snd_soc_dapm_widget *w,86				 struct snd_kcontrol *kcontrol,87				 int event)88{89	struct snd_soc_component *component =90		snd_soc_dapm_to_component(w->dapm);91	struct cs47l35 *cs47l35 = snd_soc_component_get_drvdata(component);92	struct madera_priv *priv = &cs47l35->core;93	struct madera *madera = priv->madera;94	unsigned int freq;95	int ret;96 97	ret = regmap_read(madera->regmap, MADERA_DSP_CLOCK_1, &freq);98	if (ret != 0) {99		dev_err(madera->dev,100			"Failed to read MADERA_DSP_CLOCK_1: %d\n", ret);101		return ret;102	}103 104	freq &= MADERA_DSP_CLK_FREQ_LEGACY_MASK;105	freq >>= MADERA_DSP_CLK_FREQ_LEGACY_SHIFT;106 107	switch (event) {108	case SND_SOC_DAPM_PRE_PMU:109		ret = madera_set_adsp_clk(&cs47l35->core, w->shift, freq);110		if (ret)111			return ret;112		break;113	default:114		break;115	}116 117	return wm_adsp_early_event(w, kcontrol, event);118}119 120#define CS47L35_NG_SRC(name, base) \121	SOC_SINGLE(name " NG HPOUT1L Switch",  base,  0, 1, 0), \122	SOC_SINGLE(name " NG HPOUT1R Switch",  base,  1, 1, 0), \123	SOC_SINGLE(name " NG SPKOUT Switch",  base,  6, 1, 0), \124	SOC_SINGLE(name " NG SPKDAT1L Switch", base,  8, 1, 0), \125	SOC_SINGLE(name " NG SPKDAT1R Switch", base,  9, 1, 0)126 127static void cs47l35_hp_post_enable(struct snd_soc_dapm_widget *w)128{129	struct snd_soc_component *component =130		snd_soc_dapm_to_component(w->dapm);131	unsigned int val;132 133	switch (w->shift) {134	case MADERA_OUT1L_ENA_SHIFT:135	case MADERA_OUT1R_ENA_SHIFT:136		val = snd_soc_component_read(component, MADERA_OUTPUT_ENABLES_1);137		val &= (MADERA_OUT1L_ENA | MADERA_OUT1R_ENA);138 139		if (val != (MADERA_OUT1L_ENA | MADERA_OUT1R_ENA))140			break;141 142		snd_soc_component_update_bits(component,143					      MADERA_EDRE_HP_STEREO_CONTROL,144					      0x0001, 1);145		break;146	default:147		break;148	}149}150 151static void cs47l35_hp_post_disable(struct snd_soc_dapm_widget *w)152{153	struct snd_soc_component *component =154		snd_soc_dapm_to_component(w->dapm);155 156	switch (w->shift) {157	case MADERA_OUT1L_ENA_SHIFT:158		snd_soc_component_write(component, MADERA_DCS_HP1L_CONTROL,159					0x2006);160		break;161	case MADERA_OUT1R_ENA_SHIFT:162		snd_soc_component_write(component, MADERA_DCS_HP1R_CONTROL,163					0x2006);164		break;165	default:166		return;167	}168 169	/* Only get to here for OUT1L and OUT1R */170	snd_soc_component_update_bits(component,171				      MADERA_EDRE_HP_STEREO_CONTROL,172				      0x0001, 0);173}174 175static int cs47l35_hp_ev(struct snd_soc_dapm_widget *w,176			 struct snd_kcontrol *kcontrol, int event)177{178	int ret;179 180	switch (event) {181	case SND_SOC_DAPM_PRE_PMU:182	case SND_SOC_DAPM_PRE_PMD:183		return madera_hp_ev(w, kcontrol, event);184	case SND_SOC_DAPM_POST_PMU:185		ret = madera_hp_ev(w, kcontrol, event);186		if (ret < 0)187			return ret;188 189		cs47l35_hp_post_enable(w);190		return 0;191	case SND_SOC_DAPM_POST_PMD:192		ret = madera_hp_ev(w, kcontrol, event);193		cs47l35_hp_post_disable(w);194		return ret;195	default:196		return -EINVAL;197	}198}199 200static const struct snd_kcontrol_new cs47l35_snd_controls[] = {201SOC_ENUM("IN1 OSR", madera_in_dmic_osr[0]),202SOC_ENUM("IN2 OSR", madera_in_dmic_osr[1]),203 204SOC_SINGLE_RANGE_TLV("IN1L Volume", MADERA_IN1L_CONTROL,205		     MADERA_IN1L_PGA_VOL_SHIFT, 0x40, 0x5f, 0, madera_ana_tlv),206SOC_SINGLE_RANGE_TLV("IN1R Volume", MADERA_IN1R_CONTROL,207		     MADERA_IN1R_PGA_VOL_SHIFT, 0x40, 0x5f, 0, madera_ana_tlv),208SOC_SINGLE_RANGE_TLV("IN2L Volume", MADERA_IN2L_CONTROL,209		     MADERA_IN2L_PGA_VOL_SHIFT, 0x40, 0x5f, 0, madera_ana_tlv),210SOC_SINGLE_RANGE_TLV("IN2R Volume", MADERA_IN2R_CONTROL,211		     MADERA_IN2R_PGA_VOL_SHIFT, 0x40, 0x5f, 0, madera_ana_tlv),212 213SOC_ENUM("IN HPF Cutoff Frequency", madera_in_hpf_cut_enum),214 215SOC_SINGLE("IN1L HPF Switch", MADERA_IN1L_CONTROL,216	   MADERA_IN1L_HPF_SHIFT, 1, 0),217SOC_SINGLE("IN1R HPF Switch", MADERA_IN1R_CONTROL,218	   MADERA_IN1R_HPF_SHIFT, 1, 0),219SOC_SINGLE("IN2L HPF Switch", MADERA_IN2L_CONTROL,220	   MADERA_IN2L_HPF_SHIFT, 1, 0),221SOC_SINGLE("IN2R HPF Switch", MADERA_IN2R_CONTROL,222	   MADERA_IN2R_HPF_SHIFT, 1, 0),223 224SOC_SINGLE_TLV("IN1L Digital Volume", MADERA_ADC_DIGITAL_VOLUME_1L,225	       MADERA_IN1L_DIG_VOL_SHIFT, 0xbf, 0, madera_digital_tlv),226SOC_SINGLE_TLV("IN1R Digital Volume", MADERA_ADC_DIGITAL_VOLUME_1R,227	       MADERA_IN1R_DIG_VOL_SHIFT, 0xbf, 0, madera_digital_tlv),228SOC_SINGLE_TLV("IN2L Digital Volume", MADERA_ADC_DIGITAL_VOLUME_2L,229	       MADERA_IN2L_DIG_VOL_SHIFT, 0xbf, 0, madera_digital_tlv),230SOC_SINGLE_TLV("IN2R Digital Volume", MADERA_ADC_DIGITAL_VOLUME_2R,231	       MADERA_IN2R_DIG_VOL_SHIFT, 0xbf, 0, madera_digital_tlv),232 233SOC_ENUM("Input Ramp Up", madera_in_vi_ramp),234SOC_ENUM("Input Ramp Down", madera_in_vd_ramp),235 236MADERA_MIXER_CONTROLS("EQ1", MADERA_EQ1MIX_INPUT_1_SOURCE),237MADERA_MIXER_CONTROLS("EQ2", MADERA_EQ2MIX_INPUT_1_SOURCE),238MADERA_MIXER_CONTROLS("EQ3", MADERA_EQ3MIX_INPUT_1_SOURCE),239MADERA_MIXER_CONTROLS("EQ4", MADERA_EQ4MIX_INPUT_1_SOURCE),240 241MADERA_EQ_CONTROL("EQ1 Coefficients", MADERA_EQ1_2),242SOC_SINGLE_TLV("EQ1 B1 Volume", MADERA_EQ1_1, MADERA_EQ1_B1_GAIN_SHIFT,243	       24, 0, madera_eq_tlv),244SOC_SINGLE_TLV("EQ1 B2 Volume", MADERA_EQ1_1, MADERA_EQ1_B2_GAIN_SHIFT,245	       24, 0, madera_eq_tlv),246SOC_SINGLE_TLV("EQ1 B3 Volume", MADERA_EQ1_1, MADERA_EQ1_B3_GAIN_SHIFT,247	       24, 0, madera_eq_tlv),248SOC_SINGLE_TLV("EQ1 B4 Volume", MADERA_EQ1_2, MADERA_EQ1_B4_GAIN_SHIFT,249	       24, 0, madera_eq_tlv),250SOC_SINGLE_TLV("EQ1 B5 Volume", MADERA_EQ1_2, MADERA_EQ1_B5_GAIN_SHIFT,251	       24, 0, madera_eq_tlv),252 253MADERA_EQ_CONTROL("EQ2 Coefficients", MADERA_EQ2_2),254SOC_SINGLE_TLV("EQ2 B1 Volume", MADERA_EQ2_1, MADERA_EQ2_B1_GAIN_SHIFT,255	       24, 0, madera_eq_tlv),256SOC_SINGLE_TLV("EQ2 B2 Volume", MADERA_EQ2_1, MADERA_EQ2_B2_GAIN_SHIFT,257	       24, 0, madera_eq_tlv),258SOC_SINGLE_TLV("EQ2 B3 Volume", MADERA_EQ2_1, MADERA_EQ2_B3_GAIN_SHIFT,259	       24, 0, madera_eq_tlv),260SOC_SINGLE_TLV("EQ2 B4 Volume", MADERA_EQ2_2, MADERA_EQ2_B4_GAIN_SHIFT,261	       24, 0, madera_eq_tlv),262SOC_SINGLE_TLV("EQ2 B5 Volume", MADERA_EQ2_2, MADERA_EQ2_B5_GAIN_SHIFT,263	       24, 0, madera_eq_tlv),264 265MADERA_EQ_CONTROL("EQ3 Coefficients", MADERA_EQ3_2),266SOC_SINGLE_TLV("EQ3 B1 Volume", MADERA_EQ3_1, MADERA_EQ3_B1_GAIN_SHIFT,267	       24, 0, madera_eq_tlv),268SOC_SINGLE_TLV("EQ3 B2 Volume", MADERA_EQ3_1, MADERA_EQ3_B2_GAIN_SHIFT,269	       24, 0, madera_eq_tlv),270SOC_SINGLE_TLV("EQ3 B3 Volume", MADERA_EQ3_1, MADERA_EQ3_B3_GAIN_SHIFT,271	       24, 0, madera_eq_tlv),272SOC_SINGLE_TLV("EQ3 B4 Volume", MADERA_EQ3_2, MADERA_EQ3_B4_GAIN_SHIFT,273	       24, 0, madera_eq_tlv),274SOC_SINGLE_TLV("EQ3 B5 Volume", MADERA_EQ3_2, MADERA_EQ3_B5_GAIN_SHIFT,275	       24, 0, madera_eq_tlv),276 277MADERA_EQ_CONTROL("EQ4 Coefficients", MADERA_EQ4_2),278SOC_SINGLE_TLV("EQ4 B1 Volume", MADERA_EQ4_1, MADERA_EQ4_B1_GAIN_SHIFT,279	       24, 0, madera_eq_tlv),280SOC_SINGLE_TLV("EQ4 B2 Volume", MADERA_EQ4_1, MADERA_EQ4_B2_GAIN_SHIFT,281	       24, 0, madera_eq_tlv),282SOC_SINGLE_TLV("EQ4 B3 Volume", MADERA_EQ4_1, MADERA_EQ4_B3_GAIN_SHIFT,283	       24, 0, madera_eq_tlv),284SOC_SINGLE_TLV("EQ4 B4 Volume", MADERA_EQ4_2, MADERA_EQ4_B4_GAIN_SHIFT,285	       24, 0, madera_eq_tlv),286SOC_SINGLE_TLV("EQ4 B5 Volume", MADERA_EQ4_2, MADERA_EQ4_B5_GAIN_SHIFT,287	       24, 0, madera_eq_tlv),288 289MADERA_MIXER_CONTROLS("DRC1L", MADERA_DRC1LMIX_INPUT_1_SOURCE),290MADERA_MIXER_CONTROLS("DRC1R", MADERA_DRC1RMIX_INPUT_1_SOURCE),291MADERA_MIXER_CONTROLS("DRC2L", MADERA_DRC2LMIX_INPUT_1_SOURCE),292MADERA_MIXER_CONTROLS("DRC2R", MADERA_DRC2RMIX_INPUT_1_SOURCE),293 294SND_SOC_BYTES_MASK("DRC1", MADERA_DRC1_CTRL1, 5,295		   MADERA_DRC1R_ENA | MADERA_DRC1L_ENA),296SND_SOC_BYTES_MASK("DRC2", MADERA_DRC2_CTRL1, 5,297		   MADERA_DRC2R_ENA | MADERA_DRC2L_ENA),298 299MADERA_MIXER_CONTROLS("LHPF1", MADERA_HPLP1MIX_INPUT_1_SOURCE),300MADERA_MIXER_CONTROLS("LHPF2", MADERA_HPLP2MIX_INPUT_1_SOURCE),301MADERA_MIXER_CONTROLS("LHPF3", MADERA_HPLP3MIX_INPUT_1_SOURCE),302MADERA_MIXER_CONTROLS("LHPF4", MADERA_HPLP4MIX_INPUT_1_SOURCE),303 304MADERA_LHPF_CONTROL("LHPF1 Coefficients", MADERA_HPLPF1_2),305MADERA_LHPF_CONTROL("LHPF2 Coefficients", MADERA_HPLPF2_2),306MADERA_LHPF_CONTROL("LHPF3 Coefficients", MADERA_HPLPF3_2),307MADERA_LHPF_CONTROL("LHPF4 Coefficients", MADERA_HPLPF4_2),308 309SOC_ENUM("LHPF1 Mode", madera_lhpf1_mode),310SOC_ENUM("LHPF2 Mode", madera_lhpf2_mode),311SOC_ENUM("LHPF3 Mode", madera_lhpf3_mode),312SOC_ENUM("LHPF4 Mode", madera_lhpf4_mode),313 314MADERA_RATE_ENUM("ISRC1 FSL", madera_isrc_fsl[0]),315MADERA_RATE_ENUM("ISRC2 FSL", madera_isrc_fsl[1]),316MADERA_RATE_ENUM("ISRC1 FSH", madera_isrc_fsh[0]),317MADERA_RATE_ENUM("ISRC2 FSH", madera_isrc_fsh[1]),318 319WM_ADSP2_PRELOAD_SWITCH("DSP1", 1),320WM_ADSP2_PRELOAD_SWITCH("DSP2", 2),321WM_ADSP2_PRELOAD_SWITCH("DSP3", 3),322 323MADERA_MIXER_CONTROLS("DSP1L", MADERA_DSP1LMIX_INPUT_1_SOURCE),324MADERA_MIXER_CONTROLS("DSP1R", MADERA_DSP1RMIX_INPUT_1_SOURCE),325MADERA_MIXER_CONTROLS("DSP2L", MADERA_DSP2LMIX_INPUT_1_SOURCE),326MADERA_MIXER_CONTROLS("DSP2R", MADERA_DSP2RMIX_INPUT_1_SOURCE),327MADERA_MIXER_CONTROLS("DSP3L", MADERA_DSP3LMIX_INPUT_1_SOURCE),328MADERA_MIXER_CONTROLS("DSP3R", MADERA_DSP3RMIX_INPUT_1_SOURCE),329 330SOC_SINGLE_TLV("Noise Generator Volume", MADERA_COMFORT_NOISE_GENERATOR,331	       MADERA_NOISE_GEN_GAIN_SHIFT, 0x16, 0, madera_noise_tlv),332 333MADERA_MIXER_CONTROLS("HPOUT1L", MADERA_OUT1LMIX_INPUT_1_SOURCE),334MADERA_MIXER_CONTROLS("HPOUT1R", MADERA_OUT1RMIX_INPUT_1_SOURCE),335MADERA_MIXER_CONTROLS("SPKOUT", MADERA_OUT4LMIX_INPUT_1_SOURCE),336MADERA_MIXER_CONTROLS("SPKDAT1L", MADERA_OUT5LMIX_INPUT_1_SOURCE),337MADERA_MIXER_CONTROLS("SPKDAT1R", MADERA_OUT5RMIX_INPUT_1_SOURCE),338 339SOC_SINGLE("HPOUT1 SC Protect Switch", MADERA_HP1_SHORT_CIRCUIT_CTRL,340	   MADERA_HP1_SC_ENA_SHIFT, 1, 0),341 342SOC_SINGLE("SPKDAT1 High Performance Switch", MADERA_OUTPUT_PATH_CONFIG_5L,343	   MADERA_OUT5_OSR_SHIFT, 1, 0),344 345SOC_DOUBLE_R("HPOUT1 Digital Switch", MADERA_DAC_DIGITAL_VOLUME_1L,346	     MADERA_DAC_DIGITAL_VOLUME_1R, MADERA_OUT1L_MUTE_SHIFT, 1, 1),347SOC_SINGLE("Speaker Digital Switch", MADERA_DAC_DIGITAL_VOLUME_4L,348	   MADERA_OUT4L_MUTE_SHIFT, 1, 1),349SOC_DOUBLE_R("SPKDAT1 Digital Switch", MADERA_DAC_DIGITAL_VOLUME_5L,350	     MADERA_DAC_DIGITAL_VOLUME_5R, MADERA_OUT5L_MUTE_SHIFT, 1, 1),351 352SOC_DOUBLE_R_TLV("HPOUT1 Digital Volume", MADERA_DAC_DIGITAL_VOLUME_1L,353		 MADERA_DAC_DIGITAL_VOLUME_1R, MADERA_OUT1L_VOL_SHIFT,354		 0xbf, 0, madera_digital_tlv),355SOC_SINGLE_TLV("Speaker Digital Volume", MADERA_DAC_DIGITAL_VOLUME_4L,356	       MADERA_OUT4L_VOL_SHIFT, 0xbf, 0, madera_digital_tlv),357SOC_DOUBLE_R_TLV("SPKDAT1 Digital Volume", MADERA_DAC_DIGITAL_VOLUME_5L,358		 MADERA_DAC_DIGITAL_VOLUME_5R, MADERA_OUT5L_VOL_SHIFT,359		 0xbf, 0, madera_digital_tlv),360 361SOC_DOUBLE("SPKDAT1 Switch", MADERA_PDM_SPK1_CTRL_1, MADERA_SPK1L_MUTE_SHIFT,362	   MADERA_SPK1R_MUTE_SHIFT, 1, 1),363 364SOC_ENUM("Output Ramp Up", madera_out_vi_ramp),365SOC_ENUM("Output Ramp Down", madera_out_vd_ramp),366 367SOC_SINGLE("Noise Gate Switch", MADERA_NOISE_GATE_CONTROL,368	   MADERA_NGATE_ENA_SHIFT, 1, 0),369SOC_SINGLE_TLV("Noise Gate Threshold Volume", MADERA_NOISE_GATE_CONTROL,370	       MADERA_NGATE_THR_SHIFT, 7, 1, madera_ng_tlv),371SOC_ENUM("Noise Gate Hold", madera_ng_hold),372 373CS47L35_NG_SRC("HPOUT1L", MADERA_NOISE_GATE_SELECT_1L),374CS47L35_NG_SRC("HPOUT1R", MADERA_NOISE_GATE_SELECT_1R),375CS47L35_NG_SRC("SPKOUT", MADERA_NOISE_GATE_SELECT_4L),376CS47L35_NG_SRC("SPKDAT1L", MADERA_NOISE_GATE_SELECT_5L),377CS47L35_NG_SRC("SPKDAT1R", MADERA_NOISE_GATE_SELECT_5R),378 379MADERA_MIXER_CONTROLS("AIF1TX1", MADERA_AIF1TX1MIX_INPUT_1_SOURCE),380MADERA_MIXER_CONTROLS("AIF1TX2", MADERA_AIF1TX2MIX_INPUT_1_SOURCE),381MADERA_MIXER_CONTROLS("AIF1TX3", MADERA_AIF1TX3MIX_INPUT_1_SOURCE),382MADERA_MIXER_CONTROLS("AIF1TX4", MADERA_AIF1TX4MIX_INPUT_1_SOURCE),383MADERA_MIXER_CONTROLS("AIF1TX5", MADERA_AIF1TX5MIX_INPUT_1_SOURCE),384MADERA_MIXER_CONTROLS("AIF1TX6", MADERA_AIF1TX6MIX_INPUT_1_SOURCE),385 386MADERA_MIXER_CONTROLS("AIF2TX1", MADERA_AIF2TX1MIX_INPUT_1_SOURCE),387MADERA_MIXER_CONTROLS("AIF2TX2", MADERA_AIF2TX2MIX_INPUT_1_SOURCE),388 389MADERA_MIXER_CONTROLS("AIF3TX1", MADERA_AIF3TX1MIX_INPUT_1_SOURCE),390MADERA_MIXER_CONTROLS("AIF3TX2", MADERA_AIF3TX2MIX_INPUT_1_SOURCE),391 392MADERA_MIXER_CONTROLS("SLIMTX1", MADERA_SLIMTX1MIX_INPUT_1_SOURCE),393MADERA_MIXER_CONTROLS("SLIMTX2", MADERA_SLIMTX2MIX_INPUT_1_SOURCE),394MADERA_MIXER_CONTROLS("SLIMTX3", MADERA_SLIMTX3MIX_INPUT_1_SOURCE),395MADERA_MIXER_CONTROLS("SLIMTX4", MADERA_SLIMTX4MIX_INPUT_1_SOURCE),396MADERA_MIXER_CONTROLS("SLIMTX5", MADERA_SLIMTX5MIX_INPUT_1_SOURCE),397MADERA_MIXER_CONTROLS("SLIMTX6", MADERA_SLIMTX6MIX_INPUT_1_SOURCE),398 399MADERA_GAINMUX_CONTROLS("SPDIF1TX1", MADERA_SPDIF1TX1MIX_INPUT_1_SOURCE),400MADERA_GAINMUX_CONTROLS("SPDIF1TX2", MADERA_SPDIF1TX2MIX_INPUT_1_SOURCE),401 402WM_ADSP_FW_CONTROL("DSP1", 0),403WM_ADSP_FW_CONTROL("DSP2", 1),404WM_ADSP_FW_CONTROL("DSP3", 2),405};406 407MADERA_MIXER_ENUMS(EQ1, MADERA_EQ1MIX_INPUT_1_SOURCE);408MADERA_MIXER_ENUMS(EQ2, MADERA_EQ2MIX_INPUT_1_SOURCE);409MADERA_MIXER_ENUMS(EQ3, MADERA_EQ3MIX_INPUT_1_SOURCE);410MADERA_MIXER_ENUMS(EQ4, MADERA_EQ4MIX_INPUT_1_SOURCE);411 412MADERA_MIXER_ENUMS(DRC1L, MADERA_DRC1LMIX_INPUT_1_SOURCE);413MADERA_MIXER_ENUMS(DRC1R, MADERA_DRC1RMIX_INPUT_1_SOURCE);414MADERA_MIXER_ENUMS(DRC2L, MADERA_DRC2LMIX_INPUT_1_SOURCE);415MADERA_MIXER_ENUMS(DRC2R, MADERA_DRC2RMIX_INPUT_1_SOURCE);416 417MADERA_MIXER_ENUMS(LHPF1, MADERA_HPLP1MIX_INPUT_1_SOURCE);418MADERA_MIXER_ENUMS(LHPF2, MADERA_HPLP2MIX_INPUT_1_SOURCE);419MADERA_MIXER_ENUMS(LHPF3, MADERA_HPLP3MIX_INPUT_1_SOURCE);420MADERA_MIXER_ENUMS(LHPF4, MADERA_HPLP4MIX_INPUT_1_SOURCE);421 422MADERA_MIXER_ENUMS(DSP1L, MADERA_DSP1LMIX_INPUT_1_SOURCE);423MADERA_MIXER_ENUMS(DSP1R, MADERA_DSP1RMIX_INPUT_1_SOURCE);424MADERA_DSP_AUX_ENUMS(DSP1, MADERA_DSP1AUX1MIX_INPUT_1_SOURCE);425 426MADERA_MIXER_ENUMS(DSP2L, MADERA_DSP2LMIX_INPUT_1_SOURCE);427MADERA_MIXER_ENUMS(DSP2R, MADERA_DSP2RMIX_INPUT_1_SOURCE);428MADERA_DSP_AUX_ENUMS(DSP2, MADERA_DSP2AUX1MIX_INPUT_1_SOURCE);429 430MADERA_MIXER_ENUMS(DSP3L, MADERA_DSP3LMIX_INPUT_1_SOURCE);431MADERA_MIXER_ENUMS(DSP3R, MADERA_DSP3RMIX_INPUT_1_SOURCE);432MADERA_DSP_AUX_ENUMS(DSP3, MADERA_DSP3AUX1MIX_INPUT_1_SOURCE);433 434MADERA_MIXER_ENUMS(PWM1, MADERA_PWM1MIX_INPUT_1_SOURCE);435MADERA_MIXER_ENUMS(PWM2, MADERA_PWM2MIX_INPUT_1_SOURCE);436 437MADERA_MIXER_ENUMS(OUT1L, MADERA_OUT1LMIX_INPUT_1_SOURCE);438MADERA_MIXER_ENUMS(OUT1R, MADERA_OUT1RMIX_INPUT_1_SOURCE);439MADERA_MIXER_ENUMS(SPKOUT, MADERA_OUT4LMIX_INPUT_1_SOURCE);440MADERA_MIXER_ENUMS(SPKDAT1L, MADERA_OUT5LMIX_INPUT_1_SOURCE);441MADERA_MIXER_ENUMS(SPKDAT1R, MADERA_OUT5RMIX_INPUT_1_SOURCE);442 443MADERA_MIXER_ENUMS(AIF1TX1, MADERA_AIF1TX1MIX_INPUT_1_SOURCE);444MADERA_MIXER_ENUMS(AIF1TX2, MADERA_AIF1TX2MIX_INPUT_1_SOURCE);445MADERA_MIXER_ENUMS(AIF1TX3, MADERA_AIF1TX3MIX_INPUT_1_SOURCE);446MADERA_MIXER_ENUMS(AIF1TX4, MADERA_AIF1TX4MIX_INPUT_1_SOURCE);447MADERA_MIXER_ENUMS(AIF1TX5, MADERA_AIF1TX5MIX_INPUT_1_SOURCE);448MADERA_MIXER_ENUMS(AIF1TX6, MADERA_AIF1TX6MIX_INPUT_1_SOURCE);449 450MADERA_MIXER_ENUMS(AIF2TX1, MADERA_AIF2TX1MIX_INPUT_1_SOURCE);451MADERA_MIXER_ENUMS(AIF2TX2, MADERA_AIF2TX2MIX_INPUT_1_SOURCE);452 453MADERA_MIXER_ENUMS(AIF3TX1, MADERA_AIF3TX1MIX_INPUT_1_SOURCE);454MADERA_MIXER_ENUMS(AIF3TX2, MADERA_AIF3TX2MIX_INPUT_1_SOURCE);455 456MADERA_MIXER_ENUMS(SLIMTX1, MADERA_SLIMTX1MIX_INPUT_1_SOURCE);457MADERA_MIXER_ENUMS(SLIMTX2, MADERA_SLIMTX2MIX_INPUT_1_SOURCE);458MADERA_MIXER_ENUMS(SLIMTX3, MADERA_SLIMTX3MIX_INPUT_1_SOURCE);459MADERA_MIXER_ENUMS(SLIMTX4, MADERA_SLIMTX4MIX_INPUT_1_SOURCE);460MADERA_MIXER_ENUMS(SLIMTX5, MADERA_SLIMTX5MIX_INPUT_1_SOURCE);461MADERA_MIXER_ENUMS(SLIMTX6, MADERA_SLIMTX6MIX_INPUT_1_SOURCE);462 463MADERA_MUX_ENUMS(SPD1TX1, MADERA_SPDIF1TX1MIX_INPUT_1_SOURCE);464MADERA_MUX_ENUMS(SPD1TX2, MADERA_SPDIF1TX2MIX_INPUT_1_SOURCE);465 466MADERA_MUX_ENUMS(ISRC1INT1, MADERA_ISRC1INT1MIX_INPUT_1_SOURCE);467MADERA_MUX_ENUMS(ISRC1INT2, MADERA_ISRC1INT2MIX_INPUT_1_SOURCE);468MADERA_MUX_ENUMS(ISRC1INT3, MADERA_ISRC1INT3MIX_INPUT_1_SOURCE);469MADERA_MUX_ENUMS(ISRC1INT4, MADERA_ISRC1INT4MIX_INPUT_1_SOURCE);470 471MADERA_MUX_ENUMS(ISRC1DEC1, MADERA_ISRC1DEC1MIX_INPUT_1_SOURCE);472MADERA_MUX_ENUMS(ISRC1DEC2, MADERA_ISRC1DEC2MIX_INPUT_1_SOURCE);473MADERA_MUX_ENUMS(ISRC1DEC3, MADERA_ISRC1DEC3MIX_INPUT_1_SOURCE);474MADERA_MUX_ENUMS(ISRC1DEC4, MADERA_ISRC1DEC4MIX_INPUT_1_SOURCE);475 476MADERA_MUX_ENUMS(ISRC2INT1, MADERA_ISRC2INT1MIX_INPUT_1_SOURCE);477MADERA_MUX_ENUMS(ISRC2INT2, MADERA_ISRC2INT2MIX_INPUT_1_SOURCE);478MADERA_MUX_ENUMS(ISRC2INT3, MADERA_ISRC2INT3MIX_INPUT_1_SOURCE);479MADERA_MUX_ENUMS(ISRC2INT4, MADERA_ISRC2INT4MIX_INPUT_1_SOURCE);480 481MADERA_MUX_ENUMS(ISRC2DEC1, MADERA_ISRC2DEC1MIX_INPUT_1_SOURCE);482MADERA_MUX_ENUMS(ISRC2DEC2, MADERA_ISRC2DEC2MIX_INPUT_1_SOURCE);483MADERA_MUX_ENUMS(ISRC2DEC3, MADERA_ISRC2DEC3MIX_INPUT_1_SOURCE);484MADERA_MUX_ENUMS(ISRC2DEC4, MADERA_ISRC2DEC4MIX_INPUT_1_SOURCE);485 486static const char * const cs47l35_aec_loopback_texts[] = {487	"HPOUT1L", "HPOUT1R", "SPKOUT", "SPKDAT1L", "SPKDAT1R",488};489 490static const unsigned int cs47l35_aec_loopback_values[] = {491	0, 1, 6, 8, 9,492};493 494static const struct soc_enum cs47l35_aec1_loopback =495	SOC_VALUE_ENUM_SINGLE(MADERA_DAC_AEC_CONTROL_1,496			      MADERA_AEC1_LOOPBACK_SRC_SHIFT, 0xf,497			      ARRAY_SIZE(cs47l35_aec_loopback_texts),498			      cs47l35_aec_loopback_texts,499			      cs47l35_aec_loopback_values);500 501static const struct soc_enum cs47l35_aec2_loopback =502	SOC_VALUE_ENUM_SINGLE(MADERA_DAC_AEC_CONTROL_2,503			      MADERA_AEC2_LOOPBACK_SRC_SHIFT, 0xf,504			      ARRAY_SIZE(cs47l35_aec_loopback_texts),505			      cs47l35_aec_loopback_texts,506			      cs47l35_aec_loopback_values);507 508static const struct snd_kcontrol_new cs47l35_aec_loopback_mux[] = {509	SOC_DAPM_ENUM("AEC1 Loopback", cs47l35_aec1_loopback),510	SOC_DAPM_ENUM("AEC2 Loopback", cs47l35_aec2_loopback),511};512 513static const struct snd_soc_dapm_widget cs47l35_dapm_widgets[] = {514SND_SOC_DAPM_SUPPLY("SYSCLK", MADERA_SYSTEM_CLOCK_1, MADERA_SYSCLK_ENA_SHIFT,515		    0, madera_sysclk_ev,516		    SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |517		    SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),518SND_SOC_DAPM_SUPPLY("OPCLK", MADERA_OUTPUT_SYSTEM_CLOCK,519		    MADERA_OPCLK_ENA_SHIFT, 0, NULL, 0),520SND_SOC_DAPM_SUPPLY("DSPCLK", MADERA_DSP_CLOCK_1, MADERA_DSP_CLK_ENA_SHIFT,521		    0, madera_clk_ev,522		    SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),523 524SND_SOC_DAPM_REGULATOR_SUPPLY("DBVDD2", 0, 0),525SND_SOC_DAPM_REGULATOR_SUPPLY("CPVDD1", 20, 0),526SND_SOC_DAPM_REGULATOR_SUPPLY("CPVDD2", 20, 0),527SND_SOC_DAPM_REGULATOR_SUPPLY("MICVDD", 0, SND_SOC_DAPM_REGULATOR_BYPASS),528SND_SOC_DAPM_REGULATOR_SUPPLY("SPKVDD", 0, 0),529 530SND_SOC_DAPM_SUPPLY("MICBIAS1", MADERA_MIC_BIAS_CTRL_1,531		    MADERA_MICB1_ENA_SHIFT, 0, NULL, 0),532SND_SOC_DAPM_SUPPLY("MICBIAS2", MADERA_MIC_BIAS_CTRL_2,533		    MADERA_MICB1_ENA_SHIFT, 0, NULL, 0),534 535SND_SOC_DAPM_SUPPLY("MICBIAS1A", MADERA_MIC_BIAS_CTRL_5,536		    MADERA_MICB1A_ENA_SHIFT, 0, NULL, 0),537SND_SOC_DAPM_SUPPLY("MICBIAS1B", MADERA_MIC_BIAS_CTRL_5,538		    MADERA_MICB1B_ENA_SHIFT, 0, NULL, 0),539SND_SOC_DAPM_SUPPLY("MICBIAS2A", MADERA_MIC_BIAS_CTRL_6,540		    MADERA_MICB2A_ENA_SHIFT, 0, NULL, 0),541SND_SOC_DAPM_SUPPLY("MICBIAS2B", MADERA_MIC_BIAS_CTRL_6,542		    MADERA_MICB2B_ENA_SHIFT, 0, NULL, 0),543 544SND_SOC_DAPM_SUPPLY("FXCLK", SND_SOC_NOPM,545		    MADERA_DOM_GRP_FX, 0,546		    madera_domain_clk_ev,547		    SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),548SND_SOC_DAPM_SUPPLY("ISRC1CLK", SND_SOC_NOPM,549		    MADERA_DOM_GRP_ISRC1, 0,550		    madera_domain_clk_ev,551		    SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),552SND_SOC_DAPM_SUPPLY("ISRC2CLK", SND_SOC_NOPM,553		    MADERA_DOM_GRP_ISRC2, 0,554		    madera_domain_clk_ev,555		    SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),556SND_SOC_DAPM_SUPPLY("OUTCLK", SND_SOC_NOPM,557		    MADERA_DOM_GRP_OUT, 0,558		    madera_domain_clk_ev,559		    SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),560SND_SOC_DAPM_SUPPLY("SPDCLK", SND_SOC_NOPM,561		    MADERA_DOM_GRP_SPD, 0,562		    madera_domain_clk_ev,563		    SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),564SND_SOC_DAPM_SUPPLY("DSP1CLK", SND_SOC_NOPM,565		    MADERA_DOM_GRP_DSP1, 0,566		    madera_domain_clk_ev,567		    SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),568SND_SOC_DAPM_SUPPLY("DSP2CLK", SND_SOC_NOPM,569		    MADERA_DOM_GRP_DSP2, 0,570		    madera_domain_clk_ev,571		    SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),572SND_SOC_DAPM_SUPPLY("DSP3CLK", SND_SOC_NOPM,573		    MADERA_DOM_GRP_DSP3, 0,574		    madera_domain_clk_ev,575		    SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),576SND_SOC_DAPM_SUPPLY("AIF1TXCLK", SND_SOC_NOPM,577		    MADERA_DOM_GRP_AIF1, 0,578		    madera_domain_clk_ev,579		    SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),580SND_SOC_DAPM_SUPPLY("AIF2TXCLK", SND_SOC_NOPM,581		    MADERA_DOM_GRP_AIF2, 0,582		    madera_domain_clk_ev,583		    SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),584SND_SOC_DAPM_SUPPLY("AIF3TXCLK", SND_SOC_NOPM,585		    MADERA_DOM_GRP_AIF3, 0,586		    madera_domain_clk_ev,587		    SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),588SND_SOC_DAPM_SUPPLY("SLIMBUSCLK", SND_SOC_NOPM,589		    MADERA_DOM_GRP_SLIMBUS, 0,590		    madera_domain_clk_ev,591		    SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),592SND_SOC_DAPM_SUPPLY("PWMCLK", SND_SOC_NOPM,593		    MADERA_DOM_GRP_PWM, 0,594		    madera_domain_clk_ev,595		    SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),596 597SND_SOC_DAPM_SIGGEN("TONE"),598SND_SOC_DAPM_SIGGEN("NOISE"),599 600SND_SOC_DAPM_INPUT("IN1ALN"),601SND_SOC_DAPM_INPUT("IN1ALP"),602SND_SOC_DAPM_INPUT("IN1BLN"),603SND_SOC_DAPM_INPUT("IN1BLP"),604SND_SOC_DAPM_INPUT("IN1ARN"),605SND_SOC_DAPM_INPUT("IN1ARP"),606SND_SOC_DAPM_INPUT("IN1BRN"),607SND_SOC_DAPM_INPUT("IN1BRP"),608SND_SOC_DAPM_INPUT("IN2LN"),609SND_SOC_DAPM_INPUT("IN2LP"),610SND_SOC_DAPM_INPUT("IN2RN"),611SND_SOC_DAPM_INPUT("IN2RP"),612 613SND_SOC_DAPM_MUX("IN1L Analog Mux", SND_SOC_NOPM, 0, 0, &madera_inmux[0]),614SND_SOC_DAPM_MUX("IN1R Analog Mux", SND_SOC_NOPM, 0, 0, &madera_inmux[1]),615 616SND_SOC_DAPM_MUX("IN1L Mode", SND_SOC_NOPM, 0, 0, &madera_inmode[0]),617SND_SOC_DAPM_MUX("IN1R Mode", SND_SOC_NOPM, 0, 0, &madera_inmode[0]),618 619SND_SOC_DAPM_MUX("IN2L Mode", SND_SOC_NOPM, 0, 0, &madera_inmode[1]),620SND_SOC_DAPM_MUX("IN2R Mode", SND_SOC_NOPM, 0, 0, &madera_inmode[1]),621 622SND_SOC_DAPM_OUTPUT("DRC1 Signal Activity"),623SND_SOC_DAPM_OUTPUT("DRC2 Signal Activity"),624 625SND_SOC_DAPM_OUTPUT("DSP Trigger Out"),626 627SND_SOC_DAPM_DEMUX("HPOUT1 Demux", SND_SOC_NOPM, 0, 0, &cs47l35_outdemux),628SND_SOC_DAPM_MUX("HPOUT1 Mono Mux", SND_SOC_NOPM, 0, 0, &cs47l35_outdemux),629 630SND_SOC_DAPM_PGA("PWM1 Driver", MADERA_PWM_DRIVE_1, MADERA_PWM1_ENA_SHIFT,631		 0, NULL, 0),632SND_SOC_DAPM_PGA("PWM2 Driver", MADERA_PWM_DRIVE_1, MADERA_PWM2_ENA_SHIFT,633		 0, NULL, 0),634 635SND_SOC_DAPM_AIF_OUT("AIF1TX1", NULL, 0,636		     MADERA_AIF1_TX_ENABLES, MADERA_AIF1TX1_ENA_SHIFT, 0),637SND_SOC_DAPM_AIF_OUT("AIF1TX2", NULL, 1,638		     MADERA_AIF1_TX_ENABLES, MADERA_AIF1TX2_ENA_SHIFT, 0),639SND_SOC_DAPM_AIF_OUT("AIF1TX3", NULL, 2,640		     MADERA_AIF1_TX_ENABLES, MADERA_AIF1TX3_ENA_SHIFT, 0),641SND_SOC_DAPM_AIF_OUT("AIF1TX4", NULL, 3,642		     MADERA_AIF1_TX_ENABLES, MADERA_AIF1TX4_ENA_SHIFT, 0),643SND_SOC_DAPM_AIF_OUT("AIF1TX5", NULL, 4,644		     MADERA_AIF1_TX_ENABLES, MADERA_AIF1TX5_ENA_SHIFT, 0),645SND_SOC_DAPM_AIF_OUT("AIF1TX6", NULL, 5,646		     MADERA_AIF1_TX_ENABLES, MADERA_AIF1TX6_ENA_SHIFT, 0),647 648SND_SOC_DAPM_AIF_OUT("AIF2TX1", NULL, 0,649		     MADERA_AIF2_TX_ENABLES, MADERA_AIF2TX1_ENA_SHIFT, 0),650SND_SOC_DAPM_AIF_OUT("AIF2TX2", NULL, 1,651		     MADERA_AIF2_TX_ENABLES, MADERA_AIF2TX2_ENA_SHIFT, 0),652 653SND_SOC_DAPM_AIF_OUT("AIF3TX1", NULL, 0,654		     MADERA_AIF3_TX_ENABLES, MADERA_AIF3TX1_ENA_SHIFT, 0),655SND_SOC_DAPM_AIF_OUT("AIF3TX2", NULL, 1,656		     MADERA_AIF3_TX_ENABLES, MADERA_AIF3TX2_ENA_SHIFT, 0),657 658SND_SOC_DAPM_AIF_OUT("SLIMTX1", NULL, 0,659		     MADERA_SLIMBUS_TX_CHANNEL_ENABLE,660		     MADERA_SLIMTX1_ENA_SHIFT, 0),661SND_SOC_DAPM_AIF_OUT("SLIMTX2", NULL, 1,662		     MADERA_SLIMBUS_TX_CHANNEL_ENABLE,663		     MADERA_SLIMTX2_ENA_SHIFT, 0),664SND_SOC_DAPM_AIF_OUT("SLIMTX3", NULL, 2,665		     MADERA_SLIMBUS_TX_CHANNEL_ENABLE,666		     MADERA_SLIMTX3_ENA_SHIFT, 0),667SND_SOC_DAPM_AIF_OUT("SLIMTX4", NULL, 3,668		     MADERA_SLIMBUS_TX_CHANNEL_ENABLE,669		     MADERA_SLIMTX4_ENA_SHIFT, 0),670SND_SOC_DAPM_AIF_OUT("SLIMTX5", NULL, 4,671		     MADERA_SLIMBUS_TX_CHANNEL_ENABLE,672		     MADERA_SLIMTX5_ENA_SHIFT, 0),673SND_SOC_DAPM_AIF_OUT("SLIMTX6", NULL, 5,674		     MADERA_SLIMBUS_TX_CHANNEL_ENABLE,675		     MADERA_SLIMTX6_ENA_SHIFT, 0),676 677SND_SOC_DAPM_PGA_E("OUT1L", SND_SOC_NOPM,678		   MADERA_OUT1L_ENA_SHIFT, 0, NULL, 0, cs47l35_hp_ev,679		   SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD |680		   SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU),681SND_SOC_DAPM_PGA_E("OUT1R", SND_SOC_NOPM,682		   MADERA_OUT1R_ENA_SHIFT, 0, NULL, 0, cs47l35_hp_ev,683		   SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD |684		   SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU),685SND_SOC_DAPM_PGA_E("OUT4L", SND_SOC_NOPM,686		   MADERA_OUT4L_ENA_SHIFT, 0, NULL, 0, madera_spk_ev,687		   SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD),688SND_SOC_DAPM_PGA_E("OUT5L", MADERA_OUTPUT_ENABLES_1,689		   MADERA_OUT5L_ENA_SHIFT, 0, NULL, 0, madera_out_ev,690		   SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU),691SND_SOC_DAPM_PGA_E("OUT5R", MADERA_OUTPUT_ENABLES_1,692		   MADERA_OUT5R_ENA_SHIFT, 0, NULL, 0, madera_out_ev,693		   SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU),694 695SND_SOC_DAPM_PGA("SPD1TX1", MADERA_SPD1_TX_CONTROL,696		 MADERA_SPD1_VAL1_SHIFT, 0, NULL, 0),697SND_SOC_DAPM_PGA("SPD1TX2", MADERA_SPD1_TX_CONTROL,698		 MADERA_SPD1_VAL2_SHIFT, 0, NULL, 0),699SND_SOC_DAPM_OUT_DRV("SPD1", MADERA_SPD1_TX_CONTROL,700		     MADERA_SPD1_ENA_SHIFT, 0, NULL, 0),701 702/*703 * Input mux widgets arranged in order of sources in MADERA_MIXER_INPUT_ROUTES704 * to take advantage of cache lookup in DAPM705 */706SND_SOC_DAPM_PGA("Noise Generator", MADERA_COMFORT_NOISE_GENERATOR,707		 MADERA_NOISE_GEN_ENA_SHIFT, 0, NULL, 0),708 709SND_SOC_DAPM_PGA("Tone Generator 1", MADERA_TONE_GENERATOR_1,710		 MADERA_TONE1_ENA_SHIFT, 0, NULL, 0),711SND_SOC_DAPM_PGA("Tone Generator 2", MADERA_TONE_GENERATOR_1,712		 MADERA_TONE2_ENA_SHIFT, 0, NULL, 0),713 714SND_SOC_DAPM_SIGGEN("HAPTICS"),715 716SND_SOC_DAPM_MUX("AEC1 Loopback", MADERA_DAC_AEC_CONTROL_1,717		 MADERA_AEC1_LOOPBACK_ENA_SHIFT, 0,718		 &cs47l35_aec_loopback_mux[0]),719 720SND_SOC_DAPM_MUX("AEC2 Loopback", MADERA_DAC_AEC_CONTROL_2,721		 MADERA_AEC2_LOOPBACK_ENA_SHIFT, 0,722		 &cs47l35_aec_loopback_mux[1]),723 724SND_SOC_DAPM_PGA_E("IN1L", MADERA_INPUT_ENABLES, MADERA_IN1L_ENA_SHIFT,725		   0, NULL, 0, madera_in_ev,726		   SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD |727		   SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU),728SND_SOC_DAPM_PGA_E("IN1R", MADERA_INPUT_ENABLES, MADERA_IN1R_ENA_SHIFT,729		   0, NULL, 0, madera_in_ev,730		   SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD |731		   SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU),732 733SND_SOC_DAPM_PGA_E("IN2L", MADERA_INPUT_ENABLES, MADERA_IN2L_ENA_SHIFT,734		   0, NULL, 0, madera_in_ev,735		   SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD |736		   SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU),737SND_SOC_DAPM_PGA_E("IN2R", MADERA_INPUT_ENABLES, MADERA_IN2R_ENA_SHIFT,738		   0, NULL, 0, madera_in_ev,739		   SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD |740		   SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU),741 742SND_SOC_DAPM_AIF_IN("AIF1RX1", NULL, 0,743		    MADERA_AIF1_RX_ENABLES, MADERA_AIF1RX1_ENA_SHIFT, 0),744SND_SOC_DAPM_AIF_IN("AIF1RX2", NULL, 1,745		    MADERA_AIF1_RX_ENABLES, MADERA_AIF1RX2_ENA_SHIFT, 0),746SND_SOC_DAPM_AIF_IN("AIF1RX3", NULL, 2,747		    MADERA_AIF1_RX_ENABLES, MADERA_AIF1RX3_ENA_SHIFT, 0),748SND_SOC_DAPM_AIF_IN("AIF1RX4", NULL, 3,749		    MADERA_AIF1_RX_ENABLES, MADERA_AIF1RX4_ENA_SHIFT, 0),750SND_SOC_DAPM_AIF_IN("AIF1RX5", NULL, 4,751		    MADERA_AIF1_RX_ENABLES, MADERA_AIF1RX5_ENA_SHIFT, 0),752SND_SOC_DAPM_AIF_IN("AIF1RX6", NULL, 5,753		    MADERA_AIF1_RX_ENABLES, MADERA_AIF1RX6_ENA_SHIFT, 0),754 755SND_SOC_DAPM_AIF_IN("AIF2RX1", NULL, 0,756		    MADERA_AIF2_RX_ENABLES, MADERA_AIF2RX1_ENA_SHIFT, 0),757SND_SOC_DAPM_AIF_IN("AIF2RX2", NULL, 1,758		    MADERA_AIF2_RX_ENABLES, MADERA_AIF2RX2_ENA_SHIFT, 0),759 760SND_SOC_DAPM_AIF_IN("AIF3RX1", NULL, 0,761		    MADERA_AIF3_RX_ENABLES, MADERA_AIF3RX1_ENA_SHIFT, 0),762SND_SOC_DAPM_AIF_IN("AIF3RX2", NULL, 1,763		    MADERA_AIF3_RX_ENABLES, MADERA_AIF3RX2_ENA_SHIFT, 0),764 765SND_SOC_DAPM_AIF_IN("SLIMRX1", NULL, 0,766		    MADERA_SLIMBUS_RX_CHANNEL_ENABLE,767		    MADERA_SLIMRX1_ENA_SHIFT, 0),768SND_SOC_DAPM_AIF_IN("SLIMRX2", NULL, 1,769		    MADERA_SLIMBUS_RX_CHANNEL_ENABLE,770		    MADERA_SLIMRX2_ENA_SHIFT, 0),771SND_SOC_DAPM_AIF_IN("SLIMRX3", NULL, 2,772		    MADERA_SLIMBUS_RX_CHANNEL_ENABLE,773		    MADERA_SLIMRX3_ENA_SHIFT, 0),774SND_SOC_DAPM_AIF_IN("SLIMRX4", NULL, 3,775		    MADERA_SLIMBUS_RX_CHANNEL_ENABLE,776		    MADERA_SLIMRX4_ENA_SHIFT, 0),777SND_SOC_DAPM_AIF_IN("SLIMRX5", NULL, 4,778		    MADERA_SLIMBUS_RX_CHANNEL_ENABLE,779		    MADERA_SLIMRX5_ENA_SHIFT, 0),780SND_SOC_DAPM_AIF_IN("SLIMRX6", NULL, 5,781		    MADERA_SLIMBUS_RX_CHANNEL_ENABLE,782		    MADERA_SLIMRX6_ENA_SHIFT, 0),783 784SND_SOC_DAPM_PGA("EQ1", MADERA_EQ1_1, MADERA_EQ1_ENA_SHIFT, 0, NULL, 0),785SND_SOC_DAPM_PGA("EQ2", MADERA_EQ2_1, MADERA_EQ2_ENA_SHIFT, 0, NULL, 0),786SND_SOC_DAPM_PGA("EQ3", MADERA_EQ3_1, MADERA_EQ3_ENA_SHIFT, 0, NULL, 0),787SND_SOC_DAPM_PGA("EQ4", MADERA_EQ4_1, MADERA_EQ4_ENA_SHIFT, 0, NULL, 0),788 789SND_SOC_DAPM_PGA("DRC1L", MADERA_DRC1_CTRL1, MADERA_DRC1L_ENA_SHIFT, 0,790		 NULL, 0),791SND_SOC_DAPM_PGA("DRC1R", MADERA_DRC1_CTRL1, MADERA_DRC1R_ENA_SHIFT, 0,792		 NULL, 0),793SND_SOC_DAPM_PGA("DRC2L", MADERA_DRC2_CTRL1, MADERA_DRC2L_ENA_SHIFT, 0,794		 NULL, 0),795SND_SOC_DAPM_PGA("DRC2R", MADERA_DRC2_CTRL1, MADERA_DRC2R_ENA_SHIFT, 0,796		 NULL, 0),797 798SND_SOC_DAPM_PGA("LHPF1", MADERA_HPLPF1_1, MADERA_LHPF1_ENA_SHIFT, 0,799		 NULL, 0),800SND_SOC_DAPM_PGA("LHPF2", MADERA_HPLPF2_1, MADERA_LHPF2_ENA_SHIFT, 0,801		 NULL, 0),802SND_SOC_DAPM_PGA("LHPF3", MADERA_HPLPF3_1, MADERA_LHPF3_ENA_SHIFT, 0,803		 NULL, 0),804SND_SOC_DAPM_PGA("LHPF4", MADERA_HPLPF4_1, MADERA_LHPF4_ENA_SHIFT, 0,805		 NULL, 0),806 807SND_SOC_DAPM_PGA("ISRC1DEC1", MADERA_ISRC_1_CTRL_3,808		 MADERA_ISRC1_DEC1_ENA_SHIFT, 0, NULL, 0),809SND_SOC_DAPM_PGA("ISRC1DEC2", MADERA_ISRC_1_CTRL_3,810		 MADERA_ISRC1_DEC2_ENA_SHIFT, 0, NULL, 0),811SND_SOC_DAPM_PGA("ISRC1DEC3", MADERA_ISRC_1_CTRL_3,812		 MADERA_ISRC1_DEC3_ENA_SHIFT, 0, NULL, 0),813SND_SOC_DAPM_PGA("ISRC1DEC4", MADERA_ISRC_1_CTRL_3,814		 MADERA_ISRC1_DEC4_ENA_SHIFT, 0, NULL, 0),815 816SND_SOC_DAPM_PGA("ISRC1INT1", MADERA_ISRC_1_CTRL_3,817		 MADERA_ISRC1_INT1_ENA_SHIFT, 0, NULL, 0),818SND_SOC_DAPM_PGA("ISRC1INT2", MADERA_ISRC_1_CTRL_3,819		 MADERA_ISRC1_INT2_ENA_SHIFT, 0, NULL, 0),820SND_SOC_DAPM_PGA("ISRC1INT3", MADERA_ISRC_1_CTRL_3,821		 MADERA_ISRC1_INT3_ENA_SHIFT, 0, NULL, 0),822SND_SOC_DAPM_PGA("ISRC1INT4", MADERA_ISRC_1_CTRL_3,823		 MADERA_ISRC1_INT4_ENA_SHIFT, 0, NULL, 0),824 825SND_SOC_DAPM_PGA("ISRC2DEC1", MADERA_ISRC_2_CTRL_3,826		 MADERA_ISRC2_DEC1_ENA_SHIFT, 0, NULL, 0),827SND_SOC_DAPM_PGA("ISRC2DEC2", MADERA_ISRC_2_CTRL_3,828		 MADERA_ISRC2_DEC2_ENA_SHIFT, 0, NULL, 0),829SND_SOC_DAPM_PGA("ISRC2DEC3", MADERA_ISRC_2_CTRL_3,830		 MADERA_ISRC2_DEC3_ENA_SHIFT, 0, NULL, 0),831SND_SOC_DAPM_PGA("ISRC2DEC4", MADERA_ISRC_2_CTRL_3,832		 MADERA_ISRC2_DEC4_ENA_SHIFT, 0, NULL, 0),833 834SND_SOC_DAPM_PGA("ISRC2INT1", MADERA_ISRC_2_CTRL_3,835		 MADERA_ISRC2_INT1_ENA_SHIFT, 0, NULL, 0),836SND_SOC_DAPM_PGA("ISRC2INT2", MADERA_ISRC_2_CTRL_3,837		 MADERA_ISRC2_INT2_ENA_SHIFT, 0, NULL, 0),838SND_SOC_DAPM_PGA("ISRC2INT3", MADERA_ISRC_2_CTRL_3,839		 MADERA_ISRC2_INT3_ENA_SHIFT, 0, NULL, 0),840SND_SOC_DAPM_PGA("ISRC2INT4", MADERA_ISRC_2_CTRL_3,841		 MADERA_ISRC2_INT4_ENA_SHIFT, 0, NULL, 0),842 843WM_ADSP2("DSP1", 0, cs47l35_adsp_power_ev),844WM_ADSP2("DSP2", 1, cs47l35_adsp_power_ev),845WM_ADSP2("DSP3", 2, cs47l35_adsp_power_ev),846 847/* End of ordered input mux widgets */848 849MADERA_MIXER_WIDGETS(EQ1, "EQ1"),850MADERA_MIXER_WIDGETS(EQ2, "EQ2"),851MADERA_MIXER_WIDGETS(EQ3, "EQ3"),852MADERA_MIXER_WIDGETS(EQ4, "EQ4"),853 854MADERA_MIXER_WIDGETS(DRC1L, "DRC1L"),855MADERA_MIXER_WIDGETS(DRC1R, "DRC1R"),856MADERA_MIXER_WIDGETS(DRC2L, "DRC2L"),857MADERA_MIXER_WIDGETS(DRC2R, "DRC2R"),858 859SND_SOC_DAPM_SWITCH("DRC1 Activity Output", SND_SOC_NOPM, 0, 0,860		    &madera_drc_activity_output_mux[0]),861SND_SOC_DAPM_SWITCH("DRC2 Activity Output", SND_SOC_NOPM, 0, 0,862		    &madera_drc_activity_output_mux[1]),863 864MADERA_MIXER_WIDGETS(LHPF1, "LHPF1"),865MADERA_MIXER_WIDGETS(LHPF2, "LHPF2"),866MADERA_MIXER_WIDGETS(LHPF3, "LHPF3"),867MADERA_MIXER_WIDGETS(LHPF4, "LHPF4"),868 869MADERA_MIXER_WIDGETS(PWM1, "PWM1"),870MADERA_MIXER_WIDGETS(PWM2, "PWM2"),871 872MADERA_MIXER_WIDGETS(OUT1L, "HPOUT1L"),873MADERA_MIXER_WIDGETS(OUT1R, "HPOUT1R"),874MADERA_MIXER_WIDGETS(SPKOUT, "SPKOUT"),875MADERA_MIXER_WIDGETS(SPKDAT1L, "SPKDAT1L"),876MADERA_MIXER_WIDGETS(SPKDAT1R, "SPKDAT1R"),877 878MADERA_MIXER_WIDGETS(AIF1TX1, "AIF1TX1"),879MADERA_MIXER_WIDGETS(AIF1TX2, "AIF1TX2"),880MADERA_MIXER_WIDGETS(AIF1TX3, "AIF1TX3"),881MADERA_MIXER_WIDGETS(AIF1TX4, "AIF1TX4"),882MADERA_MIXER_WIDGETS(AIF1TX5, "AIF1TX5"),883MADERA_MIXER_WIDGETS(AIF1TX6, "AIF1TX6"),884 885MADERA_MIXER_WIDGETS(AIF2TX1, "AIF2TX1"),886MADERA_MIXER_WIDGETS(AIF2TX2, "AIF2TX2"),887 888MADERA_MIXER_WIDGETS(AIF3TX1, "AIF3TX1"),889MADERA_MIXER_WIDGETS(AIF3TX2, "AIF3TX2"),890 891MADERA_MIXER_WIDGETS(SLIMTX1, "SLIMTX1"),892MADERA_MIXER_WIDGETS(SLIMTX2, "SLIMTX2"),893MADERA_MIXER_WIDGETS(SLIMTX3, "SLIMTX3"),894MADERA_MIXER_WIDGETS(SLIMTX4, "SLIMTX4"),895MADERA_MIXER_WIDGETS(SLIMTX5, "SLIMTX5"),896MADERA_MIXER_WIDGETS(SLIMTX6, "SLIMTX6"),897 898MADERA_MUX_WIDGETS(SPD1TX1, "SPDIF1TX1"),899MADERA_MUX_WIDGETS(SPD1TX2, "SPDIF1TX2"),900 901MADERA_DSP_WIDGETS(DSP1, "DSP1"),902MADERA_DSP_WIDGETS(DSP2, "DSP2"),903MADERA_DSP_WIDGETS(DSP3, "DSP3"),904 905SND_SOC_DAPM_SWITCH("DSP1 Trigger Output", SND_SOC_NOPM, 0, 0,906		    &madera_dsp_trigger_output_mux[0]),907SND_SOC_DAPM_SWITCH("DSP2 Trigger Output", SND_SOC_NOPM, 0, 0,908		    &madera_dsp_trigger_output_mux[1]),909SND_SOC_DAPM_SWITCH("DSP3 Trigger Output", SND_SOC_NOPM, 0, 0,910		    &madera_dsp_trigger_output_mux[2]),911 912MADERA_MUX_WIDGETS(ISRC1DEC1, "ISRC1DEC1"),913MADERA_MUX_WIDGETS(ISRC1DEC2, "ISRC1DEC2"),914MADERA_MUX_WIDGETS(ISRC1DEC3, "ISRC1DEC3"),915MADERA_MUX_WIDGETS(ISRC1DEC4, "ISRC1DEC4"),916 917MADERA_MUX_WIDGETS(ISRC1INT1, "ISRC1INT1"),918MADERA_MUX_WIDGETS(ISRC1INT2, "ISRC1INT2"),919MADERA_MUX_WIDGETS(ISRC1INT3, "ISRC1INT3"),920MADERA_MUX_WIDGETS(ISRC1INT4, "ISRC1INT4"),921 922MADERA_MUX_WIDGETS(ISRC2DEC1, "ISRC2DEC1"),923MADERA_MUX_WIDGETS(ISRC2DEC2, "ISRC2DEC2"),924MADERA_MUX_WIDGETS(ISRC2DEC3, "ISRC2DEC3"),925MADERA_MUX_WIDGETS(ISRC2DEC4, "ISRC2DEC4"),926 927MADERA_MUX_WIDGETS(ISRC2INT1, "ISRC2INT1"),928MADERA_MUX_WIDGETS(ISRC2INT2, "ISRC2INT2"),929MADERA_MUX_WIDGETS(ISRC2INT3, "ISRC2INT3"),930MADERA_MUX_WIDGETS(ISRC2INT4, "ISRC2INT4"),931 932SND_SOC_DAPM_OUTPUT("HPOUTL"),933SND_SOC_DAPM_OUTPUT("HPOUTR"),934SND_SOC_DAPM_OUTPUT("EPOUTP"),935SND_SOC_DAPM_OUTPUT("EPOUTN"),936SND_SOC_DAPM_OUTPUT("SPKOUTN"),937SND_SOC_DAPM_OUTPUT("SPKOUTP"),938SND_SOC_DAPM_OUTPUT("SPKDAT1L"),939SND_SOC_DAPM_OUTPUT("SPKDAT1R"),940SND_SOC_DAPM_OUTPUT("SPDIF1"),941 942SND_SOC_DAPM_OUTPUT("MICSUPP"),943};944 945#define MADERA_MIXER_INPUT_ROUTES(name)	\946	{ name, "Noise Generator", "Noise Generator" }, \947	{ name, "Tone Generator 1", "Tone Generator 1" }, \948	{ name, "Tone Generator 2", "Tone Generator 2" }, \949	{ name, "Haptics", "HAPTICS" }, \950	{ name, "AEC1", "AEC1 Loopback" }, \951	{ name, "AEC2", "AEC2 Loopback" }, \952	{ name, "IN1L", "IN1L" }, \953	{ name, "IN1R", "IN1R" }, \954	{ name, "IN2L", "IN2L" }, \955	{ name, "IN2R", "IN2R" }, \956	{ name, "AIF1RX1", "AIF1RX1" }, \957	{ name, "AIF1RX2", "AIF1RX2" }, \958	{ name, "AIF1RX3", "AIF1RX3" }, \959	{ name, "AIF1RX4", "AIF1RX4" }, \960	{ name, "AIF1RX5", "AIF1RX5" }, \961	{ name, "AIF1RX6", "AIF1RX6" }, \962	{ name, "AIF2RX1", "AIF2RX1" }, \963	{ name, "AIF2RX2", "AIF2RX2" }, \964	{ name, "AIF3RX1", "AIF3RX1" }, \965	{ name, "AIF3RX2", "AIF3RX2" }, \966	{ name, "SLIMRX1", "SLIMRX1" }, \967	{ name, "SLIMRX2", "SLIMRX2" }, \968	{ name, "SLIMRX3", "SLIMRX3" }, \969	{ name, "SLIMRX4", "SLIMRX4" }, \970	{ name, "SLIMRX5", "SLIMRX5" }, \971	{ name, "SLIMRX6", "SLIMRX6" }, \972	{ name, "EQ1", "EQ1" }, \973	{ name, "EQ2", "EQ2" }, \974	{ name, "EQ3", "EQ3" }, \975	{ name, "EQ4", "EQ4" }, \976	{ name, "DRC1L", "DRC1L" }, \977	{ name, "DRC1R", "DRC1R" }, \978	{ name, "DRC2L", "DRC2L" }, \979	{ name, "DRC2R", "DRC2R" }, \980	{ name, "LHPF1", "LHPF1" }, \981	{ name, "LHPF2", "LHPF2" }, \982	{ name, "LHPF3", "LHPF3" }, \983	{ name, "LHPF4", "LHPF4" }, \984	{ name, "ISRC1DEC1", "ISRC1DEC1" }, \985	{ name, "ISRC1DEC2", "ISRC1DEC2" }, \986	{ name, "ISRC1DEC3", "ISRC1DEC3" }, \987	{ name, "ISRC1DEC4", "ISRC1DEC4" }, \988	{ name, "ISRC1INT1", "ISRC1INT1" }, \989	{ name, "ISRC1INT2", "ISRC1INT2" }, \990	{ name, "ISRC1INT3", "ISRC1INT3" }, \991	{ name, "ISRC1INT4", "ISRC1INT4" }, \992	{ name, "ISRC2DEC1", "ISRC2DEC1" }, \993	{ name, "ISRC2DEC2", "ISRC2DEC2" }, \994	{ name, "ISRC2DEC3", "ISRC2DEC3" }, \995	{ name, "ISRC2DEC4", "ISRC2DEC4" }, \996	{ name, "ISRC2INT1", "ISRC2INT1" }, \997	{ name, "ISRC2INT2", "ISRC2INT2" }, \998	{ name, "ISRC2INT3", "ISRC2INT3" }, \999	{ name, "ISRC2INT4", "ISRC2INT4" }, \1000	{ name, "DSP1.1", "DSP1" }, \1001	{ name, "DSP1.2", "DSP1" }, \1002	{ name, "DSP1.3", "DSP1" }, \1003	{ name, "DSP1.4", "DSP1" }, \1004	{ name, "DSP1.5", "DSP1" }, \1005	{ name, "DSP1.6", "DSP1" }, \1006	{ name, "DSP2.1", "DSP2" }, \1007	{ name, "DSP2.2", "DSP2" }, \1008	{ name, "DSP2.3", "DSP2" }, \1009	{ name, "DSP2.4", "DSP2" }, \1010	{ name, "DSP2.5", "DSP2" }, \1011	{ name, "DSP2.6", "DSP2" }, \1012	{ name, "DSP3.1", "DSP3" }, \1013	{ name, "DSP3.2", "DSP3" }, \1014	{ name, "DSP3.3", "DSP3" }, \1015	{ name, "DSP3.4", "DSP3" }, \1016	{ name, "DSP3.5", "DSP3" }, \1017	{ name, "DSP3.6", "DSP3" }1018 1019static const struct snd_soc_dapm_route cs47l35_dapm_routes[] = {1020	/* Internal clock domains */1021	{ "EQ1", NULL, "FXCLK" },1022	{ "EQ2", NULL, "FXCLK" },1023	{ "EQ3", NULL, "FXCLK" },1024	{ "EQ4", NULL, "FXCLK" },1025	{ "DRC1L", NULL, "FXCLK" },1026	{ "DRC1R", NULL, "FXCLK" },1027	{ "DRC2L", NULL, "FXCLK" },1028	{ "DRC2R", NULL, "FXCLK" },1029	{ "LHPF1", NULL, "FXCLK" },1030	{ "LHPF2", NULL, "FXCLK" },1031	{ "LHPF3", NULL, "FXCLK" },1032	{ "LHPF4", NULL, "FXCLK" },1033	{ "PWM1 Mixer", NULL, "PWMCLK" },1034	{ "PWM2 Mixer", NULL, "PWMCLK" },1035	{ "OUT1L", NULL, "OUTCLK" },1036	{ "OUT1R", NULL, "OUTCLK" },1037	{ "OUT4L", NULL, "OUTCLK" },1038	{ "OUT5L", NULL, "OUTCLK" },1039	{ "OUT5R", NULL, "OUTCLK" },1040	{ "AIF1TX1", NULL, "AIF1TXCLK" },1041	{ "AIF1TX2", NULL, "AIF1TXCLK" },1042	{ "AIF1TX3", NULL, "AIF1TXCLK" },1043	{ "AIF1TX4", NULL, "AIF1TXCLK" },1044	{ "AIF1TX5", NULL, "AIF1TXCLK" },1045	{ "AIF1TX6", NULL, "AIF1TXCLK" },1046	{ "AIF2TX1", NULL, "AIF2TXCLK" },1047	{ "AIF2TX2", NULL, "AIF2TXCLK" },1048	{ "AIF3TX1", NULL, "AIF3TXCLK" },1049	{ "AIF3TX2", NULL, "AIF3TXCLK" },1050	{ "SLIMTX1", NULL, "SLIMBUSCLK" },1051	{ "SLIMTX2", NULL, "SLIMBUSCLK" },1052	{ "SLIMTX3", NULL, "SLIMBUSCLK" },1053	{ "SLIMTX4", NULL, "SLIMBUSCLK" },1054	{ "SLIMTX5", NULL, "SLIMBUSCLK" },1055	{ "SLIMTX6", NULL, "SLIMBUSCLK" },1056	{ "SPD1TX1", NULL, "SPDCLK" },1057	{ "SPD1TX2", NULL, "SPDCLK" },1058	{ "DSP1", NULL, "DSP1CLK" },1059	{ "DSP2", NULL, "DSP2CLK" },1060	{ "DSP3", NULL, "DSP3CLK" },1061	{ "ISRC1DEC1", NULL, "ISRC1CLK" },1062	{ "ISRC1DEC2", NULL, "ISRC1CLK" },1063	{ "ISRC1DEC3", NULL, "ISRC1CLK" },1064	{ "ISRC1DEC4", NULL, "ISRC1CLK" },1065	{ "ISRC1INT1", NULL, "ISRC1CLK" },1066	{ "ISRC1INT2", NULL, "ISRC1CLK" },1067	{ "ISRC1INT3", NULL, "ISRC1CLK" },1068	{ "ISRC1INT4", NULL, "ISRC1CLK" },1069	{ "ISRC2DEC1", NULL, "ISRC2CLK" },1070	{ "ISRC2DEC2", NULL, "ISRC2CLK" },1071	{ "ISRC2DEC3", NULL, "ISRC2CLK" },1072	{ "ISRC2DEC4", NULL, "ISRC2CLK" },1073	{ "ISRC2INT1", NULL, "ISRC2CLK" },1074	{ "ISRC2INT2", NULL, "ISRC2CLK" },1075	{ "ISRC2INT3", NULL, "ISRC2CLK" },1076	{ "ISRC2INT4", NULL, "ISRC2CLK" },1077 1078	{ "AIF2 Capture", NULL, "DBVDD2" },1079	{ "AIF2 Playback", NULL, "DBVDD2" },1080 1081	{ "AIF3 Capture", NULL, "DBVDD2" },1082	{ "AIF3 Playback", NULL, "DBVDD2" },1083 1084	{ "OUT1L", NULL, "CPVDD1" },1085	{ "OUT1R", NULL, "CPVDD1" },1086	{ "OUT1L", NULL, "CPVDD2" },1087	{ "OUT1R", NULL, "CPVDD2" },1088 1089	{ "OUT4L", NULL, "SPKVDD" },1090 1091	{ "OUT1L", NULL, "SYSCLK" },1092	{ "OUT1R", NULL, "SYSCLK" },1093	{ "OUT4L", NULL, "SYSCLK" },1094	{ "OUT5L", NULL, "SYSCLK" },1095	{ "OUT5R", NULL, "SYSCLK" },1096 1097	{ "SPD1", NULL, "SYSCLK" },1098	{ "SPD1", NULL, "SPD1TX1" },1099	{ "SPD1", NULL, "SPD1TX2" },1100 1101	{ "IN1L", NULL, "SYSCLK" },1102	{ "IN1R", NULL, "SYSCLK" },1103	{ "IN2L", NULL, "SYSCLK" },1104	{ "IN2R", NULL, "SYSCLK" },1105 1106	{ "MICBIAS1", NULL, "MICVDD" },1107	{ "MICBIAS2", NULL, "MICVDD" },1108 1109	{ "MICBIAS1A", NULL, "MICBIAS1" },1110	{ "MICBIAS1B", NULL, "MICBIAS1" },1111	{ "MICBIAS2A", NULL, "MICBIAS2" },1112	{ "MICBIAS2B", NULL, "MICBIAS2" },1113 1114	{ "Noise Generator", NULL, "SYSCLK" },1115	{ "Tone Generator 1", NULL, "SYSCLK" },1116	{ "Tone Generator 2", NULL, "SYSCLK" },1117 1118	{ "Noise Generator", NULL, "NOISE" },1119	{ "Tone Generator 1", NULL, "TONE" },1120	{ "Tone Generator 2", NULL, "TONE" },1121 1122	{ "AIF1 Capture", NULL, "AIF1TX1" },1123	{ "AIF1 Capture", NULL, "AIF1TX2" },1124	{ "AIF1 Capture", NULL, "AIF1TX3" },1125	{ "AIF1 Capture", NULL, "AIF1TX4" },1126	{ "AIF1 Capture", NULL, "AIF1TX5" },1127	{ "AIF1 Capture", NULL, "AIF1TX6" },1128 1129	{ "AIF1RX1", NULL, "AIF1 Playback" },1130	{ "AIF1RX2", NULL, "AIF1 Playback" },1131	{ "AIF1RX3", NULL, "AIF1 Playback" },1132	{ "AIF1RX4", NULL, "AIF1 Playback" },1133	{ "AIF1RX5", NULL, "AIF1 Playback" },1134	{ "AIF1RX6", NULL, "AIF1 Playback" },1135 1136	{ "AIF2 Capture", NULL, "AIF2TX1" },1137	{ "AIF2 Capture", NULL, "AIF2TX2" },1138 1139	{ "AIF2RX1", NULL, "AIF2 Playback" },1140	{ "AIF2RX2", NULL, "AIF2 Playback" },1141 1142	{ "AIF3 Capture", NULL, "AIF3TX1" },1143	{ "AIF3 Capture", NULL, "AIF3TX2" },1144 1145	{ "AIF3RX1", NULL, "AIF3 Playback" },1146	{ "AIF3RX2", NULL, "AIF3 Playback" },1147 1148	{ "Slim1 Capture", NULL, "SLIMTX1" },1149	{ "Slim1 Capture", NULL, "SLIMTX2" },1150	{ "Slim1 Capture", NULL, "SLIMTX3" },1151	{ "Slim1 Capture", NULL, "SLIMTX4" },1152 1153	{ "SLIMRX1", NULL, "Slim1 Playback" },1154	{ "SLIMRX2", NULL, "Slim1 Playback" },1155	{ "SLIMRX3", NULL, "Slim1 Playback" },1156	{ "SLIMRX4", NULL, "Slim1 Playback" },1157 1158	{ "Slim2 Capture", NULL, "SLIMTX5" },1159	{ "Slim2 Capture", NULL, "SLIMTX6" },1160 1161	{ "SLIMRX5", NULL, "Slim2 Playback" },1162	{ "SLIMRX6", NULL, "Slim2 Playback" },1163 1164	{ "AIF1 Playback", NULL, "SYSCLK" },1165	{ "AIF2 Playback", NULL, "SYSCLK" },1166	{ "AIF3 Playback", NULL, "SYSCLK" },1167	{ "Slim1 Playback", NULL, "SYSCLK" },1168	{ "Slim2 Playback", NULL, "SYSCLK" },1169 1170	{ "AIF1 Capture", NULL, "SYSCLK" },1171	{ "AIF2 Capture", NULL, "SYSCLK" },1172	{ "AIF3 Capture", NULL, "SYSCLK" },1173	{ "Slim1 Capture", NULL, "SYSCLK" },1174	{ "Slim2 Capture", NULL, "SYSCLK" },1175 1176	{ "Voice Control DSP", NULL, "DSP3" },1177 1178	{ "Audio Trace DSP", NULL, "DSP1" },1179 1180	{ "IN1L Analog Mux", "A", "IN1ALN" },1181	{ "IN1L Analog Mux", "A", "IN1ALP" },1182	{ "IN1L Analog Mux", "B", "IN1BLN" },1183	{ "IN1L Analog Mux", "B", "IN1BLP" },1184 1185	{ "IN1R Analog Mux", "A", "IN1ARN" },1186	{ "IN1R Analog Mux", "A", "IN1ARP" },1187	{ "IN1R Analog Mux", "B", "IN1BRN" },1188	{ "IN1R Analog Mux", "B", "IN1BRP" },1189 1190	{ "IN1L Mode", "Analog", "IN1L Analog Mux" },1191	{ "IN1R Mode", "Analog", "IN1R Analog Mux" },1192 1193	{ "IN1L Mode", "Digital", "IN1ALN" },1194	{ "IN1L Mode", "Digital", "IN1ARN" },1195	{ "IN1R Mode", "Digital", "IN1ALN" },1196	{ "IN1R Mode", "Digital", "IN1ARN" },1197 1198	{ "IN1L", NULL, "IN1L Mode" },1199	{ "IN1R", NULL, "IN1R Mode" },1200 1201	{ "IN2L Mode", "Analog", "IN2LN" },1202	{ "IN2L Mode", "Analog", "IN2LP" },1203	{ "IN2R Mode", "Analog", "IN2RN" },1204	{ "IN2R Mode", "Analog", "IN2RP" },1205 1206	{ "IN2L Mode", "Digital", "IN2LN" },1207	{ "IN2L Mode", "Digital", "IN2RN" },1208	{ "IN2R Mode", "Digital", "IN2LN" },1209	{ "IN2R Mode", "Digital", "IN2RN" },1210 1211	{ "IN2L", NULL, "IN2L Mode" },1212	{ "IN2R", NULL, "IN2R Mode" },1213 1214	MADERA_MIXER_ROUTES("OUT1L", "HPOUT1L"),1215	MADERA_MIXER_ROUTES("OUT1R", "HPOUT1R"),1216 1217	MADERA_MIXER_ROUTES("OUT4L", "SPKOUT"),1218 1219	MADERA_MIXER_ROUTES("OUT5L", "SPKDAT1L"),1220	MADERA_MIXER_ROUTES("OUT5R", "SPKDAT1R"),1221 1222	MADERA_MIXER_ROUTES("PWM1 Driver", "PWM1"),1223	MADERA_MIXER_ROUTES("PWM2 Driver", "PWM2"),1224 1225	MADERA_MIXER_ROUTES("AIF1TX1", "AIF1TX1"),1226	MADERA_MIXER_ROUTES("AIF1TX2", "AIF1TX2"),1227	MADERA_MIXER_ROUTES("AIF1TX3", "AIF1TX3"),1228	MADERA_MIXER_ROUTES("AIF1TX4", "AIF1TX4"),1229	MADERA_MIXER_ROUTES("AIF1TX5", "AIF1TX5"),1230	MADERA_MIXER_ROUTES("AIF1TX6", "AIF1TX6"),1231 1232	MADERA_MIXER_ROUTES("AIF2TX1", "AIF2TX1"),1233	MADERA_MIXER_ROUTES("AIF2TX2", "AIF2TX2"),1234 1235	MADERA_MIXER_ROUTES("AIF3TX1", "AIF3TX1"),1236	MADERA_MIXER_ROUTES("AIF3TX2", "AIF3TX2"),1237 1238	MADERA_MIXER_ROUTES("SLIMTX1", "SLIMTX1"),1239	MADERA_MIXER_ROUTES("SLIMTX2", "SLIMTX2"),1240	MADERA_MIXER_ROUTES("SLIMTX3", "SLIMTX3"),1241	MADERA_MIXER_ROUTES("SLIMTX4", "SLIMTX4"),1242	MADERA_MIXER_ROUTES("SLIMTX5", "SLIMTX5"),1243	MADERA_MIXER_ROUTES("SLIMTX6", "SLIMTX6"),1244 1245	MADERA_MUX_ROUTES("SPD1TX1", "SPDIF1TX1"),1246	MADERA_MUX_ROUTES("SPD1TX2", "SPDIF1TX2"),1247 1248	MADERA_MIXER_ROUTES("EQ1", "EQ1"),1249	MADERA_MIXER_ROUTES("EQ2", "EQ2"),1250	MADERA_MIXER_ROUTES("EQ3", "EQ3"),1251	MADERA_MIXER_ROUTES("EQ4", "EQ4"),1252 1253	MADERA_MIXER_ROUTES("DRC1L", "DRC1L"),1254	MADERA_MIXER_ROUTES("DRC1R", "DRC1R"),1255	MADERA_MIXER_ROUTES("DRC2L", "DRC2L"),1256	MADERA_MIXER_ROUTES("DRC2R", "DRC2R"),1257 1258	MADERA_MIXER_ROUTES("LHPF1", "LHPF1"),1259	MADERA_MIXER_ROUTES("LHPF2", "LHPF2"),1260	MADERA_MIXER_ROUTES("LHPF3", "LHPF3"),1261	MADERA_MIXER_ROUTES("LHPF4", "LHPF4"),1262 1263	MADERA_DSP_ROUTES("DSP1"),1264	MADERA_DSP_ROUTES("DSP2"),1265	MADERA_DSP_ROUTES("DSP3"),1266 1267	{ "DSP Trigger Out", NULL, "DSP1 Trigger Output" },1268	{ "DSP Trigger Out", NULL, "DSP2 Trigger Output" },1269	{ "DSP Trigger Out", NULL, "DSP3 Trigger Output" },1270 1271	{ "DSP1 Trigger Output", "Switch", "DSP1" },1272	{ "DSP2 Trigger Output", "Switch", "DSP2" },1273	{ "DSP3 Trigger Output", "Switch", "DSP3" },1274 1275	MADERA_MUX_ROUTES("ISRC1INT1", "ISRC1INT1"),1276	MADERA_MUX_ROUTES("ISRC1INT2", "ISRC1INT2"),1277	MADERA_MUX_ROUTES("ISRC1INT3", "ISRC1INT3"),1278	MADERA_MUX_ROUTES("ISRC1INT4", "ISRC1INT4"),1279 1280	MADERA_MUX_ROUTES("ISRC1DEC1", "ISRC1DEC1"),1281	MADERA_MUX_ROUTES("ISRC1DEC2", "ISRC1DEC2"),1282	MADERA_MUX_ROUTES("ISRC1DEC3", "ISRC1DEC3"),1283	MADERA_MUX_ROUTES("ISRC1DEC4", "ISRC1DEC4"),1284 1285	MADERA_MUX_ROUTES("ISRC2INT1", "ISRC2INT1"),1286	MADERA_MUX_ROUTES("ISRC2INT2", "ISRC2INT2"),1287	MADERA_MUX_ROUTES("ISRC2INT3", "ISRC2INT3"),1288	MADERA_MUX_ROUTES("ISRC2INT4", "ISRC2INT4"),1289 1290	MADERA_MUX_ROUTES("ISRC2DEC1", "ISRC2DEC1"),1291	MADERA_MUX_ROUTES("ISRC2DEC2", "ISRC2DEC2"),1292	MADERA_MUX_ROUTES("ISRC2DEC3", "ISRC2DEC3"),1293	MADERA_MUX_ROUTES("ISRC2DEC4", "ISRC2DEC4"),1294 1295	{ "AEC1 Loopback", "HPOUT1L", "OUT1L" },1296	{ "AEC1 Loopback", "HPOUT1R", "OUT1R" },1297	{ "AEC2 Loopback", "HPOUT1L", "OUT1L" },1298	{ "AEC2 Loopback", "HPOUT1R", "OUT1R" },1299	{ "HPOUT1 Demux", NULL, "OUT1L" },1300	{ "HPOUT1 Demux", NULL, "OUT1R" },1301 1302	{ "AEC1 Loopback", "SPKOUT", "OUT4L" },1303	{ "AEC2 Loopback", "SPKOUT", "OUT4L" },1304	{ "SPKOUTN", NULL, "OUT4L" },1305	{ "SPKOUTP", NULL, "OUT4L" },1306 1307	{ "OUT1R", NULL, "HPOUT1 Mono Mux" },1308	{ "HPOUT1 Mono Mux", "EPOUT", "OUT1L" },1309 1310	{ "HPOUTL", "HPOUT", "HPOUT1 Demux" },1311	{ "HPOUTR", "HPOUT", "HPOUT1 Demux" },1312	{ "EPOUTP", "EPOUT", "HPOUT1 Demux" },1313	{ "EPOUTN", "EPOUT", "HPOUT1 Demux" },1314 1315	{ "AEC1 Loopback", "SPKDAT1L", "OUT5L" },1316	{ "AEC1 Loopback", "SPKDAT1R", "OUT5R" },1317	{ "AEC2 Loopback", "SPKDAT1L", "OUT5L" },1318	{ "AEC2 Loopback", "SPKDAT1R", "OUT5R" },1319	{ "SPKDAT1L", NULL, "OUT5L" },1320	{ "SPKDAT1R", NULL, "OUT5R" },1321 1322	{ "SPDIF1", NULL, "SPD1" },1323 1324	{ "MICSUPP", NULL, "SYSCLK" },1325 1326	{ "DRC1 Signal Activity", NULL, "DRC1 Activity Output" },1327	{ "DRC2 Signal Activity", NULL, "DRC2 Activity Output" },1328	{ "DRC1 Activity Output", "Switch", "DRC1L" },1329	{ "DRC1 Activity Output", "Switch", "DRC1R" },1330	{ "DRC2 Activity Output", "Switch", "DRC2L" },1331	{ "DRC2 Activity Output", "Switch", "DRC2R" },1332};1333 1334static int cs47l35_set_fll(struct snd_soc_component *component, int fll_id,1335			   int source, unsigned int fref, unsigned int fout)1336{1337	struct cs47l35 *cs47l35 = snd_soc_component_get_drvdata(component);1338 1339	switch (fll_id) {1340	case MADERA_FLL1_REFCLK:1341		return madera_set_fll_refclk(&cs47l35->fll, source, fref,1342					     fout);1343	case MADERA_FLL1_SYNCCLK:1344		return madera_set_fll_syncclk(&cs47l35->fll, source, fref,1345					      fout);1346	default:1347		return -EINVAL;1348	}1349}1350 1351static const struct snd_soc_dai_ops cs47l35_dai_ops = {1352	.compress_new = snd_soc_new_compress,1353};1354 1355static struct snd_soc_dai_driver cs47l35_dai[] = {1356	{1357		.name = "cs47l35-aif1",1358		.id = 1,1359		.base = MADERA_AIF1_BCLK_CTRL,1360		.playback = {1361			.stream_name = "AIF1 Playback",1362			.channels_min = 1,1363			.channels_max = 6,1364			.rates = MADERA_RATES,1365			.formats = MADERA_FORMATS,1366		},1367		.capture = {1368			.stream_name = "AIF1 Capture",1369			.channels_min = 1,1370			.channels_max = 6,1371			.rates = MADERA_RATES,1372			.formats = MADERA_FORMATS,1373		 },1374		.ops = &madera_dai_ops,1375		.symmetric_rate = 1,1376		.symmetric_sample_bits = 1,1377	},1378	{1379		.name = "cs47l35-aif2",1380		.id = 2,1381		.base = MADERA_AIF2_BCLK_CTRL,1382		.playback = {1383			.stream_name = "AIF2 Playback",1384			.channels_min = 1,1385			.channels_max = 2,1386			.rates = MADERA_RATES,1387			.formats = MADERA_FORMATS,1388		},1389		.capture = {1390			.stream_name = "AIF2 Capture",1391			.channels_min = 1,1392			.channels_max = 2,1393			.rates = MADERA_RATES,1394			.formats = MADERA_FORMATS,1395		 },1396		.ops = &madera_dai_ops,1397		.symmetric_rate = 1,1398		.symmetric_sample_bits = 1,1399	},1400	{1401		.name = "cs47l35-aif3",1402		.id = 3,1403		.base = MADERA_AIF3_BCLK_CTRL,1404		.playback = {1405			.stream_name = "AIF3 Playback",1406			.channels_min = 1,1407			.channels_max = 2,1408			.rates = MADERA_RATES,1409			.formats = MADERA_FORMATS,1410		},1411		.capture = {1412			.stream_name = "AIF3 Capture",1413			.channels_min = 1,1414			.channels_max = 2,1415			.rates = MADERA_RATES,1416			.formats = MADERA_FORMATS,1417		 },1418		.ops = &madera_dai_ops,1419		.symmetric_rate = 1,1420		.symmetric_sample_bits = 1,1421	},1422	{1423		.name = "cs47l35-slim1",1424		.id = 4,1425		.playback = {1426			.stream_name = "Slim1 Playback",1427			.channels_min = 1,1428			.channels_max = 4,1429			.rates = MADERA_RATES,1430			.formats = MADERA_FORMATS,1431		},1432		.capture = {1433			.stream_name = "Slim1 Capture",1434			.channels_min = 1,1435			.channels_max = 4,1436			.rates = MADERA_RATES,1437			.formats = MADERA_FORMATS,1438		 },1439		.ops = &madera_simple_dai_ops,1440	},1441	{1442		.name = "cs47l35-slim2",1443		.id = 5,1444		.playback = {1445			.stream_name = "Slim2 Playback",1446			.channels_min = 1,1447			.channels_max = 2,1448			.rates = MADERA_RATES,1449			.formats = MADERA_FORMATS,1450		},1451		.capture = {1452			.stream_name = "Slim2 Capture",1453			.channels_min = 1,1454			.channels_max = 2,1455			.rates = MADERA_RATES,1456			.formats = MADERA_FORMATS,1457		 },1458		.ops = &madera_simple_dai_ops,1459	},1460	{1461		.name = "cs47l35-cpu-voicectrl",1462		.capture = {1463			.stream_name = "Voice Control CPU",1464			.channels_min = 1,1465			.channels_max = 1,1466			.rates = MADERA_RATES,1467			.formats = MADERA_FORMATS,1468		},1469		.ops = &cs47l35_dai_ops,1470	},1471	{1472		.name = "cs47l35-dsp-voicectrl",1473		.capture = {1474			.stream_name = "Voice Control DSP",1475			.channels_min = 1,1476			.channels_max = 1,1477			.rates = MADERA_RATES,1478			.formats = MADERA_FORMATS,1479		},1480	},1481	{1482		.name = "cs47l35-cpu-trace",1483		.capture = {1484			.stream_name = "Audio Trace CPU",1485			.channels_min = 1,1486			.channels_max = 6,1487			.rates = MADERA_RATES,1488			.formats = MADERA_FORMATS,1489		},1490		.ops = &cs47l35_dai_ops,1491	},1492	{1493		.name = "cs47l35-dsp-trace",1494		.capture = {1495			.stream_name = "Audio Trace DSP",1496			.channels_min = 1,1497			.channels_max = 6,1498			.rates = MADERA_RATES,1499			.formats = MADERA_FORMATS,1500		},1501	},1502};1503 1504static int cs47l35_open(struct snd_soc_component *component,1505			struct snd_compr_stream *stream)1506{1507	struct snd_soc_pcm_runtime *rtd = stream->private_data;1508	struct cs47l35 *cs47l35 = snd_soc_component_get_drvdata(component);1509	struct madera_priv *priv = &cs47l35->core;1510	struct madera *madera = priv->madera;1511	int n_adsp;1512 1513	if (strcmp(snd_soc_rtd_to_codec(rtd, 0)->name, "cs47l35-dsp-voicectrl") == 0) {1514		n_adsp = 2;1515	} else if (strcmp(snd_soc_rtd_to_codec(rtd, 0)->name, "cs47l35-dsp-trace") == 0) {1516		n_adsp = 0;1517	} else {1518		dev_err(madera->dev,1519			"No suitable compressed stream for DAI '%s'\n",1520			snd_soc_rtd_to_codec(rtd, 0)->name);1521		return -EINVAL;1522	}1523 1524	return wm_adsp_compr_open(&priv->adsp[n_adsp], stream);1525}1526 1527static irqreturn_t cs47l35_adsp2_irq(int irq, void *data)1528{1529	struct cs47l35 *cs47l35 = data;1530	struct madera_priv *priv = &cs47l35->core;1531	struct madera *madera = priv->madera;1532	struct madera_voice_trigger_info trig_info;1533	int serviced = 0;1534	int i, ret;1535 1536	for (i = 0; i < CS47L35_NUM_ADSP; ++i) {1537		ret = wm_adsp_compr_handle_irq(&priv->adsp[i]);1538		if (ret != -ENODEV)1539			serviced++;1540		if (ret == WM_ADSP_COMPR_VOICE_TRIGGER) {1541			trig_info.core_num = i + 1;1542			blocking_notifier_call_chain(&madera->notifier,1543						MADERA_NOTIFY_VOICE_TRIGGER,1544						&trig_info);1545		}1546	}1547 1548	if (!serviced) {1549		dev_err(madera->dev, "Spurious compressed data IRQ\n");1550		return IRQ_NONE;1551	}1552 1553	return IRQ_HANDLED;1554}1555 1556static const struct snd_soc_dapm_route cs47l35_mono_routes[] = {1557	{ "HPOUT1 Mono Mux", "HPOUT", "OUT1L" },1558};1559 1560static int cs47l35_component_probe(struct snd_soc_component *component)1561{1562	struct cs47l35 *cs47l35 = snd_soc_component_get_drvdata(component);1563	struct madera *madera = cs47l35->core.madera;1564	int i, ret;1565 1566	snd_soc_component_init_regmap(component, madera->regmap);1567 1568	mutex_lock(&madera->dapm_ptr_lock);1569	madera->dapm = snd_soc_component_get_dapm(component);1570	mutex_unlock(&madera->dapm_ptr_lock);1571 1572	ret = madera_init_inputs(component);1573	if (ret)1574		return ret;1575 1576	ret = madera_init_outputs(component, cs47l35_mono_routes,1577				  ARRAY_SIZE(cs47l35_mono_routes),1578				  CS47L35_MONO_OUTPUTS);1579	if (ret)1580		return ret;1581 1582	snd_soc_component_disable_pin(component, "HAPTICS");1583 1584	ret = snd_soc_add_component_controls(component,1585					     madera_adsp_rate_controls,1586					     CS47L35_NUM_ADSP);1587	if (ret)1588		return ret;1589 1590	for (i = 0; i < CS47L35_NUM_ADSP; i++)1591		wm_adsp2_component_probe(&cs47l35->core.adsp[i], component);1592 1593	return 0;1594}1595 1596static void cs47l35_component_remove(struct snd_soc_component *component)1597{1598	struct cs47l35 *cs47l35 = snd_soc_component_get_drvdata(component);1599	struct madera *madera = cs47l35->core.madera;1600	int i;1601 1602	mutex_lock(&madera->dapm_ptr_lock);1603	madera->dapm = NULL;1604	mutex_unlock(&madera->dapm_ptr_lock);1605 1606	for (i = 0; i < CS47L35_NUM_ADSP; i++)1607		wm_adsp2_component_remove(&cs47l35->core.adsp[i], component);1608}1609 1610#define CS47L35_DIG_VU 0x02001611 1612static unsigned int cs47l35_digital_vu[] = {1613	MADERA_DAC_DIGITAL_VOLUME_1L,1614	MADERA_DAC_DIGITAL_VOLUME_1R,1615	MADERA_DAC_DIGITAL_VOLUME_4L,1616	MADERA_DAC_DIGITAL_VOLUME_5L,1617	MADERA_DAC_DIGITAL_VOLUME_5R,1618};1619 1620static const struct snd_compress_ops cs47l35_compress_ops = {1621	.open = &cs47l35_open,1622	.free = &wm_adsp_compr_free,1623	.set_params = &wm_adsp_compr_set_params,1624	.get_caps = &wm_adsp_compr_get_caps,1625	.trigger = &wm_adsp_compr_trigger,1626	.pointer = &wm_adsp_compr_pointer,1627	.copy = &wm_adsp_compr_copy,1628};1629 1630static const struct snd_soc_component_driver soc_component_dev_cs47l35 = {1631	.probe			= &cs47l35_component_probe,1632	.remove			= &cs47l35_component_remove,1633	.set_sysclk		= &madera_set_sysclk,1634	.set_pll		= &cs47l35_set_fll,1635	.name			= DRV_NAME,1636	.compress_ops		= &cs47l35_compress_ops,1637	.controls		= cs47l35_snd_controls,1638	.num_controls		= ARRAY_SIZE(cs47l35_snd_controls),1639	.dapm_widgets		= cs47l35_dapm_widgets,1640	.num_dapm_widgets	= ARRAY_SIZE(cs47l35_dapm_widgets),1641	.dapm_routes		= cs47l35_dapm_routes,1642	.num_dapm_routes	= ARRAY_SIZE(cs47l35_dapm_routes),1643	.use_pmdown_time	= 1,1644	.endianness		= 1,1645};1646 1647static int cs47l35_probe(struct platform_device *pdev)1648{1649	struct madera *madera = dev_get_drvdata(pdev->dev.parent);1650	struct cs47l35 *cs47l35;1651	int i, ret;1652 1653	BUILD_BUG_ON(ARRAY_SIZE(cs47l35_dai) > MADERA_MAX_DAI);1654 1655	/* quick exit if Madera irqchip driver hasn't completed probe */1656	if (!madera->irq_dev) {1657		dev_dbg(&pdev->dev, "irqchip driver not ready\n");1658		return -EPROBE_DEFER;1659	}1660 1661	cs47l35 = devm_kzalloc(&pdev->dev, sizeof(struct cs47l35), GFP_KERNEL);1662	if (!cs47l35)1663		return -ENOMEM;1664	platform_set_drvdata(pdev, cs47l35);1665 1666	cs47l35->core.madera = madera;1667	cs47l35->core.dev = &pdev->dev;1668	cs47l35->core.num_inputs = 4;1669 1670	ret = madera_core_init(&cs47l35->core);1671	if (ret)1672		return ret;1673 1674	ret = madera_init_overheat(&cs47l35->core);1675	if (ret)1676		goto error_core;1677 1678	ret = madera_request_irq(madera, MADERA_IRQ_DSP_IRQ1,1679				 "ADSP2 Compressed IRQ", cs47l35_adsp2_irq,1680				 cs47l35);1681	if (ret) {1682		dev_err(&pdev->dev, "Failed to request DSP IRQ: %d\n", ret);1683		goto error_overheat;1684	}1685 1686	ret = madera_set_irq_wake(madera, MADERA_IRQ_DSP_IRQ1, 1);1687	if (ret)1688		dev_warn(&pdev->dev, "Failed to set DSP IRQ wake: %d\n", ret);1689 1690	for (i = 0; i < CS47L35_NUM_ADSP; i++) {1691		cs47l35->core.adsp[i].part = "cs47l35";1692		cs47l35->core.adsp[i].cs_dsp.num = i + 1;1693		cs47l35->core.adsp[i].cs_dsp.type = WMFW_ADSP2;1694		cs47l35->core.adsp[i].cs_dsp.rev = 1;1695		cs47l35->core.adsp[i].cs_dsp.dev = madera->dev;1696		cs47l35->core.adsp[i].cs_dsp.regmap = madera->regmap_32bit;1697 1698		cs47l35->core.adsp[i].cs_dsp.base = wm_adsp2_control_bases[i];1699		cs47l35->core.adsp[i].cs_dsp.mem = cs47l35_dsp_regions[i];1700		cs47l35->core.adsp[i].cs_dsp.num_mems =1701			ARRAY_SIZE(cs47l35_dsp1_regions);1702 1703		ret = wm_adsp2_init(&cs47l35->core.adsp[i]);1704		if (ret) {1705			for (--i; i >= 0; --i)1706				wm_adsp2_remove(&cs47l35->core.adsp[i]);1707			goto error_dsp_irq;1708		}1709	}1710 1711	madera_init_fll(madera, 1, MADERA_FLL1_CONTROL_1 - 1, &cs47l35->fll);1712 1713	for (i = 0; i < ARRAY_SIZE(cs47l35_dai); i++)1714		madera_init_dai(&cs47l35->core, i);1715 1716	/* Latch volume update bits */1717	for (i = 0; i < ARRAY_SIZE(cs47l35_digital_vu); i++)1718		regmap_update_bits(madera->regmap, cs47l35_digital_vu[i],1719				   CS47L35_DIG_VU, CS47L35_DIG_VU);1720 1721	pm_runtime_enable(&pdev->dev);1722	pm_runtime_idle(&pdev->dev);1723 1724	ret = devm_snd_soc_register_component(&pdev->dev,1725					      &soc_component_dev_cs47l35,1726					      cs47l35_dai,1727					      ARRAY_SIZE(cs47l35_dai));1728	if (ret < 0) {1729		dev_err(&pdev->dev, "Failed to register component: %d\n", ret);1730		goto error_pm_runtime;1731	}1732 1733	return ret;1734 1735error_pm_runtime:1736	pm_runtime_disable(&pdev->dev);1737 1738	for (i = 0; i < CS47L35_NUM_ADSP; i++)1739		wm_adsp2_remove(&cs47l35->core.adsp[i]);1740error_dsp_irq:1741	madera_set_irq_wake(madera, MADERA_IRQ_DSP_IRQ1, 0);1742	madera_free_irq(madera, MADERA_IRQ_DSP_IRQ1, cs47l35);1743error_overheat:1744	madera_free_overheat(&cs47l35->core);1745error_core:1746	madera_core_free(&cs47l35->core);1747 1748	return ret;1749}1750 1751static void cs47l35_remove(struct platform_device *pdev)1752{1753	struct cs47l35 *cs47l35 = platform_get_drvdata(pdev);1754	int i;1755 1756	pm_runtime_disable(&pdev->dev);1757 1758	for (i = 0; i < CS47L35_NUM_ADSP; i++)1759		wm_adsp2_remove(&cs47l35->core.adsp[i]);1760 1761	madera_set_irq_wake(cs47l35->core.madera, MADERA_IRQ_DSP_IRQ1, 0);1762	madera_free_irq(cs47l35->core.madera, MADERA_IRQ_DSP_IRQ1, cs47l35);1763	madera_free_overheat(&cs47l35->core);1764	madera_core_free(&cs47l35->core);1765}1766 1767static struct platform_driver cs47l35_codec_driver = {1768	.driver = {1769		.name = "cs47l35-codec",1770	},1771	.probe = &cs47l35_probe,1772	.remove = cs47l35_remove,1773};1774 1775module_platform_driver(cs47l35_codec_driver);1776 1777MODULE_SOFTDEP("pre: madera irq-madera arizona-micsupp");1778MODULE_DESCRIPTION("ASoC CS47L35 driver");1779MODULE_AUTHOR("Piotr Stankiewicz <piotrs@opensource.cirrus.com>");1780MODULE_LICENSE("GPL v2");1781MODULE_ALIAS("platform:cs47l35-codec");1782