X-Git-Url: http://git.openwrt.org/?a=blobdiff_plain;f=target%2Flinux%2Fbrcm2708%2Fpatches-4.19%2F950-0417-staging-bcm2835-audio-Simplify-PCM-creation-helpers.patch;fp=target%2Flinux%2Fbrcm2708%2Fpatches-4.19%2F950-0417-staging-bcm2835-audio-Simplify-PCM-creation-helpers.patch;h=6ead1b4ccf246a5ac7d2523fb5c8d83d4dde0a29;hb=67dcc43f3a22dc3a7ac07a7065971b426feeb043;hp=0000000000000000000000000000000000000000;hpb=47a93a810f78adce5a130d287f82b28e9b54313c;p=openwrt%2Fopenwrt.git diff --git a/target/linux/brcm2708/patches-4.19/950-0417-staging-bcm2835-audio-Simplify-PCM-creation-helpers.patch b/target/linux/brcm2708/patches-4.19/950-0417-staging-bcm2835-audio-Simplify-PCM-creation-helpers.patch new file mode 100644 index 0000000000..6ead1b4ccf --- /dev/null +++ b/target/linux/brcm2708/patches-4.19/950-0417-staging-bcm2835-audio-Simplify-PCM-creation-helpers.patch @@ -0,0 +1,196 @@ +From 706f9b2b95a2fff44f92deada99545036c249658 Mon Sep 17 00:00:00 2001 +From: Takashi Iwai +Date: Tue, 4 Sep 2018 17:58:56 +0200 +Subject: [PATCH] staging: bcm2835-audio: Simplify PCM creation helpers + +commit 74470ffeb9aed5548654cfca881bf1d7469fe9c4 upstream. + +All three functions to create PCM objects are fairly resemble, and can +be unified to a single common helper. + +Signed-off-by: Takashi Iwai +Tested-by: Stefan Wahren +Signed-off-by: Greg Kroah-Hartman +--- + .../vc04_services/bcm2835-audio/bcm2835-pcm.c | 87 ++++--------------- + .../vc04_services/bcm2835-audio/bcm2835.c | 17 +++- + .../vc04_services/bcm2835-audio/bcm2835.h | 9 +- + 3 files changed, 32 insertions(+), 81 deletions(-) + +--- a/drivers/staging/vc04_services/bcm2835-audio/bcm2835-pcm.c ++++ b/drivers/staging/vc04_services/bcm2835-audio/bcm2835-pcm.c +@@ -324,91 +324,36 @@ static const struct snd_pcm_ops snd_bcm2 + }; + + /* create a pcm device */ +-int snd_bcm2835_new_pcm(struct bcm2835_chip *chip, u32 numchannels) ++int snd_bcm2835_new_pcm(struct bcm2835_chip *chip, const char *name, ++ int idx, enum snd_bcm2835_route route, ++ u32 numchannels, bool spdif) + { + struct snd_pcm *pcm; + int err; + +- err = snd_pcm_new(chip->card, "bcm2835 ALSA", 0, numchannels, 0, &pcm); +- if (err < 0) +- return err; +- pcm->private_data = chip; +- pcm->nonatomic = true; +- strcpy(pcm->name, "bcm2835 ALSA"); +- chip->pcm = pcm; +- chip->dest = AUDIO_DEST_AUTO; +- chip->volume = 0; +- chip->mute = CTRL_VOL_UNMUTE; /*disable mute on startup */ +- /* set operators */ +- snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, +- &snd_bcm2835_playback_ops); +- +- /* pre-allocation of buffers */ +- /* NOTE: this may fail */ +- snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_DEV, +- chip->card->dev->parent, +- snd_bcm2835_playback_hw.buffer_bytes_max, +- snd_bcm2835_playback_hw.buffer_bytes_max); +- +- return 0; +-} +- +-int snd_bcm2835_new_spdif_pcm(struct bcm2835_chip *chip) +-{ +- struct snd_pcm *pcm; +- int err; +- +- err = snd_pcm_new(chip->card, "bcm2835 ALSA", 1, 1, 0, &pcm); +- if (err < 0) +- return err; +- +- pcm->private_data = chip; +- pcm->nonatomic = true; +- strcpy(pcm->name, "bcm2835 IEC958/HDMI"); +- chip->pcm_spdif = pcm; +- snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, +- &snd_bcm2835_playback_spdif_ops); +- +- /* pre-allocation of buffers */ +- /* NOTE: this may fail */ +- snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_DEV, +- chip->card->dev->parent, +- snd_bcm2835_playback_spdif_hw.buffer_bytes_max, snd_bcm2835_playback_spdif_hw.buffer_bytes_max); +- +- return 0; +-} +- +-int snd_bcm2835_new_simple_pcm(struct bcm2835_chip *chip, +- const char *name, +- enum snd_bcm2835_route route, +- u32 numchannels) +-{ +- struct snd_pcm *pcm; +- int err; +- +- err = snd_pcm_new(chip->card, name, 0, numchannels, +- 0, &pcm); ++ err = snd_pcm_new(chip->card, name, idx, numchannels, 0, &pcm); + if (err) + return err; + + pcm->private_data = chip; + pcm->nonatomic = true; + strcpy(pcm->name, name); +- chip->pcm = pcm; +- chip->dest = route; +- chip->volume = 0; +- chip->mute = CTRL_VOL_UNMUTE; ++ if (!spdif) { ++ chip->dest = route; ++ chip->volume = 0; ++ chip->mute = CTRL_VOL_UNMUTE; ++ } + + snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, ++ spdif ? &snd_bcm2835_playback_spdif_ops : + &snd_bcm2835_playback_ops); + +- snd_pcm_lib_preallocate_pages_for_all( +- pcm, +- SNDRV_DMA_TYPE_DEV, +- chip->card->dev->parent, +- snd_bcm2835_playback_hw.buffer_bytes_max, +- snd_bcm2835_playback_hw.buffer_bytes_max); ++ snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_DEV, ++ chip->card->dev->parent, 128 * 1024, 128 * 1024); + ++ if (spdif) ++ chip->pcm_spdif = pcm; ++ else ++ chip->pcm = pcm; + return 0; + } +- +--- a/drivers/staging/vc04_services/bcm2835-audio/bcm2835.c ++++ b/drivers/staging/vc04_services/bcm2835-audio/bcm2835.c +@@ -138,17 +138,26 @@ static int bcm2835_audio_alsa_newpcm(str + { + int err; + +- err = snd_bcm2835_new_pcm(chip, numchannels - 1); ++ err = snd_bcm2835_new_pcm(chip, "bcm2835 ALSA", 0, AUDIO_DEST_AUTO, ++ numchannels - 1, false); + if (err) + return err; + +- err = snd_bcm2835_new_spdif_pcm(chip); ++ err = snd_bcm2835_new_pcm(chip, "bcm2835 IEC958/HDMI", 1, 0, 1, true); + if (err) + return err; + + return 0; + } + ++static int bcm2835_audio_simple_newpcm(struct bcm2835_chip *chip, ++ const char *name, ++ enum snd_bcm2835_route route, ++ u32 numchannels) ++{ ++ return snd_bcm2835_new_pcm(chip, name, 0, route, numchannels, false); ++} ++ + static struct bcm2835_audio_driver bcm2835_audio_alsa = { + .driver = { + .name = "bcm2835_alsa", +@@ -169,7 +178,7 @@ static struct bcm2835_audio_driver bcm28 + .shortname = "bcm2835 HDMI", + .longname = "bcm2835 HDMI", + .minchannels = 1, +- .newpcm = snd_bcm2835_new_simple_pcm, ++ .newpcm = bcm2835_audio_simple_newpcm, + .newctl = snd_bcm2835_new_hdmi_ctl, + .route = AUDIO_DEST_HDMI + }; +@@ -182,7 +191,7 @@ static struct bcm2835_audio_driver bcm28 + .shortname = "bcm2835 Headphones", + .longname = "bcm2835 Headphones", + .minchannels = 1, +- .newpcm = snd_bcm2835_new_simple_pcm, ++ .newpcm = bcm2835_audio_simple_newpcm, + .newctl = snd_bcm2835_new_headphones_ctl, + .route = AUDIO_DEST_HEADPHONES + }; +--- a/drivers/staging/vc04_services/bcm2835-audio/bcm2835.h ++++ b/drivers/staging/vc04_services/bcm2835-audio/bcm2835.h +@@ -84,12 +84,9 @@ struct bcm2835_alsa_stream { + }; + + int snd_bcm2835_new_ctl(struct bcm2835_chip *chip); +-int snd_bcm2835_new_pcm(struct bcm2835_chip *chip, u32 numchannels); +-int snd_bcm2835_new_spdif_pcm(struct bcm2835_chip *chip); +-int snd_bcm2835_new_simple_pcm(struct bcm2835_chip *chip, +- const char *name, +- enum snd_bcm2835_route route, +- u32 numchannels); ++int snd_bcm2835_new_pcm(struct bcm2835_chip *chip, const char *name, ++ int idx, enum snd_bcm2835_route route, ++ u32 numchannels, bool spdif); + + int snd_bcm2835_new_hdmi_ctl(struct bcm2835_chip *chip); + int snd_bcm2835_new_headphones_ctl(struct bcm2835_chip *chip);