]> git.hungrycats.org Git - linux/commitdiff
[PATCH] update ymfpci for new ac97
authorAlan Cox <alan@lxorguk.ukuu.org.uk>
Fri, 11 Jul 2003 13:52:10 +0000 (06:52 -0700)
committerSteve French <cifs.adm@hostme.bitkeeper.com>
Fri, 11 Jul 2003 13:52:10 +0000 (06:52 -0700)
sound/oss/ymfpci.c
sound/oss/ymfpci.h

index 66eedb95681e80d2043d6a01aca1594d4be0890d..64585554b4c8df20c4f335d9841660df8ad5c86e 100644 (file)
@@ -177,15 +177,16 @@ static void ymfpci_codec_write(struct ac97_codec *dev, u8 reg, u16 val)
        ymfpci_t *codec = dev->private_data;
        u32 cmd;
 
+       spin_lock(&codec->ac97_lock);
        /* XXX Do make use of dev->id */
        ymfpci_codec_ready(codec, 0, 0);
        cmd = ((YDSXG_AC97WRITECMD | reg) << 16) | val;
        ymfpci_writel(codec, YDSXGR_AC97CMDDATA, cmd);
+       spin_unlock(&codec->ac97_lock);
 }
 
-static u16 ymfpci_codec_read(struct ac97_codec *dev, u8 reg)
+static u16 _ymfpci_codec_read(ymfpci_t *unit, u8 reg)
 {
-       ymfpci_t *unit = dev->private_data;
        int i;
 
        if (ymfpci_codec_ready(unit, 0, 0))
@@ -200,6 +201,18 @@ static u16 ymfpci_codec_read(struct ac97_codec *dev, u8 reg)
        return ymfpci_readw(unit, YDSXGR_PRISTATUSDATA);
 }
 
+static u16 ymfpci_codec_read(struct ac97_codec *dev, u8 reg)
+{
+       ymfpci_t *unit = dev->private_data;
+       u16 ret;
+       
+       spin_lock(&unit->ac97_lock);
+       ret = _ymfpci_codec_read(unit, reg);
+       spin_unlock(&unit->ac97_lock);
+       
+       return ret;
+}
+
 /*
  *  Misc routines
  */
@@ -2444,9 +2457,8 @@ static int ymf_ac97_init(ymfpci_t *unit, int num_ac97)
        struct ac97_codec *codec;
        u16 eid;
 
-       if ((codec = kmalloc(sizeof(struct ac97_codec), GFP_KERNEL)) == NULL)
+       if ((codec = ac97_alloc_codec()) == NULL)
                return -ENOMEM;
-       memset(codec, 0, sizeof(struct ac97_codec));
 
        /* initialize some basic codec information, other fields will be filled
           in ac97_probe_codec */
@@ -2462,7 +2474,7 @@ static int ymf_ac97_init(ymfpci_t *unit, int num_ac97)
        }
 
        eid = ymfpci_codec_read(codec, AC97_EXTENDED_ID);
-       if (eid==0xFFFFFF) {
+       if (eid==0xFFFF) {
                printk(KERN_WARNING "ymfpci: no codec attached ?\n");
                goto out_kfree;
        }
@@ -2478,7 +2490,7 @@ static int ymf_ac97_init(ymfpci_t *unit, int num_ac97)
 
        return 0;
  out_kfree:
-       kfree(codec);
+       ac97_release_codec(codec);
        return -ENODEV;
 }
 
@@ -2517,6 +2529,7 @@ static int __devinit ymf_probe_one(struct pci_dev *pcidev, const struct pci_devi
 
        spin_lock_init(&codec->reg_lock);
        spin_lock_init(&codec->voice_lock);
+       spin_lock_init(&codec->ac97_lock);
        init_MUTEX(&codec->open_sem);
        INIT_LIST_HEAD(&codec->states);
        codec->pci = pcidev;
@@ -2615,7 +2628,7 @@ static int __devinit ymf_probe_one(struct pci_dev *pcidev, const struct pci_devi
  out_release_region:
        release_mem_region(pci_resource_start(pcidev, 0), 0x8000);
  out_free:
-       kfree(codec);
+       ac97_release_codec(codec->ac97_codec[0]);
        return -ENODEV;
 }
 
@@ -2628,7 +2641,7 @@ static void __devexit ymf_remove_one(struct pci_dev *pcidev)
        list_del(&codec->ymf_devs);
 
        unregister_sound_mixer(codec->ac97_codec[0]->dev_mixer);
-       kfree(codec->ac97_codec[0]);
+       ac97_release_codec(codec->ac97_codec[0]);
        unregister_sound_dsp(codec->dev_audio);
        free_irq(pcidev->irq, codec);
        ymfpci_memfree(codec);
@@ -2643,7 +2656,6 @@ static void __devexit ymf_remove_one(struct pci_dev *pcidev)
                unload_uart401(&codec->mpu_data);
        }
 #endif /* CONFIG_SOUND_YMFPCI_LEGACY */
-       kfree(codec);
 }
 
 MODULE_AUTHOR("Jaroslav Kysela");
index 9ecf6b2ca87a815b90c7770ee62532a66cc5d34c..87a24f066a62dff4aa68f7bfd4b208412c328d8c 100644 (file)
@@ -275,6 +275,7 @@ struct ymf_unit {
 
        spinlock_t reg_lock;
        spinlock_t voice_lock;
+       spinlock_t ac97_lock;
 
        /* soundcore stuff */
        int dev_audio;