Commit ba67761c authored by Mark Brown's avatar Mark Brown

Merge remote-tracking branches 'asoc/topic/tlv320aic23',...

Merge remote-tracking branches 'asoc/topic/tlv320aic23', 'asoc/topic/tlv320aic26', 'asoc/topic/tlv320aic32x4', 'asoc/topic/tlv320aic3x', 'asoc/topic/tlv320dac33', 'asoc/topic/twl4030', 'asoc/topic/twl6040', 'asoc/topic/uda1380', 'asoc/topic/wl1273' and 'asoc/topic/wm2200' into asoc-next
Texas Instruments - tlv320aic32x4 Codec module
The tlv320aic32x4 serial control bus communicates through I2C protocols
Required properties:
- compatible: Should be "ti,tlv320aic32x4"
- reg: I2C slave address
- supply-*: Required supply regulators are:
"iov" - digital IO power supply
"ldoin" - LDO power supply
"dv" - Digital core power supply
"av" - Analog core power supply
If you supply ldoin, dv and av are optional. Otherwise they are required
See regulator/regulator.txt for more information about the detailed binding
format.
Optional properties:
- reset-gpios: Reset-GPIO phandle with args as described in gpio/gpio.txt
- clocks/clock-names: Clock named 'mclk' for the master clock of the codec.
See clock/clock-bindings.txt for information about the detailed format.
Example:
codec: tlv320aic32x4@18 {
compatible = "ti,tlv320aic32x4";
reg = <0x18>;
clocks = <&clks 201>;
clock-names = "mclk";
};
...@@ -6,7 +6,6 @@ Required properties: ...@@ -6,7 +6,6 @@ Required properties:
- compatible - "string" - One of: - compatible - "string" - One of:
"ti,tlv320aic3x" - Generic TLV320AIC3x device "ti,tlv320aic3x" - Generic TLV320AIC3x device
"ti,tlv320aic32x4" - TLV320AIC32x4
"ti,tlv320aic33" - TLV320AIC33 "ti,tlv320aic33" - TLV320AIC33
"ti,tlv320aic3007" - TLV320AIC3007 "ti,tlv320aic3007" - TLV320AIC3007
"ti,tlv320aic3106" - TLV320AIC3106 "ti,tlv320aic3106" - TLV320AIC3106
......
...@@ -79,8 +79,8 @@ snd-soc-tlv320aic23-objs := tlv320aic23.o ...@@ -79,8 +79,8 @@ snd-soc-tlv320aic23-objs := tlv320aic23.o
snd-soc-tlv320aic23-i2c-objs := tlv320aic23-i2c.o snd-soc-tlv320aic23-i2c-objs := tlv320aic23-i2c.o
snd-soc-tlv320aic23-spi-objs := tlv320aic23-spi.o snd-soc-tlv320aic23-spi-objs := tlv320aic23-spi.o
snd-soc-tlv320aic26-objs := tlv320aic26.o snd-soc-tlv320aic26-objs := tlv320aic26.o
snd-soc-tlv320aic3x-objs := tlv320aic3x.o
snd-soc-tlv320aic32x4-objs := tlv320aic32x4.o snd-soc-tlv320aic32x4-objs := tlv320aic32x4.o
snd-soc-tlv320aic3x-objs := tlv320aic3x.o
snd-soc-tlv320dac33-objs := tlv320dac33.o snd-soc-tlv320dac33-objs := tlv320dac33.o
snd-soc-twl4030-objs := twl4030.o snd-soc-twl4030-objs := twl4030.o
snd-soc-twl6040-objs := twl6040.o snd-soc-twl6040-objs := twl6040.o
...@@ -223,8 +223,8 @@ obj-$(CONFIG_SND_SOC_TLV320AIC23) += snd-soc-tlv320aic23.o ...@@ -223,8 +223,8 @@ obj-$(CONFIG_SND_SOC_TLV320AIC23) += snd-soc-tlv320aic23.o
obj-$(CONFIG_SND_SOC_TLV320AIC23_I2C) += snd-soc-tlv320aic23-i2c.o obj-$(CONFIG_SND_SOC_TLV320AIC23_I2C) += snd-soc-tlv320aic23-i2c.o
obj-$(CONFIG_SND_SOC_TLV320AIC23_SPI) += snd-soc-tlv320aic23-spi.o obj-$(CONFIG_SND_SOC_TLV320AIC23_SPI) += snd-soc-tlv320aic23-spi.o
obj-$(CONFIG_SND_SOC_TLV320AIC26) += snd-soc-tlv320aic26.o obj-$(CONFIG_SND_SOC_TLV320AIC26) += snd-soc-tlv320aic26.o
obj-$(CONFIG_SND_SOC_TLV320AIC3X) += snd-soc-tlv320aic3x.o
obj-$(CONFIG_SND_SOC_TLV320AIC32X4) += snd-soc-tlv320aic32x4.o obj-$(CONFIG_SND_SOC_TLV320AIC32X4) += snd-soc-tlv320aic32x4.o
obj-$(CONFIG_SND_SOC_TLV320AIC3X) += snd-soc-tlv320aic3x.o
obj-$(CONFIG_SND_SOC_TLV320DAC33) += snd-soc-tlv320dac33.o obj-$(CONFIG_SND_SOC_TLV320DAC33) += snd-soc-tlv320dac33.o
obj-$(CONFIG_SND_SOC_TWL4030) += snd-soc-twl4030.o obj-$(CONFIG_SND_SOC_TWL4030) += snd-soc-twl4030.o
obj-$(CONFIG_SND_SOC_TWL6040) += snd-soc-twl6040.o obj-$(CONFIG_SND_SOC_TWL6040) += snd-soc-twl6040.o
......
...@@ -117,8 +117,7 @@ static const char *chan_mix[] = { ...@@ -117,8 +117,7 @@ static const char *chan_mix[] = {
"R L", "R L",
}; };
static const struct soc_enum cs42l51_chan_mix = static SOC_ENUM_SINGLE_EXT_DECL(cs42l51_chan_mix, chan_mix);
SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(chan_mix), chan_mix);
static const struct snd_kcontrol_new cs42l51_snd_controls[] = { static const struct snd_kcontrol_new cs42l51_snd_controls[] = {
SOC_DOUBLE_R_SX_TLV("PCM Playback Volume", SOC_DOUBLE_R_SX_TLV("PCM Playback Volume",
...@@ -174,22 +173,22 @@ static int cs42l51_pdn_event(struct snd_soc_dapm_widget *w, ...@@ -174,22 +173,22 @@ static int cs42l51_pdn_event(struct snd_soc_dapm_widget *w,
static const char *cs42l51_dac_names[] = {"Direct PCM", static const char *cs42l51_dac_names[] = {"Direct PCM",
"DSP PCM", "ADC"}; "DSP PCM", "ADC"};
static const struct soc_enum cs42l51_dac_mux_enum = static SOC_ENUM_SINGLE_DECL(cs42l51_dac_mux_enum,
SOC_ENUM_SINGLE(CS42L51_DAC_CTL, 6, 3, cs42l51_dac_names); CS42L51_DAC_CTL, 6, cs42l51_dac_names);
static const struct snd_kcontrol_new cs42l51_dac_mux_controls = static const struct snd_kcontrol_new cs42l51_dac_mux_controls =
SOC_DAPM_ENUM("Route", cs42l51_dac_mux_enum); SOC_DAPM_ENUM("Route", cs42l51_dac_mux_enum);
static const char *cs42l51_adcl_names[] = {"AIN1 Left", "AIN2 Left", static const char *cs42l51_adcl_names[] = {"AIN1 Left", "AIN2 Left",
"MIC Left", "MIC+preamp Left"}; "MIC Left", "MIC+preamp Left"};
static const struct soc_enum cs42l51_adcl_mux_enum = static SOC_ENUM_SINGLE_DECL(cs42l51_adcl_mux_enum,
SOC_ENUM_SINGLE(CS42L51_ADC_INPUT, 4, 4, cs42l51_adcl_names); CS42L51_ADC_INPUT, 4, cs42l51_adcl_names);
static const struct snd_kcontrol_new cs42l51_adcl_mux_controls = static const struct snd_kcontrol_new cs42l51_adcl_mux_controls =
SOC_DAPM_ENUM("Route", cs42l51_adcl_mux_enum); SOC_DAPM_ENUM("Route", cs42l51_adcl_mux_enum);
static const char *cs42l51_adcr_names[] = {"AIN1 Right", "AIN2 Right", static const char *cs42l51_adcr_names[] = {"AIN1 Right", "AIN2 Right",
"MIC Right", "MIC+preamp Right"}; "MIC Right", "MIC+preamp Right"};
static const struct soc_enum cs42l51_adcr_mux_enum = static SOC_ENUM_SINGLE_DECL(cs42l51_adcr_mux_enum,
SOC_ENUM_SINGLE(CS42L51_ADC_INPUT, 6, 4, cs42l51_adcr_names); CS42L51_ADC_INPUT, 6, cs42l51_adcr_names);
static const struct snd_kcontrol_new cs42l51_adcr_mux_controls = static const struct snd_kcontrol_new cs42l51_adcr_mux_controls =
SOC_DAPM_ENUM("Route", cs42l51_adcr_mux_enum); SOC_DAPM_ENUM("Route", cs42l51_adcr_mux_enum);
......
...@@ -25,7 +25,6 @@ static int aic23_spi_probe(struct spi_device *spi) ...@@ -25,7 +25,6 @@ static int aic23_spi_probe(struct spi_device *spi)
dev_dbg(&spi->dev, "probing tlv320aic23 spi device\n"); dev_dbg(&spi->dev, "probing tlv320aic23 spi device\n");
spi->bits_per_word = 16;
spi->mode = SPI_MODE_0; spi->mode = SPI_MODE_0;
ret = spi_setup(spi); ret = spi_setup(spi);
if (ret < 0) if (ret < 0)
......
...@@ -59,6 +59,7 @@ const struct regmap_config tlv320aic23_regmap = { ...@@ -59,6 +59,7 @@ const struct regmap_config tlv320aic23_regmap = {
.num_reg_defaults = ARRAY_SIZE(tlv320aic23_reg), .num_reg_defaults = ARRAY_SIZE(tlv320aic23_reg),
.cache_type = REGCACHE_RBTREE, .cache_type = REGCACHE_RBTREE,
}; };
EXPORT_SYMBOL(tlv320aic23_regmap);
static const char *rec_src_text[] = { "Line", "Mic" }; static const char *rec_src_text[] = { "Line", "Mic" };
static const char *deemph_text[] = {"None", "32Khz", "44.1Khz", "48Khz"}; static const char *deemph_text[] = {"None", "32Khz", "44.1Khz", "48Khz"};
...@@ -634,6 +635,7 @@ int tlv320aic23_probe(struct device *dev, struct regmap *regmap) ...@@ -634,6 +635,7 @@ int tlv320aic23_probe(struct device *dev, struct regmap *regmap)
return snd_soc_register_codec(dev, &soc_codec_dev_tlv320aic23, return snd_soc_register_codec(dev, &soc_codec_dev_tlv320aic23,
&tlv320aic23_dai, 1); &tlv320aic23_dai, 1);
} }
EXPORT_SYMBOL(tlv320aic23_probe);
MODULE_DESCRIPTION("ASoC TLV320AIC23 codec driver"); MODULE_DESCRIPTION("ASoC TLV320AIC23 codec driver");
MODULE_AUTHOR("Arun KS <arunks@mistralsolutions.com>"); MODULE_AUTHOR("Arun KS <arunks@mistralsolutions.com>");
......
...@@ -238,8 +238,9 @@ static struct snd_soc_dai_driver aic26_dai = { ...@@ -238,8 +238,9 @@ static struct snd_soc_dai_driver aic26_dai = {
* ALSA controls * ALSA controls
*/ */
static const char *aic26_capture_src_text[] = {"Mic", "Aux"}; static const char *aic26_capture_src_text[] = {"Mic", "Aux"};
static const struct soc_enum aic26_capture_src_enum = static SOC_ENUM_SINGLE_DECL(aic26_capture_src_enum,
SOC_ENUM_SINGLE(AIC26_REG_AUDIO_CTRL1, 12, 2, aic26_capture_src_text); AIC26_REG_AUDIO_CTRL1, 12,
aic26_capture_src_text);
static const struct snd_kcontrol_new aic26_snd_controls[] = { static const struct snd_kcontrol_new aic26_snd_controls[] = {
/* Output */ /* Output */
......
...@@ -29,9 +29,12 @@ ...@@ -29,9 +29,12 @@
#include <linux/delay.h> #include <linux/delay.h>
#include <linux/pm.h> #include <linux/pm.h>
#include <linux/gpio.h> #include <linux/gpio.h>
#include <linux/of_gpio.h>
#include <linux/i2c.h> #include <linux/i2c.h>
#include <linux/cdev.h> #include <linux/cdev.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/clk.h>
#include <linux/regulator/consumer.h>
#include <sound/tlv320aic32x4.h> #include <sound/tlv320aic32x4.h>
#include <sound/core.h> #include <sound/core.h>
...@@ -66,20 +69,32 @@ struct aic32x4_priv { ...@@ -66,20 +69,32 @@ struct aic32x4_priv {
u32 micpga_routing; u32 micpga_routing;
bool swapdacs; bool swapdacs;
int rstn_gpio; int rstn_gpio;
struct clk *mclk;
struct regulator *supply_ldo;
struct regulator *supply_iov;
struct regulator *supply_dv;
struct regulator *supply_av;
}; };
/* 0dB min, 1dB steps */
static DECLARE_TLV_DB_SCALE(tlv_step_1, 0, 100, 0);
/* 0dB min, 0.5dB steps */ /* 0dB min, 0.5dB steps */
static DECLARE_TLV_DB_SCALE(tlv_step_0_5, 0, 50, 0); static DECLARE_TLV_DB_SCALE(tlv_step_0_5, 0, 50, 0);
/* -63.5dB min, 0.5dB steps */
static DECLARE_TLV_DB_SCALE(tlv_pcm, -6350, 50, 0);
/* -6dB min, 1dB steps */
static DECLARE_TLV_DB_SCALE(tlv_driver_gain, -600, 100, 0);
/* -12dB min, 0.5dB steps */
static DECLARE_TLV_DB_SCALE(tlv_adc_vol, -1200, 50, 0);
static const struct snd_kcontrol_new aic32x4_snd_controls[] = { static const struct snd_kcontrol_new aic32x4_snd_controls[] = {
SOC_DOUBLE_R_TLV("PCM Playback Volume", AIC32X4_LDACVOL, SOC_DOUBLE_R_S_TLV("PCM Playback Volume", AIC32X4_LDACVOL,
AIC32X4_RDACVOL, 0, 0x30, 0, tlv_step_0_5), AIC32X4_RDACVOL, 0, -0x7f, 0x30, 7, 0, tlv_pcm),
SOC_DOUBLE_R_TLV("HP Driver Gain Volume", AIC32X4_HPLGAIN, SOC_DOUBLE_R_S_TLV("HP Driver Gain Volume", AIC32X4_HPLGAIN,
AIC32X4_HPRGAIN, 0, 0x1D, 0, tlv_step_1), AIC32X4_HPRGAIN, 0, -0x6, 0x1d, 5, 0,
SOC_DOUBLE_R_TLV("LO Driver Gain Volume", AIC32X4_LOLGAIN, tlv_driver_gain),
AIC32X4_LORGAIN, 0, 0x1D, 0, tlv_step_1), SOC_DOUBLE_R_S_TLV("LO Driver Gain Volume", AIC32X4_LOLGAIN,
AIC32X4_LORGAIN, 0, -0x6, 0x1d, 5, 0,
tlv_driver_gain),
SOC_DOUBLE_R("HP DAC Playback Switch", AIC32X4_HPLGAIN, SOC_DOUBLE_R("HP DAC Playback Switch", AIC32X4_HPLGAIN,
AIC32X4_HPRGAIN, 6, 0x01, 1), AIC32X4_HPRGAIN, 6, 0x01, 1),
SOC_DOUBLE_R("LO DAC Playback Switch", AIC32X4_LOLGAIN, SOC_DOUBLE_R("LO DAC Playback Switch", AIC32X4_LOLGAIN,
...@@ -90,8 +105,8 @@ static const struct snd_kcontrol_new aic32x4_snd_controls[] = { ...@@ -90,8 +105,8 @@ static const struct snd_kcontrol_new aic32x4_snd_controls[] = {
SOC_SINGLE("ADCFGA Left Mute Switch", AIC32X4_ADCFGA, 7, 1, 0), SOC_SINGLE("ADCFGA Left Mute Switch", AIC32X4_ADCFGA, 7, 1, 0),
SOC_SINGLE("ADCFGA Right Mute Switch", AIC32X4_ADCFGA, 3, 1, 0), SOC_SINGLE("ADCFGA Right Mute Switch", AIC32X4_ADCFGA, 3, 1, 0),
SOC_DOUBLE_R_TLV("ADC Level Volume", AIC32X4_LADCVOL, SOC_DOUBLE_R_S_TLV("ADC Level Volume", AIC32X4_LADCVOL,
AIC32X4_RADCVOL, 0, 0x28, 0, tlv_step_0_5), AIC32X4_RADCVOL, 0, -0x18, 0x28, 6, 0, tlv_adc_vol),
SOC_DOUBLE_R_TLV("PGA Level Volume", AIC32X4_LMICPGAVOL, SOC_DOUBLE_R_TLV("PGA Level Volume", AIC32X4_LMICPGAVOL,
AIC32X4_RMICPGAVOL, 0, 0x5f, 0, tlv_step_0_5), AIC32X4_RMICPGAVOL, 0, 0x5f, 0, tlv_step_0_5),
...@@ -480,8 +495,18 @@ static int aic32x4_mute(struct snd_soc_dai *dai, int mute) ...@@ -480,8 +495,18 @@ static int aic32x4_mute(struct snd_soc_dai *dai, int mute)
static int aic32x4_set_bias_level(struct snd_soc_codec *codec, static int aic32x4_set_bias_level(struct snd_soc_codec *codec,
enum snd_soc_bias_level level) enum snd_soc_bias_level level)
{ {
struct aic32x4_priv *aic32x4 = snd_soc_codec_get_drvdata(codec);
int ret;
switch (level) { switch (level) {
case SND_SOC_BIAS_ON: case SND_SOC_BIAS_ON:
/* Switch on master clock */
ret = clk_prepare_enable(aic32x4->mclk);
if (ret) {
dev_err(codec->dev, "Failed to enable master clock\n");
return ret;
}
/* Switch on PLL */ /* Switch on PLL */
snd_soc_update_bits(codec, AIC32X4_PLLPR, snd_soc_update_bits(codec, AIC32X4_PLLPR,
AIC32X4_PLLEN, AIC32X4_PLLEN); AIC32X4_PLLEN, AIC32X4_PLLEN);
...@@ -509,29 +534,32 @@ static int aic32x4_set_bias_level(struct snd_soc_codec *codec, ...@@ -509,29 +534,32 @@ static int aic32x4_set_bias_level(struct snd_soc_codec *codec,
case SND_SOC_BIAS_PREPARE: case SND_SOC_BIAS_PREPARE:
break; break;
case SND_SOC_BIAS_STANDBY: case SND_SOC_BIAS_STANDBY:
/* Switch off PLL */ /* Switch off BCLK_N Divider */
snd_soc_update_bits(codec, AIC32X4_PLLPR, snd_soc_update_bits(codec, AIC32X4_BCLKN,
AIC32X4_PLLEN, 0); AIC32X4_BCLKEN, 0);
/* Switch off NDAC Divider */ /* Switch off MADC Divider */
snd_soc_update_bits(codec, AIC32X4_NDAC, snd_soc_update_bits(codec, AIC32X4_MADC,
AIC32X4_NDACEN, 0); AIC32X4_MADCEN, 0);
/* Switch off NADC Divider */
snd_soc_update_bits(codec, AIC32X4_NADC,
AIC32X4_NADCEN, 0);
/* Switch off MDAC Divider */ /* Switch off MDAC Divider */
snd_soc_update_bits(codec, AIC32X4_MDAC, snd_soc_update_bits(codec, AIC32X4_MDAC,
AIC32X4_MDACEN, 0); AIC32X4_MDACEN, 0);
/* Switch off NADC Divider */ /* Switch off NDAC Divider */
snd_soc_update_bits(codec, AIC32X4_NADC, snd_soc_update_bits(codec, AIC32X4_NDAC,
AIC32X4_NADCEN, 0); AIC32X4_NDACEN, 0);
/* Switch off MADC Divider */ /* Switch off PLL */
snd_soc_update_bits(codec, AIC32X4_MADC, snd_soc_update_bits(codec, AIC32X4_PLLPR,
AIC32X4_MADCEN, 0); AIC32X4_PLLEN, 0);
/* Switch off BCLK_N Divider */ /* Switch off master clock */
snd_soc_update_bits(codec, AIC32X4_BCLKN, clk_disable_unprepare(aic32x4->mclk);
AIC32X4_BCLKEN, 0);
break; break;
case SND_SOC_BIAS_OFF: case SND_SOC_BIAS_OFF:
break; break;
...@@ -588,7 +616,7 @@ static int aic32x4_probe(struct snd_soc_codec *codec) ...@@ -588,7 +616,7 @@ static int aic32x4_probe(struct snd_soc_codec *codec)
snd_soc_codec_set_cache_io(codec, 8, 8, SND_SOC_REGMAP); snd_soc_codec_set_cache_io(codec, 8, 8, SND_SOC_REGMAP);
if (aic32x4->rstn_gpio >= 0) { if (gpio_is_valid(aic32x4->rstn_gpio)) {
ndelay(10); ndelay(10);
gpio_set_value(aic32x4->rstn_gpio, 1); gpio_set_value(aic32x4->rstn_gpio, 1);
} }
...@@ -663,11 +691,122 @@ static struct snd_soc_codec_driver soc_codec_dev_aic32x4 = { ...@@ -663,11 +691,122 @@ static struct snd_soc_codec_driver soc_codec_dev_aic32x4 = {
.num_dapm_routes = ARRAY_SIZE(aic32x4_dapm_routes), .num_dapm_routes = ARRAY_SIZE(aic32x4_dapm_routes),
}; };
static int aic32x4_parse_dt(struct aic32x4_priv *aic32x4,
struct device_node *np)
{
aic32x4->swapdacs = false;
aic32x4->micpga_routing = 0;
aic32x4->rstn_gpio = of_get_named_gpio(np, "reset-gpios", 0);
return 0;
}
static void aic32x4_disable_regulators(struct aic32x4_priv *aic32x4)
{
regulator_disable(aic32x4->supply_iov);
if (!IS_ERR(aic32x4->supply_ldo))
regulator_disable(aic32x4->supply_ldo);
if (!IS_ERR(aic32x4->supply_dv))
regulator_disable(aic32x4->supply_dv);
if (!IS_ERR(aic32x4->supply_av))
regulator_disable(aic32x4->supply_av);
}
static int aic32x4_setup_regulators(struct device *dev,
struct aic32x4_priv *aic32x4)
{
int ret = 0;
aic32x4->supply_ldo = devm_regulator_get_optional(dev, "ldoin");
aic32x4->supply_iov = devm_regulator_get(dev, "iov");
aic32x4->supply_dv = devm_regulator_get_optional(dev, "dv");
aic32x4->supply_av = devm_regulator_get_optional(dev, "av");
/* Check if the regulator requirements are fulfilled */
if (IS_ERR(aic32x4->supply_iov)) {
dev_err(dev, "Missing supply 'iov'\n");
return PTR_ERR(aic32x4->supply_iov);
}
if (IS_ERR(aic32x4->supply_ldo)) {
if (PTR_ERR(aic32x4->supply_ldo) == -EPROBE_DEFER)
return -EPROBE_DEFER;
if (IS_ERR(aic32x4->supply_dv)) {
dev_err(dev, "Missing supply 'dv' or 'ldoin'\n");
return PTR_ERR(aic32x4->supply_dv);
}
if (IS_ERR(aic32x4->supply_av)) {
dev_err(dev, "Missing supply 'av' or 'ldoin'\n");
return PTR_ERR(aic32x4->supply_av);
}
} else {
if (IS_ERR(aic32x4->supply_dv) &&
PTR_ERR(aic32x4->supply_dv) == -EPROBE_DEFER)
return -EPROBE_DEFER;
if (IS_ERR(aic32x4->supply_av) &&
PTR_ERR(aic32x4->supply_av) == -EPROBE_DEFER)
return -EPROBE_DEFER;
}
ret = regulator_enable(aic32x4->supply_iov);
if (ret) {
dev_err(dev, "Failed to enable regulator iov\n");
return ret;
}
if (!IS_ERR(aic32x4->supply_ldo)) {
ret = regulator_enable(aic32x4->supply_ldo);
if (ret) {
dev_err(dev, "Failed to enable regulator ldo\n");
goto error_ldo;
}
}
if (!IS_ERR(aic32x4->supply_dv)) {
ret = regulator_enable(aic32x4->supply_dv);
if (ret) {
dev_err(dev, "Failed to enable regulator dv\n");
goto error_dv;
}
}
if (!IS_ERR(aic32x4->supply_av)) {
ret = regulator_enable(aic32x4->supply_av);
if (ret) {
dev_err(dev, "Failed to enable regulator av\n");
goto error_av;
}
}
if (!IS_ERR(aic32x4->supply_ldo) && IS_ERR(aic32x4->supply_av))
aic32x4->power_cfg |= AIC32X4_PWR_AIC32X4_LDO_ENABLE;
return 0;
error_av:
if (!IS_ERR(aic32x4->supply_dv))
regulator_disable(aic32x4->supply_dv);
error_dv:
if (!IS_ERR(aic32x4->supply_ldo))
regulator_disable(aic32x4->supply_ldo);
error_ldo:
regulator_disable(aic32x4->supply_iov);
return ret;
}
static int aic32x4_i2c_probe(struct i2c_client *i2c, static int aic32x4_i2c_probe(struct i2c_client *i2c,
const struct i2c_device_id *id) const struct i2c_device_id *id)
{ {
struct aic32x4_pdata *pdata = i2c->dev.platform_data; struct aic32x4_pdata *pdata = i2c->dev.platform_data;
struct aic32x4_priv *aic32x4; struct aic32x4_priv *aic32x4;
struct device_node *np = i2c->dev.of_node;
int ret; int ret;
aic32x4 = devm_kzalloc(&i2c->dev, sizeof(struct aic32x4_priv), aic32x4 = devm_kzalloc(&i2c->dev, sizeof(struct aic32x4_priv),
...@@ -686,6 +825,12 @@ static int aic32x4_i2c_probe(struct i2c_client *i2c, ...@@ -686,6 +825,12 @@ static int aic32x4_i2c_probe(struct i2c_client *i2c,
aic32x4->swapdacs = pdata->swapdacs; aic32x4->swapdacs = pdata->swapdacs;
aic32x4->micpga_routing = pdata->micpga_routing; aic32x4->micpga_routing = pdata->micpga_routing;
aic32x4->rstn_gpio = pdata->rstn_gpio; aic32x4->rstn_gpio = pdata->rstn_gpio;
} else if (np) {
ret = aic32x4_parse_dt(aic32x4, np);
if (ret) {
dev_err(&i2c->dev, "Failed to parse DT node\n");
return ret;
}
} else { } else {
aic32x4->power_cfg = 0; aic32x4->power_cfg = 0;
aic32x4->swapdacs = false; aic32x4->swapdacs = false;
...@@ -693,20 +838,44 @@ static int aic32x4_i2c_probe(struct i2c_client *i2c, ...@@ -693,20 +838,44 @@ static int aic32x4_i2c_probe(struct i2c_client *i2c,
aic32x4->rstn_gpio = -1; aic32x4->rstn_gpio = -1;
} }
if (aic32x4->rstn_gpio >= 0) { aic32x4->mclk = devm_clk_get(&i2c->dev, "mclk");
if (IS_ERR(aic32x4->mclk)) {
dev_err(&i2c->dev, "Failed getting the mclk. The current implementation does not support the usage of this codec without mclk\n");
return PTR_ERR(aic32x4->mclk);
}
if (gpio_is_valid(aic32x4->rstn_gpio)) {
ret = devm_gpio_request_one(&i2c->dev, aic32x4->rstn_gpio, ret = devm_gpio_request_one(&i2c->dev, aic32x4->rstn_gpio,
GPIOF_OUT_INIT_LOW, "tlv320aic32x4 rstn"); GPIOF_OUT_INIT_LOW, "tlv320aic32x4 rstn");
if (ret != 0) if (ret != 0)
return ret; return ret;
} }
ret = aic32x4_setup_regulators(&i2c->dev, aic32x4);
if (ret) {
dev_err(&i2c->dev, "Failed to setup regulators\n");
return ret;
}
ret = snd_soc_register_codec(&i2c->dev, ret = snd_soc_register_codec(&i2c->dev,
&soc_codec_dev_aic32x4, &aic32x4_dai, 1); &soc_codec_dev_aic32x4, &aic32x4_dai, 1);
return ret; if (ret) {
dev_err(&i2c->dev, "Failed to register codec\n");
aic32x4_disable_regulators(aic32x4);
return ret;
}
i2c_set_clientdata(i2c, aic32x4);
return 0;
} }
static int aic32x4_i2c_remove(struct i2c_client *client) static int aic32x4_i2c_remove(struct i2c_client *client)
{ {
struct aic32x4_priv *aic32x4 = i2c_get_clientdata(client);
aic32x4_disable_regulators(aic32x4);
snd_soc_unregister_codec(&client->dev); snd_soc_unregister_codec(&client->dev);
return 0; return 0;
} }
...@@ -717,10 +886,17 @@ static const struct i2c_device_id aic32x4_i2c_id[] = { ...@@ -717,10 +886,17 @@ static const struct i2c_device_id aic32x4_i2c_id[] = {
}; };
MODULE_DEVICE_TABLE(i2c, aic32x4_i2c_id); MODULE_DEVICE_TABLE(i2c, aic32x4_i2c_id);
static const struct of_device_id aic32x4_of_id[] = {
{ .compatible = "ti,tlv320aic32x4", },
{ /* senitel */ }
};
MODULE_DEVICE_TABLE(of, aic32x4_of_id);
static struct i2c_driver aic32x4_i2c_driver = { static struct i2c_driver aic32x4_i2c_driver = {
.driver = { .driver = {
.name = "tlv320aic32x4", .name = "tlv320aic32x4",
.owner = THIS_MODULE, .owner = THIS_MODULE,
.of_match_table = aic32x4_of_id,
}, },
.probe = aic32x4_i2c_probe, .probe = aic32x4_i2c_probe,
.remove = aic32x4_i2c_remove, .remove = aic32x4_i2c_remove,
......
...@@ -478,9 +478,7 @@ static const char *dac33_fifo_mode_texts[] = { ...@@ -478,9 +478,7 @@ static const char *dac33_fifo_mode_texts[] = {
"Bypass", "Mode 1", "Mode 7" "Bypass", "Mode 1", "Mode 7"
}; };
static const struct soc_enum dac33_fifo_mode_enum = static SOC_ENUM_SINGLE_EXT_DECL(dac33_fifo_mode_enum, dac33_fifo_mode_texts);
SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(dac33_fifo_mode_texts),
dac33_fifo_mode_texts);
/* L/R Line Output Gain */ /* L/R Line Output Gain */
static const char *lr_lineout_gain_texts[] = { static const char *lr_lineout_gain_texts[] = {
...@@ -488,15 +486,13 @@ static const char *lr_lineout_gain_texts[] = { ...@@ -488,15 +486,13 @@ static const char *lr_lineout_gain_texts[] = {
"Line 0dB DAC 12dB", "Line 6dB DAC 18dB", "Line 0dB DAC 12dB", "Line 6dB DAC 18dB",
}; };
static const struct soc_enum l_lineout_gain_enum = static SOC_ENUM_SINGLE_DECL(l_lineout_gain_enum,
SOC_ENUM_SINGLE(DAC33_LDAC_PWR_CTRL, 0, DAC33_LDAC_PWR_CTRL, 0,
ARRAY_SIZE(lr_lineout_gain_texts), lr_lineout_gain_texts);
lr_lineout_gain_texts);
static const struct soc_enum r_lineout_gain_enum = static SOC_ENUM_SINGLE_DECL(r_lineout_gain_enum,
SOC_ENUM_SINGLE(DAC33_RDAC_PWR_CTRL, 0, DAC33_RDAC_PWR_CTRL, 0,
ARRAY_SIZE(lr_lineout_gain_texts), lr_lineout_gain_texts);
lr_lineout_gain_texts);
/* /*
* DACL/R digital volume control: * DACL/R digital volume control:
...@@ -534,18 +530,16 @@ static const struct snd_kcontrol_new dac33_dapm_abypassr_control = ...@@ -534,18 +530,16 @@ static const struct snd_kcontrol_new dac33_dapm_abypassr_control =
/* LOP L/R invert selection */ /* LOP L/R invert selection */
static const char *dac33_lr_lom_texts[] = {"DAC", "LOP"}; static const char *dac33_lr_lom_texts[] = {"DAC", "LOP"};
static const struct soc_enum dac33_left_lom_enum = static SOC_ENUM_SINGLE_DECL(dac33_left_lom_enum,
SOC_ENUM_SINGLE(DAC33_OUT_AMP_CTRL, 3, DAC33_OUT_AMP_CTRL, 3,
ARRAY_SIZE(dac33_lr_lom_texts), dac33_lr_lom_texts);
dac33_lr_lom_texts);
static const struct snd_kcontrol_new dac33_dapm_left_lom_control = static const struct snd_kcontrol_new dac33_dapm_left_lom_control =
SOC_DAPM_ENUM("Route", dac33_left_lom_enum); SOC_DAPM_ENUM("Route", dac33_left_lom_enum);
static const struct soc_enum dac33_right_lom_enum = static SOC_ENUM_SINGLE_DECL(dac33_right_lom_enum,
SOC_ENUM_SINGLE(DAC33_OUT_AMP_CTRL, 2, DAC33_OUT_AMP_CTRL, 2,
ARRAY_SIZE(dac33_lr_lom_texts), dac33_lr_lom_texts);
dac33_lr_lom_texts);
static const struct snd_kcontrol_new dac33_dapm_right_lom_control = static const struct snd_kcontrol_new dac33_dapm_right_lom_control =
SOC_DAPM_ENUM("Route", dac33_right_lom_enum); SOC_DAPM_ENUM("Route", dac33_right_lom_enum);
......
...@@ -415,10 +415,9 @@ static const struct snd_kcontrol_new twl4030_dapm_carkitr_controls[] = { ...@@ -415,10 +415,9 @@ static const struct snd_kcontrol_new twl4030_dapm_carkitr_controls[] = {
static const char *twl4030_handsfreel_texts[] = static const char *twl4030_handsfreel_texts[] =
{"Voice", "AudioL1", "AudioL2", "AudioR2"}; {"Voice", "AudioL1", "AudioL2", "AudioR2"};
static const struct soc_enum twl4030_handsfreel_enum = static SOC_ENUM_SINGLE_DECL(twl4030_handsfreel_enum,
SOC_ENUM_SINGLE(TWL4030_REG_HFL_CTL, 0, TWL4030_REG_HFL_CTL, 0,
ARRAY_SIZE(twl4030_handsfreel_texts), twl4030_handsfreel_texts);
twl4030_handsfreel_texts);
static const struct snd_kcontrol_new twl4030_dapm_handsfreel_control = static const struct snd_kcontrol_new twl4030_dapm_handsfreel_control =
SOC_DAPM_ENUM("Route", twl4030_handsfreel_enum); SOC_DAPM_ENUM("Route", twl4030_handsfreel_enum);
...@@ -431,10 +430,9 @@ static const struct snd_kcontrol_new twl4030_dapm_handsfreelmute_control = ...@@ -431,10 +430,9 @@ static const struct snd_kcontrol_new twl4030_dapm_handsfreelmute_control =
static const char *twl4030_handsfreer_texts[] = static const char *twl4030_handsfreer_texts[] =
{"Voice", "AudioR1", "AudioR2", "AudioL2"}; {"Voice", "AudioR1", "AudioR2", "AudioL2"};
static const struct soc_enum twl4030_handsfreer_enum = static SOC_ENUM_SINGLE_DECL(twl4030_handsfreer_enum,
SOC_ENUM_SINGLE(TWL4030_REG_HFR_CTL, 0, TWL4030_REG_HFR_CTL, 0,
ARRAY_SIZE(twl4030_handsfreer_texts), twl4030_handsfreer_texts);
twl4030_handsfreer_texts);
static const struct snd_kcontrol_new twl4030_dapm_handsfreer_control = static const struct snd_kcontrol_new twl4030_dapm_handsfreer_control =
SOC_DAPM_ENUM("Route", twl4030_handsfreer_enum); SOC_DAPM_ENUM("Route", twl4030_handsfreer_enum);
...@@ -448,10 +446,9 @@ static const struct snd_kcontrol_new twl4030_dapm_handsfreermute_control = ...@@ -448,10 +446,9 @@ static const struct snd_kcontrol_new twl4030_dapm_handsfreermute_control =
static const char *twl4030_vibra_texts[] = static const char *twl4030_vibra_texts[] =
{"AudioL1", "AudioR1", "AudioL2", "AudioR2"}; {"AudioL1", "AudioR1", "AudioL2", "AudioR2"};
static const struct soc_enum twl4030_vibra_enum = static SOC_ENUM_SINGLE_DECL(twl4030_vibra_enum,
SOC_ENUM_SINGLE(TWL4030_REG_VIBRA_CTL, 2, TWL4030_REG_VIBRA_CTL, 2,
ARRAY_SIZE(twl4030_vibra_texts), twl4030_vibra_texts);
twl4030_vibra_texts);
static const struct snd_kcontrol_new twl4030_dapm_vibra_control = static const struct snd_kcontrol_new twl4030_dapm_vibra_control =
SOC_DAPM_ENUM("Route", twl4030_vibra_enum); SOC_DAPM_ENUM("Route", twl4030_vibra_enum);
...@@ -460,10 +457,9 @@ SOC_DAPM_ENUM("Route", twl4030_vibra_enum); ...@@ -460,10 +457,9 @@ SOC_DAPM_ENUM("Route", twl4030_vibra_enum);
static const char *twl4030_vibrapath_texts[] = static const char *twl4030_vibrapath_texts[] =
{"Local vibrator", "Audio"}; {"Local vibrator", "Audio"};
static const struct soc_enum twl4030_vibrapath_enum = static SOC_ENUM_SINGLE_DECL(twl4030_vibrapath_enum,
SOC_ENUM_SINGLE(TWL4030_REG_VIBRA_CTL, 4, TWL4030_REG_VIBRA_CTL, 4,
ARRAY_SIZE(twl4030_vibrapath_texts), twl4030_vibrapath_texts);
twl4030_vibrapath_texts);
static const struct snd_kcontrol_new twl4030_dapm_vibrapath_control = static const struct snd_kcontrol_new twl4030_dapm_vibrapath_control =
SOC_DAPM_ENUM("Route", twl4030_vibrapath_enum); SOC_DAPM_ENUM("Route", twl4030_vibrapath_enum);
...@@ -490,10 +486,9 @@ static const struct snd_kcontrol_new twl4030_dapm_analogrmic_controls[] = { ...@@ -490,10 +486,9 @@ static const struct snd_kcontrol_new twl4030_dapm_analogrmic_controls[] = {
static const char *twl4030_micpathtx1_texts[] = static const char *twl4030_micpathtx1_texts[] =
{"Analog", "Digimic0"}; {"Analog", "Digimic0"};
static const struct soc_enum twl4030_micpathtx1_enum = static SOC_ENUM_SINGLE_DECL(twl4030_micpathtx1_enum,
SOC_ENUM_SINGLE(TWL4030_REG_ADCMICSEL, 0, TWL4030_REG_ADCMICSEL, 0,
ARRAY_SIZE(twl4030_micpathtx1_texts), twl4030_micpathtx1_texts);
twl4030_micpathtx1_texts);
static const struct snd_kcontrol_new twl4030_dapm_micpathtx1_control = static const struct snd_kcontrol_new twl4030_dapm_micpathtx1_control =
SOC_DAPM_ENUM("Route", twl4030_micpathtx1_enum); SOC_DAPM_ENUM("Route", twl4030_micpathtx1_enum);
...@@ -502,10 +497,9 @@ SOC_DAPM_ENUM("Route", twl4030_micpathtx1_enum); ...@@ -502,10 +497,9 @@ SOC_DAPM_ENUM("Route", twl4030_micpathtx1_enum);
static const char *twl4030_micpathtx2_texts[] = static const char *twl4030_micpathtx2_texts[] =
{"Analog", "Digimic1"}; {"Analog", "Digimic1"};
static const struct soc_enum twl4030_micpathtx2_enum = static SOC_ENUM_SINGLE_DECL(twl4030_micpathtx2_enum,
SOC_ENUM_SINGLE(TWL4030_REG_ADCMICSEL, 2, TWL4030_REG_ADCMICSEL, 2,
ARRAY_SIZE(twl4030_micpathtx2_texts), twl4030_micpathtx2_texts);
twl4030_micpathtx2_texts);
static const struct snd_kcontrol_new twl4030_dapm_micpathtx2_control = static const struct snd_kcontrol_new twl4030_dapm_micpathtx2_control =
SOC_DAPM_ENUM("Route", twl4030_micpathtx2_enum); SOC_DAPM_ENUM("Route", twl4030_micpathtx2_enum);
...@@ -955,10 +949,9 @@ static const char *twl4030_op_modes_texts[] = { ...@@ -955,10 +949,9 @@ static const char *twl4030_op_modes_texts[] = {
"Option 2 (voice/audio)", "Option 1 (audio)" "Option 2 (voice/audio)", "Option 1 (audio)"
}; };
static const struct soc_enum twl4030_op_modes_enum = static SOC_ENUM_SINGLE_DECL(twl4030_op_modes_enum,
SOC_ENUM_SINGLE(TWL4030_REG_CODEC_MODE, 0, TWL4030_REG_CODEC_MODE, 0,
ARRAY_SIZE(twl4030_op_modes_texts), twl4030_op_modes_texts);
twl4030_op_modes_texts);
static int snd_soc_put_twl4030_opmode_enum_double(struct snd_kcontrol *kcontrol, static int snd_soc_put_twl4030_opmode_enum_double(struct snd_kcontrol *kcontrol,
struct snd_ctl_elem_value *ucontrol) struct snd_ctl_elem_value *ucontrol)
...@@ -1029,10 +1022,9 @@ static const char *twl4030_avadc_clk_priority_texts[] = { ...@@ -1029,10 +1022,9 @@ static const char *twl4030_avadc_clk_priority_texts[] = {
"Voice high priority", "HiFi high priority" "Voice high priority", "HiFi high priority"
}; };
static const struct soc_enum twl4030_avadc_clk_priority_enum = static SOC_ENUM_SINGLE_DECL(twl4030_avadc_clk_priority_enum,
SOC_ENUM_SINGLE(TWL4030_REG_AVADC_CTL, 2, TWL4030_REG_AVADC_CTL, 2,
ARRAY_SIZE(twl4030_avadc_clk_priority_texts), twl4030_avadc_clk_priority_texts);
twl4030_avadc_clk_priority_texts);
static const char *twl4030_rampdelay_texts[] = { static const char *twl4030_rampdelay_texts[] = {
"27/20/14 ms", "55/40/27 ms", "109/81/55 ms", "218/161/109 ms", "27/20/14 ms", "55/40/27 ms", "109/81/55 ms", "218/161/109 ms",
...@@ -1040,40 +1032,36 @@ static const char *twl4030_rampdelay_texts[] = { ...@@ -1040,40 +1032,36 @@ static const char *twl4030_rampdelay_texts[] = {
"3495/2581/1748 ms" "3495/2581/1748 ms"
}; };
static const struct soc_enum twl4030_rampdelay_enum = static SOC_ENUM_SINGLE_DECL(twl4030_rampdelay_enum,
SOC_ENUM_SINGLE(TWL4030_REG_HS_POPN_SET, 2, TWL4030_REG_HS_POPN_SET, 2,
ARRAY_SIZE(twl4030_rampdelay_texts), twl4030_rampdelay_texts);
twl4030_rampdelay_texts);
/* Vibra H-bridge direction mode */ /* Vibra H-bridge direction mode */
static const char *twl4030_vibradirmode_texts[] = { static const char *twl4030_vibradirmode_texts[] = {
"Vibra H-bridge direction", "Audio data MSB", "Vibra H-bridge direction", "Audio data MSB",
}; };
static const struct soc_enum twl4030_vibradirmode_enum = static SOC_ENUM_SINGLE_DECL(twl4030_vibradirmode_enum,
SOC_ENUM_SINGLE(TWL4030_REG_VIBRA_CTL, 5, TWL4030_REG_VIBRA_CTL, 5,
ARRAY_SIZE(twl4030_vibradirmode_texts), twl4030_vibradirmode_texts);
twl4030_vibradirmode_texts);
/* Vibra H-bridge direction */ /* Vibra H-bridge direction */
static const char *twl4030_vibradir_texts[] = { static const char *twl4030_vibradir_texts[] = {
"Positive polarity", "Negative polarity", "Positive polarity", "Negative polarity",
}; };
static const struct soc_enum twl4030_vibradir_enum = static SOC_ENUM_SINGLE_DECL(twl4030_vibradir_enum,
SOC_ENUM_SINGLE(TWL4030_REG_VIBRA_CTL, 1, TWL4030_REG_VIBRA_CTL, 1,
ARRAY_SIZE(twl4030_vibradir_texts), twl4030_vibradir_texts);
twl4030_vibradir_texts);
/* Digimic Left and right swapping */ /* Digimic Left and right swapping */
static const char *twl4030_digimicswap_texts[] = { static const char *twl4030_digimicswap_texts[] = {
"Not swapped", "Swapped", "Not swapped", "Swapped",
}; };
static const struct soc_enum twl4030_digimicswap_enum = static SOC_ENUM_SINGLE_DECL(twl4030_digimicswap_enum,
SOC_ENUM_SINGLE(TWL4030_REG_MISC_SET_1, 0, TWL4030_REG_MISC_SET_1, 0,
ARRAY_SIZE(twl4030_digimicswap_texts), twl4030_digimicswap_texts);
twl4030_digimicswap_texts);
static const struct snd_kcontrol_new twl4030_snd_controls[] = { static const struct snd_kcontrol_new twl4030_snd_controls[] = {
/* Codec operation mode control */ /* Codec operation mode control */
......
...@@ -81,7 +81,7 @@ struct twl6040_data { ...@@ -81,7 +81,7 @@ struct twl6040_data {
}; };
/* set of rates for each pll: low-power and high-performance */ /* set of rates for each pll: low-power and high-performance */
static unsigned int lp_rates[] = { static const unsigned int lp_rates[] = {
8000, 8000,
11250, 11250,
16000, 16000,
...@@ -93,7 +93,7 @@ static unsigned int lp_rates[] = { ...@@ -93,7 +93,7 @@ static unsigned int lp_rates[] = {
96000, 96000,
}; };
static unsigned int hp_rates[] = { static const unsigned int hp_rates[] = {
8000, 8000,
16000, 16000,
32000, 32000,
...@@ -101,7 +101,7 @@ static unsigned int hp_rates[] = { ...@@ -101,7 +101,7 @@ static unsigned int hp_rates[] = {
96000, 96000,
}; };
static struct snd_pcm_hw_constraint_list sysclk_constraints[] = { static const struct snd_pcm_hw_constraint_list sysclk_constraints[] = {
{ .count = ARRAY_SIZE(lp_rates), .list = lp_rates, }, { .count = ARRAY_SIZE(lp_rates), .list = lp_rates, },
{ .count = ARRAY_SIZE(hp_rates), .list = hp_rates, }, { .count = ARRAY_SIZE(hp_rates), .list = hp_rates, },
}; };
...@@ -392,8 +392,10 @@ static const char *twl6040_amicr_texts[] = ...@@ -392,8 +392,10 @@ static const char *twl6040_amicr_texts[] =
{"Headset Mic", "Sub Mic", "Aux/FM Right", "Off"}; {"Headset Mic", "Sub Mic", "Aux/FM Right", "Off"};
static const struct soc_enum twl6040_enum[] = { static const struct soc_enum twl6040_enum[] = {
SOC_ENUM_SINGLE(TWL6040_REG_MICLCTL, 3, 4, twl6040_amicl_texts), SOC_ENUM_SINGLE(TWL6040_REG_MICLCTL, 3,
SOC_ENUM_SINGLE(TWL6040_REG_MICRCTL, 3, 4, twl6040_amicr_texts), ARRAY_SIZE(twl6040_amicl_texts), twl6040_amicl_texts),
SOC_ENUM_SINGLE(TWL6040_REG_MICRCTL, 3,
ARRAY_SIZE(twl6040_amicr_texts), twl6040_amicr_texts),
}; };
static const char *twl6040_hs_texts[] = { static const char *twl6040_hs_texts[] = {
...@@ -476,9 +478,8 @@ static const char *twl6040_power_mode_texts[] = { ...@@ -476,9 +478,8 @@ static const char *twl6040_power_mode_texts[] = {
"Low-Power", "High-Performance", "Low-Power", "High-Performance",
}; };
static const struct soc_enum twl6040_power_mode_enum = static SOC_ENUM_SINGLE_EXT_DECL(twl6040_power_mode_enum,
SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(twl6040_power_mode_texts), twl6040_power_mode_texts);
twl6040_power_mode_texts);
static int twl6040_headset_power_get_enum(struct snd_kcontrol *kcontrol, static int twl6040_headset_power_get_enum(struct snd_kcontrol *kcontrol,
struct snd_ctl_elem_value *ucontrol) struct snd_ctl_elem_value *ucontrol)
......
...@@ -237,25 +237,27 @@ static const char *uda1380_os_setting[] = { ...@@ -237,25 +237,27 @@ static const char *uda1380_os_setting[] = {
}; };
static const struct soc_enum uda1380_deemp_enum[] = { static const struct soc_enum uda1380_deemp_enum[] = {
SOC_ENUM_SINGLE(UDA1380_DEEMP, 8, 5, uda1380_deemp), SOC_ENUM_SINGLE(UDA1380_DEEMP, 8, ARRAY_SIZE(uda1380_deemp),
SOC_ENUM_SINGLE(UDA1380_DEEMP, 0, 5, uda1380_deemp), uda1380_deemp),
SOC_ENUM_SINGLE(UDA1380_DEEMP, 0, ARRAY_SIZE(uda1380_deemp),
uda1380_deemp),
}; };
static const struct soc_enum uda1380_input_sel_enum = static SOC_ENUM_SINGLE_DECL(uda1380_input_sel_enum,
SOC_ENUM_SINGLE(UDA1380_ADC, 2, 4, uda1380_input_sel); /* SEL_MIC, SEL_LNA */ UDA1380_ADC, 2, uda1380_input_sel); /* SEL_MIC, SEL_LNA */
static const struct soc_enum uda1380_output_sel_enum = static SOC_ENUM_SINGLE_DECL(uda1380_output_sel_enum,
SOC_ENUM_SINGLE(UDA1380_PM, 7, 2, uda1380_output_sel); /* R02_EN_AVC */ UDA1380_PM, 7, uda1380_output_sel); /* R02_EN_AVC */
static const struct soc_enum uda1380_spf_enum = static SOC_ENUM_SINGLE_DECL(uda1380_spf_enum,
SOC_ENUM_SINGLE(UDA1380_MODE, 14, 4, uda1380_spf_mode); /* M */ UDA1380_MODE, 14, uda1380_spf_mode); /* M */
static const struct soc_enum uda1380_capture_sel_enum = static SOC_ENUM_SINGLE_DECL(uda1380_capture_sel_enum,
SOC_ENUM_SINGLE(UDA1380_IFACE, 6, 2, uda1380_capture_sel); /* SEL_SOURCE */ UDA1380_IFACE, 6, uda1380_capture_sel); /* SEL_SOURCE */
static const struct soc_enum uda1380_sel_ns_enum = static SOC_ENUM_SINGLE_DECL(uda1380_sel_ns_enum,
SOC_ENUM_SINGLE(UDA1380_MIXER, 14, 2, uda1380_sel_ns); /* SEL_NS */ UDA1380_MIXER, 14, uda1380_sel_ns); /* SEL_NS */
static const struct soc_enum uda1380_mix_enum = static SOC_ENUM_SINGLE_DECL(uda1380_mix_enum,
SOC_ENUM_SINGLE(UDA1380_MIXER, 12, 4, uda1380_mix_control); /* MIX, MIX_POS */ UDA1380_MIXER, 12, uda1380_mix_control); /* MIX, MIX_POS */
static const struct soc_enum uda1380_sdet_enum = static SOC_ENUM_SINGLE_DECL(uda1380_sdet_enum,
SOC_ENUM_SINGLE(UDA1380_MIXER, 4, 4, uda1380_sdet_setting); /* SD_VALUE */ UDA1380_MIXER, 4, uda1380_sdet_setting); /* SD_VALUE */
static const struct soc_enum uda1380_os_enum = static SOC_ENUM_SINGLE_DECL(uda1380_os_enum,
SOC_ENUM_SINGLE(UDA1380_MIXER, 0, 3, uda1380_os_setting); /* OS */ UDA1380_MIXER, 0, uda1380_os_setting); /* OS */
/* /*
* from -48 dB in 1.5 dB steps (mute instead of -49.5 dB) * from -48 dB in 1.5 dB steps (mute instead of -49.5 dB)
......
...@@ -209,8 +209,7 @@ static int snd_wl1273_set_audio_route(struct snd_kcontrol *kcontrol, ...@@ -209,8 +209,7 @@ static int snd_wl1273_set_audio_route(struct snd_kcontrol *kcontrol,
return 1; return 1;
} }
static const struct soc_enum wl1273_enum = static SOC_ENUM_SINGLE_EXT_DECL(wl1273_enum, wl1273_audio_route);
SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(wl1273_audio_route), wl1273_audio_route);
static int snd_wl1273_fm_audio_get(struct snd_kcontrol *kcontrol, static int snd_wl1273_fm_audio_get(struct snd_kcontrol *kcontrol,
struct snd_ctl_elem_value *ucontrol) struct snd_ctl_elem_value *ucontrol)
...@@ -247,9 +246,7 @@ static int snd_wl1273_fm_audio_put(struct snd_kcontrol *kcontrol, ...@@ -247,9 +246,7 @@ static int snd_wl1273_fm_audio_put(struct snd_kcontrol *kcontrol,
static const char * const wl1273_audio_strings[] = { "Digital", "Analog" }; static const char * const wl1273_audio_strings[] = { "Digital", "Analog" };
static const struct soc_enum wl1273_audio_enum = static SOC_ENUM_SINGLE_EXT_DECL(wl1273_audio_enum, wl1273_audio_strings);
SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(wl1273_audio_strings),
wl1273_audio_strings);
static int snd_wl1273_fm_volume_get(struct snd_kcontrol *kcontrol, static int snd_wl1273_fm_volume_get(struct snd_kcontrol *kcontrol,
struct snd_ctl_elem_value *ucontrol) struct snd_ctl_elem_value *ucontrol)
......
...@@ -1113,11 +1113,10 @@ static const char *wm2200_rxanc_input_sel_texts[] = { ...@@ -1113,11 +1113,10 @@ static const char *wm2200_rxanc_input_sel_texts[] = {
"None", "IN1", "IN2", "IN3", "None", "IN1", "IN2", "IN3",
}; };
static const struct soc_enum wm2200_rxanc_input_sel = static SOC_ENUM_SINGLE_DECL(wm2200_rxanc_input_sel,
SOC_ENUM_SINGLE(WM2200_RXANC_SRC, WM2200_RXANC_SRC,
WM2200_IN_RXANC_SEL_SHIFT, WM2200_IN_RXANC_SEL_SHIFT,
ARRAY_SIZE(wm2200_rxanc_input_sel_texts), wm2200_rxanc_input_sel_texts);
wm2200_rxanc_input_sel_texts);
static const struct snd_kcontrol_new wm2200_snd_controls[] = { static const struct snd_kcontrol_new wm2200_snd_controls[] = {
SOC_SINGLE("IN1 High Performance Switch", WM2200_IN1L_CONTROL, SOC_SINGLE("IN1 High Performance Switch", WM2200_IN1L_CONTROL,
...@@ -1288,11 +1287,10 @@ static const char *wm2200_aec_loopback_texts[] = { ...@@ -1288,11 +1287,10 @@ static const char *wm2200_aec_loopback_texts[] = {
"OUT1L", "OUT1R", "OUT2L", "OUT2R", "OUT1L", "OUT1R", "OUT2L", "OUT2R",
}; };
static const struct soc_enum wm2200_aec_loopback = static SOC_ENUM_SINGLE_DECL(wm2200_aec_loopback,
SOC_ENUM_SINGLE(WM2200_DAC_AEC_CONTROL_1, WM2200_DAC_AEC_CONTROL_1,
WM2200_AEC_LOOPBACK_SRC_SHIFT, WM2200_AEC_LOOPBACK_SRC_SHIFT,
ARRAY_SIZE(wm2200_aec_loopback_texts), wm2200_aec_loopback_texts);
wm2200_aec_loopback_texts);
static const struct snd_kcontrol_new wm2200_aec_loopback_mux = static const struct snd_kcontrol_new wm2200_aec_loopback_mux =
SOC_DAPM_ENUM("AEC Loopback", wm2200_aec_loopback); SOC_DAPM_ENUM("AEC Loopback", wm2200_aec_loopback);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment