提交 1921bab2 编写于 作者: M Mark Brown

Merge commit 'a5479e38' into for-2.6.32

...@@ -112,7 +112,7 @@ int snd_soc_dai_set_pll(struct snd_soc_dai *dai, ...@@ -112,7 +112,7 @@ int snd_soc_dai_set_pll(struct snd_soc_dai *dai,
int snd_soc_dai_set_fmt(struct snd_soc_dai *dai, unsigned int fmt); int snd_soc_dai_set_fmt(struct snd_soc_dai *dai, unsigned int fmt);
int snd_soc_dai_set_tdm_slot(struct snd_soc_dai *dai, int snd_soc_dai_set_tdm_slot(struct snd_soc_dai *dai,
unsigned int mask, int slots); unsigned int tx_mask, unsigned int rx_mask, int slots, int slot_width);
int snd_soc_dai_set_tristate(struct snd_soc_dai *dai, int tristate); int snd_soc_dai_set_tristate(struct snd_soc_dai *dai, int tristate);
...@@ -146,7 +146,8 @@ struct snd_soc_dai_ops { ...@@ -146,7 +146,8 @@ struct snd_soc_dai_ops {
*/ */
int (*set_fmt)(struct snd_soc_dai *dai, unsigned int fmt); int (*set_fmt)(struct snd_soc_dai *dai, unsigned int fmt);
int (*set_tdm_slot)(struct snd_soc_dai *dai, int (*set_tdm_slot)(struct snd_soc_dai *dai,
unsigned int mask, int slots); unsigned int tx_mask, unsigned int rx_mask,
int slots, int slot_width);
int (*set_tristate)(struct snd_soc_dai *dai, int tristate); int (*set_tristate)(struct snd_soc_dai *dai, int tristate);
/* /*
......
...@@ -1149,8 +1149,9 @@ static int wm9081_set_sysclk(struct snd_soc_dai *codec_dai, ...@@ -1149,8 +1149,9 @@ static int wm9081_set_sysclk(struct snd_soc_dai *codec_dai,
return 0; return 0;
} }
/* FIXME: Needs to handle slot_width */
static int wm9081_set_tdm_slot(struct snd_soc_dai *dai, static int wm9081_set_tdm_slot(struct snd_soc_dai *dai,
unsigned int mask, int slots) unsigned int tx_mask, unsigned int rx_mask, int slots, int slot_width)
{ {
struct snd_soc_codec *codec = dai->codec; struct snd_soc_codec *codec = dai->codec;
unsigned int aif1 = snd_soc_read(codec, WM9081_AUDIO_INTERFACE_1); unsigned int aif1 = snd_soc_read(codec, WM9081_AUDIO_INTERFACE_1);
...@@ -1162,7 +1163,7 @@ static int wm9081_set_tdm_slot(struct snd_soc_dai *dai, ...@@ -1162,7 +1163,7 @@ static int wm9081_set_tdm_slot(struct snd_soc_dai *dai,
aif1 |= (slots - 1) << WM9081_AIFDAC_TDM_MODE_SHIFT; aif1 |= (slots - 1) << WM9081_AIFDAC_TDM_MODE_SHIFT;
switch (mask) { switch (rx_mask) {
case 1: case 1:
break; break;
case 2: case 2:
......
...@@ -190,7 +190,7 @@ static int magician_playback_hw_params(struct snd_pcm_substream *substream, ...@@ -190,7 +190,7 @@ static int magician_playback_hw_params(struct snd_pcm_substream *substream,
if (ret < 0) if (ret < 0)
return ret; return ret;
ret = snd_soc_dai_set_tdm_slot(cpu_dai, 1, 1); ret = snd_soc_dai_set_tdm_slot(cpu_dai, 1, 0, 1, width);
if (ret < 0) if (ret < 0)
return ret; return ret;
......
...@@ -375,21 +375,34 @@ static int pxa_ssp_set_dai_pll(struct snd_soc_dai *cpu_dai, ...@@ -375,21 +375,34 @@ static int pxa_ssp_set_dai_pll(struct snd_soc_dai *cpu_dai,
* Set the active slots in TDM/Network mode * Set the active slots in TDM/Network mode
*/ */
static int pxa_ssp_set_dai_tdm_slot(struct snd_soc_dai *cpu_dai, static int pxa_ssp_set_dai_tdm_slot(struct snd_soc_dai *cpu_dai,
unsigned int mask, int slots) unsigned int tx_mask, unsigned int rx_mask, int slots, int slot_width)
{ {
struct ssp_priv *priv = cpu_dai->private_data; struct ssp_priv *priv = cpu_dai->private_data;
struct ssp_device *ssp = priv->dev.ssp; struct ssp_device *ssp = priv->dev.ssp;
u32 sscr0; u32 sscr0;
sscr0 = ssp_read_reg(ssp, SSCR0) & ~SSCR0_SlotsPerFrm(7); sscr0 = ssp_read_reg(ssp, SSCR0);
sscr0 &= ~(SSCR0_MOD | SSCR0_SlotsPerFrm(8) | SSCR0_EDSS | SSCR0_DSS);
/* set slot width */
if (slot_width > 16)
sscr0 |= SSCR0_EDSS | SSCR0_DataSize(slot_width - 16);
else
sscr0 |= SSCR0_DataSize(slot_width);
if (slots > 1) {
/* enable network mode */
sscr0 |= SSCR0_MOD;
/* set number of active slots */ /* set number of active slots */
sscr0 |= SSCR0_SlotsPerFrm(slots); sscr0 |= SSCR0_SlotsPerFrm(slots);
ssp_write_reg(ssp, SSCR0, sscr0);
/* set active slot mask */ /* set active slot mask */
ssp_write_reg(ssp, SSTSA, mask); ssp_write_reg(ssp, SSTSA, tx_mask);
ssp_write_reg(ssp, SSRSA, mask); ssp_write_reg(ssp, SSRSA, rx_mask);
}
ssp_write_reg(ssp, SSCR0, sscr0);
return 0; return 0;
} }
......
...@@ -2223,17 +2223,20 @@ EXPORT_SYMBOL_GPL(snd_soc_dai_set_fmt); ...@@ -2223,17 +2223,20 @@ EXPORT_SYMBOL_GPL(snd_soc_dai_set_fmt);
/** /**
* snd_soc_dai_set_tdm_slot - configure DAI TDM. * snd_soc_dai_set_tdm_slot - configure DAI TDM.
* @dai: DAI * @dai: DAI
* @mask: DAI specific mask representing used slots. * @tx_mask: bitmask representing active TX slots.
* @rx_mask: bitmask representing active RX slots.
* @slots: Number of slots in use. * @slots: Number of slots in use.
* @slot_width: Width in bits for each slot.
* *
* Configures a DAI for TDM operation. Both mask and slots are codec and DAI * Configures a DAI for TDM operation. Both mask and slots are codec and DAI
* specific. * specific.
*/ */
int snd_soc_dai_set_tdm_slot(struct snd_soc_dai *dai, int snd_soc_dai_set_tdm_slot(struct snd_soc_dai *dai,
unsigned int mask, int slots) unsigned int tx_mask, unsigned int rx_mask, int slots, int slot_width)
{ {
if (dai->ops && dai->ops->set_tdm_slot) if (dai->ops && dai->ops->set_tdm_slot)
return dai->ops->set_tdm_slot(dai, mask, slots); return dai->ops->set_tdm_slot(dai, tx_mask, rx_mask,
slots, slot_width);
else else
return -EINVAL; return -EINVAL;
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册