2019-06-04 11:11:33 +03:00
// SPDX-License-Identifier: GPL-2.0-only
2015-09-28 16:01:09 +03:00
/*
* wm8998 . c - - ALSA SoC Audio driver for WM8998 codecs
*
* Copyright 2015 Cirrus Logic , Inc .
*
* Author : Richard Fitzgerald < rf @ opensource . wolfsonmicro . com >
*/
# include <linux/module.h>
# include <linux/moduleparam.h>
# include <linux/init.h>
# include <linux/delay.h>
# include <linux/pm.h>
# include <linux/pm_runtime.h>
# include <linux/regmap.h>
# include <linux/slab.h>
# include <sound/core.h>
# include <sound/pcm.h>
# include <sound/pcm_params.h>
# include <sound/soc.h>
# include <sound/jack.h>
# include <sound/initval.h>
# include <sound/tlv.h>
# include <linux/mfd/arizona/core.h>
# include <linux/mfd/arizona/registers.h>
# include "arizona.h"
# include "wm8998.h"
struct wm8998_priv {
struct arizona_priv core ;
struct arizona_fll fll [ 2 ] ;
} ;
static int wm8998_asrc_ev ( struct snd_soc_dapm_widget * w ,
struct snd_kcontrol * kcontrol ,
int event )
{
2018-02-13 05:03:12 +03:00
struct snd_soc_component * component = snd_soc_dapm_to_component ( w - > dapm ) ;
2015-09-28 16:01:09 +03:00
unsigned int val ;
switch ( event ) {
case SND_SOC_DAPM_PRE_PMU :
2020-06-16 08:21:29 +03:00
val = snd_soc_component_read ( component , ARIZONA_ASRC_RATE1 ) ;
2015-09-28 16:01:09 +03:00
val & = ARIZONA_ASRC_RATE1_MASK ;
val > > = ARIZONA_ASRC_RATE1_SHIFT ;
switch ( val ) {
case 0 :
case 1 :
case 2 :
2020-06-16 08:21:29 +03:00
val = snd_soc_component_read ( component ,
2015-09-28 16:01:09 +03:00
ARIZONA_SAMPLE_RATE_1 + val ) ;
if ( val > = 0x11 ) {
2018-02-13 05:03:12 +03:00
dev_warn ( component - > dev ,
2015-09-28 16:01:09 +03:00
" Unsupported ASRC rate1 (%s) \n " ,
arizona_sample_rate_val_to_name ( val ) ) ;
2018-11-16 18:06:35 +03:00
return - EINVAL ;
2015-09-28 16:01:09 +03:00
}
break ;
default :
2018-02-13 05:03:12 +03:00
dev_err ( component - > dev ,
2015-09-28 16:01:09 +03:00
" Illegal ASRC rate1 selector (0x%x) \n " ,
val ) ;
return - EINVAL ;
}
2020-06-16 08:21:29 +03:00
val = snd_soc_component_read ( component , ARIZONA_ASRC_RATE2 ) ;
2015-09-28 16:01:09 +03:00
val & = ARIZONA_ASRC_RATE2_MASK ;
val > > = ARIZONA_ASRC_RATE2_SHIFT ;
switch ( val ) {
case 8 :
case 9 :
val - = 0x8 ;
2020-06-16 08:21:29 +03:00
val = snd_soc_component_read ( component ,
2015-09-28 16:01:09 +03:00
ARIZONA_ASYNC_SAMPLE_RATE_1 + val ) ;
if ( val > = 0x11 ) {
2018-02-13 05:03:12 +03:00
dev_warn ( component - > dev ,
2015-09-28 16:01:09 +03:00
" Unsupported ASRC rate2 (%s) \n " ,
arizona_sample_rate_val_to_name ( val ) ) ;
return - EINVAL ;
}
break ;
default :
2018-02-13 05:03:12 +03:00
dev_err ( component - > dev ,
2015-09-28 16:01:09 +03:00
" Illegal ASRC rate2 selector (0x%x) \n " ,
val ) ;
return - EINVAL ;
}
break ;
default :
return - EINVAL ;
}
return 0 ;
}
2017-09-25 14:55:07 +03:00
static int wm8998_inmux_put ( struct snd_kcontrol * kcontrol ,
2015-09-28 16:01:09 +03:00
struct snd_ctl_elem_value * ucontrol )
{
2018-02-13 05:03:12 +03:00
struct snd_soc_component * component = snd_soc_dapm_kcontrol_component ( kcontrol ) ;
struct snd_soc_dapm_context * dapm = snd_soc_component_get_dapm ( component ) ;
struct wm8998_priv * wm8998 = snd_soc_component_get_drvdata ( component ) ;
2015-09-28 16:01:09 +03:00
struct arizona * arizona = wm8998 - > core . arizona ;
struct soc_enum * e = ( struct soc_enum * ) kcontrol - > private_value ;
2017-09-25 14:55:07 +03:00
unsigned int mode_reg , mode_index ;
unsigned int mux , inmode , src_val , mode_val ;
2022-06-28 18:34:07 +03:00
int change , ret ;
2015-09-28 16:01:09 +03:00
mux = ucontrol - > value . enumerated . item [ 0 ] ;
if ( mux > 1 )
return - EINVAL ;
2017-09-25 14:55:07 +03:00
switch ( e - > reg ) {
case ARIZONA_ADC_DIGITAL_VOLUME_2L :
mode_reg = ARIZONA_IN2L_CONTROL ;
mode_index = 1 + ( 2 * mux ) ;
2015-09-28 16:01:09 +03:00
break ;
default :
2017-09-25 14:55:07 +03:00
mode_reg = ARIZONA_IN1L_CONTROL ;
mode_index = ( 2 * mux ) ;
2015-09-28 16:01:09 +03:00
break ;
}
2017-09-25 14:55:07 +03:00
inmode = arizona - > pdata . inmode [ mode_index ] ;
2015-09-28 16:01:09 +03:00
if ( inmode & ARIZONA_INMODE_DMIC )
2017-09-25 14:55:07 +03:00
mode_val = 1 < < ARIZONA_IN1_MODE_SHIFT ;
2015-09-28 16:01:09 +03:00
else
mode_val = 0 ;
2017-09-25 14:55:07 +03:00
src_val = mux < < ARIZONA_IN1L_SRC_SHIFT ;
2015-09-28 16:01:09 +03:00
if ( inmode & ARIZONA_INMODE_SE )
2017-09-25 14:55:07 +03:00
src_val | = 1 < < ARIZONA_IN1L_SRC_SE_SHIFT ;
2015-09-28 16:01:09 +03:00
2018-02-20 19:08:11 +03:00
snd_soc_component_update_bits ( component , mode_reg ,
ARIZONA_IN1_MODE_MASK , mode_val ) ;
2015-09-28 16:01:09 +03:00
2022-06-28 18:34:07 +03:00
change = snd_soc_component_update_bits ( component , e - > reg ,
ARIZONA_IN1L_SRC_MASK |
ARIZONA_IN1L_SRC_SE_MASK ,
src_val ) ;
ret = snd_soc_dapm_mux_update_power ( dapm , kcontrol ,
ucontrol - > value . enumerated . item [ 0 ] ,
e , NULL ) ;
if ( ret < 0 ) {
dev_err ( arizona - > dev , " Failed to update demux power state: %d \n " , ret ) ;
return ret ;
}
2015-09-28 16:01:09 +03:00
2022-06-28 18:34:07 +03:00
return change ;
2015-09-28 16:01:09 +03:00
}
static const char * const wm8998_inmux_texts [ ] = {
" A " ,
" B " ,
} ;
2015-11-03 18:05:50 +03:00
static SOC_ENUM_SINGLE_DECL ( wm8998_in1muxl_enum ,
ARIZONA_ADC_DIGITAL_VOLUME_1L ,
ARIZONA_IN1L_SRC_SHIFT ,
wm8998_inmux_texts ) ;
2015-09-28 16:01:09 +03:00
2015-11-03 18:05:50 +03:00
static SOC_ENUM_SINGLE_DECL ( wm8998_in1muxr_enum ,
ARIZONA_ADC_DIGITAL_VOLUME_1R ,
ARIZONA_IN1R_SRC_SHIFT ,
wm8998_inmux_texts ) ;
2015-09-28 16:01:09 +03:00
2015-11-03 18:05:50 +03:00
static SOC_ENUM_SINGLE_DECL ( wm8998_in2mux_enum ,
ARIZONA_ADC_DIGITAL_VOLUME_2L ,
ARIZONA_IN2L_SRC_SHIFT ,
wm8998_inmux_texts ) ;
2015-09-28 16:01:09 +03:00
static const struct snd_kcontrol_new wm8998_in1mux [ 2 ] = {
SOC_DAPM_ENUM_EXT ( " IN1L Mux " , wm8998_in1muxl_enum ,
2017-09-25 14:55:07 +03:00
snd_soc_dapm_get_enum_double , wm8998_inmux_put ) ,
2015-09-28 16:01:09 +03:00
SOC_DAPM_ENUM_EXT ( " IN1R Mux " , wm8998_in1muxr_enum ,
2017-09-25 14:55:07 +03:00
snd_soc_dapm_get_enum_double , wm8998_inmux_put ) ,
2015-09-28 16:01:09 +03:00
} ;
static const struct snd_kcontrol_new wm8998_in2mux =
SOC_DAPM_ENUM_EXT ( " IN2 Mux " , wm8998_in2mux_enum ,
2017-09-25 14:55:07 +03:00
snd_soc_dapm_get_enum_double , wm8998_inmux_put ) ;
2015-09-28 16:01:09 +03:00
static DECLARE_TLV_DB_SCALE ( ana_tlv , 0 , 100 , 0 ) ;
static DECLARE_TLV_DB_SCALE ( eq_tlv , - 1200 , 100 , 0 ) ;
static DECLARE_TLV_DB_SCALE ( digital_tlv , - 6400 , 50 , 0 ) ;
static DECLARE_TLV_DB_SCALE ( ng_tlv , - 10200 , 600 , 0 ) ;
# define WM8998_NG_SRC(name, base) \
SOC_SINGLE ( name " NG HPOUTL Switch " , base , 0 , 1 , 0 ) , \
SOC_SINGLE ( name " NG HPOUTR Switch " , base , 1 , 1 , 0 ) , \
SOC_SINGLE ( name " NG LINEOUTL Switch " , base , 2 , 1 , 0 ) , \
SOC_SINGLE ( name " NG LINEOUTR Switch " , base , 3 , 1 , 0 ) , \
SOC_SINGLE ( name " NG EPOUT Switch " , base , 4 , 1 , 0 ) , \
SOC_SINGLE ( name " NG SPKOUTL Switch " , base , 6 , 1 , 0 ) , \
SOC_SINGLE ( name " NG SPKOUTR Switch " , base , 7 , 1 , 0 )
static const struct snd_kcontrol_new wm8998_snd_controls [ ] = {
SOC_ENUM ( " IN1 OSR " , arizona_in_dmic_osr [ 0 ] ) ,
SOC_ENUM ( " IN2 OSR " , arizona_in_dmic_osr [ 1 ] ) ,
SOC_SINGLE_RANGE_TLV ( " IN1L Volume " , ARIZONA_IN1L_CONTROL ,
ARIZONA_IN1L_PGA_VOL_SHIFT , 0x40 , 0x5f , 0 , ana_tlv ) ,
SOC_SINGLE_RANGE_TLV ( " IN1R Volume " , ARIZONA_IN1R_CONTROL ,
ARIZONA_IN1R_PGA_VOL_SHIFT , 0x40 , 0x5f , 0 , ana_tlv ) ,
SOC_SINGLE_RANGE_TLV ( " IN2 Volume " , ARIZONA_IN2L_CONTROL ,
ARIZONA_IN2L_PGA_VOL_SHIFT , 0x40 , 0x5f , 0 , ana_tlv ) ,
SOC_ENUM ( " IN HPF Cutoff Frequency " , arizona_in_hpf_cut_enum ) ,
SOC_SINGLE ( " IN1L HPF Switch " , ARIZONA_IN1L_CONTROL ,
ARIZONA_IN1L_HPF_SHIFT , 1 , 0 ) ,
SOC_SINGLE ( " IN1R HPF Switch " , ARIZONA_IN1R_CONTROL ,
ARIZONA_IN1R_HPF_SHIFT , 1 , 0 ) ,
SOC_SINGLE ( " IN2 HPF Switch " , ARIZONA_IN2L_CONTROL ,
ARIZONA_IN2L_HPF_SHIFT , 1 , 0 ) ,
SOC_SINGLE_TLV ( " IN1L Digital Volume " , ARIZONA_ADC_DIGITAL_VOLUME_1L ,
ARIZONA_IN1L_DIG_VOL_SHIFT , 0xbf , 0 , digital_tlv ) ,
SOC_SINGLE_TLV ( " IN1R Digital Volume " , ARIZONA_ADC_DIGITAL_VOLUME_1R ,
ARIZONA_IN1R_DIG_VOL_SHIFT , 0xbf , 0 , digital_tlv ) ,
SOC_SINGLE_TLV ( " IN2 Digital Volume " , ARIZONA_ADC_DIGITAL_VOLUME_2L ,
ARIZONA_IN2L_DIG_VOL_SHIFT , 0xbf , 0 , digital_tlv ) ,
SOC_ENUM ( " Input Ramp Up " , arizona_in_vi_ramp ) ,
SOC_ENUM ( " Input Ramp Down " , arizona_in_vd_ramp ) ,
ARIZONA_GAINMUX_CONTROLS ( " EQ1 " , ARIZONA_EQ1MIX_INPUT_1_SOURCE ) ,
ARIZONA_GAINMUX_CONTROLS ( " EQ2 " , ARIZONA_EQ2MIX_INPUT_1_SOURCE ) ,
ARIZONA_GAINMUX_CONTROLS ( " EQ3 " , ARIZONA_EQ3MIX_INPUT_1_SOURCE ) ,
ARIZONA_GAINMUX_CONTROLS ( " EQ4 " , ARIZONA_EQ4MIX_INPUT_1_SOURCE ) ,
SND_SOC_BYTES ( " EQ1 Coefficients " , ARIZONA_EQ1_3 , 19 ) ,
SOC_SINGLE ( " EQ1 Mode Switch " , ARIZONA_EQ1_2 , ARIZONA_EQ1_B1_MODE_SHIFT , 1 , 0 ) ,
SOC_SINGLE_TLV ( " EQ1 B1 Volume " , ARIZONA_EQ1_1 , ARIZONA_EQ1_B1_GAIN_SHIFT ,
24 , 0 , eq_tlv ) ,
SOC_SINGLE_TLV ( " EQ1 B2 Volume " , ARIZONA_EQ1_1 , ARIZONA_EQ1_B2_GAIN_SHIFT ,
24 , 0 , eq_tlv ) ,
SOC_SINGLE_TLV ( " EQ1 B3 Volume " , ARIZONA_EQ1_1 , ARIZONA_EQ1_B3_GAIN_SHIFT ,
24 , 0 , eq_tlv ) ,
SOC_SINGLE_TLV ( " EQ1 B4 Volume " , ARIZONA_EQ1_2 , ARIZONA_EQ1_B4_GAIN_SHIFT ,
24 , 0 , eq_tlv ) ,
SOC_SINGLE_TLV ( " EQ1 B5 Volume " , ARIZONA_EQ1_2 , ARIZONA_EQ1_B5_GAIN_SHIFT ,
24 , 0 , eq_tlv ) ,
SND_SOC_BYTES ( " EQ2 Coefficients " , ARIZONA_EQ2_3 , 19 ) ,
SOC_SINGLE ( " EQ2 Mode Switch " , ARIZONA_EQ2_2 , ARIZONA_EQ2_B1_MODE_SHIFT , 1 , 0 ) ,
SOC_SINGLE_TLV ( " EQ2 B1 Volume " , ARIZONA_EQ2_1 , ARIZONA_EQ2_B1_GAIN_SHIFT ,
24 , 0 , eq_tlv ) ,
SOC_SINGLE_TLV ( " EQ2 B2 Volume " , ARIZONA_EQ2_1 , ARIZONA_EQ2_B2_GAIN_SHIFT ,
24 , 0 , eq_tlv ) ,
SOC_SINGLE_TLV ( " EQ2 B3 Volume " , ARIZONA_EQ2_1 , ARIZONA_EQ2_B3_GAIN_SHIFT ,
24 , 0 , eq_tlv ) ,
SOC_SINGLE_TLV ( " EQ2 B4 Volume " , ARIZONA_EQ2_2 , ARIZONA_EQ2_B4_GAIN_SHIFT ,
24 , 0 , eq_tlv ) ,
SOC_SINGLE_TLV ( " EQ2 B5 Volume " , ARIZONA_EQ2_2 , ARIZONA_EQ2_B5_GAIN_SHIFT ,
24 , 0 , eq_tlv ) ,
SND_SOC_BYTES ( " EQ3 Coefficients " , ARIZONA_EQ3_3 , 19 ) ,
SOC_SINGLE ( " EQ3 Mode Switch " , ARIZONA_EQ3_2 , ARIZONA_EQ3_B1_MODE_SHIFT , 1 , 0 ) ,
SOC_SINGLE_TLV ( " EQ3 B1 Volume " , ARIZONA_EQ3_1 , ARIZONA_EQ3_B1_GAIN_SHIFT ,
24 , 0 , eq_tlv ) ,
SOC_SINGLE_TLV ( " EQ3 B2 Volume " , ARIZONA_EQ3_1 , ARIZONA_EQ3_B2_GAIN_SHIFT ,
24 , 0 , eq_tlv ) ,
SOC_SINGLE_TLV ( " EQ3 B3 Volume " , ARIZONA_EQ3_1 , ARIZONA_EQ3_B3_GAIN_SHIFT ,
24 , 0 , eq_tlv ) ,
SOC_SINGLE_TLV ( " EQ3 B4 Volume " , ARIZONA_EQ3_2 , ARIZONA_EQ3_B4_GAIN_SHIFT ,
24 , 0 , eq_tlv ) ,
SOC_SINGLE_TLV ( " EQ3 B5 Volume " , ARIZONA_EQ3_2 , ARIZONA_EQ3_B5_GAIN_SHIFT ,
24 , 0 , eq_tlv ) ,
SND_SOC_BYTES ( " EQ4 Coefficients " , ARIZONA_EQ4_3 , 19 ) ,
SOC_SINGLE ( " EQ4 Mode Switch " , ARIZONA_EQ4_2 , ARIZONA_EQ4_B1_MODE_SHIFT , 1 , 0 ) ,
SOC_SINGLE_TLV ( " EQ4 B1 Volume " , ARIZONA_EQ4_1 , ARIZONA_EQ4_B1_GAIN_SHIFT ,
24 , 0 , eq_tlv ) ,
SOC_SINGLE_TLV ( " EQ4 B2 Volume " , ARIZONA_EQ4_1 , ARIZONA_EQ4_B2_GAIN_SHIFT ,
24 , 0 , eq_tlv ) ,
SOC_SINGLE_TLV ( " EQ4 B3 Volume " , ARIZONA_EQ4_1 , ARIZONA_EQ4_B3_GAIN_SHIFT ,
24 , 0 , eq_tlv ) ,
SOC_SINGLE_TLV ( " EQ4 B4 Volume " , ARIZONA_EQ4_2 , ARIZONA_EQ4_B4_GAIN_SHIFT ,
24 , 0 , eq_tlv ) ,
SOC_SINGLE_TLV ( " EQ4 B5 Volume " , ARIZONA_EQ4_2 , ARIZONA_EQ4_B5_GAIN_SHIFT ,
24 , 0 , eq_tlv ) ,
ARIZONA_GAINMUX_CONTROLS ( " DRC1L " , ARIZONA_DRC1LMIX_INPUT_1_SOURCE ) ,
ARIZONA_GAINMUX_CONTROLS ( " DRC1R " , ARIZONA_DRC1RMIX_INPUT_1_SOURCE ) ,
SND_SOC_BYTES_MASK ( " DRC1 " , ARIZONA_DRC1_CTRL1 , 5 ,
ARIZONA_DRC1R_ENA | ARIZONA_DRC1L_ENA ) ,
ARIZONA_MIXER_CONTROLS ( " LHPF1 " , ARIZONA_HPLP1MIX_INPUT_1_SOURCE ) ,
ARIZONA_MIXER_CONTROLS ( " LHPF2 " , ARIZONA_HPLP2MIX_INPUT_1_SOURCE ) ,
ARIZONA_MIXER_CONTROLS ( " LHPF3 " , ARIZONA_HPLP3MIX_INPUT_1_SOURCE ) ,
ARIZONA_MIXER_CONTROLS ( " LHPF4 " , ARIZONA_HPLP4MIX_INPUT_1_SOURCE ) ,
SND_SOC_BYTES ( " LHPF1 Coefficients " , ARIZONA_HPLPF1_2 , 1 ) ,
SND_SOC_BYTES ( " LHPF2 Coefficients " , ARIZONA_HPLPF2_2 , 1 ) ,
SND_SOC_BYTES ( " LHPF3 Coefficients " , ARIZONA_HPLPF3_2 , 1 ) ,
SND_SOC_BYTES ( " LHPF4 Coefficients " , ARIZONA_HPLPF4_2 , 1 ) ,
SOC_ENUM ( " LHPF1 Mode " , arizona_lhpf1_mode ) ,
SOC_ENUM ( " LHPF2 Mode " , arizona_lhpf2_mode ) ,
SOC_ENUM ( " LHPF3 Mode " , arizona_lhpf3_mode ) ,
SOC_ENUM ( " LHPF4 Mode " , arizona_lhpf4_mode ) ,
SOC_ENUM ( " ISRC1 FSL " , arizona_isrc_fsl [ 0 ] ) ,
SOC_ENUM ( " ISRC2 FSL " , arizona_isrc_fsl [ 1 ] ) ,
SOC_ENUM ( " ISRC1 FSH " , arizona_isrc_fsh [ 0 ] ) ,
SOC_ENUM ( " ISRC2 FSH " , arizona_isrc_fsh [ 1 ] ) ,
SOC_ENUM ( " ASRC RATE 1 " , arizona_asrc_rate1 ) ,
ARIZONA_MIXER_CONTROLS ( " HPOUTL " , ARIZONA_OUT1LMIX_INPUT_1_SOURCE ) ,
ARIZONA_MIXER_CONTROLS ( " HPOUTR " , ARIZONA_OUT1RMIX_INPUT_1_SOURCE ) ,
ARIZONA_MIXER_CONTROLS ( " LINEOUTL " , ARIZONA_OUT2LMIX_INPUT_1_SOURCE ) ,
ARIZONA_MIXER_CONTROLS ( " LINEOUTR " , ARIZONA_OUT2RMIX_INPUT_1_SOURCE ) ,
ARIZONA_MIXER_CONTROLS ( " EPOUT " , ARIZONA_OUT3LMIX_INPUT_1_SOURCE ) ,
ARIZONA_MIXER_CONTROLS ( " SPKOUTL " , ARIZONA_OUT4LMIX_INPUT_1_SOURCE ) ,
ARIZONA_MIXER_CONTROLS ( " SPKOUTR " , ARIZONA_OUT4RMIX_INPUT_1_SOURCE ) ,
ARIZONA_MIXER_CONTROLS ( " SPKDATL " , ARIZONA_OUT5LMIX_INPUT_1_SOURCE ) ,
ARIZONA_MIXER_CONTROLS ( " SPKDATR " , ARIZONA_OUT5RMIX_INPUT_1_SOURCE ) ,
SOC_DOUBLE_R ( " HPOUT Digital Switch " , ARIZONA_DAC_DIGITAL_VOLUME_1L ,
ARIZONA_DAC_DIGITAL_VOLUME_1R , ARIZONA_OUT1L_MUTE_SHIFT , 1 , 1 ) ,
SOC_DOUBLE_R ( " LINEOUT Digital Switch " , ARIZONA_DAC_DIGITAL_VOLUME_2L ,
ARIZONA_DAC_DIGITAL_VOLUME_2R , ARIZONA_OUT2L_MUTE_SHIFT , 1 , 1 ) ,
SOC_SINGLE ( " EPOUT Digital Switch " , ARIZONA_DAC_DIGITAL_VOLUME_3L ,
2018-02-20 19:08:11 +03:00
ARIZONA_OUT3L_MUTE_SHIFT , 1 , 1 ) ,
2015-09-28 16:01:09 +03:00
SOC_DOUBLE_R ( " Speaker Digital Switch " , ARIZONA_DAC_DIGITAL_VOLUME_4L ,
ARIZONA_DAC_DIGITAL_VOLUME_4R , ARIZONA_OUT4L_MUTE_SHIFT , 1 , 1 ) ,
SOC_DOUBLE_R ( " SPKDAT Digital Switch " , ARIZONA_DAC_DIGITAL_VOLUME_5L ,
ARIZONA_DAC_DIGITAL_VOLUME_5R , ARIZONA_OUT5L_MUTE_SHIFT , 1 , 1 ) ,
SOC_DOUBLE_R_TLV ( " HPOUT Digital Volume " , ARIZONA_DAC_DIGITAL_VOLUME_1L ,
ARIZONA_DAC_DIGITAL_VOLUME_1R , ARIZONA_OUT1L_VOL_SHIFT ,
0xbf , 0 , digital_tlv ) ,
SOC_DOUBLE_R_TLV ( " LINEOUT Digital Volume " , ARIZONA_DAC_DIGITAL_VOLUME_2L ,
ARIZONA_DAC_DIGITAL_VOLUME_2R , ARIZONA_OUT2L_VOL_SHIFT ,
0xbf , 0 , digital_tlv ) ,
SOC_SINGLE_TLV ( " EPOUT Digital Volume " , ARIZONA_DAC_DIGITAL_VOLUME_3L ,
2018-02-20 19:08:11 +03:00
ARIZONA_OUT3L_VOL_SHIFT , 0xbf , 0 , digital_tlv ) ,
2015-09-28 16:01:09 +03:00
SOC_DOUBLE_R_TLV ( " Speaker Digital Volume " , ARIZONA_DAC_DIGITAL_VOLUME_4L ,
ARIZONA_DAC_DIGITAL_VOLUME_4R , ARIZONA_OUT4L_VOL_SHIFT ,
0xbf , 0 , digital_tlv ) ,
SOC_DOUBLE_R_TLV ( " SPKDAT Digital Volume " , ARIZONA_DAC_DIGITAL_VOLUME_5L ,
ARIZONA_DAC_DIGITAL_VOLUME_5R , ARIZONA_OUT5L_VOL_SHIFT ,
0xbf , 0 , digital_tlv ) ,
SOC_DOUBLE ( " SPKDAT Switch " , ARIZONA_PDM_SPK1_CTRL_1 , ARIZONA_SPK1L_MUTE_SHIFT ,
ARIZONA_SPK1R_MUTE_SHIFT , 1 , 1 ) ,
SOC_ENUM ( " Output Ramp Up " , arizona_out_vi_ramp ) ,
SOC_ENUM ( " Output Ramp Down " , arizona_out_vd_ramp ) ,
SOC_SINGLE ( " Noise Gate Switch " , ARIZONA_NOISE_GATE_CONTROL ,
ARIZONA_NGATE_ENA_SHIFT , 1 , 0 ) ,
SOC_SINGLE_TLV ( " Noise Gate Threshold Volume " , ARIZONA_NOISE_GATE_CONTROL ,
ARIZONA_NGATE_THR_SHIFT , 7 , 1 , ng_tlv ) ,
SOC_ENUM ( " Noise Gate Hold " , arizona_ng_hold ) ,
WM8998_NG_SRC ( " HPOUTL " , ARIZONA_NOISE_GATE_SELECT_1L ) ,
WM8998_NG_SRC ( " HPOUTR " , ARIZONA_NOISE_GATE_SELECT_1R ) ,
WM8998_NG_SRC ( " LINEOUTL " , ARIZONA_NOISE_GATE_SELECT_2L ) ,
WM8998_NG_SRC ( " LINEOUTR " , ARIZONA_NOISE_GATE_SELECT_2R ) ,
WM8998_NG_SRC ( " EPOUT " , ARIZONA_NOISE_GATE_SELECT_3L ) ,
WM8998_NG_SRC ( " SPKOUTL " , ARIZONA_NOISE_GATE_SELECT_4L ) ,
WM8998_NG_SRC ( " SPKOUTR " , ARIZONA_NOISE_GATE_SELECT_4R ) ,
WM8998_NG_SRC ( " SPKDATL " , ARIZONA_NOISE_GATE_SELECT_5L ) ,
WM8998_NG_SRC ( " SPKDATR " , ARIZONA_NOISE_GATE_SELECT_5R ) ,
ARIZONA_MIXER_CONTROLS ( " AIF1TX1 " , ARIZONA_AIF1TX1MIX_INPUT_1_SOURCE ) ,
ARIZONA_MIXER_CONTROLS ( " AIF1TX2 " , ARIZONA_AIF1TX2MIX_INPUT_1_SOURCE ) ,
ARIZONA_MIXER_CONTROLS ( " AIF1TX3 " , ARIZONA_AIF1TX3MIX_INPUT_1_SOURCE ) ,
ARIZONA_MIXER_CONTROLS ( " AIF1TX4 " , ARIZONA_AIF1TX4MIX_INPUT_1_SOURCE ) ,
ARIZONA_MIXER_CONTROLS ( " AIF1TX5 " , ARIZONA_AIF1TX5MIX_INPUT_1_SOURCE ) ,
ARIZONA_MIXER_CONTROLS ( " AIF1TX6 " , ARIZONA_AIF1TX6MIX_INPUT_1_SOURCE ) ,
ARIZONA_MIXER_CONTROLS ( " AIF2TX1 " , ARIZONA_AIF2TX1MIX_INPUT_1_SOURCE ) ,
ARIZONA_MIXER_CONTROLS ( " AIF2TX2 " , ARIZONA_AIF2TX2MIX_INPUT_1_SOURCE ) ,
ARIZONA_MIXER_CONTROLS ( " AIF2TX3 " , ARIZONA_AIF2TX3MIX_INPUT_1_SOURCE ) ,
ARIZONA_MIXER_CONTROLS ( " AIF2TX4 " , ARIZONA_AIF2TX4MIX_INPUT_1_SOURCE ) ,
ARIZONA_MIXER_CONTROLS ( " AIF2TX5 " , ARIZONA_AIF2TX5MIX_INPUT_1_SOURCE ) ,
ARIZONA_MIXER_CONTROLS ( " AIF2TX6 " , ARIZONA_AIF2TX6MIX_INPUT_1_SOURCE ) ,
ARIZONA_MIXER_CONTROLS ( " AIF3TX1 " , ARIZONA_AIF3TX1MIX_INPUT_1_SOURCE ) ,
ARIZONA_MIXER_CONTROLS ( " AIF3TX2 " , ARIZONA_AIF3TX2MIX_INPUT_1_SOURCE ) ,
ARIZONA_GAINMUX_CONTROLS ( " SLIMTX1 " , ARIZONA_SLIMTX1MIX_INPUT_1_SOURCE ) ,
ARIZONA_GAINMUX_CONTROLS ( " SLIMTX2 " , ARIZONA_SLIMTX2MIX_INPUT_1_SOURCE ) ,
ARIZONA_GAINMUX_CONTROLS ( " SLIMTX3 " , ARIZONA_SLIMTX3MIX_INPUT_1_SOURCE ) ,
ARIZONA_GAINMUX_CONTROLS ( " SLIMTX4 " , ARIZONA_SLIMTX4MIX_INPUT_1_SOURCE ) ,
ARIZONA_GAINMUX_CONTROLS ( " SLIMTX5 " , ARIZONA_SLIMTX5MIX_INPUT_1_SOURCE ) ,
ARIZONA_GAINMUX_CONTROLS ( " SLIMTX6 " , ARIZONA_SLIMTX6MIX_INPUT_1_SOURCE ) ,
ARIZONA_GAINMUX_CONTROLS ( " SPDIFTX1 " , ARIZONA_SPDIFTX1MIX_INPUT_1_SOURCE ) ,
ARIZONA_GAINMUX_CONTROLS ( " SPDIFTX2 " , ARIZONA_SPDIFTX2MIX_INPUT_1_SOURCE ) ,
} ;
ARIZONA_MUX_ENUMS ( EQ1 , ARIZONA_EQ1MIX_INPUT_1_SOURCE ) ;
ARIZONA_MUX_ENUMS ( EQ2 , ARIZONA_EQ2MIX_INPUT_1_SOURCE ) ;
ARIZONA_MUX_ENUMS ( EQ3 , ARIZONA_EQ3MIX_INPUT_1_SOURCE ) ;
ARIZONA_MUX_ENUMS ( EQ4 , ARIZONA_EQ4MIX_INPUT_1_SOURCE ) ;
ARIZONA_MUX_ENUMS ( DRC1L , ARIZONA_DRC1LMIX_INPUT_1_SOURCE ) ;
ARIZONA_MUX_ENUMS ( DRC1R , ARIZONA_DRC1RMIX_INPUT_1_SOURCE ) ;
ARIZONA_MIXER_ENUMS ( LHPF1 , ARIZONA_HPLP1MIX_INPUT_1_SOURCE ) ;
ARIZONA_MIXER_ENUMS ( LHPF2 , ARIZONA_HPLP2MIX_INPUT_1_SOURCE ) ;
ARIZONA_MIXER_ENUMS ( LHPF3 , ARIZONA_HPLP3MIX_INPUT_1_SOURCE ) ;
ARIZONA_MIXER_ENUMS ( LHPF4 , ARIZONA_HPLP4MIX_INPUT_1_SOURCE ) ;
ARIZONA_MIXER_ENUMS ( PWM1 , ARIZONA_PWM1MIX_INPUT_1_SOURCE ) ;
ARIZONA_MIXER_ENUMS ( PWM2 , ARIZONA_PWM2MIX_INPUT_1_SOURCE ) ;
ARIZONA_MIXER_ENUMS ( OUT1L , ARIZONA_OUT1LMIX_INPUT_1_SOURCE ) ;
ARIZONA_MIXER_ENUMS ( OUT1R , ARIZONA_OUT1RMIX_INPUT_1_SOURCE ) ;
ARIZONA_MIXER_ENUMS ( OUT2L , ARIZONA_OUT2LMIX_INPUT_1_SOURCE ) ;
ARIZONA_MIXER_ENUMS ( OUT2R , ARIZONA_OUT2RMIX_INPUT_1_SOURCE ) ;
ARIZONA_MIXER_ENUMS ( OUT3 , ARIZONA_OUT3LMIX_INPUT_1_SOURCE ) ;
ARIZONA_MIXER_ENUMS ( SPKOUTL , ARIZONA_OUT4LMIX_INPUT_1_SOURCE ) ;
ARIZONA_MIXER_ENUMS ( SPKOUTR , ARIZONA_OUT4RMIX_INPUT_1_SOURCE ) ;
ARIZONA_MIXER_ENUMS ( SPKDATL , ARIZONA_OUT5LMIX_INPUT_1_SOURCE ) ;
ARIZONA_MIXER_ENUMS ( SPKDATR , ARIZONA_OUT5RMIX_INPUT_1_SOURCE ) ;
ARIZONA_MIXER_ENUMS ( AIF1TX1 , ARIZONA_AIF1TX1MIX_INPUT_1_SOURCE ) ;
ARIZONA_MIXER_ENUMS ( AIF1TX2 , ARIZONA_AIF1TX2MIX_INPUT_1_SOURCE ) ;
ARIZONA_MIXER_ENUMS ( AIF1TX3 , ARIZONA_AIF1TX3MIX_INPUT_1_SOURCE ) ;
ARIZONA_MIXER_ENUMS ( AIF1TX4 , ARIZONA_AIF1TX4MIX_INPUT_1_SOURCE ) ;
ARIZONA_MIXER_ENUMS ( AIF1TX5 , ARIZONA_AIF1TX5MIX_INPUT_1_SOURCE ) ;
ARIZONA_MIXER_ENUMS ( AIF1TX6 , ARIZONA_AIF1TX6MIX_INPUT_1_SOURCE ) ;
ARIZONA_MIXER_ENUMS ( AIF2TX1 , ARIZONA_AIF2TX1MIX_INPUT_1_SOURCE ) ;
ARIZONA_MIXER_ENUMS ( AIF2TX2 , ARIZONA_AIF2TX2MIX_INPUT_1_SOURCE ) ;
ARIZONA_MIXER_ENUMS ( AIF2TX3 , ARIZONA_AIF2TX3MIX_INPUT_1_SOURCE ) ;
ARIZONA_MIXER_ENUMS ( AIF2TX4 , ARIZONA_AIF2TX4MIX_INPUT_1_SOURCE ) ;
ARIZONA_MIXER_ENUMS ( AIF2TX5 , ARIZONA_AIF2TX5MIX_INPUT_1_SOURCE ) ;
ARIZONA_MIXER_ENUMS ( AIF2TX6 , ARIZONA_AIF2TX6MIX_INPUT_1_SOURCE ) ;
ARIZONA_MIXER_ENUMS ( AIF3TX1 , ARIZONA_AIF3TX1MIX_INPUT_1_SOURCE ) ;
ARIZONA_MIXER_ENUMS ( AIF3TX2 , ARIZONA_AIF3TX2MIX_INPUT_1_SOURCE ) ;
ARIZONA_MUX_ENUMS ( SLIMTX1 , ARIZONA_SLIMTX1MIX_INPUT_1_SOURCE ) ;
ARIZONA_MUX_ENUMS ( SLIMTX2 , ARIZONA_SLIMTX2MIX_INPUT_1_SOURCE ) ;
ARIZONA_MUX_ENUMS ( SLIMTX3 , ARIZONA_SLIMTX3MIX_INPUT_1_SOURCE ) ;
ARIZONA_MUX_ENUMS ( SLIMTX4 , ARIZONA_SLIMTX4MIX_INPUT_1_SOURCE ) ;
ARIZONA_MUX_ENUMS ( SLIMTX5 , ARIZONA_SLIMTX5MIX_INPUT_1_SOURCE ) ;
ARIZONA_MUX_ENUMS ( SLIMTX6 , ARIZONA_SLIMTX6MIX_INPUT_1_SOURCE ) ;
ARIZONA_MUX_ENUMS ( SPD1TX1 , ARIZONA_SPDIFTX1MIX_INPUT_1_SOURCE ) ;
ARIZONA_MUX_ENUMS ( SPD1TX2 , ARIZONA_SPDIFTX2MIX_INPUT_1_SOURCE ) ;
ARIZONA_MUX_ENUMS ( ASRC1L , ARIZONA_ASRC1LMIX_INPUT_1_SOURCE ) ;
ARIZONA_MUX_ENUMS ( ASRC1R , ARIZONA_ASRC1RMIX_INPUT_1_SOURCE ) ;
ARIZONA_MUX_ENUMS ( ASRC2L , ARIZONA_ASRC2LMIX_INPUT_1_SOURCE ) ;
ARIZONA_MUX_ENUMS ( ASRC2R , ARIZONA_ASRC2RMIX_INPUT_1_SOURCE ) ;
ARIZONA_MUX_ENUMS ( ISRC1INT1 , ARIZONA_ISRC1INT1MIX_INPUT_1_SOURCE ) ;
ARIZONA_MUX_ENUMS ( ISRC1INT2 , ARIZONA_ISRC1INT2MIX_INPUT_1_SOURCE ) ;
ARIZONA_MUX_ENUMS ( ISRC1INT3 , ARIZONA_ISRC1INT3MIX_INPUT_1_SOURCE ) ;
ARIZONA_MUX_ENUMS ( ISRC1INT4 , ARIZONA_ISRC1INT4MIX_INPUT_1_SOURCE ) ;
ARIZONA_MUX_ENUMS ( ISRC1DEC1 , ARIZONA_ISRC1DEC1MIX_INPUT_1_SOURCE ) ;
ARIZONA_MUX_ENUMS ( ISRC1DEC2 , ARIZONA_ISRC1DEC2MIX_INPUT_1_SOURCE ) ;
ARIZONA_MUX_ENUMS ( ISRC1DEC3 , ARIZONA_ISRC1DEC3MIX_INPUT_1_SOURCE ) ;
ARIZONA_MUX_ENUMS ( ISRC1DEC4 , ARIZONA_ISRC1DEC4MIX_INPUT_1_SOURCE ) ;
ARIZONA_MUX_ENUMS ( ISRC2INT1 , ARIZONA_ISRC2INT1MIX_INPUT_1_SOURCE ) ;
ARIZONA_MUX_ENUMS ( ISRC2INT2 , ARIZONA_ISRC2INT2MIX_INPUT_1_SOURCE ) ;
ARIZONA_MUX_ENUMS ( ISRC2DEC1 , ARIZONA_ISRC2DEC1MIX_INPUT_1_SOURCE ) ;
ARIZONA_MUX_ENUMS ( ISRC2DEC2 , ARIZONA_ISRC2DEC2MIX_INPUT_1_SOURCE ) ;
static const char * const wm8998_aec_loopback_texts [ ] = {
" HPOUTL " , " HPOUTR " , " LINEOUTL " , " LINEOUTR " , " EPOUT " ,
" SPKOUTL " , " SPKOUTR " , " SPKDATL " , " SPKDATR " ,
} ;
static const unsigned int wm8998_aec_loopback_values [ ] = {
0 , 1 , 2 , 3 , 4 , 6 , 7 , 8 , 9 ,
} ;
2015-11-03 18:05:50 +03:00
static SOC_VALUE_ENUM_SINGLE_DECL ( wm8998_aec1_loopback ,
ARIZONA_DAC_AEC_CONTROL_1 ,
ARIZONA_AEC_LOOPBACK_SRC_SHIFT , 0xf ,
wm8998_aec_loopback_texts ,
wm8998_aec_loopback_values ) ;
static SOC_VALUE_ENUM_SINGLE_DECL ( wm8998_aec2_loopback ,
ARIZONA_DAC_AEC_CONTROL_2 ,
ARIZONA_AEC_LOOPBACK_SRC_SHIFT , 0xf ,
wm8998_aec_loopback_texts ,
wm8998_aec_loopback_values ) ;
2015-09-28 16:01:09 +03:00
static const struct snd_kcontrol_new wm8998_aec_loopback_mux [ ] = {
SOC_DAPM_ENUM ( " AEC1 Loopback " , wm8998_aec1_loopback ) ,
SOC_DAPM_ENUM ( " AEC2 Loopback " , wm8998_aec2_loopback ) ,
} ;
static const struct snd_soc_dapm_widget wm8998_dapm_widgets [ ] = {
SND_SOC_DAPM_SUPPLY ( " SYSCLK " , ARIZONA_SYSTEM_CLOCK_1 ,
2016-10-21 16:15:57 +03:00
ARIZONA_SYSCLK_ENA_SHIFT , 0 , arizona_clk_ev ,
SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD ) ,
2015-09-28 16:01:09 +03:00
SND_SOC_DAPM_SUPPLY ( " ASYNCCLK " , ARIZONA_ASYNC_CLOCK_1 ,
2016-10-21 16:15:57 +03:00
ARIZONA_ASYNC_CLK_ENA_SHIFT , 0 , arizona_clk_ev ,
SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD ) ,
2015-09-28 16:01:09 +03:00
SND_SOC_DAPM_SUPPLY ( " OPCLK " , ARIZONA_OUTPUT_SYSTEM_CLOCK ,
ARIZONA_OPCLK_ENA_SHIFT , 0 , NULL , 0 ) ,
SND_SOC_DAPM_SUPPLY ( " ASYNCOPCLK " , ARIZONA_OUTPUT_ASYNC_CLOCK ,
ARIZONA_OPCLK_ASYNC_ENA_SHIFT , 0 , NULL , 0 ) ,
SND_SOC_DAPM_REGULATOR_SUPPLY ( " DBVDD2 " , 0 , 0 ) ,
SND_SOC_DAPM_REGULATOR_SUPPLY ( " DBVDD3 " , 0 , 0 ) ,
SND_SOC_DAPM_REGULATOR_SUPPLY ( " CPVDD " , 20 , 0 ) ,
SND_SOC_DAPM_REGULATOR_SUPPLY ( " MICVDD " , 0 , SND_SOC_DAPM_REGULATOR_BYPASS ) ,
SND_SOC_DAPM_REGULATOR_SUPPLY ( " SPKVDDL " , 0 , 0 ) ,
SND_SOC_DAPM_REGULATOR_SUPPLY ( " SPKVDDR " , 0 , 0 ) ,
SND_SOC_DAPM_SIGGEN ( " TONE " ) ,
SND_SOC_DAPM_SIGGEN ( " HAPTICS " ) ,
SND_SOC_DAPM_INPUT ( " IN1AL " ) ,
SND_SOC_DAPM_INPUT ( " IN1AR " ) ,
SND_SOC_DAPM_INPUT ( " IN1BL " ) ,
SND_SOC_DAPM_INPUT ( " IN1BR " ) ,
SND_SOC_DAPM_INPUT ( " IN2A " ) ,
SND_SOC_DAPM_INPUT ( " IN2B " ) ,
SND_SOC_DAPM_MUX ( " IN1L Mux " , SND_SOC_NOPM , 0 , 0 , & wm8998_in1mux [ 0 ] ) ,
SND_SOC_DAPM_MUX ( " IN1R Mux " , SND_SOC_NOPM , 0 , 0 , & wm8998_in1mux [ 1 ] ) ,
SND_SOC_DAPM_MUX ( " IN2 Mux " , SND_SOC_NOPM , 0 , 0 , & wm8998_in2mux ) ,
SND_SOC_DAPM_OUTPUT ( " DRC1 Signal Activity " ) ,
SND_SOC_DAPM_PGA_E ( " IN1L PGA " , ARIZONA_INPUT_ENABLES , ARIZONA_IN1L_ENA_SHIFT ,
0 , NULL , 0 , arizona_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 PGA " , ARIZONA_INPUT_ENABLES , ARIZONA_IN1R_ENA_SHIFT ,
0 , NULL , 0 , arizona_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 ( " IN2 PGA " , ARIZONA_INPUT_ENABLES , ARIZONA_IN2L_ENA_SHIFT ,
0 , NULL , 0 , arizona_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_SUPPLY ( " MICBIAS1 " , ARIZONA_MIC_BIAS_CTRL_1 ,
ARIZONA_MICB1_ENA_SHIFT , 0 , NULL , 0 ) ,
SND_SOC_DAPM_SUPPLY ( " MICBIAS2 " , ARIZONA_MIC_BIAS_CTRL_2 ,
ARIZONA_MICB1_ENA_SHIFT , 0 , NULL , 0 ) ,
SND_SOC_DAPM_SUPPLY ( " MICBIAS3 " , ARIZONA_MIC_BIAS_CTRL_3 ,
ARIZONA_MICB1_ENA_SHIFT , 0 , NULL , 0 ) ,
SND_SOC_DAPM_PGA ( " Tone Generator 1 " , ARIZONA_TONE_GENERATOR_1 ,
ARIZONA_TONE1_ENA_SHIFT , 0 , NULL , 0 ) ,
SND_SOC_DAPM_PGA ( " Tone Generator 2 " , ARIZONA_TONE_GENERATOR_1 ,
ARIZONA_TONE2_ENA_SHIFT , 0 , NULL , 0 ) ,
SND_SOC_DAPM_PGA ( " EQ1 " , ARIZONA_EQ1_1 , ARIZONA_EQ1_ENA_SHIFT , 0 , NULL , 0 ) ,
SND_SOC_DAPM_PGA ( " EQ2 " , ARIZONA_EQ2_1 , ARIZONA_EQ2_ENA_SHIFT , 0 , NULL , 0 ) ,
SND_SOC_DAPM_PGA ( " EQ3 " , ARIZONA_EQ3_1 , ARIZONA_EQ3_ENA_SHIFT , 0 , NULL , 0 ) ,
SND_SOC_DAPM_PGA ( " EQ4 " , ARIZONA_EQ4_1 , ARIZONA_EQ4_ENA_SHIFT , 0 , NULL , 0 ) ,
SND_SOC_DAPM_PGA ( " DRC1L " , ARIZONA_DRC1_CTRL1 , ARIZONA_DRC1L_ENA_SHIFT , 0 ,
NULL , 0 ) ,
SND_SOC_DAPM_PGA ( " DRC1R " , ARIZONA_DRC1_CTRL1 , ARIZONA_DRC1R_ENA_SHIFT , 0 ,
NULL , 0 ) ,
SND_SOC_DAPM_PGA ( " LHPF1 " , ARIZONA_HPLPF1_1 , ARIZONA_LHPF1_ENA_SHIFT , 0 ,
NULL , 0 ) ,
SND_SOC_DAPM_PGA ( " LHPF2 " , ARIZONA_HPLPF2_1 , ARIZONA_LHPF2_ENA_SHIFT , 0 ,
NULL , 0 ) ,
SND_SOC_DAPM_PGA ( " LHPF3 " , ARIZONA_HPLPF3_1 , ARIZONA_LHPF3_ENA_SHIFT , 0 ,
NULL , 0 ) ,
SND_SOC_DAPM_PGA ( " LHPF4 " , ARIZONA_HPLPF4_1 , ARIZONA_LHPF4_ENA_SHIFT , 0 ,
NULL , 0 ) ,
SND_SOC_DAPM_PGA ( " PWM1 Driver " , ARIZONA_PWM_DRIVE_1 , ARIZONA_PWM1_ENA_SHIFT ,
0 , NULL , 0 ) ,
SND_SOC_DAPM_PGA ( " PWM2 Driver " , ARIZONA_PWM_DRIVE_1 , ARIZONA_PWM2_ENA_SHIFT ,
0 , NULL , 0 ) ,
SND_SOC_DAPM_PGA_E ( " ASRC1L " , ARIZONA_ASRC_ENABLE , ARIZONA_ASRC1L_ENA_SHIFT , 0 ,
NULL , 0 , wm8998_asrc_ev , SND_SOC_DAPM_PRE_PMU ) ,
SND_SOC_DAPM_PGA_E ( " ASRC1R " , ARIZONA_ASRC_ENABLE , ARIZONA_ASRC1R_ENA_SHIFT , 0 ,
NULL , 0 , wm8998_asrc_ev , SND_SOC_DAPM_PRE_PMU ) ,
SND_SOC_DAPM_PGA_E ( " ASRC2L " , ARIZONA_ASRC_ENABLE , ARIZONA_ASRC2L_ENA_SHIFT , 0 ,
NULL , 0 , wm8998_asrc_ev , SND_SOC_DAPM_PRE_PMU ) ,
SND_SOC_DAPM_PGA_E ( " ASRC2R " , ARIZONA_ASRC_ENABLE , ARIZONA_ASRC2R_ENA_SHIFT , 0 ,
NULL , 0 , wm8998_asrc_ev , SND_SOC_DAPM_PRE_PMU ) ,
SND_SOC_DAPM_PGA ( " ISRC1INT1 " , ARIZONA_ISRC_1_CTRL_3 ,
ARIZONA_ISRC1_INT0_ENA_SHIFT , 0 , NULL , 0 ) ,
SND_SOC_DAPM_PGA ( " ISRC1INT2 " , ARIZONA_ISRC_1_CTRL_3 ,
ARIZONA_ISRC1_INT1_ENA_SHIFT , 0 , NULL , 0 ) ,
SND_SOC_DAPM_PGA ( " ISRC1INT3 " , ARIZONA_ISRC_1_CTRL_3 ,
ARIZONA_ISRC1_INT2_ENA_SHIFT , 0 , NULL , 0 ) ,
SND_SOC_DAPM_PGA ( " ISRC1INT4 " , ARIZONA_ISRC_1_CTRL_3 ,
ARIZONA_ISRC1_INT3_ENA_SHIFT , 0 , NULL , 0 ) ,
SND_SOC_DAPM_PGA ( " ISRC1DEC1 " , ARIZONA_ISRC_1_CTRL_3 ,
ARIZONA_ISRC1_DEC0_ENA_SHIFT , 0 , NULL , 0 ) ,
SND_SOC_DAPM_PGA ( " ISRC1DEC2 " , ARIZONA_ISRC_1_CTRL_3 ,
ARIZONA_ISRC1_DEC1_ENA_SHIFT , 0 , NULL , 0 ) ,
SND_SOC_DAPM_PGA ( " ISRC1DEC3 " , ARIZONA_ISRC_1_CTRL_3 ,
ARIZONA_ISRC1_DEC2_ENA_SHIFT , 0 , NULL , 0 ) ,
SND_SOC_DAPM_PGA ( " ISRC1DEC4 " , ARIZONA_ISRC_1_CTRL_3 ,
ARIZONA_ISRC1_DEC3_ENA_SHIFT , 0 , NULL , 0 ) ,
SND_SOC_DAPM_PGA ( " ISRC2INT1 " , ARIZONA_ISRC_2_CTRL_3 ,
ARIZONA_ISRC2_INT0_ENA_SHIFT , 0 , NULL , 0 ) ,
SND_SOC_DAPM_PGA ( " ISRC2INT2 " , ARIZONA_ISRC_2_CTRL_3 ,
ARIZONA_ISRC2_INT1_ENA_SHIFT , 0 , NULL , 0 ) ,
SND_SOC_DAPM_PGA ( " ISRC2DEC1 " , ARIZONA_ISRC_2_CTRL_3 ,
ARIZONA_ISRC2_DEC0_ENA_SHIFT , 0 , NULL , 0 ) ,
SND_SOC_DAPM_PGA ( " ISRC2DEC2 " , ARIZONA_ISRC_2_CTRL_3 ,
ARIZONA_ISRC2_DEC1_ENA_SHIFT , 0 , NULL , 0 ) ,
SND_SOC_DAPM_MUX ( " AEC1 Loopback " , ARIZONA_DAC_AEC_CONTROL_1 ,
2018-02-20 19:08:11 +03:00
ARIZONA_AEC_LOOPBACK_ENA_SHIFT , 0 ,
& wm8998_aec_loopback_mux [ 0 ] ) ,
2015-09-28 16:01:09 +03:00
SND_SOC_DAPM_MUX ( " AEC2 Loopback " , ARIZONA_DAC_AEC_CONTROL_2 ,
2018-02-20 19:08:11 +03:00
ARIZONA_AEC_LOOPBACK_ENA_SHIFT , 0 ,
& wm8998_aec_loopback_mux [ 1 ] ) ,
2015-09-28 16:01:09 +03:00
SND_SOC_DAPM_AIF_OUT ( " AIF1TX1 " , NULL , 0 ,
ARIZONA_AIF1_TX_ENABLES , ARIZONA_AIF1TX1_ENA_SHIFT , 0 ) ,
2019-01-31 16:30:19 +03:00
SND_SOC_DAPM_AIF_OUT ( " AIF1TX2 " , NULL , 1 ,
2015-09-28 16:01:09 +03:00
ARIZONA_AIF1_TX_ENABLES , ARIZONA_AIF1TX2_ENA_SHIFT , 0 ) ,
2019-01-31 16:30:19 +03:00
SND_SOC_DAPM_AIF_OUT ( " AIF1TX3 " , NULL , 2 ,
2015-09-28 16:01:09 +03:00
ARIZONA_AIF1_TX_ENABLES , ARIZONA_AIF1TX3_ENA_SHIFT , 0 ) ,
2019-01-31 16:30:19 +03:00
SND_SOC_DAPM_AIF_OUT ( " AIF1TX4 " , NULL , 3 ,
2015-09-28 16:01:09 +03:00
ARIZONA_AIF1_TX_ENABLES , ARIZONA_AIF1TX4_ENA_SHIFT , 0 ) ,
2019-01-31 16:30:19 +03:00
SND_SOC_DAPM_AIF_OUT ( " AIF1TX5 " , NULL , 4 ,
2015-09-28 16:01:09 +03:00
ARIZONA_AIF1_TX_ENABLES , ARIZONA_AIF1TX5_ENA_SHIFT , 0 ) ,
2019-01-31 16:30:19 +03:00
SND_SOC_DAPM_AIF_OUT ( " AIF1TX6 " , NULL , 5 ,
2015-09-28 16:01:09 +03:00
ARIZONA_AIF1_TX_ENABLES , ARIZONA_AIF1TX6_ENA_SHIFT , 0 ) ,
SND_SOC_DAPM_AIF_IN ( " AIF1RX1 " , NULL , 0 ,
ARIZONA_AIF1_RX_ENABLES , ARIZONA_AIF1RX1_ENA_SHIFT , 0 ) ,
2019-01-31 16:30:19 +03:00
SND_SOC_DAPM_AIF_IN ( " AIF1RX2 " , NULL , 1 ,
2015-09-28 16:01:09 +03:00
ARIZONA_AIF1_RX_ENABLES , ARIZONA_AIF1RX2_ENA_SHIFT , 0 ) ,
2019-01-31 16:30:19 +03:00
SND_SOC_DAPM_AIF_IN ( " AIF1RX3 " , NULL , 2 ,
2015-09-28 16:01:09 +03:00
ARIZONA_AIF1_RX_ENABLES , ARIZONA_AIF1RX3_ENA_SHIFT , 0 ) ,
2019-01-31 16:30:19 +03:00
SND_SOC_DAPM_AIF_IN ( " AIF1RX4 " , NULL , 3 ,
2015-09-28 16:01:09 +03:00
ARIZONA_AIF1_RX_ENABLES , ARIZONA_AIF1RX4_ENA_SHIFT , 0 ) ,
2019-01-31 16:30:19 +03:00
SND_SOC_DAPM_AIF_IN ( " AIF1RX5 " , NULL , 4 ,
2015-09-28 16:01:09 +03:00
ARIZONA_AIF1_RX_ENABLES , ARIZONA_AIF1RX5_ENA_SHIFT , 0 ) ,
2019-01-31 16:30:19 +03:00
SND_SOC_DAPM_AIF_IN ( " AIF1RX6 " , NULL , 5 ,
2015-09-28 16:01:09 +03:00
ARIZONA_AIF1_RX_ENABLES , ARIZONA_AIF1RX6_ENA_SHIFT , 0 ) ,
SND_SOC_DAPM_AIF_OUT ( " AIF2TX1 " , NULL , 0 ,
ARIZONA_AIF2_TX_ENABLES , ARIZONA_AIF2TX1_ENA_SHIFT , 0 ) ,
2019-01-31 16:30:19 +03:00
SND_SOC_DAPM_AIF_OUT ( " AIF2TX2 " , NULL , 1 ,
2015-09-28 16:01:09 +03:00
ARIZONA_AIF2_TX_ENABLES , ARIZONA_AIF2TX2_ENA_SHIFT , 0 ) ,
2019-01-31 16:30:19 +03:00
SND_SOC_DAPM_AIF_OUT ( " AIF2TX3 " , NULL , 2 ,
2015-09-28 16:01:09 +03:00
ARIZONA_AIF2_TX_ENABLES , ARIZONA_AIF2TX3_ENA_SHIFT , 0 ) ,
2019-01-31 16:30:19 +03:00
SND_SOC_DAPM_AIF_OUT ( " AIF2TX4 " , NULL , 3 ,
2015-09-28 16:01:09 +03:00
ARIZONA_AIF2_TX_ENABLES , ARIZONA_AIF2TX4_ENA_SHIFT , 0 ) ,
2019-01-31 16:30:19 +03:00
SND_SOC_DAPM_AIF_OUT ( " AIF2TX5 " , NULL , 4 ,
2015-09-28 16:01:09 +03:00
ARIZONA_AIF2_TX_ENABLES , ARIZONA_AIF2TX5_ENA_SHIFT , 0 ) ,
2019-01-31 16:30:19 +03:00
SND_SOC_DAPM_AIF_OUT ( " AIF2TX6 " , NULL , 5 ,
2015-09-28 16:01:09 +03:00
ARIZONA_AIF2_TX_ENABLES , ARIZONA_AIF2TX6_ENA_SHIFT , 0 ) ,
SND_SOC_DAPM_AIF_IN ( " AIF2RX1 " , NULL , 0 ,
ARIZONA_AIF2_RX_ENABLES , ARIZONA_AIF2RX1_ENA_SHIFT , 0 ) ,
2019-01-31 16:30:19 +03:00
SND_SOC_DAPM_AIF_IN ( " AIF2RX2 " , NULL , 1 ,
2015-09-28 16:01:09 +03:00
ARIZONA_AIF2_RX_ENABLES , ARIZONA_AIF2RX2_ENA_SHIFT , 0 ) ,
2019-01-31 16:30:19 +03:00
SND_SOC_DAPM_AIF_IN ( " AIF2RX3 " , NULL , 2 ,
2015-09-28 16:01:09 +03:00
ARIZONA_AIF2_RX_ENABLES , ARIZONA_AIF2RX3_ENA_SHIFT , 0 ) ,
2019-01-31 16:30:19 +03:00
SND_SOC_DAPM_AIF_IN ( " AIF2RX4 " , NULL , 3 ,
2015-09-28 16:01:09 +03:00
ARIZONA_AIF2_RX_ENABLES , ARIZONA_AIF2RX4_ENA_SHIFT , 0 ) ,
2019-01-31 16:30:19 +03:00
SND_SOC_DAPM_AIF_IN ( " AIF2RX5 " , NULL , 4 ,
2015-09-28 16:01:09 +03:00
ARIZONA_AIF2_RX_ENABLES , ARIZONA_AIF2RX5_ENA_SHIFT , 0 ) ,
2019-01-31 16:30:19 +03:00
SND_SOC_DAPM_AIF_IN ( " AIF2RX6 " , NULL , 5 ,
2015-09-28 16:01:09 +03:00
ARIZONA_AIF2_RX_ENABLES , ARIZONA_AIF2RX6_ENA_SHIFT , 0 ) ,
SND_SOC_DAPM_AIF_IN ( " SLIMRX1 " , NULL , 0 ,
ARIZONA_SLIMBUS_RX_CHANNEL_ENABLE ,
ARIZONA_SLIMRX1_ENA_SHIFT , 0 ) ,
2019-01-31 16:30:19 +03:00
SND_SOC_DAPM_AIF_IN ( " SLIMRX2 " , NULL , 1 ,
2015-09-28 16:01:09 +03:00
ARIZONA_SLIMBUS_RX_CHANNEL_ENABLE ,
ARIZONA_SLIMRX2_ENA_SHIFT , 0 ) ,
2019-01-31 16:30:19 +03:00
SND_SOC_DAPM_AIF_IN ( " SLIMRX3 " , NULL , 2 ,
2015-09-28 16:01:09 +03:00
ARIZONA_SLIMBUS_RX_CHANNEL_ENABLE ,
ARIZONA_SLIMRX3_ENA_SHIFT , 0 ) ,
2019-01-31 16:30:19 +03:00
SND_SOC_DAPM_AIF_IN ( " SLIMRX4 " , NULL , 3 ,
2015-09-28 16:01:09 +03:00
ARIZONA_SLIMBUS_RX_CHANNEL_ENABLE ,
ARIZONA_SLIMRX4_ENA_SHIFT , 0 ) ,
SND_SOC_DAPM_AIF_OUT ( " SLIMTX1 " , NULL , 0 ,
ARIZONA_SLIMBUS_TX_CHANNEL_ENABLE ,
ARIZONA_SLIMTX1_ENA_SHIFT , 0 ) ,
2019-01-31 16:30:19 +03:00
SND_SOC_DAPM_AIF_OUT ( " SLIMTX2 " , NULL , 1 ,
2015-09-28 16:01:09 +03:00
ARIZONA_SLIMBUS_TX_CHANNEL_ENABLE ,
ARIZONA_SLIMTX2_ENA_SHIFT , 0 ) ,
2019-01-31 16:30:19 +03:00
SND_SOC_DAPM_AIF_OUT ( " SLIMTX3 " , NULL , 2 ,
2015-09-28 16:01:09 +03:00
ARIZONA_SLIMBUS_TX_CHANNEL_ENABLE ,
ARIZONA_SLIMTX3_ENA_SHIFT , 0 ) ,
2019-01-31 16:30:19 +03:00
SND_SOC_DAPM_AIF_OUT ( " SLIMTX4 " , NULL , 3 ,
2015-09-28 16:01:09 +03:00
ARIZONA_SLIMBUS_TX_CHANNEL_ENABLE ,
ARIZONA_SLIMTX4_ENA_SHIFT , 0 ) ,
2019-01-31 16:30:19 +03:00
SND_SOC_DAPM_AIF_OUT ( " SLIMTX5 " , NULL , 4 ,
2015-09-28 16:01:09 +03:00
ARIZONA_SLIMBUS_TX_CHANNEL_ENABLE ,
ARIZONA_SLIMTX5_ENA_SHIFT , 0 ) ,
2019-01-31 16:30:19 +03:00
SND_SOC_DAPM_AIF_OUT ( " SLIMTX6 " , NULL , 5 ,
2015-09-28 16:01:09 +03:00
ARIZONA_SLIMBUS_TX_CHANNEL_ENABLE ,
ARIZONA_SLIMTX6_ENA_SHIFT , 0 ) ,
SND_SOC_DAPM_AIF_OUT ( " AIF3TX1 " , NULL , 0 ,
ARIZONA_AIF3_TX_ENABLES , ARIZONA_AIF3TX1_ENA_SHIFT , 0 ) ,
2019-01-31 16:30:19 +03:00
SND_SOC_DAPM_AIF_OUT ( " AIF3TX2 " , NULL , 1 ,
2015-09-28 16:01:09 +03:00
ARIZONA_AIF3_TX_ENABLES , ARIZONA_AIF3TX2_ENA_SHIFT , 0 ) ,
SND_SOC_DAPM_AIF_IN ( " AIF3RX1 " , NULL , 0 ,
ARIZONA_AIF3_RX_ENABLES , ARIZONA_AIF3RX1_ENA_SHIFT , 0 ) ,
2019-01-31 16:30:19 +03:00
SND_SOC_DAPM_AIF_IN ( " AIF3RX2 " , NULL , 1 ,
2015-09-28 16:01:09 +03:00
ARIZONA_AIF3_RX_ENABLES , ARIZONA_AIF3RX2_ENA_SHIFT , 0 ) ,
SND_SOC_DAPM_PGA_E ( " OUT1L " , SND_SOC_NOPM ,
ARIZONA_OUT1L_ENA_SHIFT , 0 , NULL , 0 , arizona_hp_ev ,
SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU ) ,
SND_SOC_DAPM_PGA_E ( " OUT1R " , SND_SOC_NOPM ,
ARIZONA_OUT1R_ENA_SHIFT , 0 , NULL , 0 , arizona_hp_ev ,
SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU ) ,
SND_SOC_DAPM_PGA_E ( " OUT2L " , ARIZONA_OUTPUT_ENABLES_1 ,
ARIZONA_OUT2L_ENA_SHIFT , 0 , NULL , 0 , arizona_out_ev ,
SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU ) ,
SND_SOC_DAPM_PGA_E ( " OUT2R " , ARIZONA_OUTPUT_ENABLES_1 ,
ARIZONA_OUT2R_ENA_SHIFT , 0 , NULL , 0 , arizona_out_ev ,
SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU ) ,
SND_SOC_DAPM_PGA_E ( " OUT3 " , ARIZONA_OUTPUT_ENABLES_1 ,
ARIZONA_OUT3L_ENA_SHIFT , 0 , NULL , 0 , arizona_out_ev ,
SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU ) ,
SND_SOC_DAPM_PGA_E ( " OUT5L " , ARIZONA_OUTPUT_ENABLES_1 ,
ARIZONA_OUT5L_ENA_SHIFT , 0 , NULL , 0 , arizona_out_ev ,
SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU ) ,
SND_SOC_DAPM_PGA_E ( " OUT5R " , ARIZONA_OUTPUT_ENABLES_1 ,
ARIZONA_OUT5R_ENA_SHIFT , 0 , NULL , 0 , arizona_out_ev ,
SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU ) ,
SND_SOC_DAPM_PGA ( " SPD1TX1 " , ARIZONA_SPD1_TX_CONTROL ,
2018-02-20 19:08:11 +03:00
ARIZONA_SPD1_VAL1_SHIFT , 0 , NULL , 0 ) ,
2015-09-28 16:01:09 +03:00
SND_SOC_DAPM_PGA ( " SPD1TX2 " , ARIZONA_SPD1_TX_CONTROL ,
2018-02-20 19:08:11 +03:00
ARIZONA_SPD1_VAL2_SHIFT , 0 , NULL , 0 ) ,
2015-09-28 16:01:09 +03:00
SND_SOC_DAPM_OUT_DRV ( " SPD1 " , ARIZONA_SPD1_TX_CONTROL ,
ARIZONA_SPD1_ENA_SHIFT , 0 , NULL , 0 ) ,
ARIZONA_MUX_WIDGETS ( EQ1 , " EQ1 " ) ,
ARIZONA_MUX_WIDGETS ( EQ2 , " EQ2 " ) ,
ARIZONA_MUX_WIDGETS ( EQ3 , " EQ3 " ) ,
ARIZONA_MUX_WIDGETS ( EQ4 , " EQ4 " ) ,
ARIZONA_MUX_WIDGETS ( DRC1L , " DRC1L " ) ,
ARIZONA_MUX_WIDGETS ( DRC1R , " DRC1R " ) ,
ARIZONA_MIXER_WIDGETS ( LHPF1 , " LHPF1 " ) ,
ARIZONA_MIXER_WIDGETS ( LHPF2 , " LHPF2 " ) ,
ARIZONA_MIXER_WIDGETS ( LHPF3 , " LHPF3 " ) ,
ARIZONA_MIXER_WIDGETS ( LHPF4 , " LHPF4 " ) ,
ARIZONA_MIXER_WIDGETS ( PWM1 , " PWM1 " ) ,
ARIZONA_MIXER_WIDGETS ( PWM2 , " PWM2 " ) ,
ARIZONA_MIXER_WIDGETS ( OUT1L , " HPOUTL " ) ,
ARIZONA_MIXER_WIDGETS ( OUT1R , " HPOUTR " ) ,
ARIZONA_MIXER_WIDGETS ( OUT2L , " LINEOUTL " ) ,
ARIZONA_MIXER_WIDGETS ( OUT2R , " LINEOUTR " ) ,
ARIZONA_MIXER_WIDGETS ( OUT3 , " EPOUT " ) ,
ARIZONA_MIXER_WIDGETS ( SPKOUTL , " SPKOUTL " ) ,
ARIZONA_MIXER_WIDGETS ( SPKOUTR , " SPKOUTR " ) ,
ARIZONA_MIXER_WIDGETS ( SPKDATL , " SPKDATL " ) ,
ARIZONA_MIXER_WIDGETS ( SPKDATR , " SPKDATR " ) ,
ARIZONA_MIXER_WIDGETS ( AIF1TX1 , " AIF1TX1 " ) ,
ARIZONA_MIXER_WIDGETS ( AIF1TX2 , " AIF1TX2 " ) ,
ARIZONA_MIXER_WIDGETS ( AIF1TX3 , " AIF1TX3 " ) ,
ARIZONA_MIXER_WIDGETS ( AIF1TX4 , " AIF1TX4 " ) ,
ARIZONA_MIXER_WIDGETS ( AIF1TX5 , " AIF1TX5 " ) ,
ARIZONA_MIXER_WIDGETS ( AIF1TX6 , " AIF1TX6 " ) ,
ARIZONA_MIXER_WIDGETS ( AIF2TX1 , " AIF2TX1 " ) ,
ARIZONA_MIXER_WIDGETS ( AIF2TX2 , " AIF2TX2 " ) ,
ARIZONA_MIXER_WIDGETS ( AIF2TX3 , " AIF2TX3 " ) ,
ARIZONA_MIXER_WIDGETS ( AIF2TX4 , " AIF2TX4 " ) ,
ARIZONA_MIXER_WIDGETS ( AIF2TX5 , " AIF2TX5 " ) ,
ARIZONA_MIXER_WIDGETS ( AIF2TX6 , " AIF2TX6 " ) ,
ARIZONA_MIXER_WIDGETS ( AIF3TX1 , " AIF3TX1 " ) ,
ARIZONA_MIXER_WIDGETS ( AIF3TX2 , " AIF3TX2 " ) ,
ARIZONA_MUX_WIDGETS ( SLIMTX1 , " SLIMTX1 " ) ,
ARIZONA_MUX_WIDGETS ( SLIMTX2 , " SLIMTX2 " ) ,
ARIZONA_MUX_WIDGETS ( SLIMTX3 , " SLIMTX3 " ) ,
ARIZONA_MUX_WIDGETS ( SLIMTX4 , " SLIMTX4 " ) ,
ARIZONA_MUX_WIDGETS ( SLIMTX5 , " SLIMTX5 " ) ,
ARIZONA_MUX_WIDGETS ( SLIMTX6 , " SLIMTX6 " ) ,
ARIZONA_MUX_WIDGETS ( SPD1TX1 , " SPDIFTX1 " ) ,
ARIZONA_MUX_WIDGETS ( SPD1TX2 , " SPDIFTX2 " ) ,
ARIZONA_MUX_WIDGETS ( ASRC1L , " ASRC1L " ) ,
ARIZONA_MUX_WIDGETS ( ASRC1R , " ASRC1R " ) ,
ARIZONA_MUX_WIDGETS ( ASRC2L , " ASRC2L " ) ,
ARIZONA_MUX_WIDGETS ( ASRC2R , " ASRC2R " ) ,
ARIZONA_MUX_WIDGETS ( ISRC1DEC1 , " ISRC1DEC1 " ) ,
ARIZONA_MUX_WIDGETS ( ISRC1DEC2 , " ISRC1DEC2 " ) ,
ARIZONA_MUX_WIDGETS ( ISRC1DEC3 , " ISRC1DEC3 " ) ,
ARIZONA_MUX_WIDGETS ( ISRC1DEC4 , " ISRC1DEC4 " ) ,
ARIZONA_MUX_WIDGETS ( ISRC1INT1 , " ISRC1INT1 " ) ,
ARIZONA_MUX_WIDGETS ( ISRC1INT2 , " ISRC1INT2 " ) ,
ARIZONA_MUX_WIDGETS ( ISRC1INT3 , " ISRC1INT3 " ) ,
ARIZONA_MUX_WIDGETS ( ISRC1INT4 , " ISRC1INT4 " ) ,
ARIZONA_MUX_WIDGETS ( ISRC2DEC1 , " ISRC2DEC1 " ) ,
ARIZONA_MUX_WIDGETS ( ISRC2DEC2 , " ISRC2DEC2 " ) ,
ARIZONA_MUX_WIDGETS ( ISRC2INT1 , " ISRC2INT1 " ) ,
ARIZONA_MUX_WIDGETS ( ISRC2INT2 , " ISRC2INT2 " ) ,
SND_SOC_DAPM_OUTPUT ( " HPOUTL " ) ,
SND_SOC_DAPM_OUTPUT ( " HPOUTR " ) ,
SND_SOC_DAPM_OUTPUT ( " LINEOUTL " ) ,
SND_SOC_DAPM_OUTPUT ( " LINEOUTR " ) ,
SND_SOC_DAPM_OUTPUT ( " EPOUT " ) ,
SND_SOC_DAPM_OUTPUT ( " SPKOUTLN " ) ,
SND_SOC_DAPM_OUTPUT ( " SPKOUTLP " ) ,
SND_SOC_DAPM_OUTPUT ( " SPKOUTRN " ) ,
SND_SOC_DAPM_OUTPUT ( " SPKOUTRP " ) ,
SND_SOC_DAPM_OUTPUT ( " SPKDATL " ) ,
SND_SOC_DAPM_OUTPUT ( " SPKDATR " ) ,
SND_SOC_DAPM_OUTPUT ( " SPDIF " ) ,
SND_SOC_DAPM_OUTPUT ( " MICSUPP " ) ,
} ;
# define ARIZONA_MIXER_INPUT_ROUTES(name) \
{ name , " Tone Generator 1 " , " Tone Generator 1 " } , \
{ name , " Tone Generator 2 " , " Tone Generator 2 " } , \
{ name , " Haptics " , " HAPTICS " } , \
{ name , " AEC " , " AEC1 Loopback " } , \
{ name , " AEC2 " , " AEC2 Loopback " } , \
{ name , " IN1L " , " IN1L PGA " } , \
{ name , " IN1R " , " IN1R PGA " } , \
{ name , " IN2L " , " IN2 PGA " } , \
{ 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 , " AIF2RX3 " , " AIF2RX3 " } , \
{ name , " AIF2RX4 " , " AIF2RX4 " } , \
{ name , " AIF2RX5 " , " AIF2RX5 " } , \
{ name , " AIF2RX6 " , " AIF2RX6 " } , \
{ name , " AIF3RX1 " , " AIF3RX1 " } , \
{ name , " AIF3RX2 " , " AIF3RX2 " } , \
{ name , " SLIMRX1 " , " SLIMRX1 " } , \
{ name , " SLIMRX2 " , " SLIMRX2 " } , \
{ name , " SLIMRX3 " , " SLIMRX3 " } , \
{ name , " SLIMRX4 " , " SLIMRX4 " } , \
{ name , " EQ1 " , " EQ1 " } , \
{ name , " EQ2 " , " EQ2 " } , \
{ name , " EQ3 " , " EQ3 " } , \
{ name , " EQ4 " , " EQ4 " } , \
{ name , " DRC1L " , " DRC1L " } , \
{ name , " DRC1R " , " DRC1R " } , \
{ name , " LHPF1 " , " LHPF1 " } , \
{ name , " LHPF2 " , " LHPF2 " } , \
{ name , " LHPF3 " , " LHPF3 " } , \
{ name , " LHPF4 " , " LHPF4 " } , \
{ name , " ASRC1L " , " ASRC1L " } , \
{ name , " ASRC1R " , " ASRC1R " } , \
{ name , " ASRC2L " , " ASRC2L " } , \
{ name , " ASRC2R " , " ASRC2R " } , \
{ 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 , " ISRC2INT1 " , " ISRC2INT1 " } , \
{ name , " ISRC2INT2 " , " ISRC2INT2 " }
static const struct snd_soc_dapm_route wm8998_dapm_routes [ ] = {
{ " AIF2 Capture " , NULL , " DBVDD2 " } ,
{ " AIF2 Playback " , NULL , " DBVDD2 " } ,
{ " AIF3 Capture " , NULL , " DBVDD3 " } ,
{ " AIF3 Playback " , NULL , " DBVDD3 " } ,
{ " OUT1L " , NULL , " CPVDD " } ,
{ " OUT1R " , NULL , " CPVDD " } ,
{ " OUT2L " , NULL , " CPVDD " } ,
{ " OUT2R " , NULL , " CPVDD " } ,
{ " OUT3 " , NULL , " CPVDD " } ,
{ " OUT4L " , NULL , " SPKVDDL " } ,
{ " OUT4R " , NULL , " SPKVDDR " } ,
{ " OUT1L " , NULL , " SYSCLK " } ,
{ " OUT1R " , NULL , " SYSCLK " } ,
{ " OUT2L " , NULL , " SYSCLK " } ,
{ " OUT2R " , NULL , " SYSCLK " } ,
{ " OUT3 " , NULL , " SYSCLK " } ,
{ " OUT4L " , NULL , " SYSCLK " } ,
{ " OUT4R " , NULL , " SYSCLK " } ,
{ " OUT5L " , NULL , " SYSCLK " } ,
{ " OUT5R " , NULL , " SYSCLK " } ,
{ " IN1AL " , NULL , " SYSCLK " } ,
{ " IN1AR " , NULL , " SYSCLK " } ,
{ " IN1BL " , NULL , " SYSCLK " } ,
{ " IN1BR " , NULL , " SYSCLK " } ,
{ " IN2A " , NULL , " SYSCLK " } ,
{ " IN2B " , NULL , " SYSCLK " } ,
2016-08-11 16:42:55 +03:00
{ " ASRC1L " , NULL , " SYSCLK " } ,
{ " ASRC1R " , NULL , " SYSCLK " } ,
{ " ASRC2L " , NULL , " SYSCLK " } ,
{ " ASRC2R " , NULL , " SYSCLK " } ,
{ " ASRC1L " , NULL , " ASYNCCLK " } ,
{ " ASRC1R " , NULL , " ASYNCCLK " } ,
{ " ASRC2L " , NULL , " ASYNCCLK " } ,
{ " ASRC2R " , NULL , " ASYNCCLK " } ,
2015-09-28 16:01:09 +03:00
{ " SPD1 " , NULL , " SYSCLK " } ,
{ " SPD1 " , NULL , " SPD1TX1 " } ,
{ " SPD1 " , NULL , " SPD1TX2 " } ,
{ " MICBIAS1 " , NULL , " MICVDD " } ,
{ " MICBIAS2 " , NULL , " MICVDD " } ,
{ " MICBIAS3 " , NULL , " MICVDD " } ,
{ " Tone Generator 1 " , NULL , " SYSCLK " } ,
{ " Tone Generator 2 " , NULL , " SYSCLK " } ,
{ " 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 " } ,
{ " AIF2 Capture " , NULL , " AIF2TX3 " } ,
{ " AIF2 Capture " , NULL , " AIF2TX4 " } ,
{ " AIF2 Capture " , NULL , " AIF2TX5 " } ,
{ " AIF2 Capture " , NULL , " AIF2TX6 " } ,
{ " AIF2RX1 " , NULL , " AIF2 Playback " } ,
{ " AIF2RX2 " , NULL , " AIF2 Playback " } ,
{ " AIF2RX3 " , NULL , " AIF2 Playback " } ,
{ " AIF2RX4 " , NULL , " AIF2 Playback " } ,
{ " AIF2RX5 " , NULL , " AIF2 Playback " } ,
{ " AIF2RX6 " , 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 " } ,
{ " Slim2 Capture " , NULL , " SLIMTX5 " } ,
{ " Slim2 Capture " , NULL , " SLIMTX6 " } ,
{ " SLIMRX1 " , NULL , " Slim1 Playback " } ,
{ " SLIMRX2 " , NULL , " Slim1 Playback " } ,
{ " SLIMRX3 " , NULL , " Slim2 Playback " } ,
{ " SLIMRX4 " , 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 " } ,
{ " IN1L Mux " , " A " , " IN1AL " } ,
{ " IN1R Mux " , " A " , " IN1AR " } ,
{ " IN1L Mux " , " B " , " IN1BL " } ,
{ " IN1R Mux " , " B " , " IN1BR " } ,
{ " IN2 Mux " , " A " , " IN2A " } ,
{ " IN2 Mux " , " B " , " IN2B " } ,
{ " IN1L PGA " , NULL , " IN1L Mux " } ,
{ " IN1R PGA " , NULL , " IN1R Mux " } ,
{ " IN2 PGA " , NULL , " IN2 Mux " } ,
ARIZONA_MIXER_ROUTES ( " OUT1L " , " HPOUTL " ) ,
ARIZONA_MIXER_ROUTES ( " OUT1R " , " HPOUTR " ) ,
ARIZONA_MIXER_ROUTES ( " OUT2L " , " LINEOUTL " ) ,
ARIZONA_MIXER_ROUTES ( " OUT2R " , " LINEOUTR " ) ,
ARIZONA_MIXER_ROUTES ( " OUT3 " , " EPOUT " ) ,
ARIZONA_MIXER_ROUTES ( " OUT4L " , " SPKOUTL " ) ,
ARIZONA_MIXER_ROUTES ( " OUT4R " , " SPKOUTR " ) ,
ARIZONA_MIXER_ROUTES ( " OUT5L " , " SPKDATL " ) ,
ARIZONA_MIXER_ROUTES ( " OUT5R " , " SPKDATR " ) ,
ARIZONA_MIXER_ROUTES ( " PWM1 Driver " , " PWM1 " ) ,
ARIZONA_MIXER_ROUTES ( " PWM2 Driver " , " PWM2 " ) ,
ARIZONA_MIXER_ROUTES ( " AIF1TX1 " , " AIF1TX1 " ) ,
ARIZONA_MIXER_ROUTES ( " AIF1TX2 " , " AIF1TX2 " ) ,
ARIZONA_MIXER_ROUTES ( " AIF1TX3 " , " AIF1TX3 " ) ,
ARIZONA_MIXER_ROUTES ( " AIF1TX4 " , " AIF1TX4 " ) ,
ARIZONA_MIXER_ROUTES ( " AIF1TX5 " , " AIF1TX5 " ) ,
ARIZONA_MIXER_ROUTES ( " AIF1TX6 " , " AIF1TX6 " ) ,
ARIZONA_MIXER_ROUTES ( " AIF2TX1 " , " AIF2TX1 " ) ,
ARIZONA_MIXER_ROUTES ( " AIF2TX2 " , " AIF2TX2 " ) ,
ARIZONA_MIXER_ROUTES ( " AIF2TX3 " , " AIF2TX3 " ) ,
ARIZONA_MIXER_ROUTES ( " AIF2TX4 " , " AIF2TX4 " ) ,
ARIZONA_MIXER_ROUTES ( " AIF2TX5 " , " AIF2TX5 " ) ,
ARIZONA_MIXER_ROUTES ( " AIF2TX6 " , " AIF2TX6 " ) ,
ARIZONA_MIXER_ROUTES ( " AIF3TX1 " , " AIF3TX1 " ) ,
ARIZONA_MIXER_ROUTES ( " AIF3TX2 " , " AIF3TX2 " ) ,
ARIZONA_MUX_ROUTES ( " SLIMTX1 " , " SLIMTX1 " ) ,
ARIZONA_MUX_ROUTES ( " SLIMTX2 " , " SLIMTX2 " ) ,
ARIZONA_MUX_ROUTES ( " SLIMTX3 " , " SLIMTX3 " ) ,
ARIZONA_MUX_ROUTES ( " SLIMTX4 " , " SLIMTX4 " ) ,
ARIZONA_MUX_ROUTES ( " SLIMTX5 " , " SLIMTX5 " ) ,
ARIZONA_MUX_ROUTES ( " SLIMTX6 " , " SLIMTX6 " ) ,
ARIZONA_MUX_ROUTES ( " SPD1TX1 " , " SPDIFTX1 " ) ,
ARIZONA_MUX_ROUTES ( " SPD1TX2 " , " SPDIFTX2 " ) ,
ARIZONA_MUX_ROUTES ( " EQ1 " , " EQ1 " ) ,
ARIZONA_MUX_ROUTES ( " EQ2 " , " EQ2 " ) ,
ARIZONA_MUX_ROUTES ( " EQ3 " , " EQ3 " ) ,
ARIZONA_MUX_ROUTES ( " EQ4 " , " EQ4 " ) ,
ARIZONA_MUX_ROUTES ( " DRC1L " , " DRC1L " ) ,
ARIZONA_MUX_ROUTES ( " DRC1R " , " DRC1R " ) ,
ARIZONA_MIXER_ROUTES ( " LHPF1 " , " LHPF1 " ) ,
ARIZONA_MIXER_ROUTES ( " LHPF2 " , " LHPF2 " ) ,
ARIZONA_MIXER_ROUTES ( " LHPF3 " , " LHPF3 " ) ,
ARIZONA_MIXER_ROUTES ( " LHPF4 " , " LHPF4 " ) ,
ARIZONA_MUX_ROUTES ( " ASRC1L " , " ASRC1L " ) ,
ARIZONA_MUX_ROUTES ( " ASRC1R " , " ASRC1R " ) ,
ARIZONA_MUX_ROUTES ( " ASRC2L " , " ASRC2L " ) ,
ARIZONA_MUX_ROUTES ( " ASRC2R " , " ASRC2R " ) ,
ARIZONA_MUX_ROUTES ( " ISRC1INT1 " , " ISRC1INT1 " ) ,
ARIZONA_MUX_ROUTES ( " ISRC1INT2 " , " ISRC1INT2 " ) ,
ARIZONA_MUX_ROUTES ( " ISRC1INT3 " , " ISRC1INT3 " ) ,
ARIZONA_MUX_ROUTES ( " ISRC1INT4 " , " ISRC1INT4 " ) ,
ARIZONA_MUX_ROUTES ( " ISRC1DEC1 " , " ISRC1DEC1 " ) ,
ARIZONA_MUX_ROUTES ( " ISRC1DEC2 " , " ISRC1DEC2 " ) ,
ARIZONA_MUX_ROUTES ( " ISRC1DEC3 " , " ISRC1DEC3 " ) ,
ARIZONA_MUX_ROUTES ( " ISRC1DEC4 " , " ISRC1DEC4 " ) ,
ARIZONA_MUX_ROUTES ( " ISRC2INT1 " , " ISRC2INT1 " ) ,
ARIZONA_MUX_ROUTES ( " ISRC2INT2 " , " ISRC2INT2 " ) ,
ARIZONA_MUX_ROUTES ( " ISRC2DEC1 " , " ISRC2DEC1 " ) ,
ARIZONA_MUX_ROUTES ( " ISRC2DEC2 " , " ISRC2DEC2 " ) ,
{ " AEC1 Loopback " , " HPOUTL " , " OUT1L " } ,
{ " AEC1 Loopback " , " HPOUTR " , " OUT1R " } ,
{ " AEC2 Loopback " , " HPOUTL " , " OUT1L " } ,
{ " AEC2 Loopback " , " HPOUTR " , " OUT1R " } ,
{ " HPOUTL " , NULL , " OUT1L " } ,
{ " HPOUTR " , NULL , " OUT1R " } ,
{ " AEC1 Loopback " , " LINEOUTL " , " OUT2L " } ,
{ " AEC1 Loopback " , " LINEOUTR " , " OUT2R " } ,
{ " AEC2 Loopback " , " LINEOUTL " , " OUT2L " } ,
{ " AEC2 Loopback " , " LINEOUTR " , " OUT2R " } ,
{ " LINEOUTL " , NULL , " OUT2L " } ,
{ " LINEOUTR " , NULL , " OUT2R " } ,
{ " AEC1 Loopback " , " EPOUT " , " OUT3 " } ,
{ " AEC2 Loopback " , " EPOUT " , " OUT3 " } ,
{ " EPOUT " , NULL , " OUT3 " } ,
{ " AEC1 Loopback " , " SPKOUTL " , " OUT4L " } ,
{ " AEC2 Loopback " , " SPKOUTL " , " OUT4L " } ,
{ " SPKOUTLN " , NULL , " OUT4L " } ,
{ " SPKOUTLP " , NULL , " OUT4L " } ,
{ " AEC1 Loopback " , " SPKOUTR " , " OUT4R " } ,
{ " AEC2 Loopback " , " SPKOUTR " , " OUT4R " } ,
{ " SPKOUTRN " , NULL , " OUT4R " } ,
{ " SPKOUTRP " , NULL , " OUT4R " } ,
{ " SPDIF " , NULL , " SPD1 " } ,
{ " AEC1 Loopback " , " SPKDATL " , " OUT5L " } ,
{ " AEC1 Loopback " , " SPKDATR " , " OUT5R " } ,
{ " AEC2 Loopback " , " SPKDATL " , " OUT5L " } ,
{ " AEC2 Loopback " , " SPKDATR " , " OUT5R " } ,
{ " SPKDATL " , NULL , " OUT5L " } ,
{ " SPKDATR " , NULL , " OUT5R " } ,
{ " MICSUPP " , NULL , " SYSCLK " } ,
2016-05-13 18:45:15 +03:00
{ " DRC1 Signal Activity " , NULL , " SYSCLK " } ,
2015-09-28 16:01:09 +03:00
{ " DRC1 Signal Activity " , NULL , " DRC1L " } ,
{ " DRC1 Signal Activity " , NULL , " DRC1R " } ,
} ;
2016-02-04 19:29:01 +03:00
# define WM8998_RATES SNDRV_PCM_RATE_KNOT
2015-09-28 16:01:09 +03:00
# define WM8998_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE |\
SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S32_LE )
static struct snd_soc_dai_driver wm8998_dai [ ] = {
{
. name = " wm8998-aif1 " ,
. id = 1 ,
. base = ARIZONA_AIF1_BCLK_CTRL ,
. playback = {
. stream_name = " AIF1 Playback " ,
. channels_min = 1 ,
. channels_max = 6 ,
. rates = WM8998_RATES ,
. formats = WM8998_FORMATS ,
} ,
. capture = {
. stream_name = " AIF1 Capture " ,
. channels_min = 1 ,
. channels_max = 6 ,
. rates = WM8998_RATES ,
. formats = WM8998_FORMATS ,
} ,
. ops = & arizona_dai_ops ,
2021-01-15 07:54:13 +03:00
. symmetric_rate = 1 ,
. symmetric_sample_bits = 1 ,
2015-09-28 16:01:09 +03:00
} ,
{
. name = " wm8998-aif2 " ,
. id = 2 ,
. base = ARIZONA_AIF2_BCLK_CTRL ,
. playback = {
. stream_name = " AIF2 Playback " ,
. channels_min = 1 ,
. channels_max = 6 ,
. rates = WM8998_RATES ,
. formats = WM8998_FORMATS ,
} ,
. capture = {
. stream_name = " AIF2 Capture " ,
. channels_min = 1 ,
. channels_max = 6 ,
. rates = WM8998_RATES ,
. formats = WM8998_FORMATS ,
} ,
. ops = & arizona_dai_ops ,
2021-01-15 07:54:13 +03:00
. symmetric_rate = 1 ,
. symmetric_sample_bits = 1 ,
2015-09-28 16:01:09 +03:00
} ,
{
. name = " wm8998-aif3 " ,
. id = 3 ,
. base = ARIZONA_AIF3_BCLK_CTRL ,
. playback = {
. stream_name = " AIF3 Playback " ,
. channels_min = 1 ,
. channels_max = 2 ,
. rates = WM8998_RATES ,
. formats = WM8998_FORMATS ,
} ,
. capture = {
. stream_name = " AIF3 Capture " ,
. channels_min = 1 ,
. channels_max = 2 ,
. rates = WM8998_RATES ,
. formats = WM8998_FORMATS ,
} ,
. ops = & arizona_dai_ops ,
2021-01-15 07:54:13 +03:00
. symmetric_rate = 1 ,
. symmetric_sample_bits = 1 ,
2015-09-28 16:01:09 +03:00
} ,
{
. name = " wm8998-slim1 " ,
. id = 4 ,
. playback = {
. stream_name = " Slim1 Playback " ,
. channels_min = 1 ,
. channels_max = 2 ,
. rates = WM8998_RATES ,
. formats = WM8998_FORMATS ,
} ,
. capture = {
. stream_name = " Slim1 Capture " ,
. channels_min = 1 ,
. channels_max = 4 ,
. rates = WM8998_RATES ,
. formats = WM8998_FORMATS ,
} ,
. ops = & arizona_simple_dai_ops ,
} ,
{
. name = " wm8998-slim2 " ,
. id = 5 ,
. playback = {
. stream_name = " Slim2 Playback " ,
. channels_min = 1 ,
. channels_max = 2 ,
. rates = WM8998_RATES ,
. formats = WM8998_FORMATS ,
} ,
. capture = {
. stream_name = " Slim2 Capture " ,
. channels_min = 1 ,
. channels_max = 2 ,
. rates = WM8998_RATES ,
. formats = WM8998_FORMATS ,
} ,
. ops = & arizona_simple_dai_ops ,
} ,
} ;
2018-02-20 19:08:11 +03:00
static int wm8998_set_fll ( struct snd_soc_component * component , int fll_id ,
int source , unsigned int Fref , unsigned int Fout )
2015-09-28 16:01:09 +03:00
{
2018-02-13 05:03:12 +03:00
struct wm8998_priv * wm8998 = snd_soc_component_get_drvdata ( component ) ;
2015-09-28 16:01:09 +03:00
switch ( fll_id ) {
case WM8998_FLL1 :
return arizona_set_fll ( & wm8998 - > fll [ 0 ] , source , Fref , Fout ) ;
case WM8998_FLL2 :
return arizona_set_fll ( & wm8998 - > fll [ 1 ] , source , Fref , Fout ) ;
case WM8998_FLL1_REFCLK :
return arizona_set_fll_refclk ( & wm8998 - > fll [ 0 ] , source , Fref ,
Fout ) ;
case WM8998_FLL2_REFCLK :
return arizona_set_fll_refclk ( & wm8998 - > fll [ 1 ] , source , Fref ,
Fout ) ;
default :
return - EINVAL ;
}
}
2018-02-13 05:03:12 +03:00
static int wm8998_component_probe ( struct snd_soc_component * component )
2015-09-28 16:01:09 +03:00
{
2018-02-13 05:03:12 +03:00
struct wm8998_priv * priv = snd_soc_component_get_drvdata ( component ) ;
struct snd_soc_dapm_context * dapm = snd_soc_component_get_dapm ( component ) ;
2017-11-28 09:03:32 +03:00
struct arizona * arizona = priv - > core . arizona ;
2017-01-18 18:27:05 +03:00
int ret ;
2015-09-28 16:01:09 +03:00
2017-11-28 09:03:32 +03:00
arizona - > dapm = dapm ;
2018-02-13 05:03:12 +03:00
snd_soc_component_init_regmap ( component , arizona - > regmap ) ;
2015-09-28 16:01:09 +03:00
2018-02-13 05:03:12 +03:00
ret = arizona_init_spk ( component ) ;
2017-01-18 18:27:05 +03:00
if ( ret < 0 )
return ret ;
2018-02-13 05:03:12 +03:00
arizona_init_gpio ( component ) ;
2015-09-28 16:01:09 +03:00
2016-11-29 18:44:39 +03:00
snd_soc_component_disable_pin ( component , " HAPTICS " ) ;
2015-09-28 16:01:09 +03:00
return 0 ;
}
2018-02-13 05:03:12 +03:00
static void wm8998_component_remove ( struct snd_soc_component * component )
2015-09-28 16:01:09 +03:00
{
2018-02-13 05:03:12 +03:00
struct wm8998_priv * priv = snd_soc_component_get_drvdata ( component ) ;
2015-09-28 16:01:09 +03:00
priv - > core . arizona - > dapm = NULL ;
}
# define WM8998_DIG_VU 0x0200
static unsigned int wm8998_digital_vu [ ] = {
ARIZONA_DAC_DIGITAL_VOLUME_1L ,
ARIZONA_DAC_DIGITAL_VOLUME_1R ,
ARIZONA_DAC_DIGITAL_VOLUME_2L ,
ARIZONA_DAC_DIGITAL_VOLUME_2R ,
ARIZONA_DAC_DIGITAL_VOLUME_3L ,
ARIZONA_DAC_DIGITAL_VOLUME_4L ,
ARIZONA_DAC_DIGITAL_VOLUME_4R ,
ARIZONA_DAC_DIGITAL_VOLUME_5L ,
ARIZONA_DAC_DIGITAL_VOLUME_5R ,
} ;
2018-02-13 05:03:12 +03:00
static const struct snd_soc_component_driver soc_component_dev_wm8998 = {
. probe = wm8998_component_probe ,
. remove = wm8998_component_remove ,
. set_sysclk = arizona_set_sysclk ,
. set_pll = wm8998_set_fll ,
2021-03-07 18:18:06 +03:00
. set_jack = arizona_jack_set_jack ,
2018-02-13 05:03:12 +03:00
. controls = wm8998_snd_controls ,
. num_controls = ARRAY_SIZE ( wm8998_snd_controls ) ,
. dapm_widgets = wm8998_dapm_widgets ,
. num_dapm_widgets = ARRAY_SIZE ( wm8998_dapm_widgets ) ,
. dapm_routes = wm8998_dapm_routes ,
. num_dapm_routes = ARRAY_SIZE ( wm8998_dapm_routes ) ,
. use_pmdown_time = 1 ,
. endianness = 1 ,
2015-09-28 16:01:09 +03:00
} ;
static int wm8998_probe ( struct platform_device * pdev )
{
struct arizona * arizona = dev_get_drvdata ( pdev - > dev . parent ) ;
struct wm8998_priv * wm8998 ;
2016-10-26 12:59:57 +03:00
int i , ret ;
2015-09-28 16:01:09 +03:00
wm8998 = devm_kzalloc ( & pdev - > dev , sizeof ( struct wm8998_priv ) ,
GFP_KERNEL ) ;
if ( ! wm8998 )
return - ENOMEM ;
platform_set_drvdata ( pdev , wm8998 ) ;
2017-09-04 18:41:49 +03:00
if ( IS_ENABLED ( CONFIG_OF ) ) {
if ( ! dev_get_platdata ( arizona - > dev ) ) {
ret = arizona_of_get_audio_pdata ( arizona ) ;
if ( ret < 0 )
return ret ;
}
}
2015-09-28 16:01:09 +03:00
wm8998 - > core . arizona = arizona ;
wm8998 - > core . num_inputs = 3 ; /* IN1L, IN1R, IN2 */
2021-03-07 18:18:06 +03:00
/* This may return -EPROBE_DEFER, so do this early on */
ret = arizona_jack_codec_dev_probe ( & wm8998 - > core , & pdev - > dev ) ;
if ( ret )
return ret ;
2015-09-28 16:01:09 +03:00
for ( i = 0 ; i < ARRAY_SIZE ( wm8998 - > fll ) ; i + + )
wm8998 - > fll [ i ] . vco_mult = 1 ;
arizona_init_fll ( arizona , 1 , ARIZONA_FLL1_CONTROL_1 - 1 ,
ARIZONA_IRQ_FLL1_LOCK , ARIZONA_IRQ_FLL1_CLOCK_OK ,
& wm8998 - > fll [ 0 ] ) ;
arizona_init_fll ( arizona , 2 , ARIZONA_FLL2_CONTROL_1 - 1 ,
ARIZONA_IRQ_FLL2_LOCK , ARIZONA_IRQ_FLL2_CLOCK_OK ,
& wm8998 - > fll [ 1 ] ) ;
for ( i = 0 ; i < ARRAY_SIZE ( wm8998_dai ) ; i + + )
arizona_init_dai ( & wm8998 - > core , i ) ;
/* Latch volume update bits */
for ( i = 0 ; i < ARRAY_SIZE ( wm8998_digital_vu ) ; i + + )
regmap_update_bits ( arizona - > regmap , wm8998_digital_vu [ i ] ,
WM8998_DIG_VU , WM8998_DIG_VU ) ;
pm_runtime_enable ( & pdev - > dev ) ;
pm_runtime_idle ( & pdev - > dev ) ;
2017-09-04 18:41:48 +03:00
arizona_init_common ( arizona ) ;
2015-09-28 16:01:09 +03:00
2016-10-26 12:59:57 +03:00
ret = arizona_init_spk_irqs ( arizona ) ;
if ( ret < 0 )
2020-11-11 07:13:26 +03:00
goto err_pm_disable ;
2016-10-26 12:59:57 +03:00
2018-02-13 05:03:12 +03:00
ret = devm_snd_soc_register_component ( & pdev - > dev ,
2018-02-20 19:08:11 +03:00
& soc_component_dev_wm8998 ,
wm8998_dai ,
ARRAY_SIZE ( wm8998_dai ) ) ;
2016-10-26 12:59:57 +03:00
if ( ret < 0 ) {
2018-02-13 05:03:12 +03:00
dev_err ( & pdev - > dev , " Failed to register component: %d \n " , ret ) ;
2016-10-26 12:59:57 +03:00
goto err_spk_irqs ;
}
return ret ;
err_spk_irqs :
arizona_free_spk_irqs ( arizona ) ;
2020-11-11 07:13:26 +03:00
err_pm_disable :
pm_runtime_disable ( & pdev - > dev ) ;
2021-03-07 18:18:06 +03:00
arizona_jack_codec_dev_remove ( & wm8998 - > core ) ;
2016-10-26 12:59:57 +03:00
return ret ;
2015-09-28 16:01:09 +03:00
}
2023-03-15 18:05:53 +03:00
static void wm8998_remove ( struct platform_device * pdev )
2015-09-28 16:01:09 +03:00
{
2016-10-26 12:59:57 +03:00
struct wm8998_priv * wm8998 = platform_get_drvdata ( pdev ) ;
struct arizona * arizona = wm8998 - > core . arizona ;
2015-09-28 16:01:09 +03:00
pm_runtime_disable ( & pdev - > dev ) ;
2016-10-26 12:59:57 +03:00
arizona_free_spk_irqs ( arizona ) ;
2021-03-07 18:18:06 +03:00
arizona_jack_codec_dev_remove ( & wm8998 - > core ) ;
2015-09-28 16:01:09 +03:00
}
static struct platform_driver wm8998_codec_driver = {
. driver = {
. name = " wm8998-codec " ,
} ,
. probe = wm8998_probe ,
2023-03-15 18:05:53 +03:00
. remove_new = wm8998_remove ,
2015-09-28 16:01:09 +03:00
} ;
module_platform_driver ( wm8998_codec_driver ) ;
MODULE_DESCRIPTION ( " ASoC WM8998 driver " ) ;
MODULE_AUTHOR ( " Richard Fitzgerald <rf@opensource.wolfsonmicro.com> " ) ;
MODULE_LICENSE ( " GPL v2 " ) ;
MODULE_ALIAS ( " platform:wm8998-codec " ) ;