summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKuninori Morimoto <kuninori.morimoto.gx@renesas.com>2015-12-17 05:57:47 +0300
committerMark Brown <broonie@kernel.org>2015-12-18 15:10:56 +0300
commit750fd445ac53f1623cfcbf710d2bfc7aa1b7086d (patch)
treee1a5c2e39ac561df77b55d4e09a74fabfd0f7432
parentc140284b8085e0fa07c24f4285db9dc107ad2ed3 (diff)
downloadlinux-750fd445ac53f1623cfcbf710d2bfc7aa1b7086d.tar.xz
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>
-rw-r--r--sound/soc/sh/rcar/core.c20
-rw-r--r--sound/soc/sh/rcar/rsnd.h4
2 files changed, 21 insertions, 3 deletions
diff --git a/sound/soc/sh/rcar/core.c b/sound/soc/sh/rcar/core.c
index 76af41633f9f..528041eff704 100644
--- a/sound/soc/sh/rcar/core.c
+++ b/sound/soc/sh/rcar/core.c
@@ -191,6 +191,13 @@ int rsnd_io_is_working(struct rsnd_dai_stream *io)
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)
{
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;
}
+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)
{
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 */
if (chan == 6)
@@ -579,7 +593,7 @@ static int rsnd_soc_set_dai_tdm_slot(struct snd_soc_dai *dai,
switch (slots) {
case 6:
/* TDM Extend Mode */
- rdai->slots = slots;
+ rsnd_set_slot(rdai, slots, 1);
break;
default:
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->capture.rdai = rdai;
- rdai->slots = 2; /* default */
+ rsnd_set_slot(rdai, 2, 1); /* default */
#define mod_parse(name) \
node = rsnd_##name##_of_node(priv); \
diff --git a/sound/soc/sh/rcar/rsnd.h b/sound/soc/sh/rcar/rsnd.h
index 804f2f5622e0..c9aef234d002 100644
--- a/sound/soc/sh/rcar/rsnd.h
+++ b/sound/soc/sh/rcar/rsnd.h
@@ -293,8 +293,11 @@ void rsnd_mod_interrupt(struct rsnd_mod *mod,
void (*callback)(struct rsnd_mod *mod,
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_width(struct rsnd_dai_stream *io);
+int rsnd_get_slot_num(struct rsnd_dai_stream *io);
/*
* R-Car sound DAI
@@ -334,6 +337,7 @@ struct rsnd_dai {
struct rsnd_priv *priv;
int slots;
+ int slots_num;
unsigned int clk_master:1;
unsigned int bit_clk_inv:1;