mirror of
https://github.com/torvalds/linux.git
synced 2024-12-27 21:33:00 +00:00
460dc1eecf
The biggest change in this update is the unification of HD-audio codec parsers. Now the HD-audio codec is parsed in a generic parser code which is invoked by each HD-audio codec driver. Some background information is found in David Henningsson's blog entry: http://voices.canonical.com/david.henningsson/2013/01/18/upcoming-changes-to-the-intel-hda-drivers/ Other than that, some random updates/fixes like USB-audio and a bunch of small AoC updates as usual. Highlights: - Unification of HD-audio parser code (aka generic parser) - Support of new Intel HD-audio controller, new IDT codecs - Fixes for HD-audio HDMI audio hotplug - Haswell HDMI audio fixup - Support of Creative CA0132 DSP code - A few fixes of HDSP driver - USB-audio fix for Roland A-PRO, M-Audio FT C600 - Support PM for aloop driver (and fixes Oops) - Compress API updates for gapless playback support For ASoC part: - Support for a wider range of hardware in the compressed stream code - The ability to mute capture streams as well as playback streams while inactive - DT support for AK4642, FSI, Samsung I2S and WM8962 - AC'97 support for Tegra - New driver for max98090, replacing the stub which was there - A new driver from Dialog Note that due to dependencies, DTification of DMA support for Samsung platforms (used only by the and I2S driver and SPI) is merged here as well. -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.19 (GNU/Linux) iQIcBAABAgAGBQJRJjy2AAoJEGwxgFQ9KSmk4EoP/RRslXfGAb+lrWeehmh9oHQL P4JX+Cgv4OFFxaVjU7IgdjBCCnUNZoQ/Nm8wnpDbF+qP7DTcryPnuwWH8oaHLFSJ +knbbbOShC6hxUzd+ZbxQpEn+4mupSC9+egzczz0wcK1kzAf8CO/rj17t3VxsoW/ Qa1yCWy6jbOmLu3JDpJTPyLfwA3x4/i3ViyTYfqgLP5kQHZZiv1eA9b682HFX9xQ uDQipb040k7wBLoeZosR8iF/EDuPHls8H2ASCmZw0K2scZgBok0SkI6BBwsCg2z3 VbD9EkZmobRHwmubfDV1yCti050YnwGUbrN9tNpdSdv2cogKCkkxQ+zL8PX6Qf0l D1neA9JJPhSMx5fufDnG5oTghx/XlHsTJKmrJNu8Gr/14pAmSbNF8iIOFfYju++2 LlpHLlwS4hxNYY0W3iAFTXi50BUng38tdhBCyZTgN2tSHaTwtdWvrVyizjpUa18N onjvFtceULtudddosJWkaKUSqHLN/CWmIWXufucfjxEk5exXjPBMhYTsvhmM3I5D zrK0GxUQqey7RToa48Sxs0iL269labUwH/8H1iMTL3/9UCCOqVRKR3X7NdGi3xtK EiEiCeNoZX8PojGqSEkmRifOJ19gBxchZDNO4ruct0Omc4Jn/nOlHbi4jXghgr9H D62m5PriiCnyBswjzKaX =nIPc -----END PGP SIGNATURE----- Merge tag 'sound-3.9' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound Pull sound updates from Takashi Iwai: "The biggest change in this update is the unification of HD-audio codec parsers. Now the HD-audio codec is parsed in a generic parser code which is invoked by each HD-audio codec driver. Some background information is found in David Henningsson's blog entry: http://voices.canonical.com/david.henningsson/2013/01/18/upcoming-changes-to-the-intel-hda-drivers/ Other than that, some random updates/fixes like USB-audio and a bunch of small AoC updates as usual. Highlights: - Unification of HD-audio parser code (aka generic parser) - Support of new Intel HD-audio controller, new IDT codecs - Fixes for HD-audio HDMI audio hotplug - Haswell HDMI audio fixup - Support of Creative CA0132 DSP code - A few fixes of HDSP driver - USB-audio fix for Roland A-PRO, M-Audio FT C600 - Support PM for aloop driver (and fixes Oops) - Compress API updates for gapless playback support For ASoC part: - Support for a wider range of hardware in the compressed stream code - The ability to mute capture streams as well as playback streams while inactive - DT support for AK4642, FSI, Samsung I2S and WM8962 - AC'97 support for Tegra - New driver for max98090, replacing the stub which was there - A new driver from Dialog Note that due to dependencies, DTification of DMA support for Samsung platforms (used only by the and I2S driver and SPI) is merged here as well." Fix up trivial conflict in drivers/spi/spi-s3c64xx.c due to removed code being changed. * tag 'sound-3.9' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound: (453 commits) ALSA: usb: Fix Processing Unit Descriptor parsers ALSA: hda - hdmi: Notify userspace when ELD control changes ALSA: hda - hdmi: Protect ELD buffer ALSA: hda - hdmi: Refactor hdmi_eld into parsed_hdmi_eld ALSA: hda - hdmi: Do not expose eld data when eld is invalid ALSA: hda - hdmi: ELD shouldn't be valid after unplug ALSA: hda - Fix the silent speaker output on Fujitsu S7020 laptop ALSA: hda - add quirks for mute LED on two HP machines ALSA: usb/quirks, fix out-of-bounds access ASoC: codecs: Add da7213 codec ALSA: au88x0 - Define channel map for au88x0 ALSA: compress: add support for gapless playback ALSA: hda - Remove speaker clicks on CX20549 ALSA: hda - Disable runtime PM for Intel 5 Series/3400 ALSA: hda - Increase badness for missing multi-io ASoC: arizona: Automatically manage input mutes ALSA: hda - Fix broken workaround for HDMI/SPDIF conflicts ALSA: hda/ca0132 - Add missing \n to debug prints ALSA: hda/ca0132 - Fix type of INVALID_CHIP_ADDRESS ALSA: hda - update documentation for no-primary-hp fixup ...
1092 lines
40 KiB
C
1092 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"),
|
|
|
|
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, "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" },
|
|
|
|
{ "MICSUPP", NULL, "SYSCLK" },
|
|
};
|
|
|
|
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");
|