2019-06-25 18:37:27 +03:00
// SPDX-License-Identifier: GPL-2.0-only
2019-06-19 16:41:57 +03:00
//
// ALSA SoC Audio driver for CS47L35 codec
//
// Copyright (C) 2015-2019 Cirrus Logic, Inc. and
// Cirrus Logic International Semiconductor Ltd.
//
# include <linux/delay.h>
# include <linux/device.h>
# include <linux/init.h>
# include <linux/module.h>
# include <linux/moduleparam.h>
# include <linux/pm.h>
# include <linux/pm_runtime.h>
# include <linux/regmap.h>
# include <sound/core.h>
# include <sound/pcm.h>
# include <sound/pcm_params.h>
# include <sound/soc.h>
# include <sound/tlv.h>
# include <linux/irqchip/irq-madera.h>
# include <linux/mfd/madera/core.h>
# include <linux/mfd/madera/registers.h>
# include "madera.h"
# include "wm_adsp.h"
# define CS47L35_NUM_ADSP 3
# define CS47L35_MONO_OUTPUTS 1
# define DRV_NAME "cs47l35-codec"
struct cs47l35 {
struct madera_priv core ;
struct madera_fll fll ;
} ;
2021-09-13 19:00:46 +03:00
static const struct cs_dsp_region cs47l35_dsp1_regions [ ] = {
2019-06-19 16:41:57 +03:00
{ . type = WMFW_ADSP2_PM , . base = 0x080000 } ,
{ . type = WMFW_ADSP2_ZM , . base = 0x0e0000 } ,
{ . type = WMFW_ADSP2_XM , . base = 0x0a0000 } ,
{ . type = WMFW_ADSP2_YM , . base = 0x0c0000 } ,
} ;
2021-09-13 19:00:46 +03:00
static const struct cs_dsp_region cs47l35_dsp2_regions [ ] = {
2019-06-19 16:41:57 +03:00
{ . type = WMFW_ADSP2_PM , . base = 0x100000 } ,
{ . type = WMFW_ADSP2_ZM , . base = 0x160000 } ,
{ . type = WMFW_ADSP2_XM , . base = 0x120000 } ,
{ . type = WMFW_ADSP2_YM , . base = 0x140000 } ,
} ;
2021-09-13 19:00:46 +03:00
static const struct cs_dsp_region cs47l35_dsp3_regions [ ] = {
2019-06-19 16:41:57 +03:00
{ . type = WMFW_ADSP2_PM , . base = 0x180000 } ,
{ . type = WMFW_ADSP2_ZM , . base = 0x1e0000 } ,
{ . type = WMFW_ADSP2_XM , . base = 0x1a0000 } ,
{ . type = WMFW_ADSP2_YM , . base = 0x1c0000 } ,
} ;
2021-09-13 19:00:46 +03:00
static const struct cs_dsp_region * cs47l35_dsp_regions [ ] = {
2019-06-19 16:41:57 +03:00
cs47l35_dsp1_regions ,
cs47l35_dsp2_regions ,
cs47l35_dsp3_regions ,
} ;
static const int wm_adsp2_control_bases [ ] = {
MADERA_DSP1_CONFIG_1 ,
MADERA_DSP2_CONFIG_1 ,
MADERA_DSP3_CONFIG_1 ,
} ;
static const char * const cs47l35_outdemux_texts [ ] = {
" HPOUT " ,
" EPOUT " ,
} ;
static SOC_ENUM_SINGLE_DECL ( cs47l35_outdemux_enum , SND_SOC_NOPM , 0 ,
cs47l35_outdemux_texts ) ;
static const struct snd_kcontrol_new cs47l35_outdemux =
SOC_DAPM_ENUM_EXT ( " HPOUT1 Demux " , cs47l35_outdemux_enum ,
madera_out1_demux_get , madera_out1_demux_put ) ;
static int cs47l35_adsp_power_ev ( struct snd_soc_dapm_widget * w ,
struct snd_kcontrol * kcontrol ,
int event )
{
struct snd_soc_component * component =
snd_soc_dapm_to_component ( w - > dapm ) ;
struct cs47l35 * cs47l35 = snd_soc_component_get_drvdata ( component ) ;
struct madera_priv * priv = & cs47l35 - > core ;
struct madera * madera = priv - > madera ;
unsigned int freq ;
int ret ;
ret = regmap_read ( madera - > regmap , MADERA_DSP_CLOCK_1 , & freq ) ;
if ( ret ! = 0 ) {
dev_err ( madera - > dev ,
" Failed to read MADERA_DSP_CLOCK_1: %d \n " , ret ) ;
return ret ;
}
freq & = MADERA_DSP_CLK_FREQ_LEGACY_MASK ;
freq > > = MADERA_DSP_CLK_FREQ_LEGACY_SHIFT ;
switch ( event ) {
case SND_SOC_DAPM_PRE_PMU :
ret = madera_set_adsp_clk ( & cs47l35 - > core , w - > shift , freq ) ;
if ( ret )
return ret ;
break ;
default :
break ;
}
return wm_adsp_early_event ( w , kcontrol , event ) ;
}
# define CS47L35_NG_SRC(name, base) \
SOC_SINGLE ( name " NG HPOUT1L Switch " , base , 0 , 1 , 0 ) , \
SOC_SINGLE ( name " NG HPOUT1R Switch " , base , 1 , 1 , 0 ) , \
SOC_SINGLE ( name " NG SPKOUT Switch " , base , 6 , 1 , 0 ) , \
SOC_SINGLE ( name " NG SPKDAT1L Switch " , base , 8 , 1 , 0 ) , \
SOC_SINGLE ( name " NG SPKDAT1R Switch " , base , 9 , 1 , 0 )
static void cs47l35_hp_post_enable ( struct snd_soc_dapm_widget * w )
{
struct snd_soc_component * component =
snd_soc_dapm_to_component ( w - > dapm ) ;
unsigned int val ;
switch ( w - > shift ) {
case MADERA_OUT1L_ENA_SHIFT :
case MADERA_OUT1R_ENA_SHIFT :
ASoC: soc-component: merge snd_soc_component_read() and snd_soc_component_read32()
We had read/write function for Codec, Platform, etc,
but these has been merged into snd_soc_component_read/write().
Internally, it is using regmap or driver function.
In read case, each styles are like below
regmap
ret = regmap_read(..., reg, &val);
driver function
val = xxx->read(..., reg);
Because of this kind of different style, to keep same read style,
when we merged each read function into snd_soc_component_read(),
we created snd_soc_component_read32(), like below.
commit 738b49efe6c6 ("ASoC: add snd_soc_component_read32")
(1) val = snd_soc_component_read32(component, reg);
(2) ret = snd_soc_component_read(component, reg, &val);
Many drivers are using snd_soc_component_read32(), and
some drivers are using snd_soc_component_read() today.
In generally, we don't check read function successes,
because, we will have many other issues at initial timing
if read function didn't work.
Now we can use soc_component_err() when error case.
This means, it is easy to notice if error occurred.
This patch aggressively merge snd_soc_component_read() and _read32(),
and makes snd_soc_component_read/write() as generally style.
This patch do
1) merge snd_soc_component_read() and snd_soc_component_read32()
2) it uses soc_component_err() when error case (easy to notice)
3) keeps read32 for now by #define
4) update snd_soc_component_read() for all drivers
Because _read() user drivers are not too many, this patch changes
all user drivers.
Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Reviewed-by: Kai Vehmanen <kai.vehmanen@linux.intel.com>
Link: https://lore.kernel.org/r/87sgev4mfl.wl-kuninori.morimoto.gx@renesas.com
Signed-off-by: Mark Brown <broonie@kernel.org>
2020-06-16 08:19:41 +03:00
val = snd_soc_component_read ( component , MADERA_OUTPUT_ENABLES_1 ) ;
2019-06-19 16:41:57 +03:00
val & = ( MADERA_OUT1L_ENA | MADERA_OUT1R_ENA ) ;
if ( val ! = ( MADERA_OUT1L_ENA | MADERA_OUT1R_ENA ) )
break ;
snd_soc_component_update_bits ( component ,
MADERA_EDRE_HP_STEREO_CONTROL ,
0x0001 , 1 ) ;
break ;
default :
break ;
}
}
static void cs47l35_hp_post_disable ( struct snd_soc_dapm_widget * w )
{
struct snd_soc_component * component =
snd_soc_dapm_to_component ( w - > dapm ) ;
switch ( w - > shift ) {
case MADERA_OUT1L_ENA_SHIFT :
snd_soc_component_write ( component , MADERA_DCS_HP1L_CONTROL ,
0x2006 ) ;
break ;
case MADERA_OUT1R_ENA_SHIFT :
snd_soc_component_write ( component , MADERA_DCS_HP1R_CONTROL ,
0x2006 ) ;
break ;
default :
return ;
}
/* Only get to here for OUT1L and OUT1R */
snd_soc_component_update_bits ( component ,
MADERA_EDRE_HP_STEREO_CONTROL ,
0x0001 , 0 ) ;
}
static int cs47l35_hp_ev ( struct snd_soc_dapm_widget * w ,
struct snd_kcontrol * kcontrol , int event )
{
int ret ;
switch ( event ) {
case SND_SOC_DAPM_PRE_PMU :
case SND_SOC_DAPM_PRE_PMD :
return madera_hp_ev ( w , kcontrol , event ) ;
case SND_SOC_DAPM_POST_PMU :
ret = madera_hp_ev ( w , kcontrol , event ) ;
if ( ret < 0 )
return ret ;
cs47l35_hp_post_enable ( w ) ;
return 0 ;
case SND_SOC_DAPM_POST_PMD :
ret = madera_hp_ev ( w , kcontrol , event ) ;
cs47l35_hp_post_disable ( w ) ;
return ret ;
default :
return - EINVAL ;
}
}
static const struct snd_kcontrol_new cs47l35_snd_controls [ ] = {
SOC_ENUM ( " IN1 OSR " , madera_in_dmic_osr [ 0 ] ) ,
SOC_ENUM ( " IN2 OSR " , madera_in_dmic_osr [ 1 ] ) ,
SOC_SINGLE_RANGE_TLV ( " IN1L Volume " , MADERA_IN1L_CONTROL ,
MADERA_IN1L_PGA_VOL_SHIFT , 0x40 , 0x5f , 0 , madera_ana_tlv ) ,
SOC_SINGLE_RANGE_TLV ( " IN1R Volume " , MADERA_IN1R_CONTROL ,
MADERA_IN1R_PGA_VOL_SHIFT , 0x40 , 0x5f , 0 , madera_ana_tlv ) ,
SOC_SINGLE_RANGE_TLV ( " IN2L Volume " , MADERA_IN2L_CONTROL ,
MADERA_IN2L_PGA_VOL_SHIFT , 0x40 , 0x5f , 0 , madera_ana_tlv ) ,
SOC_SINGLE_RANGE_TLV ( " IN2R Volume " , MADERA_IN2R_CONTROL ,
MADERA_IN2R_PGA_VOL_SHIFT , 0x40 , 0x5f , 0 , madera_ana_tlv ) ,
SOC_ENUM ( " IN HPF Cutoff Frequency " , madera_in_hpf_cut_enum ) ,
SOC_SINGLE ( " IN1L HPF Switch " , MADERA_IN1L_CONTROL ,
MADERA_IN1L_HPF_SHIFT , 1 , 0 ) ,
SOC_SINGLE ( " IN1R HPF Switch " , MADERA_IN1R_CONTROL ,
MADERA_IN1R_HPF_SHIFT , 1 , 0 ) ,
SOC_SINGLE ( " IN2L HPF Switch " , MADERA_IN2L_CONTROL ,
MADERA_IN2L_HPF_SHIFT , 1 , 0 ) ,
SOC_SINGLE ( " IN2R HPF Switch " , MADERA_IN2R_CONTROL ,
MADERA_IN2R_HPF_SHIFT , 1 , 0 ) ,
SOC_SINGLE_TLV ( " IN1L Digital Volume " , MADERA_ADC_DIGITAL_VOLUME_1L ,
MADERA_IN1L_DIG_VOL_SHIFT , 0xbf , 0 , madera_digital_tlv ) ,
SOC_SINGLE_TLV ( " IN1R Digital Volume " , MADERA_ADC_DIGITAL_VOLUME_1R ,
MADERA_IN1R_DIG_VOL_SHIFT , 0xbf , 0 , madera_digital_tlv ) ,
SOC_SINGLE_TLV ( " IN2L Digital Volume " , MADERA_ADC_DIGITAL_VOLUME_2L ,
MADERA_IN2L_DIG_VOL_SHIFT , 0xbf , 0 , madera_digital_tlv ) ,
SOC_SINGLE_TLV ( " IN2R Digital Volume " , MADERA_ADC_DIGITAL_VOLUME_2R ,
MADERA_IN2R_DIG_VOL_SHIFT , 0xbf , 0 , madera_digital_tlv ) ,
SOC_ENUM ( " Input Ramp Up " , madera_in_vi_ramp ) ,
SOC_ENUM ( " Input Ramp Down " , madera_in_vd_ramp ) ,
MADERA_MIXER_CONTROLS ( " EQ1 " , MADERA_EQ1MIX_INPUT_1_SOURCE ) ,
MADERA_MIXER_CONTROLS ( " EQ2 " , MADERA_EQ2MIX_INPUT_1_SOURCE ) ,
MADERA_MIXER_CONTROLS ( " EQ3 " , MADERA_EQ3MIX_INPUT_1_SOURCE ) ,
MADERA_MIXER_CONTROLS ( " EQ4 " , MADERA_EQ4MIX_INPUT_1_SOURCE ) ,
MADERA_EQ_CONTROL ( " EQ1 Coefficients " , MADERA_EQ1_2 ) ,
SOC_SINGLE_TLV ( " EQ1 B1 Volume " , MADERA_EQ1_1 , MADERA_EQ1_B1_GAIN_SHIFT ,
24 , 0 , madera_eq_tlv ) ,
SOC_SINGLE_TLV ( " EQ1 B2 Volume " , MADERA_EQ1_1 , MADERA_EQ1_B2_GAIN_SHIFT ,
24 , 0 , madera_eq_tlv ) ,
SOC_SINGLE_TLV ( " EQ1 B3 Volume " , MADERA_EQ1_1 , MADERA_EQ1_B3_GAIN_SHIFT ,
24 , 0 , madera_eq_tlv ) ,
SOC_SINGLE_TLV ( " EQ1 B4 Volume " , MADERA_EQ1_2 , MADERA_EQ1_B4_GAIN_SHIFT ,
24 , 0 , madera_eq_tlv ) ,
SOC_SINGLE_TLV ( " EQ1 B5 Volume " , MADERA_EQ1_2 , MADERA_EQ1_B5_GAIN_SHIFT ,
24 , 0 , madera_eq_tlv ) ,
MADERA_EQ_CONTROL ( " EQ2 Coefficients " , MADERA_EQ2_2 ) ,
SOC_SINGLE_TLV ( " EQ2 B1 Volume " , MADERA_EQ2_1 , MADERA_EQ2_B1_GAIN_SHIFT ,
24 , 0 , madera_eq_tlv ) ,
SOC_SINGLE_TLV ( " EQ2 B2 Volume " , MADERA_EQ2_1 , MADERA_EQ2_B2_GAIN_SHIFT ,
24 , 0 , madera_eq_tlv ) ,
SOC_SINGLE_TLV ( " EQ2 B3 Volume " , MADERA_EQ2_1 , MADERA_EQ2_B3_GAIN_SHIFT ,
24 , 0 , madera_eq_tlv ) ,
SOC_SINGLE_TLV ( " EQ2 B4 Volume " , MADERA_EQ2_2 , MADERA_EQ2_B4_GAIN_SHIFT ,
24 , 0 , madera_eq_tlv ) ,
SOC_SINGLE_TLV ( " EQ2 B5 Volume " , MADERA_EQ2_2 , MADERA_EQ2_B5_GAIN_SHIFT ,
24 , 0 , madera_eq_tlv ) ,
MADERA_EQ_CONTROL ( " EQ3 Coefficients " , MADERA_EQ3_2 ) ,
SOC_SINGLE_TLV ( " EQ3 B1 Volume " , MADERA_EQ3_1 , MADERA_EQ3_B1_GAIN_SHIFT ,
24 , 0 , madera_eq_tlv ) ,
SOC_SINGLE_TLV ( " EQ3 B2 Volume " , MADERA_EQ3_1 , MADERA_EQ3_B2_GAIN_SHIFT ,
24 , 0 , madera_eq_tlv ) ,
SOC_SINGLE_TLV ( " EQ3 B3 Volume " , MADERA_EQ3_1 , MADERA_EQ3_B3_GAIN_SHIFT ,
24 , 0 , madera_eq_tlv ) ,
SOC_SINGLE_TLV ( " EQ3 B4 Volume " , MADERA_EQ3_2 , MADERA_EQ3_B4_GAIN_SHIFT ,
24 , 0 , madera_eq_tlv ) ,
SOC_SINGLE_TLV ( " EQ3 B5 Volume " , MADERA_EQ3_2 , MADERA_EQ3_B5_GAIN_SHIFT ,
24 , 0 , madera_eq_tlv ) ,
MADERA_EQ_CONTROL ( " EQ4 Coefficients " , MADERA_EQ4_2 ) ,
SOC_SINGLE_TLV ( " EQ4 B1 Volume " , MADERA_EQ4_1 , MADERA_EQ4_B1_GAIN_SHIFT ,
24 , 0 , madera_eq_tlv ) ,
SOC_SINGLE_TLV ( " EQ4 B2 Volume " , MADERA_EQ4_1 , MADERA_EQ4_B2_GAIN_SHIFT ,
24 , 0 , madera_eq_tlv ) ,
SOC_SINGLE_TLV ( " EQ4 B3 Volume " , MADERA_EQ4_1 , MADERA_EQ4_B3_GAIN_SHIFT ,
24 , 0 , madera_eq_tlv ) ,
SOC_SINGLE_TLV ( " EQ4 B4 Volume " , MADERA_EQ4_2 , MADERA_EQ4_B4_GAIN_SHIFT ,
24 , 0 , madera_eq_tlv ) ,
SOC_SINGLE_TLV ( " EQ4 B5 Volume " , MADERA_EQ4_2 , MADERA_EQ4_B5_GAIN_SHIFT ,
24 , 0 , madera_eq_tlv ) ,
MADERA_MIXER_CONTROLS ( " DRC1L " , MADERA_DRC1LMIX_INPUT_1_SOURCE ) ,
MADERA_MIXER_CONTROLS ( " DRC1R " , MADERA_DRC1RMIX_INPUT_1_SOURCE ) ,
MADERA_MIXER_CONTROLS ( " DRC2L " , MADERA_DRC2LMIX_INPUT_1_SOURCE ) ,
MADERA_MIXER_CONTROLS ( " DRC2R " , MADERA_DRC2RMIX_INPUT_1_SOURCE ) ,
SND_SOC_BYTES_MASK ( " DRC1 " , MADERA_DRC1_CTRL1 , 5 ,
MADERA_DRC1R_ENA | MADERA_DRC1L_ENA ) ,
SND_SOC_BYTES_MASK ( " DRC2 " , MADERA_DRC2_CTRL1 , 5 ,
MADERA_DRC2R_ENA | MADERA_DRC2L_ENA ) ,
MADERA_MIXER_CONTROLS ( " LHPF1 " , MADERA_HPLP1MIX_INPUT_1_SOURCE ) ,
MADERA_MIXER_CONTROLS ( " LHPF2 " , MADERA_HPLP2MIX_INPUT_1_SOURCE ) ,
MADERA_MIXER_CONTROLS ( " LHPF3 " , MADERA_HPLP3MIX_INPUT_1_SOURCE ) ,
MADERA_MIXER_CONTROLS ( " LHPF4 " , MADERA_HPLP4MIX_INPUT_1_SOURCE ) ,
MADERA_LHPF_CONTROL ( " LHPF1 Coefficients " , MADERA_HPLPF1_2 ) ,
MADERA_LHPF_CONTROL ( " LHPF2 Coefficients " , MADERA_HPLPF2_2 ) ,
MADERA_LHPF_CONTROL ( " LHPF3 Coefficients " , MADERA_HPLPF3_2 ) ,
MADERA_LHPF_CONTROL ( " LHPF4 Coefficients " , MADERA_HPLPF4_2 ) ,
SOC_ENUM ( " LHPF1 Mode " , madera_lhpf1_mode ) ,
SOC_ENUM ( " LHPF2 Mode " , madera_lhpf2_mode ) ,
SOC_ENUM ( " LHPF3 Mode " , madera_lhpf3_mode ) ,
SOC_ENUM ( " LHPF4 Mode " , madera_lhpf4_mode ) ,
MADERA_RATE_ENUM ( " ISRC1 FSL " , madera_isrc_fsl [ 0 ] ) ,
MADERA_RATE_ENUM ( " ISRC2 FSL " , madera_isrc_fsl [ 1 ] ) ,
MADERA_RATE_ENUM ( " ISRC1 FSH " , madera_isrc_fsh [ 0 ] ) ,
MADERA_RATE_ENUM ( " ISRC2 FSH " , madera_isrc_fsh [ 1 ] ) ,
WM_ADSP2_PRELOAD_SWITCH ( " DSP1 " , 1 ) ,
WM_ADSP2_PRELOAD_SWITCH ( " DSP2 " , 2 ) ,
WM_ADSP2_PRELOAD_SWITCH ( " DSP3 " , 3 ) ,
MADERA_MIXER_CONTROLS ( " DSP1L " , MADERA_DSP1LMIX_INPUT_1_SOURCE ) ,
MADERA_MIXER_CONTROLS ( " DSP1R " , MADERA_DSP1RMIX_INPUT_1_SOURCE ) ,
MADERA_MIXER_CONTROLS ( " DSP2L " , MADERA_DSP2LMIX_INPUT_1_SOURCE ) ,
MADERA_MIXER_CONTROLS ( " DSP2R " , MADERA_DSP2RMIX_INPUT_1_SOURCE ) ,
MADERA_MIXER_CONTROLS ( " DSP3L " , MADERA_DSP3LMIX_INPUT_1_SOURCE ) ,
MADERA_MIXER_CONTROLS ( " DSP3R " , MADERA_DSP3RMIX_INPUT_1_SOURCE ) ,
SOC_SINGLE_TLV ( " Noise Generator Volume " , MADERA_COMFORT_NOISE_GENERATOR ,
MADERA_NOISE_GEN_GAIN_SHIFT , 0x16 , 0 , madera_noise_tlv ) ,
MADERA_MIXER_CONTROLS ( " HPOUT1L " , MADERA_OUT1LMIX_INPUT_1_SOURCE ) ,
MADERA_MIXER_CONTROLS ( " HPOUT1R " , MADERA_OUT1RMIX_INPUT_1_SOURCE ) ,
MADERA_MIXER_CONTROLS ( " SPKOUT " , MADERA_OUT4LMIX_INPUT_1_SOURCE ) ,
MADERA_MIXER_CONTROLS ( " SPKDAT1L " , MADERA_OUT5LMIX_INPUT_1_SOURCE ) ,
MADERA_MIXER_CONTROLS ( " SPKDAT1R " , MADERA_OUT5RMIX_INPUT_1_SOURCE ) ,
SOC_SINGLE ( " HPOUT1 SC Protect Switch " , MADERA_HP1_SHORT_CIRCUIT_CTRL ,
MADERA_HP1_SC_ENA_SHIFT , 1 , 0 ) ,
SOC_SINGLE ( " SPKDAT1 High Performance Switch " , MADERA_OUTPUT_PATH_CONFIG_5L ,
MADERA_OUT5_OSR_SHIFT , 1 , 0 ) ,
SOC_DOUBLE_R ( " HPOUT1 Digital Switch " , MADERA_DAC_DIGITAL_VOLUME_1L ,
MADERA_DAC_DIGITAL_VOLUME_1R , MADERA_OUT1L_MUTE_SHIFT , 1 , 1 ) ,
SOC_SINGLE ( " Speaker Digital Switch " , MADERA_DAC_DIGITAL_VOLUME_4L ,
MADERA_OUT4L_MUTE_SHIFT , 1 , 1 ) ,
SOC_DOUBLE_R ( " SPKDAT1 Digital Switch " , MADERA_DAC_DIGITAL_VOLUME_5L ,
MADERA_DAC_DIGITAL_VOLUME_5R , MADERA_OUT5L_MUTE_SHIFT , 1 , 1 ) ,
SOC_DOUBLE_R_TLV ( " HPOUT1 Digital Volume " , MADERA_DAC_DIGITAL_VOLUME_1L ,
MADERA_DAC_DIGITAL_VOLUME_1R , MADERA_OUT1L_VOL_SHIFT ,
0xbf , 0 , madera_digital_tlv ) ,
SOC_SINGLE_TLV ( " Speaker Digital Volume " , MADERA_DAC_DIGITAL_VOLUME_4L ,
MADERA_OUT4L_VOL_SHIFT , 0xbf , 0 , madera_digital_tlv ) ,
SOC_DOUBLE_R_TLV ( " SPKDAT1 Digital Volume " , MADERA_DAC_DIGITAL_VOLUME_5L ,
MADERA_DAC_DIGITAL_VOLUME_5R , MADERA_OUT5L_VOL_SHIFT ,
0xbf , 0 , madera_digital_tlv ) ,
SOC_DOUBLE ( " SPKDAT1 Switch " , MADERA_PDM_SPK1_CTRL_1 , MADERA_SPK1L_MUTE_SHIFT ,
MADERA_SPK1R_MUTE_SHIFT , 1 , 1 ) ,
SOC_ENUM ( " Output Ramp Up " , madera_out_vi_ramp ) ,
SOC_ENUM ( " Output Ramp Down " , madera_out_vd_ramp ) ,
SOC_SINGLE ( " Noise Gate Switch " , MADERA_NOISE_GATE_CONTROL ,
MADERA_NGATE_ENA_SHIFT , 1 , 0 ) ,
SOC_SINGLE_TLV ( " Noise Gate Threshold Volume " , MADERA_NOISE_GATE_CONTROL ,
MADERA_NGATE_THR_SHIFT , 7 , 1 , madera_ng_tlv ) ,
SOC_ENUM ( " Noise Gate Hold " , madera_ng_hold ) ,
CS47L35_NG_SRC ( " HPOUT1L " , MADERA_NOISE_GATE_SELECT_1L ) ,
CS47L35_NG_SRC ( " HPOUT1R " , MADERA_NOISE_GATE_SELECT_1R ) ,
CS47L35_NG_SRC ( " SPKOUT " , MADERA_NOISE_GATE_SELECT_4L ) ,
CS47L35_NG_SRC ( " SPKDAT1L " , MADERA_NOISE_GATE_SELECT_5L ) ,
CS47L35_NG_SRC ( " SPKDAT1R " , MADERA_NOISE_GATE_SELECT_5R ) ,
MADERA_MIXER_CONTROLS ( " AIF1TX1 " , MADERA_AIF1TX1MIX_INPUT_1_SOURCE ) ,
MADERA_MIXER_CONTROLS ( " AIF1TX2 " , MADERA_AIF1TX2MIX_INPUT_1_SOURCE ) ,
MADERA_MIXER_CONTROLS ( " AIF1TX3 " , MADERA_AIF1TX3MIX_INPUT_1_SOURCE ) ,
MADERA_MIXER_CONTROLS ( " AIF1TX4 " , MADERA_AIF1TX4MIX_INPUT_1_SOURCE ) ,
MADERA_MIXER_CONTROLS ( " AIF1TX5 " , MADERA_AIF1TX5MIX_INPUT_1_SOURCE ) ,
MADERA_MIXER_CONTROLS ( " AIF1TX6 " , MADERA_AIF1TX6MIX_INPUT_1_SOURCE ) ,
MADERA_MIXER_CONTROLS ( " AIF2TX1 " , MADERA_AIF2TX1MIX_INPUT_1_SOURCE ) ,
MADERA_MIXER_CONTROLS ( " AIF2TX2 " , MADERA_AIF2TX2MIX_INPUT_1_SOURCE ) ,
MADERA_MIXER_CONTROLS ( " AIF3TX1 " , MADERA_AIF3TX1MIX_INPUT_1_SOURCE ) ,
MADERA_MIXER_CONTROLS ( " AIF3TX2 " , MADERA_AIF3TX2MIX_INPUT_1_SOURCE ) ,
MADERA_MIXER_CONTROLS ( " SLIMTX1 " , MADERA_SLIMTX1MIX_INPUT_1_SOURCE ) ,
MADERA_MIXER_CONTROLS ( " SLIMTX2 " , MADERA_SLIMTX2MIX_INPUT_1_SOURCE ) ,
MADERA_MIXER_CONTROLS ( " SLIMTX3 " , MADERA_SLIMTX3MIX_INPUT_1_SOURCE ) ,
MADERA_MIXER_CONTROLS ( " SLIMTX4 " , MADERA_SLIMTX4MIX_INPUT_1_SOURCE ) ,
MADERA_MIXER_CONTROLS ( " SLIMTX5 " , MADERA_SLIMTX5MIX_INPUT_1_SOURCE ) ,
MADERA_MIXER_CONTROLS ( " SLIMTX6 " , MADERA_SLIMTX6MIX_INPUT_1_SOURCE ) ,
MADERA_GAINMUX_CONTROLS ( " SPDIF1TX1 " , MADERA_SPDIF1TX1MIX_INPUT_1_SOURCE ) ,
MADERA_GAINMUX_CONTROLS ( " SPDIF1TX2 " , MADERA_SPDIF1TX2MIX_INPUT_1_SOURCE ) ,
WM_ADSP_FW_CONTROL ( " DSP1 " , 0 ) ,
WM_ADSP_FW_CONTROL ( " DSP2 " , 1 ) ,
WM_ADSP_FW_CONTROL ( " DSP3 " , 2 ) ,
} ;
MADERA_MIXER_ENUMS ( EQ1 , MADERA_EQ1MIX_INPUT_1_SOURCE ) ;
MADERA_MIXER_ENUMS ( EQ2 , MADERA_EQ2MIX_INPUT_1_SOURCE ) ;
MADERA_MIXER_ENUMS ( EQ3 , MADERA_EQ3MIX_INPUT_1_SOURCE ) ;
MADERA_MIXER_ENUMS ( EQ4 , MADERA_EQ4MIX_INPUT_1_SOURCE ) ;
MADERA_MIXER_ENUMS ( DRC1L , MADERA_DRC1LMIX_INPUT_1_SOURCE ) ;
MADERA_MIXER_ENUMS ( DRC1R , MADERA_DRC1RMIX_INPUT_1_SOURCE ) ;
MADERA_MIXER_ENUMS ( DRC2L , MADERA_DRC2LMIX_INPUT_1_SOURCE ) ;
MADERA_MIXER_ENUMS ( DRC2R , MADERA_DRC2RMIX_INPUT_1_SOURCE ) ;
MADERA_MIXER_ENUMS ( LHPF1 , MADERA_HPLP1MIX_INPUT_1_SOURCE ) ;
MADERA_MIXER_ENUMS ( LHPF2 , MADERA_HPLP2MIX_INPUT_1_SOURCE ) ;
MADERA_MIXER_ENUMS ( LHPF3 , MADERA_HPLP3MIX_INPUT_1_SOURCE ) ;
MADERA_MIXER_ENUMS ( LHPF4 , MADERA_HPLP4MIX_INPUT_1_SOURCE ) ;
MADERA_MIXER_ENUMS ( DSP1L , MADERA_DSP1LMIX_INPUT_1_SOURCE ) ;
MADERA_MIXER_ENUMS ( DSP1R , MADERA_DSP1RMIX_INPUT_1_SOURCE ) ;
MADERA_DSP_AUX_ENUMS ( DSP1 , MADERA_DSP1AUX1MIX_INPUT_1_SOURCE ) ;
MADERA_MIXER_ENUMS ( DSP2L , MADERA_DSP2LMIX_INPUT_1_SOURCE ) ;
MADERA_MIXER_ENUMS ( DSP2R , MADERA_DSP2RMIX_INPUT_1_SOURCE ) ;
MADERA_DSP_AUX_ENUMS ( DSP2 , MADERA_DSP2AUX1MIX_INPUT_1_SOURCE ) ;
MADERA_MIXER_ENUMS ( DSP3L , MADERA_DSP3LMIX_INPUT_1_SOURCE ) ;
MADERA_MIXER_ENUMS ( DSP3R , MADERA_DSP3RMIX_INPUT_1_SOURCE ) ;
MADERA_DSP_AUX_ENUMS ( DSP3 , MADERA_DSP3AUX1MIX_INPUT_1_SOURCE ) ;
MADERA_MIXER_ENUMS ( PWM1 , MADERA_PWM1MIX_INPUT_1_SOURCE ) ;
MADERA_MIXER_ENUMS ( PWM2 , MADERA_PWM2MIX_INPUT_1_SOURCE ) ;
MADERA_MIXER_ENUMS ( OUT1L , MADERA_OUT1LMIX_INPUT_1_SOURCE ) ;
MADERA_MIXER_ENUMS ( OUT1R , MADERA_OUT1RMIX_INPUT_1_SOURCE ) ;
MADERA_MIXER_ENUMS ( SPKOUT , MADERA_OUT4LMIX_INPUT_1_SOURCE ) ;
MADERA_MIXER_ENUMS ( SPKDAT1L , MADERA_OUT5LMIX_INPUT_1_SOURCE ) ;
MADERA_MIXER_ENUMS ( SPKDAT1R , MADERA_OUT5RMIX_INPUT_1_SOURCE ) ;
MADERA_MIXER_ENUMS ( AIF1TX1 , MADERA_AIF1TX1MIX_INPUT_1_SOURCE ) ;
MADERA_MIXER_ENUMS ( AIF1TX2 , MADERA_AIF1TX2MIX_INPUT_1_SOURCE ) ;
MADERA_MIXER_ENUMS ( AIF1TX3 , MADERA_AIF1TX3MIX_INPUT_1_SOURCE ) ;
MADERA_MIXER_ENUMS ( AIF1TX4 , MADERA_AIF1TX4MIX_INPUT_1_SOURCE ) ;
MADERA_MIXER_ENUMS ( AIF1TX5 , MADERA_AIF1TX5MIX_INPUT_1_SOURCE ) ;
MADERA_MIXER_ENUMS ( AIF1TX6 , MADERA_AIF1TX6MIX_INPUT_1_SOURCE ) ;
MADERA_MIXER_ENUMS ( AIF2TX1 , MADERA_AIF2TX1MIX_INPUT_1_SOURCE ) ;
MADERA_MIXER_ENUMS ( AIF2TX2 , MADERA_AIF2TX2MIX_INPUT_1_SOURCE ) ;
MADERA_MIXER_ENUMS ( AIF3TX1 , MADERA_AIF3TX1MIX_INPUT_1_SOURCE ) ;
MADERA_MIXER_ENUMS ( AIF3TX2 , MADERA_AIF3TX2MIX_INPUT_1_SOURCE ) ;
MADERA_MIXER_ENUMS ( SLIMTX1 , MADERA_SLIMTX1MIX_INPUT_1_SOURCE ) ;
MADERA_MIXER_ENUMS ( SLIMTX2 , MADERA_SLIMTX2MIX_INPUT_1_SOURCE ) ;
MADERA_MIXER_ENUMS ( SLIMTX3 , MADERA_SLIMTX3MIX_INPUT_1_SOURCE ) ;
MADERA_MIXER_ENUMS ( SLIMTX4 , MADERA_SLIMTX4MIX_INPUT_1_SOURCE ) ;
MADERA_MIXER_ENUMS ( SLIMTX5 , MADERA_SLIMTX5MIX_INPUT_1_SOURCE ) ;
MADERA_MIXER_ENUMS ( SLIMTX6 , MADERA_SLIMTX6MIX_INPUT_1_SOURCE ) ;
MADERA_MUX_ENUMS ( SPD1TX1 , MADERA_SPDIF1TX1MIX_INPUT_1_SOURCE ) ;
MADERA_MUX_ENUMS ( SPD1TX2 , MADERA_SPDIF1TX2MIX_INPUT_1_SOURCE ) ;
MADERA_MUX_ENUMS ( ISRC1INT1 , MADERA_ISRC1INT1MIX_INPUT_1_SOURCE ) ;
MADERA_MUX_ENUMS ( ISRC1INT2 , MADERA_ISRC1INT2MIX_INPUT_1_SOURCE ) ;
MADERA_MUX_ENUMS ( ISRC1INT3 , MADERA_ISRC1INT3MIX_INPUT_1_SOURCE ) ;
MADERA_MUX_ENUMS ( ISRC1INT4 , MADERA_ISRC1INT4MIX_INPUT_1_SOURCE ) ;
MADERA_MUX_ENUMS ( ISRC1DEC1 , MADERA_ISRC1DEC1MIX_INPUT_1_SOURCE ) ;
MADERA_MUX_ENUMS ( ISRC1DEC2 , MADERA_ISRC1DEC2MIX_INPUT_1_SOURCE ) ;
MADERA_MUX_ENUMS ( ISRC1DEC3 , MADERA_ISRC1DEC3MIX_INPUT_1_SOURCE ) ;
MADERA_MUX_ENUMS ( ISRC1DEC4 , MADERA_ISRC1DEC4MIX_INPUT_1_SOURCE ) ;
MADERA_MUX_ENUMS ( ISRC2INT1 , MADERA_ISRC2INT1MIX_INPUT_1_SOURCE ) ;
MADERA_MUX_ENUMS ( ISRC2INT2 , MADERA_ISRC2INT2MIX_INPUT_1_SOURCE ) ;
MADERA_MUX_ENUMS ( ISRC2INT3 , MADERA_ISRC2INT3MIX_INPUT_1_SOURCE ) ;
MADERA_MUX_ENUMS ( ISRC2INT4 , MADERA_ISRC2INT4MIX_INPUT_1_SOURCE ) ;
MADERA_MUX_ENUMS ( ISRC2DEC1 , MADERA_ISRC2DEC1MIX_INPUT_1_SOURCE ) ;
MADERA_MUX_ENUMS ( ISRC2DEC2 , MADERA_ISRC2DEC2MIX_INPUT_1_SOURCE ) ;
MADERA_MUX_ENUMS ( ISRC2DEC3 , MADERA_ISRC2DEC3MIX_INPUT_1_SOURCE ) ;
MADERA_MUX_ENUMS ( ISRC2DEC4 , MADERA_ISRC2DEC4MIX_INPUT_1_SOURCE ) ;
static const char * const cs47l35_aec_loopback_texts [ ] = {
" HPOUT1L " , " HPOUT1R " , " SPKOUT " , " SPKDAT1L " , " SPKDAT1R " ,
} ;
static const unsigned int cs47l35_aec_loopback_values [ ] = {
0 , 1 , 6 , 8 , 9 ,
} ;
static const struct soc_enum cs47l35_aec1_loopback =
SOC_VALUE_ENUM_SINGLE ( MADERA_DAC_AEC_CONTROL_1 ,
MADERA_AEC1_LOOPBACK_SRC_SHIFT , 0xf ,
ARRAY_SIZE ( cs47l35_aec_loopback_texts ) ,
cs47l35_aec_loopback_texts ,
cs47l35_aec_loopback_values ) ;
static const struct soc_enum cs47l35_aec2_loopback =
SOC_VALUE_ENUM_SINGLE ( MADERA_DAC_AEC_CONTROL_2 ,
MADERA_AEC2_LOOPBACK_SRC_SHIFT , 0xf ,
ARRAY_SIZE ( cs47l35_aec_loopback_texts ) ,
cs47l35_aec_loopback_texts ,
cs47l35_aec_loopback_values ) ;
static const struct snd_kcontrol_new cs47l35_aec_loopback_mux [ ] = {
SOC_DAPM_ENUM ( " AEC1 Loopback " , cs47l35_aec1_loopback ) ,
SOC_DAPM_ENUM ( " AEC2 Loopback " , cs47l35_aec2_loopback ) ,
} ;
static const struct snd_soc_dapm_widget cs47l35_dapm_widgets [ ] = {
SND_SOC_DAPM_SUPPLY ( " SYSCLK " , MADERA_SYSTEM_CLOCK_1 , MADERA_SYSCLK_ENA_SHIFT ,
0 , madera_sysclk_ev ,
2019-12-30 17:35:16 +03:00
SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD ) ,
2019-06-19 16:41:57 +03:00
SND_SOC_DAPM_SUPPLY ( " OPCLK " , MADERA_OUTPUT_SYSTEM_CLOCK ,
MADERA_OPCLK_ENA_SHIFT , 0 , NULL , 0 ) ,
2019-07-22 12:35:16 +03:00
SND_SOC_DAPM_SUPPLY ( " DSPCLK " , MADERA_DSP_CLOCK_1 , MADERA_DSP_CLK_ENA_SHIFT ,
2019-12-30 17:35:16 +03:00
0 , madera_clk_ev ,
SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD ) ,
2019-06-19 16:41:57 +03:00
SND_SOC_DAPM_REGULATOR_SUPPLY ( " DBVDD2 " , 0 , 0 ) ,
SND_SOC_DAPM_REGULATOR_SUPPLY ( " CPVDD1 " , 20 , 0 ) ,
SND_SOC_DAPM_REGULATOR_SUPPLY ( " CPVDD2 " , 20 , 0 ) ,
SND_SOC_DAPM_REGULATOR_SUPPLY ( " MICVDD " , 0 , SND_SOC_DAPM_REGULATOR_BYPASS ) ,
SND_SOC_DAPM_REGULATOR_SUPPLY ( " SPKVDD " , 0 , 0 ) ,
SND_SOC_DAPM_SUPPLY ( " MICBIAS1 " , MADERA_MIC_BIAS_CTRL_1 ,
MADERA_MICB1_ENA_SHIFT , 0 , NULL , 0 ) ,
SND_SOC_DAPM_SUPPLY ( " MICBIAS2 " , MADERA_MIC_BIAS_CTRL_2 ,
MADERA_MICB1_ENA_SHIFT , 0 , NULL , 0 ) ,
SND_SOC_DAPM_SUPPLY ( " MICBIAS1A " , MADERA_MIC_BIAS_CTRL_5 ,
MADERA_MICB1A_ENA_SHIFT , 0 , NULL , 0 ) ,
SND_SOC_DAPM_SUPPLY ( " MICBIAS1B " , MADERA_MIC_BIAS_CTRL_5 ,
MADERA_MICB1B_ENA_SHIFT , 0 , NULL , 0 ) ,
SND_SOC_DAPM_SUPPLY ( " MICBIAS2A " , MADERA_MIC_BIAS_CTRL_6 ,
MADERA_MICB2A_ENA_SHIFT , 0 , NULL , 0 ) ,
SND_SOC_DAPM_SUPPLY ( " MICBIAS2B " , MADERA_MIC_BIAS_CTRL_6 ,
MADERA_MICB2B_ENA_SHIFT , 0 , NULL , 0 ) ,
SND_SOC_DAPM_SUPPLY ( " FXCLK " , SND_SOC_NOPM ,
MADERA_DOM_GRP_FX , 0 ,
madera_domain_clk_ev ,
SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD ) ,
SND_SOC_DAPM_SUPPLY ( " ISRC1CLK " , SND_SOC_NOPM ,
MADERA_DOM_GRP_ISRC1 , 0 ,
madera_domain_clk_ev ,
SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD ) ,
SND_SOC_DAPM_SUPPLY ( " ISRC2CLK " , SND_SOC_NOPM ,
MADERA_DOM_GRP_ISRC2 , 0 ,
madera_domain_clk_ev ,
SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD ) ,
SND_SOC_DAPM_SUPPLY ( " OUTCLK " , SND_SOC_NOPM ,
MADERA_DOM_GRP_OUT , 0 ,
madera_domain_clk_ev ,
SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD ) ,
SND_SOC_DAPM_SUPPLY ( " SPDCLK " , SND_SOC_NOPM ,
MADERA_DOM_GRP_SPD , 0 ,
madera_domain_clk_ev ,
SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD ) ,
SND_SOC_DAPM_SUPPLY ( " DSP1CLK " , SND_SOC_NOPM ,
MADERA_DOM_GRP_DSP1 , 0 ,
madera_domain_clk_ev ,
SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD ) ,
SND_SOC_DAPM_SUPPLY ( " DSP2CLK " , SND_SOC_NOPM ,
MADERA_DOM_GRP_DSP2 , 0 ,
madera_domain_clk_ev ,
SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD ) ,
SND_SOC_DAPM_SUPPLY ( " DSP3CLK " , SND_SOC_NOPM ,
MADERA_DOM_GRP_DSP3 , 0 ,
madera_domain_clk_ev ,
SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD ) ,
SND_SOC_DAPM_SUPPLY ( " AIF1TXCLK " , SND_SOC_NOPM ,
MADERA_DOM_GRP_AIF1 , 0 ,
madera_domain_clk_ev ,
SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD ) ,
SND_SOC_DAPM_SUPPLY ( " AIF2TXCLK " , SND_SOC_NOPM ,
MADERA_DOM_GRP_AIF2 , 0 ,
madera_domain_clk_ev ,
SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD ) ,
SND_SOC_DAPM_SUPPLY ( " AIF3TXCLK " , SND_SOC_NOPM ,
MADERA_DOM_GRP_AIF3 , 0 ,
madera_domain_clk_ev ,
SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD ) ,
SND_SOC_DAPM_SUPPLY ( " SLIMBUSCLK " , SND_SOC_NOPM ,
MADERA_DOM_GRP_SLIMBUS , 0 ,
madera_domain_clk_ev ,
SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD ) ,
SND_SOC_DAPM_SUPPLY ( " PWMCLK " , SND_SOC_NOPM ,
MADERA_DOM_GRP_PWM , 0 ,
madera_domain_clk_ev ,
SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD ) ,
SND_SOC_DAPM_SIGGEN ( " TONE " ) ,
SND_SOC_DAPM_SIGGEN ( " NOISE " ) ,
SND_SOC_DAPM_INPUT ( " IN1ALN " ) ,
SND_SOC_DAPM_INPUT ( " IN1ALP " ) ,
SND_SOC_DAPM_INPUT ( " IN1BLN " ) ,
SND_SOC_DAPM_INPUT ( " IN1BLP " ) ,
SND_SOC_DAPM_INPUT ( " IN1ARN " ) ,
SND_SOC_DAPM_INPUT ( " IN1ARP " ) ,
SND_SOC_DAPM_INPUT ( " IN1BRN " ) ,
SND_SOC_DAPM_INPUT ( " IN1BRP " ) ,
SND_SOC_DAPM_INPUT ( " IN2LN " ) ,
SND_SOC_DAPM_INPUT ( " IN2LP " ) ,
SND_SOC_DAPM_INPUT ( " IN2RN " ) ,
SND_SOC_DAPM_INPUT ( " IN2RP " ) ,
SND_SOC_DAPM_MUX ( " IN1L Analog Mux " , SND_SOC_NOPM , 0 , 0 , & madera_inmux [ 0 ] ) ,
SND_SOC_DAPM_MUX ( " IN1R Analog Mux " , SND_SOC_NOPM , 0 , 0 , & madera_inmux [ 1 ] ) ,
SND_SOC_DAPM_MUX ( " IN1L Mode " , SND_SOC_NOPM , 0 , 0 , & madera_inmode [ 0 ] ) ,
SND_SOC_DAPM_MUX ( " IN1R Mode " , SND_SOC_NOPM , 0 , 0 , & madera_inmode [ 0 ] ) ,
SND_SOC_DAPM_MUX ( " IN2L Mode " , SND_SOC_NOPM , 0 , 0 , & madera_inmode [ 1 ] ) ,
SND_SOC_DAPM_MUX ( " IN2R Mode " , SND_SOC_NOPM , 0 , 0 , & madera_inmode [ 1 ] ) ,
SND_SOC_DAPM_OUTPUT ( " DRC1 Signal Activity " ) ,
SND_SOC_DAPM_OUTPUT ( " DRC2 Signal Activity " ) ,
SND_SOC_DAPM_OUTPUT ( " DSP Trigger Out " ) ,
SND_SOC_DAPM_DEMUX ( " HPOUT1 Demux " , SND_SOC_NOPM , 0 , 0 , & cs47l35_outdemux ) ,
2020-01-14 19:18:41 +03:00
SND_SOC_DAPM_MUX ( " HPOUT1 Mono Mux " , SND_SOC_NOPM , 0 , 0 , & cs47l35_outdemux ) ,
2019-06-19 16:41:57 +03:00
SND_SOC_DAPM_PGA ( " PWM1 Driver " , MADERA_PWM_DRIVE_1 , MADERA_PWM1_ENA_SHIFT ,
0 , NULL , 0 ) ,
SND_SOC_DAPM_PGA ( " PWM2 Driver " , MADERA_PWM_DRIVE_1 , MADERA_PWM2_ENA_SHIFT ,
0 , NULL , 0 ) ,
SND_SOC_DAPM_AIF_OUT ( " AIF1TX1 " , NULL , 0 ,
MADERA_AIF1_TX_ENABLES , MADERA_AIF1TX1_ENA_SHIFT , 0 ) ,
2020-07-28 17:41:41 +03:00
SND_SOC_DAPM_AIF_OUT ( " AIF1TX2 " , NULL , 1 ,
2019-06-19 16:41:57 +03:00
MADERA_AIF1_TX_ENABLES , MADERA_AIF1TX2_ENA_SHIFT , 0 ) ,
2020-07-28 17:41:41 +03:00
SND_SOC_DAPM_AIF_OUT ( " AIF1TX3 " , NULL , 2 ,
2019-06-19 16:41:57 +03:00
MADERA_AIF1_TX_ENABLES , MADERA_AIF1TX3_ENA_SHIFT , 0 ) ,
2020-07-28 17:41:41 +03:00
SND_SOC_DAPM_AIF_OUT ( " AIF1TX4 " , NULL , 3 ,
2019-06-19 16:41:57 +03:00
MADERA_AIF1_TX_ENABLES , MADERA_AIF1TX4_ENA_SHIFT , 0 ) ,
2020-07-28 17:41:41 +03:00
SND_SOC_DAPM_AIF_OUT ( " AIF1TX5 " , NULL , 4 ,
2019-06-19 16:41:57 +03:00
MADERA_AIF1_TX_ENABLES , MADERA_AIF1TX5_ENA_SHIFT , 0 ) ,
2020-07-28 17:41:41 +03:00
SND_SOC_DAPM_AIF_OUT ( " AIF1TX6 " , NULL , 5 ,
2019-06-19 16:41:57 +03:00
MADERA_AIF1_TX_ENABLES , MADERA_AIF1TX6_ENA_SHIFT , 0 ) ,
SND_SOC_DAPM_AIF_OUT ( " AIF2TX1 " , NULL , 0 ,
MADERA_AIF2_TX_ENABLES , MADERA_AIF2TX1_ENA_SHIFT , 0 ) ,
2020-07-28 17:41:41 +03:00
SND_SOC_DAPM_AIF_OUT ( " AIF2TX2 " , NULL , 1 ,
2019-06-19 16:41:57 +03:00
MADERA_AIF2_TX_ENABLES , MADERA_AIF2TX2_ENA_SHIFT , 0 ) ,
SND_SOC_DAPM_AIF_OUT ( " AIF3TX1 " , NULL , 0 ,
MADERA_AIF3_TX_ENABLES , MADERA_AIF3TX1_ENA_SHIFT , 0 ) ,
2020-07-28 17:41:41 +03:00
SND_SOC_DAPM_AIF_OUT ( " AIF3TX2 " , NULL , 1 ,
2019-06-19 16:41:57 +03:00
MADERA_AIF3_TX_ENABLES , MADERA_AIF3TX2_ENA_SHIFT , 0 ) ,
SND_SOC_DAPM_AIF_OUT ( " SLIMTX1 " , NULL , 0 ,
MADERA_SLIMBUS_TX_CHANNEL_ENABLE ,
MADERA_SLIMTX1_ENA_SHIFT , 0 ) ,
2020-07-28 17:41:41 +03:00
SND_SOC_DAPM_AIF_OUT ( " SLIMTX2 " , NULL , 1 ,
2019-06-19 16:41:57 +03:00
MADERA_SLIMBUS_TX_CHANNEL_ENABLE ,
MADERA_SLIMTX2_ENA_SHIFT , 0 ) ,
2020-07-28 17:41:41 +03:00
SND_SOC_DAPM_AIF_OUT ( " SLIMTX3 " , NULL , 2 ,
2019-06-19 16:41:57 +03:00
MADERA_SLIMBUS_TX_CHANNEL_ENABLE ,
MADERA_SLIMTX3_ENA_SHIFT , 0 ) ,
2020-07-28 17:41:41 +03:00
SND_SOC_DAPM_AIF_OUT ( " SLIMTX4 " , NULL , 3 ,
2019-06-19 16:41:57 +03:00
MADERA_SLIMBUS_TX_CHANNEL_ENABLE ,
MADERA_SLIMTX4_ENA_SHIFT , 0 ) ,
2020-07-28 17:41:41 +03:00
SND_SOC_DAPM_AIF_OUT ( " SLIMTX5 " , NULL , 4 ,
2019-06-19 16:41:57 +03:00
MADERA_SLIMBUS_TX_CHANNEL_ENABLE ,
MADERA_SLIMTX5_ENA_SHIFT , 0 ) ,
2020-07-28 17:41:41 +03:00
SND_SOC_DAPM_AIF_OUT ( " SLIMTX6 " , NULL , 5 ,
2019-06-19 16:41:57 +03:00
MADERA_SLIMBUS_TX_CHANNEL_ENABLE ,
MADERA_SLIMTX6_ENA_SHIFT , 0 ) ,
SND_SOC_DAPM_PGA_E ( " OUT1L " , SND_SOC_NOPM ,
MADERA_OUT1L_ENA_SHIFT , 0 , NULL , 0 , cs47l35_hp_ev ,
SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD |
SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU ) ,
SND_SOC_DAPM_PGA_E ( " OUT1R " , SND_SOC_NOPM ,
MADERA_OUT1R_ENA_SHIFT , 0 , NULL , 0 , cs47l35_hp_ev ,
SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD |
SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU ) ,
SND_SOC_DAPM_PGA_E ( " OUT4L " , SND_SOC_NOPM ,
MADERA_OUT4L_ENA_SHIFT , 0 , NULL , 0 , madera_spk_ev ,
SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD ) ,
SND_SOC_DAPM_PGA_E ( " OUT5L " , MADERA_OUTPUT_ENABLES_1 ,
MADERA_OUT5L_ENA_SHIFT , 0 , NULL , 0 , madera_out_ev ,
SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU ) ,
SND_SOC_DAPM_PGA_E ( " OUT5R " , MADERA_OUTPUT_ENABLES_1 ,
MADERA_OUT5R_ENA_SHIFT , 0 , NULL , 0 , madera_out_ev ,
SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU ) ,
SND_SOC_DAPM_PGA ( " SPD1TX1 " , MADERA_SPD1_TX_CONTROL ,
MADERA_SPD1_VAL1_SHIFT , 0 , NULL , 0 ) ,
SND_SOC_DAPM_PGA ( " SPD1TX2 " , MADERA_SPD1_TX_CONTROL ,
MADERA_SPD1_VAL2_SHIFT , 0 , NULL , 0 ) ,
SND_SOC_DAPM_OUT_DRV ( " SPD1 " , MADERA_SPD1_TX_CONTROL ,
MADERA_SPD1_ENA_SHIFT , 0 , NULL , 0 ) ,
/*
* Input mux widgets arranged in order of sources in MADERA_MIXER_INPUT_ROUTES
* to take advantage of cache lookup in DAPM
*/
SND_SOC_DAPM_PGA ( " Noise Generator " , MADERA_COMFORT_NOISE_GENERATOR ,
MADERA_NOISE_GEN_ENA_SHIFT , 0 , NULL , 0 ) ,
SND_SOC_DAPM_PGA ( " Tone Generator 1 " , MADERA_TONE_GENERATOR_1 ,
MADERA_TONE1_ENA_SHIFT , 0 , NULL , 0 ) ,
SND_SOC_DAPM_PGA ( " Tone Generator 2 " , MADERA_TONE_GENERATOR_1 ,
MADERA_TONE2_ENA_SHIFT , 0 , NULL , 0 ) ,
SND_SOC_DAPM_SIGGEN ( " HAPTICS " ) ,
SND_SOC_DAPM_MUX ( " AEC1 Loopback " , MADERA_DAC_AEC_CONTROL_1 ,
MADERA_AEC1_LOOPBACK_ENA_SHIFT , 0 ,
& cs47l35_aec_loopback_mux [ 0 ] ) ,
SND_SOC_DAPM_MUX ( " AEC2 Loopback " , MADERA_DAC_AEC_CONTROL_2 ,
MADERA_AEC2_LOOPBACK_ENA_SHIFT , 0 ,
& cs47l35_aec_loopback_mux [ 1 ] ) ,
SND_SOC_DAPM_PGA_E ( " IN1L " , MADERA_INPUT_ENABLES , MADERA_IN1L_ENA_SHIFT ,
0 , NULL , 0 , madera_in_ev ,
SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD |
SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU ) ,
SND_SOC_DAPM_PGA_E ( " IN1R " , MADERA_INPUT_ENABLES , MADERA_IN1R_ENA_SHIFT ,
0 , NULL , 0 , madera_in_ev ,
SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD |
SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU ) ,
SND_SOC_DAPM_PGA_E ( " IN2L " , MADERA_INPUT_ENABLES , MADERA_IN2L_ENA_SHIFT ,
0 , NULL , 0 , madera_in_ev ,
SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD |
SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU ) ,
SND_SOC_DAPM_PGA_E ( " IN2R " , MADERA_INPUT_ENABLES , MADERA_IN2R_ENA_SHIFT ,
0 , NULL , 0 , madera_in_ev ,
SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD |
SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU ) ,
SND_SOC_DAPM_AIF_IN ( " AIF1RX1 " , NULL , 0 ,
MADERA_AIF1_RX_ENABLES , MADERA_AIF1RX1_ENA_SHIFT , 0 ) ,
2020-07-28 17:41:41 +03:00
SND_SOC_DAPM_AIF_IN ( " AIF1RX2 " , NULL , 1 ,
2019-06-19 16:41:57 +03:00
MADERA_AIF1_RX_ENABLES , MADERA_AIF1RX2_ENA_SHIFT , 0 ) ,
2020-07-28 17:41:41 +03:00
SND_SOC_DAPM_AIF_IN ( " AIF1RX3 " , NULL , 2 ,
2019-06-19 16:41:57 +03:00
MADERA_AIF1_RX_ENABLES , MADERA_AIF1RX3_ENA_SHIFT , 0 ) ,
2020-07-28 17:41:41 +03:00
SND_SOC_DAPM_AIF_IN ( " AIF1RX4 " , NULL , 3 ,
2019-06-19 16:41:57 +03:00
MADERA_AIF1_RX_ENABLES , MADERA_AIF1RX4_ENA_SHIFT , 0 ) ,
2020-07-28 17:41:41 +03:00
SND_SOC_DAPM_AIF_IN ( " AIF1RX5 " , NULL , 4 ,
2019-06-19 16:41:57 +03:00
MADERA_AIF1_RX_ENABLES , MADERA_AIF1RX5_ENA_SHIFT , 0 ) ,
2020-07-28 17:41:41 +03:00
SND_SOC_DAPM_AIF_IN ( " AIF1RX6 " , NULL , 5 ,
2019-06-19 16:41:57 +03:00
MADERA_AIF1_RX_ENABLES , MADERA_AIF1RX6_ENA_SHIFT , 0 ) ,
SND_SOC_DAPM_AIF_IN ( " AIF2RX1 " , NULL , 0 ,
MADERA_AIF2_RX_ENABLES , MADERA_AIF2RX1_ENA_SHIFT , 0 ) ,
2020-07-28 17:41:41 +03:00
SND_SOC_DAPM_AIF_IN ( " AIF2RX2 " , NULL , 1 ,
2019-06-19 16:41:57 +03:00
MADERA_AIF2_RX_ENABLES , MADERA_AIF2RX2_ENA_SHIFT , 0 ) ,
SND_SOC_DAPM_AIF_IN ( " AIF3RX1 " , NULL , 0 ,
MADERA_AIF3_RX_ENABLES , MADERA_AIF3RX1_ENA_SHIFT , 0 ) ,
2020-07-28 17:41:41 +03:00
SND_SOC_DAPM_AIF_IN ( " AIF3RX2 " , NULL , 1 ,
2019-06-19 16:41:57 +03:00
MADERA_AIF3_RX_ENABLES , MADERA_AIF3RX2_ENA_SHIFT , 0 ) ,
SND_SOC_DAPM_AIF_IN ( " SLIMRX1 " , NULL , 0 ,
MADERA_SLIMBUS_RX_CHANNEL_ENABLE ,
MADERA_SLIMRX1_ENA_SHIFT , 0 ) ,
2020-07-28 17:41:41 +03:00
SND_SOC_DAPM_AIF_IN ( " SLIMRX2 " , NULL , 1 ,
2019-06-19 16:41:57 +03:00
MADERA_SLIMBUS_RX_CHANNEL_ENABLE ,
MADERA_SLIMRX2_ENA_SHIFT , 0 ) ,
2020-07-28 17:41:41 +03:00
SND_SOC_DAPM_AIF_IN ( " SLIMRX3 " , NULL , 2 ,
2019-06-19 16:41:57 +03:00
MADERA_SLIMBUS_RX_CHANNEL_ENABLE ,
MADERA_SLIMRX3_ENA_SHIFT , 0 ) ,
2020-07-28 17:41:41 +03:00
SND_SOC_DAPM_AIF_IN ( " SLIMRX4 " , NULL , 3 ,
2019-06-19 16:41:57 +03:00
MADERA_SLIMBUS_RX_CHANNEL_ENABLE ,
MADERA_SLIMRX4_ENA_SHIFT , 0 ) ,
2020-07-28 17:41:41 +03:00
SND_SOC_DAPM_AIF_IN ( " SLIMRX5 " , NULL , 4 ,
2019-06-19 16:41:57 +03:00
MADERA_SLIMBUS_RX_CHANNEL_ENABLE ,
MADERA_SLIMRX5_ENA_SHIFT , 0 ) ,
2020-07-28 17:41:41 +03:00
SND_SOC_DAPM_AIF_IN ( " SLIMRX6 " , NULL , 5 ,
2019-06-19 16:41:57 +03:00
MADERA_SLIMBUS_RX_CHANNEL_ENABLE ,
MADERA_SLIMRX6_ENA_SHIFT , 0 ) ,
SND_SOC_DAPM_PGA ( " EQ1 " , MADERA_EQ1_1 , MADERA_EQ1_ENA_SHIFT , 0 , NULL , 0 ) ,
SND_SOC_DAPM_PGA ( " EQ2 " , MADERA_EQ2_1 , MADERA_EQ2_ENA_SHIFT , 0 , NULL , 0 ) ,
SND_SOC_DAPM_PGA ( " EQ3 " , MADERA_EQ3_1 , MADERA_EQ3_ENA_SHIFT , 0 , NULL , 0 ) ,
SND_SOC_DAPM_PGA ( " EQ4 " , MADERA_EQ4_1 , MADERA_EQ4_ENA_SHIFT , 0 , NULL , 0 ) ,
SND_SOC_DAPM_PGA ( " DRC1L " , MADERA_DRC1_CTRL1 , MADERA_DRC1L_ENA_SHIFT , 0 ,
NULL , 0 ) ,
SND_SOC_DAPM_PGA ( " DRC1R " , MADERA_DRC1_CTRL1 , MADERA_DRC1R_ENA_SHIFT , 0 ,
NULL , 0 ) ,
SND_SOC_DAPM_PGA ( " DRC2L " , MADERA_DRC2_CTRL1 , MADERA_DRC2L_ENA_SHIFT , 0 ,
NULL , 0 ) ,
SND_SOC_DAPM_PGA ( " DRC2R " , MADERA_DRC2_CTRL1 , MADERA_DRC2R_ENA_SHIFT , 0 ,
NULL , 0 ) ,
SND_SOC_DAPM_PGA ( " LHPF1 " , MADERA_HPLPF1_1 , MADERA_LHPF1_ENA_SHIFT , 0 ,
NULL , 0 ) ,
SND_SOC_DAPM_PGA ( " LHPF2 " , MADERA_HPLPF2_1 , MADERA_LHPF2_ENA_SHIFT , 0 ,
NULL , 0 ) ,
SND_SOC_DAPM_PGA ( " LHPF3 " , MADERA_HPLPF3_1 , MADERA_LHPF3_ENA_SHIFT , 0 ,
NULL , 0 ) ,
SND_SOC_DAPM_PGA ( " LHPF4 " , MADERA_HPLPF4_1 , MADERA_LHPF4_ENA_SHIFT , 0 ,
NULL , 0 ) ,
SND_SOC_DAPM_PGA ( " ISRC1DEC1 " , MADERA_ISRC_1_CTRL_3 ,
MADERA_ISRC1_DEC1_ENA_SHIFT , 0 , NULL , 0 ) ,
SND_SOC_DAPM_PGA ( " ISRC1DEC2 " , MADERA_ISRC_1_CTRL_3 ,
MADERA_ISRC1_DEC2_ENA_SHIFT , 0 , NULL , 0 ) ,
SND_SOC_DAPM_PGA ( " ISRC1DEC3 " , MADERA_ISRC_1_CTRL_3 ,
MADERA_ISRC1_DEC3_ENA_SHIFT , 0 , NULL , 0 ) ,
SND_SOC_DAPM_PGA ( " ISRC1DEC4 " , MADERA_ISRC_1_CTRL_3 ,
MADERA_ISRC1_DEC4_ENA_SHIFT , 0 , NULL , 0 ) ,
SND_SOC_DAPM_PGA ( " ISRC1INT1 " , MADERA_ISRC_1_CTRL_3 ,
MADERA_ISRC1_INT1_ENA_SHIFT , 0 , NULL , 0 ) ,
SND_SOC_DAPM_PGA ( " ISRC1INT2 " , MADERA_ISRC_1_CTRL_3 ,
MADERA_ISRC1_INT2_ENA_SHIFT , 0 , NULL , 0 ) ,
SND_SOC_DAPM_PGA ( " ISRC1INT3 " , MADERA_ISRC_1_CTRL_3 ,
MADERA_ISRC1_INT3_ENA_SHIFT , 0 , NULL , 0 ) ,
SND_SOC_DAPM_PGA ( " ISRC1INT4 " , MADERA_ISRC_1_CTRL_3 ,
MADERA_ISRC1_INT4_ENA_SHIFT , 0 , NULL , 0 ) ,
SND_SOC_DAPM_PGA ( " ISRC2DEC1 " , MADERA_ISRC_2_CTRL_3 ,
MADERA_ISRC2_DEC1_ENA_SHIFT , 0 , NULL , 0 ) ,
SND_SOC_DAPM_PGA ( " ISRC2DEC2 " , MADERA_ISRC_2_CTRL_3 ,
MADERA_ISRC2_DEC2_ENA_SHIFT , 0 , NULL , 0 ) ,
SND_SOC_DAPM_PGA ( " ISRC2DEC3 " , MADERA_ISRC_2_CTRL_3 ,
MADERA_ISRC2_DEC3_ENA_SHIFT , 0 , NULL , 0 ) ,
SND_SOC_DAPM_PGA ( " ISRC2DEC4 " , MADERA_ISRC_2_CTRL_3 ,
MADERA_ISRC2_DEC4_ENA_SHIFT , 0 , NULL , 0 ) ,
SND_SOC_DAPM_PGA ( " ISRC2INT1 " , MADERA_ISRC_2_CTRL_3 ,
MADERA_ISRC2_INT1_ENA_SHIFT , 0 , NULL , 0 ) ,
SND_SOC_DAPM_PGA ( " ISRC2INT2 " , MADERA_ISRC_2_CTRL_3 ,
MADERA_ISRC2_INT2_ENA_SHIFT , 0 , NULL , 0 ) ,
SND_SOC_DAPM_PGA ( " ISRC2INT3 " , MADERA_ISRC_2_CTRL_3 ,
MADERA_ISRC2_INT3_ENA_SHIFT , 0 , NULL , 0 ) ,
SND_SOC_DAPM_PGA ( " ISRC2INT4 " , MADERA_ISRC_2_CTRL_3 ,
MADERA_ISRC2_INT4_ENA_SHIFT , 0 , NULL , 0 ) ,
WM_ADSP2 ( " DSP1 " , 0 , cs47l35_adsp_power_ev ) ,
WM_ADSP2 ( " DSP2 " , 1 , cs47l35_adsp_power_ev ) ,
WM_ADSP2 ( " DSP3 " , 2 , cs47l35_adsp_power_ev ) ,
/* End of ordered input mux widgets */
MADERA_MIXER_WIDGETS ( EQ1 , " EQ1 " ) ,
MADERA_MIXER_WIDGETS ( EQ2 , " EQ2 " ) ,
MADERA_MIXER_WIDGETS ( EQ3 , " EQ3 " ) ,
MADERA_MIXER_WIDGETS ( EQ4 , " EQ4 " ) ,
MADERA_MIXER_WIDGETS ( DRC1L , " DRC1L " ) ,
MADERA_MIXER_WIDGETS ( DRC1R , " DRC1R " ) ,
MADERA_MIXER_WIDGETS ( DRC2L , " DRC2L " ) ,
MADERA_MIXER_WIDGETS ( DRC2R , " DRC2R " ) ,
SND_SOC_DAPM_SWITCH ( " DRC1 Activity Output " , SND_SOC_NOPM , 0 , 0 ,
& madera_drc_activity_output_mux [ 0 ] ) ,
SND_SOC_DAPM_SWITCH ( " DRC2 Activity Output " , SND_SOC_NOPM , 0 , 0 ,
& madera_drc_activity_output_mux [ 1 ] ) ,
MADERA_MIXER_WIDGETS ( LHPF1 , " LHPF1 " ) ,
MADERA_MIXER_WIDGETS ( LHPF2 , " LHPF2 " ) ,
MADERA_MIXER_WIDGETS ( LHPF3 , " LHPF3 " ) ,
MADERA_MIXER_WIDGETS ( LHPF4 , " LHPF4 " ) ,
MADERA_MIXER_WIDGETS ( PWM1 , " PWM1 " ) ,
MADERA_MIXER_WIDGETS ( PWM2 , " PWM2 " ) ,
MADERA_MIXER_WIDGETS ( OUT1L , " HPOUT1L " ) ,
MADERA_MIXER_WIDGETS ( OUT1R , " HPOUT1R " ) ,
MADERA_MIXER_WIDGETS ( SPKOUT , " SPKOUT " ) ,
MADERA_MIXER_WIDGETS ( SPKDAT1L , " SPKDAT1L " ) ,
MADERA_MIXER_WIDGETS ( SPKDAT1R , " SPKDAT1R " ) ,
MADERA_MIXER_WIDGETS ( AIF1TX1 , " AIF1TX1 " ) ,
MADERA_MIXER_WIDGETS ( AIF1TX2 , " AIF1TX2 " ) ,
MADERA_MIXER_WIDGETS ( AIF1TX3 , " AIF1TX3 " ) ,
MADERA_MIXER_WIDGETS ( AIF1TX4 , " AIF1TX4 " ) ,
MADERA_MIXER_WIDGETS ( AIF1TX5 , " AIF1TX5 " ) ,
MADERA_MIXER_WIDGETS ( AIF1TX6 , " AIF1TX6 " ) ,
MADERA_MIXER_WIDGETS ( AIF2TX1 , " AIF2TX1 " ) ,
MADERA_MIXER_WIDGETS ( AIF2TX2 , " AIF2TX2 " ) ,
MADERA_MIXER_WIDGETS ( AIF3TX1 , " AIF3TX1 " ) ,
MADERA_MIXER_WIDGETS ( AIF3TX2 , " AIF3TX2 " ) ,
MADERA_MIXER_WIDGETS ( SLIMTX1 , " SLIMTX1 " ) ,
MADERA_MIXER_WIDGETS ( SLIMTX2 , " SLIMTX2 " ) ,
MADERA_MIXER_WIDGETS ( SLIMTX3 , " SLIMTX3 " ) ,
MADERA_MIXER_WIDGETS ( SLIMTX4 , " SLIMTX4 " ) ,
MADERA_MIXER_WIDGETS ( SLIMTX5 , " SLIMTX5 " ) ,
MADERA_MIXER_WIDGETS ( SLIMTX6 , " SLIMTX6 " ) ,
MADERA_MUX_WIDGETS ( SPD1TX1 , " SPDIF1TX1 " ) ,
MADERA_MUX_WIDGETS ( SPD1TX2 , " SPDIF1TX2 " ) ,
MADERA_DSP_WIDGETS ( DSP1 , " DSP1 " ) ,
MADERA_DSP_WIDGETS ( DSP2 , " DSP2 " ) ,
MADERA_DSP_WIDGETS ( DSP3 , " DSP3 " ) ,
SND_SOC_DAPM_SWITCH ( " DSP1 Trigger Output " , SND_SOC_NOPM , 0 , 0 ,
& madera_dsp_trigger_output_mux [ 0 ] ) ,
SND_SOC_DAPM_SWITCH ( " DSP2 Trigger Output " , SND_SOC_NOPM , 0 , 0 ,
& madera_dsp_trigger_output_mux [ 1 ] ) ,
SND_SOC_DAPM_SWITCH ( " DSP3 Trigger Output " , SND_SOC_NOPM , 0 , 0 ,
& madera_dsp_trigger_output_mux [ 2 ] ) ,
MADERA_MUX_WIDGETS ( ISRC1DEC1 , " ISRC1DEC1 " ) ,
MADERA_MUX_WIDGETS ( ISRC1DEC2 , " ISRC1DEC2 " ) ,
MADERA_MUX_WIDGETS ( ISRC1DEC3 , " ISRC1DEC3 " ) ,
MADERA_MUX_WIDGETS ( ISRC1DEC4 , " ISRC1DEC4 " ) ,
MADERA_MUX_WIDGETS ( ISRC1INT1 , " ISRC1INT1 " ) ,
MADERA_MUX_WIDGETS ( ISRC1INT2 , " ISRC1INT2 " ) ,
MADERA_MUX_WIDGETS ( ISRC1INT3 , " ISRC1INT3 " ) ,
MADERA_MUX_WIDGETS ( ISRC1INT4 , " ISRC1INT4 " ) ,
MADERA_MUX_WIDGETS ( ISRC2DEC1 , " ISRC2DEC1 " ) ,
MADERA_MUX_WIDGETS ( ISRC2DEC2 , " ISRC2DEC2 " ) ,
MADERA_MUX_WIDGETS ( ISRC2DEC3 , " ISRC2DEC3 " ) ,
MADERA_MUX_WIDGETS ( ISRC2DEC4 , " ISRC2DEC4 " ) ,
MADERA_MUX_WIDGETS ( ISRC2INT1 , " ISRC2INT1 " ) ,
MADERA_MUX_WIDGETS ( ISRC2INT2 , " ISRC2INT2 " ) ,
MADERA_MUX_WIDGETS ( ISRC2INT3 , " ISRC2INT3 " ) ,
MADERA_MUX_WIDGETS ( ISRC2INT4 , " ISRC2INT4 " ) ,
SND_SOC_DAPM_OUTPUT ( " HPOUTL " ) ,
SND_SOC_DAPM_OUTPUT ( " HPOUTR " ) ,
SND_SOC_DAPM_OUTPUT ( " EPOUTP " ) ,
SND_SOC_DAPM_OUTPUT ( " EPOUTN " ) ,
SND_SOC_DAPM_OUTPUT ( " SPKOUTN " ) ,
SND_SOC_DAPM_OUTPUT ( " SPKOUTP " ) ,
SND_SOC_DAPM_OUTPUT ( " SPKDAT1L " ) ,
SND_SOC_DAPM_OUTPUT ( " SPKDAT1R " ) ,
SND_SOC_DAPM_OUTPUT ( " SPDIF1 " ) ,
SND_SOC_DAPM_OUTPUT ( " MICSUPP " ) ,
} ;
# define MADERA_MIXER_INPUT_ROUTES(name) \
{ name , " Noise Generator " , " Noise Generator " } , \
{ name , " Tone Generator 1 " , " Tone Generator 1 " } , \
{ name , " Tone Generator 2 " , " Tone Generator 2 " } , \
{ name , " Haptics " , " HAPTICS " } , \
{ name , " AEC1 " , " AEC1 Loopback " } , \
{ name , " AEC2 " , " AEC2 Loopback " } , \
{ name , " IN1L " , " IN1L " } , \
{ name , " IN1R " , " IN1R " } , \
{ name , " IN2L " , " IN2L " } , \
{ name , " IN2R " , " IN2R " } , \
{ name , " AIF1RX1 " , " AIF1RX1 " } , \
{ name , " AIF1RX2 " , " AIF1RX2 " } , \
{ name , " AIF1RX3 " , " AIF1RX3 " } , \
{ name , " AIF1RX4 " , " AIF1RX4 " } , \
{ name , " AIF1RX5 " , " AIF1RX5 " } , \
{ name , " AIF1RX6 " , " AIF1RX6 " } , \
{ name , " AIF2RX1 " , " AIF2RX1 " } , \
{ name , " AIF2RX2 " , " AIF2RX2 " } , \
{ name , " AIF3RX1 " , " AIF3RX1 " } , \
{ name , " AIF3RX2 " , " AIF3RX2 " } , \
{ name , " SLIMRX1 " , " SLIMRX1 " } , \
{ name , " SLIMRX2 " , " SLIMRX2 " } , \
{ name , " SLIMRX3 " , " SLIMRX3 " } , \
{ name , " SLIMRX4 " , " SLIMRX4 " } , \
{ name , " SLIMRX5 " , " SLIMRX5 " } , \
{ name , " SLIMRX6 " , " SLIMRX6 " } , \
{ name , " EQ1 " , " EQ1 " } , \
{ name , " EQ2 " , " EQ2 " } , \
{ name , " EQ3 " , " EQ3 " } , \
{ name , " EQ4 " , " EQ4 " } , \
{ name , " DRC1L " , " DRC1L " } , \
{ name , " DRC1R " , " DRC1R " } , \
{ name , " DRC2L " , " DRC2L " } , \
{ name , " DRC2R " , " DRC2R " } , \
{ name , " LHPF1 " , " LHPF1 " } , \
{ name , " LHPF2 " , " LHPF2 " } , \
{ name , " LHPF3 " , " LHPF3 " } , \
{ name , " LHPF4 " , " LHPF4 " } , \
{ name , " ISRC1DEC1 " , " ISRC1DEC1 " } , \
{ name , " ISRC1DEC2 " , " ISRC1DEC2 " } , \
{ name , " ISRC1DEC3 " , " ISRC1DEC3 " } , \
{ name , " ISRC1DEC4 " , " ISRC1DEC4 " } , \
{ name , " ISRC1INT1 " , " ISRC1INT1 " } , \
{ name , " ISRC1INT2 " , " ISRC1INT2 " } , \
{ name , " ISRC1INT3 " , " ISRC1INT3 " } , \
{ name , " ISRC1INT4 " , " ISRC1INT4 " } , \
{ name , " ISRC2DEC1 " , " ISRC2DEC1 " } , \
{ name , " ISRC2DEC2 " , " ISRC2DEC2 " } , \
{ name , " ISRC2DEC3 " , " ISRC2DEC3 " } , \
{ name , " ISRC2DEC4 " , " ISRC2DEC4 " } , \
{ name , " ISRC2INT1 " , " ISRC2INT1 " } , \
{ name , " ISRC2INT2 " , " ISRC2INT2 " } , \
{ name , " ISRC2INT3 " , " ISRC2INT3 " } , \
{ name , " ISRC2INT4 " , " ISRC2INT4 " } , \
{ name , " DSP1.1 " , " DSP1 " } , \
{ name , " DSP1.2 " , " DSP1 " } , \
{ name , " DSP1.3 " , " DSP1 " } , \
{ name , " DSP1.4 " , " DSP1 " } , \
{ name , " DSP1.5 " , " DSP1 " } , \
{ name , " DSP1.6 " , " DSP1 " } , \
{ name , " DSP2.1 " , " DSP2 " } , \
{ name , " DSP2.2 " , " DSP2 " } , \
{ name , " DSP2.3 " , " DSP2 " } , \
{ name , " DSP2.4 " , " DSP2 " } , \
{ name , " DSP2.5 " , " DSP2 " } , \
{ name , " DSP2.6 " , " DSP2 " } , \
{ name , " DSP3.1 " , " DSP3 " } , \
{ name , " DSP3.2 " , " DSP3 " } , \
{ name , " DSP3.3 " , " DSP3 " } , \
{ name , " DSP3.4 " , " DSP3 " } , \
{ name , " DSP3.5 " , " DSP3 " } , \
{ name , " DSP3.6 " , " DSP3 " }
static const struct snd_soc_dapm_route cs47l35_dapm_routes [ ] = {
/* Internal clock domains */
{ " EQ1 " , NULL , " FXCLK " } ,
{ " EQ2 " , NULL , " FXCLK " } ,
{ " EQ3 " , NULL , " FXCLK " } ,
{ " EQ4 " , NULL , " FXCLK " } ,
{ " DRC1L " , NULL , " FXCLK " } ,
{ " DRC1R " , NULL , " FXCLK " } ,
{ " DRC2L " , NULL , " FXCLK " } ,
{ " DRC2R " , NULL , " FXCLK " } ,
{ " LHPF1 " , NULL , " FXCLK " } ,
{ " LHPF2 " , NULL , " FXCLK " } ,
{ " LHPF3 " , NULL , " FXCLK " } ,
{ " LHPF4 " , NULL , " FXCLK " } ,
{ " PWM1 Mixer " , NULL , " PWMCLK " } ,
{ " PWM2 Mixer " , NULL , " PWMCLK " } ,
{ " OUT1L " , NULL , " OUTCLK " } ,
{ " OUT1R " , NULL , " OUTCLK " } ,
{ " OUT4L " , NULL , " OUTCLK " } ,
{ " OUT5L " , NULL , " OUTCLK " } ,
{ " OUT5R " , NULL , " OUTCLK " } ,
{ " AIF1TX1 " , NULL , " AIF1TXCLK " } ,
{ " AIF1TX2 " , NULL , " AIF1TXCLK " } ,
{ " AIF1TX3 " , NULL , " AIF1TXCLK " } ,
{ " AIF1TX4 " , NULL , " AIF1TXCLK " } ,
{ " AIF1TX5 " , NULL , " AIF1TXCLK " } ,
{ " AIF1TX6 " , NULL , " AIF1TXCLK " } ,
{ " AIF2TX1 " , NULL , " AIF2TXCLK " } ,
{ " AIF2TX2 " , NULL , " AIF2TXCLK " } ,
{ " AIF3TX1 " , NULL , " AIF3TXCLK " } ,
{ " AIF3TX2 " , NULL , " AIF3TXCLK " } ,
{ " SLIMTX1 " , NULL , " SLIMBUSCLK " } ,
{ " SLIMTX2 " , NULL , " SLIMBUSCLK " } ,
{ " SLIMTX3 " , NULL , " SLIMBUSCLK " } ,
{ " SLIMTX4 " , NULL , " SLIMBUSCLK " } ,
{ " SLIMTX5 " , NULL , " SLIMBUSCLK " } ,
{ " SLIMTX6 " , NULL , " SLIMBUSCLK " } ,
{ " SPD1TX1 " , NULL , " SPDCLK " } ,
{ " SPD1TX2 " , NULL , " SPDCLK " } ,
{ " DSP1 " , NULL , " DSP1CLK " } ,
{ " DSP2 " , NULL , " DSP2CLK " } ,
{ " DSP3 " , NULL , " DSP3CLK " } ,
{ " ISRC1DEC1 " , NULL , " ISRC1CLK " } ,
{ " ISRC1DEC2 " , NULL , " ISRC1CLK " } ,
{ " ISRC1DEC3 " , NULL , " ISRC1CLK " } ,
{ " ISRC1DEC4 " , NULL , " ISRC1CLK " } ,
{ " ISRC1INT1 " , NULL , " ISRC1CLK " } ,
{ " ISRC1INT2 " , NULL , " ISRC1CLK " } ,
{ " ISRC1INT3 " , NULL , " ISRC1CLK " } ,
{ " ISRC1INT4 " , NULL , " ISRC1CLK " } ,
{ " ISRC2DEC1 " , NULL , " ISRC2CLK " } ,
{ " ISRC2DEC2 " , NULL , " ISRC2CLK " } ,
{ " ISRC2DEC3 " , NULL , " ISRC2CLK " } ,
{ " ISRC2DEC4 " , NULL , " ISRC2CLK " } ,
{ " ISRC2INT1 " , NULL , " ISRC2CLK " } ,
{ " ISRC2INT2 " , NULL , " ISRC2CLK " } ,
{ " ISRC2INT3 " , NULL , " ISRC2CLK " } ,
{ " ISRC2INT4 " , NULL , " ISRC2CLK " } ,
{ " AIF2 Capture " , NULL , " DBVDD2 " } ,
{ " AIF2 Playback " , NULL , " DBVDD2 " } ,
{ " AIF3 Capture " , NULL , " DBVDD2 " } ,
{ " AIF3 Playback " , NULL , " DBVDD2 " } ,
{ " OUT1L " , NULL , " CPVDD1 " } ,
{ " OUT1R " , NULL , " CPVDD1 " } ,
{ " OUT1L " , NULL , " CPVDD2 " } ,
{ " OUT1R " , NULL , " CPVDD2 " } ,
{ " OUT4L " , NULL , " SPKVDD " } ,
{ " OUT1L " , NULL , " SYSCLK " } ,
{ " OUT1R " , NULL , " SYSCLK " } ,
{ " OUT4L " , NULL , " SYSCLK " } ,
{ " OUT5L " , NULL , " SYSCLK " } ,
{ " OUT5R " , NULL , " SYSCLK " } ,
{ " SPD1 " , NULL , " SYSCLK " } ,
{ " SPD1 " , NULL , " SPD1TX1 " } ,
{ " SPD1 " , NULL , " SPD1TX2 " } ,
{ " IN1L " , NULL , " SYSCLK " } ,
{ " IN1R " , NULL , " SYSCLK " } ,
{ " IN2L " , NULL , " SYSCLK " } ,
{ " IN2R " , NULL , " SYSCLK " } ,
{ " MICBIAS1 " , NULL , " MICVDD " } ,
{ " MICBIAS2 " , NULL , " MICVDD " } ,
{ " MICBIAS1A " , NULL , " MICBIAS1 " } ,
{ " MICBIAS1B " , NULL , " MICBIAS1 " } ,
{ " MICBIAS2A " , NULL , " MICBIAS2 " } ,
{ " MICBIAS2B " , NULL , " MICBIAS2 " } ,
{ " Noise Generator " , NULL , " SYSCLK " } ,
{ " Tone Generator 1 " , NULL , " SYSCLK " } ,
{ " Tone Generator 2 " , NULL , " SYSCLK " } ,
{ " Noise Generator " , NULL , " NOISE " } ,
{ " Tone Generator 1 " , NULL , " TONE " } ,
{ " Tone Generator 2 " , NULL , " TONE " } ,
{ " AIF1 Capture " , NULL , " AIF1TX1 " } ,
{ " AIF1 Capture " , NULL , " AIF1TX2 " } ,
{ " AIF1 Capture " , NULL , " AIF1TX3 " } ,
{ " AIF1 Capture " , NULL , " AIF1TX4 " } ,
{ " AIF1 Capture " , NULL , " AIF1TX5 " } ,
{ " AIF1 Capture " , NULL , " AIF1TX6 " } ,
{ " AIF1RX1 " , NULL , " AIF1 Playback " } ,
{ " AIF1RX2 " , NULL , " AIF1 Playback " } ,
{ " AIF1RX3 " , NULL , " AIF1 Playback " } ,
{ " AIF1RX4 " , NULL , " AIF1 Playback " } ,
{ " AIF1RX5 " , NULL , " AIF1 Playback " } ,
{ " AIF1RX6 " , NULL , " AIF1 Playback " } ,
{ " AIF2 Capture " , NULL , " AIF2TX1 " } ,
{ " AIF2 Capture " , NULL , " AIF2TX2 " } ,
{ " AIF2RX1 " , NULL , " AIF2 Playback " } ,
{ " AIF2RX2 " , NULL , " AIF2 Playback " } ,
{ " AIF3 Capture " , NULL , " AIF3TX1 " } ,
{ " AIF3 Capture " , NULL , " AIF3TX2 " } ,
{ " AIF3RX1 " , NULL , " AIF3 Playback " } ,
{ " AIF3RX2 " , NULL , " AIF3 Playback " } ,
{ " Slim1 Capture " , NULL , " SLIMTX1 " } ,
{ " Slim1 Capture " , NULL , " SLIMTX2 " } ,
{ " Slim1 Capture " , NULL , " SLIMTX3 " } ,
{ " Slim1 Capture " , NULL , " SLIMTX4 " } ,
{ " SLIMRX1 " , NULL , " Slim1 Playback " } ,
{ " SLIMRX2 " , NULL , " Slim1 Playback " } ,
{ " SLIMRX3 " , NULL , " Slim1 Playback " } ,
{ " SLIMRX4 " , NULL , " Slim1 Playback " } ,
{ " Slim2 Capture " , NULL , " SLIMTX5 " } ,
{ " Slim2 Capture " , NULL , " SLIMTX6 " } ,
{ " SLIMRX5 " , NULL , " Slim2 Playback " } ,
{ " SLIMRX6 " , NULL , " Slim2 Playback " } ,
{ " AIF1 Playback " , NULL , " SYSCLK " } ,
{ " AIF2 Playback " , NULL , " SYSCLK " } ,
{ " AIF3 Playback " , NULL , " SYSCLK " } ,
{ " Slim1 Playback " , NULL , " SYSCLK " } ,
{ " Slim2 Playback " , NULL , " SYSCLK " } ,
{ " AIF1 Capture " , NULL , " SYSCLK " } ,
{ " AIF2 Capture " , NULL , " SYSCLK " } ,
{ " AIF3 Capture " , NULL , " SYSCLK " } ,
{ " Slim1 Capture " , NULL , " SYSCLK " } ,
{ " Slim2 Capture " , NULL , " SYSCLK " } ,
{ " Voice Control DSP " , NULL , " DSP3 " } ,
{ " Audio Trace DSP " , NULL , " DSP1 " } ,
{ " IN1L Analog Mux " , " A " , " IN1ALN " } ,
{ " IN1L Analog Mux " , " A " , " IN1ALP " } ,
{ " IN1L Analog Mux " , " B " , " IN1BLN " } ,
{ " IN1L Analog Mux " , " B " , " IN1BLP " } ,
{ " IN1R Analog Mux " , " A " , " IN1ARN " } ,
{ " IN1R Analog Mux " , " A " , " IN1ARP " } ,
{ " IN1R Analog Mux " , " B " , " IN1BRN " } ,
{ " IN1R Analog Mux " , " B " , " IN1BRP " } ,
{ " IN1L Mode " , " Analog " , " IN1L Analog Mux " } ,
{ " IN1R Mode " , " Analog " , " IN1R Analog Mux " } ,
{ " IN1L Mode " , " Digital " , " IN1ALN " } ,
{ " IN1L Mode " , " Digital " , " IN1ARN " } ,
{ " IN1R Mode " , " Digital " , " IN1ALN " } ,
{ " IN1R Mode " , " Digital " , " IN1ARN " } ,
{ " IN1L " , NULL , " IN1L Mode " } ,
{ " IN1R " , NULL , " IN1R Mode " } ,
{ " IN2L Mode " , " Analog " , " IN2LN " } ,
{ " IN2L Mode " , " Analog " , " IN2LP " } ,
{ " IN2R Mode " , " Analog " , " IN2RN " } ,
{ " IN2R Mode " , " Analog " , " IN2RP " } ,
{ " IN2L Mode " , " Digital " , " IN2LN " } ,
{ " IN2L Mode " , " Digital " , " IN2RN " } ,
{ " IN2R Mode " , " Digital " , " IN2LN " } ,
{ " IN2R Mode " , " Digital " , " IN2RN " } ,
{ " IN2L " , NULL , " IN2L Mode " } ,
{ " IN2R " , NULL , " IN2R Mode " } ,
MADERA_MIXER_ROUTES ( " OUT1L " , " HPOUT1L " ) ,
MADERA_MIXER_ROUTES ( " OUT1R " , " HPOUT1R " ) ,
MADERA_MIXER_ROUTES ( " OUT4L " , " SPKOUT " ) ,
MADERA_MIXER_ROUTES ( " OUT5L " , " SPKDAT1L " ) ,
MADERA_MIXER_ROUTES ( " OUT5R " , " SPKDAT1R " ) ,
MADERA_MIXER_ROUTES ( " PWM1 Driver " , " PWM1 " ) ,
MADERA_MIXER_ROUTES ( " PWM2 Driver " , " PWM2 " ) ,
MADERA_MIXER_ROUTES ( " AIF1TX1 " , " AIF1TX1 " ) ,
MADERA_MIXER_ROUTES ( " AIF1TX2 " , " AIF1TX2 " ) ,
MADERA_MIXER_ROUTES ( " AIF1TX3 " , " AIF1TX3 " ) ,
MADERA_MIXER_ROUTES ( " AIF1TX4 " , " AIF1TX4 " ) ,
MADERA_MIXER_ROUTES ( " AIF1TX5 " , " AIF1TX5 " ) ,
MADERA_MIXER_ROUTES ( " AIF1TX6 " , " AIF1TX6 " ) ,
MADERA_MIXER_ROUTES ( " AIF2TX1 " , " AIF2TX1 " ) ,
MADERA_MIXER_ROUTES ( " AIF2TX2 " , " AIF2TX2 " ) ,
MADERA_MIXER_ROUTES ( " AIF3TX1 " , " AIF3TX1 " ) ,
MADERA_MIXER_ROUTES ( " AIF3TX2 " , " AIF3TX2 " ) ,
MADERA_MIXER_ROUTES ( " SLIMTX1 " , " SLIMTX1 " ) ,
MADERA_MIXER_ROUTES ( " SLIMTX2 " , " SLIMTX2 " ) ,
MADERA_MIXER_ROUTES ( " SLIMTX3 " , " SLIMTX3 " ) ,
MADERA_MIXER_ROUTES ( " SLIMTX4 " , " SLIMTX4 " ) ,
MADERA_MIXER_ROUTES ( " SLIMTX5 " , " SLIMTX5 " ) ,
MADERA_MIXER_ROUTES ( " SLIMTX6 " , " SLIMTX6 " ) ,
MADERA_MUX_ROUTES ( " SPD1TX1 " , " SPDIF1TX1 " ) ,
MADERA_MUX_ROUTES ( " SPD1TX2 " , " SPDIF1TX2 " ) ,
MADERA_MIXER_ROUTES ( " EQ1 " , " EQ1 " ) ,
MADERA_MIXER_ROUTES ( " EQ2 " , " EQ2 " ) ,
MADERA_MIXER_ROUTES ( " EQ3 " , " EQ3 " ) ,
MADERA_MIXER_ROUTES ( " EQ4 " , " EQ4 " ) ,
MADERA_MIXER_ROUTES ( " DRC1L " , " DRC1L " ) ,
MADERA_MIXER_ROUTES ( " DRC1R " , " DRC1R " ) ,
MADERA_MIXER_ROUTES ( " DRC2L " , " DRC2L " ) ,
MADERA_MIXER_ROUTES ( " DRC2R " , " DRC2R " ) ,
MADERA_MIXER_ROUTES ( " LHPF1 " , " LHPF1 " ) ,
MADERA_MIXER_ROUTES ( " LHPF2 " , " LHPF2 " ) ,
MADERA_MIXER_ROUTES ( " LHPF3 " , " LHPF3 " ) ,
MADERA_MIXER_ROUTES ( " LHPF4 " , " LHPF4 " ) ,
MADERA_DSP_ROUTES ( " DSP1 " ) ,
MADERA_DSP_ROUTES ( " DSP2 " ) ,
MADERA_DSP_ROUTES ( " DSP3 " ) ,
{ " DSP Trigger Out " , NULL , " DSP1 Trigger Output " } ,
{ " DSP Trigger Out " , NULL , " DSP2 Trigger Output " } ,
{ " DSP Trigger Out " , NULL , " DSP3 Trigger Output " } ,
{ " DSP1 Trigger Output " , " Switch " , " DSP1 " } ,
{ " DSP2 Trigger Output " , " Switch " , " DSP2 " } ,
{ " DSP3 Trigger Output " , " Switch " , " DSP3 " } ,
MADERA_MUX_ROUTES ( " ISRC1INT1 " , " ISRC1INT1 " ) ,
MADERA_MUX_ROUTES ( " ISRC1INT2 " , " ISRC1INT2 " ) ,
MADERA_MUX_ROUTES ( " ISRC1INT3 " , " ISRC1INT3 " ) ,
MADERA_MUX_ROUTES ( " ISRC1INT4 " , " ISRC1INT4 " ) ,
MADERA_MUX_ROUTES ( " ISRC1DEC1 " , " ISRC1DEC1 " ) ,
MADERA_MUX_ROUTES ( " ISRC1DEC2 " , " ISRC1DEC2 " ) ,
MADERA_MUX_ROUTES ( " ISRC1DEC3 " , " ISRC1DEC3 " ) ,
MADERA_MUX_ROUTES ( " ISRC1DEC4 " , " ISRC1DEC4 " ) ,
MADERA_MUX_ROUTES ( " ISRC2INT1 " , " ISRC2INT1 " ) ,
MADERA_MUX_ROUTES ( " ISRC2INT2 " , " ISRC2INT2 " ) ,
MADERA_MUX_ROUTES ( " ISRC2INT3 " , " ISRC2INT3 " ) ,
MADERA_MUX_ROUTES ( " ISRC2INT4 " , " ISRC2INT4 " ) ,
MADERA_MUX_ROUTES ( " ISRC2DEC1 " , " ISRC2DEC1 " ) ,
MADERA_MUX_ROUTES ( " ISRC2DEC2 " , " ISRC2DEC2 " ) ,
MADERA_MUX_ROUTES ( " ISRC2DEC3 " , " ISRC2DEC3 " ) ,
MADERA_MUX_ROUTES ( " ISRC2DEC4 " , " ISRC2DEC4 " ) ,
{ " AEC1 Loopback " , " HPOUT1L " , " OUT1L " } ,
{ " AEC1 Loopback " , " HPOUT1R " , " OUT1R " } ,
{ " AEC2 Loopback " , " HPOUT1L " , " OUT1L " } ,
{ " AEC2 Loopback " , " HPOUT1R " , " OUT1R " } ,
{ " HPOUT1 Demux " , NULL , " OUT1L " } ,
{ " HPOUT1 Demux " , NULL , " OUT1R " } ,
{ " AEC1 Loopback " , " SPKOUT " , " OUT4L " } ,
{ " AEC2 Loopback " , " SPKOUT " , " OUT4L " } ,
{ " SPKOUTN " , NULL , " OUT4L " } ,
{ " SPKOUTP " , NULL , " OUT4L " } ,
2020-01-14 19:18:41 +03:00
{ " OUT1R " , NULL , " HPOUT1 Mono Mux " } ,
2020-09-25 12:18:30 +03:00
{ " HPOUT1 Mono Mux " , " EPOUT " , " OUT1L " } ,
2020-01-14 19:18:41 +03:00
2019-06-19 16:41:57 +03:00
{ " HPOUTL " , " HPOUT " , " HPOUT1 Demux " } ,
{ " HPOUTR " , " HPOUT " , " HPOUT1 Demux " } ,
{ " EPOUTP " , " EPOUT " , " HPOUT1 Demux " } ,
{ " EPOUTN " , " EPOUT " , " HPOUT1 Demux " } ,
{ " AEC1 Loopback " , " SPKDAT1L " , " OUT5L " } ,
{ " AEC1 Loopback " , " SPKDAT1R " , " OUT5R " } ,
{ " AEC2 Loopback " , " SPKDAT1L " , " OUT5L " } ,
{ " AEC2 Loopback " , " SPKDAT1R " , " OUT5R " } ,
{ " SPKDAT1L " , NULL , " OUT5L " } ,
{ " SPKDAT1R " , NULL , " OUT5R " } ,
{ " SPDIF1 " , NULL , " SPD1 " } ,
{ " MICSUPP " , NULL , " SYSCLK " } ,
{ " DRC1 Signal Activity " , NULL , " DRC1 Activity Output " } ,
{ " DRC2 Signal Activity " , NULL , " DRC2 Activity Output " } ,
{ " DRC1 Activity Output " , " Switch " , " DRC1L " } ,
{ " DRC1 Activity Output " , " Switch " , " DRC1R " } ,
{ " DRC2 Activity Output " , " Switch " , " DRC2L " } ,
{ " DRC2 Activity Output " , " Switch " , " DRC2R " } ,
} ;
static int cs47l35_set_fll ( struct snd_soc_component * component , int fll_id ,
int source , unsigned int fref , unsigned int fout )
{
struct cs47l35 * cs47l35 = snd_soc_component_get_drvdata ( component ) ;
switch ( fll_id ) {
case MADERA_FLL1_REFCLK :
return madera_set_fll_refclk ( & cs47l35 - > fll , source , fref ,
fout ) ;
case MADERA_FLL1_SYNCCLK :
return madera_set_fll_syncclk ( & cs47l35 - > fll , source , fref ,
fout ) ;
default :
return - EINVAL ;
}
}
static struct snd_soc_dai_driver cs47l35_dai [ ] = {
{
. name = " cs47l35-aif1 " ,
. id = 1 ,
. base = MADERA_AIF1_BCLK_CTRL ,
. playback = {
. stream_name = " AIF1 Playback " ,
. channels_min = 1 ,
. channels_max = 6 ,
. rates = MADERA_RATES ,
. formats = MADERA_FORMATS ,
} ,
. capture = {
. stream_name = " AIF1 Capture " ,
. channels_min = 1 ,
. channels_max = 6 ,
. rates = MADERA_RATES ,
. formats = MADERA_FORMATS ,
} ,
. ops = & madera_dai_ops ,
2021-01-15 07:54:48 +03:00
. symmetric_rate = 1 ,
. symmetric_sample_bits = 1 ,
2019-06-19 16:41:57 +03:00
} ,
{
. name = " cs47l35-aif2 " ,
. id = 2 ,
. base = MADERA_AIF2_BCLK_CTRL ,
. playback = {
. stream_name = " AIF2 Playback " ,
. channels_min = 1 ,
. channels_max = 2 ,
. rates = MADERA_RATES ,
. formats = MADERA_FORMATS ,
} ,
. capture = {
. stream_name = " AIF2 Capture " ,
. channels_min = 1 ,
. channels_max = 2 ,
. rates = MADERA_RATES ,
. formats = MADERA_FORMATS ,
} ,
. ops = & madera_dai_ops ,
2021-01-15 07:54:48 +03:00
. symmetric_rate = 1 ,
. symmetric_sample_bits = 1 ,
2019-06-19 16:41:57 +03:00
} ,
{
. name = " cs47l35-aif3 " ,
. id = 3 ,
. base = MADERA_AIF3_BCLK_CTRL ,
. playback = {
. stream_name = " AIF3 Playback " ,
. channels_min = 1 ,
. channels_max = 2 ,
. rates = MADERA_RATES ,
. formats = MADERA_FORMATS ,
} ,
. capture = {
. stream_name = " AIF3 Capture " ,
. channels_min = 1 ,
. channels_max = 2 ,
. rates = MADERA_RATES ,
. formats = MADERA_FORMATS ,
} ,
. ops = & madera_dai_ops ,
2021-01-15 07:54:48 +03:00
. symmetric_rate = 1 ,
. symmetric_sample_bits = 1 ,
2019-06-19 16:41:57 +03:00
} ,
{
. name = " cs47l35-slim1 " ,
. id = 4 ,
. playback = {
. stream_name = " Slim1 Playback " ,
. channels_min = 1 ,
. channels_max = 4 ,
. rates = MADERA_RATES ,
. formats = MADERA_FORMATS ,
} ,
. capture = {
. stream_name = " Slim1 Capture " ,
. channels_min = 1 ,
. channels_max = 4 ,
. rates = MADERA_RATES ,
. formats = MADERA_FORMATS ,
} ,
. ops = & madera_simple_dai_ops ,
} ,
{
. name = " cs47l35-slim2 " ,
. id = 5 ,
. playback = {
. stream_name = " Slim2 Playback " ,
. channels_min = 1 ,
. channels_max = 2 ,
. rates = MADERA_RATES ,
. formats = MADERA_FORMATS ,
} ,
. capture = {
. stream_name = " Slim2 Capture " ,
. channels_min = 1 ,
. channels_max = 2 ,
. rates = MADERA_RATES ,
. formats = MADERA_FORMATS ,
} ,
. ops = & madera_simple_dai_ops ,
} ,
{
. name = " cs47l35-cpu-voicectrl " ,
. capture = {
. stream_name = " Voice Control CPU " ,
. channels_min = 1 ,
. channels_max = 1 ,
. rates = MADERA_RATES ,
. formats = MADERA_FORMATS ,
} ,
. compress_new = & snd_soc_new_compress ,
} ,
{
. name = " cs47l35-dsp-voicectrl " ,
. capture = {
. stream_name = " Voice Control DSP " ,
. channels_min = 1 ,
. channels_max = 1 ,
. rates = MADERA_RATES ,
. formats = MADERA_FORMATS ,
} ,
} ,
{
. name = " cs47l35-cpu-trace " ,
. capture = {
. stream_name = " Audio Trace CPU " ,
. channels_min = 1 ,
. channels_max = 6 ,
. rates = MADERA_RATES ,
. formats = MADERA_FORMATS ,
} ,
. compress_new = & snd_soc_new_compress ,
} ,
{
. name = " cs47l35-dsp-trace " ,
. capture = {
. stream_name = " Audio Trace DSP " ,
. channels_min = 1 ,
. channels_max = 6 ,
. rates = MADERA_RATES ,
. formats = MADERA_FORMATS ,
} ,
} ,
} ;
2020-04-20 10:08:13 +03:00
static int cs47l35_open ( struct snd_soc_component * component ,
struct snd_compr_stream * stream )
2019-06-19 16:41:57 +03:00
{
struct snd_soc_pcm_runtime * rtd = stream - > private_data ;
struct cs47l35 * cs47l35 = snd_soc_component_get_drvdata ( component ) ;
struct madera_priv * priv = & cs47l35 - > core ;
struct madera * madera = priv - > madera ;
int n_adsp ;
2020-03-23 08:21:56 +03:00
if ( strcmp ( asoc_rtd_to_codec ( rtd , 0 ) - > name , " cs47l35-dsp-voicectrl " ) = = 0 ) {
2019-06-19 16:41:57 +03:00
n_adsp = 2 ;
2020-03-23 08:21:56 +03:00
} else if ( strcmp ( asoc_rtd_to_codec ( rtd , 0 ) - > name , " cs47l35-dsp-trace " ) = = 0 ) {
2019-06-19 16:41:57 +03:00
n_adsp = 0 ;
} else {
dev_err ( madera - > dev ,
" No suitable compressed stream for DAI '%s' \n " ,
2020-03-23 08:21:56 +03:00
asoc_rtd_to_codec ( rtd , 0 ) - > name ) ;
2019-06-19 16:41:57 +03:00
return - EINVAL ;
}
return wm_adsp_compr_open ( & priv - > adsp [ n_adsp ] , stream ) ;
}
static irqreturn_t cs47l35_adsp2_irq ( int irq , void * data )
{
struct cs47l35 * cs47l35 = data ;
struct madera_priv * priv = & cs47l35 - > core ;
struct madera * madera = priv - > madera ;
struct madera_voice_trigger_info trig_info ;
int serviced = 0 ;
int i , ret ;
for ( i = 0 ; i < CS47L35_NUM_ADSP ; + + i ) {
ret = wm_adsp_compr_handle_irq ( & priv - > adsp [ i ] ) ;
if ( ret ! = - ENODEV )
serviced + + ;
if ( ret = = WM_ADSP_COMPR_VOICE_TRIGGER ) {
trig_info . core_num = i + 1 ;
blocking_notifier_call_chain ( & madera - > notifier ,
MADERA_NOTIFY_VOICE_TRIGGER ,
& trig_info ) ;
}
}
if ( ! serviced ) {
dev_err ( madera - > dev , " Spurious compressed data IRQ \n " ) ;
return IRQ_NONE ;
}
return IRQ_HANDLED ;
}
2020-01-14 19:18:41 +03:00
static const struct snd_soc_dapm_route cs47l35_mono_routes [ ] = {
{ " HPOUT1 Mono Mux " , " HPOUT " , " OUT1L " } ,
} ;
2019-06-19 16:41:57 +03:00
static int cs47l35_component_probe ( struct snd_soc_component * component )
{
struct cs47l35 * cs47l35 = snd_soc_component_get_drvdata ( component ) ;
struct madera * madera = cs47l35 - > core . madera ;
int i , ret ;
snd_soc_component_init_regmap ( component , madera - > regmap ) ;
mutex_lock ( & madera - > dapm_ptr_lock ) ;
madera - > dapm = snd_soc_component_get_dapm ( component ) ;
mutex_unlock ( & madera - > dapm_ptr_lock ) ;
ret = madera_init_inputs ( component ) ;
if ( ret )
return ret ;
2020-01-14 19:18:41 +03:00
ret = madera_init_outputs ( component , cs47l35_mono_routes ,
ARRAY_SIZE ( cs47l35_mono_routes ) ,
CS47L35_MONO_OUTPUTS ) ;
2019-06-19 16:41:57 +03:00
if ( ret )
return ret ;
snd_soc_component_disable_pin ( component , " HAPTICS " ) ;
ret = snd_soc_add_component_controls ( component ,
madera_adsp_rate_controls ,
CS47L35_NUM_ADSP ) ;
if ( ret )
return ret ;
for ( i = 0 ; i < CS47L35_NUM_ADSP ; i + + )
wm_adsp2_component_probe ( & cs47l35 - > core . adsp [ i ] , component ) ;
return 0 ;
}
static void cs47l35_component_remove ( struct snd_soc_component * component )
{
struct cs47l35 * cs47l35 = snd_soc_component_get_drvdata ( component ) ;
struct madera * madera = cs47l35 - > core . madera ;
int i ;
mutex_lock ( & madera - > dapm_ptr_lock ) ;
madera - > dapm = NULL ;
mutex_unlock ( & madera - > dapm_ptr_lock ) ;
for ( i = 0 ; i < CS47L35_NUM_ADSP ; i + + )
wm_adsp2_component_remove ( & cs47l35 - > core . adsp [ i ] , component ) ;
}
# define CS47L35_DIG_VU 0x0200
static unsigned int cs47l35_digital_vu [ ] = {
MADERA_DAC_DIGITAL_VOLUME_1L ,
MADERA_DAC_DIGITAL_VOLUME_1R ,
MADERA_DAC_DIGITAL_VOLUME_4L ,
MADERA_DAC_DIGITAL_VOLUME_5L ,
MADERA_DAC_DIGITAL_VOLUME_5R ,
} ;
2020-04-20 10:08:13 +03:00
static const struct snd_compress_ops cs47l35_compress_ops = {
2019-06-19 16:41:57 +03:00
. open = & cs47l35_open ,
. free = & wm_adsp_compr_free ,
. set_params = & wm_adsp_compr_set_params ,
. get_caps = & wm_adsp_compr_get_caps ,
. trigger = & wm_adsp_compr_trigger ,
. pointer = & wm_adsp_compr_pointer ,
. copy = & wm_adsp_compr_copy ,
} ;
static const struct snd_soc_component_driver soc_component_dev_cs47l35 = {
. probe = & cs47l35_component_probe ,
. remove = & cs47l35_component_remove ,
. set_sysclk = & madera_set_sysclk ,
. set_pll = & cs47l35_set_fll ,
. name = DRV_NAME ,
2020-04-20 10:08:13 +03:00
. compress_ops = & cs47l35_compress_ops ,
2019-06-19 16:41:57 +03:00
. controls = cs47l35_snd_controls ,
. num_controls = ARRAY_SIZE ( cs47l35_snd_controls ) ,
. dapm_widgets = cs47l35_dapm_widgets ,
. num_dapm_widgets = ARRAY_SIZE ( cs47l35_dapm_widgets ) ,
. dapm_routes = cs47l35_dapm_routes ,
. num_dapm_routes = ARRAY_SIZE ( cs47l35_dapm_routes ) ,
. use_pmdown_time = 1 ,
. endianness = 1 ,
} ;
static int cs47l35_probe ( struct platform_device * pdev )
{
struct madera * madera = dev_get_drvdata ( pdev - > dev . parent ) ;
struct cs47l35 * cs47l35 ;
int i , ret ;
BUILD_BUG_ON ( ARRAY_SIZE ( cs47l35_dai ) > MADERA_MAX_DAI ) ;
/* quick exit if Madera irqchip driver hasn't completed probe */
if ( ! madera - > irq_dev ) {
dev_dbg ( & pdev - > dev , " irqchip driver not ready \n " ) ;
return - EPROBE_DEFER ;
}
cs47l35 = devm_kzalloc ( & pdev - > dev , sizeof ( struct cs47l35 ) , GFP_KERNEL ) ;
if ( ! cs47l35 )
return - ENOMEM ;
platform_set_drvdata ( pdev , cs47l35 ) ;
cs47l35 - > core . madera = madera ;
cs47l35 - > core . dev = & pdev - > dev ;
cs47l35 - > core . num_inputs = 4 ;
ret = madera_core_init ( & cs47l35 - > core ) ;
if ( ret )
return ret ;
ret = madera_init_overheat ( & cs47l35 - > core ) ;
if ( ret )
goto error_core ;
ret = madera_request_irq ( madera , MADERA_IRQ_DSP_IRQ1 ,
" ADSP2 Compressed IRQ " , cs47l35_adsp2_irq ,
cs47l35 ) ;
if ( ret ) {
dev_err ( & pdev - > dev , " Failed to request DSP IRQ: %d \n " , ret ) ;
goto error_overheat ;
}
ret = madera_set_irq_wake ( madera , MADERA_IRQ_DSP_IRQ1 , 1 ) ;
if ( ret )
dev_warn ( & pdev - > dev , " Failed to set DSP IRQ wake: %d \n " , ret ) ;
for ( i = 0 ; i < CS47L35_NUM_ADSP ; i + + ) {
cs47l35 - > core . adsp [ i ] . part = " cs47l35 " ;
2021-09-13 19:00:55 +03:00
cs47l35 - > core . adsp [ i ] . cs_dsp . num = i + 1 ;
cs47l35 - > core . adsp [ i ] . cs_dsp . type = WMFW_ADSP2 ;
cs47l35 - > core . adsp [ i ] . cs_dsp . rev = 1 ;
cs47l35 - > core . adsp [ i ] . cs_dsp . dev = madera - > dev ;
cs47l35 - > core . adsp [ i ] . cs_dsp . regmap = madera - > regmap_32bit ;
cs47l35 - > core . adsp [ i ] . cs_dsp . base = wm_adsp2_control_bases [ i ] ;
cs47l35 - > core . adsp [ i ] . cs_dsp . mem = cs47l35_dsp_regions [ i ] ;
cs47l35 - > core . adsp [ i ] . cs_dsp . num_mems =
2019-06-19 16:41:57 +03:00
ARRAY_SIZE ( cs47l35_dsp1_regions ) ;
ret = wm_adsp2_init ( & cs47l35 - > core . adsp [ i ] ) ;
if ( ret ) {
for ( - - i ; i > = 0 ; - - i )
wm_adsp2_remove ( & cs47l35 - > core . adsp [ i ] ) ;
goto error_dsp_irq ;
}
}
madera_init_fll ( madera , 1 , MADERA_FLL1_CONTROL_1 - 1 , & cs47l35 - > fll ) ;
for ( i = 0 ; i < ARRAY_SIZE ( cs47l35_dai ) ; i + + )
madera_init_dai ( & cs47l35 - > core , i ) ;
/* Latch volume update bits */
for ( i = 0 ; i < ARRAY_SIZE ( cs47l35_digital_vu ) ; i + + )
regmap_update_bits ( madera - > regmap , cs47l35_digital_vu [ i ] ,
CS47L35_DIG_VU , CS47L35_DIG_VU ) ;
pm_runtime_enable ( & pdev - > dev ) ;
pm_runtime_idle ( & pdev - > dev ) ;
ret = devm_snd_soc_register_component ( & pdev - > dev ,
& soc_component_dev_cs47l35 ,
cs47l35_dai ,
ARRAY_SIZE ( cs47l35_dai ) ) ;
if ( ret < 0 ) {
dev_err ( & pdev - > dev , " Failed to register component: %d \n " , ret ) ;
goto error_pm_runtime ;
}
return ret ;
error_pm_runtime :
pm_runtime_disable ( & pdev - > dev ) ;
for ( i = 0 ; i < CS47L35_NUM_ADSP ; i + + )
wm_adsp2_remove ( & cs47l35 - > core . adsp [ i ] ) ;
error_dsp_irq :
madera_set_irq_wake ( madera , MADERA_IRQ_DSP_IRQ1 , 0 ) ;
madera_free_irq ( madera , MADERA_IRQ_DSP_IRQ1 , cs47l35 ) ;
error_overheat :
madera_free_overheat ( & cs47l35 - > core ) ;
error_core :
madera_core_free ( & cs47l35 - > core ) ;
return ret ;
}
static int cs47l35_remove ( struct platform_device * pdev )
{
struct cs47l35 * cs47l35 = platform_get_drvdata ( pdev ) ;
int i ;
pm_runtime_disable ( & pdev - > dev ) ;
for ( i = 0 ; i < CS47L35_NUM_ADSP ; i + + )
wm_adsp2_remove ( & cs47l35 - > core . adsp [ i ] ) ;
madera_set_irq_wake ( cs47l35 - > core . madera , MADERA_IRQ_DSP_IRQ1 , 0 ) ;
madera_free_irq ( cs47l35 - > core . madera , MADERA_IRQ_DSP_IRQ1 , cs47l35 ) ;
madera_free_overheat ( & cs47l35 - > core ) ;
madera_core_free ( & cs47l35 - > core ) ;
return 0 ;
}
static struct platform_driver cs47l35_codec_driver = {
. driver = {
. name = " cs47l35-codec " ,
} ,
. probe = & cs47l35_probe ,
. remove = & cs47l35_remove ,
} ;
module_platform_driver ( cs47l35_codec_driver ) ;
MODULE_SOFTDEP ( " pre: madera irq-madera arizona-micsupp " ) ;
MODULE_DESCRIPTION ( " ASoC CS47L35 driver " ) ;
MODULE_AUTHOR ( " Piotr Stankiewicz <piotrs@opensource.cirrus.com> " ) ;
MODULE_LICENSE ( " GPL v2 " ) ;
MODULE_ALIAS ( " platform:cs47l35-codec " ) ;