ASoC: rsnd: add rsnd_set_slot() / rsnd_get_slot_num()
TDM will use 6 or 8 slots on 1 SSI, and Multi channel will use 6 or 8 slots on few SSI (each SSI uses 2 slots). Thus, this adds new slot control functions which can be prepare for Multi channel support. Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com> Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
parent
c140284b80
commit
750fd445ac
2 changed files with 21 additions and 3 deletions
|
@ -191,6 +191,13 @@ int rsnd_io_is_working(struct rsnd_dai_stream *io)
|
||||||
return !!io->substream;
|
return !!io->substream;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void rsnd_set_slot(struct rsnd_dai *rdai,
|
||||||
|
int slots, int num)
|
||||||
|
{
|
||||||
|
rdai->slots = slots;
|
||||||
|
rdai->slots_num = num;
|
||||||
|
}
|
||||||
|
|
||||||
int rsnd_get_slot(struct rsnd_dai_stream *io)
|
int rsnd_get_slot(struct rsnd_dai_stream *io)
|
||||||
{
|
{
|
||||||
struct rsnd_dai *rdai = rsnd_io_to_rdai(io);
|
struct rsnd_dai *rdai = rsnd_io_to_rdai(io);
|
||||||
|
@ -198,10 +205,17 @@ int rsnd_get_slot(struct rsnd_dai_stream *io)
|
||||||
return rdai->slots;
|
return rdai->slots;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int rsnd_get_slot_num(struct rsnd_dai_stream *io)
|
||||||
|
{
|
||||||
|
struct rsnd_dai *rdai = rsnd_io_to_rdai(io);
|
||||||
|
|
||||||
|
return rdai->slots_num;
|
||||||
|
}
|
||||||
|
|
||||||
int rsnd_get_slot_width(struct rsnd_dai_stream *io)
|
int rsnd_get_slot_width(struct rsnd_dai_stream *io)
|
||||||
{
|
{
|
||||||
struct snd_pcm_runtime *runtime = rsnd_io_to_runtime(io);
|
struct snd_pcm_runtime *runtime = rsnd_io_to_runtime(io);
|
||||||
int chan = runtime->channels;
|
int chan = runtime->channels / rsnd_get_slot_num(io);
|
||||||
|
|
||||||
/* TDM Extend Mode needs 8ch */
|
/* TDM Extend Mode needs 8ch */
|
||||||
if (chan == 6)
|
if (chan == 6)
|
||||||
|
@ -579,7 +593,7 @@ static int rsnd_soc_set_dai_tdm_slot(struct snd_soc_dai *dai,
|
||||||
switch (slots) {
|
switch (slots) {
|
||||||
case 6:
|
case 6:
|
||||||
/* TDM Extend Mode */
|
/* TDM Extend Mode */
|
||||||
rdai->slots = slots;
|
rsnd_set_slot(rdai, slots, 1);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
dev_err(dev, "unsupported TDM slots (%d)\n", slots);
|
dev_err(dev, "unsupported TDM slots (%d)\n", slots);
|
||||||
|
@ -660,7 +674,7 @@ static int rsnd_dai_probe(struct rsnd_priv *priv)
|
||||||
|
|
||||||
rdai->playback.rdai = rdai;
|
rdai->playback.rdai = rdai;
|
||||||
rdai->capture.rdai = rdai;
|
rdai->capture.rdai = rdai;
|
||||||
rdai->slots = 2; /* default */
|
rsnd_set_slot(rdai, 2, 1); /* default */
|
||||||
|
|
||||||
#define mod_parse(name) \
|
#define mod_parse(name) \
|
||||||
node = rsnd_##name##_of_node(priv); \
|
node = rsnd_##name##_of_node(priv); \
|
||||||
|
|
|
@ -293,8 +293,11 @@ void rsnd_mod_interrupt(struct rsnd_mod *mod,
|
||||||
void (*callback)(struct rsnd_mod *mod,
|
void (*callback)(struct rsnd_mod *mod,
|
||||||
struct rsnd_dai_stream *io));
|
struct rsnd_dai_stream *io));
|
||||||
|
|
||||||
|
void rsnd_set_slot(struct rsnd_dai *rdai,
|
||||||
|
int slots, int slots_total);
|
||||||
int rsnd_get_slot(struct rsnd_dai_stream *io);
|
int rsnd_get_slot(struct rsnd_dai_stream *io);
|
||||||
int rsnd_get_slot_width(struct rsnd_dai_stream *io);
|
int rsnd_get_slot_width(struct rsnd_dai_stream *io);
|
||||||
|
int rsnd_get_slot_num(struct rsnd_dai_stream *io);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* R-Car sound DAI
|
* R-Car sound DAI
|
||||||
|
@ -334,6 +337,7 @@ struct rsnd_dai {
|
||||||
struct rsnd_priv *priv;
|
struct rsnd_priv *priv;
|
||||||
|
|
||||||
int slots;
|
int slots;
|
||||||
|
int slots_num;
|
||||||
|
|
||||||
unsigned int clk_master:1;
|
unsigned int clk_master:1;
|
||||||
unsigned int bit_clk_inv:1;
|
unsigned int bit_clk_inv:1;
|
||||||
|
|
Loading…
Reference in a new issue