Merge branch 'topic/asoc' into for-linus
Conflicts: sound/soc/codecs/ad1938.c
Šī revīzija ir iekļauta:
@@ -36,24 +36,14 @@
|
||||
|
||||
static struct i2c_client *tpa6130a2_client;
|
||||
|
||||
#define TPA6130A2_NUM_SUPPLIES 2
|
||||
static const char *tpa6130a2_supply_names[TPA6130A2_NUM_SUPPLIES] = {
|
||||
"CPVSS",
|
||||
"Vdd",
|
||||
};
|
||||
|
||||
static const char *tpa6140a2_supply_names[TPA6130A2_NUM_SUPPLIES] = {
|
||||
"HPVdd",
|
||||
"AVdd",
|
||||
};
|
||||
|
||||
/* This struct is used to save the context */
|
||||
struct tpa6130a2_data {
|
||||
struct mutex mutex;
|
||||
unsigned char regs[TPA6130A2_CACHEREGNUM];
|
||||
struct regulator_bulk_data supplies[TPA6130A2_NUM_SUPPLIES];
|
||||
struct regulator *supply;
|
||||
int power_gpio;
|
||||
unsigned char power_state;
|
||||
enum tpa_model id;
|
||||
};
|
||||
|
||||
static int tpa6130a2_i2c_read(int reg)
|
||||
@@ -135,11 +125,10 @@ static int tpa6130a2_power(int power)
|
||||
if (data->power_gpio >= 0)
|
||||
gpio_set_value(data->power_gpio, 1);
|
||||
|
||||
ret = regulator_bulk_enable(ARRAY_SIZE(data->supplies),
|
||||
data->supplies);
|
||||
ret = regulator_enable(data->supply);
|
||||
if (ret != 0) {
|
||||
dev_err(&tpa6130a2_client->dev,
|
||||
"Failed to enable supplies: %d\n", ret);
|
||||
"Failed to enable supply: %d\n", ret);
|
||||
goto exit;
|
||||
}
|
||||
|
||||
@@ -160,11 +149,10 @@ static int tpa6130a2_power(int power)
|
||||
if (data->power_gpio >= 0)
|
||||
gpio_set_value(data->power_gpio, 0);
|
||||
|
||||
ret = regulator_bulk_disable(ARRAY_SIZE(data->supplies),
|
||||
data->supplies);
|
||||
ret = regulator_disable(data->supply);
|
||||
if (ret != 0) {
|
||||
dev_err(&tpa6130a2_client->dev,
|
||||
"Failed to disable supplies: %d\n", ret);
|
||||
"Failed to disable supply: %d\n", ret);
|
||||
goto exit;
|
||||
}
|
||||
|
||||
@@ -176,7 +164,7 @@ exit:
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int tpa6130a2_get_reg(struct snd_kcontrol *kcontrol,
|
||||
static int tpa6130a2_get_volsw(struct snd_kcontrol *kcontrol,
|
||||
struct snd_ctl_elem_value *ucontrol)
|
||||
{
|
||||
struct soc_mixer_control *mc =
|
||||
@@ -184,7 +172,8 @@ static int tpa6130a2_get_reg(struct snd_kcontrol *kcontrol,
|
||||
struct tpa6130a2_data *data;
|
||||
unsigned int reg = mc->reg;
|
||||
unsigned int shift = mc->shift;
|
||||
unsigned int mask = mc->max;
|
||||
int max = mc->max;
|
||||
unsigned int mask = (1 << fls(max)) - 1;
|
||||
unsigned int invert = mc->invert;
|
||||
|
||||
BUG_ON(tpa6130a2_client == NULL);
|
||||
@@ -197,13 +186,13 @@ static int tpa6130a2_get_reg(struct snd_kcontrol *kcontrol,
|
||||
|
||||
if (invert)
|
||||
ucontrol->value.integer.value[0] =
|
||||
mask - ucontrol->value.integer.value[0];
|
||||
max - ucontrol->value.integer.value[0];
|
||||
|
||||
mutex_unlock(&data->mutex);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int tpa6130a2_set_reg(struct snd_kcontrol *kcontrol,
|
||||
static int tpa6130a2_put_volsw(struct snd_kcontrol *kcontrol,
|
||||
struct snd_ctl_elem_value *ucontrol)
|
||||
{
|
||||
struct soc_mixer_control *mc =
|
||||
@@ -211,7 +200,8 @@ static int tpa6130a2_set_reg(struct snd_kcontrol *kcontrol,
|
||||
struct tpa6130a2_data *data;
|
||||
unsigned int reg = mc->reg;
|
||||
unsigned int shift = mc->shift;
|
||||
unsigned int mask = mc->max;
|
||||
int max = mc->max;
|
||||
unsigned int mask = (1 << fls(max)) - 1;
|
||||
unsigned int invert = mc->invert;
|
||||
unsigned int val = (ucontrol->value.integer.value[0] & mask);
|
||||
unsigned int val_reg;
|
||||
@@ -220,7 +210,7 @@ static int tpa6130a2_set_reg(struct snd_kcontrol *kcontrol,
|
||||
data = i2c_get_clientdata(tpa6130a2_client);
|
||||
|
||||
if (invert)
|
||||
val = mask - val;
|
||||
val = max - val;
|
||||
|
||||
mutex_lock(&data->mutex);
|
||||
|
||||
@@ -260,10 +250,24 @@ static const unsigned int tpa6130_tlv[] = {
|
||||
static const struct snd_kcontrol_new tpa6130a2_controls[] = {
|
||||
SOC_SINGLE_EXT_TLV("TPA6130A2 Headphone Playback Volume",
|
||||
TPA6130A2_REG_VOL_MUTE, 0, 0x3f, 0,
|
||||
tpa6130a2_get_reg, tpa6130a2_set_reg,
|
||||
tpa6130a2_get_volsw, tpa6130a2_put_volsw,
|
||||
tpa6130_tlv),
|
||||
};
|
||||
|
||||
static const unsigned int tpa6140_tlv[] = {
|
||||
TLV_DB_RANGE_HEAD(3),
|
||||
0, 8, TLV_DB_SCALE_ITEM(-5900, 400, 0),
|
||||
9, 16, TLV_DB_SCALE_ITEM(-2500, 200, 0),
|
||||
17, 31, TLV_DB_SCALE_ITEM(-1000, 100, 0),
|
||||
};
|
||||
|
||||
static const struct snd_kcontrol_new tpa6140a2_controls[] = {
|
||||
SOC_SINGLE_EXT_TLV("TPA6140A2 Headphone Playback Volume",
|
||||
TPA6130A2_REG_VOL_MUTE, 1, 0x1f, 0,
|
||||
tpa6130a2_get_volsw, tpa6130a2_put_volsw,
|
||||
tpa6140_tlv),
|
||||
};
|
||||
|
||||
/*
|
||||
* Enable or disable channel (left or right)
|
||||
* The bit number for mute and amplifier are the same per channel:
|
||||
@@ -355,8 +359,8 @@ static const struct snd_soc_dapm_widget tpa6130a2_dapm_widgets[] = {
|
||||
0, 0, tpa6130a2_supply_event,
|
||||
SND_SOC_DAPM_POST_PMU|SND_SOC_DAPM_POST_PMD),
|
||||
/* Outputs */
|
||||
SND_SOC_DAPM_HP("TPA6130A2 Headphone Left", NULL),
|
||||
SND_SOC_DAPM_HP("TPA6130A2 Headphone Right", NULL),
|
||||
SND_SOC_DAPM_OUTPUT("TPA6130A2 Headphone Left"),
|
||||
SND_SOC_DAPM_OUTPUT("TPA6130A2 Headphone Right"),
|
||||
};
|
||||
|
||||
static const struct snd_soc_dapm_route audio_map[] = {
|
||||
@@ -369,13 +373,22 @@ static const struct snd_soc_dapm_route audio_map[] = {
|
||||
|
||||
int tpa6130a2_add_controls(struct snd_soc_codec *codec)
|
||||
{
|
||||
struct tpa6130a2_data *data;
|
||||
|
||||
BUG_ON(tpa6130a2_client == NULL);
|
||||
data = i2c_get_clientdata(tpa6130a2_client);
|
||||
|
||||
snd_soc_dapm_new_controls(codec, tpa6130a2_dapm_widgets,
|
||||
ARRAY_SIZE(tpa6130a2_dapm_widgets));
|
||||
|
||||
snd_soc_dapm_add_routes(codec, audio_map, ARRAY_SIZE(audio_map));
|
||||
|
||||
return snd_soc_add_controls(codec, tpa6130a2_controls,
|
||||
ARRAY_SIZE(tpa6130a2_controls));
|
||||
if (data->id == TPA6140A2)
|
||||
return snd_soc_add_controls(codec, tpa6140a2_controls,
|
||||
ARRAY_SIZE(tpa6140a2_controls));
|
||||
else
|
||||
return snd_soc_add_controls(codec, tpa6130a2_controls,
|
||||
ARRAY_SIZE(tpa6130a2_controls));
|
||||
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(tpa6130a2_add_controls);
|
||||
@@ -386,7 +399,8 @@ static int __devinit tpa6130a2_probe(struct i2c_client *client,
|
||||
struct device *dev;
|
||||
struct tpa6130a2_data *data;
|
||||
struct tpa6130a2_platform_data *pdata;
|
||||
int i, ret;
|
||||
const char *regulator;
|
||||
int ret;
|
||||
|
||||
dev = &client->dev;
|
||||
|
||||
@@ -408,6 +422,7 @@ static int __devinit tpa6130a2_probe(struct i2c_client *client,
|
||||
|
||||
pdata = client->dev.platform_data;
|
||||
data->power_gpio = pdata->power_gpio;
|
||||
data->id = pdata->id;
|
||||
|
||||
mutex_init(&data->mutex);
|
||||
|
||||
@@ -426,26 +441,22 @@ static int __devinit tpa6130a2_probe(struct i2c_client *client,
|
||||
gpio_direction_output(data->power_gpio, 0);
|
||||
}
|
||||
|
||||
switch (pdata->id) {
|
||||
case TPA6130A2:
|
||||
for (i = 0; i < ARRAY_SIZE(data->supplies); i++)
|
||||
data->supplies[i].supply = tpa6130a2_supply_names[i];
|
||||
break;
|
||||
case TPA6140A2:
|
||||
for (i = 0; i < ARRAY_SIZE(data->supplies); i++)
|
||||
data->supplies[i].supply = tpa6140a2_supply_names[i];;
|
||||
break;
|
||||
switch (data->id) {
|
||||
default:
|
||||
dev_warn(dev, "Unknown TPA model (%d). Assuming 6130A2\n",
|
||||
pdata->id);
|
||||
for (i = 0; i < ARRAY_SIZE(data->supplies); i++)
|
||||
data->supplies[i].supply = tpa6130a2_supply_names[i];
|
||||
case TPA6130A2:
|
||||
regulator = "Vdd";
|
||||
break;
|
||||
case TPA6140A2:
|
||||
regulator = "AVdd";
|
||||
break;
|
||||
}
|
||||
|
||||
ret = regulator_bulk_get(dev, ARRAY_SIZE(data->supplies),
|
||||
data->supplies);
|
||||
if (ret != 0) {
|
||||
dev_err(dev, "Failed to request supplies: %d\n", ret);
|
||||
data->supply = regulator_get(dev, regulator);
|
||||
if (IS_ERR(data->supply)) {
|
||||
ret = PTR_ERR(data->supply);
|
||||
dev_err(dev, "Failed to request supply: %d\n", ret);
|
||||
goto err_regulator;
|
||||
}
|
||||
|
||||
@@ -468,7 +479,7 @@ static int __devinit tpa6130a2_probe(struct i2c_client *client,
|
||||
return 0;
|
||||
|
||||
err_power:
|
||||
regulator_bulk_free(ARRAY_SIZE(data->supplies), data->supplies);
|
||||
regulator_put(data->supply);
|
||||
err_regulator:
|
||||
if (data->power_gpio >= 0)
|
||||
gpio_free(data->power_gpio);
|
||||
@@ -489,7 +500,7 @@ static int __devexit tpa6130a2_remove(struct i2c_client *client)
|
||||
if (data->power_gpio >= 0)
|
||||
gpio_free(data->power_gpio);
|
||||
|
||||
regulator_bulk_free(ARRAY_SIZE(data->supplies), data->supplies);
|
||||
regulator_put(data->supply);
|
||||
|
||||
kfree(data);
|
||||
tpa6130a2_client = NULL;
|
||||
|
Atsaukties uz šo jaunā problēmā
Block a user