--FL5UXtIhxfXey3p5
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
Content-Transfer-Encoding: quoted-printable
Hi,
updated patch attached. Fixed small typo (dma2 assignment) and io, irq and =
dma
printk added.
Best regards.
--=20
Andrey Panin            | Embedded systems software engineer
pazke@orbita1.ru        | PGP key: http://www.orbita1.ru/~pazke/AndreyPanin=
.asc
--FL5UXtIhxfXey3p5
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment; filename=patch-opl3sa-pnpbios3
Content-Transfer-Encoding: quoted-printable
diff -urN linux.vanilla/drivers/sound/opl3sa.c linux/drivers/sound/opl3sa.c
--- linux.vanilla/drivers/sound/opl3sa.c	Mon Oct 29 13:30:14 2001
+++ linux/drivers/sound/opl3sa.c	Tue Nov  6 11:09:50 2001
@@ -23,6 +23,8 @@
 #include <linux/init.h>
 #include <linux/module.h>
=20
+#include <linux/pnp_bios.h>
+
 #undef  SB_OK
=20
 #include "sound_config.h"
@@ -35,35 +37,37 @@
 static int sb_initialized =3D 0;
 #endif
=20
-static int kilroy_was_here =3D 0;	/* Don't detect twice */
-static int mpu_initialized =3D 0;
+static int kilroy_was_here;	/* Don't detect twice */
+static int mpu_initialized;
+
+static int *opl3sa_osp;
=20
-static int *opl3sa_osp =3D NULL;
+static int ctrl_port =3D 0xf86;
=20
-static unsigned char opl3sa_read(int addr)
+static unsigned char __init opl3sa_read(int addr)
 {
 	unsigned long flags;
 	unsigned char tmp;
=20
 	save_flags(flags);
 	cli();
-	outb((0x1d), 0xf86);	/* password */
-	outb(((unsigned char) addr), 0xf86);	/* address */
-	tmp =3D inb(0xf87);	/* data */
+	outb((0x1d), ctrl_port);			/* password */
+	outb(((unsigned char) addr), ctrl_port);	/* address */
+	tmp =3D inb(ctrl_port + 1);			/* data */
 	restore_flags(flags);
=20
 	return tmp;
 }
=20
-static void opl3sa_write(int addr, int data)
+static void __init opl3sa_write(int addr, int data)
 {
 	unsigned long flags;
=20
 	save_flags(flags);
 	cli();
-	outb((0x1d), 0xf86);	/* password */
-	outb(((unsigned char) addr), 0xf86);	/* address */
-	outb(((unsigned char) data), 0xf87);	/* data */
+	outb((0x1d), ctrl_port);			/* password */
+	outb(((unsigned char) addr), ctrl_port);	/* address */
+	outb(((unsigned char) data), ctrl_port + 1);	/* data */
 	restore_flags(flags);
 }
=20
@@ -73,7 +77,7 @@
=20
 	if (((tmp =3D opl3sa_read(0x01)) & 0xc4) !=3D 0x04)
 	{
-		DDB(printk("OPL3-SA detect error 1 (%x)\n", opl3sa_read(0x01)));
+		DDB(printk(KERN_DEBUG "OPL3-SA detect error 1 (%x)\n", opl3sa_read(0x01)=
));
 		/* return 0; */
 	}
=20
@@ -83,17 +87,17 @@
 =09
 	if (inb(0xf87) =3D=3D tmp)
 	{
-		DDB(printk("OPL3-SA detect failed 2 (%x/%x)\n", tmp, inb(0xf87)));
+		DDB(printk(KERN_DEBUG "OPL3-SA detect failed 2 (%x/%x)\n", tmp, inb(0xf8=
7)));
 		return 0;
 	}
 	tmp =3D (opl3sa_read(0x04) & 0xe0) >> 5;
=20
 	if (tmp !=3D 0 && tmp !=3D 1)
 	{
-		DDB(printk("OPL3-SA detect failed 3 (%d)\n", tmp));
+		DDB(printk(KERN_DEBUG "OPL3-SA detect failed 3 (%d)\n", tmp));
 		return 0;
 	}
-	DDB(printk("OPL3-SA mode %x detected\n", tmp));
+	DDB(printk(KERN_DEBUG "OPL3-SA mode %x detected\n", tmp));
=20
 	opl3sa_write(0x01, 0x00);	/* Disable MSS */
 	opl3sa_write(0x02, 0x00);	/* Disable SB */
@@ -112,7 +116,7 @@
 	int ret;
 	unsigned char tmp =3D 0x24;	/* WSS enable */
