[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <b56ebac96ad232e2d9871067b13654eb9223f28f.1566677788.git.mirq-linux@rere.qmqm.pl>
Date: Sat, 24 Aug 2019 22:26:57 +0200
From: Michał Mirosław <mirq-linux@...e.qmqm.pl>
To: alsa-devel@...a-project.org, devicetree@...r.kernel.org
Cc: Alexandre Belloni <alexandre.belloni@...tlin.com>,
Arnd Bergmann <arnd@...db.de>,
Chas Williams <3chas3@...il.com>,
Codrin Ciubotariu <codrin.ciubotariu@...rochip.com>,
Greg Kroah-Hartman <gregkh@...uxfoundation.org>,
Jaroslav Kysela <perex@...ex.cz>,
Liam Girdwood <lgirdwood@...il.com>,
Ludovic Desroches <ludovic.desroches@...rochip.com>,
Mark Brown <broonie@...nel.org>,
Mark Rutland <mark.rutland@....com>,
Nicolas Ferre <nicolas.ferre@...rochip.com>,
Rob Herring <robh-dt@...nel.org>,
Takashi Iwai <tiwai@...e.com>, linux-kernel@...r.kernel.org
Subject: [PATCH v2 6/6] ASoC: atmel_ssc_dai: Enable shared FSYNC source in
frame-slave mode
SSC driver allows only synchronous TX and RX. In slave mode for BCLK
it uses only one of TK or RK pin, but for LRCLK it configured separate
inputs from TF and RF pins. Allow configuration with common FS signal.
Signed-off-by: Michał Mirosław <mirq-linux@...e.qmqm.pl>
---
v2: use alternate DT binding
split DT and drivers/misc changes
---
sound/soc/atmel/atmel_ssc_dai.c | 26 ++++++++++++++++++++++----
1 file changed, 22 insertions(+), 4 deletions(-)
diff --git a/sound/soc/atmel/atmel_ssc_dai.c b/sound/soc/atmel/atmel_ssc_dai.c
index 48e9eef34c0f..035d4da58f2b 100644
--- a/sound/soc/atmel/atmel_ssc_dai.c
+++ b/sound/soc/atmel/atmel_ssc_dai.c
@@ -605,14 +605,32 @@ static int atmel_ssc_hw_params(struct snd_pcm_substream *substream,
return -EINVAL;
}
- if (!atmel_ssc_cfs(ssc_p)) {
+ if (atmel_ssc_cfs(ssc_p)) {
+ /*
+ * SSC provides LRCLK
+ *
+ * Both TF and RF are generated, so use them directly.
+ */
+ rcmr |= SSC_BF(RCMR_START, fs_edge);
+ tcmr |= SSC_BF(TCMR_START, fs_edge);
+ } else {
fslen = fslen_ext = 0;
rcmr_period = tcmr_period = 0;
fs_osync = SSC_FSOS_NONE;
- }
- rcmr |= SSC_BF(RCMR_START, fs_edge);
- tcmr |= SSC_BF(TCMR_START, fs_edge);
+ if (ssc->lrclk_from_tf_pin) {
+ rcmr |= SSC_BF(RCMR_START, SSC_START_TX_RX);
+ tcmr |= SSC_BF(TCMR_START, fs_edge);
+ } else if (ssc->lrclk_from_rf_pin) {
+ /* assume RF is to be used when RK is used as BCLK input */
+ /* Note: won't work correctly on SAMA5D2 due to errata */
+ rcmr |= SSC_BF(RCMR_START, fs_edge);
+ tcmr |= SSC_BF(TCMR_START, SSC_START_TX_RX);
+ } else {
+ rcmr |= SSC_BF(RCMR_START, fs_edge);
+ tcmr |= SSC_BF(TCMR_START, fs_edge);
+ }
+ }
if (atmel_ssc_cbs(ssc_p)) {
/*
--
2.20.1
Powered by blists - more mailing lists