2009/6/16 Daniel Ribeiro <drwyrm@xxxxxxxxx>: > 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@xxxxxxxxx> > > --- > include/sound/soc-dai.h | 5 +++-- > sound/soc/codecs/wm9081.c | 5 +++-- > sound/soc/pxa/magician.c | 2 +- > sound/soc/pxa/pxa-ssp.c | 27 ++++++++++++++++++++------- FWIW, the patchset doesn't break magician. Tested-by: Philipp Zabel <philipp.zabel@xxxxxxxxx> in my dev tree (for-2.6.31 and for-2.6.32 trees merged). regards Philipp > sound/soc/soc-core.c | 9 ++++++--- > 5 files changed, 33 insertions(+), 15 deletions(-) > > diff --git a/include/sound/soc-dai.h b/include/sound/soc-dai.h > index 352d7ee..6692410 100644 > --- a/include/sound/soc-dai.h > +++ b/include/sound/soc-dai.h > @@ -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_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); > > @@ -140,7 +140,8 @@ struct snd_soc_dai_ops { > */ > int (*set_fmt)(struct snd_soc_dai *dai, unsigned int fmt); > 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); > > /* > diff --git a/sound/soc/codecs/wm9081.c b/sound/soc/codecs/wm9081.c > index 86fc57e..c47d573 100644 > --- a/sound/soc/codecs/wm9081.c > +++ b/sound/soc/codecs/wm9081.c > @@ -1206,8 +1206,9 @@ static int wm9081_set_sysclk(struct snd_soc_dai *codec_dai, > return 0; > } > > +/* FIXME: Needs to handle slot_width */ > 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; > unsigned int aif1 = wm9081_read(codec, WM9081_AUDIO_INTERFACE_1); > @@ -1219,7 +1220,7 @@ static int wm9081_set_tdm_slot(struct snd_soc_dai *dai, > > aif1 |= (slots - 1) << WM9081_AIFDAC_TDM_MODE_SHIFT; > > - switch (mask) { > + switch (rx_mask) { > case 1: > break; > case 2: > diff --git a/sound/soc/pxa/magician.c b/sound/soc/pxa/magician.c > index c89a3cd..34437d8 100644 > --- a/sound/soc/pxa/magician.c > +++ b/sound/soc/pxa/magician.c > @@ -188,7 +188,7 @@ static int magician_playback_hw_params(struct snd_pcm_substream *substream, > if (ret < 0) > 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) > return ret; > > diff --git a/sound/soc/pxa/pxa-ssp.c b/sound/soc/pxa/pxa-ssp.c > index e22c5ce..5b9ed64 100644 > --- a/sound/soc/pxa/pxa-ssp.c > +++ b/sound/soc/pxa/pxa-ssp.c > @@ -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 > */ > 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_device *ssp = priv->dev.ssp; > 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); > > - /* set number of active slots */ > - sscr0 |= SSCR0_SlotsPerFrm(slots); > + 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); > > - /* set active slot mask */ > - ssp_write_reg(ssp, SSTSA, mask); > - ssp_write_reg(ssp, SSRSA, mask); > return 0; > } > > diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c > index e1a920c..c72a8e8 100644 > --- a/sound/soc/soc-core.c > +++ b/sound/soc/soc-core.c > @@ -2133,17 +2133,20 @@ EXPORT_SYMBOL_GPL(snd_soc_dai_set_fmt); > /** > * snd_soc_dai_set_tdm_slot - configure DAI TDM. > * @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. > + * @slot_width: Width in bits for each slot. > * > * Configures a DAI for TDM operation. Both mask and slots are codec and DAI > * specific. > */ > 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) > - return dai->ops->set_tdm_slot(dai, mask, slots); > + return dai->ops->set_tdm_slot(dai, tx_mask, rx_mask, > + slots, slot_width); > else > return -EINVAL; > } > -- > tg: (c787980..) asoc/set_tdm_slot (depends on: asoc/remove-code-duplication) > > -- > Daniel Ribeiro > _______________________________________________ Alsa-devel mailing list Alsa-devel@xxxxxxxxxxxxxxxx http://mailman.alsa-project.org/mailman/listinfo/alsa-devel