mirror of
https://github.com/torvalds/linux.git
synced 2024-12-29 06:12:08 +00:00
43cd8bf1c8
For optimal performance the inputs should be kept muted until after power up. Since there are few use cases for muting inputs during capture move the mutes to automatic control. Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
1088 lines
40 KiB
C
1088 lines
40 KiB
C
/*
|
|
* wm5110.c -- WM5110 ALSA SoC Audio driver
|
|
*
|
|
* Copyright 2012 Wolfson Microelectronics plc
|
|
*
|
|
* Author: Mark Brown <broonie@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 "wm5110.h"
|
|
|
|
struct wm5110_priv {
|
|
struct arizona_priv core;
|
|
struct arizona_fll fll[2];
|
|
};
|
|
|
|
static DECLARE_TLV_DB_SCALE(ana_tlv, 0, 100, 0);
|
|
static DECLARE_TLV_DB_SCALE(eq_tlv, -1200, 100, 0);
|
|
static DECLARE_TLV_DB_SCALE(digital_tlv, -6400, 50, 0);
|
|
static DECLARE_TLV_DB_SCALE(noise_tlv, 0, 600, 0);
|
|
static DECLARE_TLV_DB_SCALE(ng_tlv, -10200, 600, 0);
|
|
|
|
#define WM5110_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 HPOUT2L Switch", base, 2, 1, 0), \
|
|
SOC_SINGLE(name " NG HPOUT2R Switch", base, 3, 1, 0), \
|
|
SOC_SINGLE(name " NG HPOUT3L Switch", base, 4, 1, 0), \
|
|
SOC_SINGLE(name " NG HPOUT3R Switch", base, 5, 1, 0), \
|
|
SOC_SINGLE(name " NG SPKOUTL Switch", base, 6, 1, 0), \
|
|
SOC_SINGLE(name " NG SPKOUTR Switch", base, 7, 1, 0), \
|
|
SOC_SINGLE(name " NG SPKDAT1L Switch", base, 8, 1, 0), \
|
|
SOC_SINGLE(name " NG SPKDAT1R Switch", base, 9, 1, 0), \
|
|
SOC_SINGLE(name " NG SPKDAT2L Switch", base, 10, 1, 0), \
|
|
SOC_SINGLE(name " NG SPKDAT2R Switch", base, 11, 1, 0)
|
|
|
|
static const struct snd_kcontrol_new wm5110_snd_controls[] = {
|
|
SOC_SINGLE("IN1 High Performance Switch", ARIZONA_IN1L_CONTROL,
|
|
ARIZONA_IN1_OSR_SHIFT, 1, 0),
|
|
SOC_SINGLE("IN2 High Performance Switch", ARIZONA_IN2L_CONTROL,
|
|
ARIZONA_IN2_OSR_SHIFT, 1, 0),
|
|
SOC_SINGLE("IN3 High Performance Switch", ARIZONA_IN3L_CONTROL,
|
|
ARIZONA_IN3_OSR_SHIFT, 1, 0),
|
|
SOC_SINGLE("IN4 High Performance Switch", ARIZONA_IN4L_CONTROL,
|
|
ARIZONA_IN4_OSR_SHIFT, 1, 0),
|
|
|
|
SOC_SINGLE_RANGE_TLV("IN1L Volume", ARIZONA_IN1L_CONTROL,
|
|
ARIZONA_IN1L_PGA_VOL_SHIFT, 0x40, 0x5f, 0, ana_tlv),
|
|
SOC_SINGLE_RANGE_TLV("IN1R Volume", ARIZONA_IN1R_CONTROL,
|
|
ARIZONA_IN1R_PGA_VOL_SHIFT, 0x40, 0x5f, 0, ana_tlv),
|
|
SOC_SINGLE_RANGE_TLV("IN2L Volume", ARIZONA_IN2L_CONTROL,
|
|
ARIZONA_IN2L_PGA_VOL_SHIFT, 0x40, 0x5f, 0, ana_tlv),
|
|
SOC_SINGLE_RANGE_TLV("IN2R Volume", ARIZONA_IN2R_CONTROL,
|
|
ARIZONA_IN2R_PGA_VOL_SHIFT, 0x40, 0x5f, 0, ana_tlv),
|
|
SOC_SINGLE_RANGE_TLV("IN3L Volume", ARIZONA_IN3L_CONTROL,
|
|
ARIZONA_IN3L_PGA_VOL_SHIFT, 0x40, 0x5f, 0, ana_tlv),
|
|
SOC_SINGLE_RANGE_TLV("IN3R Volume", ARIZONA_IN3R_CONTROL,
|
|
ARIZONA_IN3R_PGA_VOL_SHIFT, 0x40, 0x5f, 0, ana_tlv),
|
|
|
|
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_SINGLE_TLV("IN3L Digital Volume", ARIZONA_ADC_DIGITAL_VOLUME_3L,
|
|
ARIZONA_IN3L_DIG_VOL_SHIFT, 0xbf, 0, digital_tlv),
|
|
SOC_SINGLE_TLV("IN3R Digital Volume", ARIZONA_ADC_DIGITAL_VOLUME_3R,
|
|
ARIZONA_IN3R_DIG_VOL_SHIFT, 0xbf, 0, digital_tlv),
|
|
SOC_SINGLE_TLV("IN4L Digital Volume", ARIZONA_ADC_DIGITAL_VOLUME_4L,
|
|
ARIZONA_IN4L_DIG_VOL_SHIFT, 0xbf, 0, digital_tlv),
|
|
SOC_SINGLE_TLV("IN4R Digital Volume", ARIZONA_ADC_DIGITAL_VOLUME_4R,
|
|
ARIZONA_IN4R_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_MIXER_CONTROLS("EQ3", ARIZONA_EQ3MIX_INPUT_1_SOURCE),
|
|
ARIZONA_MIXER_CONTROLS("EQ4", ARIZONA_EQ4MIX_INPUT_1_SOURCE),
|
|
|
|
SND_SOC_BYTES_MASK("EQ1 Coefficeints", ARIZONA_EQ1_1, 21,
|
|
ARIZONA_EQ1_ENA_MASK),
|
|
SND_SOC_BYTES_MASK("EQ2 Coefficeints", ARIZONA_EQ2_1, 21,
|
|
ARIZONA_EQ2_ENA_MASK),
|
|
SND_SOC_BYTES_MASK("EQ3 Coefficeints", ARIZONA_EQ3_1, 21,
|
|
ARIZONA_EQ3_ENA_MASK),
|
|
SND_SOC_BYTES_MASK("EQ4 Coefficeints", ARIZONA_EQ4_1, 21,
|
|
ARIZONA_EQ4_ENA_MASK),
|
|
|
|
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),
|
|
|
|
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),
|
|
|
|
SOC_SINGLE_TLV("EQ3 B1 Volume", ARIZONA_EQ3_1, ARIZONA_EQ3_B1_GAIN_SHIFT,
|
|
24, 0, eq_tlv),
|
|
SOC_SINGLE_TLV("EQ3 B2 Volume", ARIZONA_EQ3_1, ARIZONA_EQ3_B2_GAIN_SHIFT,
|
|
24, 0, eq_tlv),
|
|
SOC_SINGLE_TLV("EQ3 B3 Volume", ARIZONA_EQ3_1, ARIZONA_EQ3_B3_GAIN_SHIFT,
|
|
24, 0, eq_tlv),
|
|
SOC_SINGLE_TLV("EQ3 B4 Volume", ARIZONA_EQ3_2, ARIZONA_EQ3_B4_GAIN_SHIFT,
|
|
24, 0, eq_tlv),
|
|
SOC_SINGLE_TLV("EQ3 B5 Volume", ARIZONA_EQ3_2, ARIZONA_EQ3_B5_GAIN_SHIFT,
|
|
24, 0, eq_tlv),
|
|
|
|
SOC_SINGLE_TLV("EQ4 B1 Volume", ARIZONA_EQ4_1, ARIZONA_EQ4_B1_GAIN_SHIFT,
|
|
24, 0, eq_tlv),
|
|
SOC_SINGLE_TLV("EQ4 B2 Volume", ARIZONA_EQ4_1, ARIZONA_EQ4_B2_GAIN_SHIFT,
|
|
24, 0, eq_tlv),
|
|
SOC_SINGLE_TLV("EQ4 B3 Volume", ARIZONA_EQ4_1, ARIZONA_EQ4_B3_GAIN_SHIFT,
|
|
24, 0, eq_tlv),
|
|
SOC_SINGLE_TLV("EQ4 B4 Volume", ARIZONA_EQ4_2, ARIZONA_EQ4_B4_GAIN_SHIFT,
|
|
24, 0, eq_tlv),
|
|
SOC_SINGLE_TLV("EQ4 B5 Volume", ARIZONA_EQ4_2, ARIZONA_EQ4_B5_GAIN_SHIFT,
|
|
24, 0, eq_tlv),
|
|
|
|
ARIZONA_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),
|
|
|
|
SND_SOC_BYTES("LHPF1 Coefficients", ARIZONA_HPLPF1_2, 1),
|
|
SND_SOC_BYTES("LHPF2 Coefficients", ARIZONA_HPLPF2_2, 1),
|
|
SND_SOC_BYTES("LHPF3 Coefficients", ARIZONA_HPLPF3_2, 1),
|
|
SND_SOC_BYTES("LHPF4 Coefficients", ARIZONA_HPLPF4_2, 1),
|
|
|
|
SOC_ENUM("LHPF1 Mode", arizona_lhpf1_mode),
|
|
SOC_ENUM("LHPF2 Mode", arizona_lhpf2_mode),
|
|
SOC_ENUM("LHPF3 Mode", arizona_lhpf3_mode),
|
|
SOC_ENUM("LHPF4 Mode", arizona_lhpf4_mode),
|
|
|
|
ARIZONA_MIXER_CONTROLS("DSP1L", ARIZONA_DSP1LMIX_INPUT_1_SOURCE),
|
|
ARIZONA_MIXER_CONTROLS("DSP1R", ARIZONA_DSP1RMIX_INPUT_1_SOURCE),
|
|
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),
|
|
ARIZONA_MIXER_CONTROLS("DSP4L", ARIZONA_DSP4LMIX_INPUT_1_SOURCE),
|
|
ARIZONA_MIXER_CONTROLS("DSP5R", ARIZONA_DSP4RMIX_INPUT_1_SOURCE),
|
|
|
|
ARIZONA_MIXER_CONTROLS("Mic", ARIZONA_MICMIX_INPUT_1_SOURCE),
|
|
ARIZONA_MIXER_CONTROLS("Noise", ARIZONA_NOISEMIX_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("HPOUT2L", ARIZONA_OUT2LMIX_INPUT_1_SOURCE),
|
|
ARIZONA_MIXER_CONTROLS("HPOUT2R", ARIZONA_OUT2RMIX_INPUT_1_SOURCE),
|
|
ARIZONA_MIXER_CONTROLS("HPOUT3L", ARIZONA_OUT3LMIX_INPUT_1_SOURCE),
|
|
ARIZONA_MIXER_CONTROLS("HPOUT3R", ARIZONA_OUT3RMIX_INPUT_1_SOURCE),
|
|
ARIZONA_MIXER_CONTROLS("SPKOUTL", ARIZONA_OUT4LMIX_INPUT_1_SOURCE),
|
|
ARIZONA_MIXER_CONTROLS("SPKOUTR", ARIZONA_OUT4RMIX_INPUT_1_SOURCE),
|
|
ARIZONA_MIXER_CONTROLS("SPKDAT1L", ARIZONA_OUT5LMIX_INPUT_1_SOURCE),
|
|
ARIZONA_MIXER_CONTROLS("SPKDAT1R", ARIZONA_OUT5RMIX_INPUT_1_SOURCE),
|
|
ARIZONA_MIXER_CONTROLS("SPKDAT2L", ARIZONA_OUT6LMIX_INPUT_1_SOURCE),
|
|
ARIZONA_MIXER_CONTROLS("SPKDAT2R", ARIZONA_OUT6RMIX_INPUT_1_SOURCE),
|
|
|
|
SOC_SINGLE("HPOUT1 High Performance Switch", ARIZONA_OUTPUT_PATH_CONFIG_1L,
|
|
ARIZONA_OUT1_OSR_SHIFT, 1, 0),
|
|
SOC_SINGLE("OUT2 High Performance Switch", ARIZONA_OUTPUT_PATH_CONFIG_2L,
|
|
ARIZONA_OUT2_OSR_SHIFT, 1, 0),
|
|
SOC_SINGLE("OUT3 High Performance Switch", ARIZONA_OUTPUT_PATH_CONFIG_3L,
|
|
ARIZONA_OUT3_OSR_SHIFT, 1, 0),
|
|
SOC_SINGLE("Speaker High Performance Switch", ARIZONA_OUTPUT_PATH_CONFIG_4L,
|
|
ARIZONA_OUT4_OSR_SHIFT, 1, 0),
|
|
SOC_SINGLE("SPKDAT1 High Performance Switch", ARIZONA_OUTPUT_PATH_CONFIG_5L,
|
|
ARIZONA_OUT5_OSR_SHIFT, 1, 0),
|
|
SOC_SINGLE("SPKDAT2 High Performance Switch", ARIZONA_OUTPUT_PATH_CONFIG_6L,
|
|
ARIZONA_OUT6_OSR_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_DOUBLE_R("OUT2 Digital Switch", ARIZONA_DAC_DIGITAL_VOLUME_2L,
|
|
ARIZONA_DAC_DIGITAL_VOLUME_2R, ARIZONA_OUT2L_MUTE_SHIFT, 1, 1),
|
|
SOC_DOUBLE_R("OUT3 Digital Switch", ARIZONA_DAC_DIGITAL_VOLUME_3L,
|
|
ARIZONA_DAC_DIGITAL_VOLUME_3R, ARIZONA_OUT3L_MUTE_SHIFT, 1, 1),
|
|
SOC_DOUBLE_R("Speaker Digital Switch", ARIZONA_DAC_DIGITAL_VOLUME_4L,
|
|
ARIZONA_DAC_DIGITAL_VOLUME_4R, ARIZONA_OUT4L_MUTE_SHIFT, 1, 1),
|
|
SOC_DOUBLE_R("SPKDAT1 Digital Switch", ARIZONA_DAC_DIGITAL_VOLUME_5L,
|
|
ARIZONA_DAC_DIGITAL_VOLUME_5R, ARIZONA_OUT5L_MUTE_SHIFT, 1, 1),
|
|
SOC_DOUBLE_R("SPKDAT2 Digital Switch", ARIZONA_DAC_DIGITAL_VOLUME_6L,
|
|
ARIZONA_DAC_DIGITAL_VOLUME_6R, ARIZONA_OUT6L_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_DOUBLE_R_TLV("OUT2 Digital Volume", ARIZONA_DAC_DIGITAL_VOLUME_2L,
|
|
ARIZONA_DAC_DIGITAL_VOLUME_2R, ARIZONA_OUT2L_VOL_SHIFT,
|
|
0xbf, 0, digital_tlv),
|
|
SOC_DOUBLE_R_TLV("OUT3 Digital Volume", ARIZONA_DAC_DIGITAL_VOLUME_3L,
|
|
ARIZONA_DAC_DIGITAL_VOLUME_3R, ARIZONA_OUT3L_VOL_SHIFT,
|
|
0xbf, 0, digital_tlv),
|
|
SOC_DOUBLE_R_TLV("Speaker Digital Volume", ARIZONA_DAC_DIGITAL_VOLUME_4L,
|
|
ARIZONA_DAC_DIGITAL_VOLUME_4R, ARIZONA_OUT4L_VOL_SHIFT,
|
|
0xbf, 0, digital_tlv),
|
|
SOC_DOUBLE_R_TLV("SPKDAT1 Digital Volume", ARIZONA_DAC_DIGITAL_VOLUME_5L,
|
|
ARIZONA_DAC_DIGITAL_VOLUME_5R, ARIZONA_OUT5L_VOL_SHIFT,
|
|
0xbf, 0, digital_tlv),
|
|
SOC_DOUBLE_R_TLV("SPKDAT2 Digital Volume", ARIZONA_DAC_DIGITAL_VOLUME_6L,
|
|
ARIZONA_DAC_DIGITAL_VOLUME_6R, ARIZONA_OUT6L_VOL_SHIFT,
|
|
0xbf, 0, digital_tlv),
|
|
|
|
SOC_DOUBLE_R_RANGE_TLV("HPOUT1 Volume", ARIZONA_OUTPUT_PATH_CONFIG_1L,
|
|
ARIZONA_OUTPUT_PATH_CONFIG_1R,
|
|
ARIZONA_OUT1L_PGA_VOL_SHIFT,
|
|
0x34, 0x40, 0, ana_tlv),
|
|
SOC_DOUBLE_R_RANGE_TLV("OUT2 Volume", ARIZONA_OUTPUT_PATH_CONFIG_2L,
|
|
ARIZONA_OUTPUT_PATH_CONFIG_2R,
|
|
ARIZONA_OUT2L_PGA_VOL_SHIFT,
|
|
0x34, 0x40, 0, ana_tlv),
|
|
SOC_DOUBLE_R_RANGE_TLV("OUT3 Volume", ARIZONA_OUTPUT_PATH_CONFIG_3L,
|
|
ARIZONA_OUTPUT_PATH_CONFIG_3R,
|
|
ARIZONA_OUT3L_PGA_VOL_SHIFT, 0x34, 0x40, 0, ana_tlv),
|
|
|
|
SOC_DOUBLE("SPKDAT1 Switch", ARIZONA_PDM_SPK1_CTRL_1, ARIZONA_SPK1L_MUTE_SHIFT,
|
|
ARIZONA_SPK1R_MUTE_SHIFT, 1, 1),
|
|
SOC_DOUBLE("SPKDAT2 Switch", ARIZONA_PDM_SPK2_CTRL_1, ARIZONA_SPK2L_MUTE_SHIFT,
|
|
ARIZONA_SPK2R_MUTE_SHIFT, 1, 1),
|
|
|
|
SOC_ENUM("Output Ramp Up", arizona_out_vi_ramp),
|
|
SOC_ENUM("Output Ramp Down", arizona_out_vd_ramp),
|
|
|
|
SOC_SINGLE("Noise Gate Switch", ARIZONA_NOISE_GATE_CONTROL,
|
|
ARIZONA_NGATE_ENA_SHIFT, 1, 0),
|
|
SOC_SINGLE_TLV("Noise Gate Threshold Volume", ARIZONA_NOISE_GATE_CONTROL,
|
|
ARIZONA_NGATE_THR_SHIFT, 7, 1, ng_tlv),
|
|
SOC_ENUM("Noise Gate Hold", arizona_ng_hold),
|
|
|
|
WM5110_NG_SRC("HPOUT1L", ARIZONA_NOISE_GATE_SELECT_1L),
|
|
WM5110_NG_SRC("HPOUT1R", ARIZONA_NOISE_GATE_SELECT_1R),
|
|
WM5110_NG_SRC("HPOUT2L", ARIZONA_NOISE_GATE_SELECT_2L),
|
|
WM5110_NG_SRC("HPOUT2R", ARIZONA_NOISE_GATE_SELECT_2R),
|
|
WM5110_NG_SRC("HPOUT3L", ARIZONA_NOISE_GATE_SELECT_3L),
|
|
WM5110_NG_SRC("HPOUT3R", ARIZONA_NOISE_GATE_SELECT_3R),
|
|
WM5110_NG_SRC("SPKOUTL", ARIZONA_NOISE_GATE_SELECT_4L),
|
|
WM5110_NG_SRC("SPKOUTR", ARIZONA_NOISE_GATE_SELECT_4R),
|
|
WM5110_NG_SRC("SPKDAT1L", ARIZONA_NOISE_GATE_SELECT_5L),
|
|
WM5110_NG_SRC("SPKDAT1R", ARIZONA_NOISE_GATE_SELECT_5R),
|
|
WM5110_NG_SRC("SPKDAT2L", ARIZONA_NOISE_GATE_SELECT_6L),
|
|
WM5110_NG_SRC("SPKDAT2R", ARIZONA_NOISE_GATE_SELECT_6R),
|
|
|
|
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("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(EQ3, ARIZONA_EQ3MIX_INPUT_1_SOURCE);
|
|
ARIZONA_MIXER_ENUMS(EQ4, ARIZONA_EQ4MIX_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(Mic, ARIZONA_MICMIX_INPUT_1_SOURCE);
|
|
ARIZONA_MIXER_ENUMS(Noise, ARIZONA_NOISEMIX_INPUT_1_SOURCE);
|
|
|
|
ARIZONA_MIXER_ENUMS(PWM1, ARIZONA_PWM1MIX_INPUT_1_SOURCE);
|
|
ARIZONA_MIXER_ENUMS(PWM2, ARIZONA_PWM2MIX_INPUT_1_SOURCE);
|
|
|
|
ARIZONA_MIXER_ENUMS(OUT1L, ARIZONA_OUT1LMIX_INPUT_1_SOURCE);
|
|
ARIZONA_MIXER_ENUMS(OUT1R, ARIZONA_OUT1RMIX_INPUT_1_SOURCE);
|
|
ARIZONA_MIXER_ENUMS(OUT2L, ARIZONA_OUT2LMIX_INPUT_1_SOURCE);
|
|
ARIZONA_MIXER_ENUMS(OUT2R, ARIZONA_OUT2RMIX_INPUT_1_SOURCE);
|
|
ARIZONA_MIXER_ENUMS(OUT3L, ARIZONA_OUT3LMIX_INPUT_1_SOURCE);
|
|
ARIZONA_MIXER_ENUMS(OUT3R, ARIZONA_OUT3RMIX_INPUT_1_SOURCE);
|
|
ARIZONA_MIXER_ENUMS(SPKOUTL, ARIZONA_OUT4LMIX_INPUT_1_SOURCE);
|
|
ARIZONA_MIXER_ENUMS(SPKOUTR, ARIZONA_OUT4RMIX_INPUT_1_SOURCE);
|
|
ARIZONA_MIXER_ENUMS(SPKDAT1L, ARIZONA_OUT5LMIX_INPUT_1_SOURCE);
|
|
ARIZONA_MIXER_ENUMS(SPKDAT1R, ARIZONA_OUT5RMIX_INPUT_1_SOURCE);
|
|
ARIZONA_MIXER_ENUMS(SPKDAT2L, ARIZONA_OUT6LMIX_INPUT_1_SOURCE);
|
|
ARIZONA_MIXER_ENUMS(SPKDAT2R, ARIZONA_OUT6RMIX_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(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);
|
|
|
|
static const char *wm5110_aec_loopback_texts[] = {
|
|
"HPOUT1L", "HPOUT1R", "HPOUT2L", "HPOUT2R", "HPOUT3L", "HPOUT3R",
|
|
"SPKOUTL", "SPKOUTR", "SPKDAT1L", "SPKDAT1R", "SPKDAT2L", "SPKDAT2R",
|
|
};
|
|
|
|
static const unsigned int wm5110_aec_loopback_values[] = {
|
|
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11,
|
|
};
|
|
|
|
static const struct soc_enum wm5110_aec_loopback =
|
|
SOC_VALUE_ENUM_SINGLE(ARIZONA_DAC_AEC_CONTROL_1,
|
|
ARIZONA_AEC_LOOPBACK_SRC_SHIFT, 0xf,
|
|
ARRAY_SIZE(wm5110_aec_loopback_texts),
|
|
wm5110_aec_loopback_texts,
|
|
wm5110_aec_loopback_values);
|
|
|
|
static const struct snd_kcontrol_new wm5110_aec_loopback_mux =
|
|
SOC_DAPM_VALUE_ENUM("AEC Loopback", wm5110_aec_loopback);
|
|
|
|
static const struct snd_soc_dapm_widget wm5110_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("DBVDD2", 0, 0),
|
|
SND_SOC_DAPM_REGULATOR_SUPPLY("DBVDD3", 0, 0),
|
|
SND_SOC_DAPM_REGULATOR_SUPPLY("CPVDD", 20, 0),
|
|
SND_SOC_DAPM_REGULATOR_SUPPLY("MICVDD", 0, SND_SOC_DAPM_REGULATOR_BYPASS),
|
|
SND_SOC_DAPM_REGULATOR_SUPPLY("SPKVDDL", 0, 0),
|
|
SND_SOC_DAPM_REGULATOR_SUPPLY("SPKVDDR", 0, 0),
|
|
|
|
SND_SOC_DAPM_SIGGEN("TONE"),
|
|
SND_SOC_DAPM_SIGGEN("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_INPUT("IN3L"),
|
|
SND_SOC_DAPM_INPUT("IN3R"),
|
|
SND_SOC_DAPM_INPUT("IN4L"),
|
|
SND_SOC_DAPM_INPUT("IN4R"),
|
|
|
|
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_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_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_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_PMU),
|
|
SND_SOC_DAPM_PGA_E("IN3L PGA", ARIZONA_INPUT_ENABLES, ARIZONA_IN3L_ENA_SHIFT,
|
|
0, NULL, 0, arizona_in_ev,
|
|
SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU),
|
|
SND_SOC_DAPM_PGA_E("IN3R PGA", ARIZONA_INPUT_ENABLES, ARIZONA_IN3R_ENA_SHIFT,
|
|
0, NULL, 0, arizona_in_ev,
|
|
SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU),
|
|
SND_SOC_DAPM_PGA_E("IN4L PGA", ARIZONA_INPUT_ENABLES, ARIZONA_IN4L_ENA_SHIFT,
|
|
0, NULL, 0, arizona_in_ev,
|
|
SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU),
|
|
SND_SOC_DAPM_PGA_E("IN4R PGA", ARIZONA_INPUT_ENABLES, ARIZONA_IN4R_ENA_SHIFT,
|
|
0, NULL, 0, arizona_in_ev,
|
|
SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU),
|
|
|
|
SND_SOC_DAPM_SUPPLY("MICBIAS1", ARIZONA_MIC_BIAS_CTRL_1,
|
|
ARIZONA_MICB1_ENA_SHIFT, 0, NULL, 0),
|
|
SND_SOC_DAPM_SUPPLY("MICBIAS2", ARIZONA_MIC_BIAS_CTRL_2,
|
|
ARIZONA_MICB1_ENA_SHIFT, 0, NULL, 0),
|
|
SND_SOC_DAPM_SUPPLY("MICBIAS3", ARIZONA_MIC_BIAS_CTRL_3,
|
|
ARIZONA_MICB1_ENA_SHIFT, 0, NULL, 0),
|
|
|
|
SND_SOC_DAPM_PGA("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("Mic Mute Mixer", ARIZONA_MIC_NOISE_MIX_CONTROL_1,
|
|
ARIZONA_MICMUTE_MIX_ENA_SHIFT, 0, NULL, 0),
|
|
|
|
SND_SOC_DAPM_PGA("EQ1", ARIZONA_EQ1_1, ARIZONA_EQ1_ENA_SHIFT, 0, NULL, 0),
|
|
SND_SOC_DAPM_PGA("EQ2", ARIZONA_EQ2_1, ARIZONA_EQ2_ENA_SHIFT, 0, NULL, 0),
|
|
SND_SOC_DAPM_PGA("EQ3", ARIZONA_EQ3_1, ARIZONA_EQ3_ENA_SHIFT, 0, NULL, 0),
|
|
SND_SOC_DAPM_PGA("EQ4", ARIZONA_EQ4_1, ARIZONA_EQ4_ENA_SHIFT, 0, NULL, 0),
|
|
|
|
SND_SOC_DAPM_PGA("DRC1L", ARIZONA_DRC1_CTRL1, ARIZONA_DRC1L_ENA_SHIFT, 0,
|
|
NULL, 0),
|
|
SND_SOC_DAPM_PGA("DRC1R", ARIZONA_DRC1_CTRL1, ARIZONA_DRC1R_ENA_SHIFT, 0,
|
|
NULL, 0),
|
|
SND_SOC_DAPM_PGA("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),
|
|
|
|
SND_SOC_DAPM_VALUE_MUX("AEC Loopback", ARIZONA_DAC_AEC_CONTROL_1,
|
|
ARIZONA_AEC_LOOPBACK_ENA, 0, &wm5110_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_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_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", ARIZONA_OUTPUT_ENABLES_1,
|
|
ARIZONA_OUT1L_ENA_SHIFT, 0, NULL, 0, arizona_out_ev,
|
|
SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU),
|
|
SND_SOC_DAPM_PGA_E("OUT1R", ARIZONA_OUTPUT_ENABLES_1,
|
|
ARIZONA_OUT1R_ENA_SHIFT, 0, NULL, 0, arizona_out_ev,
|
|
SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU),
|
|
SND_SOC_DAPM_PGA_E("OUT2L", ARIZONA_OUTPUT_ENABLES_1,
|
|
ARIZONA_OUT2L_ENA_SHIFT, 0, NULL, 0, arizona_out_ev,
|
|
SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU),
|
|
SND_SOC_DAPM_PGA_E("OUT2R", ARIZONA_OUTPUT_ENABLES_1,
|
|
ARIZONA_OUT2R_ENA_SHIFT, 0, NULL, 0, arizona_out_ev,
|
|
SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU),
|
|
SND_SOC_DAPM_PGA_E("OUT3L", ARIZONA_OUTPUT_ENABLES_1,
|
|
ARIZONA_OUT3L_ENA_SHIFT, 0, NULL, 0, arizona_out_ev,
|
|
SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU),
|
|
SND_SOC_DAPM_PGA_E("OUT3R", ARIZONA_OUTPUT_ENABLES_1,
|
|
ARIZONA_OUT3R_ENA_SHIFT, 0, NULL, 0, arizona_out_ev,
|
|
SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU),
|
|
SND_SOC_DAPM_PGA_E("OUT4L", ARIZONA_OUTPUT_ENABLES_1,
|
|
ARIZONA_OUT4L_ENA_SHIFT, 0, NULL, 0, arizona_out_ev,
|
|
SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU),
|
|
SND_SOC_DAPM_PGA_E("OUT4R", ARIZONA_OUTPUT_ENABLES_1,
|
|
ARIZONA_OUT4R_ENA_SHIFT, 0, NULL, 0, arizona_out_ev,
|
|
SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU),
|
|
SND_SOC_DAPM_PGA_E("OUT5L", ARIZONA_OUTPUT_ENABLES_1,
|
|
ARIZONA_OUT5L_ENA_SHIFT, 0, NULL, 0, arizona_out_ev,
|
|
SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU),
|
|
SND_SOC_DAPM_PGA_E("OUT5R", ARIZONA_OUTPUT_ENABLES_1,
|
|
ARIZONA_OUT5R_ENA_SHIFT, 0, NULL, 0, arizona_out_ev,
|
|
SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU),
|
|
SND_SOC_DAPM_PGA_E("OUT6L", ARIZONA_OUTPUT_ENABLES_1,
|
|
ARIZONA_OUT6L_ENA_SHIFT, 0, NULL, 0, arizona_out_ev,
|
|
SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU),
|
|
SND_SOC_DAPM_PGA_E("OUT6R", ARIZONA_OUTPUT_ENABLES_1,
|
|
ARIZONA_OUT6R_ENA_SHIFT, 0, NULL, 0, arizona_out_ev,
|
|
SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU),
|
|
|
|
ARIZONA_MIXER_WIDGETS(EQ1, "EQ1"),
|
|
ARIZONA_MIXER_WIDGETS(EQ2, "EQ2"),
|
|
ARIZONA_MIXER_WIDGETS(EQ3, "EQ3"),
|
|
ARIZONA_MIXER_WIDGETS(EQ4, "EQ4"),
|
|
|
|
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(Mic, "Mic"),
|
|
ARIZONA_MIXER_WIDGETS(Noise, "Noise"),
|
|
|
|
ARIZONA_MIXER_WIDGETS(PWM1, "PWM1"),
|
|
ARIZONA_MIXER_WIDGETS(PWM2, "PWM2"),
|
|
|
|
ARIZONA_MIXER_WIDGETS(OUT1L, "HPOUT1L"),
|
|
ARIZONA_MIXER_WIDGETS(OUT1R, "HPOUT1R"),
|
|
ARIZONA_MIXER_WIDGETS(OUT2L, "HPOUT2L"),
|
|
ARIZONA_MIXER_WIDGETS(OUT2R, "HPOUT2R"),
|
|
ARIZONA_MIXER_WIDGETS(OUT3L, "HPOUT3L"),
|
|
ARIZONA_MIXER_WIDGETS(OUT3R, "HPOUT3R"),
|
|
ARIZONA_MIXER_WIDGETS(SPKOUTL, "SPKOUTL"),
|
|
ARIZONA_MIXER_WIDGETS(SPKOUTR, "SPKOUTR"),
|
|
ARIZONA_MIXER_WIDGETS(SPKDAT1L, "SPKDAT1L"),
|
|
ARIZONA_MIXER_WIDGETS(SPKDAT1R, "SPKDAT1R"),
|
|
ARIZONA_MIXER_WIDGETS(SPKDAT2L, "SPKDAT2L"),
|
|
ARIZONA_MIXER_WIDGETS(SPKDAT2R, "SPKDAT2R"),
|
|
|
|
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(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"),
|
|
|
|
SND_SOC_DAPM_OUTPUT("HPOUT1L"),
|
|
SND_SOC_DAPM_OUTPUT("HPOUT1R"),
|
|
SND_SOC_DAPM_OUTPUT("HPOUT2L"),
|
|
SND_SOC_DAPM_OUTPUT("HPOUT2R"),
|
|
SND_SOC_DAPM_OUTPUT("HPOUT3L"),
|
|
SND_SOC_DAPM_OUTPUT("HPOUT3R"),
|
|
SND_SOC_DAPM_OUTPUT("SPKOUTLN"),
|
|
SND_SOC_DAPM_OUTPUT("SPKOUTLP"),
|
|
SND_SOC_DAPM_OUTPUT("SPKOUTRN"),
|
|
SND_SOC_DAPM_OUTPUT("SPKOUTRP"),
|
|
SND_SOC_DAPM_OUTPUT("SPKDAT1L"),
|
|
SND_SOC_DAPM_OUTPUT("SPKDAT1R"),
|
|
SND_SOC_DAPM_OUTPUT("SPKDAT2L"),
|
|
SND_SOC_DAPM_OUTPUT("SPKDAT2R"),
|
|
};
|
|
|
|
#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, "IN3L", "IN3L PGA" }, \
|
|
{ name, "IN3R", "IN3R PGA" }, \
|
|
{ name, "IN4L", "IN4L PGA" }, \
|
|
{ name, "IN4R", "IN4R PGA" }, \
|
|
{ name, "Mic Mute Mixer", "Mic Mute Mixer" }, \
|
|
{ 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, "AIF3RX1", "AIF3RX1" }, \
|
|
{ name, "AIF3RX2", "AIF3RX2" }, \
|
|
{ name, "EQ1", "EQ1" }, \
|
|
{ name, "EQ2", "EQ2" }, \
|
|
{ name, "EQ3", "EQ3" }, \
|
|
{ name, "EQ4", "EQ4" }, \
|
|
{ name, "DRC1L", "DRC1L" }, \
|
|
{ name, "DRC1R", "DRC1R" }, \
|
|
{ name, "DRC2L", "DRC2L" }, \
|
|
{ name, "DRC2R", "DRC2R" }, \
|
|
{ name, "LHPF1", "LHPF1" }, \
|
|
{ name, "LHPF2", "LHPF2" }, \
|
|
{ name, "LHPF3", "LHPF3" }, \
|
|
{ name, "LHPF4", "LHPF4" }, \
|
|
{ name, "ASRC1L", "ASRC1L" }, \
|
|
{ name, "ASRC1R", "ASRC1R" }, \
|
|
{ name, "ASRC2L", "ASRC2L" }, \
|
|
{ name, "ASRC2R", "ASRC2R" }
|
|
|
|
static const struct snd_soc_dapm_route wm5110_dapm_routes[] = {
|
|
{ "AIF2 Capture", NULL, "DBVDD2" },
|
|
{ "AIF2 Playback", NULL, "DBVDD2" },
|
|
|
|
{ "AIF3 Capture", NULL, "DBVDD3" },
|
|
{ "AIF3 Playback", NULL, "DBVDD3" },
|
|
|
|
{ "OUT1L", NULL, "CPVDD" },
|
|
{ "OUT1R", NULL, "CPVDD" },
|
|
{ "OUT2L", NULL, "CPVDD" },
|
|
{ "OUT2R", NULL, "CPVDD" },
|
|
{ "OUT3L", NULL, "CPVDD" },
|
|
{ "OUT3R", NULL, "CPVDD" },
|
|
|
|
{ "OUT4L", NULL, "SPKVDDL" },
|
|
{ "OUT4R", NULL, "SPKVDDR" },
|
|
|
|
{ "OUT1L", NULL, "SYSCLK" },
|
|
{ "OUT1R", NULL, "SYSCLK" },
|
|
{ "OUT2L", NULL, "SYSCLK" },
|
|
{ "OUT2R", NULL, "SYSCLK" },
|
|
{ "OUT3L", NULL, "SYSCLK" },
|
|
{ "OUT4L", NULL, "SYSCLK" },
|
|
{ "OUT4R", NULL, "SYSCLK" },
|
|
{ "OUT5L", NULL, "SYSCLK" },
|
|
{ "OUT5R", NULL, "SYSCLK" },
|
|
{ "OUT6L", NULL, "SYSCLK" },
|
|
{ "OUT6R", NULL, "SYSCLK" },
|
|
|
|
{ "MICBIAS1", NULL, "MICVDD" },
|
|
{ "MICBIAS2", NULL, "MICVDD" },
|
|
{ "MICBIAS3", NULL, "MICVDD" },
|
|
|
|
{ "Noise Generator", NULL, "NOISE" },
|
|
{ "Tone Generator 1", NULL, "TONE" },
|
|
{ "Tone Generator 2", NULL, "TONE" },
|
|
|
|
{ "Mic Mute Mixer", NULL, "Noise Mixer" },
|
|
{ "Mic Mute Mixer", NULL, "Mic Mixer" },
|
|
|
|
{ "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" },
|
|
|
|
{ "AIF2RX1", NULL, "AIF2 Playback" },
|
|
{ "AIF2RX2", 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" },
|
|
|
|
{ "IN1L PGA", NULL, "IN1L" },
|
|
{ "IN1R PGA", NULL, "IN1R" },
|
|
|
|
{ "IN2L PGA", NULL, "IN2L" },
|
|
{ "IN2R PGA", NULL, "IN2R" },
|
|
|
|
{ "IN3L PGA", NULL, "IN3L" },
|
|
{ "IN3R PGA", NULL, "IN3R" },
|
|
|
|
{ "IN4L PGA", NULL, "IN4L" },
|
|
{ "IN4R PGA", NULL, "IN4R" },
|
|
|
|
ARIZONA_MIXER_ROUTES("OUT1L", "HPOUT1L"),
|
|
ARIZONA_MIXER_ROUTES("OUT1R", "HPOUT1R"),
|
|
ARIZONA_MIXER_ROUTES("OUT2L", "HPOUT2L"),
|
|
ARIZONA_MIXER_ROUTES("OUT2R", "HPOUT2R"),
|
|
ARIZONA_MIXER_ROUTES("OUT3L", "HPOUT3L"),
|
|
ARIZONA_MIXER_ROUTES("OUT3R", "HPOUT3R"),
|
|
|
|
ARIZONA_MIXER_ROUTES("OUT4L", "SPKOUTL"),
|
|
ARIZONA_MIXER_ROUTES("OUT4R", "SPKOUTR"),
|
|
ARIZONA_MIXER_ROUTES("OUT5L", "SPKDAT1L"),
|
|
ARIZONA_MIXER_ROUTES("OUT5R", "SPKDAT1R"),
|
|
ARIZONA_MIXER_ROUTES("OUT6L", "SPKDAT2L"),
|
|
ARIZONA_MIXER_ROUTES("OUT6R", "SPKDAT2R"),
|
|
|
|
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("AIF3TX1", "AIF3TX1"),
|
|
ARIZONA_MIXER_ROUTES("AIF3TX2", "AIF3TX2"),
|
|
|
|
ARIZONA_MIXER_ROUTES("EQ1", "EQ1"),
|
|
ARIZONA_MIXER_ROUTES("EQ2", "EQ2"),
|
|
ARIZONA_MIXER_ROUTES("EQ3", "EQ3"),
|
|
ARIZONA_MIXER_ROUTES("EQ4", "EQ4"),
|
|
|
|
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"),
|
|
ARIZONA_MUX_ROUTES("ASRC1R"),
|
|
ARIZONA_MUX_ROUTES("ASRC2L"),
|
|
ARIZONA_MUX_ROUTES("ASRC2R"),
|
|
|
|
{ "HPOUT1L", NULL, "OUT1L" },
|
|
{ "HPOUT1R", NULL, "OUT1R" },
|
|
|
|
{ "HPOUT2L", NULL, "OUT2L" },
|
|
{ "HPOUT2R", NULL, "OUT2R" },
|
|
|
|
{ "HPOUT3L", NULL, "OUT3L" },
|
|
{ "HPOUT3R", NULL, "OUT3L" },
|
|
|
|
{ "SPKOUTLN", NULL, "OUT4L" },
|
|
{ "SPKOUTLP", NULL, "OUT4L" },
|
|
|
|
{ "SPKOUTRN", NULL, "OUT4R" },
|
|
{ "SPKOUTRP", NULL, "OUT4R" },
|
|
|
|
{ "SPKDAT1L", NULL, "OUT5L" },
|
|
{ "SPKDAT1R", NULL, "OUT5R" },
|
|
|
|
{ "SPKDAT2L", NULL, "OUT6L" },
|
|
{ "SPKDAT2R", NULL, "OUT6R" },
|
|
};
|
|
|
|
static int wm5110_set_fll(struct snd_soc_codec *codec, int fll_id, int source,
|
|
unsigned int Fref, unsigned int Fout)
|
|
{
|
|
struct wm5110_priv *wm5110 = snd_soc_codec_get_drvdata(codec);
|
|
|
|
switch (fll_id) {
|
|
case WM5110_FLL1:
|
|
return arizona_set_fll(&wm5110->fll[0], source, Fref, Fout);
|
|
case WM5110_FLL2:
|
|
return arizona_set_fll(&wm5110->fll[1], source, Fref, Fout);
|
|
default:
|
|
return -EINVAL;
|
|
}
|
|
}
|
|
|
|
#define WM5110_RATES SNDRV_PCM_RATE_8000_192000
|
|
|
|
#define WM5110_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 wm5110_dai[] = {
|
|
{
|
|
.name = "wm5110-aif1",
|
|
.id = 1,
|
|
.base = ARIZONA_AIF1_BCLK_CTRL,
|
|
.playback = {
|
|
.stream_name = "AIF1 Playback",
|
|
.channels_min = 1,
|
|
.channels_max = 8,
|
|
.rates = WM5110_RATES,
|
|
.formats = WM5110_FORMATS,
|
|
},
|
|
.capture = {
|
|
.stream_name = "AIF1 Capture",
|
|
.channels_min = 1,
|
|
.channels_max = 8,
|
|
.rates = WM5110_RATES,
|
|
.formats = WM5110_FORMATS,
|
|
},
|
|
.ops = &arizona_dai_ops,
|
|
.symmetric_rates = 1,
|
|
},
|
|
{
|
|
.name = "wm5110-aif2",
|
|
.id = 2,
|
|
.base = ARIZONA_AIF2_BCLK_CTRL,
|
|
.playback = {
|
|
.stream_name = "AIF2 Playback",
|
|
.channels_min = 1,
|
|
.channels_max = 2,
|
|
.rates = WM5110_RATES,
|
|
.formats = WM5110_FORMATS,
|
|
},
|
|
.capture = {
|
|
.stream_name = "AIF2 Capture",
|
|
.channels_min = 1,
|
|
.channels_max = 2,
|
|
.rates = WM5110_RATES,
|
|
.formats = WM5110_FORMATS,
|
|
},
|
|
.ops = &arizona_dai_ops,
|
|
.symmetric_rates = 1,
|
|
},
|
|
{
|
|
.name = "wm5110-aif3",
|
|
.id = 3,
|
|
.base = ARIZONA_AIF3_BCLK_CTRL,
|
|
.playback = {
|
|
.stream_name = "AIF3 Playback",
|
|
.channels_min = 1,
|
|
.channels_max = 2,
|
|
.rates = WM5110_RATES,
|
|
.formats = WM5110_FORMATS,
|
|
},
|
|
.capture = {
|
|
.stream_name = "AIF3 Capture",
|
|
.channels_min = 1,
|
|
.channels_max = 2,
|
|
.rates = WM5110_RATES,
|
|
.formats = WM5110_FORMATS,
|
|
},
|
|
.ops = &arizona_dai_ops,
|
|
.symmetric_rates = 1,
|
|
},
|
|
};
|
|
|
|
static int wm5110_codec_probe(struct snd_soc_codec *codec)
|
|
{
|
|
struct wm5110_priv *priv = snd_soc_codec_get_drvdata(codec);
|
|
int ret;
|
|
|
|
codec->control_data = priv->core.arizona->regmap;
|
|
priv->core.arizona->dapm = &codec->dapm;
|
|
|
|
ret = snd_soc_codec_set_cache_io(codec, 32, 16, SND_SOC_REGMAP);
|
|
if (ret != 0)
|
|
return ret;
|
|
|
|
snd_soc_dapm_disable_pin(&codec->dapm, "HAPTICS");
|
|
|
|
priv->core.arizona->dapm = &codec->dapm;
|
|
|
|
return 0;
|
|
}
|
|
|
|
static int wm5110_codec_remove(struct snd_soc_codec *codec)
|
|
{
|
|
struct wm5110_priv *priv = snd_soc_codec_get_drvdata(codec);
|
|
|
|
priv->core.arizona->dapm = NULL;
|
|
|
|
return 0;
|
|
}
|
|
|
|
#define WM5110_DIG_VU 0x0200
|
|
|
|
static unsigned int wm5110_digital_vu[] = {
|
|
ARIZONA_ADC_DIGITAL_VOLUME_1L,
|
|
ARIZONA_ADC_DIGITAL_VOLUME_1R,
|
|
ARIZONA_ADC_DIGITAL_VOLUME_2L,
|
|
ARIZONA_ADC_DIGITAL_VOLUME_2R,
|
|
ARIZONA_ADC_DIGITAL_VOLUME_3L,
|
|
ARIZONA_ADC_DIGITAL_VOLUME_3R,
|
|
ARIZONA_ADC_DIGITAL_VOLUME_4L,
|
|
ARIZONA_ADC_DIGITAL_VOLUME_4R,
|
|
|
|
ARIZONA_DAC_DIGITAL_VOLUME_1L,
|
|
ARIZONA_DAC_DIGITAL_VOLUME_1R,
|
|
ARIZONA_DAC_DIGITAL_VOLUME_2L,
|
|
ARIZONA_DAC_DIGITAL_VOLUME_2R,
|
|
ARIZONA_DAC_DIGITAL_VOLUME_3L,
|
|
ARIZONA_DAC_DIGITAL_VOLUME_3R,
|
|
ARIZONA_DAC_DIGITAL_VOLUME_4L,
|
|
ARIZONA_DAC_DIGITAL_VOLUME_4R,
|
|
ARIZONA_DAC_DIGITAL_VOLUME_5L,
|
|
ARIZONA_DAC_DIGITAL_VOLUME_5R,
|
|
ARIZONA_DAC_DIGITAL_VOLUME_6L,
|
|
ARIZONA_DAC_DIGITAL_VOLUME_6R,
|
|
};
|
|
|
|
static struct snd_soc_codec_driver soc_codec_dev_wm5110 = {
|
|
.probe = wm5110_codec_probe,
|
|
.remove = wm5110_codec_remove,
|
|
|
|
.idle_bias_off = true,
|
|
|
|
.set_sysclk = arizona_set_sysclk,
|
|
.set_pll = wm5110_set_fll,
|
|
|
|
.controls = wm5110_snd_controls,
|
|
.num_controls = ARRAY_SIZE(wm5110_snd_controls),
|
|
.dapm_widgets = wm5110_dapm_widgets,
|
|
.num_dapm_widgets = ARRAY_SIZE(wm5110_dapm_widgets),
|
|
.dapm_routes = wm5110_dapm_routes,
|
|
.num_dapm_routes = ARRAY_SIZE(wm5110_dapm_routes),
|
|
};
|
|
|
|
static int wm5110_probe(struct platform_device *pdev)
|
|
{
|
|
struct arizona *arizona = dev_get_drvdata(pdev->dev.parent);
|
|
struct wm5110_priv *wm5110;
|
|
int i;
|
|
|
|
wm5110 = devm_kzalloc(&pdev->dev, sizeof(struct wm5110_priv),
|
|
GFP_KERNEL);
|
|
if (wm5110 == NULL)
|
|
return -ENOMEM;
|
|
platform_set_drvdata(pdev, wm5110);
|
|
|
|
wm5110->core.arizona = arizona;
|
|
|
|
for (i = 0; i < ARRAY_SIZE(wm5110->fll); i++)
|
|
wm5110->fll[i].vco_mult = 3;
|
|
|
|
arizona_init_fll(arizona, 1, ARIZONA_FLL1_CONTROL_1 - 1,
|
|
ARIZONA_IRQ_FLL1_LOCK, ARIZONA_IRQ_FLL1_CLOCK_OK,
|
|
&wm5110->fll[0]);
|
|
arizona_init_fll(arizona, 2, ARIZONA_FLL2_CONTROL_1 - 1,
|
|
ARIZONA_IRQ_FLL2_LOCK, ARIZONA_IRQ_FLL2_CLOCK_OK,
|
|
&wm5110->fll[1]);
|
|
|
|
for (i = 0; i < ARRAY_SIZE(wm5110_dai); i++)
|
|
arizona_init_dai(&wm5110->core, i);
|
|
|
|
/* Latch volume update bits */
|
|
for (i = 0; i < ARRAY_SIZE(wm5110_digital_vu); i++)
|
|
regmap_update_bits(arizona->regmap, wm5110_digital_vu[i],
|
|
WM5110_DIG_VU, WM5110_DIG_VU);
|
|
|
|
pm_runtime_enable(&pdev->dev);
|
|
pm_runtime_idle(&pdev->dev);
|
|
|
|
return snd_soc_register_codec(&pdev->dev, &soc_codec_dev_wm5110,
|
|
wm5110_dai, ARRAY_SIZE(wm5110_dai));
|
|
}
|
|
|
|
static int wm5110_remove(struct platform_device *pdev)
|
|
{
|
|
snd_soc_unregister_codec(&pdev->dev);
|
|
pm_runtime_disable(&pdev->dev);
|
|
|
|
return 0;
|
|
}
|
|
|
|
static struct platform_driver wm5110_codec_driver = {
|
|
.driver = {
|
|
.name = "wm5110-codec",
|
|
.owner = THIS_MODULE,
|
|
},
|
|
.probe = wm5110_probe,
|
|
.remove = wm5110_remove,
|
|
};
|
|
|
|
module_platform_driver(wm5110_codec_driver);
|
|
|
|
MODULE_DESCRIPTION("ASoC WM5110 driver");
|
|
MODULE_AUTHOR("Mark Brown <broonie@opensource.wolfsonmicro.com>");
|
|
MODULE_LICENSE("GPL");
|
|
MODULE_ALIAS("platform:wm5110-codec");
|