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
This commit is contained in:
parent
7cc6417208
051389e250
6900ab55dd
b46f2c5c00
ac5630b504
d77c290af7
9f04fba797
a1d0d786af
1dbb348d90
4ec20a9700
6109ab2bfc
commit
ba67761c1a
30
Documentation/devicetree/bindings/sound/tlv320aic32x4.txt
Normal file
30
Documentation/devicetree/bindings/sound/tlv320aic32x4.txt
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
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:
|
|||||||
|
|
||||||
- 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
|
|||||||
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
|
|||||||
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[] = {
|
|||||||
"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,
|
|||||||
|
|
||||||
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)
|
|||||||
|
|
||||||
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 = {
|
|||||||
.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)
|
|||||||
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 = {
|
|||||||
* 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 @@
|
|||||||
#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 {
|
|||||||
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[] = {
|
|||||||
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)
|
|||||||
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,
|
|||||||
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 */
|
|
||||||
snd_soc_update_bits(codec, AIC32X4_NDAC,
|
|
||||||
AIC32X4_NDACEN, 0);
|
|
||||||
|
|
||||||
/* Switch off MDAC Divider */
|
|
||||||
snd_soc_update_bits(codec, AIC32X4_MDAC,
|
|
||||||
AIC32X4_MDACEN, 0);
|
|
||||||
|
|
||||||
/* Switch off NADC Divider */
|
|
||||||
snd_soc_update_bits(codec, AIC32X4_NADC,
|
|
||||||
AIC32X4_NADCEN, 0);
|
|
||||||
|
|
||||||
/* Switch off MADC Divider */
|
/* Switch off MADC Divider */
|
||||||
snd_soc_update_bits(codec, AIC32X4_MADC,
|
snd_soc_update_bits(codec, AIC32X4_MADC,
|
||||||
AIC32X4_MADCEN, 0);
|
AIC32X4_MADCEN, 0);
|
||||||
|
|
||||||
/* Switch off BCLK_N Divider */
|
/* Switch off NADC Divider */
|
||||||
snd_soc_update_bits(codec, AIC32X4_BCLKN,
|
snd_soc_update_bits(codec, AIC32X4_NADC,
|
||||||
AIC32X4_BCLKEN, 0);
|
AIC32X4_NADCEN, 0);
|
||||||
|
|
||||||
|
/* Switch off MDAC Divider */
|
||||||
|
snd_soc_update_bits(codec, AIC32X4_MDAC,
|
||||||
|
AIC32X4_MDACEN, 0);
|
||||||
|
|
||||||
|
/* Switch off NDAC Divider */
|
||||||
|
snd_soc_update_bits(codec, AIC32X4_NDAC,
|
||||||
|
AIC32X4_NDACEN, 0);
|
||||||
|
|
||||||
|
/* Switch off PLL */
|
||||||
|
snd_soc_update_bits(codec, AIC32X4_PLLPR,
|
||||||
|
AIC32X4_PLLEN, 0);
|
||||||
|
|
||||||
|
/* Switch off master clock */
|
||||||
|
clk_disable_unprepare(aic32x4->mclk);
|
||||||
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)
|
|||||||
|
|
||||||
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 = {
|
|||||||
.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,
|
|||||||
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,
|
|||||||
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[] = {
|
|||||||
};
|
};
|
||||||
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[] = {
|
|||||||
"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[] = {
|
|||||||
"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 =
|
|||||||
/* 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[] = {
|
|||||||
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 =
|
|||||||
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 =
|
|||||||
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);
|
|||||||
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[] = {
|
|||||||
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);
|
|||||||
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[] = {
|
|||||||
"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[] = {
|
|||||||
"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[] = {
|
|||||||
"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 {
|
|||||||
};
|
};
|
||||||
|
|
||||||
/* 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[] = {
|
|||||||
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[] = {
|
|||||||
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[] =
|
|||||||
{"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[] = {
|
|||||||
"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[] = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
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,
|
|||||||
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,
|
|||||||
|
|
||||||
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[] = {
|
|||||||
"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[] = {
|
|||||||
"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);
|
||||||
|
Loading…
Reference in New Issue
Block a user