Commit 102cc871 authored by Alan Cox's avatar Alan Cox Committed by Steve French

[PATCH] update ymfpci for new ac97

parent 0d988dba
...@@ -177,15 +177,16 @@ static void ymfpci_codec_write(struct ac97_codec *dev, u8 reg, u16 val) ...@@ -177,15 +177,16 @@ static void ymfpci_codec_write(struct ac97_codec *dev, u8 reg, u16 val)
ymfpci_t *codec = dev->private_data; ymfpci_t *codec = dev->private_data;
u32 cmd; u32 cmd;
spin_lock(&codec->ac97_lock);
/* XXX Do make use of dev->id */ /* XXX Do make use of dev->id */
ymfpci_codec_ready(codec, 0, 0); ymfpci_codec_ready(codec, 0, 0);
cmd = ((YDSXG_AC97WRITECMD | reg) << 16) | val; cmd = ((YDSXG_AC97WRITECMD | reg) << 16) | val;
ymfpci_writel(codec, YDSXGR_AC97CMDDATA, cmd); 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; int i;
if (ymfpci_codec_ready(unit, 0, 0)) if (ymfpci_codec_ready(unit, 0, 0))
...@@ -200,6 +201,18 @@ static u16 ymfpci_codec_read(struct ac97_codec *dev, u8 reg) ...@@ -200,6 +201,18 @@ static u16 ymfpci_codec_read(struct ac97_codec *dev, u8 reg)
return ymfpci_readw(unit, YDSXGR_PRISTATUSDATA); 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 * Misc routines
*/ */
...@@ -2444,9 +2457,8 @@ static int ymf_ac97_init(ymfpci_t *unit, int num_ac97) ...@@ -2444,9 +2457,8 @@ static int ymf_ac97_init(ymfpci_t *unit, int num_ac97)
struct ac97_codec *codec; struct ac97_codec *codec;
u16 eid; u16 eid;
if ((codec = kmalloc(sizeof(struct ac97_codec), GFP_KERNEL)) == NULL) if ((codec = ac97_alloc_codec()) == NULL)
return -ENOMEM; return -ENOMEM;
memset(codec, 0, sizeof(struct ac97_codec));
/* initialize some basic codec information, other fields will be filled /* initialize some basic codec information, other fields will be filled
in ac97_probe_codec */ in ac97_probe_codec */
...@@ -2462,7 +2474,7 @@ static int ymf_ac97_init(ymfpci_t *unit, int num_ac97) ...@@ -2462,7 +2474,7 @@ static int ymf_ac97_init(ymfpci_t *unit, int num_ac97)
} }
eid = ymfpci_codec_read(codec, AC97_EXTENDED_ID); eid = ymfpci_codec_read(codec, AC97_EXTENDED_ID);
if (eid==0xFFFFFF) { if (eid==0xFFFF) {
printk(KERN_WARNING "ymfpci: no codec attached ?\n"); printk(KERN_WARNING "ymfpci: no codec attached ?\n");
goto out_kfree; goto out_kfree;
} }
...@@ -2478,7 +2490,7 @@ static int ymf_ac97_init(ymfpci_t *unit, int num_ac97) ...@@ -2478,7 +2490,7 @@ static int ymf_ac97_init(ymfpci_t *unit, int num_ac97)
return 0; return 0;
out_kfree: out_kfree:
kfree(codec); ac97_release_codec(codec);
return -ENODEV; return -ENODEV;
} }
...@@ -2517,6 +2529,7 @@ static int __devinit ymf_probe_one(struct pci_dev *pcidev, const struct pci_devi ...@@ -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->reg_lock);
spin_lock_init(&codec->voice_lock); spin_lock_init(&codec->voice_lock);
spin_lock_init(&codec->ac97_lock);
init_MUTEX(&codec->open_sem); init_MUTEX(&codec->open_sem);
INIT_LIST_HEAD(&codec->states); INIT_LIST_HEAD(&codec->states);
codec->pci = pcidev; codec->pci = pcidev;
...@@ -2615,7 +2628,7 @@ static int __devinit ymf_probe_one(struct pci_dev *pcidev, const struct pci_devi ...@@ -2615,7 +2628,7 @@ static int __devinit ymf_probe_one(struct pci_dev *pcidev, const struct pci_devi
out_release_region: out_release_region:
release_mem_region(pci_resource_start(pcidev, 0), 0x8000); release_mem_region(pci_resource_start(pcidev, 0), 0x8000);
out_free: out_free:
kfree(codec); ac97_release_codec(codec->ac97_codec[0]);
return -ENODEV; return -ENODEV;
} }
...@@ -2628,7 +2641,7 @@ static void __devexit ymf_remove_one(struct pci_dev *pcidev) ...@@ -2628,7 +2641,7 @@ static void __devexit ymf_remove_one(struct pci_dev *pcidev)
list_del(&codec->ymf_devs); list_del(&codec->ymf_devs);
unregister_sound_mixer(codec->ac97_codec[0]->dev_mixer); 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); unregister_sound_dsp(codec->dev_audio);
free_irq(pcidev->irq, codec); free_irq(pcidev->irq, codec);
ymfpci_memfree(codec); ymfpci_memfree(codec);
...@@ -2643,7 +2656,6 @@ static void __devexit ymf_remove_one(struct pci_dev *pcidev) ...@@ -2643,7 +2656,6 @@ static void __devexit ymf_remove_one(struct pci_dev *pcidev)
unload_uart401(&codec->mpu_data); unload_uart401(&codec->mpu_data);
} }
#endif /* CONFIG_SOUND_YMFPCI_LEGACY */ #endif /* CONFIG_SOUND_YMFPCI_LEGACY */
kfree(codec);
} }
MODULE_AUTHOR("Jaroslav Kysela"); MODULE_AUTHOR("Jaroslav Kysela");
......
...@@ -275,6 +275,7 @@ struct ymf_unit { ...@@ -275,6 +275,7 @@ struct ymf_unit {
spinlock_t reg_lock; spinlock_t reg_lock;
spinlock_t voice_lock; spinlock_t voice_lock;
spinlock_t ac97_lock;
/* soundcore stuff */ /* soundcore stuff */
int dev_audio; int dev_audio;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment