ASoC: rsnd: ssi enables non-stereo sound
Current SSI is assuming that the sound is always stereo. But, SSI needs to calculate its frequency when master mode. Then This frequency depends on each SSI's slots, and TDM mode (= TDM Extend Mode, TDM split Mode, TDM Multichannel Mode). This patch enables to use non-stereo sound. Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com> Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
parent
08bada26fe
commit
8ec85e7f7e
|
@ -191,6 +191,34 @@ int rsnd_io_is_working(struct rsnd_dai_stream *io)
|
||||||
return !!io->substream;
|
return !!io->substream;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int rsnd_get_slot_rdai(struct rsnd_dai *rdai)
|
||||||
|
{
|
||||||
|
return rdai->slots;
|
||||||
|
}
|
||||||
|
|
||||||
|
int rsnd_get_slot_runtime(struct rsnd_dai_stream *io)
|
||||||
|
{
|
||||||
|
struct rsnd_dai *rdai = rsnd_io_to_rdai(io);
|
||||||
|
struct snd_pcm_runtime *runtime = rsnd_io_to_runtime(io);
|
||||||
|
int chan = rsnd_get_slot_rdai(rdai);
|
||||||
|
|
||||||
|
if (runtime->channels < chan)
|
||||||
|
chan = runtime->channels;
|
||||||
|
|
||||||
|
return chan;
|
||||||
|
}
|
||||||
|
|
||||||
|
int rsnd_get_slot_extend(struct rsnd_dai_stream *io)
|
||||||
|
{
|
||||||
|
int chan = rsnd_get_slot_runtime(io);
|
||||||
|
|
||||||
|
/* TDM Extend Mode needs 8ch */
|
||||||
|
if (chan == 6)
|
||||||
|
chan = 8;
|
||||||
|
|
||||||
|
return chan;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* ADINR function
|
* ADINR function
|
||||||
*/
|
*/
|
||||||
|
@ -611,6 +639,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 */
|
||||||
|
|
||||||
#define mod_parse(name) \
|
#define mod_parse(name) \
|
||||||
node = rsnd_##name##_of_node(priv); \
|
node = rsnd_##name##_of_node(priv); \
|
||||||
|
|
|
@ -285,6 +285,10 @@ 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));
|
||||||
|
|
||||||
|
int rsnd_get_slot_rdai(struct rsnd_dai *rdai);
|
||||||
|
int rsnd_get_slot_runtime(struct rsnd_dai_stream *io);
|
||||||
|
int rsnd_get_slot_extend(struct rsnd_dai_stream *io);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* R-Car sound DAI
|
* R-Car sound DAI
|
||||||
*/
|
*/
|
||||||
|
@ -321,6 +325,8 @@ struct rsnd_dai {
|
||||||
struct rsnd_dai_stream capture;
|
struct rsnd_dai_stream capture;
|
||||||
struct rsnd_priv *priv;
|
struct rsnd_priv *priv;
|
||||||
|
|
||||||
|
int slots;
|
||||||
|
|
||||||
unsigned int clk_master:1;
|
unsigned int clk_master:1;
|
||||||
unsigned int bit_clk_inv:1;
|
unsigned int bit_clk_inv:1;
|
||||||
unsigned int frm_clk_inv:1;
|
unsigned int frm_clk_inv:1;
|
||||||
|
|
|
@ -177,6 +177,7 @@ static int rsnd_ssi_master_clk_start(struct rsnd_ssi *ssi,
|
||||||
struct rsnd_dai *rdai = rsnd_io_to_rdai(io);
|
struct rsnd_dai *rdai = rsnd_io_to_rdai(io);
|
||||||
struct rsnd_mod *mod = rsnd_mod_get(ssi);
|
struct rsnd_mod *mod = rsnd_mod_get(ssi);
|
||||||
struct rsnd_mod *ssi_parent_mod = rsnd_io_to_mod_ssip(io);
|
struct rsnd_mod *ssi_parent_mod = rsnd_io_to_mod_ssip(io);
|
||||||
|
int slots = rsnd_get_slot_extend(io);
|
||||||
int j, ret;
|
int j, ret;
|
||||||
int ssi_clk_mul_table[] = {
|
int ssi_clk_mul_table[] = {
|
||||||
1, 2, 4, 8, 16, 6, 12,
|
1, 2, 4, 8, 16, 6, 12,
|
||||||
|
@ -206,10 +207,10 @@ static int rsnd_ssi_master_clk_start(struct rsnd_ssi *ssi,
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* this driver is assuming that
|
* this driver is assuming that
|
||||||
* system word is 64fs (= 2 x 32bit)
|
* system word is 32bit x slots
|
||||||
* see rsnd_ssi_init()
|
* see rsnd_ssi_init()
|
||||||
*/
|
*/
|
||||||
main_rate = rate * 32 * 2 * ssi_clk_mul_table[j];
|
main_rate = rate * 32 * slots * ssi_clk_mul_table[j];
|
||||||
|
|
||||||
ret = rsnd_adg_ssi_clk_try_start(mod, main_rate);
|
ret = rsnd_adg_ssi_clk_try_start(mod, main_rate);
|
||||||
if (0 == ret) {
|
if (0 == ret) {
|
||||||
|
|
Loading…
Reference in a new issue