aboutsummaryrefslogtreecommitdiffstats
path: root/sound/isa/sscape.c
diff options
context:
space:
mode:
Diffstat (limited to 'sound/isa/sscape.c')
-rw-r--r--sound/isa/sscape.c44
1 files changed, 16 insertions, 28 deletions
diff --git a/sound/isa/sscape.c b/sound/isa/sscape.c
index 681e2237acb7..33c1258029f9 100644
--- a/sound/isa/sscape.c
+++ b/sound/isa/sscape.c
@@ -135,8 +135,6 @@ enum card_type {
135struct soundscape { 135struct soundscape {
136 spinlock_t lock; 136 spinlock_t lock;
137 unsigned io_base; 137 unsigned io_base;
138 unsigned wss_base;
139 int codec_type;
140 int ic_type; 138 int ic_type;
141 enum card_type type; 139 enum card_type type;
142 struct resource *io_res; 140 struct resource *io_res;
@@ -726,13 +724,7 @@ static int sscape_midi_get(struct snd_kcontrol *kctl,
726 unsigned long flags; 724 unsigned long flags;
727 725
728 spin_lock_irqsave(&s->lock, flags); 726 spin_lock_irqsave(&s->lock, flags);
729 set_host_mode_unsafe(s->io_base); 727 uctl->value.integer.value[0] = s->midi_vol;
730
731 if (host_write_ctrl_unsafe(s->io_base, CMD_GET_MIDI_VOL, 100)) {
732 uctl->value.integer.value[0] = host_read_ctrl_unsafe(s->io_base, 100);
733 }
734
735 set_midi_mode_unsafe(s->io_base);
736 spin_unlock_irqrestore(&s->lock, flags); 728 spin_unlock_irqrestore(&s->lock, flags);
737 return 0; 729 return 0;
738} 730}
@@ -767,6 +759,7 @@ static int sscape_midi_put(struct snd_kcontrol *kctl,
767 change = (host_write_ctrl_unsafe(s->io_base, CMD_SET_MIDI_VOL, 100) 759 change = (host_write_ctrl_unsafe(s->io_base, CMD_SET_MIDI_VOL, 100)
768 && host_write_ctrl_unsafe(s->io_base, ((unsigned char) uctl->value.integer. value[0]) & 127, 100) 760 && host_write_ctrl_unsafe(s->io_base, ((unsigned char) uctl->value.integer. value[0]) & 127, 100)
769 && host_write_ctrl_unsafe(s->io_base, CMD_XXX_MIDI_VOL, 100)); 761 && host_write_ctrl_unsafe(s->io_base, CMD_XXX_MIDI_VOL, 100));
762 s->midi_vol = (unsigned char) uctl->value.integer.value[0] & 127;
770 __skip_change: 763 __skip_change:
771 764
772 /* 765 /*
@@ -809,12 +802,11 @@ static unsigned __devinit get_irq_config(int irq)
809 * Perform certain arcane port-checks to see whether there 802 * Perform certain arcane port-checks to see whether there
810 * is a SoundScape board lurking behind the given ports. 803 * is a SoundScape board lurking behind the given ports.
811 */ 804 */
812static int __devinit detect_sscape(struct soundscape *s) 805static int __devinit detect_sscape(struct soundscape *s, long wss_io)
813{ 806{
814 unsigned long flags; 807 unsigned long flags;
815 unsigned d; 808 unsigned d;
816 int retval = 0; 809 int retval = 0;
817 int codec = s->wss_base;
818 810
819 spin_lock_irqsave(&s->lock, flags); 811 spin_lock_irqsave(&s->lock, flags);
820 812
@@ -830,13 +822,11 @@ static int __devinit detect_sscape(struct soundscape *s)
830 if ((d & 0x80) != 0) 822 if ((d & 0x80) != 0)
831 goto _done; 823 goto _done;
832 824
833 if (d == 0) { 825 if (d == 0)
834 s->codec_type = 1;
835 s->ic_type = IC_ODIE; 826 s->ic_type = IC_ODIE;
836 } else if ((d & 0x60) != 0) { 827 else if ((d & 0x60) != 0)
837 s->codec_type = 2;
838 s->ic_type = IC_OPUS; 828 s->ic_type = IC_OPUS;
839 } else 829 else
840 goto _done; 830 goto _done;
841 831
842 outb(0xfa, ODIE_ADDR_IO(s->io_base)); 832 outb(0xfa, ODIE_ADDR_IO(s->io_base));
@@ -856,10 +846,10 @@ static int __devinit detect_sscape(struct soundscape *s)
856 sscape_write_unsafe(s->io_base, GA_HMCTL_REG, d | 0xc0); 846 sscape_write_unsafe(s->io_base, GA_HMCTL_REG, d | 0xc0);
857 847
858 if (s->type == SSCAPE_VIVO) 848 if (s->type == SSCAPE_VIVO)
859 codec += 4; 849 wss_io += 4;
860 /* wait for WSS codec */ 850 /* wait for WSS codec */
861 for (d = 0; d < 500; d++) { 851 for (d = 0; d < 500; d++) {
862 if ((inb(codec) & 0x80) == 0) 852 if ((inb(wss_io) & 0x80) == 0)
863 break; 853 break;
864 spin_unlock_irqrestore(&s->lock, flags); 854 spin_unlock_irqrestore(&s->lock, flags);
865 msleep(1); 855 msleep(1);
@@ -1057,7 +1047,6 @@ static int __devinit create_sscape(int dev, struct snd_card *card)
1057 unsigned dma_cfg; 1047 unsigned dma_cfg;
1058 unsigned irq_cfg; 1048 unsigned irq_cfg;
1059 unsigned mpu_irq_cfg; 1049 unsigned mpu_irq_cfg;
1060 unsigned xport;
1061 struct resource *io_res; 1050 struct resource *io_res;
1062 struct resource *wss_res; 1051 struct resource *wss_res;
1063 unsigned long flags; 1052 unsigned long flags;
@@ -1077,15 +1066,15 @@ static int __devinit create_sscape(int dev, struct snd_card *card)
1077 printk(KERN_ERR "sscape: Invalid IRQ %d\n", mpu_irq[dev]); 1066 printk(KERN_ERR "sscape: Invalid IRQ %d\n", mpu_irq[dev]);
1078 return -ENXIO; 1067 return -ENXIO;
1079 } 1068 }
1080 xport = port[dev];
1081 1069
1082 /* 1070 /*
1083 * Grab IO ports that we will need to probe so that we 1071 * Grab IO ports that we will need to probe so that we
1084 * can detect and control this hardware ... 1072 * can detect and control this hardware ...
1085 */ 1073 */
1086 io_res = request_region(xport, 8, "SoundScape"); 1074 io_res = request_region(port[dev], 8, "SoundScape");
1087 if (!io_res) { 1075 if (!io_res) {
1088 snd_printk(KERN_ERR "sscape: can't grab port 0x%x\n", xport); 1076 snd_printk(KERN_ERR
1077 "sscape: can't grab port 0x%lx\n", port[dev]);
1089 return -EBUSY; 1078 return -EBUSY;
1090 } 1079 }
1091 wss_res = NULL; 1080 wss_res = NULL;
@@ -1112,10 +1101,9 @@ static int __devinit create_sscape(int dev, struct snd_card *card)
1112 spin_lock_init(&sscape->fwlock); 1101 spin_lock_init(&sscape->fwlock);
1113 sscape->io_res = io_res; 1102 sscape->io_res = io_res;
1114 sscape->wss_res = wss_res; 1103 sscape->wss_res = wss_res;
1115 sscape->io_base = xport; 1104 sscape->io_base = port[dev];
1116 sscape->wss_base = wss_port[dev];
1117 1105
1118 if (!detect_sscape(sscape)) { 1106 if (!detect_sscape(sscape, wss_port[dev])) {
1119 printk(KERN_ERR "sscape: hardware not detected at 0x%x\n", sscape->io_base); 1107 printk(KERN_ERR "sscape: hardware not detected at 0x%x\n", sscape->io_base);
1120 err = -ENODEV; 1108 err = -ENODEV;
1121 goto _release_dma; 1109 goto _release_dma;
@@ -1188,11 +1176,11 @@ static int __devinit create_sscape(int dev, struct snd_card *card)
1188 } 1176 }
1189#define MIDI_DEVNUM 0 1177#define MIDI_DEVNUM 0
1190 if (sscape->type != SSCAPE_VIVO) { 1178 if (sscape->type != SSCAPE_VIVO) {
1191 err = create_mpu401(card, MIDI_DEVNUM, xport, mpu_irq[dev]); 1179 err = create_mpu401(card, MIDI_DEVNUM, port[dev], mpu_irq[dev]);
1192 if (err < 0) { 1180 if (err < 0) {
1193 printk(KERN_ERR "sscape: Failed to create " 1181 printk(KERN_ERR "sscape: Failed to create "
1194 "MPU-401 device at 0x%x\n", 1182 "MPU-401 device at 0x%lx\n",
1195 xport); 1183 port[dev]);
1196 goto _release_dma; 1184 goto _release_dma;
1197 } 1185 }
1198 1186