diff -b -c -B -r linux/drivers/sound/ad1848.c linux-2.0.28.patched/drivers/sound/ad1848.c *** linux/drivers/sound/ad1848.c Wed Aug 21 00:18:09 1996 --- linux-2.0.28.patched/drivers/sound/ad1848.c Tue Jun 24 13:15:45 1997 *************** *** 75,80 **** --- 75,95 ---- ad1848_info; + char* admodelnum(int a) + { + switch (a) + { + case 1: return "MD_1848"; + case 2: return "MD_4231"; + case 3: return "MD_4231A"; + case 4: return "MD_1845"; + case 5: return "MD_4232"; + case 6: return "MD_C930"; + case 7: return "MD_IWAVE"; + default: return "unknown model number\n"; + }; + } + static int nr_ad1848_devs = 0; static volatile char irq2dev[17] = {-1, -1, -1, -1, -1, -1, -1, -1, *************** *** 318,323 **** --- 333,339 ---- case SOUND_MASK_LINE: case SOUND_MASK_LINE3: + case SOUND_MASK_VOLUME: recdev = 0; break; *************** *** 369,418 **** return devc->levels[dev]; } - static int - ad1848_mixer_set (ad1848_info * devc, int dev, int value) - { - int left = value & 0x000000ff; - int right = (value & 0x0000ff00) >> 8; - int retvol; ! int regoffs; ! unsigned char val; - if (left > 100) - left = 100; - if (right > 100) - right = 100; - if (mix_devices[dev][RIGHT_CHN].nbits == 0) /* Mono control */ - right = left; - retvol = left | (right << 8); ! /* Scale volumes */ ! left = mix_cvt[left]; ! right = mix_cvt[right]; - /* Scale it again */ - left = mix_cvt[left]; - right = mix_cvt[right]; ! if (dev > 31) ! return -(EINVAL); ! if (!(devc->supported_devices & (1 << dev))) ! return -(EINVAL); ! if (mix_devices[dev][LEFT_CHN].nbits == 0) ! return -(EINVAL); ! devc->levels[dev] = retvol; ! /* ! * Set the left channel */ regoffs = mix_devices[dev][LEFT_CHN].regno; val = ad_read (devc, regoffs); change_bits (&val, dev, LEFT_CHN, left); ad_write (devc, regoffs, val); --- 385,450 ---- return devc->levels[dev]; } ! /* routines defined by sscape.c */ ! void ss_set_synth_vol(int vol); ! void ss_set_wave_vol(int vol); ! #define LEVEL_TABLE_SIZE 101 ! unsigned char Output_atten_table[LEVEL_TABLE_SIZE] = {63, ! 63, 57, 52, 48, 45, 43, 41, 40, 39, 38, ! 37, 36, 35, 34, 33, 32, 31, 30, 29, 28, ! 27, 26, 25, 24, 23, 22, 21, 21, 20, 20, ! 19, 19, 18, 18, 17, 17, 17, 16, 16, 15, ! 15, 14, 14, 13, 13, 12, 12, 11, 11, 10, ! 10, 9, 9, 8, 8, 7, 7, 7, 6, 6, ! 6, 5, 5, 5, 5, 4, 4, 4, 4, 4, ! 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, ! 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, ! 1, 0, 0, 0, 0, 0, 0, 0, 0, 0}; ! static void set_device(ad1848_info *devc, int dev) ! { ! int regoffs; ! unsigned char val; ! /* get the master volume settings */ ! int master_vol_left = devc->levels[SOUND_MIXER_VOLUME]&0xff; ! int master_vol_right = devc->levels[SOUND_MIXER_VOLUME]>>8; ! ! /* get the volume settings for this device */ ! int left = devc->levels[dev]&0xff; ! int right = devc->levels[dev]>>8; ! /* Scale volumes */ ! left = mix_cvt[left]; ! right = mix_cvt[right]; ! /* soundscape midi and synth settings */ ! if(dev==SOUND_MIXER_LINE2) ! { ! left = left * 127 * master_vol_left / 10000; ! ss_set_synth_vol(left); ! return; ! } ! /* if(dev==SOUND_MIXER_LINE3) ! { ! left = left * 127 * master_vol_left / 10000; ! ss_set_wave_vol(left); ! return; ! } */ + left = left * master_vol_left / 100; + right = right * master_vol_right / 100; + regoffs = mix_devices[dev][LEFT_CHN].regno; + val = ad_read (devc, regoffs); change_bits (&val, dev, LEFT_CHN, left); ad_write (devc, regoffs, val); *************** *** 423,444 **** */ if (mix_devices[dev][RIGHT_CHN].nbits == 0) ! return retvol; /* Was just a mono channel */ regoffs = mix_devices[dev][RIGHT_CHN].regno; val = ad_read (devc, regoffs); change_bits (&val, dev, RIGHT_CHN, right); ad_write (devc, regoffs, val); devc->saved_regs[regoffs] = val; return retvol; } ! static void ! ad1848_mixer_reset (ad1848_info * devc) { int i; ! switch (devc->model) { case MD_4231: --- 455,524 ---- */ if (mix_devices[dev][RIGHT_CHN].nbits == 0) ! return; /* Was just a mono channel */ regoffs = mix_devices[dev][RIGHT_CHN].regno; val = ad_read (devc, regoffs); change_bits (&val, dev, RIGHT_CHN, right); ad_write (devc, regoffs, val); devc->saved_regs[regoffs] = val; + } + + static int ad1848_mixer_set (ad1848_info * devc, int dev, int value) + { + int left = value & 0x000000ff; + int right = (value & 0x0000ff00) >> 8; + int retvol; + + /* make sure device is valid */ + if (dev > 31) + return -(EINVAL); + + if (!(devc->supported_devices & (1 << dev))) + return -(EINVAL); + + if (mix_devices[dev][LEFT_CHN].nbits == 0) + return -(EINVAL); + + /* clip value to 0-100 range */ + if (left > 100) left = 100; + if (left < 0) left = 0; + if (right > 100) right = 100; + if (right < 0) right = 0; + + if (mix_devices[dev][RIGHT_CHN].nbits == 0) /* mono channel */ + right=left; + + /* calculate the return value */ + retvol = left | (right << 8); + + /* Save it for when we actually set the register. */ + devc->levels[dev] = retvol; + + /* master volume control is performed by attenuating all the output + controls (LINE1 LINE2 LINE3 and the DAC output) */ + if(dev==SOUND_MIXER_VOLUME) + { + if (devc->supported_devices & (1 << SOUND_MIXER_LINE1)) + set_device(devc, SOUND_MIXER_LINE1); + if (devc->supported_devices & (1 << SOUND_MIXER_LINE2)) + set_device(devc, SOUND_MIXER_LINE2); + if (devc->supported_devices & (1 << SOUND_MIXER_LINE3)) + set_device(devc, SOUND_MIXER_LINE3); + if (devc->supported_devices & (1 << SOUND_MIXER_PCM)) + set_device(devc, SOUND_MIXER_PCM); + return retvol; + } + + set_device(devc,dev); return retvol; } ! static void ad1848_mixer_reset (ad1848_info * devc) { int i; ! printk("AD1848 model: %s\n",admodelnum(devc->model)); switch (devc->model) { case MD_4231: *************** *** 454,464 **** break; default: ! devc->supported_devices = MODE1_MIXER_DEVICES; } devc->supported_rec_devices = MODE1_REC_DEVICES; for (i = 0; i < SOUND_MIXER_NRDEVICES; i++) if (devc->supported_devices & (1 << i)) ad1848_mixer_set (devc, i, default_mixer_levels[i]); --- 534,547 ---- break; default: ! devc->supported_devices = SSCAPE_MIXER_DEVICES; ! /* devc->supported_devices = MODE1_MIXER_DEVICES; */ } devc->supported_rec_devices = MODE1_REC_DEVICES; + /*set master volume again so all other vols get set correctly */ + for (i = 0; i < SOUND_MIXER_NRDEVICES; i++) if (devc->supported_devices & (1 << i)) ad1848_mixer_set (devc, i, default_mixer_levels[i]); *************** *** 498,504 **** break; case SOUND_MIXER_STEREODEVS: ! return snd_ioctl_return ((int *) arg, devc->supported_devices & ~(SOUND_MASK_SPEAKER | SOUND_MASK_IMIX)); break; case SOUND_MIXER_RECMASK: --- 582,592 ---- break; case SOUND_MIXER_STEREODEVS: ! #ifdef CONFIG_SSCAPE ! return snd_ioctl_return ((int *) arg, devc->supported_devices & ~(SOUND_MASK_SPEAKER | SOUND_MASK_IMIX | SOUND_MASK_LINE2 | SOUND_MASK_LINE3 )); ! #else ! return snd_ioctl_return ((int *) arg, devc->supported_devices & ~(SOUND_MASK_SPEAKER | SOUND_MASK_IMIX )); ! #endif break; case SOUND_MIXER_RECMASK: diff -b -c -B -r linux/drivers/sound/ad1848_mixer.h linux-2.0.28.patched/drivers/sound/ad1848_mixer.h *** linux/drivers/sound/ad1848_mixer.h Sun Jun 30 02:43:36 1996 --- linux-2.0.28.patched/drivers/sound/ad1848_mixer.h Mon Jun 2 19:45:04 1997 *************** *** 24,30 **** * solution). */ #define MODE1_REC_DEVICES (SOUND_MASK_LINE3 | SOUND_MASK_MIC | \ ! SOUND_MASK_LINE1|SOUND_MASK_IMIX) #define MODE1_MIXER_DEVICES (SOUND_MASK_LINE1 | SOUND_MASK_MIC | \ SOUND_MASK_LINE2 | \ --- 24,47 ---- * solution). */ #define MODE1_REC_DEVICES (SOUND_MASK_LINE3 | SOUND_MASK_MIC | \ ! SOUND_MASK_LINE1 | SOUND_MASK_VOLUME ) ! /* AD1848 setup on soundscape: ! LINE = Synthesizer + OUTPUT from AD1848 = LINE2 ! AUX1 = CD Rom input = LINE1 ! AUX2 = not connected. ! A/D converter output = PCM ! MIC = Microphone/line in = MIC ! GAIN = input gain control = IGAIN */ ! ! ! ! #define SSCAPE_MIXER_DEVICES (SOUND_MASK_PCM | \ ! SOUND_MASK_MIC | \ ! SOUND_MASK_LINE1 | \ ! SOUND_MASK_IGAIN | \ ! SOUND_MASK_LINE2 | \ ! SOUND_MASK_VOLUME ) ! #define MODE1_MIXER_DEVICES (SOUND_MASK_LINE1 | SOUND_MASK_MIC | \ SOUND_MASK_LINE2 | \ *************** *** 39,45 **** #define MODE3_MIXER_DEVICES (MODE2_MIXER_DEVICES | SOUND_MASK_VOLUME) struct mixer_def { ! unsigned int regno: 7; unsigned int polarity:1; /* 0=normal, 1=reversed */ unsigned int bitpos:4; unsigned int nbits:4; --- 56,62 ---- #define MODE3_MIXER_DEVICES (MODE2_MIXER_DEVICES | SOUND_MASK_VOLUME) struct mixer_def { ! unsigned int regno:7; unsigned int polarity:1; /* 0=normal, 1=reversed */ unsigned int bitpos:4; unsigned int nbits:4; *************** *** 69,75 **** {{reg_l, pola_l, pos_l, len_l}, {reg_r, pola_r, pos_r, len_r}} mixer_ent mix_devices[32][2] = { ! MIX_ENT(SOUND_MIXER_VOLUME, 27, 1, 0, 4, 29, 1, 0, 4), MIX_ENT(SOUND_MIXER_BASS, 0, 0, 0, 0, 0, 0, 0, 0), MIX_ENT(SOUND_MIXER_TREBLE, 0, 0, 0, 0, 0, 0, 0, 0), MIX_ENT(SOUND_MIXER_SYNTH, 4, 1, 0, 5, 5, 1, 0, 5), --- 86,92 ---- {{reg_l, pola_l, pos_l, len_l}, {reg_r, pola_r, pos_r, len_r}} mixer_ent mix_devices[32][2] = { ! MIX_ENT(SOUND_MIXER_VOLUME, 4, 0, 0, 6, 5, 0, 0, 6), MIX_ENT(SOUND_MIXER_BASS, 0, 0, 0, 0, 0, 0, 0, 0), MIX_ENT(SOUND_MIXER_TREBLE, 0, 0, 0, 0, 0, 0, 0, 0), MIX_ENT(SOUND_MIXER_SYNTH, 4, 1, 0, 5, 5, 1, 0, 5), *************** *** 85,91 **** MIX_ENT(SOUND_MIXER_OGAIN, 0, 0, 0, 0, 0, 0, 0, 0), MIX_ENT(SOUND_MIXER_LINE1, 2, 1, 0, 5, 3, 1, 0, 5), MIX_ENT(SOUND_MIXER_LINE2, 4, 1, 0, 5, 5, 1, 0, 5), ! MIX_ENT(SOUND_MIXER_LINE3, 18, 1, 0, 5, 19, 1, 0, 5) }; static unsigned short default_mixer_levels[SOUND_MIXER_NRDEVICES] = --- 102,108 ---- MIX_ENT(SOUND_MIXER_OGAIN, 0, 0, 0, 0, 0, 0, 0, 0), MIX_ENT(SOUND_MIXER_LINE1, 2, 1, 0, 5, 3, 1, 0, 5), MIX_ENT(SOUND_MIXER_LINE2, 4, 1, 0, 5, 5, 1, 0, 5), ! MIX_ENT(SOUND_MIXER_LINE3, 18, 1, 0, 6, 0, 0, 0, 0) }; static unsigned short default_mixer_levels[SOUND_MIXER_NRDEVICES] = diff -b -c -B -r linux/drivers/sound/local.h linux-2.0.28.patched/drivers/sound/local.h *** linux/drivers/sound/local.h Mon Jan 20 14:22:27 1997 --- linux-2.0.28.patched/drivers/sound/local.h Mon Jun 16 21:10:15 1997 *************** *** 40,45 **** # define CONFIG_SEQUENCER #endif ! #define SOUND_CONFIG_DATE "Mon Jan 20 14:22:27 MST 1997" #define SOUND_CONFIG_BY "root" ! #define SOUND_UNAME_A "Linux cervesa 2.0.28 #10 Mon Jan 20 13:05:42 MST 1997 i486" --- 40,45 ---- # define CONFIG_SEQUENCER #endif ! #define SOUND_CONFIG_DATE "Mon Jun 16 21:10:15 MDT 1997" #define SOUND_CONFIG_BY "root" ! #define SOUND_UNAME_A "Linux cervesa 2.0.28 #36 Mon Jun 16 19:47:08 MDT 1997 i486" diff -b -c -B -r linux/drivers/sound/midi_synth.c linux-2.0.28.patched/drivers/sound/midi_synth.c *** linux/drivers/sound/midi_synth.c Sat Jul 6 02:31:42 1996 --- linux-2.0.28.patched/drivers/sound/midi_synth.c Tue May 27 20:15:10 1997 *************** *** 451,456 **** --- 451,457 ---- save_flags (flags); cli (); + inc->m_busy = 0; inc->m_state = MST_INIT; inc->m_ptr = 0; diff -b -c -B -r linux/drivers/sound/sound_switch.c linux-2.0.28.patched/drivers/sound/sound_switch.c *** linux/drivers/sound/sound_switch.c Sun Jun 30 02:44:18 1996 --- linux-2.0.28.patched/drivers/sound/sound_switch.c Mon Apr 28 11:25:40 1997 *************** *** 87,92 **** --- 87,99 ---- status_ptr = 0; + #ifndef SOUND_CONFIG_DATE + #define SOUND_CONFIG_DATE "3/4/97" + #define SOUND_CONFIG_BY "root" + #define SOUND_CONFIG_HOST "cervesa" + #define SOUND_CONFIG_DOMAIN "home-net" + #endif + #ifdef SOUND_UNAME_A put_status ("Sound Driver:" SOUND_VERSION_STRING " (" SOUND_CONFIG_DATE " " SOUND_CONFIG_BY ",\n" diff -b -c -B -r linux/drivers/sound/sscape.c linux-2.0.28.patched/drivers/sound/sscape.c *** linux/drivers/sound/sscape.c Sun Jul 7 02:19:01 1996 --- linux-2.0.28.patched/drivers/sound/sscape.c Tue Jun 24 13:30:55 1997 *************** *** 25,36 **** #define MIDI_DATA 0 #define MIDI_CTRL 1 #define HOST_CTRL 2 - #define TX_READY 0x02 - #define RX_READY 0x01 #define HOST_DATA 3 #define ODIE_ADDR 4 #define ODIE_DATA 5 /* * Indirect registers */ --- 25,38 ---- #define MIDI_DATA 0 #define MIDI_CTRL 1 #define HOST_CTRL 2 #define HOST_DATA 3 #define ODIE_ADDR 4 #define ODIE_DATA 5 + #define TX_READY 0x02 + #define RX_READY 0x01 + + /* * Indirect registers */ *************** *** 55,74 **** /* * Host commands recognized by the OBP microcode ! */ #define CMD_GEN_HOST_ACK 0x80 #define CMD_GEN_MPU_ACK 0x81 #define CMD_GET_BOARD_TYPE 0x82 ! #define CMD_SET_CONTROL 0x88 ! #define CMD_GET_CONTROL 0x89 ! #define CTL_MASTER_VOL 0 ! #define CTL_MIC_MODE 2 ! #define CTL_SYNTH_VOL 4 ! #define CTL_WAVE_VOL 7 ! #define CMD_SET_MT32 0x96 ! #define CMD_GET_MT32 0x97 ! #define CMD_SET_EXTMIDI 0x9b ! #define CMD_GET_EXTMIDI 0x9c #define CMD_ACK 0x80 --- 57,80 ---- /* * Host commands recognized by the OBP microcode ! * command code defines */ #define CMD_GEN_HOST_ACK 0x80 #define CMD_GEN_MPU_ACK 0x81 #define CMD_GET_BOARD_TYPE 0x82 ! #define CMD_GET_STATUS 0x83 ! #define CMD_SET_SYNTHVOL 0x84 ! #define CMD_GET_SYNTHVOL 0x85 ! #define CMD_SET_WAVEVOL 0x86 ! #define CMD_GET_WAVEVOL 0x87 ! #define CMD_SET_MICMODE 0x88 ! #define CMD_GET_MICMODE 0x89 ! #define CMD_SET_EXTMIDI 0x8a ! #define CMD_GET_EXTMIDI 0x8b ! #define CMD_SET_MT32 0x8c ! #define CMD_GET_MT32 0x8d ! #define CMD_GET_FWVERS 0x8e ! #define CMD_DEBUG 0x8f ! #define CMD_ACK 0x80 *************** *** 135,154 **** restore_flags (flags); } ! static void ! host_open (struct sscape_info *devc) ! { ! outb (0x00, PORT (HOST_CTRL)); /* Put the board to the host mode */ ! } ! ! static void ! host_close (struct sscape_info *devc) ! { ! outb (0x03, PORT (HOST_CTRL)); /* Put the board to the MIDI mode */ ! } ! ! static int ! host_write (struct sscape_info *devc, unsigned char *data, int count) { unsigned long flags; int i, timeout_val; --- 144,150 ---- restore_flags (flags); } ! static int host_write (struct sscape_info *devc, unsigned char *data, int count) { unsigned long flags; int i, timeout_val; *************** *** 181,188 **** return 1; } ! static int ! host_read (struct sscape_info *devc) { unsigned long flags; int timeout_val; --- 177,183 ---- return 1; } ! static int host_read (struct sscape_info *devc) { unsigned long flags; int timeout_val; *************** *** 233,252 **** return host_write (devc, buf, 2); } ! static int ! host_command3 (struct sscape_info *devc, int cmd, int parm1, int parm2) { ! unsigned char buf[10]; - buf[0] = (unsigned char) (cmd & 0xff); - buf[1] = (unsigned char) (parm1 & 0xff); - buf[2] = (unsigned char) (parm2 & 0xff); ! return host_write (devc, buf, 3); } ! static void ! set_mt32 (struct sscape_info *devc, int value) { host_open (devc); host_command2 (devc, CMD_SET_MT32, --- 228,253 ---- return host_write (devc, buf, 2); } ! ! static void host_open (struct sscape_info *devc) { ! outb (0x00, PORT (HOST_CTRL)); /* Put the board to the host mode */ ! } ! static void host_close (struct sscape_info *devc) ! { ! host_command1(devc,CMD_GEN_HOST_ACK); ! host_read(devc); ! ! /*if(host_read(devc)!=CMD_ACK) ! printk("Invalid host close status\n"); */ ! ! outb (0x03, PORT (HOST_CTRL)); /* Put the board to the MIDI mode */ } ! ! static void set_mt32 (struct sscape_info *devc, int value) { host_open (devc); host_command2 (devc, CMD_SET_MT32, *************** *** 258,277 **** host_close (devc); } ! static void ! set_control (struct sscape_info *devc, int ctrl, int value) { host_open (devc); ! host_command3 (devc, CMD_SET_CONTROL, ctrl, value); ! if (host_read (devc) != CMD_ACK) { ! /* printk ("SNDSCAPE: Setting control (%d) failed\n", ctrl); */ } host_close (devc); } ! static int ! get_board_type (struct sscape_info *devc) { int tmp; --- 259,299 ---- host_close (devc); } ! static void set_control (struct sscape_info *devc, int ctrl, int value) { host_open (devc); ! ! host_command2 (devc, ctrl, value); ! ! /* if (host_read (devc) != CMD_ACK) { ! printk ("SNDSCAPE: Setting control (%d) to %d failed\n", ctrl, value); } + */ host_close (devc); } ! void ss_set_synth_vol(int vol) ! { ! set_control (devc, CMD_SET_SYNTHVOL, vol); ! } ! ! void ss_set_wave_vol(int vol) ! { ! set_control (devc, CMD_SET_WAVEVOL, vol); ! } ! ! static int get_control (struct sscape_info *devc, int ctrl) ! { ! int retval; ! host_open (devc); ! host_command1(devc,ctrl); ! retval = host_read (devc); ! host_close (devc); ! return retval; ! } ! ! static int get_board_type (struct sscape_info *devc) { int tmp; *************** *** 284,291 **** return tmp; } ! void ! sscapeintr (int irq, void *dev_id, struct pt_regs *dummy) { unsigned char bits, tmp; static int debug = 0; --- 306,312 ---- return tmp; } ! void sscapeintr (int irq, void *dev_id, struct pt_regs *dummy) { unsigned char bits, tmp; static int debug = 0; *************** *** 595,602 **** --- 618,627 ---- printk ("SoundScape board of type %d initialized OK\n", get_board_type (devc)); + /* set_control (devc, CTL_MASTER_VOL, 100); set_control (devc, CTL_SYNTH_VOL, 100); + */ #ifdef SSCAPE_DEBUG3 /* *************** *** 739,776 **** save_flags (flags); cli (); ! for (i = 1; i < 10; i++) ! switch (i) ! { ! case 1: /* Host interrupt enable */ ! sscape_write (devc, i, 0xf0); /* All interrupts enabled */ ! break; ! ! case 2: /* DMA A status/trigger register */ ! case 3: /* DMA B status/trigger register */ ! sscape_write (devc, i, 0x20); /* DMA channel disabled */ ! break; ! ! case 4: /* Host interrupt config reg */ ! sscape_write (devc, i, 0xf0 | (irq_bits << 2) | irq_bits); ! break; ! ! case 5: /* Don't destroy CD-ROM DMA config bits (0xc0) */ ! sscape_write (devc, i, (regs[i] & 0x3f) | ! (sscape_read (devc, i) & 0xc0)); ! break; ! ! case 6: /* CD-ROM config. Don't touch. */ ! break; ! ! case 9: /* Master control reg. Don't modify CR-ROM bits. Disable SB emul */ ! sscape_write (devc, i, ! (sscape_read (devc, i) & 0xf0) | 0x08); ! break; ! ! default: ! sscape_write (devc, i, regs[i]); ! } restore_flags (flags); --- 764,779 ---- save_flags (flags); cli (); ! sscape_write (devc, 1, 0xf0); /* All interrupts enabled */ ! sscape_write (devc, 2, 0x20); /* DMA channel A disabled */ ! sscape_write (devc, 3, 0x20); /* DMA channel B disabled */ ! sscape_write (devc, 4, 0xf0 | (irq_bits << 2) | irq_bits); ! sscape_write (devc, 5, (regs[5] & 0x3f) | ! (sscape_read (devc, 5) & 0xc0)); ! /* 6 is CD-ROM config. Don't touch. */ ! sscape_write (devc, 7, regs[7]); ! sscape_write (devc, 8, regs[8]); ! sscape_write (devc, 9, (sscape_read (devc, 9) & 0xf0) | 0x08); /* Master control reg. Don't modify CR-ROM bits. Disable SB emul */ restore_flags (flags); *************** *** 808,813 **** --- 811,818 ---- sscape_write (devc, GA_INTENA_REG, 0x80); /* Master IRQ enable */ devc->ok = 1; devc->failed = 0; + + printk("SoundScape attached\n"); } int Only in linux-2.0.28.patched/drivers/sound/: sscape.c~