Update of /cvsroot/alsa/alsa-kernel/ppc
In directory sc8-pr-cvs1:/tmp/cvs-serv882
Modified Files:
pmac.c tumbler.c
Log Message:
- fixed the hang-up at the resume on tumbler/snapper.
Index: pmac.c
===================================================================
RCS file: /cvsroot/alsa/alsa-kernel/ppc/pmac.c,v
retrieving revision 1.21
retrieving revision 1.22
diff -u -r1.21 -r1.22
--- pmac.c 31 May 2003 11:44:56 -0000 1.21
+++ pmac.c 5 Jun 2003 11:10:52 -0000 1.22
@@ -1211,9 +1211,12 @@
spin_lock_irqsave(&chip->reg_lock, flags);
snd_pmac_beep_stop(chip);
spin_unlock_irqrestore(&chip->reg_lock, flags);
- disable_irq(chip->irq);
- disable_irq(chip->tx_irq);
- disable_irq(chip->rx_irq);
+ if (chip->irq >= 0)
+ disable_irq(chip->irq);
+ if (chip->tx_irq >= 0)
+ disable_irq(chip->tx_irq);
+ if (chip->rx_irq >= 0)
+ disable_irq(chip->rx_irq);
snd_pmac_sound_feature(chip, 0);
snd_power_change_state(card, SNDRV_CTL_POWER_D3hot);
}
@@ -1237,9 +1240,12 @@
snd_pmac_pcm_set_format(chip);
- enable_irq(chip->irq);
- enable_irq(chip->tx_irq);
- enable_irq(chip->rx_irq);
+ if (chip->irq >= 0)
+ enable_irq(chip->irq);
+ if (chip->tx_irq >= 0)
+ enable_irq(chip->tx_irq);
+ if (chip->rx_irq >= 0)
+ enable_irq(chip->rx_irq);
snd_power_change_state(card, SNDRV_CTL_POWER_D0);
}
Index: tumbler.c
===================================================================
RCS file: /cvsroot/alsa/alsa-kernel/ppc/tumbler.c,v
retrieving revision 1.20
retrieving revision 1.21
diff -u -r1.20 -r1.21
--- tumbler.c 14 May 2003 13:30:12 -0000 1.20
+++ tumbler.c 5 Jun 2003 11:10:53 -0000 1.21
@@ -27,6 +27,7 @@
#include <linux/kmod.h>
#include <linux/slab.h>
#include <linux/interrupt.h>
+#include <linux/workqueue.h>
#include <sound/core.h>
#include <asm/io.h>
#include <asm/irq.h>
@@ -79,7 +80,7 @@
int active_state;
} pmac_gpio_t;
-typedef struct pmac_tumber_t {
+typedef struct pmac_tumbler_t {
pmac_keywest_t i2c;
pmac_gpio_t audio_reset;
pmac_gpio_t amp_mute;
@@ -92,11 +93,12 @@
unsigned int mix_vol[VOL_IDX_LAST_MIX][2]; /* stereo volumes for tas3004 */
int drc_range;
int drc_enable;
+#ifdef CONFIG_PMAC_PBOOK
+ struct work_struct resume_workq;
+#endif
} pmac_tumbler_t;
-#define number_of(ary) (sizeof(ary) / sizeof(ary[0]))
-
/*
*/
@@ -168,16 +170,16 @@
left_vol = 0;
else {
left_vol = mix->master_vol[0];
- if (left_vol >= number_of(master_volume_table))
- left_vol = number_of(master_volume_table) - 1;
+ if (left_vol >= ARRAY_SIZE(master_volume_table))
+ left_vol = ARRAY_SIZE(master_volume_table) - 1;
left_vol = master_volume_table[left_vol];
}
if (! mix->master_switch[1])
right_vol = 0;
else {
right_vol = mix->master_vol[1];
- if (right_vol >= number_of(master_volume_table))
- right_vol = number_of(master_volume_table) - 1;
+ if (right_vol >= ARRAY_SIZE(master_volume_table))
+ right_vol = ARRAY_SIZE(master_volume_table) - 1;
right_vol = master_volume_table[right_vol];
}
@@ -203,7 +205,7 @@
uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
uinfo->count = 2;
uinfo->value.integer.min = 0;
- uinfo->value.integer.max = number_of(master_volume_table) - 1;
+ uinfo->value.integer.max = ARRAY_SIZE(master_volume_table) - 1;
return 0;
}
@@ -479,7 +481,7 @@
.index = VOL_IDX_PCM_MONO,
.reg = TAS_REG_PCM,
.bytes = 3,
- .max = number_of(mixer_volume_table),
+ .max = ARRAY_SIZE(mixer_volume_table),
.table = mixer_volume_table,
};
@@ -487,7 +489,7 @@
.index = VOL_IDX_BASS,
.reg = TAS_REG_BASS,
.bytes = 1,
- .max = number_of(bass_volume_table),
+ .max = ARRAY_SIZE(bass_volume_table),
.table = bass_volume_table,
};
@@ -495,7 +497,7 @@
.index = VOL_IDX_TREBLE,
.reg = TAS_REG_TREBLE,
.bytes = 1,
- .max = number_of(treble_volume_table),
+ .max = ARRAY_SIZE(treble_volume_table),
.table = treble_volume_table,
};
@@ -504,7 +506,7 @@
.index = VOL_IDX_BASS,
.reg = TAS_REG_BASS,
.bytes = 1,
- .max = number_of(snapper_bass_volume_table),
+ .max = ARRAY_SIZE(snapper_bass_volume_table),
.table = snapper_bass_volume_table,
};
@@ -512,7 +514,7 @@
.index = VOL_IDX_TREBLE,
.reg = TAS_REG_TREBLE,
.bytes = 1,
- .max = number_of(snapper_treble_volume_table),
+ .max = ARRAY_SIZE(snapper_treble_volume_table),
.table = snapper_treble_volume_table,
};
@@ -546,8 +548,8 @@
unsigned char block[9];
vol = mix->mix_vol[idx][ch];
- if (vol >= number_of(mixer_volume_table)) {
- vol = number_of(mixer_volume_table) - 1;
+ if (vol >= ARRAY_SIZE(mixer_volume_table)) {
+ vol = ARRAY_SIZE(mixer_volume_table) - 1;
mix->mix_vol[idx][ch] = vol;
}
@@ -579,7 +581,7 @@
uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
uinfo->count = 2;
uinfo->value.integer.min = 0;
- uinfo->value.integer.max = number_of(mixer_volume_table) - 1;
+ uinfo->value.integer.max = ARRAY_SIZE(mixer_volume_table) - 1;
return 0;
}
@@ -877,29 +879,47 @@
#ifdef CONFIG_PMAC_PBOOK
/* resume mixer */
-static void tumbler_resume(pmac_t *chip)
+/* we call the i2c transfer in a workqueue because it may need either schedule()
+ * or completion from timer interrupts.
+ */
+static void tumbler_resume_work(void *arg)
{
+ pmac_t *chip = (pmac_t *)arg;
pmac_tumbler_t *mix = chip->mixer_data;
- snd_assert(mix, return);
+
tumbler_reset_audio(chip);
- if (mix->i2c.client)
- tumbler_init_client(&mix->i2c);
+ if (mix->i2c.client) {
+ if (tumbler_init_client(&mix->i2c) < 0)
+ printk(KERN_ERR "tumbler_init_client error\n");
+ } else
+ printk(KERN_ERR "tumbler: i2c is not initialized\n");
if (chip->model == PMAC_TUMBLER) {
tumbler_set_mono_volume(mix, &tumbler_pcm_vol_info);
tumbler_set_mono_volume(mix, &tumbler_bass_vol_info);
tumbler_set_mono_volume(mix, &tumbler_treble_vol_info);
+ tumbler_set_drc(mix);
} else {
snapper_set_mix_vol(mix, VOL_IDX_PCM);
snapper_set_mix_vol(mix, VOL_IDX_PCM2);
snapper_set_mix_vol(mix, VOL_IDX_ADC);
tumbler_set_mono_volume(mix, &tumbler_bass_vol_info);
tumbler_set_mono_volume(mix, &tumbler_treble_vol_info);
+ snapper_set_drc(mix);
}
- tumbler_set_drc(mix);
tumbler_set_master_volume(mix);
if (chip->update_automute)
chip->update_automute(chip, 0);
}
+
+static void tumbler_resume(pmac_t *chip)
+{
+ pmac_tumbler_t *mix = chip->mixer_data;
+ snd_assert(mix, return);
+ INIT_WORK(&mix->resume_workq, tumbler_resume_work, chip);
+ if (schedule_work(&mix->resume_workq))
+ return;
+ printk(KERN_ERR "ALSA tumbler: cannot schedule resume-workqueue.\n");
+}
#endif
/* initialize tumbler */
@@ -1001,12 +1021,12 @@
sprintf(chip->card->mixername, "PowerMac %s", chipname);
if (chip->model == PMAC_TUMBLER) {
- for (i = 0; i < number_of(tumbler_mixers); i++) {
+ for (i = 0; i < ARRAY_SIZE(tumbler_mixers); i++) {
if ((err = snd_ctl_add(chip->card,
snd_ctl_new1(&tumbler_mixers[i], chip))) < 0)
return err;
}
} else {
- for (i = 0; i < number_of(snapper_mixers); i++) {
+ for (i = 0; i < ARRAY_SIZE(snapper_mixers); i++) {
if ((err = snd_ctl_add(chip->card,
snd_ctl_new1(&snapper_mixers[i], chip))) < 0)
return err;
}
-------------------------------------------------------
This SF.net email is sponsored by: Etnus, makers of TotalView, The best
thread debugger on the planet. Designed with thread debugging features
you've never dreamed of, try TotalView 6 free at www.etnus.com.
_______________________________________________
Alsa-cvslog mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/alsa-cvslog