[ALSA] hda-codec - Assign audio PCMS first
HDA Codec driver,HDA Intel driver,HDA generic driver Assign audio PCMs first before modem PCMs. The modem stream is assigned up to device #6, to be consistent over different models. Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
parent
821690cdc8
commit
ec9e1c5c9c
4 changed files with 30 additions and 3 deletions
sound/pci/hda
|
@ -505,6 +505,7 @@ struct hda_pcm_stream {
|
||||||
struct hda_pcm {
|
struct hda_pcm {
|
||||||
char *name;
|
char *name;
|
||||||
struct hda_pcm_stream stream[2];
|
struct hda_pcm_stream stream[2];
|
||||||
|
unsigned int is_modem; /* modem codec? */
|
||||||
};
|
};
|
||||||
|
|
||||||
/* codec information */
|
/* codec information */
|
||||||
|
|
|
@ -164,7 +164,9 @@ enum { SDI0, SDI1, SDI2, SDI3, SDO0, SDO1, SDO2, SDO3 };
|
||||||
/* max buffer size - no h/w limit, you can increase as you like */
|
/* max buffer size - no h/w limit, you can increase as you like */
|
||||||
#define AZX_MAX_BUF_SIZE (1024*1024*1024)
|
#define AZX_MAX_BUF_SIZE (1024*1024*1024)
|
||||||
/* max number of PCM devics per card */
|
/* max number of PCM devics per card */
|
||||||
#define AZX_MAX_PCMS 8
|
#define AZX_MAX_AUDIO_PCMS 6
|
||||||
|
#define AZX_MAX_MODEM_PCMS 2
|
||||||
|
#define AZX_MAX_PCMS (AZX_MAX_AUDIO_PCMS + AZX_MAX_MODEM_PCMS)
|
||||||
|
|
||||||
/* RIRB int mask: overrun[2], response[0] */
|
/* RIRB int mask: overrun[2], response[0] */
|
||||||
#define RIRB_INT_RESPONSE 0x01
|
#define RIRB_INT_RESPONSE 0x01
|
||||||
|
@ -1225,12 +1227,33 @@ static int __devinit azx_pcm_create(azx_t *chip)
|
||||||
if ((err = snd_hda_build_pcms(chip->bus)) < 0)
|
if ((err = snd_hda_build_pcms(chip->bus)) < 0)
|
||||||
return err;
|
return err;
|
||||||
|
|
||||||
|
/* create audio PCMs */
|
||||||
pcm_dev = 0;
|
pcm_dev = 0;
|
||||||
list_for_each(p, &chip->bus->codec_list) {
|
list_for_each(p, &chip->bus->codec_list) {
|
||||||
codec = list_entry(p, struct hda_codec, list);
|
codec = list_entry(p, struct hda_codec, list);
|
||||||
for (c = 0; c < codec->num_pcms; c++) {
|
for (c = 0; c < codec->num_pcms; c++) {
|
||||||
if (pcm_dev >= AZX_MAX_PCMS) {
|
if (codec->pcm_info[c].is_modem)
|
||||||
snd_printk(KERN_ERR SFX "Too many PCMs\n");
|
continue; /* create later */
|
||||||
|
if (pcm_dev >= AZX_MAX_AUDIO_PCMS) {
|
||||||
|
snd_printk(KERN_ERR SFX "Too many audio PCMs\n");
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
err = create_codec_pcm(chip, codec, &codec->pcm_info[c], pcm_dev);
|
||||||
|
if (err < 0)
|
||||||
|
return err;
|
||||||
|
pcm_dev++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* create modem PCMs */
|
||||||
|
pcm_dev = AZX_MAX_AUDIO_PCMS;
|
||||||
|
list_for_each(p, &chip->bus->codec_list) {
|
||||||
|
codec = list_entry(p, struct hda_codec, list);
|
||||||
|
for (c = 0; c < codec->num_pcms; c++) {
|
||||||
|
if (! codec->pcm_info[c].is_modem)
|
||||||
|
continue; /* already created */
|
||||||
|
if (pcm_dev >= AZX_MAX_MODEM_PCMS) {
|
||||||
|
snd_printk(KERN_ERR SFX "Too many modem PCMs\n");
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
err = create_codec_pcm(chip, codec, &codec->pcm_info[c], pcm_dev);
|
err = create_codec_pcm(chip, codec, &codec->pcm_info[c], pcm_dev);
|
||||||
|
|
|
@ -207,6 +207,8 @@ static void print_codec_info(snd_info_entry_t *entry, snd_info_buffer_t *buffer)
|
||||||
snd_iprintf(buffer, "Vendor Id: 0x%x\n", codec->vendor_id);
|
snd_iprintf(buffer, "Vendor Id: 0x%x\n", codec->vendor_id);
|
||||||
snd_iprintf(buffer, "Subsystem Id: 0x%x\n", codec->subsystem_id);
|
snd_iprintf(buffer, "Subsystem Id: 0x%x\n", codec->subsystem_id);
|
||||||
snd_iprintf(buffer, "Revision Id: 0x%x\n", codec->revision_id);
|
snd_iprintf(buffer, "Revision Id: 0x%x\n", codec->revision_id);
|
||||||
|
if (! codec->afg)
|
||||||
|
return;
|
||||||
snd_iprintf(buffer, "Default PCM: ");
|
snd_iprintf(buffer, "Default PCM: ");
|
||||||
print_pcm_caps(buffer, codec, codec->afg);
|
print_pcm_caps(buffer, codec, codec->afg);
|
||||||
snd_iprintf(buffer, "Default Amp-In caps: ");
|
snd_iprintf(buffer, "Default Amp-In caps: ");
|
||||||
|
|
|
@ -214,6 +214,7 @@ static int si3054_build_pcms(struct hda_codec *codec)
|
||||||
info->name = "Si3054 Modem";
|
info->name = "Si3054 Modem";
|
||||||
info->stream[SNDRV_PCM_STREAM_PLAYBACK] = si3054_pcm;
|
info->stream[SNDRV_PCM_STREAM_PLAYBACK] = si3054_pcm;
|
||||||
info->stream[SNDRV_PCM_STREAM_CAPTURE] = si3054_pcm;
|
info->stream[SNDRV_PCM_STREAM_CAPTURE] = si3054_pcm;
|
||||||
|
info->is_modem = 1;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue