I read up on timers, and fixed that problem too.  This is an updated
patch, and I'm happy to say that the tumbler now works perfectly :)

jack.
Index: keywest.c
===================================================================
RCS file: /cvsroot/alsa/alsa-driver/cards/ppc/keywest.c,v
retrieving revision 1.3
diff -u -r1.3 keywest.c
--- keywest.c   2001/09/03 10:39:06     1.3
+++ keywest.c   2001/12/07 01:13:30
@@ -79,7 +79,7 @@
        /* Clear all past interrupts */
        interrupt_state = keywest_readb(i2c, KW_ADDR_ISR) & 0x0f;
        if (interrupt_state > 0)
-               keywest_writeb(i2c, KW_ADDR_ISR, interrupt_state);
+               keywest_writeb_wait(i2c, KW_ADDR_ISR, interrupt_state);
 }
 
 static int keywest_start(pmac_keywest_t *i2c, unsigned char cmd, int is_read)
Index: pmac.c
===================================================================
RCS file: /cvsroot/alsa/alsa-driver/cards/ppc/pmac.c,v
retrieving revision 1.5
diff -u -r1.5 pmac.c
--- pmac.c      2001/10/11 10:27:54     1.5
+++ pmac.c      2001/12/07 01:13:32
@@ -790,7 +790,10 @@
        if (beep->running) {
                if (ticks <= 0)
                        ticks = 1;
+               del_timer(&beep->timer);
                beep->timer.expires = jiffies + ticks;
+               beep->timer.function = snd_pmac_beep_stop_callback;
+               beep->timer.data = (unsigned long)chip;
                add_timer(&beep->timer);
                snd_pmac_dma_stop(rec);
                st_le16(&chip->extra_dma.cmds->req_count, nsamples * 4);
@@ -875,10 +878,12 @@
                return -ENOMEM;
        }
        beep->addr = virt_to_bus(beep->buf);
+       init_timer(&beep->timer);
        beep->timer.function = snd_pmac_beep_stop_callback;
        beep->timer.data = (unsigned long) chip;
        beep->orig_mksound = kd_mksound;
        beep->volume = BEEP_VOLUME;
+       beep->running = 0;
        beep->control = snd_ctl_new1(&snd_pmac_beep_mixer, chip);
        if (beep->control == NULL) {
                kfree(beep);
Index: tumbler.c
===================================================================
RCS file: /cvsroot/alsa/alsa-driver/cards/ppc/tumbler.c,v
retrieving revision 1.4
diff -u -r1.4 tumbler.c
--- tumbler.c   2001/09/07 13:41:11     1.4
+++ tumbler.c   2001/12/07 01:13:33
@@ -326,7 +326,7 @@
        struct device_node *node;
        void *base;
 
-       node = find_audio_device("audio-hw-reset");
+       node = find_audio_device(device);
        if (! node) {
                snd_printd("cannot find device %s\n", device);
                return 0;
@@ -349,12 +349,13 @@
 
        if (! (base = tumbler_find_device("audio-hw-reset")))
                return -ENODEV;
+
        map = ioremap(base, 1);
-       writeb(5, base);
+       writeb(5, map);
        mdelay(100);
-       writeb(4, base);
+       writeb(4, map);
        mdelay(1);
-       writeb(5, base);
+       writeb(5, map);
        mdelay(1);
        iounmap(map);
        return 0;
@@ -447,6 +448,8 @@
        chip->mixer_data = mix;
        chip->mixer_free = tumbler_cleanup;
 
+       tumbler_init(chip);
+
        if ((err = snd_pmac_keywest_find(chip, &mix->i2c, TAS_I2C_ADDR, 
tumbler_init_client)) < 0)
                return err;
 
@@ -460,7 +463,6 @@
                        return err;
        }
 
-       tumbler_init(chip);
 #ifdef CONFIG_PMAC_PBOOK
        chip->resume = tumbler_resume;
 #endif

Reply via email to