Commit 535f9af4 authored by Mark Brown's avatar Mark Brown

Merge remote-tracking branches 'asoc/topic/tscs42xx', 'asoc/topic/twl4030',...

Merge remote-tracking branches 'asoc/topic/tscs42xx', 'asoc/topic/twl4030', 'asoc/topic/twl6040' and 'asoc/topic/uda1380' into asoc-next
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 ...@@ -347,6 +347,7 @@ tcg Trusted Computing Group
tcl Toby Churchill Ltd. tcl Toby Churchill Ltd.
technexion TechNexion technexion TechNexion
technologic Technologic Systems technologic Technologic Systems
tempo Tempo Semiconductor
terasic Terasic Inc. terasic Terasic Inc.
thine THine Electronics, Inc. thine THine Electronics, Inc.
ti Texas Instruments ti Texas Instruments
......
...@@ -13850,6 +13850,13 @@ T: git git://git.kernel.org/pub/scm/linux/kernel/git/jikos/trivial.git ...@@ -13850,6 +13850,13 @@ T: git git://git.kernel.org/pub/scm/linux/kernel/git/jikos/trivial.git
S: Maintained S: Maintained
K: ^Subject:.*(?i)trivial 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 TTY LAYER
M: Greg Kroah-Hartman <gregkh@linuxfoundation.org> M: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
M: Jiri Slaby <jslaby@suse.com> M: Jiri Slaby <jslaby@suse.com>
......
...@@ -161,6 +161,7 @@ config SND_SOC_ALL_CODECS ...@@ -161,6 +161,7 @@ config SND_SOC_ALL_CODECS
select SND_SOC_TLV320AIC3X if I2C select SND_SOC_TLV320AIC3X if I2C
select SND_SOC_TPA6130A2 if I2C select SND_SOC_TPA6130A2 if I2C
select SND_SOC_TLV320DAC33 if I2C select SND_SOC_TLV320DAC33 if I2C
select SND_SOC_TSCS42XX if I2C
select SND_SOC_TS3A227E if I2C select SND_SOC_TS3A227E if I2C
select SND_SOC_TWL4030 if TWL4030_CORE select SND_SOC_TWL4030 if TWL4030_CORE
select SND_SOC_TWL6040 if TWL6040_CORE select SND_SOC_TWL6040 if TWL6040_CORE
...@@ -959,6 +960,13 @@ config SND_SOC_TS3A227E ...@@ -959,6 +960,13 @@ config SND_SOC_TS3A227E
tristate "TI Headset/Mic detect and keypress chip" tristate "TI Headset/Mic detect and keypress chip"
depends on I2C 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 config SND_SOC_TWL4030
select MFD_TWL4030_AUDIO select MFD_TWL4030_AUDIO
tristate tristate
......
...@@ -171,6 +171,7 @@ snd-soc-tlv320aic32x4-i2c-objs := tlv320aic32x4-i2c.o ...@@ -171,6 +171,7 @@ snd-soc-tlv320aic32x4-i2c-objs := tlv320aic32x4-i2c.o
snd-soc-tlv320aic32x4-spi-objs := tlv320aic32x4-spi.o snd-soc-tlv320aic32x4-spi-objs := tlv320aic32x4-spi.o
snd-soc-tlv320aic3x-objs := tlv320aic3x.o snd-soc-tlv320aic3x-objs := tlv320aic3x.o
snd-soc-tlv320dac33-objs := tlv320dac33.o snd-soc-tlv320dac33-objs := tlv320dac33.o
snd-soc-tscs42xx-objs := tscs42xx.o
snd-soc-ts3a227e-objs := ts3a227e.o snd-soc-ts3a227e-objs := ts3a227e.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
...@@ -415,6 +416,7 @@ obj-$(CONFIG_SND_SOC_TLV320AIC32X4_I2C) += snd-soc-tlv320aic32x4-i2c.o ...@@ -415,6 +416,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_TLV320AIC32X4_SPI) += snd-soc-tlv320aic32x4-spi.o
obj-$(CONFIG_SND_SOC_TLV320AIC3X) += snd-soc-tlv320aic3x.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_TSCS42XX) += snd-soc-tscs42xx.o
obj-$(CONFIG_SND_SOC_TS3A227E) += snd-soc-ts3a227e.o obj-$(CONFIG_SND_SOC_TS3A227E) += snd-soc-ts3a227e.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
......
This diff is collapsed.
This diff is collapsed.
...@@ -240,7 +240,6 @@ static struct twl4030_codec_data *twl4030_get_pdata(struct snd_soc_codec *codec) ...@@ -240,7 +240,6 @@ static struct twl4030_codec_data *twl4030_get_pdata(struct snd_soc_codec *codec)
sizeof(struct twl4030_codec_data), sizeof(struct twl4030_codec_data),
GFP_KERNEL); GFP_KERNEL);
if (!pdata) { if (!pdata) {
dev_err(codec->dev, "Can not allocate memory\n");
of_node_put(twl4030_codec_node); of_node_put(twl4030_codec_node);
return NULL; return NULL;
} }
...@@ -851,14 +850,14 @@ static int snd_soc_get_volsw_twl4030(struct snd_kcontrol *kcontrol, ...@@ -851,14 +850,14 @@ static int snd_soc_get_volsw_twl4030(struct snd_kcontrol *kcontrol,
int mask = (1 << fls(max)) - 1; int mask = (1 << fls(max)) - 1;
ucontrol->value.integer.value[0] = ucontrol->value.integer.value[0] =
(snd_soc_read(codec, reg) >> shift) & mask; (twl4030_read(codec, reg) >> shift) & mask;
if (ucontrol->value.integer.value[0]) if (ucontrol->value.integer.value[0])
ucontrol->value.integer.value[0] = ucontrol->value.integer.value[0] =
max + 1 - ucontrol->value.integer.value[0]; max + 1 - ucontrol->value.integer.value[0];
if (shift != rshift) { if (shift != rshift) {
ucontrol->value.integer.value[1] = ucontrol->value.integer.value[1] =
(snd_soc_read(codec, reg) >> rshift) & mask; (twl4030_read(codec, reg) >> rshift) & mask;
if (ucontrol->value.integer.value[1]) if (ucontrol->value.integer.value[1])
ucontrol->value.integer.value[1] = ucontrol->value.integer.value[1] =
max + 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, ...@@ -909,9 +908,9 @@ static int snd_soc_get_volsw_r2_twl4030(struct snd_kcontrol *kcontrol,
int mask = (1<<fls(max))-1; int mask = (1<<fls(max))-1;
ucontrol->value.integer.value[0] = ucontrol->value.integer.value[0] =
(snd_soc_read(codec, reg) >> shift) & mask; (twl4030_read(codec, reg) >> shift) & mask;
ucontrol->value.integer.value[1] = ucontrol->value.integer.value[1] =
(snd_soc_read(codec, reg2) >> shift) & mask; (twl4030_read(codec, reg2) >> shift) & mask;
if (ucontrol->value.integer.value[0]) if (ucontrol->value.integer.value[0])
ucontrol->value.integer.value[0] = ucontrol->value.integer.value[0] =
...@@ -2196,8 +2195,6 @@ static int twl4030_soc_remove(struct snd_soc_codec *codec) ...@@ -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 = { static const struct snd_soc_codec_driver soc_codec_dev_twl4030 = {
.probe = twl4030_soc_probe, .probe = twl4030_soc_probe,
.remove = twl4030_soc_remove, .remove = twl4030_soc_remove,
.read = twl4030_read,
.write = twl4030_write,
.set_bias_level = twl4030_set_bias_level, .set_bias_level = twl4030_set_bias_level,
.idle_bias_off = true, .idle_bias_off = true,
......
...@@ -106,10 +106,12 @@ static const struct snd_pcm_hw_constraint_list sysclk_constraints[] = { ...@@ -106,10 +106,12 @@ static const struct snd_pcm_hw_constraint_list sysclk_constraints[] = {
{ .count = ARRAY_SIZE(hp_rates), .list = hp_rates, }, { .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) 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_data *priv = snd_soc_codec_get_drvdata(codec);
struct twl6040 *twl6040 = codec->control_data; struct twl6040 *twl6040 = to_twl6040(codec);
u8 value; u8 value;
if (reg >= TWL6040_CACHEREGNUM) if (reg >= TWL6040_CACHEREGNUM)
...@@ -171,7 +173,7 @@ static inline void twl6040_update_dl12_cache(struct snd_soc_codec *codec, ...@@ -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, static int twl6040_write(struct snd_soc_codec *codec,
unsigned int reg, unsigned int value) unsigned int reg, unsigned int value)
{ {
struct twl6040 *twl6040 = codec->control_data; struct twl6040 *twl6040 = to_twl6040(codec);
if (reg >= TWL6040_CACHEREGNUM) if (reg >= TWL6040_CACHEREGNUM)
return -EIO; return -EIO;
...@@ -541,7 +543,7 @@ int twl6040_get_dl1_gain(struct snd_soc_codec *codec) ...@@ -541,7 +543,7 @@ int twl6040_get_dl1_gain(struct snd_soc_codec *codec)
if (snd_soc_dapm_get_pin_status(dapm, "HSOR") || if (snd_soc_dapm_get_pin_status(dapm, "HSOR") ||
snd_soc_dapm_get_pin_status(dapm, "HSOL")) { 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) if (val & TWL6040_HSDACMODE)
/* HSDACL in LP mode */ /* HSDACL in LP mode */
return -8; /* -8dB */ return -8; /* -8dB */
...@@ -572,7 +574,7 @@ EXPORT_SYMBOL_GPL(twl6040_get_trim_value); ...@@ -572,7 +574,7 @@ EXPORT_SYMBOL_GPL(twl6040_get_trim_value);
int twl6040_get_hs_step_size(struct snd_soc_codec *codec) 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) if (twl6040_get_revid(twl6040) < TWL6040_REV_ES1_3)
/* For ES under ES_1.3 HS step is 2 mV */ /* For ES under ES_1.3 HS step is 2 mV */
...@@ -830,7 +832,7 @@ static const struct snd_soc_dapm_route intercon[] = { ...@@ -830,7 +832,7 @@ static const struct snd_soc_dapm_route intercon[] = {
static int twl6040_set_bias_level(struct snd_soc_codec *codec, static int twl6040_set_bias_level(struct snd_soc_codec *codec,
enum snd_soc_bias_level level) 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); struct twl6040_data *priv = snd_soc_codec_get_drvdata(codec);
int ret = 0; int ret = 0;
...@@ -922,7 +924,7 @@ static int twl6040_prepare(struct snd_pcm_substream *substream, ...@@ -922,7 +924,7 @@ static int twl6040_prepare(struct snd_pcm_substream *substream,
struct snd_soc_dai *dai) struct snd_soc_dai *dai)
{ {
struct snd_soc_codec *codec = dai->codec; 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); struct twl6040_data *priv = snd_soc_codec_get_drvdata(codec);
int ret; int ret;
...@@ -964,7 +966,7 @@ static int twl6040_set_dai_sysclk(struct snd_soc_dai *codec_dai, ...@@ -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, static void twl6040_mute_path(struct snd_soc_codec *codec, enum twl6040_dai_id id,
int mute) int mute)
{ {
struct twl6040 *twl6040 = codec->control_data; struct twl6040 *twl6040 = to_twl6040(codec);
struct twl6040_data *priv = snd_soc_codec_get_drvdata(codec); struct twl6040_data *priv = snd_soc_codec_get_drvdata(codec);
int hslctl, hsrctl, earctl; int hslctl, hsrctl, earctl;
int hflctl, hfrctl; int hflctl, hfrctl;
...@@ -1108,7 +1110,6 @@ static struct snd_soc_dai_driver twl6040_dai[] = { ...@@ -1108,7 +1110,6 @@ static struct snd_soc_dai_driver twl6040_dai[] = {
static int twl6040_probe(struct snd_soc_codec *codec) static int twl6040_probe(struct snd_soc_codec *codec)
{ {
struct twl6040_data *priv; struct twl6040_data *priv;
struct twl6040 *twl6040 = dev_get_drvdata(codec->dev->parent);
struct platform_device *pdev = to_platform_device(codec->dev); struct platform_device *pdev = to_platform_device(codec->dev);
int ret = 0; int ret = 0;
...@@ -1119,7 +1120,6 @@ static int twl6040_probe(struct snd_soc_codec *codec) ...@@ -1119,7 +1120,6 @@ static int twl6040_probe(struct snd_soc_codec *codec)
snd_soc_codec_set_drvdata(codec, priv); snd_soc_codec_set_drvdata(codec, priv);
priv->codec = codec; priv->codec = codec;
codec->control_data = twl6040;
priv->plug_irq = platform_get_irq(pdev, 0); priv->plug_irq = platform_get_irq(pdev, 0);
if (priv->plug_irq < 0) { if (priv->plug_irq < 0) {
...@@ -1158,8 +1158,6 @@ static int twl6040_remove(struct snd_soc_codec *codec) ...@@ -1158,8 +1158,6 @@ static int twl6040_remove(struct snd_soc_codec *codec)
static const struct snd_soc_codec_driver soc_codec_dev_twl6040 = { static const struct snd_soc_codec_driver soc_codec_dev_twl6040 = {
.probe = twl6040_probe, .probe = twl6040_probe,
.remove = twl6040_remove, .remove = twl6040_remove,
.read = twl6040_read,
.write = twl6040_write,
.set_bias_level = twl6040_set_bias_level, .set_bias_level = twl6040_set_bias_level,
.suspend_bias_off = true, .suspend_bias_off = true,
.ignore_pmdown_time = true, .ignore_pmdown_time = true,
......
...@@ -37,7 +37,8 @@ struct uda1380_priv { ...@@ -37,7 +37,8 @@ struct uda1380_priv {
struct snd_soc_codec *codec; struct snd_soc_codec *codec;
unsigned int dac_clk; unsigned int dac_clk;
struct work_struct work; struct work_struct work;
void *control_data; struct i2c_client *i2c;
u16 *reg_cache;
}; };
/* /*
...@@ -63,7 +64,9 @@ static unsigned long uda1380_cache_dirty; ...@@ -63,7 +64,9 @@ static unsigned long uda1380_cache_dirty;
static inline unsigned int uda1380_read_reg_cache(struct snd_soc_codec *codec, static inline unsigned int uda1380_read_reg_cache(struct snd_soc_codec *codec,
unsigned int reg) 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) if (reg == UDA1380_RESET)
return 0; return 0;
if (reg >= UDA1380_CACHEREGNUM) if (reg >= UDA1380_CACHEREGNUM)
...@@ -77,7 +80,8 @@ static inline unsigned int uda1380_read_reg_cache(struct snd_soc_codec *codec, ...@@ -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, static inline void uda1380_write_reg_cache(struct snd_soc_codec *codec,
u16 reg, unsigned int value) 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) if (reg >= UDA1380_CACHEREGNUM)
return; return;
...@@ -92,6 +96,7 @@ static inline void uda1380_write_reg_cache(struct snd_soc_codec *codec, ...@@ -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, static int uda1380_write(struct snd_soc_codec *codec, unsigned int reg,
unsigned int value) unsigned int value)
{ {
struct uda1380_priv *uda1380 = snd_soc_codec_get_drvdata(codec);
u8 data[3]; u8 data[3];
/* data is /* data is
...@@ -111,10 +116,10 @@ static int uda1380_write(struct snd_soc_codec *codec, unsigned int reg, ...@@ -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)) if (!snd_soc_codec_is_active(codec) && (reg >= UDA1380_MVOL))
return 0; return 0;
pr_debug("uda1380: hw write %x val %x\n", reg, value); 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; unsigned int val;
i2c_master_send(codec->control_data, data, 1); i2c_master_send(uda1380->i2c, data, 1);
i2c_master_recv(codec->control_data, data, 2); i2c_master_recv(uda1380->i2c, data, 2);
val = (data[0]<<8) | data[1]; val = (data[0]<<8) | data[1];
if (val != value) { if (val != value) {
pr_debug("uda1380: READ BACK VAL %x\n", pr_debug("uda1380: READ BACK VAL %x\n",
...@@ -130,16 +135,17 @@ static int uda1380_write(struct snd_soc_codec *codec, unsigned int reg, ...@@ -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) static void uda1380_sync_cache(struct snd_soc_codec *codec)
{ {
struct uda1380_priv *uda1380 = snd_soc_codec_get_drvdata(codec);
int reg; int reg;
u8 data[3]; u8 data[3];
u16 *cache = codec->reg_cache; u16 *cache = uda1380->reg_cache;
/* Sync reg_cache with the hardware */ /* Sync reg_cache with the hardware */
for (reg = 0; reg < UDA1380_MVOL; reg++) { for (reg = 0; reg < UDA1380_MVOL; reg++) {
data[0] = reg; data[0] = reg;
data[1] = (cache[reg] & 0xff00) >> 8; data[1] = (cache[reg] & 0xff00) >> 8;
data[2] = cache[reg] & 0x00ff; 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", dev_err(codec->dev, "%s: write to reg 0x%x failed\n",
__func__, reg); __func__, reg);
} }
...@@ -148,6 +154,7 @@ static void uda1380_sync_cache(struct snd_soc_codec *codec) ...@@ -148,6 +154,7 @@ static void uda1380_sync_cache(struct snd_soc_codec *codec)
static int uda1380_reset(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_platform_data *pdata = codec->dev->platform_data;
struct uda1380_priv *uda1380 = snd_soc_codec_get_drvdata(codec);
if (gpio_is_valid(pdata->gpio_reset)) { if (gpio_is_valid(pdata->gpio_reset)) {
gpio_set_value(pdata->gpio_reset, 1); gpio_set_value(pdata->gpio_reset, 1);
...@@ -160,7 +167,7 @@ static int uda1380_reset(struct snd_soc_codec *codec) ...@@ -160,7 +167,7 @@ static int uda1380_reset(struct snd_soc_codec *codec)
data[1] = 0; data[1] = 0;
data[2] = 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__); dev_err(codec->dev, "%s: failed\n", __func__);
return -EIO; return -EIO;
} }
...@@ -695,9 +702,6 @@ static int uda1380_probe(struct snd_soc_codec *codec) ...@@ -695,9 +702,6 @@ static int uda1380_probe(struct snd_soc_codec *codec)
uda1380->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)) { if (!gpio_is_valid(pdata->gpio_power)) {
ret = uda1380_reset(codec); ret = uda1380_reset(codec);
if (ret) if (ret)
...@@ -722,16 +726,9 @@ static int uda1380_probe(struct snd_soc_codec *codec) ...@@ -722,16 +726,9 @@ static int uda1380_probe(struct snd_soc_codec *codec)
static const struct snd_soc_codec_driver soc_codec_dev_uda1380 = { static const struct snd_soc_codec_driver soc_codec_dev_uda1380 = {
.probe = uda1380_probe, .probe = uda1380_probe,
.read = uda1380_read_reg_cache,
.write = uda1380_write,
.set_bias_level = uda1380_set_bias_level, .set_bias_level = uda1380_set_bias_level,
.suspend_bias_off = true, .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 = { .component_driver = {
.controls = uda1380_snd_controls, .controls = uda1380_snd_controls,
.num_controls = ARRAY_SIZE(uda1380_snd_controls), .num_controls = ARRAY_SIZE(uda1380_snd_controls),
...@@ -771,8 +768,15 @@ static int uda1380_i2c_probe(struct i2c_client *i2c, ...@@ -771,8 +768,15 @@ static int uda1380_i2c_probe(struct i2c_client *i2c,
return ret; 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); i2c_set_clientdata(i2c, uda1380);
uda1380->control_data = i2c; uda1380->i2c = i2c;
ret = snd_soc_register_codec(&i2c->dev, ret = snd_soc_register_codec(&i2c->dev,
&soc_codec_dev_uda1380, uda1380_dai, ARRAY_SIZE(uda1380_dai)); &soc_codec_dev_uda1380, uda1380_dai, ARRAY_SIZE(uda1380_dai));
......
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