d81221ff94
The Arizona CODECs support several rates that do not have simple defines in ALSA. This patch adds support for SNDRV_PCM_RATE_KNOT so that users can open stream at these rates. As part of this we should always set constraints in arizona_startup, currently we only set the constraints if we already have a clock to limit rates to that family of sample rates. This patch updates this to set a constraint of all rates supported by the chip if we do not already know which family of rates to limit to. Finally we also reduce the list of rates supported in the constraints to only include those that are supported on current parts. Signed-off-by: Charles Keepax <ckeepax@opensource.wolfsonmicro.com> Signed-off-by: Mark Brown <broonie@kernel.org>
1262 lines
43 KiB
C
1262 lines
43 KiB
C
/*
|
|
* cs47l24.h -- ALSA SoC Audio driver for Cirrus Logic CS47L24
|
|
*
|
|
* Copyright 2015 Cirrus Logic Inc.
|
|
*
|
|
* Author: Richard Fitzgerald <rf@opensource.wolfsonmicro.com>
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License version 2 as
|
|
* published by the Free Software Foundation.
|
|
*/
|
|
|
|
#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 "wm_adsp.h"
|
|
#include "cs47l24.h"
|
|
|
|
struct cs47l24_priv {
|
|
struct arizona_priv core;
|
|
struct arizona_fll fll[2];
|
|
};
|
|
|
|
static const struct wm_adsp_region cs47l24_dsp2_regions[] = {
|
|
{ .type = WMFW_ADSP2_PM, .base = 0x200000 },
|
|
{ .type = WMFW_ADSP2_ZM, .base = 0x280000 },
|
|
{ .type = WMFW_ADSP2_XM, .base = 0x290000 },
|
|
{ .type = WMFW_ADSP2_YM, .base = 0x2a8000 },
|
|
};
|
|
|
|
static const struct wm_adsp_region cs47l24_dsp3_regions[] = {
|
|
{ .type = WMFW_ADSP2_PM, .base = 0x300000 },
|
|
{ .type = WMFW_ADSP2_ZM, .base = 0x380000 },
|
|
{ .type = WMFW_ADSP2_XM, .base = 0x390000 },
|
|
{ .type = WMFW_ADSP2_YM, .base = 0x3a8000 },
|
|
};
|
|
|
|
static const struct wm_adsp_region *cs47l24_dsp_regions[] = {
|
|
cs47l24_dsp2_regions,
|
|
cs47l24_dsp3_regions,
|
|
};
|
|
|
|
static int cs47l24_adsp_power_ev(struct snd_soc_dapm_widget *w,
|
|
struct snd_kcontrol *kcontrol, int event)
|
|
{
|
|
struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
|
|
struct arizona *arizona = dev_get_drvdata(codec->dev->parent);
|
|
unsigned int v;
|
|
int ret;
|
|
|
|
ret = regmap_read(arizona->regmap, ARIZONA_SYSTEM_CLOCK_1, &v);
|
|
if (ret != 0) {
|
|
dev_err(codec->dev, "Failed to read SYSCLK state: %d\n", ret);
|
|
return ret;
|
|
}
|
|
|
|
v = (v & ARIZONA_SYSCLK_FREQ_MASK) >> ARIZONA_SYSCLK_FREQ_SHIFT;
|
|
|
|
return wm_adsp2_early_event(w, kcontrol, event, v);
|
|
}
|
|
|
|
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(noise_tlv, -13200, 600, 0);
|
|
static DECLARE_TLV_DB_SCALE(ng_tlv, -10200, 600, 0);
|
|
|
|
#define CS47L24_NG_SRC(name, base) \
|
|
SOC_SINGLE(name " NG HPOUT1L Switch", base, 0, 1, 0), \
|
|
SOC_SINGLE(name " NG HPOUT1R Switch", base, 1, 1, 0), \
|
|
SOC_SINGLE(name " NG SPKOUT Switch", base, 6, 1, 0)
|
|
|
|
static const struct snd_kcontrol_new cs47l24_snd_controls[] = {
|
|
SOC_ENUM("IN1 OSR", arizona_in_dmic_osr[0]),
|
|
SOC_ENUM("IN2 OSR", arizona_in_dmic_osr[1]),
|
|
|
|
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("IN2L HPF Switch", ARIZONA_IN2L_CONTROL,
|
|
ARIZONA_IN2L_HPF_SHIFT, 1, 0),
|
|
SOC_SINGLE("IN2R HPF Switch", ARIZONA_IN2R_CONTROL,
|
|
ARIZONA_IN2R_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("IN2L Digital Volume", ARIZONA_ADC_DIGITAL_VOLUME_2L,
|
|
ARIZONA_IN2L_DIG_VOL_SHIFT, 0xbf, 0, digital_tlv),
|
|
SOC_SINGLE_TLV("IN2R Digital Volume", ARIZONA_ADC_DIGITAL_VOLUME_2R,
|
|
ARIZONA_IN2R_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_MIXER_CONTROLS("EQ1", ARIZONA_EQ1MIX_INPUT_1_SOURCE),
|
|
ARIZONA_MIXER_CONTROLS("EQ2", ARIZONA_EQ2MIX_INPUT_1_SOURCE),
|
|
|
|
ARIZONA_EQ_CONTROL("EQ1 Coefficients", ARIZONA_EQ1_2),
|
|
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),
|
|
|
|
ARIZONA_EQ_CONTROL("EQ2 Coefficients", ARIZONA_EQ2_2),
|
|
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),
|
|
|
|
ARIZONA_MIXER_CONTROLS("DRC1L", ARIZONA_DRC1LMIX_INPUT_1_SOURCE),
|
|
ARIZONA_MIXER_CONTROLS("DRC1R", ARIZONA_DRC1RMIX_INPUT_1_SOURCE),
|
|
ARIZONA_MIXER_CONTROLS("DRC2L", ARIZONA_DRC2LMIX_INPUT_1_SOURCE),
|
|
ARIZONA_MIXER_CONTROLS("DRC2R", ARIZONA_DRC2RMIX_INPUT_1_SOURCE),
|
|
|
|
SND_SOC_BYTES_MASK("DRC1", ARIZONA_DRC1_CTRL1, 5,
|
|
ARIZONA_DRC1R_ENA | ARIZONA_DRC1L_ENA),
|
|
SND_SOC_BYTES_MASK("DRC2", ARIZONA_DRC2_CTRL1, 5,
|
|
ARIZONA_DRC2R_ENA | ARIZONA_DRC2L_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),
|
|
|
|
ARIZONA_LHPF_CONTROL("LHPF1 Coefficients", ARIZONA_HPLPF1_2),
|
|
ARIZONA_LHPF_CONTROL("LHPF2 Coefficients", ARIZONA_HPLPF2_2),
|
|
ARIZONA_LHPF_CONTROL("LHPF3 Coefficients", ARIZONA_HPLPF3_2),
|
|
ARIZONA_LHPF_CONTROL("LHPF4 Coefficients", ARIZONA_HPLPF4_2),
|
|
|
|
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("ISRC3 FSL", arizona_isrc_fsl[2]),
|
|
SOC_ENUM("ISRC1 FSH", arizona_isrc_fsh[0]),
|
|
SOC_ENUM("ISRC2 FSH", arizona_isrc_fsh[1]),
|
|
SOC_ENUM("ISRC3 FSH", arizona_isrc_fsh[2]),
|
|
SOC_ENUM("ASRC RATE 1", arizona_asrc_rate1),
|
|
|
|
ARIZONA_MIXER_CONTROLS("DSP2L", ARIZONA_DSP2LMIX_INPUT_1_SOURCE),
|
|
ARIZONA_MIXER_CONTROLS("DSP2R", ARIZONA_DSP2RMIX_INPUT_1_SOURCE),
|
|
ARIZONA_MIXER_CONTROLS("DSP3L", ARIZONA_DSP3LMIX_INPUT_1_SOURCE),
|
|
ARIZONA_MIXER_CONTROLS("DSP3R", ARIZONA_DSP3RMIX_INPUT_1_SOURCE),
|
|
|
|
SOC_SINGLE_TLV("Noise Generator Volume", ARIZONA_COMFORT_NOISE_GENERATOR,
|
|
ARIZONA_NOISE_GEN_GAIN_SHIFT, 0x16, 0, noise_tlv),
|
|
|
|
ARIZONA_MIXER_CONTROLS("HPOUT1L", ARIZONA_OUT1LMIX_INPUT_1_SOURCE),
|
|
ARIZONA_MIXER_CONTROLS("HPOUT1R", ARIZONA_OUT1RMIX_INPUT_1_SOURCE),
|
|
ARIZONA_MIXER_CONTROLS("SPKOUT", ARIZONA_OUT4LMIX_INPUT_1_SOURCE),
|
|
|
|
SOC_SINGLE("HPOUT1 SC Protect Switch", ARIZONA_HP1_SHORT_CIRCUIT_CTRL,
|
|
ARIZONA_HP1_SC_ENA_SHIFT, 1, 0),
|
|
|
|
SOC_DOUBLE_R("HPOUT1 Digital Switch", ARIZONA_DAC_DIGITAL_VOLUME_1L,
|
|
ARIZONA_DAC_DIGITAL_VOLUME_1R, ARIZONA_OUT1L_MUTE_SHIFT, 1, 1),
|
|
SOC_SINGLE("Speaker Digital Switch", ARIZONA_DAC_DIGITAL_VOLUME_4L,
|
|
ARIZONA_OUT4L_MUTE_SHIFT, 1, 1),
|
|
|
|
SOC_DOUBLE_R_TLV("HPOUT1 Digital Volume", ARIZONA_DAC_DIGITAL_VOLUME_1L,
|
|
ARIZONA_DAC_DIGITAL_VOLUME_1R, ARIZONA_OUT1L_VOL_SHIFT,
|
|
0xbf, 0, digital_tlv),
|
|
SOC_SINGLE_TLV("Speaker Digital Volume", ARIZONA_DAC_DIGITAL_VOLUME_4L,
|
|
ARIZONA_OUT4L_VOL_SHIFT,
|
|
0xbf, 0, digital_tlv),
|
|
|
|
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),
|
|
|
|
CS47L24_NG_SRC("HPOUT1L", ARIZONA_NOISE_GATE_SELECT_1L),
|
|
CS47L24_NG_SRC("HPOUT1R", ARIZONA_NOISE_GATE_SELECT_1R),
|
|
CS47L24_NG_SRC("SPKOUT", ARIZONA_NOISE_GATE_SELECT_4L),
|
|
|
|
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("AIF1TX7", ARIZONA_AIF1TX7MIX_INPUT_1_SOURCE),
|
|
ARIZONA_MIXER_CONTROLS("AIF1TX8", ARIZONA_AIF1TX8MIX_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_MIXER_ENUMS(EQ1, ARIZONA_EQ1MIX_INPUT_1_SOURCE);
|
|
ARIZONA_MIXER_ENUMS(EQ2, ARIZONA_EQ2MIX_INPUT_1_SOURCE);
|
|
|
|
ARIZONA_MIXER_ENUMS(DRC1L, ARIZONA_DRC1LMIX_INPUT_1_SOURCE);
|
|
ARIZONA_MIXER_ENUMS(DRC1R, ARIZONA_DRC1RMIX_INPUT_1_SOURCE);
|
|
ARIZONA_MIXER_ENUMS(DRC2L, ARIZONA_DRC2LMIX_INPUT_1_SOURCE);
|
|
ARIZONA_MIXER_ENUMS(DRC2R, ARIZONA_DRC2RMIX_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(DSP2L, ARIZONA_DSP2LMIX_INPUT_1_SOURCE);
|
|
ARIZONA_MIXER_ENUMS(DSP2R, ARIZONA_DSP2RMIX_INPUT_1_SOURCE);
|
|
ARIZONA_DSP_AUX_ENUMS(DSP2, ARIZONA_DSP2AUX1MIX_INPUT_1_SOURCE);
|
|
|
|
ARIZONA_MIXER_ENUMS(DSP3L, ARIZONA_DSP3LMIX_INPUT_1_SOURCE);
|
|
ARIZONA_MIXER_ENUMS(DSP3R, ARIZONA_DSP3RMIX_INPUT_1_SOURCE);
|
|
ARIZONA_DSP_AUX_ENUMS(DSP3, ARIZONA_DSP3AUX1MIX_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(SPKOUT, ARIZONA_OUT4LMIX_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(AIF1TX7, ARIZONA_AIF1TX7MIX_INPUT_1_SOURCE);
|
|
ARIZONA_MIXER_ENUMS(AIF1TX8, ARIZONA_AIF1TX8MIX_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(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(ISRC2INT3, ARIZONA_ISRC2INT3MIX_INPUT_1_SOURCE);
|
|
ARIZONA_MUX_ENUMS(ISRC2INT4, ARIZONA_ISRC2INT4MIX_INPUT_1_SOURCE);
|
|
|
|
ARIZONA_MUX_ENUMS(ISRC2DEC1, ARIZONA_ISRC2DEC1MIX_INPUT_1_SOURCE);
|
|
ARIZONA_MUX_ENUMS(ISRC2DEC2, ARIZONA_ISRC2DEC2MIX_INPUT_1_SOURCE);
|
|
ARIZONA_MUX_ENUMS(ISRC2DEC3, ARIZONA_ISRC2DEC3MIX_INPUT_1_SOURCE);
|
|
ARIZONA_MUX_ENUMS(ISRC2DEC4, ARIZONA_ISRC2DEC4MIX_INPUT_1_SOURCE);
|
|
|
|
ARIZONA_MUX_ENUMS(ISRC3INT1, ARIZONA_ISRC3INT1MIX_INPUT_1_SOURCE);
|
|
ARIZONA_MUX_ENUMS(ISRC3INT2, ARIZONA_ISRC3INT2MIX_INPUT_1_SOURCE);
|
|
ARIZONA_MUX_ENUMS(ISRC3INT3, ARIZONA_ISRC3INT3MIX_INPUT_1_SOURCE);
|
|
ARIZONA_MUX_ENUMS(ISRC3INT4, ARIZONA_ISRC3INT4MIX_INPUT_1_SOURCE);
|
|
|
|
ARIZONA_MUX_ENUMS(ISRC3DEC1, ARIZONA_ISRC3DEC1MIX_INPUT_1_SOURCE);
|
|
ARIZONA_MUX_ENUMS(ISRC3DEC2, ARIZONA_ISRC3DEC2MIX_INPUT_1_SOURCE);
|
|
ARIZONA_MUX_ENUMS(ISRC3DEC3, ARIZONA_ISRC3DEC3MIX_INPUT_1_SOURCE);
|
|
ARIZONA_MUX_ENUMS(ISRC3DEC4, ARIZONA_ISRC3DEC4MIX_INPUT_1_SOURCE);
|
|
|
|
static const char * const cs47l24_aec_loopback_texts[] = {
|
|
"HPOUT1L", "HPOUT1R", "SPKOUT",
|
|
};
|
|
|
|
static const unsigned int cs47l24_aec_loopback_values[] = {
|
|
0, 1, 6,
|
|
};
|
|
|
|
static const struct soc_enum cs47l24_aec_loopback =
|
|
SOC_VALUE_ENUM_SINGLE(ARIZONA_DAC_AEC_CONTROL_1,
|
|
ARIZONA_AEC_LOOPBACK_SRC_SHIFT, 0xf,
|
|
ARRAY_SIZE(cs47l24_aec_loopback_texts),
|
|
cs47l24_aec_loopback_texts,
|
|
cs47l24_aec_loopback_values);
|
|
|
|
static const struct snd_kcontrol_new cs47l24_aec_loopback_mux =
|
|
SOC_DAPM_ENUM("AEC Loopback", cs47l24_aec_loopback);
|
|
|
|
static const struct snd_soc_dapm_widget cs47l24_dapm_widgets[] = {
|
|
SND_SOC_DAPM_SUPPLY("SYSCLK", ARIZONA_SYSTEM_CLOCK_1,
|
|
ARIZONA_SYSCLK_ENA_SHIFT, 0, NULL, 0),
|
|
SND_SOC_DAPM_SUPPLY("ASYNCCLK", ARIZONA_ASYNC_CLOCK_1,
|
|
ARIZONA_ASYNC_CLK_ENA_SHIFT, 0, NULL, 0),
|
|
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("CPVDD", 20, 0),
|
|
SND_SOC_DAPM_REGULATOR_SUPPLY("MICVDD", 0, SND_SOC_DAPM_REGULATOR_BYPASS),
|
|
SND_SOC_DAPM_REGULATOR_SUPPLY("SPKVDD", 0, 0),
|
|
|
|
SND_SOC_DAPM_SIGGEN("TONE"),
|
|
SND_SOC_DAPM_SIGGEN("NOISE"),
|
|
SND_SOC_DAPM_SIGGEN("HAPTICS"),
|
|
|
|
SND_SOC_DAPM_INPUT("IN1L"),
|
|
SND_SOC_DAPM_INPUT("IN1R"),
|
|
SND_SOC_DAPM_INPUT("IN2L"),
|
|
SND_SOC_DAPM_INPUT("IN2R"),
|
|
|
|
SND_SOC_DAPM_OUTPUT("DRC1 Signal Activity"),
|
|
SND_SOC_DAPM_OUTPUT("DRC2 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("IN2L 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_PGA_E("IN2R PGA", ARIZONA_INPUT_ENABLES, ARIZONA_IN2R_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_PGA("Noise Generator", ARIZONA_COMFORT_NOISE_GENERATOR,
|
|
ARIZONA_NOISE_GEN_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("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("DRC2L", ARIZONA_DRC2_CTRL1, ARIZONA_DRC2L_ENA_SHIFT, 0,
|
|
NULL, 0),
|
|
SND_SOC_DAPM_PGA("DRC2R", ARIZONA_DRC2_CTRL1, ARIZONA_DRC2R_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("ASRC1L", ARIZONA_ASRC_ENABLE, ARIZONA_ASRC1L_ENA_SHIFT, 0,
|
|
NULL, 0),
|
|
SND_SOC_DAPM_PGA("ASRC1R", ARIZONA_ASRC_ENABLE, ARIZONA_ASRC1R_ENA_SHIFT, 0,
|
|
NULL, 0),
|
|
SND_SOC_DAPM_PGA("ASRC2L", ARIZONA_ASRC_ENABLE, ARIZONA_ASRC2L_ENA_SHIFT, 0,
|
|
NULL, 0),
|
|
SND_SOC_DAPM_PGA("ASRC2R", ARIZONA_ASRC_ENABLE, ARIZONA_ASRC2R_ENA_SHIFT, 0,
|
|
NULL, 0),
|
|
|
|
WM_ADSP2("DSP2", 1, cs47l24_adsp_power_ev),
|
|
WM_ADSP2("DSP3", 2, cs47l24_adsp_power_ev),
|
|
|
|
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("ISRC2INT3", ARIZONA_ISRC_2_CTRL_3,
|
|
ARIZONA_ISRC2_INT2_ENA_SHIFT, 0, NULL, 0),
|
|
SND_SOC_DAPM_PGA("ISRC2INT4", ARIZONA_ISRC_2_CTRL_3,
|
|
ARIZONA_ISRC2_INT3_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_PGA("ISRC2DEC3", ARIZONA_ISRC_2_CTRL_3,
|
|
ARIZONA_ISRC2_DEC2_ENA_SHIFT, 0, NULL, 0),
|
|
SND_SOC_DAPM_PGA("ISRC2DEC4", ARIZONA_ISRC_2_CTRL_3,
|
|
ARIZONA_ISRC2_DEC3_ENA_SHIFT, 0, NULL, 0),
|
|
|
|
SND_SOC_DAPM_PGA("ISRC3INT1", ARIZONA_ISRC_3_CTRL_3,
|
|
ARIZONA_ISRC3_INT0_ENA_SHIFT, 0, NULL, 0),
|
|
SND_SOC_DAPM_PGA("ISRC3INT2", ARIZONA_ISRC_3_CTRL_3,
|
|
ARIZONA_ISRC3_INT1_ENA_SHIFT, 0, NULL, 0),
|
|
SND_SOC_DAPM_PGA("ISRC3INT3", ARIZONA_ISRC_3_CTRL_3,
|
|
ARIZONA_ISRC3_INT2_ENA_SHIFT, 0, NULL, 0),
|
|
SND_SOC_DAPM_PGA("ISRC3INT4", ARIZONA_ISRC_3_CTRL_3,
|
|
ARIZONA_ISRC3_INT3_ENA_SHIFT, 0, NULL, 0),
|
|
|
|
SND_SOC_DAPM_PGA("ISRC3DEC1", ARIZONA_ISRC_3_CTRL_3,
|
|
ARIZONA_ISRC3_DEC0_ENA_SHIFT, 0, NULL, 0),
|
|
SND_SOC_DAPM_PGA("ISRC3DEC2", ARIZONA_ISRC_3_CTRL_3,
|
|
ARIZONA_ISRC3_DEC1_ENA_SHIFT, 0, NULL, 0),
|
|
SND_SOC_DAPM_PGA("ISRC3DEC3", ARIZONA_ISRC_3_CTRL_3,
|
|
ARIZONA_ISRC3_DEC2_ENA_SHIFT, 0, NULL, 0),
|
|
SND_SOC_DAPM_PGA("ISRC3DEC4", ARIZONA_ISRC_3_CTRL_3,
|
|
ARIZONA_ISRC3_DEC3_ENA_SHIFT, 0, NULL, 0),
|
|
|
|
SND_SOC_DAPM_MUX("AEC Loopback", ARIZONA_DAC_AEC_CONTROL_1,
|
|
ARIZONA_AEC_LOOPBACK_ENA_SHIFT, 0,
|
|
&cs47l24_aec_loopback_mux),
|
|
|
|
SND_SOC_DAPM_AIF_OUT("AIF1TX1", NULL, 0,
|
|
ARIZONA_AIF1_TX_ENABLES, ARIZONA_AIF1TX1_ENA_SHIFT, 0),
|
|
SND_SOC_DAPM_AIF_OUT("AIF1TX2", NULL, 0,
|
|
ARIZONA_AIF1_TX_ENABLES, ARIZONA_AIF1TX2_ENA_SHIFT, 0),
|
|
SND_SOC_DAPM_AIF_OUT("AIF1TX3", NULL, 0,
|
|
ARIZONA_AIF1_TX_ENABLES, ARIZONA_AIF1TX3_ENA_SHIFT, 0),
|
|
SND_SOC_DAPM_AIF_OUT("AIF1TX4", NULL, 0,
|
|
ARIZONA_AIF1_TX_ENABLES, ARIZONA_AIF1TX4_ENA_SHIFT, 0),
|
|
SND_SOC_DAPM_AIF_OUT("AIF1TX5", NULL, 0,
|
|
ARIZONA_AIF1_TX_ENABLES, ARIZONA_AIF1TX5_ENA_SHIFT, 0),
|
|
SND_SOC_DAPM_AIF_OUT("AIF1TX6", NULL, 0,
|
|
ARIZONA_AIF1_TX_ENABLES, ARIZONA_AIF1TX6_ENA_SHIFT, 0),
|
|
SND_SOC_DAPM_AIF_OUT("AIF1TX7", NULL, 0,
|
|
ARIZONA_AIF1_TX_ENABLES, ARIZONA_AIF1TX7_ENA_SHIFT, 0),
|
|
SND_SOC_DAPM_AIF_OUT("AIF1TX8", NULL, 0,
|
|
ARIZONA_AIF1_TX_ENABLES, ARIZONA_AIF1TX8_ENA_SHIFT, 0),
|
|
|
|
SND_SOC_DAPM_AIF_IN("AIF1RX1", NULL, 0,
|
|
ARIZONA_AIF1_RX_ENABLES, ARIZONA_AIF1RX1_ENA_SHIFT, 0),
|
|
SND_SOC_DAPM_AIF_IN("AIF1RX2", NULL, 0,
|
|
ARIZONA_AIF1_RX_ENABLES, ARIZONA_AIF1RX2_ENA_SHIFT, 0),
|
|
SND_SOC_DAPM_AIF_IN("AIF1RX3", NULL, 0,
|
|
ARIZONA_AIF1_RX_ENABLES, ARIZONA_AIF1RX3_ENA_SHIFT, 0),
|
|
SND_SOC_DAPM_AIF_IN("AIF1RX4", NULL, 0,
|
|
ARIZONA_AIF1_RX_ENABLES, ARIZONA_AIF1RX4_ENA_SHIFT, 0),
|
|
SND_SOC_DAPM_AIF_IN("AIF1RX5", NULL, 0,
|
|
ARIZONA_AIF1_RX_ENABLES, ARIZONA_AIF1RX5_ENA_SHIFT, 0),
|
|
SND_SOC_DAPM_AIF_IN("AIF1RX6", NULL, 0,
|
|
ARIZONA_AIF1_RX_ENABLES, ARIZONA_AIF1RX6_ENA_SHIFT, 0),
|
|
SND_SOC_DAPM_AIF_IN("AIF1RX7", NULL, 0,
|
|
ARIZONA_AIF1_RX_ENABLES, ARIZONA_AIF1RX7_ENA_SHIFT, 0),
|
|
SND_SOC_DAPM_AIF_IN("AIF1RX8", NULL, 0,
|
|
ARIZONA_AIF1_RX_ENABLES, ARIZONA_AIF1RX8_ENA_SHIFT, 0),
|
|
|
|
SND_SOC_DAPM_AIF_OUT("AIF2TX1", NULL, 0,
|
|
ARIZONA_AIF2_TX_ENABLES, ARIZONA_AIF2TX1_ENA_SHIFT, 0),
|
|
SND_SOC_DAPM_AIF_OUT("AIF2TX2", NULL, 0,
|
|
ARIZONA_AIF2_TX_ENABLES, ARIZONA_AIF2TX2_ENA_SHIFT, 0),
|
|
SND_SOC_DAPM_AIF_OUT("AIF2TX3", NULL, 0,
|
|
ARIZONA_AIF2_TX_ENABLES, ARIZONA_AIF2TX3_ENA_SHIFT, 0),
|
|
SND_SOC_DAPM_AIF_OUT("AIF2TX4", NULL, 0,
|
|
ARIZONA_AIF2_TX_ENABLES, ARIZONA_AIF2TX4_ENA_SHIFT, 0),
|
|
SND_SOC_DAPM_AIF_OUT("AIF2TX5", NULL, 0,
|
|
ARIZONA_AIF2_TX_ENABLES, ARIZONA_AIF2TX5_ENA_SHIFT, 0),
|
|
SND_SOC_DAPM_AIF_OUT("AIF2TX6", NULL, 0,
|
|
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),
|
|
SND_SOC_DAPM_AIF_IN("AIF2RX2", NULL, 0,
|
|
ARIZONA_AIF2_RX_ENABLES, ARIZONA_AIF2RX2_ENA_SHIFT, 0),
|
|
SND_SOC_DAPM_AIF_IN("AIF2RX3", NULL, 0,
|
|
ARIZONA_AIF2_RX_ENABLES, ARIZONA_AIF2RX3_ENA_SHIFT, 0),
|
|
SND_SOC_DAPM_AIF_IN("AIF2RX4", NULL, 0,
|
|
ARIZONA_AIF2_RX_ENABLES, ARIZONA_AIF2RX4_ENA_SHIFT, 0),
|
|
SND_SOC_DAPM_AIF_IN("AIF2RX5", NULL, 0,
|
|
ARIZONA_AIF2_RX_ENABLES, ARIZONA_AIF2RX5_ENA_SHIFT, 0),
|
|
SND_SOC_DAPM_AIF_IN("AIF2RX6", NULL, 0,
|
|
ARIZONA_AIF2_RX_ENABLES, ARIZONA_AIF2RX6_ENA_SHIFT, 0),
|
|
|
|
SND_SOC_DAPM_AIF_OUT("AIF3TX1", NULL, 0,
|
|
ARIZONA_AIF3_TX_ENABLES, ARIZONA_AIF3TX1_ENA_SHIFT, 0),
|
|
SND_SOC_DAPM_AIF_OUT("AIF3TX2", NULL, 0,
|
|
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),
|
|
SND_SOC_DAPM_AIF_IN("AIF3RX2", NULL, 0,
|
|
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_PMD |
|
|
SND_SOC_DAPM_PRE_PMU | 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_PMD |
|
|
SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU),
|
|
|
|
ARIZONA_MIXER_WIDGETS(EQ1, "EQ1"),
|
|
ARIZONA_MIXER_WIDGETS(EQ2, "EQ2"),
|
|
|
|
ARIZONA_MIXER_WIDGETS(DRC1L, "DRC1L"),
|
|
ARIZONA_MIXER_WIDGETS(DRC1R, "DRC1R"),
|
|
ARIZONA_MIXER_WIDGETS(DRC2L, "DRC2L"),
|
|
ARIZONA_MIXER_WIDGETS(DRC2R, "DRC2R"),
|
|
|
|
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, "HPOUT1L"),
|
|
ARIZONA_MIXER_WIDGETS(OUT1R, "HPOUT1R"),
|
|
ARIZONA_MIXER_WIDGETS(SPKOUT, "SPKOUT"),
|
|
|
|
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(AIF1TX7, "AIF1TX7"),
|
|
ARIZONA_MIXER_WIDGETS(AIF1TX8, "AIF1TX8"),
|
|
|
|
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(ASRC1L, "ASRC1L"),
|
|
ARIZONA_MUX_WIDGETS(ASRC1R, "ASRC1R"),
|
|
ARIZONA_MUX_WIDGETS(ASRC2L, "ASRC2L"),
|
|
ARIZONA_MUX_WIDGETS(ASRC2R, "ASRC2R"),
|
|
|
|
ARIZONA_DSP_WIDGETS(DSP2, "DSP2"),
|
|
ARIZONA_DSP_WIDGETS(DSP3, "DSP3"),
|
|
|
|
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(ISRC2DEC3, "ISRC2DEC3"),
|
|
ARIZONA_MUX_WIDGETS(ISRC2DEC4, "ISRC2DEC4"),
|
|
|
|
ARIZONA_MUX_WIDGETS(ISRC2INT1, "ISRC2INT1"),
|
|
ARIZONA_MUX_WIDGETS(ISRC2INT2, "ISRC2INT2"),
|
|
ARIZONA_MUX_WIDGETS(ISRC2INT3, "ISRC2INT3"),
|
|
ARIZONA_MUX_WIDGETS(ISRC2INT4, "ISRC2INT4"),
|
|
|
|
ARIZONA_MUX_WIDGETS(ISRC3DEC1, "ISRC3DEC1"),
|
|
ARIZONA_MUX_WIDGETS(ISRC3DEC2, "ISRC3DEC2"),
|
|
ARIZONA_MUX_WIDGETS(ISRC3DEC3, "ISRC3DEC3"),
|
|
ARIZONA_MUX_WIDGETS(ISRC3DEC4, "ISRC3DEC4"),
|
|
|
|
ARIZONA_MUX_WIDGETS(ISRC3INT1, "ISRC3INT1"),
|
|
ARIZONA_MUX_WIDGETS(ISRC3INT2, "ISRC3INT2"),
|
|
ARIZONA_MUX_WIDGETS(ISRC3INT3, "ISRC3INT3"),
|
|
ARIZONA_MUX_WIDGETS(ISRC3INT4, "ISRC3INT4"),
|
|
|
|
SND_SOC_DAPM_OUTPUT("HPOUT1L"),
|
|
SND_SOC_DAPM_OUTPUT("HPOUT1R"),
|
|
SND_SOC_DAPM_OUTPUT("SPKOUTN"),
|
|
SND_SOC_DAPM_OUTPUT("SPKOUTP"),
|
|
|
|
SND_SOC_DAPM_OUTPUT("MICSUPP"),
|
|
};
|
|
|
|
#define ARIZONA_MIXER_INPUT_ROUTES(name) \
|
|
{ name, "Noise Generator", "Noise Generator" }, \
|
|
{ name, "Tone Generator 1", "Tone Generator 1" }, \
|
|
{ name, "Tone Generator 2", "Tone Generator 2" }, \
|
|
{ name, "Haptics", "HAPTICS" }, \
|
|
{ name, "AEC", "AEC Loopback" }, \
|
|
{ name, "IN1L", "IN1L PGA" }, \
|
|
{ name, "IN1R", "IN1R PGA" }, \
|
|
{ name, "IN2L", "IN2L PGA" }, \
|
|
{ name, "IN2R", "IN2R PGA" }, \
|
|
{ name, "AIF1RX1", "AIF1RX1" }, \
|
|
{ name, "AIF1RX2", "AIF1RX2" }, \
|
|
{ name, "AIF1RX3", "AIF1RX3" }, \
|
|
{ name, "AIF1RX4", "AIF1RX4" }, \
|
|
{ name, "AIF1RX5", "AIF1RX5" }, \
|
|
{ name, "AIF1RX6", "AIF1RX6" }, \
|
|
{ name, "AIF1RX7", "AIF1RX7" }, \
|
|
{ name, "AIF1RX8", "AIF1RX8" }, \
|
|
{ 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, "EQ1", "EQ1" }, \
|
|
{ name, "EQ2", "EQ2" }, \
|
|
{ name, "DRC1L", "DRC1L" }, \
|
|
{ name, "DRC1R", "DRC1R" }, \
|
|
{ name, "DRC2L", "DRC2L" }, \
|
|
{ name, "DRC2R", "DRC2R" }, \
|
|
{ name, "LHPF1", "LHPF1" }, \
|
|
{ name, "LHPF2", "LHPF2" }, \
|
|
{ name, "LHPF3", "LHPF3" }, \
|
|
{ name, "LHPF4", "LHPF4" }, \
|
|
{ name, "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, "ISRC2DEC3", "ISRC2DEC3" }, \
|
|
{ name, "ISRC2DEC4", "ISRC2DEC4" }, \
|
|
{ name, "ISRC2INT1", "ISRC2INT1" }, \
|
|
{ name, "ISRC2INT2", "ISRC2INT2" }, \
|
|
{ name, "ISRC2INT3", "ISRC2INT3" }, \
|
|
{ name, "ISRC2INT4", "ISRC2INT4" }, \
|
|
{ name, "ISRC3DEC1", "ISRC3DEC1" }, \
|
|
{ name, "ISRC3DEC2", "ISRC3DEC2" }, \
|
|
{ name, "ISRC3DEC3", "ISRC3DEC3" }, \
|
|
{ name, "ISRC3DEC4", "ISRC3DEC4" }, \
|
|
{ name, "ISRC3INT1", "ISRC3INT1" }, \
|
|
{ name, "ISRC3INT2", "ISRC3INT2" }, \
|
|
{ name, "ISRC3INT3", "ISRC3INT3" }, \
|
|
{ name, "ISRC3INT4", "ISRC3INT4" }, \
|
|
{ name, "DSP2.1", "DSP2" }, \
|
|
{ name, "DSP2.2", "DSP2" }, \
|
|
{ name, "DSP2.3", "DSP2" }, \
|
|
{ name, "DSP2.4", "DSP2" }, \
|
|
{ name, "DSP2.5", "DSP2" }, \
|
|
{ name, "DSP2.6", "DSP2" }, \
|
|
{ name, "DSP3.1", "DSP3" }, \
|
|
{ name, "DSP3.2", "DSP3" }, \
|
|
{ name, "DSP3.3", "DSP3" }, \
|
|
{ name, "DSP3.4", "DSP3" }, \
|
|
{ name, "DSP3.5", "DSP3" }, \
|
|
{ name, "DSP3.6", "DSP3" }
|
|
|
|
static const struct snd_soc_dapm_route cs47l24_dapm_routes[] = {
|
|
{ "OUT1L", NULL, "CPVDD" },
|
|
{ "OUT1R", NULL, "CPVDD" },
|
|
|
|
{ "OUT4L", NULL, "SPKVDD" },
|
|
|
|
{ "OUT1L", NULL, "SYSCLK" },
|
|
{ "OUT1R", NULL, "SYSCLK" },
|
|
{ "OUT4L", NULL, "SYSCLK" },
|
|
|
|
{ "IN1L", NULL, "SYSCLK" },
|
|
{ "IN1R", NULL, "SYSCLK" },
|
|
{ "IN2L", NULL, "SYSCLK" },
|
|
{ "IN2R", NULL, "SYSCLK" },
|
|
|
|
{ "MICBIAS1", NULL, "MICVDD" },
|
|
{ "MICBIAS2", NULL, "MICVDD" },
|
|
|
|
{ "Noise Generator", NULL, "SYSCLK" },
|
|
{ "Tone Generator 1", NULL, "SYSCLK" },
|
|
{ "Tone Generator 2", NULL, "SYSCLK" },
|
|
|
|
{ "Noise Generator", NULL, "NOISE" },
|
|
{ "Tone Generator 1", NULL, "TONE" },
|
|
{ "Tone Generator 2", NULL, "TONE" },
|
|
|
|
{ "AIF1 Capture", NULL, "AIF1TX1" },
|
|
{ "AIF1 Capture", NULL, "AIF1TX2" },
|
|
{ "AIF1 Capture", NULL, "AIF1TX3" },
|
|
{ "AIF1 Capture", NULL, "AIF1TX4" },
|
|
{ "AIF1 Capture", NULL, "AIF1TX5" },
|
|
{ "AIF1 Capture", NULL, "AIF1TX6" },
|
|
{ "AIF1 Capture", NULL, "AIF1TX7" },
|
|
{ "AIF1 Capture", NULL, "AIF1TX8" },
|
|
|
|
{ "AIF1RX1", NULL, "AIF1 Playback" },
|
|
{ "AIF1RX2", NULL, "AIF1 Playback" },
|
|
{ "AIF1RX3", NULL, "AIF1 Playback" },
|
|
{ "AIF1RX4", NULL, "AIF1 Playback" },
|
|
{ "AIF1RX5", NULL, "AIF1 Playback" },
|
|
{ "AIF1RX6", NULL, "AIF1 Playback" },
|
|
{ "AIF1RX7", NULL, "AIF1 Playback" },
|
|
{ "AIF1RX8", 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" },
|
|
|
|
{ "AIF1 Playback", NULL, "SYSCLK" },
|
|
{ "AIF2 Playback", NULL, "SYSCLK" },
|
|
{ "AIF3 Playback", NULL, "SYSCLK" },
|
|
|
|
{ "AIF1 Capture", NULL, "SYSCLK" },
|
|
{ "AIF2 Capture", NULL, "SYSCLK" },
|
|
{ "AIF3 Capture", NULL, "SYSCLK" },
|
|
|
|
{ "Voice Control DSP", NULL, "DSP3" },
|
|
{ "Voice Control DSP", NULL, "SYSCLK" },
|
|
|
|
{ "IN1L PGA", NULL, "IN1L" },
|
|
{ "IN1R PGA", NULL, "IN1R" },
|
|
|
|
{ "IN2L PGA", NULL, "IN2L" },
|
|
{ "IN2R PGA", NULL, "IN2R" },
|
|
|
|
ARIZONA_MIXER_ROUTES("OUT1L", "HPOUT1L"),
|
|
ARIZONA_MIXER_ROUTES("OUT1R", "HPOUT1R"),
|
|
|
|
ARIZONA_MIXER_ROUTES("OUT4L", "SPKOUT"),
|
|
|
|
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("AIF1TX7", "AIF1TX7"),
|
|
ARIZONA_MIXER_ROUTES("AIF1TX8", "AIF1TX8"),
|
|
|
|
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_MIXER_ROUTES("EQ1", "EQ1"),
|
|
ARIZONA_MIXER_ROUTES("EQ2", "EQ2"),
|
|
|
|
ARIZONA_MIXER_ROUTES("DRC1L", "DRC1L"),
|
|
ARIZONA_MIXER_ROUTES("DRC1R", "DRC1R"),
|
|
ARIZONA_MIXER_ROUTES("DRC2L", "DRC2L"),
|
|
ARIZONA_MIXER_ROUTES("DRC2R", "DRC2R"),
|
|
|
|
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_DSP_ROUTES("DSP2"),
|
|
ARIZONA_DSP_ROUTES("DSP3"),
|
|
|
|
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("ISRC2INT3", "ISRC2INT3"),
|
|
ARIZONA_MUX_ROUTES("ISRC2INT4", "ISRC2INT4"),
|
|
|
|
ARIZONA_MUX_ROUTES("ISRC2DEC1", "ISRC2DEC1"),
|
|
ARIZONA_MUX_ROUTES("ISRC2DEC2", "ISRC2DEC2"),
|
|
ARIZONA_MUX_ROUTES("ISRC2DEC3", "ISRC2DEC3"),
|
|
ARIZONA_MUX_ROUTES("ISRC2DEC4", "ISRC2DEC4"),
|
|
|
|
ARIZONA_MUX_ROUTES("ISRC3INT1", "ISRC3INT1"),
|
|
ARIZONA_MUX_ROUTES("ISRC3INT2", "ISRC3INT2"),
|
|
ARIZONA_MUX_ROUTES("ISRC3INT3", "ISRC3INT3"),
|
|
ARIZONA_MUX_ROUTES("ISRC3INT4", "ISRC3INT4"),
|
|
|
|
ARIZONA_MUX_ROUTES("ISRC3DEC1", "ISRC3DEC1"),
|
|
ARIZONA_MUX_ROUTES("ISRC3DEC2", "ISRC3DEC2"),
|
|
ARIZONA_MUX_ROUTES("ISRC3DEC3", "ISRC3DEC3"),
|
|
ARIZONA_MUX_ROUTES("ISRC3DEC4", "ISRC3DEC4"),
|
|
|
|
{ "AEC Loopback", "HPOUT1L", "OUT1L" },
|
|
{ "AEC Loopback", "HPOUT1R", "OUT1R" },
|
|
{ "HPOUT1L", NULL, "OUT1L" },
|
|
{ "HPOUT1R", NULL, "OUT1R" },
|
|
|
|
{ "AEC Loopback", "SPKOUT", "OUT4L" },
|
|
{ "SPKOUTN", NULL, "OUT4L" },
|
|
{ "SPKOUTP", NULL, "OUT4L" },
|
|
|
|
{ "MICSUPP", NULL, "SYSCLK" },
|
|
|
|
{ "DRC1 Signal Activity", NULL, "DRC1L" },
|
|
{ "DRC1 Signal Activity", NULL, "DRC1R" },
|
|
{ "DRC2 Signal Activity", NULL, "DRC2L" },
|
|
{ "DRC2 Signal Activity", NULL, "DRC2R" },
|
|
};
|
|
|
|
static int cs47l24_set_fll(struct snd_soc_codec *codec, int fll_id, int source,
|
|
unsigned int Fref, unsigned int Fout)
|
|
{
|
|
struct cs47l24_priv *cs47l24 = snd_soc_codec_get_drvdata(codec);
|
|
|
|
switch (fll_id) {
|
|
case CS47L24_FLL1:
|
|
return arizona_set_fll(&cs47l24->fll[0], source, Fref, Fout);
|
|
case CS47L24_FLL2:
|
|
return arizona_set_fll(&cs47l24->fll[1], source, Fref, Fout);
|
|
case CS47L24_FLL1_REFCLK:
|
|
return arizona_set_fll_refclk(&cs47l24->fll[0], source, Fref,
|
|
Fout);
|
|
case CS47L24_FLL2_REFCLK:
|
|
return arizona_set_fll_refclk(&cs47l24->fll[1], source, Fref,
|
|
Fout);
|
|
default:
|
|
return -EINVAL;
|
|
}
|
|
}
|
|
|
|
#define CS47L24_RATES SNDRV_PCM_RATE_KNOT
|
|
|
|
#define CS47L24_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 cs47l24_dai[] = {
|
|
{
|
|
.name = "cs47l24-aif1",
|
|
.id = 1,
|
|
.base = ARIZONA_AIF1_BCLK_CTRL,
|
|
.playback = {
|
|
.stream_name = "AIF1 Playback",
|
|
.channels_min = 1,
|
|
.channels_max = 8,
|
|
.rates = CS47L24_RATES,
|
|
.formats = CS47L24_FORMATS,
|
|
},
|
|
.capture = {
|
|
.stream_name = "AIF1 Capture",
|
|
.channels_min = 1,
|
|
.channels_max = 8,
|
|
.rates = CS47L24_RATES,
|
|
.formats = CS47L24_FORMATS,
|
|
},
|
|
.ops = &arizona_dai_ops,
|
|
.symmetric_rates = 1,
|
|
.symmetric_samplebits = 1,
|
|
},
|
|
{
|
|
.name = "cs47l24-aif2",
|
|
.id = 2,
|
|
.base = ARIZONA_AIF2_BCLK_CTRL,
|
|
.playback = {
|
|
.stream_name = "AIF2 Playback",
|
|
.channels_min = 1,
|
|
.channels_max = 6,
|
|
.rates = CS47L24_RATES,
|
|
.formats = CS47L24_FORMATS,
|
|
},
|
|
.capture = {
|
|
.stream_name = "AIF2 Capture",
|
|
.channels_min = 1,
|
|
.channels_max = 6,
|
|
.rates = CS47L24_RATES,
|
|
.formats = CS47L24_FORMATS,
|
|
},
|
|
.ops = &arizona_dai_ops,
|
|
.symmetric_rates = 1,
|
|
.symmetric_samplebits = 1,
|
|
},
|
|
{
|
|
.name = "cs47l24-aif3",
|
|
.id = 3,
|
|
.base = ARIZONA_AIF3_BCLK_CTRL,
|
|
.playback = {
|
|
.stream_name = "AIF3 Playback",
|
|
.channels_min = 1,
|
|
.channels_max = 2,
|
|
.rates = CS47L24_RATES,
|
|
.formats = CS47L24_FORMATS,
|
|
},
|
|
.capture = {
|
|
.stream_name = "AIF3 Capture",
|
|
.channels_min = 1,
|
|
.channels_max = 2,
|
|
.rates = CS47L24_RATES,
|
|
.formats = CS47L24_FORMATS,
|
|
},
|
|
.ops = &arizona_dai_ops,
|
|
.symmetric_rates = 1,
|
|
.symmetric_samplebits = 1,
|
|
},
|
|
{
|
|
.name = "cs47l24-cpu-voicectrl",
|
|
.capture = {
|
|
.stream_name = "Voice Control CPU",
|
|
.channels_min = 1,
|
|
.channels_max = 1,
|
|
.rates = CS47L24_RATES,
|
|
.formats = CS47L24_FORMATS,
|
|
},
|
|
.compress_new = snd_soc_new_compress,
|
|
},
|
|
{
|
|
.name = "cs47l24-dsp-voicectrl",
|
|
.capture = {
|
|
.stream_name = "Voice Control DSP",
|
|
.channels_min = 1,
|
|
.channels_max = 1,
|
|
.rates = CS47L24_RATES,
|
|
.formats = CS47L24_FORMATS,
|
|
},
|
|
},
|
|
};
|
|
|
|
static int cs47l24_open(struct snd_compr_stream *stream)
|
|
{
|
|
struct snd_soc_pcm_runtime *rtd = stream->private_data;
|
|
struct cs47l24_priv *priv = snd_soc_codec_get_drvdata(rtd->codec);
|
|
struct arizona *arizona = priv->core.arizona;
|
|
int n_adsp;
|
|
|
|
if (strcmp(rtd->codec_dai->name, "cs47l24-dsp-voicectrl") == 0) {
|
|
n_adsp = 2;
|
|
} else {
|
|
dev_err(arizona->dev,
|
|
"No suitable compressed stream for DAI '%s'\n",
|
|
rtd->codec_dai->name);
|
|
return -EINVAL;
|
|
}
|
|
|
|
return wm_adsp_compr_open(&priv->core.adsp[n_adsp], stream);
|
|
}
|
|
|
|
static irqreturn_t cs47l24_adsp2_irq(int irq, void *data)
|
|
{
|
|
struct cs47l24_priv *priv = data;
|
|
struct arizona *arizona = priv->core.arizona;
|
|
int ret;
|
|
|
|
ret = wm_adsp_compr_handle_irq(&priv->core.adsp[2]);
|
|
if (ret == -ENODEV) {
|
|
dev_err(arizona->dev, "Spurious compressed data IRQ\n");
|
|
return IRQ_NONE;
|
|
}
|
|
|
|
return IRQ_HANDLED;
|
|
}
|
|
|
|
static int cs47l24_codec_probe(struct snd_soc_codec *codec)
|
|
{
|
|
struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec);
|
|
struct cs47l24_priv *priv = snd_soc_codec_get_drvdata(codec);
|
|
struct arizona *arizona = priv->core.arizona;
|
|
int ret;
|
|
|
|
priv->core.arizona->dapm = dapm;
|
|
|
|
arizona_init_spk(codec);
|
|
arizona_init_gpio(codec);
|
|
arizona_init_mono(codec);
|
|
|
|
ret = arizona_request_irq(arizona, ARIZONA_IRQ_DSP_IRQ1,
|
|
"ADSP2 Compressed IRQ", cs47l24_adsp2_irq,
|
|
priv);
|
|
if (ret != 0) {
|
|
dev_err(codec->dev, "Failed to request DSP IRQ: %d\n", ret);
|
|
return ret;
|
|
}
|
|
|
|
ret = wm_adsp2_codec_probe(&priv->core.adsp[1], codec);
|
|
if (ret)
|
|
goto err_adsp2_codec_probe;
|
|
|
|
ret = wm_adsp2_codec_probe(&priv->core.adsp[2], codec);
|
|
if (ret)
|
|
goto err_adsp2_codec_probe;
|
|
|
|
ret = snd_soc_add_codec_controls(codec,
|
|
&arizona_adsp2_rate_controls[1], 2);
|
|
if (ret)
|
|
goto err_adsp2_codec_probe;
|
|
|
|
snd_soc_dapm_disable_pin(dapm, "HAPTICS");
|
|
|
|
return 0;
|
|
|
|
err_adsp2_codec_probe:
|
|
wm_adsp2_codec_remove(&priv->core.adsp[1], codec);
|
|
wm_adsp2_codec_remove(&priv->core.adsp[2], codec);
|
|
|
|
return ret;
|
|
}
|
|
|
|
static int cs47l24_codec_remove(struct snd_soc_codec *codec)
|
|
{
|
|
struct cs47l24_priv *priv = snd_soc_codec_get_drvdata(codec);
|
|
struct arizona *arizona = priv->core.arizona;
|
|
|
|
wm_adsp2_codec_remove(&priv->core.adsp[1], codec);
|
|
wm_adsp2_codec_remove(&priv->core.adsp[2], codec);
|
|
|
|
priv->core.arizona->dapm = NULL;
|
|
|
|
arizona_free_irq(arizona, ARIZONA_IRQ_DSP_IRQ1, priv);
|
|
return 0;
|
|
}
|
|
|
|
#define CS47L24_DIG_VU 0x0200
|
|
|
|
static unsigned int cs47l24_digital_vu[] = {
|
|
ARIZONA_DAC_DIGITAL_VOLUME_1L,
|
|
ARIZONA_DAC_DIGITAL_VOLUME_1R,
|
|
ARIZONA_DAC_DIGITAL_VOLUME_4L,
|
|
};
|
|
|
|
static struct regmap *cs47l24_get_regmap(struct device *dev)
|
|
{
|
|
struct cs47l24_priv *priv = dev_get_drvdata(dev);
|
|
|
|
return priv->core.arizona->regmap;
|
|
}
|
|
|
|
static struct snd_soc_codec_driver soc_codec_dev_cs47l24 = {
|
|
.probe = cs47l24_codec_probe,
|
|
.remove = cs47l24_codec_remove,
|
|
.get_regmap = cs47l24_get_regmap,
|
|
|
|
.idle_bias_off = true,
|
|
|
|
.set_sysclk = arizona_set_sysclk,
|
|
.set_pll = cs47l24_set_fll,
|
|
|
|
.controls = cs47l24_snd_controls,
|
|
.num_controls = ARRAY_SIZE(cs47l24_snd_controls),
|
|
.dapm_widgets = cs47l24_dapm_widgets,
|
|
.num_dapm_widgets = ARRAY_SIZE(cs47l24_dapm_widgets),
|
|
.dapm_routes = cs47l24_dapm_routes,
|
|
.num_dapm_routes = ARRAY_SIZE(cs47l24_dapm_routes),
|
|
};
|
|
|
|
static struct snd_compr_ops cs47l24_compr_ops = {
|
|
.open = cs47l24_open,
|
|
.free = wm_adsp_compr_free,
|
|
.set_params = wm_adsp_compr_set_params,
|
|
.get_caps = wm_adsp_compr_get_caps,
|
|
.trigger = wm_adsp_compr_trigger,
|
|
.pointer = wm_adsp_compr_pointer,
|
|
.copy = wm_adsp_compr_copy,
|
|
};
|
|
|
|
static struct snd_soc_platform_driver cs47l24_compr_platform = {
|
|
.compr_ops = &cs47l24_compr_ops,
|
|
};
|
|
static int cs47l24_probe(struct platform_device *pdev)
|
|
{
|
|
struct arizona *arizona = dev_get_drvdata(pdev->dev.parent);
|
|
struct cs47l24_priv *cs47l24;
|
|
int i, ret;
|
|
|
|
BUILD_BUG_ON(ARRAY_SIZE(cs47l24_dai) > ARIZONA_MAX_DAI);
|
|
|
|
cs47l24 = devm_kzalloc(&pdev->dev, sizeof(struct cs47l24_priv),
|
|
GFP_KERNEL);
|
|
if (!cs47l24)
|
|
return -ENOMEM;
|
|
|
|
platform_set_drvdata(pdev, cs47l24);
|
|
|
|
cs47l24->core.arizona = arizona;
|
|
cs47l24->core.num_inputs = 4;
|
|
|
|
for (i = 1; i <= 2; i++) {
|
|
cs47l24->core.adsp[i].part = "cs47l24";
|
|
cs47l24->core.adsp[i].num = i + 1;
|
|
cs47l24->core.adsp[i].type = WMFW_ADSP2;
|
|
cs47l24->core.adsp[i].dev = arizona->dev;
|
|
cs47l24->core.adsp[i].regmap = arizona->regmap;
|
|
|
|
cs47l24->core.adsp[i].base = ARIZONA_DSP1_CONTROL_1 +
|
|
(0x100 * i);
|
|
cs47l24->core.adsp[i].mem = cs47l24_dsp_regions[i - 1];
|
|
cs47l24->core.adsp[i].num_mems =
|
|
ARRAY_SIZE(cs47l24_dsp2_regions);
|
|
|
|
ret = wm_adsp2_init(&cs47l24->core.adsp[i]);
|
|
if (ret != 0)
|
|
return ret;
|
|
}
|
|
|
|
for (i = 0; i < ARRAY_SIZE(cs47l24->fll); i++)
|
|
cs47l24->fll[i].vco_mult = 3;
|
|
|
|
arizona_init_fll(arizona, 1, ARIZONA_FLL1_CONTROL_1 - 1,
|
|
ARIZONA_IRQ_FLL1_LOCK, ARIZONA_IRQ_FLL1_CLOCK_OK,
|
|
&cs47l24->fll[0]);
|
|
arizona_init_fll(arizona, 2, ARIZONA_FLL2_CONTROL_1 - 1,
|
|
ARIZONA_IRQ_FLL2_LOCK, ARIZONA_IRQ_FLL2_CLOCK_OK,
|
|
&cs47l24->fll[1]);
|
|
|
|
/* SR2 fixed at 8kHz, SR3 fixed at 16kHz */
|
|
regmap_update_bits(arizona->regmap, ARIZONA_SAMPLE_RATE_2,
|
|
ARIZONA_SAMPLE_RATE_2_MASK, 0x11);
|
|
regmap_update_bits(arizona->regmap, ARIZONA_SAMPLE_RATE_3,
|
|
ARIZONA_SAMPLE_RATE_3_MASK, 0x12);
|
|
|
|
for (i = 0; i < ARRAY_SIZE(cs47l24_dai); i++)
|
|
arizona_init_dai(&cs47l24->core, i);
|
|
|
|
/* Latch volume update bits */
|
|
for (i = 0; i < ARRAY_SIZE(cs47l24_digital_vu); i++)
|
|
regmap_update_bits(arizona->regmap, cs47l24_digital_vu[i],
|
|
CS47L24_DIG_VU, CS47L24_DIG_VU);
|
|
|
|
pm_runtime_enable(&pdev->dev);
|
|
pm_runtime_idle(&pdev->dev);
|
|
|
|
ret = snd_soc_register_platform(&pdev->dev, &cs47l24_compr_platform);
|
|
if (ret < 0) {
|
|
dev_err(&pdev->dev, "Failed to register platform: %d\n", ret);
|
|
return ret;
|
|
}
|
|
ret = snd_soc_register_codec(&pdev->dev, &soc_codec_dev_cs47l24,
|
|
cs47l24_dai, ARRAY_SIZE(cs47l24_dai));
|
|
|
|
if (ret < 0) {
|
|
dev_err(&pdev->dev, "Failed to register codec: %d\n", ret);
|
|
snd_soc_unregister_platform(&pdev->dev);
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
static int cs47l24_remove(struct platform_device *pdev)
|
|
{
|
|
snd_soc_unregister_platform(&pdev->dev);
|
|
snd_soc_unregister_codec(&pdev->dev);
|
|
pm_runtime_disable(&pdev->dev);
|
|
|
|
return 0;
|
|
}
|
|
|
|
static struct platform_driver cs47l24_codec_driver = {
|
|
.driver = {
|
|
.name = "cs47l24-codec",
|
|
},
|
|
.probe = cs47l24_probe,
|
|
.remove = cs47l24_remove,
|
|
};
|
|
|
|
module_platform_driver(cs47l24_codec_driver);
|
|
|
|
MODULE_DESCRIPTION("ASoC CS47L24 driver");
|
|
MODULE_AUTHOR("Richard Fitzgerald <rf@opensource.wolfsonmicro.com>");
|
|
MODULE_LICENSE("GPL v2");
|
|
MODULE_ALIAS("platform:cs47l24-codec");
|