Commit 8cc64ae7 authored by Takashi Iwai's avatar Takashi Iwai Committed by Greg Kroah-Hartman

staging: bcm2835-audio: Simplify PCM creation helpers

All three functions to create PCM objects are fairly resemble, and can
be unified to a single common helper.
Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
Tested-by: default avatarStefan Wahren <stefan.wahren@i2se.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent bec95770
...@@ -324,91 +324,36 @@ static const struct snd_pcm_ops snd_bcm2835_playback_spdif_ops = { ...@@ -324,91 +324,36 @@ static const struct snd_pcm_ops snd_bcm2835_playback_spdif_ops = {
}; };
/* create a pcm device */ /* 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; struct snd_pcm *pcm;
int err; int err;
err = snd_pcm_new(chip->card, "bcm2835 ALSA", 0, numchannels, 0, &pcm); err = snd_pcm_new(chip->card, name, idx, 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);
if (err) if (err)
return err; return err;
pcm->private_data = chip; pcm->private_data = chip;
pcm->nonatomic = true; pcm->nonatomic = true;
strcpy(pcm->name, name); strcpy(pcm->name, name);
chip->pcm = pcm; if (!spdif) {
chip->dest = route; chip->dest = route;
chip->volume = 0; chip->volume = 0;
chip->mute = CTRL_VOL_UNMUTE; chip->mute = CTRL_VOL_UNMUTE;
}
snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK,
spdif ? &snd_bcm2835_playback_spdif_ops :
&snd_bcm2835_playback_ops); &snd_bcm2835_playback_ops);
snd_pcm_lib_preallocate_pages_for_all( snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_DEV,
pcm, chip->card->dev->parent, 128 * 1024, 128 * 1024);
SNDRV_DMA_TYPE_DEV,
chip->card->dev->parent,
snd_bcm2835_playback_hw.buffer_bytes_max,
snd_bcm2835_playback_hw.buffer_bytes_max);
if (spdif)
chip->pcm_spdif = pcm;
else
chip->pcm = pcm;
return 0; return 0;
} }
...@@ -138,17 +138,26 @@ static int bcm2835_audio_alsa_newpcm(struct bcm2835_chip *chip, ...@@ -138,17 +138,26 @@ static int bcm2835_audio_alsa_newpcm(struct bcm2835_chip *chip,
{ {
int err; 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) if (err)
return 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) if (err)
return err; return err;
return 0; 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 = { static struct bcm2835_audio_driver bcm2835_audio_alsa = {
.driver = { .driver = {
.name = "bcm2835_alsa", .name = "bcm2835_alsa",
...@@ -169,7 +178,7 @@ static struct bcm2835_audio_driver bcm2835_audio_hdmi = { ...@@ -169,7 +178,7 @@ static struct bcm2835_audio_driver bcm2835_audio_hdmi = {
.shortname = "bcm2835 HDMI", .shortname = "bcm2835 HDMI",
.longname = "bcm2835 HDMI", .longname = "bcm2835 HDMI",
.minchannels = 1, .minchannels = 1,
.newpcm = snd_bcm2835_new_simple_pcm, .newpcm = bcm2835_audio_simple_newpcm,
.newctl = snd_bcm2835_new_hdmi_ctl, .newctl = snd_bcm2835_new_hdmi_ctl,
.route = AUDIO_DEST_HDMI .route = AUDIO_DEST_HDMI
}; };
...@@ -182,7 +191,7 @@ static struct bcm2835_audio_driver bcm2835_audio_headphones = { ...@@ -182,7 +191,7 @@ static struct bcm2835_audio_driver bcm2835_audio_headphones = {
.shortname = "bcm2835 Headphones", .shortname = "bcm2835 Headphones",
.longname = "bcm2835 Headphones", .longname = "bcm2835 Headphones",
.minchannels = 1, .minchannels = 1,
.newpcm = snd_bcm2835_new_simple_pcm, .newpcm = bcm2835_audio_simple_newpcm,
.newctl = snd_bcm2835_new_headphones_ctl, .newctl = snd_bcm2835_new_headphones_ctl,
.route = AUDIO_DEST_HEADPHONES .route = AUDIO_DEST_HEADPHONES
}; };
......
...@@ -84,12 +84,9 @@ struct bcm2835_alsa_stream { ...@@ -84,12 +84,9 @@ struct bcm2835_alsa_stream {
}; };
int snd_bcm2835_new_ctl(struct bcm2835_chip *chip); int snd_bcm2835_new_ctl(struct bcm2835_chip *chip);
int snd_bcm2835_new_pcm(struct bcm2835_chip *chip, u32 numchannels); int snd_bcm2835_new_pcm(struct bcm2835_chip *chip, const char *name,
int snd_bcm2835_new_spdif_pcm(struct bcm2835_chip *chip); int idx, enum snd_bcm2835_route route,
int snd_bcm2835_new_simple_pcm(struct bcm2835_chip *chip, u32 numchannels, bool spdif);
const char *name,
enum snd_bcm2835_route route,
u32 numchannels);
int snd_bcm2835_new_hdmi_ctl(struct bcm2835_chip *chip); int snd_bcm2835_new_hdmi_ctl(struct bcm2835_chip *chip);
int snd_bcm2835_new_headphones_ctl(struct bcm2835_chip *chip); int snd_bcm2835_new_headphones_ctl(struct bcm2835_chip *chip);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment