cachepc-linux

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

wm8998.c (50254B)


      1// SPDX-License-Identifier: GPL-2.0-only
      2/*
      3 * wm8998.c -- ALSA SoC Audio driver for WM8998 codecs
      4 *
      5 * Copyright 2015 Cirrus Logic, Inc.
      6 *
      7 * Author: Richard Fitzgerald <rf@opensource.wolfsonmicro.com>
      8 */
      9
     10#include <linux/module.h>
     11#include <linux/moduleparam.h>
     12#include <linux/init.h>
     13#include <linux/delay.h>
     14#include <linux/pm.h>
     15#include <linux/pm_runtime.h>
     16#include <linux/regmap.h>
     17#include <linux/slab.h>
     18#include <sound/core.h>
     19#include <sound/pcm.h>
     20#include <sound/pcm_params.h>
     21#include <sound/soc.h>
     22#include <sound/jack.h>
     23#include <sound/initval.h>
     24#include <sound/tlv.h>
     25
     26#include <linux/mfd/arizona/core.h>
     27#include <linux/mfd/arizona/registers.h>
     28
     29#include "arizona.h"
     30#include "wm8998.h"
     31
     32struct wm8998_priv {
     33	struct arizona_priv core;
     34	struct arizona_fll fll[2];
     35};
     36
     37static int wm8998_asrc_ev(struct snd_soc_dapm_widget *w,
     38			  struct snd_kcontrol *kcontrol,
     39			  int event)
     40{
     41	struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
     42	unsigned int val;
     43
     44	switch (event) {
     45	case SND_SOC_DAPM_PRE_PMU:
     46		val = snd_soc_component_read(component, ARIZONA_ASRC_RATE1);
     47		val &= ARIZONA_ASRC_RATE1_MASK;
     48		val >>= ARIZONA_ASRC_RATE1_SHIFT;
     49
     50		switch (val) {
     51		case 0:
     52		case 1:
     53		case 2:
     54			val = snd_soc_component_read(component,
     55					   ARIZONA_SAMPLE_RATE_1 + val);
     56			if (val >= 0x11) {
     57				dev_warn(component->dev,
     58					 "Unsupported ASRC rate1 (%s)\n",
     59					 arizona_sample_rate_val_to_name(val));
     60				return -EINVAL;
     61			}
     62			break;
     63		default:
     64			dev_err(component->dev,
     65				"Illegal ASRC rate1 selector (0x%x)\n",
     66				val);
     67			return -EINVAL;
     68		}
     69
     70		val = snd_soc_component_read(component, ARIZONA_ASRC_RATE2);
     71		val &= ARIZONA_ASRC_RATE2_MASK;
     72		val >>= ARIZONA_ASRC_RATE2_SHIFT;
     73
     74		switch (val) {
     75		case 8:
     76		case 9:
     77			val -= 0x8;
     78			val = snd_soc_component_read(component,
     79					   ARIZONA_ASYNC_SAMPLE_RATE_1 + val);
     80			if (val >= 0x11) {
     81				dev_warn(component->dev,
     82					 "Unsupported ASRC rate2 (%s)\n",
     83					 arizona_sample_rate_val_to_name(val));
     84				return -EINVAL;
     85			}
     86			break;
     87		default:
     88			dev_err(component->dev,
     89				"Illegal ASRC rate2 selector (0x%x)\n",
     90				val);
     91			return -EINVAL;
     92		}
     93		break;
     94	default:
     95		return -EINVAL;
     96	}
     97
     98	return 0;
     99}
    100
    101static int wm8998_inmux_put(struct snd_kcontrol *kcontrol,
    102			    struct snd_ctl_elem_value *ucontrol)
    103{
    104	struct snd_soc_component *component = snd_soc_dapm_kcontrol_component(kcontrol);
    105	struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(component);
    106	struct wm8998_priv *wm8998 = snd_soc_component_get_drvdata(component);
    107	struct arizona *arizona = wm8998->core.arizona;
    108	struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
    109	unsigned int mode_reg, mode_index;
    110	unsigned int mux, inmode, src_val, mode_val;
    111
    112	mux = ucontrol->value.enumerated.item[0];
    113	if (mux > 1)
    114		return -EINVAL;
    115
    116	switch (e->reg) {
    117	case ARIZONA_ADC_DIGITAL_VOLUME_2L:
    118		mode_reg = ARIZONA_IN2L_CONTROL;
    119		mode_index = 1 + (2 * mux);
    120		break;
    121	default:
    122		mode_reg = ARIZONA_IN1L_CONTROL;
    123		mode_index = (2 * mux);
    124		break;
    125	}
    126
    127	inmode = arizona->pdata.inmode[mode_index];
    128	if (inmode & ARIZONA_INMODE_DMIC)
    129		mode_val = 1 << ARIZONA_IN1_MODE_SHIFT;
    130	else
    131		mode_val = 0;
    132
    133	src_val = mux << ARIZONA_IN1L_SRC_SHIFT;
    134	if (inmode & ARIZONA_INMODE_SE)
    135		src_val |= 1 << ARIZONA_IN1L_SRC_SE_SHIFT;
    136
    137	snd_soc_component_update_bits(component, mode_reg,
    138				      ARIZONA_IN1_MODE_MASK, mode_val);
    139
    140	snd_soc_component_update_bits(component, e->reg,
    141				      ARIZONA_IN1L_SRC_MASK |
    142				      ARIZONA_IN1L_SRC_SE_MASK,
    143				      src_val);
    144
    145	return snd_soc_dapm_mux_update_power(dapm, kcontrol,
    146					     ucontrol->value.enumerated.item[0],
    147					     e, NULL);
    148}
    149
    150static const char * const wm8998_inmux_texts[] = {
    151	"A",
    152	"B",
    153};
    154
    155static SOC_ENUM_SINGLE_DECL(wm8998_in1muxl_enum,
    156			    ARIZONA_ADC_DIGITAL_VOLUME_1L,
    157			    ARIZONA_IN1L_SRC_SHIFT,
    158			    wm8998_inmux_texts);
    159
    160static SOC_ENUM_SINGLE_DECL(wm8998_in1muxr_enum,
    161			    ARIZONA_ADC_DIGITAL_VOLUME_1R,
    162			    ARIZONA_IN1R_SRC_SHIFT,
    163			    wm8998_inmux_texts);
    164
    165static SOC_ENUM_SINGLE_DECL(wm8998_in2mux_enum,
    166			    ARIZONA_ADC_DIGITAL_VOLUME_2L,
    167			    ARIZONA_IN2L_SRC_SHIFT,
    168			    wm8998_inmux_texts);
    169
    170static const struct snd_kcontrol_new wm8998_in1mux[2] = {
    171	SOC_DAPM_ENUM_EXT("IN1L Mux", wm8998_in1muxl_enum,
    172			  snd_soc_dapm_get_enum_double, wm8998_inmux_put),
    173	SOC_DAPM_ENUM_EXT("IN1R Mux", wm8998_in1muxr_enum,
    174			  snd_soc_dapm_get_enum_double, wm8998_inmux_put),
    175};
    176
    177static const struct snd_kcontrol_new wm8998_in2mux =
    178	SOC_DAPM_ENUM_EXT("IN2 Mux", wm8998_in2mux_enum,
    179			  snd_soc_dapm_get_enum_double, wm8998_inmux_put);
    180
    181static DECLARE_TLV_DB_SCALE(ana_tlv, 0, 100, 0);
    182static DECLARE_TLV_DB_SCALE(eq_tlv, -1200, 100, 0);
    183static DECLARE_TLV_DB_SCALE(digital_tlv, -6400, 50, 0);
    184static DECLARE_TLV_DB_SCALE(ng_tlv, -10200, 600, 0);
    185
    186#define WM8998_NG_SRC(name, base) \
    187	SOC_SINGLE(name " NG HPOUTL Switch",  base,  0, 1, 0), \
    188	SOC_SINGLE(name " NG HPOUTR Switch",  base,  1, 1, 0), \
    189	SOC_SINGLE(name " NG LINEOUTL Switch",  base,  2, 1, 0), \
    190	SOC_SINGLE(name " NG LINEOUTR Switch",  base,  3, 1, 0), \
    191	SOC_SINGLE(name " NG EPOUT Switch",   base,  4, 1, 0), \
    192	SOC_SINGLE(name " NG SPKOUTL Switch",  base,  6, 1, 0), \
    193	SOC_SINGLE(name " NG SPKOUTR Switch",  base,  7, 1, 0)
    194
    195static const struct snd_kcontrol_new wm8998_snd_controls[] = {
    196SOC_ENUM("IN1 OSR", arizona_in_dmic_osr[0]),
    197SOC_ENUM("IN2 OSR", arizona_in_dmic_osr[1]),
    198
    199SOC_SINGLE_RANGE_TLV("IN1L Volume", ARIZONA_IN1L_CONTROL,
    200		     ARIZONA_IN1L_PGA_VOL_SHIFT, 0x40, 0x5f, 0, ana_tlv),
    201SOC_SINGLE_RANGE_TLV("IN1R Volume", ARIZONA_IN1R_CONTROL,
    202		     ARIZONA_IN1R_PGA_VOL_SHIFT, 0x40, 0x5f, 0, ana_tlv),
    203SOC_SINGLE_RANGE_TLV("IN2 Volume", ARIZONA_IN2L_CONTROL,
    204		     ARIZONA_IN2L_PGA_VOL_SHIFT, 0x40, 0x5f, 0, ana_tlv),
    205
    206SOC_ENUM("IN HPF Cutoff Frequency", arizona_in_hpf_cut_enum),
    207
    208SOC_SINGLE("IN1L HPF Switch", ARIZONA_IN1L_CONTROL,
    209	   ARIZONA_IN1L_HPF_SHIFT, 1, 0),
    210SOC_SINGLE("IN1R HPF Switch", ARIZONA_IN1R_CONTROL,
    211	   ARIZONA_IN1R_HPF_SHIFT, 1, 0),
    212SOC_SINGLE("IN2 HPF Switch", ARIZONA_IN2L_CONTROL,
    213	   ARIZONA_IN2L_HPF_SHIFT, 1, 0),
    214
    215SOC_SINGLE_TLV("IN1L Digital Volume", ARIZONA_ADC_DIGITAL_VOLUME_1L,
    216	       ARIZONA_IN1L_DIG_VOL_SHIFT, 0xbf, 0, digital_tlv),
    217SOC_SINGLE_TLV("IN1R Digital Volume", ARIZONA_ADC_DIGITAL_VOLUME_1R,
    218	       ARIZONA_IN1R_DIG_VOL_SHIFT, 0xbf, 0, digital_tlv),
    219SOC_SINGLE_TLV("IN2 Digital Volume", ARIZONA_ADC_DIGITAL_VOLUME_2L,
    220	       ARIZONA_IN2L_DIG_VOL_SHIFT, 0xbf, 0, digital_tlv),
    221
    222SOC_ENUM("Input Ramp Up", arizona_in_vi_ramp),
    223SOC_ENUM("Input Ramp Down", arizona_in_vd_ramp),
    224
    225ARIZONA_GAINMUX_CONTROLS("EQ1", ARIZONA_EQ1MIX_INPUT_1_SOURCE),
    226ARIZONA_GAINMUX_CONTROLS("EQ2", ARIZONA_EQ2MIX_INPUT_1_SOURCE),
    227ARIZONA_GAINMUX_CONTROLS("EQ3", ARIZONA_EQ3MIX_INPUT_1_SOURCE),
    228ARIZONA_GAINMUX_CONTROLS("EQ4", ARIZONA_EQ4MIX_INPUT_1_SOURCE),
    229
    230SND_SOC_BYTES("EQ1 Coefficients", ARIZONA_EQ1_3, 19),
    231SOC_SINGLE("EQ1 Mode Switch", ARIZONA_EQ1_2, ARIZONA_EQ1_B1_MODE_SHIFT, 1, 0),
    232SOC_SINGLE_TLV("EQ1 B1 Volume", ARIZONA_EQ1_1, ARIZONA_EQ1_B1_GAIN_SHIFT,
    233	       24, 0, eq_tlv),
    234SOC_SINGLE_TLV("EQ1 B2 Volume", ARIZONA_EQ1_1, ARIZONA_EQ1_B2_GAIN_SHIFT,
    235	       24, 0, eq_tlv),
    236SOC_SINGLE_TLV("EQ1 B3 Volume", ARIZONA_EQ1_1, ARIZONA_EQ1_B3_GAIN_SHIFT,
    237	       24, 0, eq_tlv),
    238SOC_SINGLE_TLV("EQ1 B4 Volume", ARIZONA_EQ1_2, ARIZONA_EQ1_B4_GAIN_SHIFT,
    239	       24, 0, eq_tlv),
    240SOC_SINGLE_TLV("EQ1 B5 Volume", ARIZONA_EQ1_2, ARIZONA_EQ1_B5_GAIN_SHIFT,
    241	       24, 0, eq_tlv),
    242
    243SND_SOC_BYTES("EQ2 Coefficients", ARIZONA_EQ2_3, 19),
    244SOC_SINGLE("EQ2 Mode Switch", ARIZONA_EQ2_2, ARIZONA_EQ2_B1_MODE_SHIFT, 1, 0),
    245SOC_SINGLE_TLV("EQ2 B1 Volume", ARIZONA_EQ2_1, ARIZONA_EQ2_B1_GAIN_SHIFT,
    246	       24, 0, eq_tlv),
    247SOC_SINGLE_TLV("EQ2 B2 Volume", ARIZONA_EQ2_1, ARIZONA_EQ2_B2_GAIN_SHIFT,
    248	       24, 0, eq_tlv),
    249SOC_SINGLE_TLV("EQ2 B3 Volume", ARIZONA_EQ2_1, ARIZONA_EQ2_B3_GAIN_SHIFT,
    250	       24, 0, eq_tlv),
    251SOC_SINGLE_TLV("EQ2 B4 Volume", ARIZONA_EQ2_2, ARIZONA_EQ2_B4_GAIN_SHIFT,
    252	       24, 0, eq_tlv),
    253SOC_SINGLE_TLV("EQ2 B5 Volume", ARIZONA_EQ2_2, ARIZONA_EQ2_B5_GAIN_SHIFT,
    254	       24, 0, eq_tlv),
    255
    256SND_SOC_BYTES("EQ3 Coefficients", ARIZONA_EQ3_3, 19),
    257SOC_SINGLE("EQ3 Mode Switch", ARIZONA_EQ3_2, ARIZONA_EQ3_B1_MODE_SHIFT, 1, 0),
    258SOC_SINGLE_TLV("EQ3 B1 Volume", ARIZONA_EQ3_1, ARIZONA_EQ3_B1_GAIN_SHIFT,
    259	       24, 0, eq_tlv),
    260SOC_SINGLE_TLV("EQ3 B2 Volume", ARIZONA_EQ3_1, ARIZONA_EQ3_B2_GAIN_SHIFT,
    261	       24, 0, eq_tlv),
    262SOC_SINGLE_TLV("EQ3 B3 Volume", ARIZONA_EQ3_1, ARIZONA_EQ3_B3_GAIN_SHIFT,
    263	       24, 0, eq_tlv),
    264SOC_SINGLE_TLV("EQ3 B4 Volume", ARIZONA_EQ3_2, ARIZONA_EQ3_B4_GAIN_SHIFT,
    265	       24, 0, eq_tlv),
    266SOC_SINGLE_TLV("EQ3 B5 Volume", ARIZONA_EQ3_2, ARIZONA_EQ3_B5_GAIN_SHIFT,
    267	       24, 0, eq_tlv),
    268
    269SND_SOC_BYTES("EQ4 Coefficients", ARIZONA_EQ4_3, 19),
    270SOC_SINGLE("EQ4 Mode Switch", ARIZONA_EQ4_2, ARIZONA_EQ4_B1_MODE_SHIFT, 1, 0),
    271SOC_SINGLE_TLV("EQ4 B1 Volume", ARIZONA_EQ4_1, ARIZONA_EQ4_B1_GAIN_SHIFT,
    272	       24, 0, eq_tlv),
    273SOC_SINGLE_TLV("EQ4 B2 Volume", ARIZONA_EQ4_1, ARIZONA_EQ4_B2_GAIN_SHIFT,
    274	       24, 0, eq_tlv),
    275SOC_SINGLE_TLV("EQ4 B3 Volume", ARIZONA_EQ4_1, ARIZONA_EQ4_B3_GAIN_SHIFT,
    276	       24, 0, eq_tlv),
    277SOC_SINGLE_TLV("EQ4 B4 Volume", ARIZONA_EQ4_2, ARIZONA_EQ4_B4_GAIN_SHIFT,
    278	       24, 0, eq_tlv),
    279SOC_SINGLE_TLV("EQ4 B5 Volume", ARIZONA_EQ4_2, ARIZONA_EQ4_B5_GAIN_SHIFT,
    280	       24, 0, eq_tlv),
    281
    282ARIZONA_GAINMUX_CONTROLS("DRC1L", ARIZONA_DRC1LMIX_INPUT_1_SOURCE),
    283ARIZONA_GAINMUX_CONTROLS("DRC1R", ARIZONA_DRC1RMIX_INPUT_1_SOURCE),
    284
    285SND_SOC_BYTES_MASK("DRC1", ARIZONA_DRC1_CTRL1, 5,
    286		   ARIZONA_DRC1R_ENA | ARIZONA_DRC1L_ENA),
    287
    288ARIZONA_MIXER_CONTROLS("LHPF1", ARIZONA_HPLP1MIX_INPUT_1_SOURCE),
    289ARIZONA_MIXER_CONTROLS("LHPF2", ARIZONA_HPLP2MIX_INPUT_1_SOURCE),
    290ARIZONA_MIXER_CONTROLS("LHPF3", ARIZONA_HPLP3MIX_INPUT_1_SOURCE),
    291ARIZONA_MIXER_CONTROLS("LHPF4", ARIZONA_HPLP4MIX_INPUT_1_SOURCE),
    292
    293SND_SOC_BYTES("LHPF1 Coefficients", ARIZONA_HPLPF1_2, 1),
    294SND_SOC_BYTES("LHPF2 Coefficients", ARIZONA_HPLPF2_2, 1),
    295SND_SOC_BYTES("LHPF3 Coefficients", ARIZONA_HPLPF3_2, 1),
    296SND_SOC_BYTES("LHPF4 Coefficients", ARIZONA_HPLPF4_2, 1),
    297
    298SOC_ENUM("LHPF1 Mode", arizona_lhpf1_mode),
    299SOC_ENUM("LHPF2 Mode", arizona_lhpf2_mode),
    300SOC_ENUM("LHPF3 Mode", arizona_lhpf3_mode),
    301SOC_ENUM("LHPF4 Mode", arizona_lhpf4_mode),
    302
    303SOC_ENUM("ISRC1 FSL", arizona_isrc_fsl[0]),
    304SOC_ENUM("ISRC2 FSL", arizona_isrc_fsl[1]),
    305SOC_ENUM("ISRC1 FSH", arizona_isrc_fsh[0]),
    306SOC_ENUM("ISRC2 FSH", arizona_isrc_fsh[1]),
    307SOC_ENUM("ASRC RATE 1", arizona_asrc_rate1),
    308
    309ARIZONA_MIXER_CONTROLS("HPOUTL", ARIZONA_OUT1LMIX_INPUT_1_SOURCE),
    310ARIZONA_MIXER_CONTROLS("HPOUTR", ARIZONA_OUT1RMIX_INPUT_1_SOURCE),
    311ARIZONA_MIXER_CONTROLS("LINEOUTL", ARIZONA_OUT2LMIX_INPUT_1_SOURCE),
    312ARIZONA_MIXER_CONTROLS("LINEOUTR", ARIZONA_OUT2RMIX_INPUT_1_SOURCE),
    313ARIZONA_MIXER_CONTROLS("EPOUT", ARIZONA_OUT3LMIX_INPUT_1_SOURCE),
    314ARIZONA_MIXER_CONTROLS("SPKOUTL", ARIZONA_OUT4LMIX_INPUT_1_SOURCE),
    315ARIZONA_MIXER_CONTROLS("SPKOUTR", ARIZONA_OUT4RMIX_INPUT_1_SOURCE),
    316ARIZONA_MIXER_CONTROLS("SPKDATL", ARIZONA_OUT5LMIX_INPUT_1_SOURCE),
    317ARIZONA_MIXER_CONTROLS("SPKDATR", ARIZONA_OUT5RMIX_INPUT_1_SOURCE),
    318
    319SOC_DOUBLE_R("HPOUT Digital Switch", ARIZONA_DAC_DIGITAL_VOLUME_1L,
    320	     ARIZONA_DAC_DIGITAL_VOLUME_1R, ARIZONA_OUT1L_MUTE_SHIFT, 1, 1),
    321SOC_DOUBLE_R("LINEOUT Digital Switch", ARIZONA_DAC_DIGITAL_VOLUME_2L,
    322	     ARIZONA_DAC_DIGITAL_VOLUME_2R, ARIZONA_OUT2L_MUTE_SHIFT, 1, 1),
    323SOC_SINGLE("EPOUT Digital Switch", ARIZONA_DAC_DIGITAL_VOLUME_3L,
    324	   ARIZONA_OUT3L_MUTE_SHIFT, 1, 1),
    325SOC_DOUBLE_R("Speaker Digital Switch", ARIZONA_DAC_DIGITAL_VOLUME_4L,
    326	     ARIZONA_DAC_DIGITAL_VOLUME_4R, ARIZONA_OUT4L_MUTE_SHIFT, 1, 1),
    327SOC_DOUBLE_R("SPKDAT Digital Switch", ARIZONA_DAC_DIGITAL_VOLUME_5L,
    328	     ARIZONA_DAC_DIGITAL_VOLUME_5R, ARIZONA_OUT5L_MUTE_SHIFT, 1, 1),
    329
    330SOC_DOUBLE_R_TLV("HPOUT Digital Volume", ARIZONA_DAC_DIGITAL_VOLUME_1L,
    331		 ARIZONA_DAC_DIGITAL_VOLUME_1R, ARIZONA_OUT1L_VOL_SHIFT,
    332		 0xbf, 0, digital_tlv),
    333SOC_DOUBLE_R_TLV("LINEOUT Digital Volume", ARIZONA_DAC_DIGITAL_VOLUME_2L,
    334		 ARIZONA_DAC_DIGITAL_VOLUME_2R, ARIZONA_OUT2L_VOL_SHIFT,
    335		 0xbf, 0, digital_tlv),
    336SOC_SINGLE_TLV("EPOUT Digital Volume", ARIZONA_DAC_DIGITAL_VOLUME_3L,
    337	       ARIZONA_OUT3L_VOL_SHIFT, 0xbf, 0, digital_tlv),
    338SOC_DOUBLE_R_TLV("Speaker Digital Volume", ARIZONA_DAC_DIGITAL_VOLUME_4L,
    339		 ARIZONA_DAC_DIGITAL_VOLUME_4R, ARIZONA_OUT4L_VOL_SHIFT,
    340		 0xbf, 0, digital_tlv),
    341SOC_DOUBLE_R_TLV("SPKDAT Digital Volume", ARIZONA_DAC_DIGITAL_VOLUME_5L,
    342		 ARIZONA_DAC_DIGITAL_VOLUME_5R, ARIZONA_OUT5L_VOL_SHIFT,
    343		 0xbf, 0, digital_tlv),
    344
    345SOC_DOUBLE("SPKDAT Switch", ARIZONA_PDM_SPK1_CTRL_1, ARIZONA_SPK1L_MUTE_SHIFT,
    346	   ARIZONA_SPK1R_MUTE_SHIFT, 1, 1),
    347
    348SOC_ENUM("Output Ramp Up", arizona_out_vi_ramp),
    349SOC_ENUM("Output Ramp Down", arizona_out_vd_ramp),
    350
    351SOC_SINGLE("Noise Gate Switch", ARIZONA_NOISE_GATE_CONTROL,
    352	   ARIZONA_NGATE_ENA_SHIFT, 1, 0),
    353SOC_SINGLE_TLV("Noise Gate Threshold Volume", ARIZONA_NOISE_GATE_CONTROL,
    354	       ARIZONA_NGATE_THR_SHIFT, 7, 1, ng_tlv),
    355SOC_ENUM("Noise Gate Hold", arizona_ng_hold),
    356
    357WM8998_NG_SRC("HPOUTL", ARIZONA_NOISE_GATE_SELECT_1L),
    358WM8998_NG_SRC("HPOUTR", ARIZONA_NOISE_GATE_SELECT_1R),
    359WM8998_NG_SRC("LINEOUTL", ARIZONA_NOISE_GATE_SELECT_2L),
    360WM8998_NG_SRC("LINEOUTR", ARIZONA_NOISE_GATE_SELECT_2R),
    361WM8998_NG_SRC("EPOUT",  ARIZONA_NOISE_GATE_SELECT_3L),
    362WM8998_NG_SRC("SPKOUTL", ARIZONA_NOISE_GATE_SELECT_4L),
    363WM8998_NG_SRC("SPKOUTR", ARIZONA_NOISE_GATE_SELECT_4R),
    364WM8998_NG_SRC("SPKDATL", ARIZONA_NOISE_GATE_SELECT_5L),
    365WM8998_NG_SRC("SPKDATR", ARIZONA_NOISE_GATE_SELECT_5R),
    366
    367ARIZONA_MIXER_CONTROLS("AIF1TX1", ARIZONA_AIF1TX1MIX_INPUT_1_SOURCE),
    368ARIZONA_MIXER_CONTROLS("AIF1TX2", ARIZONA_AIF1TX2MIX_INPUT_1_SOURCE),
    369ARIZONA_MIXER_CONTROLS("AIF1TX3", ARIZONA_AIF1TX3MIX_INPUT_1_SOURCE),
    370ARIZONA_MIXER_CONTROLS("AIF1TX4", ARIZONA_AIF1TX4MIX_INPUT_1_SOURCE),
    371ARIZONA_MIXER_CONTROLS("AIF1TX5", ARIZONA_AIF1TX5MIX_INPUT_1_SOURCE),
    372ARIZONA_MIXER_CONTROLS("AIF1TX6", ARIZONA_AIF1TX6MIX_INPUT_1_SOURCE),
    373
    374ARIZONA_MIXER_CONTROLS("AIF2TX1", ARIZONA_AIF2TX1MIX_INPUT_1_SOURCE),
    375ARIZONA_MIXER_CONTROLS("AIF2TX2", ARIZONA_AIF2TX2MIX_INPUT_1_SOURCE),
    376ARIZONA_MIXER_CONTROLS("AIF2TX3", ARIZONA_AIF2TX3MIX_INPUT_1_SOURCE),
    377ARIZONA_MIXER_CONTROLS("AIF2TX4", ARIZONA_AIF2TX4MIX_INPUT_1_SOURCE),
    378ARIZONA_MIXER_CONTROLS("AIF2TX5", ARIZONA_AIF2TX5MIX_INPUT_1_SOURCE),
    379ARIZONA_MIXER_CONTROLS("AIF2TX6", ARIZONA_AIF2TX6MIX_INPUT_1_SOURCE),
    380
    381ARIZONA_MIXER_CONTROLS("AIF3TX1", ARIZONA_AIF3TX1MIX_INPUT_1_SOURCE),
    382ARIZONA_MIXER_CONTROLS("AIF3TX2", ARIZONA_AIF3TX2MIX_INPUT_1_SOURCE),
    383
    384ARIZONA_GAINMUX_CONTROLS("SLIMTX1", ARIZONA_SLIMTX1MIX_INPUT_1_SOURCE),
    385ARIZONA_GAINMUX_CONTROLS("SLIMTX2", ARIZONA_SLIMTX2MIX_INPUT_1_SOURCE),
    386ARIZONA_GAINMUX_CONTROLS("SLIMTX3", ARIZONA_SLIMTX3MIX_INPUT_1_SOURCE),
    387ARIZONA_GAINMUX_CONTROLS("SLIMTX4", ARIZONA_SLIMTX4MIX_INPUT_1_SOURCE),
    388ARIZONA_GAINMUX_CONTROLS("SLIMTX5", ARIZONA_SLIMTX5MIX_INPUT_1_SOURCE),
    389ARIZONA_GAINMUX_CONTROLS("SLIMTX6", ARIZONA_SLIMTX6MIX_INPUT_1_SOURCE),
    390
    391ARIZONA_GAINMUX_CONTROLS("SPDIFTX1", ARIZONA_SPDIFTX1MIX_INPUT_1_SOURCE),
    392ARIZONA_GAINMUX_CONTROLS("SPDIFTX2", ARIZONA_SPDIFTX2MIX_INPUT_1_SOURCE),
    393};
    394
    395ARIZONA_MUX_ENUMS(EQ1, ARIZONA_EQ1MIX_INPUT_1_SOURCE);
    396ARIZONA_MUX_ENUMS(EQ2, ARIZONA_EQ2MIX_INPUT_1_SOURCE);
    397ARIZONA_MUX_ENUMS(EQ3, ARIZONA_EQ3MIX_INPUT_1_SOURCE);
    398ARIZONA_MUX_ENUMS(EQ4, ARIZONA_EQ4MIX_INPUT_1_SOURCE);
    399
    400ARIZONA_MUX_ENUMS(DRC1L, ARIZONA_DRC1LMIX_INPUT_1_SOURCE);
    401ARIZONA_MUX_ENUMS(DRC1R, ARIZONA_DRC1RMIX_INPUT_1_SOURCE);
    402
    403ARIZONA_MIXER_ENUMS(LHPF1, ARIZONA_HPLP1MIX_INPUT_1_SOURCE);
    404ARIZONA_MIXER_ENUMS(LHPF2, ARIZONA_HPLP2MIX_INPUT_1_SOURCE);
    405ARIZONA_MIXER_ENUMS(LHPF3, ARIZONA_HPLP3MIX_INPUT_1_SOURCE);
    406ARIZONA_MIXER_ENUMS(LHPF4, ARIZONA_HPLP4MIX_INPUT_1_SOURCE);
    407
    408ARIZONA_MIXER_ENUMS(PWM1, ARIZONA_PWM1MIX_INPUT_1_SOURCE);
    409ARIZONA_MIXER_ENUMS(PWM2, ARIZONA_PWM2MIX_INPUT_1_SOURCE);
    410
    411ARIZONA_MIXER_ENUMS(OUT1L, ARIZONA_OUT1LMIX_INPUT_1_SOURCE);
    412ARIZONA_MIXER_ENUMS(OUT1R, ARIZONA_OUT1RMIX_INPUT_1_SOURCE);
    413ARIZONA_MIXER_ENUMS(OUT2L, ARIZONA_OUT2LMIX_INPUT_1_SOURCE);
    414ARIZONA_MIXER_ENUMS(OUT2R, ARIZONA_OUT2RMIX_INPUT_1_SOURCE);
    415ARIZONA_MIXER_ENUMS(OUT3,  ARIZONA_OUT3LMIX_INPUT_1_SOURCE);
    416ARIZONA_MIXER_ENUMS(SPKOUTL, ARIZONA_OUT4LMIX_INPUT_1_SOURCE);
    417ARIZONA_MIXER_ENUMS(SPKOUTR, ARIZONA_OUT4RMIX_INPUT_1_SOURCE);
    418ARIZONA_MIXER_ENUMS(SPKDATL, ARIZONA_OUT5LMIX_INPUT_1_SOURCE);
    419ARIZONA_MIXER_ENUMS(SPKDATR, ARIZONA_OUT5RMIX_INPUT_1_SOURCE);
    420
    421ARIZONA_MIXER_ENUMS(AIF1TX1, ARIZONA_AIF1TX1MIX_INPUT_1_SOURCE);
    422ARIZONA_MIXER_ENUMS(AIF1TX2, ARIZONA_AIF1TX2MIX_INPUT_1_SOURCE);
    423ARIZONA_MIXER_ENUMS(AIF1TX3, ARIZONA_AIF1TX3MIX_INPUT_1_SOURCE);
    424ARIZONA_MIXER_ENUMS(AIF1TX4, ARIZONA_AIF1TX4MIX_INPUT_1_SOURCE);
    425ARIZONA_MIXER_ENUMS(AIF1TX5, ARIZONA_AIF1TX5MIX_INPUT_1_SOURCE);
    426ARIZONA_MIXER_ENUMS(AIF1TX6, ARIZONA_AIF1TX6MIX_INPUT_1_SOURCE);
    427
    428ARIZONA_MIXER_ENUMS(AIF2TX1, ARIZONA_AIF2TX1MIX_INPUT_1_SOURCE);
    429ARIZONA_MIXER_ENUMS(AIF2TX2, ARIZONA_AIF2TX2MIX_INPUT_1_SOURCE);
    430ARIZONA_MIXER_ENUMS(AIF2TX3, ARIZONA_AIF2TX3MIX_INPUT_1_SOURCE);
    431ARIZONA_MIXER_ENUMS(AIF2TX4, ARIZONA_AIF2TX4MIX_INPUT_1_SOURCE);
    432ARIZONA_MIXER_ENUMS(AIF2TX5, ARIZONA_AIF2TX5MIX_INPUT_1_SOURCE);
    433ARIZONA_MIXER_ENUMS(AIF2TX6, ARIZONA_AIF2TX6MIX_INPUT_1_SOURCE);
    434
    435ARIZONA_MIXER_ENUMS(AIF3TX1, ARIZONA_AIF3TX1MIX_INPUT_1_SOURCE);
    436ARIZONA_MIXER_ENUMS(AIF3TX2, ARIZONA_AIF3TX2MIX_INPUT_1_SOURCE);
    437
    438ARIZONA_MUX_ENUMS(SLIMTX1, ARIZONA_SLIMTX1MIX_INPUT_1_SOURCE);
    439ARIZONA_MUX_ENUMS(SLIMTX2, ARIZONA_SLIMTX2MIX_INPUT_1_SOURCE);
    440ARIZONA_MUX_ENUMS(SLIMTX3, ARIZONA_SLIMTX3MIX_INPUT_1_SOURCE);
    441ARIZONA_MUX_ENUMS(SLIMTX4, ARIZONA_SLIMTX4MIX_INPUT_1_SOURCE);
    442ARIZONA_MUX_ENUMS(SLIMTX5, ARIZONA_SLIMTX5MIX_INPUT_1_SOURCE);
    443ARIZONA_MUX_ENUMS(SLIMTX6, ARIZONA_SLIMTX6MIX_INPUT_1_SOURCE);
    444
    445ARIZONA_MUX_ENUMS(SPD1TX1, ARIZONA_SPDIFTX1MIX_INPUT_1_SOURCE);
    446ARIZONA_MUX_ENUMS(SPD1TX2, ARIZONA_SPDIFTX2MIX_INPUT_1_SOURCE);
    447
    448ARIZONA_MUX_ENUMS(ASRC1L, ARIZONA_ASRC1LMIX_INPUT_1_SOURCE);
    449ARIZONA_MUX_ENUMS(ASRC1R, ARIZONA_ASRC1RMIX_INPUT_1_SOURCE);
    450ARIZONA_MUX_ENUMS(ASRC2L, ARIZONA_ASRC2LMIX_INPUT_1_SOURCE);
    451ARIZONA_MUX_ENUMS(ASRC2R, ARIZONA_ASRC2RMIX_INPUT_1_SOURCE);
    452
    453ARIZONA_MUX_ENUMS(ISRC1INT1, ARIZONA_ISRC1INT1MIX_INPUT_1_SOURCE);
    454ARIZONA_MUX_ENUMS(ISRC1INT2, ARIZONA_ISRC1INT2MIX_INPUT_1_SOURCE);
    455ARIZONA_MUX_ENUMS(ISRC1INT3, ARIZONA_ISRC1INT3MIX_INPUT_1_SOURCE);
    456ARIZONA_MUX_ENUMS(ISRC1INT4, ARIZONA_ISRC1INT4MIX_INPUT_1_SOURCE);
    457
    458ARIZONA_MUX_ENUMS(ISRC1DEC1, ARIZONA_ISRC1DEC1MIX_INPUT_1_SOURCE);
    459ARIZONA_MUX_ENUMS(ISRC1DEC2, ARIZONA_ISRC1DEC2MIX_INPUT_1_SOURCE);
    460ARIZONA_MUX_ENUMS(ISRC1DEC3, ARIZONA_ISRC1DEC3MIX_INPUT_1_SOURCE);
    461ARIZONA_MUX_ENUMS(ISRC1DEC4, ARIZONA_ISRC1DEC4MIX_INPUT_1_SOURCE);
    462
    463ARIZONA_MUX_ENUMS(ISRC2INT1, ARIZONA_ISRC2INT1MIX_INPUT_1_SOURCE);
    464ARIZONA_MUX_ENUMS(ISRC2INT2, ARIZONA_ISRC2INT2MIX_INPUT_1_SOURCE);
    465
    466ARIZONA_MUX_ENUMS(ISRC2DEC1, ARIZONA_ISRC2DEC1MIX_INPUT_1_SOURCE);
    467ARIZONA_MUX_ENUMS(ISRC2DEC2, ARIZONA_ISRC2DEC2MIX_INPUT_1_SOURCE);
    468
    469static const char * const wm8998_aec_loopback_texts[] = {
    470	"HPOUTL", "HPOUTR", "LINEOUTL", "LINEOUTR", "EPOUT",
    471	"SPKOUTL", "SPKOUTR", "SPKDATL", "SPKDATR",
    472};
    473
    474static const unsigned int wm8998_aec_loopback_values[] = {
    475	0, 1, 2, 3, 4, 6, 7, 8, 9,
    476};
    477
    478static SOC_VALUE_ENUM_SINGLE_DECL(wm8998_aec1_loopback,
    479				  ARIZONA_DAC_AEC_CONTROL_1,
    480				  ARIZONA_AEC_LOOPBACK_SRC_SHIFT, 0xf,
    481				  wm8998_aec_loopback_texts,
    482				  wm8998_aec_loopback_values);
    483
    484static SOC_VALUE_ENUM_SINGLE_DECL(wm8998_aec2_loopback,
    485				  ARIZONA_DAC_AEC_CONTROL_2,
    486				  ARIZONA_AEC_LOOPBACK_SRC_SHIFT, 0xf,
    487				  wm8998_aec_loopback_texts,
    488				  wm8998_aec_loopback_values);
    489
    490static const struct snd_kcontrol_new wm8998_aec_loopback_mux[] = {
    491	SOC_DAPM_ENUM("AEC1 Loopback", wm8998_aec1_loopback),
    492	SOC_DAPM_ENUM("AEC2 Loopback", wm8998_aec2_loopback),
    493};
    494
    495static const struct snd_soc_dapm_widget wm8998_dapm_widgets[] = {
    496SND_SOC_DAPM_SUPPLY("SYSCLK", ARIZONA_SYSTEM_CLOCK_1,
    497		    ARIZONA_SYSCLK_ENA_SHIFT, 0, arizona_clk_ev,
    498		    SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
    499SND_SOC_DAPM_SUPPLY("ASYNCCLK", ARIZONA_ASYNC_CLOCK_1,
    500		    ARIZONA_ASYNC_CLK_ENA_SHIFT, 0, arizona_clk_ev,
    501		    SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
    502SND_SOC_DAPM_SUPPLY("OPCLK", ARIZONA_OUTPUT_SYSTEM_CLOCK,
    503		    ARIZONA_OPCLK_ENA_SHIFT, 0, NULL, 0),
    504SND_SOC_DAPM_SUPPLY("ASYNCOPCLK", ARIZONA_OUTPUT_ASYNC_CLOCK,
    505		    ARIZONA_OPCLK_ASYNC_ENA_SHIFT, 0, NULL, 0),
    506
    507SND_SOC_DAPM_REGULATOR_SUPPLY("DBVDD2", 0, 0),
    508SND_SOC_DAPM_REGULATOR_SUPPLY("DBVDD3", 0, 0),
    509SND_SOC_DAPM_REGULATOR_SUPPLY("CPVDD", 20, 0),
    510SND_SOC_DAPM_REGULATOR_SUPPLY("MICVDD", 0, SND_SOC_DAPM_REGULATOR_BYPASS),
    511SND_SOC_DAPM_REGULATOR_SUPPLY("SPKVDDL", 0, 0),
    512SND_SOC_DAPM_REGULATOR_SUPPLY("SPKVDDR", 0, 0),
    513
    514SND_SOC_DAPM_SIGGEN("TONE"),
    515SND_SOC_DAPM_SIGGEN("HAPTICS"),
    516
    517SND_SOC_DAPM_INPUT("IN1AL"),
    518SND_SOC_DAPM_INPUT("IN1AR"),
    519SND_SOC_DAPM_INPUT("IN1BL"),
    520SND_SOC_DAPM_INPUT("IN1BR"),
    521SND_SOC_DAPM_INPUT("IN2A"),
    522SND_SOC_DAPM_INPUT("IN2B"),
    523
    524SND_SOC_DAPM_MUX("IN1L Mux", SND_SOC_NOPM, 0, 0, &wm8998_in1mux[0]),
    525SND_SOC_DAPM_MUX("IN1R Mux", SND_SOC_NOPM, 0, 0, &wm8998_in1mux[1]),
    526SND_SOC_DAPM_MUX("IN2 Mux", SND_SOC_NOPM, 0, 0, &wm8998_in2mux),
    527
    528SND_SOC_DAPM_OUTPUT("DRC1 Signal Activity"),
    529
    530SND_SOC_DAPM_PGA_E("IN1L PGA", ARIZONA_INPUT_ENABLES, ARIZONA_IN1L_ENA_SHIFT,
    531		   0, NULL, 0, arizona_in_ev,
    532		   SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD |
    533		   SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU),
    534SND_SOC_DAPM_PGA_E("IN1R PGA", ARIZONA_INPUT_ENABLES, ARIZONA_IN1R_ENA_SHIFT,
    535		   0, NULL, 0, arizona_in_ev,
    536		   SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD |
    537		   SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU),
    538SND_SOC_DAPM_PGA_E("IN2 PGA", ARIZONA_INPUT_ENABLES, ARIZONA_IN2L_ENA_SHIFT,
    539		   0, NULL, 0, arizona_in_ev,
    540		   SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD |
    541		   SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU),
    542
    543SND_SOC_DAPM_SUPPLY("MICBIAS1", ARIZONA_MIC_BIAS_CTRL_1,
    544		    ARIZONA_MICB1_ENA_SHIFT, 0, NULL, 0),
    545SND_SOC_DAPM_SUPPLY("MICBIAS2", ARIZONA_MIC_BIAS_CTRL_2,
    546		    ARIZONA_MICB1_ENA_SHIFT, 0, NULL, 0),
    547SND_SOC_DAPM_SUPPLY("MICBIAS3", ARIZONA_MIC_BIAS_CTRL_3,
    548		    ARIZONA_MICB1_ENA_SHIFT, 0, NULL, 0),
    549
    550SND_SOC_DAPM_PGA("Tone Generator 1", ARIZONA_TONE_GENERATOR_1,
    551		 ARIZONA_TONE1_ENA_SHIFT, 0, NULL, 0),
    552SND_SOC_DAPM_PGA("Tone Generator 2", ARIZONA_TONE_GENERATOR_1,
    553		 ARIZONA_TONE2_ENA_SHIFT, 0, NULL, 0),
    554
    555SND_SOC_DAPM_PGA("EQ1", ARIZONA_EQ1_1, ARIZONA_EQ1_ENA_SHIFT, 0, NULL, 0),
    556SND_SOC_DAPM_PGA("EQ2", ARIZONA_EQ2_1, ARIZONA_EQ2_ENA_SHIFT, 0, NULL, 0),
    557SND_SOC_DAPM_PGA("EQ3", ARIZONA_EQ3_1, ARIZONA_EQ3_ENA_SHIFT, 0, NULL, 0),
    558SND_SOC_DAPM_PGA("EQ4", ARIZONA_EQ4_1, ARIZONA_EQ4_ENA_SHIFT, 0, NULL, 0),
    559
    560SND_SOC_DAPM_PGA("DRC1L", ARIZONA_DRC1_CTRL1, ARIZONA_DRC1L_ENA_SHIFT, 0,
    561		 NULL, 0),
    562SND_SOC_DAPM_PGA("DRC1R", ARIZONA_DRC1_CTRL1, ARIZONA_DRC1R_ENA_SHIFT, 0,
    563		 NULL, 0),
    564
    565SND_SOC_DAPM_PGA("LHPF1", ARIZONA_HPLPF1_1, ARIZONA_LHPF1_ENA_SHIFT, 0,
    566		 NULL, 0),
    567SND_SOC_DAPM_PGA("LHPF2", ARIZONA_HPLPF2_1, ARIZONA_LHPF2_ENA_SHIFT, 0,
    568		 NULL, 0),
    569SND_SOC_DAPM_PGA("LHPF3", ARIZONA_HPLPF3_1, ARIZONA_LHPF3_ENA_SHIFT, 0,
    570		 NULL, 0),
    571SND_SOC_DAPM_PGA("LHPF4", ARIZONA_HPLPF4_1, ARIZONA_LHPF4_ENA_SHIFT, 0,
    572		 NULL, 0),
    573
    574SND_SOC_DAPM_PGA("PWM1 Driver", ARIZONA_PWM_DRIVE_1, ARIZONA_PWM1_ENA_SHIFT,
    575		 0, NULL, 0),
    576SND_SOC_DAPM_PGA("PWM2 Driver", ARIZONA_PWM_DRIVE_1, ARIZONA_PWM2_ENA_SHIFT,
    577		 0, NULL, 0),
    578
    579SND_SOC_DAPM_PGA_E("ASRC1L", ARIZONA_ASRC_ENABLE, ARIZONA_ASRC1L_ENA_SHIFT, 0,
    580		   NULL, 0, wm8998_asrc_ev, SND_SOC_DAPM_PRE_PMU),
    581SND_SOC_DAPM_PGA_E("ASRC1R", ARIZONA_ASRC_ENABLE, ARIZONA_ASRC1R_ENA_SHIFT, 0,
    582		   NULL, 0, wm8998_asrc_ev, SND_SOC_DAPM_PRE_PMU),
    583SND_SOC_DAPM_PGA_E("ASRC2L", ARIZONA_ASRC_ENABLE, ARIZONA_ASRC2L_ENA_SHIFT, 0,
    584		   NULL, 0, wm8998_asrc_ev, SND_SOC_DAPM_PRE_PMU),
    585SND_SOC_DAPM_PGA_E("ASRC2R", ARIZONA_ASRC_ENABLE, ARIZONA_ASRC2R_ENA_SHIFT, 0,
    586		   NULL, 0, wm8998_asrc_ev, SND_SOC_DAPM_PRE_PMU),
    587
    588SND_SOC_DAPM_PGA("ISRC1INT1", ARIZONA_ISRC_1_CTRL_3,
    589		 ARIZONA_ISRC1_INT0_ENA_SHIFT, 0, NULL, 0),
    590SND_SOC_DAPM_PGA("ISRC1INT2", ARIZONA_ISRC_1_CTRL_3,
    591		 ARIZONA_ISRC1_INT1_ENA_SHIFT, 0, NULL, 0),
    592SND_SOC_DAPM_PGA("ISRC1INT3", ARIZONA_ISRC_1_CTRL_3,
    593		 ARIZONA_ISRC1_INT2_ENA_SHIFT, 0, NULL, 0),
    594SND_SOC_DAPM_PGA("ISRC1INT4", ARIZONA_ISRC_1_CTRL_3,
    595		 ARIZONA_ISRC1_INT3_ENA_SHIFT, 0, NULL, 0),
    596
    597SND_SOC_DAPM_PGA("ISRC1DEC1", ARIZONA_ISRC_1_CTRL_3,
    598		 ARIZONA_ISRC1_DEC0_ENA_SHIFT, 0, NULL, 0),
    599SND_SOC_DAPM_PGA("ISRC1DEC2", ARIZONA_ISRC_1_CTRL_3,
    600		 ARIZONA_ISRC1_DEC1_ENA_SHIFT, 0, NULL, 0),
    601SND_SOC_DAPM_PGA("ISRC1DEC3", ARIZONA_ISRC_1_CTRL_3,
    602		 ARIZONA_ISRC1_DEC2_ENA_SHIFT, 0, NULL, 0),
    603SND_SOC_DAPM_PGA("ISRC1DEC4", ARIZONA_ISRC_1_CTRL_3,
    604		 ARIZONA_ISRC1_DEC3_ENA_SHIFT, 0, NULL, 0),
    605
    606SND_SOC_DAPM_PGA("ISRC2INT1", ARIZONA_ISRC_2_CTRL_3,
    607		 ARIZONA_ISRC2_INT0_ENA_SHIFT, 0, NULL, 0),
    608SND_SOC_DAPM_PGA("ISRC2INT2", ARIZONA_ISRC_2_CTRL_3,
    609		 ARIZONA_ISRC2_INT1_ENA_SHIFT, 0, NULL, 0),
    610
    611SND_SOC_DAPM_PGA("ISRC2DEC1", ARIZONA_ISRC_2_CTRL_3,
    612		 ARIZONA_ISRC2_DEC0_ENA_SHIFT, 0, NULL, 0),
    613SND_SOC_DAPM_PGA("ISRC2DEC2", ARIZONA_ISRC_2_CTRL_3,
    614		 ARIZONA_ISRC2_DEC1_ENA_SHIFT, 0, NULL, 0),
    615
    616SND_SOC_DAPM_MUX("AEC1 Loopback", ARIZONA_DAC_AEC_CONTROL_1,
    617		 ARIZONA_AEC_LOOPBACK_ENA_SHIFT, 0,
    618		 &wm8998_aec_loopback_mux[0]),
    619
    620SND_SOC_DAPM_MUX("AEC2 Loopback", ARIZONA_DAC_AEC_CONTROL_2,
    621		 ARIZONA_AEC_LOOPBACK_ENA_SHIFT, 0,
    622		 &wm8998_aec_loopback_mux[1]),
    623
    624SND_SOC_DAPM_AIF_OUT("AIF1TX1", NULL, 0,
    625		     ARIZONA_AIF1_TX_ENABLES, ARIZONA_AIF1TX1_ENA_SHIFT, 0),
    626SND_SOC_DAPM_AIF_OUT("AIF1TX2", NULL, 1,
    627		     ARIZONA_AIF1_TX_ENABLES, ARIZONA_AIF1TX2_ENA_SHIFT, 0),
    628SND_SOC_DAPM_AIF_OUT("AIF1TX3", NULL, 2,
    629		     ARIZONA_AIF1_TX_ENABLES, ARIZONA_AIF1TX3_ENA_SHIFT, 0),
    630SND_SOC_DAPM_AIF_OUT("AIF1TX4", NULL, 3,
    631		     ARIZONA_AIF1_TX_ENABLES, ARIZONA_AIF1TX4_ENA_SHIFT, 0),
    632SND_SOC_DAPM_AIF_OUT("AIF1TX5", NULL, 4,
    633		     ARIZONA_AIF1_TX_ENABLES, ARIZONA_AIF1TX5_ENA_SHIFT, 0),
    634SND_SOC_DAPM_AIF_OUT("AIF1TX6", NULL, 5,
    635		     ARIZONA_AIF1_TX_ENABLES, ARIZONA_AIF1TX6_ENA_SHIFT, 0),
    636
    637SND_SOC_DAPM_AIF_IN("AIF1RX1", NULL, 0,
    638		    ARIZONA_AIF1_RX_ENABLES, ARIZONA_AIF1RX1_ENA_SHIFT, 0),
    639SND_SOC_DAPM_AIF_IN("AIF1RX2", NULL, 1,
    640		    ARIZONA_AIF1_RX_ENABLES, ARIZONA_AIF1RX2_ENA_SHIFT, 0),
    641SND_SOC_DAPM_AIF_IN("AIF1RX3", NULL, 2,
    642		    ARIZONA_AIF1_RX_ENABLES, ARIZONA_AIF1RX3_ENA_SHIFT, 0),
    643SND_SOC_DAPM_AIF_IN("AIF1RX4", NULL, 3,
    644		    ARIZONA_AIF1_RX_ENABLES, ARIZONA_AIF1RX4_ENA_SHIFT, 0),
    645SND_SOC_DAPM_AIF_IN("AIF1RX5", NULL, 4,
    646		    ARIZONA_AIF1_RX_ENABLES, ARIZONA_AIF1RX5_ENA_SHIFT, 0),
    647SND_SOC_DAPM_AIF_IN("AIF1RX6", NULL, 5,
    648		    ARIZONA_AIF1_RX_ENABLES, ARIZONA_AIF1RX6_ENA_SHIFT, 0),
    649
    650SND_SOC_DAPM_AIF_OUT("AIF2TX1", NULL, 0,
    651		     ARIZONA_AIF2_TX_ENABLES, ARIZONA_AIF2TX1_ENA_SHIFT, 0),
    652SND_SOC_DAPM_AIF_OUT("AIF2TX2", NULL, 1,
    653		     ARIZONA_AIF2_TX_ENABLES, ARIZONA_AIF2TX2_ENA_SHIFT, 0),
    654SND_SOC_DAPM_AIF_OUT("AIF2TX3", NULL, 2,
    655		     ARIZONA_AIF2_TX_ENABLES, ARIZONA_AIF2TX3_ENA_SHIFT, 0),
    656SND_SOC_DAPM_AIF_OUT("AIF2TX4", NULL, 3,
    657		     ARIZONA_AIF2_TX_ENABLES, ARIZONA_AIF2TX4_ENA_SHIFT, 0),
    658SND_SOC_DAPM_AIF_OUT("AIF2TX5", NULL, 4,
    659		     ARIZONA_AIF2_TX_ENABLES, ARIZONA_AIF2TX5_ENA_SHIFT, 0),
    660SND_SOC_DAPM_AIF_OUT("AIF2TX6", NULL, 5,
    661		     ARIZONA_AIF2_TX_ENABLES, ARIZONA_AIF2TX6_ENA_SHIFT, 0),
    662
    663SND_SOC_DAPM_AIF_IN("AIF2RX1", NULL, 0,
    664		    ARIZONA_AIF2_RX_ENABLES, ARIZONA_AIF2RX1_ENA_SHIFT, 0),
    665SND_SOC_DAPM_AIF_IN("AIF2RX2", NULL, 1,
    666		    ARIZONA_AIF2_RX_ENABLES, ARIZONA_AIF2RX2_ENA_SHIFT, 0),
    667SND_SOC_DAPM_AIF_IN("AIF2RX3", NULL, 2,
    668		    ARIZONA_AIF2_RX_ENABLES, ARIZONA_AIF2RX3_ENA_SHIFT, 0),
    669SND_SOC_DAPM_AIF_IN("AIF2RX4", NULL, 3,
    670		    ARIZONA_AIF2_RX_ENABLES, ARIZONA_AIF2RX4_ENA_SHIFT, 0),
    671SND_SOC_DAPM_AIF_IN("AIF2RX5", NULL, 4,
    672		    ARIZONA_AIF2_RX_ENABLES, ARIZONA_AIF2RX5_ENA_SHIFT, 0),
    673SND_SOC_DAPM_AIF_IN("AIF2RX6", NULL, 5,
    674		    ARIZONA_AIF2_RX_ENABLES, ARIZONA_AIF2RX6_ENA_SHIFT, 0),
    675
    676SND_SOC_DAPM_AIF_IN("SLIMRX1", NULL, 0,
    677		    ARIZONA_SLIMBUS_RX_CHANNEL_ENABLE,
    678		    ARIZONA_SLIMRX1_ENA_SHIFT, 0),
    679SND_SOC_DAPM_AIF_IN("SLIMRX2", NULL, 1,
    680		    ARIZONA_SLIMBUS_RX_CHANNEL_ENABLE,
    681		    ARIZONA_SLIMRX2_ENA_SHIFT, 0),
    682SND_SOC_DAPM_AIF_IN("SLIMRX3", NULL, 2,
    683		    ARIZONA_SLIMBUS_RX_CHANNEL_ENABLE,
    684		    ARIZONA_SLIMRX3_ENA_SHIFT, 0),
    685SND_SOC_DAPM_AIF_IN("SLIMRX4", NULL, 3,
    686		    ARIZONA_SLIMBUS_RX_CHANNEL_ENABLE,
    687		    ARIZONA_SLIMRX4_ENA_SHIFT, 0),
    688
    689SND_SOC_DAPM_AIF_OUT("SLIMTX1", NULL, 0,
    690		     ARIZONA_SLIMBUS_TX_CHANNEL_ENABLE,
    691		     ARIZONA_SLIMTX1_ENA_SHIFT, 0),
    692SND_SOC_DAPM_AIF_OUT("SLIMTX2", NULL, 1,
    693		     ARIZONA_SLIMBUS_TX_CHANNEL_ENABLE,
    694		     ARIZONA_SLIMTX2_ENA_SHIFT, 0),
    695SND_SOC_DAPM_AIF_OUT("SLIMTX3", NULL, 2,
    696		     ARIZONA_SLIMBUS_TX_CHANNEL_ENABLE,
    697		     ARIZONA_SLIMTX3_ENA_SHIFT, 0),
    698SND_SOC_DAPM_AIF_OUT("SLIMTX4", NULL, 3,
    699		     ARIZONA_SLIMBUS_TX_CHANNEL_ENABLE,
    700		     ARIZONA_SLIMTX4_ENA_SHIFT, 0),
    701SND_SOC_DAPM_AIF_OUT("SLIMTX5", NULL, 4,
    702		     ARIZONA_SLIMBUS_TX_CHANNEL_ENABLE,
    703		     ARIZONA_SLIMTX5_ENA_SHIFT, 0),
    704SND_SOC_DAPM_AIF_OUT("SLIMTX6", NULL, 5,
    705		     ARIZONA_SLIMBUS_TX_CHANNEL_ENABLE,
    706		     ARIZONA_SLIMTX6_ENA_SHIFT, 0),
    707
    708SND_SOC_DAPM_AIF_OUT("AIF3TX1", NULL, 0,
    709		     ARIZONA_AIF3_TX_ENABLES, ARIZONA_AIF3TX1_ENA_SHIFT, 0),
    710SND_SOC_DAPM_AIF_OUT("AIF3TX2", NULL, 1,
    711		     ARIZONA_AIF3_TX_ENABLES, ARIZONA_AIF3TX2_ENA_SHIFT, 0),
    712
    713SND_SOC_DAPM_AIF_IN("AIF3RX1", NULL, 0,
    714		    ARIZONA_AIF3_RX_ENABLES, ARIZONA_AIF3RX1_ENA_SHIFT, 0),
    715SND_SOC_DAPM_AIF_IN("AIF3RX2", NULL, 1,
    716		    ARIZONA_AIF3_RX_ENABLES, ARIZONA_AIF3RX2_ENA_SHIFT, 0),
    717
    718SND_SOC_DAPM_PGA_E("OUT1L", SND_SOC_NOPM,
    719		   ARIZONA_OUT1L_ENA_SHIFT, 0, NULL, 0, arizona_hp_ev,
    720		   SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU),
    721SND_SOC_DAPM_PGA_E("OUT1R", SND_SOC_NOPM,
    722		   ARIZONA_OUT1R_ENA_SHIFT, 0, NULL, 0, arizona_hp_ev,
    723		   SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU),
    724SND_SOC_DAPM_PGA_E("OUT2L", ARIZONA_OUTPUT_ENABLES_1,
    725		   ARIZONA_OUT2L_ENA_SHIFT, 0, NULL, 0, arizona_out_ev,
    726		   SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU),
    727SND_SOC_DAPM_PGA_E("OUT2R", ARIZONA_OUTPUT_ENABLES_1,
    728		   ARIZONA_OUT2R_ENA_SHIFT, 0, NULL, 0, arizona_out_ev,
    729		   SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU),
    730SND_SOC_DAPM_PGA_E("OUT3", ARIZONA_OUTPUT_ENABLES_1,
    731		   ARIZONA_OUT3L_ENA_SHIFT, 0, NULL, 0, arizona_out_ev,
    732		   SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU),
    733SND_SOC_DAPM_PGA_E("OUT5L", ARIZONA_OUTPUT_ENABLES_1,
    734		   ARIZONA_OUT5L_ENA_SHIFT, 0, NULL, 0, arizona_out_ev,
    735		   SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU),
    736SND_SOC_DAPM_PGA_E("OUT5R", ARIZONA_OUTPUT_ENABLES_1,
    737		   ARIZONA_OUT5R_ENA_SHIFT, 0, NULL, 0, arizona_out_ev,
    738		   SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU),
    739
    740SND_SOC_DAPM_PGA("SPD1TX1", ARIZONA_SPD1_TX_CONTROL,
    741		 ARIZONA_SPD1_VAL1_SHIFT, 0, NULL, 0),
    742SND_SOC_DAPM_PGA("SPD1TX2", ARIZONA_SPD1_TX_CONTROL,
    743		 ARIZONA_SPD1_VAL2_SHIFT, 0, NULL, 0),
    744SND_SOC_DAPM_OUT_DRV("SPD1", ARIZONA_SPD1_TX_CONTROL,
    745		     ARIZONA_SPD1_ENA_SHIFT, 0, NULL, 0),
    746
    747ARIZONA_MUX_WIDGETS(EQ1, "EQ1"),
    748ARIZONA_MUX_WIDGETS(EQ2, "EQ2"),
    749ARIZONA_MUX_WIDGETS(EQ3, "EQ3"),
    750ARIZONA_MUX_WIDGETS(EQ4, "EQ4"),
    751
    752ARIZONA_MUX_WIDGETS(DRC1L, "DRC1L"),
    753ARIZONA_MUX_WIDGETS(DRC1R, "DRC1R"),
    754
    755ARIZONA_MIXER_WIDGETS(LHPF1, "LHPF1"),
    756ARIZONA_MIXER_WIDGETS(LHPF2, "LHPF2"),
    757ARIZONA_MIXER_WIDGETS(LHPF3, "LHPF3"),
    758ARIZONA_MIXER_WIDGETS(LHPF4, "LHPF4"),
    759
    760ARIZONA_MIXER_WIDGETS(PWM1, "PWM1"),
    761ARIZONA_MIXER_WIDGETS(PWM2, "PWM2"),
    762
    763ARIZONA_MIXER_WIDGETS(OUT1L, "HPOUTL"),
    764ARIZONA_MIXER_WIDGETS(OUT1R, "HPOUTR"),
    765ARIZONA_MIXER_WIDGETS(OUT2L, "LINEOUTL"),
    766ARIZONA_MIXER_WIDGETS(OUT2R, "LINEOUTR"),
    767ARIZONA_MIXER_WIDGETS(OUT3, "EPOUT"),
    768ARIZONA_MIXER_WIDGETS(SPKOUTL, "SPKOUTL"),
    769ARIZONA_MIXER_WIDGETS(SPKOUTR, "SPKOUTR"),
    770ARIZONA_MIXER_WIDGETS(SPKDATL, "SPKDATL"),
    771ARIZONA_MIXER_WIDGETS(SPKDATR, "SPKDATR"),
    772
    773ARIZONA_MIXER_WIDGETS(AIF1TX1, "AIF1TX1"),
    774ARIZONA_MIXER_WIDGETS(AIF1TX2, "AIF1TX2"),
    775ARIZONA_MIXER_WIDGETS(AIF1TX3, "AIF1TX3"),
    776ARIZONA_MIXER_WIDGETS(AIF1TX4, "AIF1TX4"),
    777ARIZONA_MIXER_WIDGETS(AIF1TX5, "AIF1TX5"),
    778ARIZONA_MIXER_WIDGETS(AIF1TX6, "AIF1TX6"),
    779
    780ARIZONA_MIXER_WIDGETS(AIF2TX1, "AIF2TX1"),
    781ARIZONA_MIXER_WIDGETS(AIF2TX2, "AIF2TX2"),
    782ARIZONA_MIXER_WIDGETS(AIF2TX3, "AIF2TX3"),
    783ARIZONA_MIXER_WIDGETS(AIF2TX4, "AIF2TX4"),
    784ARIZONA_MIXER_WIDGETS(AIF2TX5, "AIF2TX5"),
    785ARIZONA_MIXER_WIDGETS(AIF2TX6, "AIF2TX6"),
    786
    787ARIZONA_MIXER_WIDGETS(AIF3TX1, "AIF3TX1"),
    788ARIZONA_MIXER_WIDGETS(AIF3TX2, "AIF3TX2"),
    789
    790ARIZONA_MUX_WIDGETS(SLIMTX1, "SLIMTX1"),
    791ARIZONA_MUX_WIDGETS(SLIMTX2, "SLIMTX2"),
    792ARIZONA_MUX_WIDGETS(SLIMTX3, "SLIMTX3"),
    793ARIZONA_MUX_WIDGETS(SLIMTX4, "SLIMTX4"),
    794ARIZONA_MUX_WIDGETS(SLIMTX5, "SLIMTX5"),
    795ARIZONA_MUX_WIDGETS(SLIMTX6, "SLIMTX6"),
    796
    797ARIZONA_MUX_WIDGETS(SPD1TX1, "SPDIFTX1"),
    798ARIZONA_MUX_WIDGETS(SPD1TX2, "SPDIFTX2"),
    799
    800ARIZONA_MUX_WIDGETS(ASRC1L, "ASRC1L"),
    801ARIZONA_MUX_WIDGETS(ASRC1R, "ASRC1R"),
    802ARIZONA_MUX_WIDGETS(ASRC2L, "ASRC2L"),
    803ARIZONA_MUX_WIDGETS(ASRC2R, "ASRC2R"),
    804
    805ARIZONA_MUX_WIDGETS(ISRC1DEC1, "ISRC1DEC1"),
    806ARIZONA_MUX_WIDGETS(ISRC1DEC2, "ISRC1DEC2"),
    807ARIZONA_MUX_WIDGETS(ISRC1DEC3, "ISRC1DEC3"),
    808ARIZONA_MUX_WIDGETS(ISRC1DEC4, "ISRC1DEC4"),
    809
    810ARIZONA_MUX_WIDGETS(ISRC1INT1, "ISRC1INT1"),
    811ARIZONA_MUX_WIDGETS(ISRC1INT2, "ISRC1INT2"),
    812ARIZONA_MUX_WIDGETS(ISRC1INT3, "ISRC1INT3"),
    813ARIZONA_MUX_WIDGETS(ISRC1INT4, "ISRC1INT4"),
    814
    815ARIZONA_MUX_WIDGETS(ISRC2DEC1, "ISRC2DEC1"),
    816ARIZONA_MUX_WIDGETS(ISRC2DEC2, "ISRC2DEC2"),
    817
    818ARIZONA_MUX_WIDGETS(ISRC2INT1, "ISRC2INT1"),
    819ARIZONA_MUX_WIDGETS(ISRC2INT2, "ISRC2INT2"),
    820
    821SND_SOC_DAPM_OUTPUT("HPOUTL"),
    822SND_SOC_DAPM_OUTPUT("HPOUTR"),
    823SND_SOC_DAPM_OUTPUT("LINEOUTL"),
    824SND_SOC_DAPM_OUTPUT("LINEOUTR"),
    825SND_SOC_DAPM_OUTPUT("EPOUT"),
    826SND_SOC_DAPM_OUTPUT("SPKOUTLN"),
    827SND_SOC_DAPM_OUTPUT("SPKOUTLP"),
    828SND_SOC_DAPM_OUTPUT("SPKOUTRN"),
    829SND_SOC_DAPM_OUTPUT("SPKOUTRP"),
    830SND_SOC_DAPM_OUTPUT("SPKDATL"),
    831SND_SOC_DAPM_OUTPUT("SPKDATR"),
    832SND_SOC_DAPM_OUTPUT("SPDIF"),
    833
    834SND_SOC_DAPM_OUTPUT("MICSUPP"),
    835};
    836
    837#define ARIZONA_MIXER_INPUT_ROUTES(name)	\
    838	{ name, "Tone Generator 1", "Tone Generator 1" }, \
    839	{ name, "Tone Generator 2", "Tone Generator 2" }, \
    840	{ name, "Haptics", "HAPTICS" }, \
    841	{ name, "AEC", "AEC1 Loopback" }, \
    842	{ name, "AEC2", "AEC2 Loopback" }, \
    843	{ name, "IN1L", "IN1L PGA" }, \
    844	{ name, "IN1R", "IN1R PGA" }, \
    845	{ name, "IN2L", "IN2 PGA" }, \
    846	{ name, "AIF1RX1", "AIF1RX1" }, \
    847	{ name, "AIF1RX2", "AIF1RX2" }, \
    848	{ name, "AIF1RX3", "AIF1RX3" }, \
    849	{ name, "AIF1RX4", "AIF1RX4" }, \
    850	{ name, "AIF1RX5", "AIF1RX5" }, \
    851	{ name, "AIF1RX6", "AIF1RX6" }, \
    852	{ name, "AIF2RX1", "AIF2RX1" }, \
    853	{ name, "AIF2RX2", "AIF2RX2" }, \
    854	{ name, "AIF2RX3", "AIF2RX3" }, \
    855	{ name, "AIF2RX4", "AIF2RX4" }, \
    856	{ name, "AIF2RX5", "AIF2RX5" }, \
    857	{ name, "AIF2RX6", "AIF2RX6" }, \
    858	{ name, "AIF3RX1", "AIF3RX1" }, \
    859	{ name, "AIF3RX2", "AIF3RX2" }, \
    860	{ name, "SLIMRX1", "SLIMRX1" }, \
    861	{ name, "SLIMRX2", "SLIMRX2" }, \
    862	{ name, "SLIMRX3", "SLIMRX3" }, \
    863	{ name, "SLIMRX4", "SLIMRX4" }, \
    864	{ name, "EQ1", "EQ1" }, \
    865	{ name, "EQ2", "EQ2" }, \
    866	{ name, "EQ3", "EQ3" }, \
    867	{ name, "EQ4", "EQ4" }, \
    868	{ name, "DRC1L", "DRC1L" }, \
    869	{ name, "DRC1R", "DRC1R" }, \
    870	{ name, "LHPF1", "LHPF1" }, \
    871	{ name, "LHPF2", "LHPF2" }, \
    872	{ name, "LHPF3", "LHPF3" }, \
    873	{ name, "LHPF4", "LHPF4" }, \
    874	{ name, "ASRC1L", "ASRC1L" }, \
    875	{ name, "ASRC1R", "ASRC1R" }, \
    876	{ name, "ASRC2L", "ASRC2L" }, \
    877	{ name, "ASRC2R", "ASRC2R" }, \
    878	{ name, "ISRC1DEC1", "ISRC1DEC1" }, \
    879	{ name, "ISRC1DEC2", "ISRC1DEC2" }, \
    880	{ name, "ISRC1DEC3", "ISRC1DEC3" }, \
    881	{ name, "ISRC1DEC4", "ISRC1DEC4" }, \
    882	{ name, "ISRC1INT1", "ISRC1INT1" }, \
    883	{ name, "ISRC1INT2", "ISRC1INT2" }, \
    884	{ name, "ISRC1INT3", "ISRC1INT3" }, \
    885	{ name, "ISRC1INT4", "ISRC1INT4" }, \
    886	{ name, "ISRC2DEC1", "ISRC2DEC1" }, \
    887	{ name, "ISRC2DEC2", "ISRC2DEC2" }, \
    888	{ name, "ISRC2INT1", "ISRC2INT1" }, \
    889	{ name, "ISRC2INT2", "ISRC2INT2" }
    890
    891static const struct snd_soc_dapm_route wm8998_dapm_routes[] = {
    892	{ "AIF2 Capture", NULL, "DBVDD2" },
    893	{ "AIF2 Playback", NULL, "DBVDD2" },
    894
    895	{ "AIF3 Capture", NULL, "DBVDD3" },
    896	{ "AIF3 Playback", NULL, "DBVDD3" },
    897
    898	{ "OUT1L", NULL, "CPVDD" },
    899	{ "OUT1R", NULL, "CPVDD" },
    900	{ "OUT2L", NULL, "CPVDD" },
    901	{ "OUT2R", NULL, "CPVDD" },
    902	{ "OUT3",  NULL, "CPVDD" },
    903
    904	{ "OUT4L", NULL, "SPKVDDL" },
    905	{ "OUT4R", NULL, "SPKVDDR" },
    906
    907	{ "OUT1L", NULL, "SYSCLK" },
    908	{ "OUT1R", NULL, "SYSCLK" },
    909	{ "OUT2L", NULL, "SYSCLK" },
    910	{ "OUT2R", NULL, "SYSCLK" },
    911	{ "OUT3",  NULL, "SYSCLK" },
    912	{ "OUT4L", NULL, "SYSCLK" },
    913	{ "OUT4R", NULL, "SYSCLK" },
    914	{ "OUT5L", NULL, "SYSCLK" },
    915	{ "OUT5R", NULL, "SYSCLK" },
    916
    917	{ "IN1AL", NULL, "SYSCLK" },
    918	{ "IN1AR", NULL, "SYSCLK" },
    919	{ "IN1BL", NULL, "SYSCLK" },
    920	{ "IN1BR", NULL, "SYSCLK" },
    921	{ "IN2A", NULL, "SYSCLK" },
    922	{ "IN2B", NULL, "SYSCLK" },
    923
    924	{ "ASRC1L", NULL, "SYSCLK" },
    925	{ "ASRC1R", NULL, "SYSCLK" },
    926	{ "ASRC2L", NULL, "SYSCLK" },
    927	{ "ASRC2R", NULL, "SYSCLK" },
    928
    929	{ "ASRC1L", NULL, "ASYNCCLK" },
    930	{ "ASRC1R", NULL, "ASYNCCLK" },
    931	{ "ASRC2L", NULL, "ASYNCCLK" },
    932	{ "ASRC2R", NULL, "ASYNCCLK" },
    933
    934	{ "SPD1", NULL, "SYSCLK" },
    935	{ "SPD1", NULL, "SPD1TX1" },
    936	{ "SPD1", NULL, "SPD1TX2" },
    937
    938	{ "MICBIAS1", NULL, "MICVDD" },
    939	{ "MICBIAS2", NULL, "MICVDD" },
    940	{ "MICBIAS3", NULL, "MICVDD" },
    941
    942	{ "Tone Generator 1", NULL, "SYSCLK" },
    943	{ "Tone Generator 2", NULL, "SYSCLK" },
    944
    945	{ "Tone Generator 1", NULL, "TONE" },
    946	{ "Tone Generator 2", NULL, "TONE" },
    947
    948	{ "AIF1 Capture", NULL, "AIF1TX1" },
    949	{ "AIF1 Capture", NULL, "AIF1TX2" },
    950	{ "AIF1 Capture", NULL, "AIF1TX3" },
    951	{ "AIF1 Capture", NULL, "AIF1TX4" },
    952	{ "AIF1 Capture", NULL, "AIF1TX5" },
    953	{ "AIF1 Capture", NULL, "AIF1TX6" },
    954
    955	{ "AIF1RX1", NULL, "AIF1 Playback" },
    956	{ "AIF1RX2", NULL, "AIF1 Playback" },
    957	{ "AIF1RX3", NULL, "AIF1 Playback" },
    958	{ "AIF1RX4", NULL, "AIF1 Playback" },
    959	{ "AIF1RX5", NULL, "AIF1 Playback" },
    960	{ "AIF1RX6", NULL, "AIF1 Playback" },
    961
    962	{ "AIF2 Capture", NULL, "AIF2TX1" },
    963	{ "AIF2 Capture", NULL, "AIF2TX2" },
    964	{ "AIF2 Capture", NULL, "AIF2TX3" },
    965	{ "AIF2 Capture", NULL, "AIF2TX4" },
    966	{ "AIF2 Capture", NULL, "AIF2TX5" },
    967	{ "AIF2 Capture", NULL, "AIF2TX6" },
    968
    969	{ "AIF2RX1", NULL, "AIF2 Playback" },
    970	{ "AIF2RX2", NULL, "AIF2 Playback" },
    971	{ "AIF2RX3", NULL, "AIF2 Playback" },
    972	{ "AIF2RX4", NULL, "AIF2 Playback" },
    973	{ "AIF2RX5", NULL, "AIF2 Playback" },
    974	{ "AIF2RX6", NULL, "AIF2 Playback" },
    975
    976	{ "AIF3 Capture", NULL, "AIF3TX1" },
    977	{ "AIF3 Capture", NULL, "AIF3TX2" },
    978
    979	{ "AIF3RX1", NULL, "AIF3 Playback" },
    980	{ "AIF3RX2", NULL, "AIF3 Playback" },
    981
    982	{ "Slim1 Capture", NULL, "SLIMTX1" },
    983	{ "Slim1 Capture", NULL, "SLIMTX2" },
    984	{ "Slim1 Capture", NULL, "SLIMTX3" },
    985	{ "Slim1 Capture", NULL, "SLIMTX4" },
    986
    987	{ "Slim2 Capture", NULL, "SLIMTX5" },
    988	{ "Slim2 Capture", NULL, "SLIMTX6" },
    989
    990	{ "SLIMRX1", NULL, "Slim1 Playback" },
    991	{ "SLIMRX2", NULL, "Slim1 Playback" },
    992
    993	{ "SLIMRX3", NULL, "Slim2 Playback" },
    994	{ "SLIMRX4", NULL, "Slim2 Playback" },
    995
    996	{ "AIF1 Playback", NULL, "SYSCLK" },
    997	{ "AIF2 Playback", NULL, "SYSCLK" },
    998	{ "AIF3 Playback", NULL, "SYSCLK" },
    999	{ "Slim1 Playback", NULL, "SYSCLK" },
   1000	{ "Slim2 Playback", NULL, "SYSCLK" },
   1001
   1002	{ "AIF1 Capture", NULL, "SYSCLK" },
   1003	{ "AIF2 Capture", NULL, "SYSCLK" },
   1004	{ "AIF3 Capture", NULL, "SYSCLK" },
   1005	{ "Slim1 Capture", NULL, "SYSCLK" },
   1006	{ "Slim2 Capture", NULL, "SYSCLK" },
   1007
   1008	{ "IN1L Mux", "A", "IN1AL" },
   1009	{ "IN1R Mux", "A", "IN1AR" },
   1010	{ "IN1L Mux", "B", "IN1BL" },
   1011	{ "IN1R Mux", "B", "IN1BR" },
   1012
   1013	{ "IN2 Mux", "A", "IN2A" },
   1014	{ "IN2 Mux", "B", "IN2B" },
   1015
   1016	{ "IN1L PGA", NULL, "IN1L Mux" },
   1017	{ "IN1R PGA", NULL, "IN1R Mux" },
   1018	{ "IN2 PGA",  NULL, "IN2 Mux" },
   1019
   1020	ARIZONA_MIXER_ROUTES("OUT1L", "HPOUTL"),
   1021	ARIZONA_MIXER_ROUTES("OUT1R", "HPOUTR"),
   1022	ARIZONA_MIXER_ROUTES("OUT2L", "LINEOUTL"),
   1023	ARIZONA_MIXER_ROUTES("OUT2R", "LINEOUTR"),
   1024	ARIZONA_MIXER_ROUTES("OUT3",  "EPOUT"),
   1025
   1026	ARIZONA_MIXER_ROUTES("OUT4L", "SPKOUTL"),
   1027	ARIZONA_MIXER_ROUTES("OUT4R", "SPKOUTR"),
   1028	ARIZONA_MIXER_ROUTES("OUT5L", "SPKDATL"),
   1029	ARIZONA_MIXER_ROUTES("OUT5R", "SPKDATR"),
   1030
   1031	ARIZONA_MIXER_ROUTES("PWM1 Driver", "PWM1"),
   1032	ARIZONA_MIXER_ROUTES("PWM2 Driver", "PWM2"),
   1033
   1034	ARIZONA_MIXER_ROUTES("AIF1TX1", "AIF1TX1"),
   1035	ARIZONA_MIXER_ROUTES("AIF1TX2", "AIF1TX2"),
   1036	ARIZONA_MIXER_ROUTES("AIF1TX3", "AIF1TX3"),
   1037	ARIZONA_MIXER_ROUTES("AIF1TX4", "AIF1TX4"),
   1038	ARIZONA_MIXER_ROUTES("AIF1TX5", "AIF1TX5"),
   1039	ARIZONA_MIXER_ROUTES("AIF1TX6", "AIF1TX6"),
   1040
   1041	ARIZONA_MIXER_ROUTES("AIF2TX1", "AIF2TX1"),
   1042	ARIZONA_MIXER_ROUTES("AIF2TX2", "AIF2TX2"),
   1043	ARIZONA_MIXER_ROUTES("AIF2TX3", "AIF2TX3"),
   1044	ARIZONA_MIXER_ROUTES("AIF2TX4", "AIF2TX4"),
   1045	ARIZONA_MIXER_ROUTES("AIF2TX5", "AIF2TX5"),
   1046	ARIZONA_MIXER_ROUTES("AIF2TX6", "AIF2TX6"),
   1047
   1048	ARIZONA_MIXER_ROUTES("AIF3TX1", "AIF3TX1"),
   1049	ARIZONA_MIXER_ROUTES("AIF3TX2", "AIF3TX2"),
   1050
   1051	ARIZONA_MUX_ROUTES("SLIMTX1", "SLIMTX1"),
   1052	ARIZONA_MUX_ROUTES("SLIMTX2", "SLIMTX2"),
   1053	ARIZONA_MUX_ROUTES("SLIMTX3", "SLIMTX3"),
   1054	ARIZONA_MUX_ROUTES("SLIMTX4", "SLIMTX4"),
   1055	ARIZONA_MUX_ROUTES("SLIMTX5", "SLIMTX5"),
   1056	ARIZONA_MUX_ROUTES("SLIMTX6", "SLIMTX6"),
   1057
   1058	ARIZONA_MUX_ROUTES("SPD1TX1", "SPDIFTX1"),
   1059	ARIZONA_MUX_ROUTES("SPD1TX2", "SPDIFTX2"),
   1060
   1061	ARIZONA_MUX_ROUTES("EQ1", "EQ1"),
   1062	ARIZONA_MUX_ROUTES("EQ2", "EQ2"),
   1063	ARIZONA_MUX_ROUTES("EQ3", "EQ3"),
   1064	ARIZONA_MUX_ROUTES("EQ4", "EQ4"),
   1065
   1066	ARIZONA_MUX_ROUTES("DRC1L", "DRC1L"),
   1067	ARIZONA_MUX_ROUTES("DRC1R", "DRC1R"),
   1068
   1069	ARIZONA_MIXER_ROUTES("LHPF1", "LHPF1"),
   1070	ARIZONA_MIXER_ROUTES("LHPF2", "LHPF2"),
   1071	ARIZONA_MIXER_ROUTES("LHPF3", "LHPF3"),
   1072	ARIZONA_MIXER_ROUTES("LHPF4", "LHPF4"),
   1073
   1074	ARIZONA_MUX_ROUTES("ASRC1L", "ASRC1L"),
   1075	ARIZONA_MUX_ROUTES("ASRC1R", "ASRC1R"),
   1076	ARIZONA_MUX_ROUTES("ASRC2L", "ASRC2L"),
   1077	ARIZONA_MUX_ROUTES("ASRC2R", "ASRC2R"),
   1078
   1079	ARIZONA_MUX_ROUTES("ISRC1INT1", "ISRC1INT1"),
   1080	ARIZONA_MUX_ROUTES("ISRC1INT2", "ISRC1INT2"),
   1081	ARIZONA_MUX_ROUTES("ISRC1INT3", "ISRC1INT3"),
   1082	ARIZONA_MUX_ROUTES("ISRC1INT4", "ISRC1INT4"),
   1083
   1084	ARIZONA_MUX_ROUTES("ISRC1DEC1", "ISRC1DEC1"),
   1085	ARIZONA_MUX_ROUTES("ISRC1DEC2", "ISRC1DEC2"),
   1086	ARIZONA_MUX_ROUTES("ISRC1DEC3", "ISRC1DEC3"),
   1087	ARIZONA_MUX_ROUTES("ISRC1DEC4", "ISRC1DEC4"),
   1088
   1089	ARIZONA_MUX_ROUTES("ISRC2INT1", "ISRC2INT1"),
   1090	ARIZONA_MUX_ROUTES("ISRC2INT2", "ISRC2INT2"),
   1091
   1092	ARIZONA_MUX_ROUTES("ISRC2DEC1", "ISRC2DEC1"),
   1093	ARIZONA_MUX_ROUTES("ISRC2DEC2", "ISRC2DEC2"),
   1094
   1095	{ "AEC1 Loopback", "HPOUTL", "OUT1L" },
   1096	{ "AEC1 Loopback", "HPOUTR", "OUT1R" },
   1097	{ "AEC2 Loopback", "HPOUTL", "OUT1L" },
   1098	{ "AEC2 Loopback", "HPOUTR", "OUT1R" },
   1099	{ "HPOUTL", NULL, "OUT1L" },
   1100	{ "HPOUTR", NULL, "OUT1R" },
   1101
   1102	{ "AEC1 Loopback", "LINEOUTL", "OUT2L" },
   1103	{ "AEC1 Loopback", "LINEOUTR", "OUT2R" },
   1104	{ "AEC2 Loopback", "LINEOUTL", "OUT2L" },
   1105	{ "AEC2 Loopback", "LINEOUTR", "OUT2R" },
   1106	{ "LINEOUTL", NULL, "OUT2L" },
   1107	{ "LINEOUTR", NULL, "OUT2R" },
   1108
   1109	{ "AEC1 Loopback", "EPOUT", "OUT3" },
   1110	{ "AEC2 Loopback", "EPOUT", "OUT3" },
   1111	{ "EPOUT", NULL, "OUT3" },
   1112
   1113	{ "AEC1 Loopback", "SPKOUTL", "OUT4L" },
   1114	{ "AEC2 Loopback", "SPKOUTL", "OUT4L" },
   1115	{ "SPKOUTLN", NULL, "OUT4L" },
   1116	{ "SPKOUTLP", NULL, "OUT4L" },
   1117
   1118	{ "AEC1 Loopback", "SPKOUTR", "OUT4R" },
   1119	{ "AEC2 Loopback", "SPKOUTR", "OUT4R" },
   1120	{ "SPKOUTRN", NULL, "OUT4R" },
   1121	{ "SPKOUTRP", NULL, "OUT4R" },
   1122
   1123	{ "SPDIF", NULL, "SPD1" },
   1124
   1125	{ "AEC1 Loopback", "SPKDATL", "OUT5L" },
   1126	{ "AEC1 Loopback", "SPKDATR", "OUT5R" },
   1127	{ "AEC2 Loopback", "SPKDATL", "OUT5L" },
   1128	{ "AEC2 Loopback", "SPKDATR", "OUT5R" },
   1129	{ "SPKDATL", NULL, "OUT5L" },
   1130	{ "SPKDATR", NULL, "OUT5R" },
   1131
   1132	{ "MICSUPP", NULL, "SYSCLK" },
   1133
   1134	{ "DRC1 Signal Activity", NULL, "SYSCLK" },
   1135	{ "DRC1 Signal Activity", NULL, "DRC1L" },
   1136	{ "DRC1 Signal Activity", NULL, "DRC1R" },
   1137};
   1138
   1139#define WM8998_RATES SNDRV_PCM_RATE_KNOT
   1140
   1141#define WM8998_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE |\
   1142			SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S32_LE)
   1143
   1144static struct snd_soc_dai_driver wm8998_dai[] = {
   1145	{
   1146		.name = "wm8998-aif1",
   1147		.id = 1,
   1148		.base = ARIZONA_AIF1_BCLK_CTRL,
   1149		.playback = {
   1150			.stream_name = "AIF1 Playback",
   1151			.channels_min = 1,
   1152			.channels_max = 6,
   1153			.rates = WM8998_RATES,
   1154			.formats = WM8998_FORMATS,
   1155		},
   1156		.capture = {
   1157			 .stream_name = "AIF1 Capture",
   1158			 .channels_min = 1,
   1159			 .channels_max = 6,
   1160			 .rates = WM8998_RATES,
   1161			 .formats = WM8998_FORMATS,
   1162		 },
   1163		.ops = &arizona_dai_ops,
   1164		.symmetric_rate = 1,
   1165		.symmetric_sample_bits = 1,
   1166	},
   1167	{
   1168		.name = "wm8998-aif2",
   1169		.id = 2,
   1170		.base = ARIZONA_AIF2_BCLK_CTRL,
   1171		.playback = {
   1172			.stream_name = "AIF2 Playback",
   1173			.channels_min = 1,
   1174			.channels_max = 6,
   1175			.rates = WM8998_RATES,
   1176			.formats = WM8998_FORMATS,
   1177		},
   1178		.capture = {
   1179			 .stream_name = "AIF2 Capture",
   1180			 .channels_min = 1,
   1181			 .channels_max = 6,
   1182			 .rates = WM8998_RATES,
   1183			 .formats = WM8998_FORMATS,
   1184		 },
   1185		.ops = &arizona_dai_ops,
   1186		.symmetric_rate = 1,
   1187		.symmetric_sample_bits = 1,
   1188	},
   1189	{
   1190		.name = "wm8998-aif3",
   1191		.id = 3,
   1192		.base = ARIZONA_AIF3_BCLK_CTRL,
   1193		.playback = {
   1194			.stream_name = "AIF3 Playback",
   1195			.channels_min = 1,
   1196			.channels_max = 2,
   1197			.rates = WM8998_RATES,
   1198			.formats = WM8998_FORMATS,
   1199		},
   1200		.capture = {
   1201			 .stream_name = "AIF3 Capture",
   1202			 .channels_min = 1,
   1203			 .channels_max = 2,
   1204			 .rates = WM8998_RATES,
   1205			 .formats = WM8998_FORMATS,
   1206		 },
   1207		.ops = &arizona_dai_ops,
   1208		.symmetric_rate = 1,
   1209		.symmetric_sample_bits = 1,
   1210	},
   1211	{
   1212		.name = "wm8998-slim1",
   1213		.id = 4,
   1214		.playback = {
   1215			.stream_name = "Slim1 Playback",
   1216			.channels_min = 1,
   1217			.channels_max = 2,
   1218			.rates = WM8998_RATES,
   1219			.formats = WM8998_FORMATS,
   1220		},
   1221		.capture = {
   1222			 .stream_name = "Slim1 Capture",
   1223			 .channels_min = 1,
   1224			 .channels_max = 4,
   1225			 .rates = WM8998_RATES,
   1226			 .formats = WM8998_FORMATS,
   1227		 },
   1228		.ops = &arizona_simple_dai_ops,
   1229	},
   1230	{
   1231		.name = "wm8998-slim2",
   1232		.id = 5,
   1233		.playback = {
   1234			.stream_name = "Slim2 Playback",
   1235			.channels_min = 1,
   1236			.channels_max = 2,
   1237			.rates = WM8998_RATES,
   1238			.formats = WM8998_FORMATS,
   1239		},
   1240		.capture = {
   1241			 .stream_name = "Slim2 Capture",
   1242			 .channels_min = 1,
   1243			 .channels_max = 2,
   1244			 .rates = WM8998_RATES,
   1245			 .formats = WM8998_FORMATS,
   1246		 },
   1247		.ops = &arizona_simple_dai_ops,
   1248	},
   1249};
   1250
   1251static int wm8998_set_fll(struct snd_soc_component *component, int fll_id,
   1252			  int source, unsigned int Fref, unsigned int Fout)
   1253{
   1254	struct wm8998_priv *wm8998 = snd_soc_component_get_drvdata(component);
   1255
   1256	switch (fll_id) {
   1257	case WM8998_FLL1:
   1258		return arizona_set_fll(&wm8998->fll[0], source, Fref, Fout);
   1259	case WM8998_FLL2:
   1260		return arizona_set_fll(&wm8998->fll[1], source, Fref, Fout);
   1261	case WM8998_FLL1_REFCLK:
   1262		return arizona_set_fll_refclk(&wm8998->fll[0], source, Fref,
   1263					      Fout);
   1264	case WM8998_FLL2_REFCLK:
   1265		return arizona_set_fll_refclk(&wm8998->fll[1], source, Fref,
   1266					      Fout);
   1267	default:
   1268		return -EINVAL;
   1269	}
   1270}
   1271
   1272static int wm8998_component_probe(struct snd_soc_component *component)
   1273{
   1274	struct wm8998_priv *priv = snd_soc_component_get_drvdata(component);
   1275	struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(component);
   1276	struct arizona *arizona = priv->core.arizona;
   1277	int ret;
   1278
   1279	arizona->dapm = dapm;
   1280	snd_soc_component_init_regmap(component, arizona->regmap);
   1281
   1282	ret = arizona_init_spk(component);
   1283	if (ret < 0)
   1284		return ret;
   1285
   1286	arizona_init_gpio(component);
   1287
   1288	snd_soc_component_disable_pin(component, "HAPTICS");
   1289
   1290	return 0;
   1291}
   1292
   1293static void wm8998_component_remove(struct snd_soc_component *component)
   1294{
   1295	struct wm8998_priv *priv = snd_soc_component_get_drvdata(component);
   1296
   1297	priv->core.arizona->dapm = NULL;
   1298}
   1299
   1300#define WM8998_DIG_VU 0x0200
   1301
   1302static unsigned int wm8998_digital_vu[] = {
   1303	ARIZONA_DAC_DIGITAL_VOLUME_1L,
   1304	ARIZONA_DAC_DIGITAL_VOLUME_1R,
   1305	ARIZONA_DAC_DIGITAL_VOLUME_2L,
   1306	ARIZONA_DAC_DIGITAL_VOLUME_2R,
   1307	ARIZONA_DAC_DIGITAL_VOLUME_3L,
   1308	ARIZONA_DAC_DIGITAL_VOLUME_4L,
   1309	ARIZONA_DAC_DIGITAL_VOLUME_4R,
   1310	ARIZONA_DAC_DIGITAL_VOLUME_5L,
   1311	ARIZONA_DAC_DIGITAL_VOLUME_5R,
   1312};
   1313
   1314static const struct snd_soc_component_driver soc_component_dev_wm8998 = {
   1315	.probe			= wm8998_component_probe,
   1316	.remove			= wm8998_component_remove,
   1317	.set_sysclk		= arizona_set_sysclk,
   1318	.set_pll		= wm8998_set_fll,
   1319	.set_jack		= arizona_jack_set_jack,
   1320	.controls		= wm8998_snd_controls,
   1321	.num_controls		= ARRAY_SIZE(wm8998_snd_controls),
   1322	.dapm_widgets		= wm8998_dapm_widgets,
   1323	.num_dapm_widgets	= ARRAY_SIZE(wm8998_dapm_widgets),
   1324	.dapm_routes		= wm8998_dapm_routes,
   1325	.num_dapm_routes	= ARRAY_SIZE(wm8998_dapm_routes),
   1326	.use_pmdown_time	= 1,
   1327	.endianness		= 1,
   1328	.non_legacy_dai_naming	= 1,
   1329};
   1330
   1331static int wm8998_probe(struct platform_device *pdev)
   1332{
   1333	struct arizona *arizona = dev_get_drvdata(pdev->dev.parent);
   1334	struct wm8998_priv *wm8998;
   1335	int i, ret;
   1336
   1337	wm8998 = devm_kzalloc(&pdev->dev, sizeof(struct wm8998_priv),
   1338			      GFP_KERNEL);
   1339	if (!wm8998)
   1340		return -ENOMEM;
   1341	platform_set_drvdata(pdev, wm8998);
   1342
   1343	if (IS_ENABLED(CONFIG_OF)) {
   1344		if (!dev_get_platdata(arizona->dev)) {
   1345			ret = arizona_of_get_audio_pdata(arizona);
   1346			if (ret < 0)
   1347				return ret;
   1348		}
   1349	}
   1350
   1351	wm8998->core.arizona = arizona;
   1352	wm8998->core.num_inputs = 3;	/* IN1L, IN1R, IN2 */
   1353
   1354	/* This may return -EPROBE_DEFER, so do this early on */
   1355	ret = arizona_jack_codec_dev_probe(&wm8998->core, &pdev->dev);
   1356	if (ret)
   1357		return ret;
   1358
   1359	for (i = 0; i < ARRAY_SIZE(wm8998->fll); i++)
   1360		wm8998->fll[i].vco_mult = 1;
   1361
   1362	arizona_init_fll(arizona, 1, ARIZONA_FLL1_CONTROL_1 - 1,
   1363			 ARIZONA_IRQ_FLL1_LOCK, ARIZONA_IRQ_FLL1_CLOCK_OK,
   1364			 &wm8998->fll[0]);
   1365	arizona_init_fll(arizona, 2, ARIZONA_FLL2_CONTROL_1 - 1,
   1366			 ARIZONA_IRQ_FLL2_LOCK, ARIZONA_IRQ_FLL2_CLOCK_OK,
   1367			 &wm8998->fll[1]);
   1368
   1369	for (i = 0; i < ARRAY_SIZE(wm8998_dai); i++)
   1370		arizona_init_dai(&wm8998->core, i);
   1371
   1372	/* Latch volume update bits */
   1373	for (i = 0; i < ARRAY_SIZE(wm8998_digital_vu); i++)
   1374		regmap_update_bits(arizona->regmap, wm8998_digital_vu[i],
   1375				   WM8998_DIG_VU, WM8998_DIG_VU);
   1376
   1377	pm_runtime_enable(&pdev->dev);
   1378	pm_runtime_idle(&pdev->dev);
   1379
   1380	arizona_init_common(arizona);
   1381
   1382	ret = arizona_init_spk_irqs(arizona);
   1383	if (ret < 0)
   1384		goto err_pm_disable;
   1385
   1386	ret = devm_snd_soc_register_component(&pdev->dev,
   1387					      &soc_component_dev_wm8998,
   1388					      wm8998_dai,
   1389					      ARRAY_SIZE(wm8998_dai));
   1390	if (ret < 0) {
   1391		dev_err(&pdev->dev, "Failed to register component: %d\n", ret);
   1392		goto err_spk_irqs;
   1393	}
   1394
   1395	return ret;
   1396
   1397err_spk_irqs:
   1398	arizona_free_spk_irqs(arizona);
   1399err_pm_disable:
   1400	pm_runtime_disable(&pdev->dev);
   1401	arizona_jack_codec_dev_remove(&wm8998->core);
   1402
   1403	return ret;
   1404}
   1405
   1406static int wm8998_remove(struct platform_device *pdev)
   1407{
   1408	struct wm8998_priv *wm8998 = platform_get_drvdata(pdev);
   1409	struct arizona *arizona = wm8998->core.arizona;
   1410
   1411	pm_runtime_disable(&pdev->dev);
   1412
   1413	arizona_free_spk_irqs(arizona);
   1414
   1415	arizona_jack_codec_dev_remove(&wm8998->core);
   1416
   1417	return 0;
   1418}
   1419
   1420static struct platform_driver wm8998_codec_driver = {
   1421	.driver = {
   1422		.name = "wm8998-codec",
   1423	},
   1424	.probe = wm8998_probe,
   1425	.remove = wm8998_remove,
   1426};
   1427
   1428module_platform_driver(wm8998_codec_driver);
   1429
   1430MODULE_DESCRIPTION("ASoC WM8998 driver");
   1431MODULE_AUTHOR("Richard Fitzgerald <rf@opensource.wolfsonmicro.com>");
   1432MODULE_LICENSE("GPL v2");
   1433MODULE_ALIAS("platform:wm8998-codec");