aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/brcm2708/patches-3.18/0084-Add-a-parameter-to-turn-off-SPDIF-output-if-no-audio.patch
diff options
context:
space:
mode:
Diffstat (limited to 'target/linux/brcm2708/patches-3.18/0084-Add-a-parameter-to-turn-off-SPDIF-output-if-no-audio.patch')
-rwxr-xr-xtarget/linux/brcm2708/patches-3.18/0084-Add-a-parameter-to-turn-off-SPDIF-output-if-no-audio.patch77
1 files changed, 77 insertions, 0 deletions
diff --git a/target/linux/brcm2708/patches-3.18/0084-Add-a-parameter-to-turn-off-SPDIF-output-if-no-audio.patch b/target/linux/brcm2708/patches-3.18/0084-Add-a-parameter-to-turn-off-SPDIF-output-if-no-audio.patch
new file mode 100755
index 0000000000..2a6f816aed
--- /dev/null
+++ b/target/linux/brcm2708/patches-3.18/0084-Add-a-parameter-to-turn-off-SPDIF-output-if-no-audio.patch
@@ -0,0 +1,77 @@
+From a09a8ebce7251e2a42668bd5ae57c12ed24fdca8 Mon Sep 17 00:00:00 2001
+From: Daniel Matuschek <daniel@hifiberry.com>
+Date: Sat, 31 Jan 2015 16:07:56 +0100
+Subject: [PATCH 084/114] Add a parameter to turn off SPDIF output if no audio
+ is playing
+
+This patch adds the paramater auto_shutdown_output to the kernel module.
+Default behaviour of the module is the same, but when auto_shutdown_output
+is set to 1, the SPDIF oputput will shutdown if no stream is playing.
+---
+ sound/soc/bcm/hifiberry_digi.c | 29 ++++++++++++++++++++++++++++-
+ 1 file changed, 28 insertions(+), 1 deletion(-)
+
+diff --git a/sound/soc/bcm/hifiberry_digi.c b/sound/soc/bcm/hifiberry_digi.c
+index 76af8a6..b0e3d28 100644
+--- a/sound/soc/bcm/hifiberry_digi.c
++++ b/sound/soc/bcm/hifiberry_digi.c
+@@ -26,6 +26,11 @@
+
+ #include "../codecs/wm8804.h"
+
++static short int auto_shutdown_output = 0;
++module_param(auto_shutdown_output, short, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP);
++MODULE_PARM_DESC(auto_shutdown_output, "Shutdown SP/DIF output if playback is stopped");
++
++
+ static int samplerate=44100;
+
+ static int snd_rpi_hifiberry_digi_init(struct snd_soc_pcm_runtime *rtd)
+@@ -38,6 +43,25 @@ static int snd_rpi_hifiberry_digi_init(struct snd_soc_pcm_runtime *rtd)
+ return 0;
+ }
+
++static int snd_rpi_hifiberry_digi_startup(struct snd_pcm_substream *substream) {
++ /* turn on digital output */
++ struct snd_soc_pcm_runtime *rtd = substream->private_data;
++ struct snd_soc_codec *codec = rtd->codec;
++ snd_soc_update_bits(codec, WM8804_PWRDN, 0x3c, 0x00);
++ return 0;
++}
++
++static void snd_rpi_hifiberry_digi_shutdown(struct snd_pcm_substream *substream) {
++ /* turn off output */
++ if (auto_shutdown_output) {
++ /* turn off output */
++ struct snd_soc_pcm_runtime *rtd = substream->private_data;
++ struct snd_soc_codec *codec = rtd->codec;
++ snd_soc_update_bits(codec, WM8804_PWRDN, 0x3c, 0x3c);
++ }
++}
++
++
+ static int snd_rpi_hifiberry_digi_hw_params(struct snd_pcm_substream *substream,
+ struct snd_pcm_hw_params *params)
+ {
+@@ -70,7 +94,8 @@ static int snd_rpi_hifiberry_digi_hw_params(struct snd_pcm_substream *substream,
+ break;
+ default:
+ dev_err(substream->pcm->dev,
+- "Failed to set WM8804 SYSCLK, unsupported samplerate\n");
++ "Failed to set WM8804 SYSCLK, unsupported samplerate %d\n",
++ samplerate);
+ }
+
+ snd_soc_dai_set_clkdiv(codec_dai, WM8804_MCLK_DIV, mclk_div);
+@@ -96,6 +121,8 @@ static int snd_rpi_hifiberry_digi_hw_params(struct snd_pcm_substream *substream,
+ /* machine stream operations */
+ static struct snd_soc_ops snd_rpi_hifiberry_digi_ops = {
+ .hw_params = snd_rpi_hifiberry_digi_hw_params,
++ .startup = snd_rpi_hifiberry_digi_startup,
++ .shutdown = snd_rpi_hifiberry_digi_shutdown,
+ };
+
+ static struct snd_soc_dai_link snd_rpi_hifiberry_digi_dai[] = {
+--
+1.8.3.2
+