From: Takashi Iwai <tiwai@suse.de>

the attached patch fixes this, simply replacing spinlock with mutex.
it's already in ALSA 1.0.0pre release.



 25-akpm/include/sound/i2c.h |   10 +++++-----
 25-akpm/sound/i2c/i2c.c     |    2 +-
 2 files changed, 6 insertions(+), 6 deletions(-)

diff -puN include/sound/i2c.h~alsa-sleep-in-spinlock-fix include/sound/i2c.h
--- 25/include/sound/i2c.h~alsa-sleep-in-spinlock-fix	Tue Nov 25 11:07:28 2003
+++ 25-akpm/include/sound/i2c.h	Tue Nov 25 11:07:28 2003
@@ -58,7 +58,7 @@ struct _snd_i2c_bus {
 	snd_card_t *card;	/* card which I2C belongs to */
 	char name[32];		/* some useful label */
 
-	spinlock_t lock;
+	struct semaphore lock_mutex;
 
 	snd_i2c_bus_t *master;	/* master bus when SCK/SCL is shared */
 	struct list_head buses;	/* master: slave buses sharing SCK/SCL, slave: link list */
@@ -84,15 +84,15 @@ int snd_i2c_device_free(snd_i2c_device_t
 
 static inline void snd_i2c_lock(snd_i2c_bus_t *bus) {
 	if (bus->master)
-		spin_lock(&bus->master->lock);
+		down(&bus->master->lock_mutex);
 	else
-		spin_lock(&bus->lock);
+		down(&bus->lock_mutex);
 }
 static inline void snd_i2c_unlock(snd_i2c_bus_t *bus) {
 	if (bus->master)
-		spin_unlock(&bus->master->lock);
+		up(&bus->master->lock_mutex);
 	else
-		spin_unlock(&bus->lock);
+		up(&bus->lock_mutex);
 }
 
 int snd_i2c_sendbytes(snd_i2c_device_t *device, unsigned char *bytes, int count);
diff -puN sound/i2c/i2c.c~alsa-sleep-in-spinlock-fix sound/i2c/i2c.c
--- 25/sound/i2c/i2c.c~alsa-sleep-in-spinlock-fix	Tue Nov 25 11:07:28 2003
+++ 25-akpm/sound/i2c/i2c.c	Tue Nov 25 11:07:28 2003
@@ -84,7 +84,7 @@ int snd_i2c_bus_create(snd_card_t *card,
 	bus = (snd_i2c_bus_t *)snd_magic_kcalloc(snd_i2c_bus_t, 0, GFP_KERNEL);
 	if (bus == NULL)
 		return -ENOMEM;
-	spin_lock_init(&bus->lock);
+	init_MUTEX(&bus->lock_mutex);
 	INIT_LIST_HEAD(&bus->devices);
 	INIT_LIST_HEAD(&bus->buses);
 	bus->card = card;

_