mirror of https://gitee.com/openkylin/linux.git
ALSA: Implement channel maps for standard onboard AC97 drivers
Just set the channel maps depending on the hardware availability. Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
parent
833a493b7e
commit
e36e3b86c7
|
@ -1250,6 +1250,7 @@ static struct atiixp_dma_ops snd_atiixp_spdif_dma_ops = {
|
||||||
static int __devinit snd_atiixp_pcm_new(struct atiixp *chip)
|
static int __devinit snd_atiixp_pcm_new(struct atiixp *chip)
|
||||||
{
|
{
|
||||||
struct snd_pcm *pcm;
|
struct snd_pcm *pcm;
|
||||||
|
struct snd_pcm_chmap *chmap;
|
||||||
struct snd_ac97_bus *pbus = chip->ac97_bus;
|
struct snd_ac97_bus *pbus = chip->ac97_bus;
|
||||||
int err, i, num_pcms;
|
int err, i, num_pcms;
|
||||||
|
|
||||||
|
@ -1293,6 +1294,14 @@ static int __devinit snd_atiixp_pcm_new(struct atiixp *chip)
|
||||||
snd_dma_pci_data(chip->pci),
|
snd_dma_pci_data(chip->pci),
|
||||||
64*1024, 128*1024);
|
64*1024, 128*1024);
|
||||||
|
|
||||||
|
err = snd_pcm_add_chmap_ctls(pcm, SNDRV_PCM_STREAM_PLAYBACK,
|
||||||
|
snd_pcm_alt_chmaps, chip->max_channels, 0,
|
||||||
|
&chmap);
|
||||||
|
if (err < 0)
|
||||||
|
return err;
|
||||||
|
chmap->channel_mask = SND_PCM_CHMAP_MASK_2468;
|
||||||
|
chip->ac97[0]->chmaps[SNDRV_PCM_STREAM_PLAYBACK] = chmap;
|
||||||
|
|
||||||
/* no SPDIF support on codec? */
|
/* no SPDIF support on codec? */
|
||||||
if (chip->pcms[ATI_PCM_SPDIF] && ! chip->pcms[ATI_PCM_SPDIF]->rates)
|
if (chip->pcms[ATI_PCM_SPDIF] && ! chip->pcms[ATI_PCM_SPDIF]->rates)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -711,6 +711,13 @@ static int __devinit snd_fm801_pcm(struct fm801 *chip, int device, struct snd_pc
|
||||||
snd_dma_pci_data(chip->pci),
|
snd_dma_pci_data(chip->pci),
|
||||||
chip->multichannel ? 128*1024 : 64*1024, 128*1024);
|
chip->multichannel ? 128*1024 : 64*1024, 128*1024);
|
||||||
|
|
||||||
|
err = snd_pcm_add_chmap_ctls(pcm, SNDRV_PCM_STREAM_PLAYBACK,
|
||||||
|
snd_pcm_alt_chmaps,
|
||||||
|
chip->multichannel ? 6 : 2, 0,
|
||||||
|
NULL);
|
||||||
|
if (err < 0)
|
||||||
|
return err;
|
||||||
|
|
||||||
if (rpcm)
|
if (rpcm)
|
||||||
*rpcm = pcm;
|
*rpcm = pcm;
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -1541,6 +1541,26 @@ static int __devinit snd_intel8x0_pcm1(struct intel8x0 *chip, int device,
|
||||||
snd_dma_pci_data(chip->pci),
|
snd_dma_pci_data(chip->pci),
|
||||||
rec->prealloc_size, rec->prealloc_max_size);
|
rec->prealloc_size, rec->prealloc_max_size);
|
||||||
|
|
||||||
|
if (rec->ac97_idx == ICHD_PCMOUT && rec->playback_ops) {
|
||||||
|
struct snd_pcm_chmap *chmap;
|
||||||
|
int chs = 2;
|
||||||
|
if (rec->ac97_idx == ICHD_PCMOUT) {
|
||||||
|
if (chip->multi8)
|
||||||
|
chs = 8;
|
||||||
|
else if (chip->multi6)
|
||||||
|
chs = 6;
|
||||||
|
else if (chip->multi4)
|
||||||
|
chs = 4;
|
||||||
|
}
|
||||||
|
err = snd_pcm_add_chmap_ctls(pcm, SNDRV_PCM_STREAM_PLAYBACK,
|
||||||
|
snd_pcm_alt_chmaps, chs, 0,
|
||||||
|
&chmap);
|
||||||
|
if (err < 0)
|
||||||
|
return err;
|
||||||
|
chmap->channel_mask = SND_PCM_CHMAP_MASK_2468;
|
||||||
|
chip->ac97[0]->chmaps[SNDRV_PCM_STREAM_PLAYBACK] = chmap;
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1440,6 +1440,7 @@ static void init_viadev(struct via82xx *chip, int idx, unsigned int reg_offset,
|
||||||
static int __devinit snd_via8233_pcm_new(struct via82xx *chip)
|
static int __devinit snd_via8233_pcm_new(struct via82xx *chip)
|
||||||
{
|
{
|
||||||
struct snd_pcm *pcm;
|
struct snd_pcm *pcm;
|
||||||
|
struct snd_pcm_chmap *chmap;
|
||||||
int i, err;
|
int i, err;
|
||||||
|
|
||||||
chip->playback_devno = 0; /* x 4 */
|
chip->playback_devno = 0; /* x 4 */
|
||||||
|
@ -1467,6 +1468,12 @@ static int __devinit snd_via8233_pcm_new(struct via82xx *chip)
|
||||||
snd_dma_pci_data(chip->pci),
|
snd_dma_pci_data(chip->pci),
|
||||||
64*1024, VIA_MAX_BUFSIZE);
|
64*1024, VIA_MAX_BUFSIZE);
|
||||||
|
|
||||||
|
err = snd_pcm_add_chmap_ctls(pcm, SNDRV_PCM_STREAM_PLAYBACK,
|
||||||
|
snd_pcm_std_chmaps, 2, 0,
|
||||||
|
&chmap);
|
||||||
|
if (err < 0)
|
||||||
|
return err;
|
||||||
|
|
||||||
/* PCM #1: multi-channel playback and 2nd capture */
|
/* PCM #1: multi-channel playback and 2nd capture */
|
||||||
err = snd_pcm_new(chip->card, chip->card->shortname, 1, 1, 1, &pcm);
|
err = snd_pcm_new(chip->card, chip->card->shortname, 1, 1, 1, &pcm);
|
||||||
if (err < 0)
|
if (err < 0)
|
||||||
|
@ -1484,6 +1491,14 @@ static int __devinit snd_via8233_pcm_new(struct via82xx *chip)
|
||||||
snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_DEV_SG,
|
snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_DEV_SG,
|
||||||
snd_dma_pci_data(chip->pci),
|
snd_dma_pci_data(chip->pci),
|
||||||
64*1024, VIA_MAX_BUFSIZE);
|
64*1024, VIA_MAX_BUFSIZE);
|
||||||
|
|
||||||
|
err = snd_pcm_add_chmap_ctls(pcm, SNDRV_PCM_STREAM_PLAYBACK,
|
||||||
|
snd_pcm_alt_chmaps, 6, 0,
|
||||||
|
&chmap);
|
||||||
|
if (err < 0)
|
||||||
|
return err;
|
||||||
|
chip->ac97->chmaps[SNDRV_PCM_STREAM_PLAYBACK] = chmap;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1493,6 +1508,7 @@ static int __devinit snd_via8233_pcm_new(struct via82xx *chip)
|
||||||
static int __devinit snd_via8233a_pcm_new(struct via82xx *chip)
|
static int __devinit snd_via8233a_pcm_new(struct via82xx *chip)
|
||||||
{
|
{
|
||||||
struct snd_pcm *pcm;
|
struct snd_pcm *pcm;
|
||||||
|
struct snd_pcm_chmap *chmap;
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
chip->multi_devno = 0;
|
chip->multi_devno = 0;
|
||||||
|
@ -1519,6 +1535,13 @@ static int __devinit snd_via8233a_pcm_new(struct via82xx *chip)
|
||||||
snd_dma_pci_data(chip->pci),
|
snd_dma_pci_data(chip->pci),
|
||||||
64*1024, VIA_MAX_BUFSIZE);
|
64*1024, VIA_MAX_BUFSIZE);
|
||||||
|
|
||||||
|
err = snd_pcm_add_chmap_ctls(pcm, SNDRV_PCM_STREAM_PLAYBACK,
|
||||||
|
snd_pcm_alt_chmaps, 6, 0,
|
||||||
|
&chmap);
|
||||||
|
if (err < 0)
|
||||||
|
return err;
|
||||||
|
chip->ac97->chmaps[SNDRV_PCM_STREAM_PLAYBACK] = chmap;
|
||||||
|
|
||||||
/* SPDIF supported? */
|
/* SPDIF supported? */
|
||||||
if (! ac97_can_spdif(chip->ac97))
|
if (! ac97_can_spdif(chip->ac97))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
Loading…
Reference in New Issue