=20
-	if (check_region(0xf86, 2))	/* Control port is busy */
+	if (check_region(ctrl_port, 2))	/* Control port is busy */
 		return 0;
 	/*
 	 * Check if the IO port returns valid signature. The original MS Sound
@@ -157,7 +161,7 @@
=20
 	ret =3D probe_ms_sound(hw_config);
 	if (ret)
-		request_region(0xf86, 2, "OPL3-SA");
+		request_region(ctrl_port, 2, "OPL3-SA");
=20
 	return ret;
 }
@@ -189,7 +193,7 @@
=20
 	if (mpu_initialized)
 	{
-		DDB(printk("OPL3-SA: MPU mode already initialized\n"));
+		DDB(printk(KERN_DEBUG "OPL3-SA: MPU mode already initialized\n"));
 		return 0;
 	}
 	if (hw_config->irq > 10)
@@ -238,7 +242,7 @@
 	if (dma2 =3D=3D -1)
 		dma2 =3D hw_config->dma;
=20
-	release_region(0xf86, 2);
+	release_region(ctrl_port, 2);
 	release_region(hw_config->io_base, 4);
=20
 	ad1848_unload(hw_config->io_base + 4,
@@ -280,11 +284,79 @@
 MODULE_PARM(mpu_io,"i");
 MODULE_PARM(mpu_irq,"i");
=20
+#ifdef CONFIG_PNPBIOS
+
+struct opl3sa_pnpbios_dev {
+	char *name;
+	int io, ctrl, irq, dma, dma2, mpu_io, mpu_irq;
+};
+
+static struct opl3sa_pnpbios_dev opl3sa_devs[] __initdata =3D {
+	{ "YMF701B on motherboard", 1, -1, 0, 0, 1, 2, 1 },
+};
+
+static struct pnpbios_device_id opl3sa_pnpbios_table[] __initdata =3D {
+	{ "YMH0007", (unsigned long) &opl3sa_devs[0] },
+	{ "PNP0401", (unsigned long) &opl3sa_devs[0] },
+	{ }
+};
+MODULE_DEVICE_TABLE(pnpbios, opl3sa_pnpbios_table);
+
+#define field(f) ((struct opl3sa_pnpbios_dev *) dev_id->driver_data)->##f
+
+#define pnp_resource_start(dev, type, bar) \
+	((##dev##)->##type##_resource[(bar)].start)
+
+static int __init opl3sa_pnpbios_probe(void)
+{
+	struct pnpbios_device_id *dev_id =3D opl3sa_pnpbios_table;
+	struct pci_dev *dev =3D NULL;
+
+	while (dev_id->driver_data) {
+		if ((dev =3D pnpbios_find_device(dev_id->id, dev))) {
+			printk(KERN_NOTICE "opl3sa: PnP BIOS reports %s\n", field(name));
+
+			io =3D pci_resource_start(dev, field(io));
+			if (field(ctrl) !=3D -1)
+				ctrl_port =3D pci_resource_start(dev, field(ctrl));
+
+			irq =3D pnp_resource_start(dev, irq, field(irq));
+			dma =3D pnp_resource_start(dev, dma, field(dma));
+
+			printk(KERN_NOTICE "opl3sa: WSS at i/o %#x, %#x, irq %d, dma %d",
+				io, ctrl_port, irq, dma);
+
+			if (field(dma2) !=3D -1) {
+				dma2 =3D pnp_resource_start(dev, dma, field(dma2));
+				printk(", %d", dma2);
+			}
+
+			mpu_io =3D pci_resource_start(dev, field(mpu_io));
+			mpu_irq =3D pnp_resource_start(dev, irq, field(mpu_irq));
+
+			printk(". MPU401 at i/o %#x, irq %d\n", mpu_io, mpu_irq);
+
+			return 0;
+		}
+		dev_id++;
+	}
+
+	printk(KERN_NOTICE "opl3sa: No PnP BIOS devices found\n");
+	return -ENODEV;
+}
+
+#endif
+
 static int __init init_opl3sa(void)
 {
 	if (io =3D=3D -1 || irq =3D=3D -1 || dma =3D=3D -1) {
-		printk(KERN_ERR "opl3sa: dma, irq and io must be set.\n");
-		return -EINVAL;
+#ifdef CONFIG_PNPBIOS
+		if (opl3sa_pnpbios_probe())
+#endif
+		{
+			printk(KERN_ERR "opl3sa: dma, irq and io must be set.\n");
+			return -EINVAL;
+		}
 	}
=20
 	cfg.io_base =3D io;
--FL5UXtIhxfXey3p5--
--aM3YZ0Iwxop3KEKx
Content-Type: application/pgp-signature
Content-Disposition: inline
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.0.6 (GNU/Linux)
Comment: For info see http://www.gnupg.org
iD8DBQE75+mfBm4rlNOo3YgRAv7QAJ0fUUsJ5vLGqcuHmotukbuey4SkcwCfbxS5
rNCZ+16/lBcujt1MZ2mA+b0=
=jCgz
-----END PGP SIGNATURE-----
--aM3YZ0Iwxop3KEKx--
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/