Commit 67c7efad authored by Mark Brown's avatar Mark Brown

Merge branch 'topic/asoc' of...

Merge branch 'topic/asoc' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound-2.6 into for-2.6.38
parents 24ff33ac 991e02b4
...@@ -1545,21 +1545,6 @@ static struct i2c_driver aic3x_i2c_driver = { ...@@ -1545,21 +1545,6 @@ static struct i2c_driver aic3x_i2c_driver = {
.remove = aic3x_i2c_remove, .remove = aic3x_i2c_remove,
.id_table = aic3x_i2c_id, .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 #endif
static int __init aic3x_modinit(void) static int __init aic3x_modinit(void)
......
...@@ -315,8 +315,6 @@ static void dac33_init_chip(struct snd_soc_codec *codec) ...@@ -315,8 +315,6 @@ static void dac33_init_chip(struct snd_soc_codec *codec)
clock source = internal osc (?) */ clock source = internal osc (?) */
dac33_write(codec, DAC33_ANA_VOL_SOFT_STEP_CTRL, DAC33_VOLCLKEN); 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) */ /* Restore only selected registers (gains mostly) */
dac33_write(codec, DAC33_LDAC_DIG_VOL_CTRL, dac33_write(codec, DAC33_LDAC_DIG_VOL_CTRL,
dac33_read_reg_cache(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) ...@@ -356,6 +354,21 @@ static inline void dac33_soft_power(struct snd_soc_codec *codec, int power)
dac33_write(codec, DAC33_PWR_CTRL, reg); 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) static int dac33_hard_power(struct snd_soc_codec *codec, int power)
{ {
struct tlv320dac33_priv *dac33 = snd_soc_codec_get_drvdata(codec); struct tlv320dac33_priv *dac33 = snd_soc_codec_get_drvdata(codec);
...@@ -404,7 +417,7 @@ static int dac33_hard_power(struct snd_soc_codec *codec, int power) ...@@ -404,7 +417,7 @@ static int dac33_hard_power(struct snd_soc_codec *codec, int power)
return ret; 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 snd_kcontrol *kcontrol, int event)
{ {
struct tlv320dac33_priv *dac33 = snd_soc_codec_get_drvdata(w->codec); 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, ...@@ -416,6 +429,9 @@ static int playback_event(struct snd_soc_dapm_widget *w,
dac33_prepare_chip(dac33->substream); dac33_prepare_chip(dac33->substream);
} }
break; break;
case SND_SOC_DAPM_POST_PMD:
dac33_disable_digital(w->codec);
break;
} }
return 0; return 0;
} }
...@@ -592,8 +608,8 @@ static const struct snd_soc_dapm_widget dac33_dapm_widgets[] = { ...@@ -592,8 +608,8 @@ static const struct snd_soc_dapm_widget dac33_dapm_widgets[] = {
SND_SOC_DAPM_INPUT("LINEL"), SND_SOC_DAPM_INPUT("LINEL"),
SND_SOC_DAPM_INPUT("LINER"), SND_SOC_DAPM_INPUT("LINER"),
SND_SOC_DAPM_DAC("DACL", "Left Playback", DAC33_LDAC_PWR_CTRL, 2, 0), SND_SOC_DAPM_DAC("DACL", "Left Playback", SND_SOC_NOPM, 0, 0),
SND_SOC_DAPM_DAC("DACR", "Right Playback", DAC33_RDAC_PWR_CTRL, 2, 0), SND_SOC_DAPM_DAC("DACR", "Right Playback", SND_SOC_NOPM, 0, 0),
/* Analog bypass */ /* Analog bypass */
SND_SOC_DAPM_SWITCH("Analog Left Bypass", SND_SOC_NOPM, 0, 0, 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[] = { ...@@ -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, SND_SOC_DAPM_SWITCH("Analog Right Bypass", SND_SOC_NOPM, 0, 0,
&dac33_dapm_abypassr_control), &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), 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), 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[] = { static const struct snd_soc_dapm_route audio_map[] = {
...@@ -614,15 +636,18 @@ 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 Left Bypass", "Switch", "LINEL"},
{"Analog Right Bypass", "Switch", "LINER"}, {"Analog Right Bypass", "Switch", "LINER"},
{"Output Left Amp Power", NULL, "DACL"}, {"Output Left Amplifier", NULL, "DACL"},
{"Output Right Amp Power", NULL, "DACR"}, {"Output Right Amplifier", NULL, "DACR"},
{"Output Left Amplifier", NULL, "Analog Left Bypass"},
{"Output Right Amplifier", NULL, "Analog Right Bypass"},
{"Output Left Amp Power", NULL, "Analog Left Bypass"}, {"Output Left Amplifier", NULL, "Left DAC Power"},
{"Output Right Amp Power", NULL, "Analog Right Bypass"}, {"Output Right Amplifier", NULL, "Right DAC Power"},
/* output */ /* output */
{"LEFT_LO", NULL, "Output Left Amp Power"}, {"LEFT_LO", NULL, "Output Left Amplifier"},
{"RIGHT_LO", NULL, "Output Right Amp Power"}, {"RIGHT_LO", NULL, "Output Right Amplifier"},
}; };
static int dac33_add_widgets(struct snd_soc_codec *codec) static int dac33_add_widgets(struct snd_soc_codec *codec)
...@@ -640,10 +665,12 @@ static int dac33_add_widgets(struct snd_soc_codec *codec) ...@@ -640,10 +665,12 @@ static int dac33_add_widgets(struct snd_soc_codec *codec)
static int dac33_set_bias_level(struct snd_soc_codec *codec, static int dac33_set_bias_level(struct snd_soc_codec *codec,
enum snd_soc_bias_level level) enum snd_soc_bias_level level)
{ {
struct tlv320dac33_priv *dac33 = snd_soc_codec_get_drvdata(codec);
int ret; int ret;
switch (level) { switch (level) {
case SND_SOC_BIAS_ON: case SND_SOC_BIAS_ON:
if (!dac33->substream)
dac33_soft_power(codec, 1); dac33_soft_power(codec, 1);
break; break;
case SND_SOC_BIAS_PREPARE: case SND_SOC_BIAS_PREPARE:
......
...@@ -41,7 +41,7 @@ struct tpa6130a2_data { ...@@ -41,7 +41,7 @@ struct tpa6130a2_data {
unsigned char regs[TPA6130A2_CACHEREGNUM]; unsigned char regs[TPA6130A2_CACHEREGNUM];
struct regulator *supply; struct regulator *supply;
int power_gpio; int power_gpio;
unsigned char power_state; u8 power_state:1;
enum tpa_model id; enum tpa_model id;
}; };
...@@ -116,7 +116,7 @@ static int tpa6130a2_initialize(void) ...@@ -116,7 +116,7 @@ static int tpa6130a2_initialize(void)
return ret; return ret;
} }
static int tpa6130a2_power(int power) static int tpa6130a2_power(u8 power)
{ {
struct tpa6130a2_data *data; struct tpa6130a2_data *data;
u8 val; u8 val;
...@@ -126,8 +126,10 @@ static int tpa6130a2_power(int power) ...@@ -126,8 +126,10 @@ static int tpa6130a2_power(int power)
data = i2c_get_clientdata(tpa6130a2_client); data = i2c_get_clientdata(tpa6130a2_client);
mutex_lock(&data->mutex); mutex_lock(&data->mutex);
if (power && !data->power_state) { if (power == data->power_state)
goto exit;
if (power) {
ret = regulator_enable(data->supply); ret = regulator_enable(data->supply);
if (ret != 0) { if (ret != 0) {
dev_err(&tpa6130a2_client->dev, dev_err(&tpa6130a2_client->dev,
...@@ -149,12 +151,7 @@ static int tpa6130a2_power(int power) ...@@ -149,12 +151,7 @@ static int tpa6130a2_power(int power)
data->power_state = 0; data->power_state = 0;
goto exit; goto exit;
} }
} else {
/* Clear SWS */
val = tpa6130a2_read(TPA6130A2_REG_CONTROL);
val &= ~TPA6130A2_SWS;
tpa6130a2_i2c_write(TPA6130A2_REG_CONTROL, val);
} else if (!power && data->power_state) {
/* set SWS */ /* set SWS */
val = tpa6130a2_read(TPA6130A2_REG_CONTROL); val = tpa6130a2_read(TPA6130A2_REG_CONTROL);
val |= TPA6130A2_SWS; val |= TPA6130A2_SWS;
...@@ -299,6 +296,7 @@ static void tpa6130a2_channel_enable(u8 channel, int enable) ...@@ -299,6 +296,7 @@ static void tpa6130a2_channel_enable(u8 channel, int enable)
/* Enable amplifier */ /* Enable amplifier */
val = tpa6130a2_read(TPA6130A2_REG_CONTROL); val = tpa6130a2_read(TPA6130A2_REG_CONTROL);
val |= channel; val |= channel;
val &= ~TPA6130A2_SWS;
tpa6130a2_i2c_write(TPA6130A2_REG_CONTROL, val); tpa6130a2_i2c_write(TPA6130A2_REG_CONTROL, val);
/* Unmute channel */ /* Unmute channel */
...@@ -319,72 +317,24 @@ static void tpa6130a2_channel_enable(u8 channel, int enable) ...@@ -319,72 +317,24 @@ static void tpa6130a2_channel_enable(u8 channel, int enable)
} }
} }
static int tpa6130a2_left_event(struct snd_soc_dapm_widget *w, int tpa6130a2_stereo_enable(struct snd_soc_codec *codec, int enable)
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 ret = 0; int ret = 0;
if (enable) {
switch (event) {
case SND_SOC_DAPM_POST_PMU:
ret = tpa6130a2_power(1); ret = tpa6130a2_power(1);
break; if (ret < 0)
case SND_SOC_DAPM_POST_PMD: 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); ret = tpa6130a2_power(0);
break;
} }
return ret; return ret;
} }
EXPORT_SYMBOL_GPL(tpa6130a2_stereo_enable);
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"},
};
int tpa6130a2_add_controls(struct snd_soc_codec *codec) int tpa6130a2_add_controls(struct snd_soc_codec *codec)
{ {
...@@ -396,18 +346,12 @@ 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); 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) if (data->id == TPA6140A2)
return snd_soc_add_controls(codec, tpa6140a2_controls, return snd_soc_add_controls(codec, tpa6140a2_controls,
ARRAY_SIZE(tpa6140a2_controls)); ARRAY_SIZE(tpa6140a2_controls));
else else
return snd_soc_add_controls(codec, tpa6130a2_controls, return snd_soc_add_controls(codec, tpa6130a2_controls,
ARRAY_SIZE(tpa6130a2_controls)); ARRAY_SIZE(tpa6130a2_controls));
} }
EXPORT_SYMBOL_GPL(tpa6130a2_add_controls); EXPORT_SYMBOL_GPL(tpa6130a2_add_controls);
......
...@@ -57,5 +57,6 @@ ...@@ -57,5 +57,6 @@
#define TPA6130A2_VERSION_MASK (0x0f) #define TPA6130A2_VERSION_MASK (0x0f)
extern int tpa6130a2_add_controls(struct snd_soc_codec *codec); 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__ */ #endif /* __TPA6130A2_H__ */
...@@ -1724,6 +1724,7 @@ static int twl4030_startup(struct snd_pcm_substream *substream, ...@@ -1724,6 +1724,7 @@ static int twl4030_startup(struct snd_pcm_substream *substream,
struct snd_soc_codec *codec = rtd->codec; struct snd_soc_codec *codec = rtd->codec;
struct twl4030_priv *twl4030 = snd_soc_codec_get_drvdata(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) { if (twl4030->master_substream) {
twl4030->slave_substream = substream; twl4030->slave_substream = substream;
/* The DAI has one configuration for playback and capture, so /* The DAI has one configuration for playback and capture, so
...@@ -1848,7 +1849,7 @@ static int twl4030_hw_params(struct snd_pcm_substream *substream, ...@@ -1848,7 +1849,7 @@ static int twl4030_hw_params(struct snd_pcm_substream *substream,
case SNDRV_PCM_FORMAT_S16_LE: case SNDRV_PCM_FORMAT_S16_LE:
format |= TWL4030_DATA_WIDTH_16S_16W; format |= TWL4030_DATA_WIDTH_16S_16W;
break; break;
case SNDRV_PCM_FORMAT_S24_LE: case SNDRV_PCM_FORMAT_S32_LE:
format |= TWL4030_DATA_WIDTH_32S_24W; format |= TWL4030_DATA_WIDTH_32S_24W;
break; break;
default: default:
...@@ -2181,7 +2182,7 @@ static int twl4030_voice_set_tristate(struct snd_soc_dai *dai, int tristate) ...@@ -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_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 = { static struct snd_soc_dai_ops twl4030_dai_hifi_ops = {
.startup = twl4030_startup, .startup = twl4030_startup,
......
This diff is collapsed.
...@@ -79,6 +79,7 @@ ...@@ -79,6 +79,7 @@
/* INTMR (0x04) fields */ /* INTMR (0x04) fields */
#define TWL6040_PLUGMSK 0x02
#define TWL6040_READYMSK 0x40 #define TWL6040_READYMSK 0x40
#define TWL6040_ALLINT_MSK 0x7B #define TWL6040_ALLINT_MSK 0x7B
...@@ -135,4 +136,11 @@ ...@@ -135,4 +136,11 @@
#define TWL6040_HPPLL_ID 1 #define TWL6040_HPPLL_ID 1
#define TWL6040_LPPLL_ID 2 #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__ */ #endif /* End of __TWL6040_H__ */
...@@ -24,6 +24,7 @@ ...@@ -24,6 +24,7 @@
#include <sound/core.h> #include <sound/core.h>
#include <sound/pcm.h> #include <sound/pcm.h>
#include <sound/soc.h> #include <sound/soc.h>
#include <sound/jack.h>
#include <asm/mach-types.h> #include <asm/mach-types.h>
#include <plat/hardware.h> #include <plat/hardware.h>
...@@ -65,6 +66,21 @@ static struct snd_soc_ops sdp4430_ops = { ...@@ -65,6 +66,21 @@ static struct snd_soc_ops sdp4430_ops = {
.hw_params = sdp4430_hw_params, .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, static int sdp4430_get_power_mode(struct snd_kcontrol *kcontrol,
struct snd_ctl_elem_value *ucontrol) struct snd_ctl_elem_value *ucontrol)
{ {
...@@ -101,6 +117,7 @@ static const struct snd_soc_dapm_widget sdp4430_twl6040_dapm_widgets[] = { ...@@ -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_MIC("Headset Mic", NULL),
SND_SOC_DAPM_HP("Headset Stereophone", NULL), SND_SOC_DAPM_HP("Headset Stereophone", NULL),
SND_SOC_DAPM_SPK("Earphone Spk", 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[] = { static const struct snd_soc_dapm_route audio_map[] = {
...@@ -123,6 +140,10 @@ 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 speaker */
{"Earphone Spk", NULL, "EP"}, {"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) 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) ...@@ -149,14 +170,28 @@ static int sdp4430_twl6040_init(struct snd_soc_pcm_runtime *rtd)
/* SDP4430 connected pins */ /* SDP4430 connected pins */
snd_soc_dapm_enable_pin(dapm, "Ext Mic"); snd_soc_dapm_enable_pin(dapm, "Ext Mic");
snd_soc_dapm_enable_pin(dapm, "Ext Spk"); 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 Mic");
snd_soc_dapm_enable_pin(dapm, "Headset Stereophone"); 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); 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; return ret;
} }
......
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