mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-18 01:34:14 +08:00
Merge remote-tracking branches 'asoc/topic/ts3a227e', 'asoc/topic/tsc42xx', 'asoc/topic/twl4030', 'asoc/topic/twl6040' and 'asoc/topic/uda1380' into asoc-next
This commit is contained in:
commit
04df320d46
16
Documentation/devicetree/bindings/sound/tscs42xx.txt
Normal file
16
Documentation/devicetree/bindings/sound/tscs42xx.txt
Normal file
@ -0,0 +1,16 @@
|
||||
TSCS42XX Audio CODEC
|
||||
|
||||
Required Properties:
|
||||
|
||||
- compatible : "tempo,tscs42A1" for analog mic
|
||||
"tempo,tscs42A2" for digital mic
|
||||
|
||||
- reg : <0x71> for analog mic
|
||||
<0x69> for digital mic
|
||||
|
||||
Example:
|
||||
|
||||
wookie: codec@69 {
|
||||
compatible = "tempo,tscs42A2";
|
||||
reg = <0x69>;
|
||||
};
|
@ -347,6 +347,7 @@ tcg Trusted Computing Group
|
||||
tcl Toby Churchill Ltd.
|
||||
technexion TechNexion
|
||||
technologic Technologic Systems
|
||||
tempo Tempo Semiconductor
|
||||
terasic Terasic Inc.
|
||||
thine THine Electronics, Inc.
|
||||
ti Texas Instruments
|
||||
|
@ -13851,6 +13851,13 @@ T: git git://git.kernel.org/pub/scm/linux/kernel/git/jikos/trivial.git
|
||||
S: Maintained
|
||||
K: ^Subject:.*(?i)trivial
|
||||
|
||||
TEMPO SEMICONDUCTOR DRIVERS
|
||||
M: Steven Eckhoff <steven.eckhoff.opensource@gmail.com>
|
||||
S: Maintained
|
||||
F: sound/soc/codecs/tscs*.c
|
||||
F: sound/soc/codecs/tscs*.h
|
||||
F: Documentation/devicetree/bindings/sound/tscs*.txt
|
||||
|
||||
TTY LAYER
|
||||
M: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
M: Jiri Slaby <jslaby@suse.com>
|
||||
|
@ -162,6 +162,7 @@ config SND_SOC_ALL_CODECS
|
||||
select SND_SOC_TLV320AIC3X if I2C
|
||||
select SND_SOC_TPA6130A2 if I2C
|
||||
select SND_SOC_TLV320DAC33 if I2C
|
||||
select SND_SOC_TSCS42XX if I2C
|
||||
select SND_SOC_TS3A227E if I2C
|
||||
select SND_SOC_TWL4030 if TWL4030_CORE
|
||||
select SND_SOC_TWL6040 if TWL6040_CORE
|
||||
@ -963,6 +964,13 @@ config SND_SOC_TS3A227E
|
||||
tristate "TI Headset/Mic detect and keypress chip"
|
||||
depends on I2C
|
||||
|
||||
config SND_SOC_TSCS42XX
|
||||
tristate "Tempo Semiconductor TSCS42xx CODEC"
|
||||
depends on I2C
|
||||
select REGMAP_I2C
|
||||
help
|
||||
Add support for Tempo Semiconductor's TSCS42xx audio CODEC.
|
||||
|
||||
config SND_SOC_TWL4030
|
||||
select MFD_TWL4030_AUDIO
|
||||
tristate
|
||||
|
@ -172,6 +172,7 @@ snd-soc-tlv320aic32x4-i2c-objs := tlv320aic32x4-i2c.o
|
||||
snd-soc-tlv320aic32x4-spi-objs := tlv320aic32x4-spi.o
|
||||
snd-soc-tlv320aic3x-objs := tlv320aic3x.o
|
||||
snd-soc-tlv320dac33-objs := tlv320dac33.o
|
||||
snd-soc-tscs42xx-objs := tscs42xx.o
|
||||
snd-soc-ts3a227e-objs := ts3a227e.o
|
||||
snd-soc-twl4030-objs := twl4030.o
|
||||
snd-soc-twl6040-objs := twl6040.o
|
||||
@ -416,6 +417,7 @@ obj-$(CONFIG_SND_SOC_TLV320AIC32X4_I2C) += snd-soc-tlv320aic32x4-i2c.o
|
||||
obj-$(CONFIG_SND_SOC_TLV320AIC32X4_SPI) += snd-soc-tlv320aic32x4-spi.o
|
||||
obj-$(CONFIG_SND_SOC_TLV320AIC3X) += snd-soc-tlv320aic3x.o
|
||||
obj-$(CONFIG_SND_SOC_TLV320DAC33) += snd-soc-tlv320dac33.o
|
||||
obj-$(CONFIG_SND_SOC_TSCS42XX) += snd-soc-tscs42xx.o
|
||||
obj-$(CONFIG_SND_SOC_TS3A227E) += snd-soc-ts3a227e.o
|
||||
obj-$(CONFIG_SND_SOC_TWL4030) += snd-soc-twl4030.o
|
||||
obj-$(CONFIG_SND_SOC_TWL6040) += snd-soc-twl6040.o
|
||||
|
@ -241,7 +241,7 @@ int ts3a227e_enable_jack_detect(struct snd_soc_component *component,
|
||||
{
|
||||
struct ts3a227e *ts3a227e = snd_soc_component_get_drvdata(component);
|
||||
|
||||
snd_jack_set_key(jack->jack, SND_JACK_BTN_0, KEY_MEDIA);
|
||||
snd_jack_set_key(jack->jack, SND_JACK_BTN_0, KEY_PLAYPAUSE);
|
||||
snd_jack_set_key(jack->jack, SND_JACK_BTN_1, KEY_VOICECOMMAND);
|
||||
snd_jack_set_key(jack->jack, SND_JACK_BTN_2, KEY_VOLUMEUP);
|
||||
snd_jack_set_key(jack->jack, SND_JACK_BTN_3, KEY_VOLUMEDOWN);
|
||||
|
1456
sound/soc/codecs/tscs42xx.c
Normal file
1456
sound/soc/codecs/tscs42xx.c
Normal file
File diff suppressed because it is too large
Load Diff
2693
sound/soc/codecs/tscs42xx.h
Normal file
2693
sound/soc/codecs/tscs42xx.h
Normal file
File diff suppressed because it is too large
Load Diff
@ -240,7 +240,6 @@ static struct twl4030_codec_data *twl4030_get_pdata(struct snd_soc_codec *codec)
|
||||
sizeof(struct twl4030_codec_data),
|
||||
GFP_KERNEL);
|
||||
if (!pdata) {
|
||||
dev_err(codec->dev, "Can not allocate memory\n");
|
||||
of_node_put(twl4030_codec_node);
|
||||
return NULL;
|
||||
}
|
||||
@ -851,14 +850,14 @@ static int snd_soc_get_volsw_twl4030(struct snd_kcontrol *kcontrol,
|
||||
int mask = (1 << fls(max)) - 1;
|
||||
|
||||
ucontrol->value.integer.value[0] =
|
||||
(snd_soc_read(codec, reg) >> shift) & mask;
|
||||
(twl4030_read(codec, reg) >> shift) & mask;
|
||||
if (ucontrol->value.integer.value[0])
|
||||
ucontrol->value.integer.value[0] =
|
||||
max + 1 - ucontrol->value.integer.value[0];
|
||||
|
||||
if (shift != rshift) {
|
||||
ucontrol->value.integer.value[1] =
|
||||
(snd_soc_read(codec, reg) >> rshift) & mask;
|
||||
(twl4030_read(codec, reg) >> rshift) & mask;
|
||||
if (ucontrol->value.integer.value[1])
|
||||
ucontrol->value.integer.value[1] =
|
||||
max + 1 - ucontrol->value.integer.value[1];
|
||||
@ -909,9 +908,9 @@ static int snd_soc_get_volsw_r2_twl4030(struct snd_kcontrol *kcontrol,
|
||||
int mask = (1<<fls(max))-1;
|
||||
|
||||
ucontrol->value.integer.value[0] =
|
||||
(snd_soc_read(codec, reg) >> shift) & mask;
|
||||
(twl4030_read(codec, reg) >> shift) & mask;
|
||||
ucontrol->value.integer.value[1] =
|
||||
(snd_soc_read(codec, reg2) >> shift) & mask;
|
||||
(twl4030_read(codec, reg2) >> shift) & mask;
|
||||
|
||||
if (ucontrol->value.integer.value[0])
|
||||
ucontrol->value.integer.value[0] =
|
||||
@ -2196,8 +2195,6 @@ static int twl4030_soc_remove(struct snd_soc_codec *codec)
|
||||
static const struct snd_soc_codec_driver soc_codec_dev_twl4030 = {
|
||||
.probe = twl4030_soc_probe,
|
||||
.remove = twl4030_soc_remove,
|
||||
.read = twl4030_read,
|
||||
.write = twl4030_write,
|
||||
.set_bias_level = twl4030_set_bias_level,
|
||||
.idle_bias_off = true,
|
||||
|
||||
|
@ -106,10 +106,12 @@ static const struct snd_pcm_hw_constraint_list sysclk_constraints[] = {
|
||||
{ .count = ARRAY_SIZE(hp_rates), .list = hp_rates, },
|
||||
};
|
||||
|
||||
#define to_twl6040(codec) dev_get_drvdata((codec)->dev->parent)
|
||||
|
||||
static unsigned int twl6040_read(struct snd_soc_codec *codec, unsigned int reg)
|
||||
{
|
||||
struct twl6040_data *priv = snd_soc_codec_get_drvdata(codec);
|
||||
struct twl6040 *twl6040 = codec->control_data;
|
||||
struct twl6040 *twl6040 = to_twl6040(codec);
|
||||
u8 value;
|
||||
|
||||
if (reg >= TWL6040_CACHEREGNUM)
|
||||
@ -171,7 +173,7 @@ static inline void twl6040_update_dl12_cache(struct snd_soc_codec *codec,
|
||||
static int twl6040_write(struct snd_soc_codec *codec,
|
||||
unsigned int reg, unsigned int value)
|
||||
{
|
||||
struct twl6040 *twl6040 = codec->control_data;
|
||||
struct twl6040 *twl6040 = to_twl6040(codec);
|
||||
|
||||
if (reg >= TWL6040_CACHEREGNUM)
|
||||
return -EIO;
|
||||
@ -541,7 +543,7 @@ int twl6040_get_dl1_gain(struct snd_soc_codec *codec)
|
||||
if (snd_soc_dapm_get_pin_status(dapm, "HSOR") ||
|
||||
snd_soc_dapm_get_pin_status(dapm, "HSOL")) {
|
||||
|
||||
u8 val = snd_soc_read(codec, TWL6040_REG_HSLCTL);
|
||||
u8 val = twl6040_read(codec, TWL6040_REG_HSLCTL);
|
||||
if (val & TWL6040_HSDACMODE)
|
||||
/* HSDACL in LP mode */
|
||||
return -8; /* -8dB */
|
||||
@ -572,7 +574,7 @@ EXPORT_SYMBOL_GPL(twl6040_get_trim_value);
|
||||
|
||||
int twl6040_get_hs_step_size(struct snd_soc_codec *codec)
|
||||
{
|
||||
struct twl6040 *twl6040 = codec->control_data;
|
||||
struct twl6040 *twl6040 = to_twl6040(codec);
|
||||
|
||||
if (twl6040_get_revid(twl6040) < TWL6040_REV_ES1_3)
|
||||
/* For ES under ES_1.3 HS step is 2 mV */
|
||||
@ -830,7 +832,7 @@ static const struct snd_soc_dapm_route intercon[] = {
|
||||
static int twl6040_set_bias_level(struct snd_soc_codec *codec,
|
||||
enum snd_soc_bias_level level)
|
||||
{
|
||||
struct twl6040 *twl6040 = codec->control_data;
|
||||
struct twl6040 *twl6040 = to_twl6040(codec);
|
||||
struct twl6040_data *priv = snd_soc_codec_get_drvdata(codec);
|
||||
int ret = 0;
|
||||
|
||||
@ -922,7 +924,7 @@ static int twl6040_prepare(struct snd_pcm_substream *substream,
|
||||
struct snd_soc_dai *dai)
|
||||
{
|
||||
struct snd_soc_codec *codec = dai->codec;
|
||||
struct twl6040 *twl6040 = codec->control_data;
|
||||
struct twl6040 *twl6040 = to_twl6040(codec);
|
||||
struct twl6040_data *priv = snd_soc_codec_get_drvdata(codec);
|
||||
int ret;
|
||||
|
||||
@ -964,7 +966,7 @@ static int twl6040_set_dai_sysclk(struct snd_soc_dai *codec_dai,
|
||||
static void twl6040_mute_path(struct snd_soc_codec *codec, enum twl6040_dai_id id,
|
||||
int mute)
|
||||
{
|
||||
struct twl6040 *twl6040 = codec->control_data;
|
||||
struct twl6040 *twl6040 = to_twl6040(codec);
|
||||
struct twl6040_data *priv = snd_soc_codec_get_drvdata(codec);
|
||||
int hslctl, hsrctl, earctl;
|
||||
int hflctl, hfrctl;
|
||||
@ -1108,7 +1110,6 @@ static struct snd_soc_dai_driver twl6040_dai[] = {
|
||||
static int twl6040_probe(struct snd_soc_codec *codec)
|
||||
{
|
||||
struct twl6040_data *priv;
|
||||
struct twl6040 *twl6040 = dev_get_drvdata(codec->dev->parent);
|
||||
struct platform_device *pdev = to_platform_device(codec->dev);
|
||||
int ret = 0;
|
||||
|
||||
@ -1119,7 +1120,6 @@ static int twl6040_probe(struct snd_soc_codec *codec)
|
||||
snd_soc_codec_set_drvdata(codec, priv);
|
||||
|
||||
priv->codec = codec;
|
||||
codec->control_data = twl6040;
|
||||
|
||||
priv->plug_irq = platform_get_irq(pdev, 0);
|
||||
if (priv->plug_irq < 0) {
|
||||
@ -1158,8 +1158,6 @@ static int twl6040_remove(struct snd_soc_codec *codec)
|
||||
static const struct snd_soc_codec_driver soc_codec_dev_twl6040 = {
|
||||
.probe = twl6040_probe,
|
||||
.remove = twl6040_remove,
|
||||
.read = twl6040_read,
|
||||
.write = twl6040_write,
|
||||
.set_bias_level = twl6040_set_bias_level,
|
||||
.suspend_bias_off = true,
|
||||
.ignore_pmdown_time = true,
|
||||
|
@ -37,7 +37,8 @@ struct uda1380_priv {
|
||||
struct snd_soc_codec *codec;
|
||||
unsigned int dac_clk;
|
||||
struct work_struct work;
|
||||
void *control_data;
|
||||
struct i2c_client *i2c;
|
||||
u16 *reg_cache;
|
||||
};
|
||||
|
||||
/*
|
||||
@ -63,7 +64,9 @@ static unsigned long uda1380_cache_dirty;
|
||||
static inline unsigned int uda1380_read_reg_cache(struct snd_soc_codec *codec,
|
||||
unsigned int reg)
|
||||
{
|
||||
u16 *cache = codec->reg_cache;
|
||||
struct uda1380_priv *uda1380 = snd_soc_codec_get_drvdata(codec);
|
||||
u16 *cache = uda1380->reg_cache;
|
||||
|
||||
if (reg == UDA1380_RESET)
|
||||
return 0;
|
||||
if (reg >= UDA1380_CACHEREGNUM)
|
||||
@ -77,7 +80,8 @@ static inline unsigned int uda1380_read_reg_cache(struct snd_soc_codec *codec,
|
||||
static inline void uda1380_write_reg_cache(struct snd_soc_codec *codec,
|
||||
u16 reg, unsigned int value)
|
||||
{
|
||||
u16 *cache = codec->reg_cache;
|
||||
struct uda1380_priv *uda1380 = snd_soc_codec_get_drvdata(codec);
|
||||
u16 *cache = uda1380->reg_cache;
|
||||
|
||||
if (reg >= UDA1380_CACHEREGNUM)
|
||||
return;
|
||||
@ -92,6 +96,7 @@ static inline void uda1380_write_reg_cache(struct snd_soc_codec *codec,
|
||||
static int uda1380_write(struct snd_soc_codec *codec, unsigned int reg,
|
||||
unsigned int value)
|
||||
{
|
||||
struct uda1380_priv *uda1380 = snd_soc_codec_get_drvdata(codec);
|
||||
u8 data[3];
|
||||
|
||||
/* data is
|
||||
@ -111,10 +116,10 @@ static int uda1380_write(struct snd_soc_codec *codec, unsigned int reg,
|
||||
if (!snd_soc_codec_is_active(codec) && (reg >= UDA1380_MVOL))
|
||||
return 0;
|
||||
pr_debug("uda1380: hw write %x val %x\n", reg, value);
|
||||
if (codec->hw_write(codec->control_data, data, 3) == 3) {
|
||||
if (i2c_master_send(uda1380->i2c, data, 3) == 3) {
|
||||
unsigned int val;
|
||||
i2c_master_send(codec->control_data, data, 1);
|
||||
i2c_master_recv(codec->control_data, data, 2);
|
||||
i2c_master_send(uda1380->i2c, data, 1);
|
||||
i2c_master_recv(uda1380->i2c, data, 2);
|
||||
val = (data[0]<<8) | data[1];
|
||||
if (val != value) {
|
||||
pr_debug("uda1380: READ BACK VAL %x\n",
|
||||
@ -130,16 +135,17 @@ static int uda1380_write(struct snd_soc_codec *codec, unsigned int reg,
|
||||
|
||||
static void uda1380_sync_cache(struct snd_soc_codec *codec)
|
||||
{
|
||||
struct uda1380_priv *uda1380 = snd_soc_codec_get_drvdata(codec);
|
||||
int reg;
|
||||
u8 data[3];
|
||||
u16 *cache = codec->reg_cache;
|
||||
u16 *cache = uda1380->reg_cache;
|
||||
|
||||
/* Sync reg_cache with the hardware */
|
||||
for (reg = 0; reg < UDA1380_MVOL; reg++) {
|
||||
data[0] = reg;
|
||||
data[1] = (cache[reg] & 0xff00) >> 8;
|
||||
data[2] = cache[reg] & 0x00ff;
|
||||
if (codec->hw_write(codec->control_data, data, 3) != 3)
|
||||
if (i2c_master_send(uda1380->i2c, data, 3) != 3)
|
||||
dev_err(codec->dev, "%s: write to reg 0x%x failed\n",
|
||||
__func__, reg);
|
||||
}
|
||||
@ -148,6 +154,7 @@ static void uda1380_sync_cache(struct snd_soc_codec *codec)
|
||||
static int uda1380_reset(struct snd_soc_codec *codec)
|
||||
{
|
||||
struct uda1380_platform_data *pdata = codec->dev->platform_data;
|
||||
struct uda1380_priv *uda1380 = snd_soc_codec_get_drvdata(codec);
|
||||
|
||||
if (gpio_is_valid(pdata->gpio_reset)) {
|
||||
gpio_set_value(pdata->gpio_reset, 1);
|
||||
@ -160,7 +167,7 @@ static int uda1380_reset(struct snd_soc_codec *codec)
|
||||
data[1] = 0;
|
||||
data[2] = 0;
|
||||
|
||||
if (codec->hw_write(codec->control_data, data, 3) != 3) {
|
||||
if (i2c_master_send(uda1380->i2c, data, 3) != 3) {
|
||||
dev_err(codec->dev, "%s: failed\n", __func__);
|
||||
return -EIO;
|
||||
}
|
||||
@ -695,9 +702,6 @@ static int uda1380_probe(struct snd_soc_codec *codec)
|
||||
|
||||
uda1380->codec = codec;
|
||||
|
||||
codec->hw_write = (hw_write_t)i2c_master_send;
|
||||
codec->control_data = uda1380->control_data;
|
||||
|
||||
if (!gpio_is_valid(pdata->gpio_power)) {
|
||||
ret = uda1380_reset(codec);
|
||||
if (ret)
|
||||
@ -722,16 +726,9 @@ static int uda1380_probe(struct snd_soc_codec *codec)
|
||||
|
||||
static const struct snd_soc_codec_driver soc_codec_dev_uda1380 = {
|
||||
.probe = uda1380_probe,
|
||||
.read = uda1380_read_reg_cache,
|
||||
.write = uda1380_write,
|
||||
.set_bias_level = uda1380_set_bias_level,
|
||||
.suspend_bias_off = true,
|
||||
|
||||
.reg_cache_size = ARRAY_SIZE(uda1380_reg),
|
||||
.reg_word_size = sizeof(u16),
|
||||
.reg_cache_default = uda1380_reg,
|
||||
.reg_cache_step = 1,
|
||||
|
||||
.component_driver = {
|
||||
.controls = uda1380_snd_controls,
|
||||
.num_controls = ARRAY_SIZE(uda1380_snd_controls),
|
||||
@ -771,8 +768,15 @@ static int uda1380_i2c_probe(struct i2c_client *i2c,
|
||||
return ret;
|
||||
}
|
||||
|
||||
uda1380->reg_cache = devm_kmemdup(&i2c->dev,
|
||||
uda1380_reg,
|
||||
ARRAY_SIZE(uda1380_reg) * sizeof(u16),
|
||||
GFP_KERNEL);
|
||||
if (!uda1380->reg_cache)
|
||||
return -ENOMEM;
|
||||
|
||||
i2c_set_clientdata(i2c, uda1380);
|
||||
uda1380->control_data = i2c;
|
||||
uda1380->i2c = i2c;
|
||||
|
||||
ret = snd_soc_register_codec(&i2c->dev,
|
||||
&soc_codec_dev_uda1380, uda1380_dai, ARRAY_SIZE(uda1380_dai));
|
||||
|
Loading…
Reference in New Issue
Block a user