staging: bcm2835-audio: Simplify PCM creation helpers
authorTakashi Iwai <tiwai@suse.de>
Tue, 4 Sep 2018 15:58:56 +0000 (17:58 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 10 Sep 2018 09:15:00 +0000 (11:15 +0200)
All three functions to create PCM objects are fairly resemble, and can
be unified to a single common helper.

Signed-off-by: Takashi Iwai <tiwai@suse.de>
Tested-by: Stefan Wahren <stefan.wahren@i2se.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/staging/vc04_services/bcm2835-audio/bcm2835-pcm.c
drivers/staging/vc04_services/bcm2835-audio/bcm2835.c
drivers/staging/vc04_services/bcm2835-audio/bcm2835.h

index 5ddb8ee93cb292f98bdc8e3753a8e06d93b5099b..98480d97cc2e7780a4df99a1cabdca7ddea616f0 100644 (file)
@@ -324,91 +324,36 @@ static const struct snd_pcm_ops snd_bcm2835_playback_spdif_ops = {
 };
 
 /* 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;
 }
-
index 8a87c33b1ea9c67662783da2df51159f00d7e9e3..2869f310086fc7d9ff7969ee6c05f612086618e3 100644 (file)
@@ -138,17 +138,26 @@ static int bcm2835_audio_alsa_newpcm(struct bcm2835_chip *chip,
 {
        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 bcm2835_audio_hdmi = {
        .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 bcm2835_audio_headphones = {
        .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
 };
index 4e41069dc22ad2e026e2770170751f6a7a36a206..e13435d1c2051025634bf4e0afa1febfb19a0cc1 100644 (file)
@@ -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);