From f7045758fffa176ea68730ea855415e619bf516d Mon Sep 17 00:00:00 2001 From: Phil Elwell Date: Sat, 3 Mar 2018 16:25:19 +0000 Subject: [PATCH 240/454] audioinjector-octo: Add continuous clock feature By user request, add a switch to prevent the clocks being stopped when the stream is paused, stopped or shutdown. Provide access to the switch by adding a 'non-stop-clocks' parameter to the audioinjector-addons overlay. See: https://github.com/raspberrypi/linux/issues/2409 Signed-off-by: Phil Elwell --- arch/arm/boot/dts/overlays/README | 5 +++-- .../overlays/audioinjector-addons-overlay.dts | 6 +++++- sound/soc/bcm/audioinjector-octo-soundcard.c | 19 +++++++++++-------- 3 files changed, 19 insertions(+), 11 deletions(-) --- a/arch/arm/boot/dts/overlays/README +++ b/arch/arm/boot/dts/overlays/README @@ -357,8 +357,9 @@ Params: interrupt GPIO use Name: audioinjector-addons Info: Configures the audioinjector.net audio add on soundcards -Load: dtoverlay=audioinjector-addons -Params: +Load: dtoverlay=audioinjector-addons,= +Params: non-stop-clocks Keeps the clocks running even when the stream + is paused or stopped (default off) Name: audioinjector-wm8731-audio --- a/arch/arm/boot/dts/overlays/audioinjector-addons-overlay.dts +++ b/arch/arm/boot/dts/overlays/audioinjector-addons-overlay.dts @@ -42,7 +42,7 @@ fragment@2 { target = <&sound>; - __overlay__ { + snd: __overlay__ { compatible = "ai,audioinjector-octo-soundcard"; mult-gpios = <&gpio 27 0>, <&gpio 22 0>, <&gpio 23 0>, <&gpio 24 0>; @@ -52,4 +52,8 @@ status = "okay"; }; }; + + __overrides__ { + non-stop-clocks = <&snd>, "non-stop-clocks?"; + }; }; --- a/sound/soc/bcm/audioinjector-octo-soundcard.c +++ b/sound/soc/bcm/audioinjector-octo-soundcard.c @@ -29,6 +29,7 @@ static struct gpio_descs *mult_gpios; static struct gpio_desc *codec_rst_gpio; static unsigned int audioinjector_octo_rate; +static bool non_stop_clocks; static const unsigned int audioinjector_octo_rates[] = { 96000, 48000, 32000, 24000, 16000, 8000, 88200, 44100, 29400, 22050, 14700, @@ -133,12 +134,16 @@ static int audioinjector_octo_hw_params( static int audioinjector_octo_trigger(struct snd_pcm_substream *substream, int cmd){ int mult[4]; - mult[0] = 0; - mult[1] = 0; - mult[2] = 0; - mult[3] = 0; + + memset(mult, 0, sizeof(mult)); switch (cmd) { + case SNDRV_PCM_TRIGGER_STOP: + case SNDRV_PCM_TRIGGER_SUSPEND: + case SNDRV_PCM_TRIGGER_PAUSE_PUSH: + if (!non_stop_clocks) + break; + /* Drop through... */ case SNDRV_PCM_TRIGGER_START: case SNDRV_PCM_TRIGGER_RESUME: case SNDRV_PCM_TRIGGER_PAUSE_RELEASE: @@ -177,10 +182,6 @@ static int audioinjector_octo_trigger(st return -EINVAL; } break; - case SNDRV_PCM_TRIGGER_STOP: - case SNDRV_PCM_TRIGGER_SUSPEND: - case SNDRV_PCM_TRIGGER_PAUSE_PUSH: - break; default: return -EINVAL; } @@ -276,6 +277,8 @@ static int audioinjector_octo_probe(stru if (IS_ERR(codec_rst_gpio)) return PTR_ERR(codec_rst_gpio); + non_stop_clocks = of_property_read_bool(pdev->dev.of_node, "non-stop-clocks"); + if (codec_rst_gpio) gpiod_set_value(codec_rst_gpio, 1); msleep(500);