ASoC: change set_tdm_slot api to allow slot_width override.
Extend set_tdm_slot to allow the user to arbitrarily set the frame width and active TX/RX slots. Updates magician.c and wm9081.c for the new set_tdm_slot(). wm9081.c still doesn't handle the slot_width override. While being there, correct an incorrect use of SlotsPerFrm(7) use in bitmask on pxa-ssp.c (SSCR0_SlotsPerFrm(x) is (((x) - 1) << 24)) ). (this series is meant for Mark's for-2.6.32 branch) Signed-off-by: Daniel Ribeiro <drwyrm@gmail.com> Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
This commit is contained in:
Родитель
9029bb316b
Коммит
a5479e389e
|
@ -106,7 +106,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);
|
||||||
|
|
||||||
|
@ -140,7 +140,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);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -1214,8 +1214,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 = wm9081_read(codec, WM9081_AUDIO_INTERFACE_1);
|
unsigned int aif1 = wm9081_read(codec, WM9081_AUDIO_INTERFACE_1);
|
||||||
|
@ -1227,7 +1228,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,
|
||||||
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,
|
||||||
* 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 number of active slots */
|
/* set slot width */
|
||||||
sscr0 |= SSCR0_SlotsPerFrm(slots);
|
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 */
|
||||||
|
sscr0 |= SSCR0_SlotsPerFrm(slots);
|
||||||
|
|
||||||
|
/* set active slot mask */
|
||||||
|
ssp_write_reg(ssp, SSTSA, tx_mask);
|
||||||
|
ssp_write_reg(ssp, SSRSA, rx_mask);
|
||||||
|
}
|
||||||
ssp_write_reg(ssp, SSCR0, sscr0);
|
ssp_write_reg(ssp, SSCR0, sscr0);
|
||||||
|
|
||||||
/* set active slot mask */
|
|
||||||
ssp_write_reg(ssp, SSTSA, mask);
|
|
||||||
ssp_write_reg(ssp, SSRSA, mask);
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
Загрузка…
Ссылка в новой задаче