Merge branch 'for-2.6.38' of git://git.kernel.org/pub/scm/linux/kernel/git/lrg/asoc-2.6 into topic/asoc
This commit is contained in:
commit
991e02b446
|
@ -1545,21 +1545,6 @@ static struct i2c_driver aic3x_i2c_driver = {
|
|||
.remove = aic3x_i2c_remove,
|
||||
.id_table = aic3x_i2c_id,
|
||||
};
|
||||
|
||||
static inline void aic3x_i2c_init(void)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = i2c_add_driver(&aic3x_i2c_driver);
|
||||
if (ret)
|
||||
printk(KERN_ERR "%s: error regsitering i2c driver, %d\n",
|
||||
__func__, ret);
|
||||
}
|
||||
|
||||
static inline void aic3x_i2c_exit(void)
|
||||
{
|
||||
i2c_del_driver(&aic3x_i2c_driver);
|
||||
}
|
||||
#endif
|
||||
|
||||
static int __init aic3x_modinit(void)
|
||||
|
|
|
@ -315,8 +315,6 @@ static void dac33_init_chip(struct snd_soc_codec *codec)
|
|||
clock source = internal osc (?) */
|
||||
dac33_write(codec, DAC33_ANA_VOL_SOFT_STEP_CTRL, DAC33_VOLCLKEN);
|
||||
|
||||
dac33_write(codec, DAC33_PWR_CTRL, DAC33_PDNALLB);
|
||||
|
||||
/* Restore only selected registers (gains mostly) */
|
||||
dac33_write(codec, DAC33_LDAC_DIG_VOL_CTRL,
|
||||
dac33_read_reg_cache(codec, DAC33_LDAC_DIG_VOL_CTRL));
|
||||
|
@ -356,6 +354,21 @@ static inline void dac33_soft_power(struct snd_soc_codec *codec, int power)
|
|||
dac33_write(codec, DAC33_PWR_CTRL, reg);
|
||||
}
|
||||
|
||||
static inline void dac33_disable_digital(struct snd_soc_codec *codec)
|
||||
{
|
||||
u8 reg;
|
||||
|
||||
/* Stop the DAI clock */
|
||||
reg = dac33_read_reg_cache(codec, DAC33_SER_AUDIOIF_CTRL_B);
|
||||
reg &= ~DAC33_BCLKON;
|
||||
dac33_write(codec, DAC33_SER_AUDIOIF_CTRL_B, reg);
|
||||
|
||||
/* Power down the Oscillator, and DACs */
|
||||
reg = dac33_read_reg_cache(codec, DAC33_PWR_CTRL);
|
||||
reg &= ~(DAC33_OSCPDNB | DAC33_DACRPDNB | DAC33_DACLPDNB);
|
||||
dac33_write(codec, DAC33_PWR_CTRL, reg);
|
||||
}
|
||||
|
||||
static int dac33_hard_power(struct snd_soc_codec *codec, int power)
|
||||
{
|
||||
struct tlv320dac33_priv *dac33 = snd_soc_codec_get_drvdata(codec);
|
||||
|
@ -404,7 +417,7 @@ exit:
|
|||
return ret;
|
||||
}
|
||||
|
||||
static int playback_event(struct snd_soc_dapm_widget *w,
|
||||
static int dac33_playback_event(struct snd_soc_dapm_widget *w,
|
||||
struct snd_kcontrol *kcontrol, int event)
|
||||
{
|
||||
struct tlv320dac33_priv *dac33 = snd_soc_codec_get_drvdata(w->codec);
|
||||
|
@ -416,6 +429,9 @@ static int playback_event(struct snd_soc_dapm_widget *w,
|
|||
dac33_prepare_chip(dac33->substream);
|
||||
}
|
||||
break;
|
||||
case SND_SOC_DAPM_POST_PMD:
|
||||
dac33_disable_digital(w->codec);
|
||||
break;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
@ -592,8 +608,8 @@ static const struct snd_soc_dapm_widget dac33_dapm_widgets[] = {
|
|||
SND_SOC_DAPM_INPUT("LINEL"),
|
||||
SND_SOC_DAPM_INPUT("LINER"),
|
||||
|
||||
SND_SOC_DAPM_DAC("DACL", "Left Playback", DAC33_LDAC_PWR_CTRL, 2, 0),
|
||||
SND_SOC_DAPM_DAC("DACR", "Right Playback", DAC33_RDAC_PWR_CTRL, 2, 0),
|
||||
SND_SOC_DAPM_DAC("DACL", "Left Playback", SND_SOC_NOPM, 0, 0),
|
||||
SND_SOC_DAPM_DAC("DACR", "Right Playback", SND_SOC_NOPM, 0, 0),
|
||||
|
||||
/* Analog bypass */
|
||||
SND_SOC_DAPM_SWITCH("Analog Left Bypass", SND_SOC_NOPM, 0, 0,
|
||||
|
@ -601,12 +617,18 @@ static const struct snd_soc_dapm_widget dac33_dapm_widgets[] = {
|
|||
SND_SOC_DAPM_SWITCH("Analog Right Bypass", SND_SOC_NOPM, 0, 0,
|
||||
&dac33_dapm_abypassr_control),
|
||||
|
||||
SND_SOC_DAPM_REG(snd_soc_dapm_mixer, "Output Left Amp Power",
|
||||
SND_SOC_DAPM_REG(snd_soc_dapm_mixer, "Output Left Amplifier",
|
||||
DAC33_OUT_AMP_PWR_CTRL, 6, 3, 3, 0),
|
||||
SND_SOC_DAPM_REG(snd_soc_dapm_mixer, "Output Right Amp Power",
|
||||
SND_SOC_DAPM_REG(snd_soc_dapm_mixer, "Output Right Amplifier",
|
||||
DAC33_OUT_AMP_PWR_CTRL, 4, 3, 3, 0),
|
||||
|
||||
SND_SOC_DAPM_PRE("Prepare Playback", playback_event),
|
||||
SND_SOC_DAPM_SUPPLY("Left DAC Power",
|
||||
DAC33_LDAC_PWR_CTRL, 2, 0, NULL, 0),
|
||||
SND_SOC_DAPM_SUPPLY("Right DAC Power",
|
||||
DAC33_RDAC_PWR_CTRL, 2, 0, NULL, 0),
|
||||
|
||||
SND_SOC_DAPM_PRE("Pre Playback", dac33_playback_event),
|
||||
SND_SOC_DAPM_POST("Post Playback", dac33_playback_event),
|
||||
};
|
||||
|
||||
static const struct snd_soc_dapm_route audio_map[] = {
|
||||
|
@ -614,15 +636,18 @@ static const struct snd_soc_dapm_route audio_map[] = {
|
|||
{"Analog Left Bypass", "Switch", "LINEL"},
|
||||
{"Analog Right Bypass", "Switch", "LINER"},
|
||||
|
||||
{"Output Left Amp Power", NULL, "DACL"},
|
||||
{"Output Right Amp Power", NULL, "DACR"},
|
||||
{"Output Left Amplifier", NULL, "DACL"},
|
||||
{"Output Right Amplifier", NULL, "DACR"},
|
||||
|
||||
{"Output Left Amp Power", NULL, "Analog Left Bypass"},
|
||||
{"Output Right Amp Power", NULL, "Analog Right Bypass"},
|
||||
{"Output Left Amplifier", NULL, "Analog Left Bypass"},
|
||||
{"Output Right Amplifier", NULL, "Analog Right Bypass"},
|
||||
|
||||
{"Output Left Amplifier", NULL, "Left DAC Power"},
|
||||
{"Output Right Amplifier", NULL, "Right DAC Power"},
|
||||
|
||||
/* output */
|
||||
{"LEFT_LO", NULL, "Output Left Amp Power"},
|
||||
{"RIGHT_LO", NULL, "Output Right Amp Power"},
|
||||
{"LEFT_LO", NULL, "Output Left Amplifier"},
|
||||
{"RIGHT_LO", NULL, "Output Right Amplifier"},
|
||||
};
|
||||
|
||||
static int dac33_add_widgets(struct snd_soc_codec *codec)
|
||||
|
@ -640,11 +665,13 @@ static int dac33_add_widgets(struct snd_soc_codec *codec)
|
|||
static int dac33_set_bias_level(struct snd_soc_codec *codec,
|
||||
enum snd_soc_bias_level level)
|
||||
{
|
||||
struct tlv320dac33_priv *dac33 = snd_soc_codec_get_drvdata(codec);
|
||||
int ret;
|
||||
|
||||
switch (level) {
|
||||
case SND_SOC_BIAS_ON:
|
||||
dac33_soft_power(codec, 1);
|
||||
if (!dac33->substream)
|
||||
dac33_soft_power(codec, 1);
|
||||
break;
|
||||
case SND_SOC_BIAS_PREPARE:
|
||||
break;
|
||||
|
|
|
@ -41,7 +41,7 @@ struct tpa6130a2_data {
|
|||
unsigned char regs[TPA6130A2_CACHEREGNUM];
|
||||
struct regulator *supply;
|
||||
int power_gpio;
|
||||
unsigned char power_state;
|
||||
u8 power_state:1;
|
||||
enum tpa_model id;
|
||||
};
|
||||
|
||||
|
@ -116,7 +116,7 @@ static int tpa6130a2_initialize(void)
|
|||
return ret;
|
||||
}
|
||||
|
||||
static int tpa6130a2_power(int power)
|
||||
static int tpa6130a2_power(u8 power)
|
||||
{
|
||||
struct tpa6130a2_data *data;
|
||||
u8 val;
|
||||
|
@ -126,8 +126,10 @@ static int tpa6130a2_power(int power)
|
|||
data = i2c_get_clientdata(tpa6130a2_client);
|
||||
|
||||
mutex_lock(&data->mutex);
|
||||
if (power && !data->power_state) {
|
||||
if (power == data->power_state)
|
||||
goto exit;
|
||||
|
||||
if (power) {
|
||||
ret = regulator_enable(data->supply);
|
||||
if (ret != 0) {
|
||||
dev_err(&tpa6130a2_client->dev,
|
||||
|
@ -149,12 +151,7 @@ static int tpa6130a2_power(int power)
|
|||
data->power_state = 0;
|
||||
goto exit;
|
||||
}
|
||||
|
||||
/* Clear SWS */
|
||||
val = tpa6130a2_read(TPA6130A2_REG_CONTROL);
|
||||
val &= ~TPA6130A2_SWS;
|
||||
tpa6130a2_i2c_write(TPA6130A2_REG_CONTROL, val);
|
||||
} else if (!power && data->power_state) {
|
||||
} else {
|
||||
/* set SWS */
|
||||
val = tpa6130a2_read(TPA6130A2_REG_CONTROL);
|
||||
val |= TPA6130A2_SWS;
|
||||
|
@ -299,6 +296,7 @@ static void tpa6130a2_channel_enable(u8 channel, int enable)
|
|||
/* Enable amplifier */
|
||||
val = tpa6130a2_read(TPA6130A2_REG_CONTROL);
|
||||
val |= channel;
|
||||
val &= ~TPA6130A2_SWS;
|
||||
tpa6130a2_i2c_write(TPA6130A2_REG_CONTROL, val);
|
||||
|
||||
/* Unmute channel */
|
||||
|
@ -319,72 +317,24 @@ static void tpa6130a2_channel_enable(u8 channel, int enable)
|
|||
}
|
||||
}
|
||||
|
||||
static int tpa6130a2_left_event(struct snd_soc_dapm_widget *w,
|
||||
struct snd_kcontrol *kcontrol, int event)
|
||||
{
|
||||
switch (event) {
|
||||
case SND_SOC_DAPM_POST_PMU:
|
||||
tpa6130a2_channel_enable(TPA6130A2_HP_EN_L, 1);
|
||||
break;
|
||||
case SND_SOC_DAPM_POST_PMD:
|
||||
tpa6130a2_channel_enable(TPA6130A2_HP_EN_L, 0);
|
||||
break;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int tpa6130a2_right_event(struct snd_soc_dapm_widget *w,
|
||||
struct snd_kcontrol *kcontrol, int event)
|
||||
{
|
||||
switch (event) {
|
||||
case SND_SOC_DAPM_POST_PMU:
|
||||
tpa6130a2_channel_enable(TPA6130A2_HP_EN_R, 1);
|
||||
break;
|
||||
case SND_SOC_DAPM_POST_PMD:
|
||||
tpa6130a2_channel_enable(TPA6130A2_HP_EN_R, 0);
|
||||
break;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int tpa6130a2_supply_event(struct snd_soc_dapm_widget *w,
|
||||
struct snd_kcontrol *kcontrol, int event)
|
||||
int tpa6130a2_stereo_enable(struct snd_soc_codec *codec, int enable)
|
||||
{
|
||||
int ret = 0;
|
||||
|
||||
switch (event) {
|
||||
case SND_SOC_DAPM_POST_PMU:
|
||||
if (enable) {
|
||||
ret = tpa6130a2_power(1);
|
||||
break;
|
||||
case SND_SOC_DAPM_POST_PMD:
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
tpa6130a2_channel_enable(TPA6130A2_HP_EN_R | TPA6130A2_HP_EN_L,
|
||||
1);
|
||||
} else {
|
||||
tpa6130a2_channel_enable(TPA6130A2_HP_EN_R | TPA6130A2_HP_EN_L,
|
||||
0);
|
||||
ret = tpa6130a2_power(0);
|
||||
break;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static const struct snd_soc_dapm_widget tpa6130a2_dapm_widgets[] = {
|
||||
SND_SOC_DAPM_PGA_E("TPA6130A2 Left", SND_SOC_NOPM,
|
||||
0, 0, NULL, 0, tpa6130a2_left_event,
|
||||
SND_SOC_DAPM_POST_PMU|SND_SOC_DAPM_POST_PMD),
|
||||
SND_SOC_DAPM_PGA_E("TPA6130A2 Right", SND_SOC_NOPM,
|
||||
0, 0, NULL, 0, tpa6130a2_right_event,
|
||||
SND_SOC_DAPM_POST_PMU|SND_SOC_DAPM_POST_PMD),
|
||||
SND_SOC_DAPM_SUPPLY("TPA6130A2 Enable", SND_SOC_NOPM,
|
||||
0, 0, tpa6130a2_supply_event,
|
||||
SND_SOC_DAPM_POST_PMU|SND_SOC_DAPM_POST_PMD),
|
||||
/* Outputs */
|
||||
SND_SOC_DAPM_OUTPUT("TPA6130A2 Headphone Left"),
|
||||
SND_SOC_DAPM_OUTPUT("TPA6130A2 Headphone Right"),
|
||||
};
|
||||
|
||||
static const struct snd_soc_dapm_route audio_map[] = {
|
||||
{"TPA6130A2 Headphone Left", NULL, "TPA6130A2 Left"},
|
||||
{"TPA6130A2 Headphone Right", NULL, "TPA6130A2 Right"},
|
||||
|
||||
{"TPA6130A2 Headphone Left", NULL, "TPA6130A2 Enable"},
|
||||
{"TPA6130A2 Headphone Right", NULL, "TPA6130A2 Enable"},
|
||||
};
|
||||
EXPORT_SYMBOL_GPL(tpa6130a2_stereo_enable);
|
||||
|
||||
int tpa6130a2_add_controls(struct snd_soc_codec *codec)
|
||||
{
|
||||
|
@ -396,18 +346,12 @@ int tpa6130a2_add_controls(struct snd_soc_codec *codec)
|
|||
|
||||
data = i2c_get_clientdata(tpa6130a2_client);
|
||||
|
||||
snd_soc_dapm_new_controls(dapm, tpa6130a2_dapm_widgets,
|
||||
ARRAY_SIZE(tpa6130a2_dapm_widgets));
|
||||
|
||||
snd_soc_dapm_add_routes(dapm, audio_map, ARRAY_SIZE(audio_map));
|
||||
|
||||
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);
|
||||
|
||||
|
|
|
@ -57,5 +57,6 @@
|
|||
#define TPA6130A2_VERSION_MASK (0x0f)
|
||||
|
||||
extern int tpa6130a2_add_controls(struct snd_soc_codec *codec);
|
||||
extern int tpa6130a2_stereo_enable(struct snd_soc_codec *codec, int enable);
|
||||
|
||||
#endif /* __TPA6130A2_H__ */
|
||||
|
|
|
@ -1724,6 +1724,7 @@ static int twl4030_startup(struct snd_pcm_substream *substream,
|
|||
struct snd_soc_codec *codec = rtd->codec;
|
||||
struct twl4030_priv *twl4030 = snd_soc_codec_get_drvdata(codec);
|
||||
|
||||
snd_pcm_hw_constraint_msbits(substream->runtime, 0, 32, 24);
|
||||
if (twl4030->master_substream) {
|
||||
twl4030->slave_substream = substream;
|
||||
/* The DAI has one configuration for playback and capture, so
|
||||
|
@ -1848,7 +1849,7 @@ static int twl4030_hw_params(struct snd_pcm_substream *substream,
|
|||
case SNDRV_PCM_FORMAT_S16_LE:
|
||||
format |= TWL4030_DATA_WIDTH_16S_16W;
|
||||
break;
|
||||
case SNDRV_PCM_FORMAT_S24_LE:
|
||||
case SNDRV_PCM_FORMAT_S32_LE:
|
||||
format |= TWL4030_DATA_WIDTH_32S_24W;
|
||||
break;
|
||||
default:
|
||||
|
@ -2181,7 +2182,7 @@ static int twl4030_voice_set_tristate(struct snd_soc_dai *dai, int tristate)
|
|||
}
|
||||
|
||||
#define TWL4030_RATES (SNDRV_PCM_RATE_8000_48000)
|
||||
#define TWL4030_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FORMAT_S24_LE)
|
||||
#define TWL4030_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S32_LE)
|
||||
|
||||
static struct snd_soc_dai_ops twl4030_dai_hifi_ops = {
|
||||
.startup = twl4030_startup,
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -79,6 +79,7 @@
|
|||
|
||||
/* INTMR (0x04) fields */
|
||||
|
||||
#define TWL6040_PLUGMSK 0x02
|
||||
#define TWL6040_READYMSK 0x40
|
||||
#define TWL6040_ALLINT_MSK 0x7B
|
||||
|
||||
|
@ -135,4 +136,11 @@
|
|||
#define TWL6040_HPPLL_ID 1
|
||||
#define TWL6040_LPPLL_ID 2
|
||||
|
||||
/* STATUS (0x2E) fields */
|
||||
|
||||
#define TWL6040_PLUGCOMP 0x02
|
||||
|
||||
void twl6040_hs_jack_detect(struct snd_soc_codec *codec,
|
||||
struct snd_soc_jack *jack, int report);
|
||||
|
||||
#endif /* End of __TWL6040_H__ */
|
||||
|
|
|
@ -24,6 +24,7 @@
|
|||
#include <sound/core.h>
|
||||
#include <sound/pcm.h>
|
||||
#include <sound/soc.h>
|
||||
#include <sound/jack.h>
|
||||
|
||||
#include <asm/mach-types.h>
|
||||
#include <plat/hardware.h>
|
||||
|
@ -65,6 +66,21 @@ static struct snd_soc_ops sdp4430_ops = {
|
|||
.hw_params = sdp4430_hw_params,
|
||||
};
|
||||
|
||||
/* Headset jack */
|
||||
static struct snd_soc_jack hs_jack;
|
||||
|
||||
/*Headset jack detection DAPM pins */
|
||||
static struct snd_soc_jack_pin hs_jack_pins[] = {
|
||||
{
|
||||
.pin = "Headset Mic",
|
||||
.mask = SND_JACK_MICROPHONE,
|
||||
},
|
||||
{
|
||||
.pin = "Headset Stereophone",
|
||||
.mask = SND_JACK_HEADPHONE,
|
||||
},
|
||||
};
|
||||
|
||||
static int sdp4430_get_power_mode(struct snd_kcontrol *kcontrol,
|
||||
struct snd_ctl_elem_value *ucontrol)
|
||||
{
|
||||
|
@ -101,6 +117,7 @@ static const struct snd_soc_dapm_widget sdp4430_twl6040_dapm_widgets[] = {
|
|||
SND_SOC_DAPM_MIC("Headset Mic", NULL),
|
||||
SND_SOC_DAPM_HP("Headset Stereophone", NULL),
|
||||
SND_SOC_DAPM_SPK("Earphone Spk", NULL),
|
||||
SND_SOC_DAPM_INPUT("Aux/FM Stereo In"),
|
||||
};
|
||||
|
||||
static const struct snd_soc_dapm_route audio_map[] = {
|
||||
|
@ -123,6 +140,10 @@ static const struct snd_soc_dapm_route audio_map[] = {
|
|||
|
||||
/* Earphone speaker */
|
||||
{"Earphone Spk", NULL, "EP"},
|
||||
|
||||
/* Aux/FM Stereo In: AFML, AFMR */
|
||||
{"AFML", NULL, "Aux/FM Stereo In"},
|
||||
{"AFMR", NULL, "Aux/FM Stereo In"},
|
||||
};
|
||||
|
||||
static int sdp4430_twl6040_init(struct snd_soc_pcm_runtime *rtd)
|
||||
|
@ -149,14 +170,28 @@ static int sdp4430_twl6040_init(struct snd_soc_pcm_runtime *rtd)
|
|||
/* SDP4430 connected pins */
|
||||
snd_soc_dapm_enable_pin(dapm, "Ext Mic");
|
||||
snd_soc_dapm_enable_pin(dapm, "Ext Spk");
|
||||
snd_soc_dapm_enable_pin(dapm, "AFML");
|
||||
snd_soc_dapm_enable_pin(dapm, "AFMR");
|
||||
snd_soc_dapm_enable_pin(dapm, "Headset Mic");
|
||||
snd_soc_dapm_enable_pin(dapm, "Headset Stereophone");
|
||||
|
||||
/* TWL6040 not connected pins */
|
||||
snd_soc_dapm_nc_pin(dapm, "AFML");
|
||||
snd_soc_dapm_nc_pin(dapm, "AFMR");
|
||||
|
||||
ret = snd_soc_dapm_sync(dapm);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
/* Headset jack detection */
|
||||
ret = snd_soc_jack_new(codec, "Headset Jack",
|
||||
SND_JACK_HEADSET, &hs_jack);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = snd_soc_jack_add_pins(&hs_jack, ARRAY_SIZE(hs_jack_pins),
|
||||
hs_jack_pins);
|
||||
|
||||
if (machine_is_omap_4430sdp())
|
||||
twl6040_hs_jack_detect(codec, &hs_jack, SND_JACK_HEADSET);
|
||||
else
|
||||
snd_soc_jack_report(&hs_jack, SND_JACK_HEADSET, SND_JACK_HEADSET);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue