Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 316292
b: refs/heads/master
c: 5b2eec3
h: refs/heads/master
v: v3
  • Loading branch information
Mark Brown committed Jul 4, 2012
1 parent 2b100d6 commit e9cf896
Show file tree
Hide file tree
Showing 4 changed files with 119 additions and 1 deletion.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 949e6bc75fea779b433679601641ea641456283b
refs/heads/master: 5b2eec3f98e08a8442ada41c4a63658b95a355f2
106 changes: 106 additions & 0 deletions trunk/sound/soc/codecs/arizona.c
Original file line number Diff line number Diff line change
Expand Up @@ -385,6 +385,29 @@ static const int arizona_48k_bclk_rates[] = {
24576000,
};

static const unsigned int arizona_48k_rates[] = {
12000,
24000,
48000,
96000,
192000,
384000,
768000,
4000,
8000,
16000,
32000,
64000,
128000,
256000,
512000,
};

static const struct snd_pcm_hw_constraint_list arizona_48k_constraint = {
.count = ARRAY_SIZE(arizona_48k_rates),
.list = arizona_48k_rates,
};

static const int arizona_44k1_bclk_rates[] = {
-1,
44100,
Expand All @@ -407,6 +430,21 @@ static const int arizona_44k1_bclk_rates[] = {
22579200,
};

static const unsigned int arizona_44k1_rates[] = {
11025,
22050,
44100,
88200,
176400,
352800,
705600,
};

static const struct snd_pcm_hw_constraint_list arizona_44k1_constraint = {
.count = ARRAY_SIZE(arizona_44k1_rates),
.list = arizona_44k1_rates,
};

static int arizona_sr_vals[] = {
0,
12000,
Expand Down Expand Up @@ -434,6 +472,36 @@ static int arizona_sr_vals[] = {
512000,
};

static int arizona_startup(struct snd_pcm_substream *substream,
struct snd_soc_dai *dai)
{
struct snd_soc_codec *codec = dai->codec;
struct arizona_priv *priv = snd_soc_codec_get_drvdata(codec);
struct arizona_dai_priv *dai_priv = &priv->dai[dai->id - 1];
const struct snd_pcm_hw_constraint_list *constraint;
unsigned int base_rate;

switch (dai_priv->clk) {
case ARIZONA_CLK_SYSCLK:
base_rate = priv->sysclk;
break;
case ARIZONA_CLK_ASYNCCLK:
base_rate = priv->asyncclk;
break;
default:
return 0;
}

if (base_rate % 8000)
constraint = &arizona_44k1_constraint;
else
constraint = &arizona_48k_constraint;

return snd_pcm_hw_constraint_list(substream->runtime, 0,
SNDRV_PCM_HW_PARAM_RATE,
constraint);
}

static int arizona_hw_params(struct snd_pcm_substream *substream,
struct snd_pcm_hw_params *params,
struct snd_soc_dai *dai)
Expand Down Expand Up @@ -501,11 +569,49 @@ static int arizona_hw_params(struct snd_pcm_substream *substream,
return 0;
}

static int arizona_dai_set_sysclk(struct snd_soc_dai *dai,
int clk_id, unsigned int freq, int dir)
{
struct snd_soc_codec *codec = dai->codec;
struct arizona_priv *priv = snd_soc_codec_get_drvdata(codec);
struct arizona_dai_priv *dai_priv = &priv->dai[dai->id - 1];

switch (clk_id) {
case ARIZONA_CLK_SYSCLK:
case ARIZONA_CLK_ASYNCCLK:
break;
default:
return -EINVAL;
}

if (clk_id != dai_priv->clk && dai->active) {
dev_err(codec->dev, "Can't change clock on active DAI %d\n",
dai->id);
return -EBUSY;
}

dai_priv->clk = clk_id;

return 0;
}

const struct snd_soc_dai_ops arizona_dai_ops = {
.startup = arizona_startup,
.set_fmt = arizona_set_fmt,
.hw_params = arizona_hw_params,
.set_sysclk = arizona_dai_set_sysclk,
};

int arizona_init_dai(struct arizona_priv *priv, int id)
{
struct arizona_dai_priv *dai_priv = &priv->dai[id];

dai_priv->clk = ARIZONA_CLK_SYSCLK;

return 0;
}
EXPORT_SYMBOL_GPL(arizona_init_dai);

static irqreturn_t arizona_fll_lock(int irq, void *data)
{
struct arizona_fll *fll = data;
Expand Down
9 changes: 9 additions & 0 deletions trunk/sound/soc/codecs/arizona.h
Original file line number Diff line number Diff line change
Expand Up @@ -44,12 +44,19 @@
#define ARIZONA_MIXER_VOL_SHIFT 1
#define ARIZONA_MIXER_VOL_WIDTH 7

#define ARIZONA_MAX_DAI 3

struct arizona;

struct arizona_dai_priv {
int clk;
};

struct arizona_priv {
struct arizona *arizona;
int sysclk;
int asyncclk;
struct arizona_dai_priv dai[ARIZONA_MAX_DAI];
};

#define ARIZONA_NUM_MIXER_INPUTS 55
Expand Down Expand Up @@ -146,4 +153,6 @@ extern int arizona_init_fll(struct arizona *arizona, int id, int base,
extern int arizona_set_fll(struct arizona_fll *fll, int source,
unsigned int Fref, unsigned int Fout);

extern int arizona_init_dai(struct arizona_priv *priv, int dai);

#endif
3 changes: 3 additions & 0 deletions trunk/sound/soc/codecs/wm5102.c
Original file line number Diff line number Diff line change
Expand Up @@ -832,6 +832,9 @@ static int __devinit wm5102_probe(struct platform_device *pdev)
ARIZONA_IRQ_FLL2_LOCK, ARIZONA_IRQ_FLL2_CLOCK_OK,
&wm5102->fll[1]);

for (i = 0; i < ARRAY_SIZE(wm5102_dai); i++)
arizona_init_dai(&wm5102->core, i);

/* Latch volume update bits */
for (i = 0; i < ARRAY_SIZE(wm5102_digital_vu); i++)
regmap_update_bits(arizona->regmap, wm5102_digital_vu[i],
Expand Down

0 comments on commit e9cf896

Please sign in to comment.