Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 260700
b: refs/heads/master
c: af958c7
h: refs/heads/master
v: v3
  • Loading branch information
Peter Ujfalusi committed Jul 7, 2011
1 parent 33f7695 commit 5d6508a
Show file tree
Hide file tree
Showing 4 changed files with 80 additions and 83 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 7cca606794ceb597e95fd0a0f3a8dcdd51af55e0
refs/heads/master: af958c72af88405501fe61a43f8011614cff29f5
110 changes: 73 additions & 37 deletions trunk/sound/soc/codecs/twl6040.c
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,7 @@ struct twl6040_data {
int codec_powered;
int pll;
int non_lp;
int pll_power_mode;
int hs_power_mode;
int hs_power_mode_locked;
unsigned int clk_in;
Expand Down Expand Up @@ -210,6 +211,37 @@ static const int twl6040_vdd_reg[TWL6040_VDDREGNUM] = {
TWL6040_REG_DLB,
};

/* set of rates for each pll: low-power and high-performance */
static unsigned int lp_rates[] = {
8000,
11250,
16000,
22500,
32000,
44100,
48000,
88200,
96000,
};

static struct snd_pcm_hw_constraint_list lp_constraints = {
.count = ARRAY_SIZE(lp_rates),
.list = lp_rates,
};

static unsigned int hp_rates[] = {
8000,
16000,
32000,
48000,
96000,
};

static struct snd_pcm_hw_constraint_list hp_constraints = {
.count = ARRAY_SIZE(hp_rates),
.list = hp_rates,
};

/*
* read twl6040 register cache
*/
Expand Down Expand Up @@ -1049,6 +1081,43 @@ static int twl6040_headset_power_put_enum(struct snd_kcontrol *kcontrol,
return ret;
}

static int twl6040_pll_get_enum(struct snd_kcontrol *kcontrol,
struct snd_ctl_elem_value *ucontrol)
{
struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
struct twl6040_data *priv = snd_soc_codec_get_drvdata(codec);

ucontrol->value.enumerated.item[0] = priv->pll_power_mode;

return 0;
}

static int twl6040_pll_put_enum(struct snd_kcontrol *kcontrol,
struct snd_ctl_elem_value *ucontrol)
{
struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
struct twl6040_data *priv = snd_soc_codec_get_drvdata(codec);

priv->pll_power_mode = ucontrol->value.enumerated.item[0];
if (priv->pll_power_mode)
priv->sysclk_constraints = &hp_constraints;
else
priv->sysclk_constraints = &lp_constraints;

return 0;
}

int twl6040_get_clk_id(struct snd_soc_codec *codec)
{
struct twl6040_data *priv = snd_soc_codec_get_drvdata(codec);

if (priv->pll_power_mode)
return TWL6040_SYSCLK_SEL_HPPLL;
else
return TWL6040_SYSCLK_SEL_LPPLL;
}
EXPORT_SYMBOL_GPL(twl6040_get_clk_id);

static const struct snd_kcontrol_new twl6040_snd_controls[] = {
/* Capture gains */
SOC_DOUBLE_TLV("Capture Preamplifier Volume",
Expand All @@ -1071,6 +1140,9 @@ static const struct snd_kcontrol_new twl6040_snd_controls[] = {
SOC_ENUM_EXT("Headset Power Mode", twl6040_power_mode_enum,
twl6040_headset_power_get_enum,
twl6040_headset_power_put_enum),

SOC_ENUM_EXT("PLL Selection", twl6040_power_mode_enum,
twl6040_pll_get_enum, twl6040_pll_put_enum),
};

static const struct snd_soc_dapm_widget twl6040_dapm_widgets[] = {
Expand Down Expand Up @@ -1289,38 +1361,6 @@ static int twl6040_set_bias_level(struct snd_soc_codec *codec,
return 0;
}

/* set of rates for each pll: low-power and high-performance */

static unsigned int lp_rates[] = {
8000,
11250,
16000,
22500,
32000,
44100,
48000,
88200,
96000,
};

static struct snd_pcm_hw_constraint_list lp_constraints = {
.count = ARRAY_SIZE(lp_rates),
.list = lp_rates,
};

static unsigned int hp_rates[] = {
8000,
16000,
32000,
48000,
96000,
};

static struct snd_pcm_hw_constraint_list hp_constraints = {
.count = ARRAY_SIZE(hp_rates),
.list = hp_rates,
};

static int twl6040_startup(struct snd_pcm_substream *substream,
struct snd_soc_dai *dai)
{
Expand Down Expand Up @@ -1427,16 +1467,12 @@ static int twl6040_set_dai_sysclk(struct snd_soc_dai *codec_dai,
freq, priv->sysclk);
if (ret)
return ret;

priv->sysclk_constraints = &lp_constraints;
break;
case TWL6040_SYSCLK_SEL_HPPLL:
ret = twl6040_set_pll(twl6040, TWL6040_HPPLL_ID,
freq, priv->sysclk);
if (ret)
return ret;

priv->sysclk_constraints = &hp_constraints;
break;
default:
dev_err(codec->dev, "unknown clk_id %d\n", clk_id);
Expand Down Expand Up @@ -1563,7 +1599,7 @@ static int twl6040_probe(struct snd_soc_codec *codec)
goto work_err;
}

priv->sysclk_constraints = &hp_constraints;
priv->sysclk_constraints = &lp_constraints;
priv->workqueue = create_singlethread_workqueue("twl6040-codec");
if (!priv->workqueue) {
ret = -ENOMEM;
Expand Down
1 change: 1 addition & 0 deletions trunk/sound/soc/codecs/twl6040.h
Original file line number Diff line number Diff line change
Expand Up @@ -24,5 +24,6 @@

void twl6040_hs_jack_detect(struct snd_soc_codec *codec,
struct snd_soc_jack *jack, int report);
int twl6040_get_clk_id(struct snd_soc_codec *codec);

#endif /* End of __TWL6040_H__ */
50 changes: 5 additions & 45 deletions trunk/sound/soc/omap/sdp4430.c
Original file line number Diff line number Diff line change
Expand Up @@ -36,8 +36,6 @@
#include "omap-pcm.h"
#include "../codecs/twl6040.h"

static int twl6040_power_mode;

static int sdp4430_hw_params(struct snd_pcm_substream *substream,
struct snd_pcm_hw_params *params)
{
Expand All @@ -46,13 +44,13 @@ static int sdp4430_hw_params(struct snd_pcm_substream *substream,
int clk_id, freq;
int ret;

if (twl6040_power_mode) {
clk_id = TWL6040_SYSCLK_SEL_HPPLL;
clk_id = twl6040_get_clk_id(rtd->codec);
if (clk_id == TWL6040_SYSCLK_SEL_HPPLL)
freq = 38400000;
} else {
clk_id = TWL6040_SYSCLK_SEL_LPPLL;
else if (clk_id == TWL6040_SYSCLK_SEL_LPPLL)
freq = 32768;
}
else
return -EINVAL;

/* set the codec mclk */
ret = snd_soc_dai_set_sysclk(codec_dai, clk_id, freq,
Expand Down Expand Up @@ -83,35 +81,6 @@ static struct snd_soc_jack_pin hs_jack_pins[] = {
},
};

static int sdp4430_get_power_mode(struct snd_kcontrol *kcontrol,
struct snd_ctl_elem_value *ucontrol)
{
ucontrol->value.integer.value[0] = twl6040_power_mode;
return 0;
}

static int sdp4430_set_power_mode(struct snd_kcontrol *kcontrol,
struct snd_ctl_elem_value *ucontrol)
{
if (twl6040_power_mode == ucontrol->value.integer.value[0])
return 0;

twl6040_power_mode = ucontrol->value.integer.value[0];

return 1;
}

static const char *power_texts[] = {"Low-Power", "High-Performance"};

static const struct soc_enum sdp4430_enum[] = {
SOC_ENUM_SINGLE_EXT(2, power_texts),
};

static const struct snd_kcontrol_new sdp4430_controls[] = {
SOC_ENUM_EXT("TWL6040 Power Mode", sdp4430_enum[0],
sdp4430_get_power_mode, sdp4430_set_power_mode),
};

/* SDP4430 machine DAPM */
static const struct snd_soc_dapm_widget sdp4430_twl6040_dapm_widgets[] = {
SND_SOC_DAPM_MIC("Ext Mic", NULL),
Expand Down Expand Up @@ -154,12 +123,6 @@ static int sdp4430_twl6040_init(struct snd_soc_pcm_runtime *rtd)
struct snd_soc_dapm_context *dapm = &codec->dapm;
int ret;

/* Add SDP4430 specific controls */
ret = snd_soc_add_controls(codec, sdp4430_controls,
ARRAY_SIZE(sdp4430_controls));
if (ret)
return ret;

/* Add SDP4430 specific widgets */
ret = snd_soc_dapm_new_controls(dapm, sdp4430_twl6040_dapm_widgets,
ARRAY_SIZE(sdp4430_twl6040_dapm_widgets));
Expand Down Expand Up @@ -239,9 +202,6 @@ static int __init sdp4430_soc_init(void)
if (ret)
goto err;

/* Codec starts in HP mode */
twl6040_power_mode = 1;

return 0;

err:
Expand Down

0 comments on commit 5d6508a

Please sign in to comment.