patch-2.4.25 linux-2.4.25/drivers/sound/ymfpci.c
Next file: linux-2.4.25/drivers/tc/lk201.c
Previous file: linux-2.4.25/drivers/sound/nec_vrc5477.c
Back to the patch index
Back to the overall index
- Lines: 118
- Date:
2004-02-18 05:36:31.000000000 -0800
- Orig file:
linux-2.4.24/drivers/sound/ymfpci.c
- Orig date:
2003-11-28 10:26:20.000000000 -0800
diff -urN linux-2.4.24/drivers/sound/ymfpci.c linux-2.4.25/drivers/sound/ymfpci.c
@@ -152,22 +152,19 @@
writel(val, codec->reg_area_virt + offset);
}
-static int ymfpci_codec_ready(ymfpci_t *codec, int secondary, int sched)
+static int ymfpci_codec_ready(ymfpci_t *unit, int secondary)
{
- signed long end_time;
+ enum { READY_STEP = 10 };
u32 reg = secondary ? YDSXGR_SECSTATUSADR : YDSXGR_PRISTATUSADR;
+ int i;
- end_time = jiffies + 3 * (HZ / 4);
- do {
- if ((ymfpci_readw(codec, reg) & 0x8000) == 0)
+ for (i = 0; i < ((3*1000)/4) / READY_STEP; i++) {
+ if ((ymfpci_readw(unit, reg) & 0x8000) == 0)
return 0;
- if (sched) {
- set_current_state(TASK_UNINTERRUPTIBLE);
- schedule_timeout(1);
- }
- } while (end_time - (signed long)jiffies >= 0);
+ mdelay(READY_STEP);
+ }
printk(KERN_ERR "ymfpci_codec_ready: codec %i is not ready [0x%x]\n",
- secondary, ymfpci_readw(codec, reg));
+ secondary, ymfpci_readw(unit, reg));
return -EBUSY;
}
@@ -178,38 +175,35 @@
spin_lock(&codec->ac97_lock);
/* XXX Do make use of dev->id */
- ymfpci_codec_ready(codec, 0, 0);
+ ymfpci_codec_ready(codec, 0);
cmd = ((YDSXG_AC97WRITECMD | reg) << 16) | val;
ymfpci_writel(codec, YDSXGR_AC97CMDDATA, cmd);
spin_unlock(&codec->ac97_lock);
}
-static u16 _ymfpci_codec_read(ymfpci_t *unit, u8 reg)
+static u16 ymfpci_codec_read(struct ac97_codec *dev, u8 reg)
{
+ ymfpci_t *unit = dev->private_data;
+ u16 ret;
int i;
- if (ymfpci_codec_ready(unit, 0, 0))
- return ~0;
+ spin_lock(&unit->ac97_lock);
+ if (ymfpci_codec_ready(unit, 0))
+ goto out_err;
ymfpci_writew(unit, YDSXGR_AC97CMDADR, YDSXG_AC97READCMD | reg);
- if (ymfpci_codec_ready(unit, 0, 0))
- return ~0;
+ if (ymfpci_codec_ready(unit, 0))
+ goto out_err;
if (unit->pci->device == PCI_DEVICE_ID_YAMAHA_744 && unit->rev < 2) {
for (i = 0; i < 600; i++)
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);
+ ret = ymfpci_readw(unit, YDSXGR_PRISTATUSDATA);
spin_unlock(&unit->ac97_lock);
-
return ret;
+
+ out_err:
+ spin_unlock(&unit->ac97_lock);
+ return ~0;
}
/*
@@ -2123,7 +2117,7 @@
int i;
ymfpci_aclink_reset(unit->pci);
- ymfpci_codec_ready(unit, 0, 1); /* prints diag if not ready. */
+ ymfpci_codec_ready(unit, 0); /* prints diag if not ready. */
#ifdef CONFIG_SOUND_YMFPCI_LEGACY
/* XXX At this time the legacy registers are probably deprogrammed. */
@@ -2549,7 +2543,7 @@
(char *)ent->driver_data, base, pcidev->irq);
ymfpci_aclink_reset(pcidev);
- if (ymfpci_codec_ready(codec, 0, 1) < 0)
+ if (ymfpci_codec_ready(codec, 0) < 0)
goto out_unmap;
#ifdef CONFIG_SOUND_YMFPCI_LEGACY
@@ -2625,6 +2619,7 @@
out_release_region:
release_mem_region(pci_resource_start(pcidev, 0), 0x8000);
out_free:
+ kfree(codec);
return -ENODEV;
}
@@ -2652,6 +2647,7 @@
unload_uart401(&codec->mpu_data);
}
#endif /* CONFIG_SOUND_YMFPCI_LEGACY */
+ kfree(codec);
}
MODULE_AUTHOR("Jaroslav Kysela");
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)