Merge remote-tracking branches 'asoc/topic/tscs42xx', 'asoc/topic/twl4030', 'asoc/topic/twl6040' and 'asoc/topic/uda1380' into asoc-next
This commit is contained in:
commit
535f9af41b
|
@ -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.
|
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
|
||||||
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
|
||||||
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
|
||||||
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
|
||||||
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
|
||||||
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
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
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),
|
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,
|
||||||
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,
|
||||||
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)
|
||||||
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[] = {
|
||||||
{ .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,
|
||||||
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)
|
||||||
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);
|
||||||
|
|
||||||
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[] = {
|
||||||
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,
|
||||||
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,
|
||||||
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[] = {
|
||||||
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)
|
||||||
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)
|
||||||
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 {
|
||||||
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;
|
||||||
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,
|
||||||
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,
|
||||||
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,
|
||||||
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,
|
||||||
|
|
||||||
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)
|
||||||
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)
|
||||||
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)
|
||||||
|
|
||||||
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)
|
||||||
|
|
||||||
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,
|
||||||
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));
|
||||||
|
|
Loading…
Reference in New Issue