aboutsummaryrefslogtreecommitdiffstats
path: root/sound/pci/via82xx_modem.c
diff options
context:
space:
mode:
Diffstat (limited to 'sound/pci/via82xx_modem.c')
-rw-r--r--sound/pci/via82xx_modem.c49
1 files changed, 20 insertions, 29 deletions
diff --git a/sound/pci/via82xx_modem.c b/sound/pci/via82xx_modem.c
index 7eac6f6ac737..011f0fb63bf9 100644
--- a/sound/pci/via82xx_modem.c
+++ b/sound/pci/via82xx_modem.c
@@ -26,7 +26,7 @@
26/* 26/*
27 * Changes: 27 * Changes:
28 * 28 *
29 * Sep. 2, 2004 Sasha Khapyorsky <sashak@smlink.com> 29 * Sep. 2, 2004 Sasha Khapyorsky <sashak@alsa-project.org>
30 * Modified from original audio driver 'via82xx.c' to support AC97 30 * Modified from original audio driver 'via82xx.c' to support AC97
31 * modems. 31 * modems.
32 */ 32 */
@@ -55,20 +55,21 @@ MODULE_DESCRIPTION("VIA VT82xx modem");
55MODULE_LICENSE("GPL"); 55MODULE_LICENSE("GPL");
56MODULE_SUPPORTED_DEVICE("{{VIA,VT82C686A/B/C modem,pci}}"); 56MODULE_SUPPORTED_DEVICE("{{VIA,VT82C686A/B/C modem,pci}}");
57 57
58static int index[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = -2}; /* Exclude the first card */ 58static int index = -2; /* Exclude the first card */
59static char *id[SNDRV_CARDS] = SNDRV_DEFAULT_STR; /* ID for this card */ 59static char *id = SNDRV_DEFAULT_STR1; /* ID for this card */
60static int enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_PNP; /* Enable this card */ 60static int ac97_clock = 48000;
61static int ac97_clock[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 48000};
62 61
63module_param_array(index, int, NULL, 0444); 62module_param(index, int, 0444);
64MODULE_PARM_DESC(index, "Index value for VIA 82xx bridge."); 63MODULE_PARM_DESC(index, "Index value for VIA 82xx bridge.");
65module_param_array(id, charp, NULL, 0444); 64module_param(id, charp, 0444);
66MODULE_PARM_DESC(id, "ID string for VIA 82xx bridge."); 65MODULE_PARM_DESC(id, "ID string for VIA 82xx bridge.");
67module_param_array(enable, bool, NULL, 0444); 66module_param(ac97_clock, int, 0444);
68MODULE_PARM_DESC(enable, "Enable modem part of VIA 82xx bridge.");
69module_param_array(ac97_clock, int, NULL, 0444);
70MODULE_PARM_DESC(ac97_clock, "AC'97 codec clock (default 48000Hz)."); 67MODULE_PARM_DESC(ac97_clock, "AC'97 codec clock (default 48000Hz).");
71 68
69/* just for backward compatibility */
70static int enable;
71module_param(enable, bool, 0444);
72
72 73
73/* 74/*
74 * Direct registers 75 * Direct registers
@@ -569,7 +570,7 @@ static inline unsigned int calc_linear_pos(viadev_t *viadev, unsigned int idx, u
569 res = viadev->lastpos; 570 res = viadev->lastpos;
570 } else if (check_invalid_pos(viadev, res)) { 571 } else if (check_invalid_pos(viadev, res)) {
571#ifdef POINTER_DEBUG 572#ifdef POINTER_DEBUG
572 printk("fail: idx = %i/%i, lastpos = 0x%x, bufsize2 = 0x%x, offsize = 0x%x, size = 0x%x, count = 0x%x\n", idx, viadev->tbl_entries, viadev->lastpos, viadev->bufsize2, viadev->idx_table[idx].offset, viadev->idx_table[idx].size, count); 573 printk(KERN_DEBUG "fail: idx = %i/%i, lastpos = 0x%x, bufsize2 = 0x%x, offsize = 0x%x, size = 0x%x, count = 0x%x\n", idx, viadev->tbl_entries, viadev->lastpos, viadev->bufsize2, viadev->idx_table[idx].offset, viadev->idx_table[idx].size, count);
573#endif 574#endif
574 if (count && size < count) { 575 if (count && size < count) {
575 snd_printd(KERN_ERR "invalid via82xx_cur_ptr, using last valid pointer\n"); 576 snd_printd(KERN_ERR "invalid via82xx_cur_ptr, using last valid pointer\n");
@@ -832,6 +833,7 @@ static int __devinit snd_via686_pcm_new(via82xx_t *chip)
832 return err; 833 return err;
833 snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, &snd_via686_playback_ops); 834 snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, &snd_via686_playback_ops);
834 snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, &snd_via686_capture_ops); 835 snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, &snd_via686_capture_ops);
836 pcm->dev_class = SNDRV_PCM_CLASS_MODEM;
835 pcm->private_data = chip; 837 pcm->private_data = chip;
836 strcpy(pcm->name, chip->card->shortname); 838 strcpy(pcm->name, chip->card->shortname);
837 chip->pcms[0] = pcm; 839 chip->pcms[0] = pcm;
@@ -878,7 +880,6 @@ static int __devinit snd_via82xx_mixer_new(via82xx_t *chip)
878 return err; 880 return err;
879 chip->ac97_bus->private_free = snd_via82xx_mixer_free_ac97_bus; 881 chip->ac97_bus->private_free = snd_via82xx_mixer_free_ac97_bus;
880 chip->ac97_bus->clock = chip->ac97_clock; 882 chip->ac97_bus->clock = chip->ac97_clock;
881 chip->ac97_bus->shared_type = AC97_SHARED_TYPE_VIA;
882 883
883 memset(&ac97, 0, sizeof(ac97)); 884 memset(&ac97, 0, sizeof(ac97));
884 ac97.private_data = chip; 885 ac97.private_data = chip;
@@ -967,12 +968,11 @@ static int snd_via82xx_chip_init(via82xx_t *chip)
967 pci_read_config_byte(chip->pci, VIA_ACLINK_STAT, &pval); 968 pci_read_config_byte(chip->pci, VIA_ACLINK_STAT, &pval);
968 if (pval & VIA_ACLINK_C00_READY) /* primary codec ready */ 969 if (pval & VIA_ACLINK_C00_READY) /* primary codec ready */
969 break; 970 break;
970 set_current_state(TASK_UNINTERRUPTIBLE); 971 schedule_timeout_uninterruptible(1);
971 schedule_timeout(1);
972 } while (time_before(jiffies, end_time)); 972 } while (time_before(jiffies, end_time));
973 973
974 if ((val = snd_via82xx_codec_xread(chip)) & VIA_REG_AC97_BUSY) 974 if ((val = snd_via82xx_codec_xread(chip)) & VIA_REG_AC97_BUSY)
975 snd_printk("AC'97 codec is not ready [0x%x]\n", val); 975 snd_printk(KERN_ERR "AC'97 codec is not ready [0x%x]\n", val);
976 976
977 snd_via82xx_codec_xwrite(chip, VIA_REG_AC97_READ | 977 snd_via82xx_codec_xwrite(chip, VIA_REG_AC97_READ |
978 VIA_REG_AC97_SECONDARY_VALID | 978 VIA_REG_AC97_SECONDARY_VALID |
@@ -986,8 +986,7 @@ static int snd_via82xx_chip_init(via82xx_t *chip)
986 chip->ac97_secondary = 1; 986 chip->ac97_secondary = 1;
987 goto __ac97_ok2; 987 goto __ac97_ok2;
988 } 988 }
989 set_current_state(TASK_INTERRUPTIBLE); 989 schedule_timeout_interruptible(1);
990 schedule_timeout(1);
991 } while (time_before(jiffies, end_time)); 990 } while (time_before(jiffies, end_time));
992 /* This is ok, the most of motherboards have only one codec */ 991 /* This is ok, the most of motherboards have only one codec */
993 992
@@ -1101,7 +1100,7 @@ static int __devinit snd_via82xx_create(snd_card_t * card,
1101 chip->port = pci_resource_start(pci, 0); 1100 chip->port = pci_resource_start(pci, 0);
1102 if (request_irq(pci->irq, snd_via82xx_interrupt, SA_INTERRUPT|SA_SHIRQ, 1101 if (request_irq(pci->irq, snd_via82xx_interrupt, SA_INTERRUPT|SA_SHIRQ,
1103 card->driver, (void *)chip)) { 1102 card->driver, (void *)chip)) {
1104 snd_printk("unable to grab IRQ %d\n", pci->irq); 1103 snd_printk(KERN_ERR "unable to grab IRQ %d\n", pci->irq);
1105 snd_via82xx_free(chip); 1104 snd_via82xx_free(chip);
1106 return -EBUSY; 1105 return -EBUSY;
1107 } 1106 }
@@ -1135,7 +1134,6 @@ static int __devinit snd_via82xx_create(snd_card_t * card,
1135static int __devinit snd_via82xx_probe(struct pci_dev *pci, 1134static int __devinit snd_via82xx_probe(struct pci_dev *pci,
1136 const struct pci_device_id *pci_id) 1135 const struct pci_device_id *pci_id)
1137{ 1136{
1138 static int dev;
1139 snd_card_t *card; 1137 snd_card_t *card;
1140 via82xx_t *chip; 1138 via82xx_t *chip;
1141 unsigned char revision; 1139 unsigned char revision;
@@ -1143,14 +1141,7 @@ static int __devinit snd_via82xx_probe(struct pci_dev *pci,
1143 unsigned int i; 1141 unsigned int i;
1144 int err; 1142 int err;
1145 1143
1146 if (dev >= SNDRV_CARDS) 1144 card = snd_card_new(index, id, THIS_MODULE, 0);
1147 return -ENODEV;
1148 if (!enable[dev]) {
1149 dev++;
1150 return -ENOENT;
1151 }
1152
1153 card = snd_card_new(index[dev], id[dev], THIS_MODULE, 0);
1154 if (card == NULL) 1145 if (card == NULL)
1155 return -ENOMEM; 1146 return -ENOMEM;
1156 1147
@@ -1167,7 +1158,8 @@ static int __devinit snd_via82xx_probe(struct pci_dev *pci,
1167 goto __error; 1158 goto __error;
1168 } 1159 }
1169 1160
1170 if ((err = snd_via82xx_create(card, pci, chip_type, revision, ac97_clock[dev], &chip)) < 0) 1161 if ((err = snd_via82xx_create(card, pci, chip_type, revision,
1162 ac97_clock, &chip)) < 0)
1171 goto __error; 1163 goto __error;
1172 if ((err = snd_via82xx_mixer_new(chip)) < 0) 1164 if ((err = snd_via82xx_mixer_new(chip)) < 0)
1173 goto __error; 1165 goto __error;
@@ -1191,7 +1183,6 @@ static int __devinit snd_via82xx_probe(struct pci_dev *pci,
1191 return err; 1183 return err;
1192 } 1184 }
1193 pci_set_drvdata(pci, card); 1185 pci_set_drvdata(pci, card);
1194 dev++;
1195 return 0; 1186 return 0;
1196 1187
1197 __error: 1188 __error: