I'm just too lazy to put port and irq parameters in my modules.conf,
so instead I wrote this driver which gets the resources from the ACPI
PnP information.
This probably should be integrated into the real MPU-401 driver after
testing.
Index: alsa-driver/INSTALL
===================================================================
RCS file: /cvsroot/alsa/alsa-driver/INSTALL,v
retrieving revision 1.159
diff -u -r1.159 INSTALL
--- alsa-driver/INSTALL 24 Feb 2004 15:23:09 -0000 1.159
+++ alsa-driver/INSTALL 2 Mar 2004 14:55:33 -0000
@@ -273,6 +273,14 @@
This module supports up to 8 cards and autoprobe.
+ Module snd-mpu401-acpi
+ ----------------------
+
+ Module for MPU-401 devices on ACPI-enabled motherboards.
+
+ This module supports up to 8 devices and autoprobe.
+
+
Trouble Shooting
================
Index: alsa-driver/Makefile.conf.in
===================================================================
RCS file: /cvsroot/alsa/alsa-driver/Makefile.conf.in,v
retrieving revision 1.60
diff -u -r1.60 Makefile.conf.in
--- alsa-driver/Makefile.conf.in 30 Jan 2004 11:44:58 -0000 1.60
+++ alsa-driver/Makefile.conf.in 2 Mar 2004 14:55:33 -0000
@@ -77,6 +77,7 @@
CONFIG_USB = @CONFIG_USB@
CONFIG_SND_BIT32_EMUL = @CONFIG_SND_BIT32_EMUL@
CONFIG_VIDEO_DEV = @CONFIG_VIDEO_DEV@
+CONFIG_ACPI_BUS = @CONFIG_ACPI_BUS@
ifndef NEW_KBUILD
INCLUDE = -I$(TOPDIR)/include @EXTRA_INCLUDES@ @KERNEL_INC@
Index: alsa-driver/configure.in
===================================================================
RCS file: /cvsroot/alsa/alsa-driver/configure.in,v
retrieving revision 1.231
diff -u -r1.231 configure.in
--- alsa-driver/configure.in 1 Mar 2004 08:49:00 -0000 1.231
+++ alsa-driver/configure.in 2 Mar 2004 14:55:34 -0000
@@ -490,6 +490,10 @@
CHECK_KERNEL_CONFIG(CONFIG_PCI, [PCI support in kernel])
AC_SUBST(CONFIG_PCI)
+dnl Check for ACPI bus driver...
+CHECK_KERNEL_CONFIG(CONFIG_ACPI_BUS, [ACPI bus driver])
+AC_SUBST(CONFIG_ACPI_BUS)
+
dnl Check for SGI/MIPS (HAL2) support...
AC_MSG_CHECKING(for SGI/MIPS (HAL2) architecture)
CONFIG_SGI=""
Index: alsa-driver/acore/Makefile
===================================================================
RCS file: /cvsroot/alsa/alsa-driver/acore/Makefile,v
retrieving revision 1.41
diff -u -r1.41 Makefile
--- alsa-driver/acore/Makefile 24 Feb 2004 15:23:09 -0000 1.41
+++ alsa-driver/acore/Makefile 2 Mar 2004 14:55:34 -0000
@@ -17,6 +17,7 @@
obj-$(CONFIG_SND_INTEL8X0M) += snd-pcm.o snd-timer.o snd-page-alloc.o snd.o
obj-$(CONFIG_SND_HDSPM) += snd-pcm.o snd-timer.o snd-page-alloc.o snd.o snd-rawmidi.o
snd-hwdep.o
obj-$(CONFIG_SND_ATIIXP) += snd-pcm.o snd-timer.o snd-page-alloc.o snd.o
+obj-$(CONFIG_SND_MPU401_ACPI) += snd-rawmidi.o snd.o snd-timer.o
export-objs := sound.o pcm.o pcm_lib.o rawmidi.o timer.o hwdep.o memalloc.o
include $(SND_TOPDIR)/alsa-kernel/core/Makefile
Index: alsa-driver/acore/seq/Makefile
===================================================================
RCS file: /cvsroot/alsa/alsa-driver/acore/seq/Makefile,v
retrieving revision 1.15
diff -u -r1.15 Makefile
--- alsa-driver/acore/seq/Makefile 3 Feb 2004 15:21:27 -0000 1.15
+++ alsa-driver/acore/seq/Makefile 2 Mar 2004 14:55:34 -0000
@@ -13,6 +13,7 @@
obj-$(CONFIG_SND_AU8820) += snd-seq-midi.o snd-seq.o snd-seq-device.o
snd-seq-midi-event.o
obj-$(CONFIG_SND_AU8830) += snd-seq-midi.o snd-seq.o snd-seq-device.o
snd-seq-midi-event.o
obj-$(CONFIG_SND_USB_USX2Y) += snd-seq-midi.o snd-seq.o snd-seq-device.o
snd-seq-midi-event.o
+obj-$(CONFIG_SND_MPU401_ACPI) += snd-seq-midi.o snd-seq.o snd-seq-device.o
snd-seq-midi-event.o
export-objs := seq_device.o seq.o seq_instr.o seq_midi_emul.o \
seq_midi_event.o seq_virmidi.o
Index: alsa-driver/drivers/mpu401/Makefile
===================================================================
RCS file: /cvsroot/alsa/alsa-driver/drivers/mpu401/Makefile,v
retrieving revision 1.10
diff -u -r1.10 Makefile
--- alsa-driver/drivers/mpu401/Makefile 11 Nov 2003 13:12:17 -0000 1.10
+++ alsa-driver/drivers/mpu401/Makefile 2 Mar 2004 14:55:34 -0000
@@ -5,9 +5,14 @@
include $(SND_TOPDIR)/toplevel.config
include $(SND_TOPDIR)/Makefile.conf
+snd-mpu401-acpi-objs := mpu401_acpi.o
+
obj-$(CONFIG_SND_AU8810) += snd-mpu401-uart.o
obj-$(CONFIG_SND_AU8820) += snd-mpu401-uart.o
obj-$(CONFIG_SND_AU8830) += snd-mpu401-uart.o
+ifeq (y,$(CONFIG_ACPI_BUS))
+ obj-$(CONFIG_SND_MPU401_ACPI) += snd-mpu401-acpi.o snd-mpu401-uart.o
+endif
export-objs := mpu401_uart.o
Index: alsa-driver/utils/Modules.dep
===================================================================
RCS file: /cvsroot/alsa/alsa-driver/utils/Modules.dep,v
retrieving revision 1.32
diff -u -r1.32 Modules.dep
--- alsa-driver/utils/Modules.dep 24 Feb 2004 15:23:10 -0000 1.32
+++ alsa-driver/utils/Modules.dep 2 Mar 2004 14:55:34 -0000
@@ -4,6 +4,7 @@
%dir linux/sound/drivers
|snd-serialmidi snd-seq-midi
+|snd-mpu401-acpi snd-mpu401-uart
%dir linux/sound/pci
|snd-intel8x0m snd-pcm
diff -urN alsa-driver/drivers/mpu401/mpu401_acpi.c
alsa-driver/drivers/mpu401/mpu401_acpi.c
--- alsa-driver/drivers/mpu401/mpu401_acpi.c 1970-01-01 01:00:00.000000000 +0100
+++ alsa-driver/drivers/mpu401/mpu401_acpi.c 2004-03-02 15:51:41.606447000 +0100
@@ -0,0 +1,195 @@
+/*
+ * mpu401_acpi.c - driver for motherboard MPU-401 ports identified by ACPI PnP
+ * Copyright (c) 2004 Clemens Ladisch <[EMAIL PROTECTED]>
+ *
+ * based on 8250_acpi.c
+ * Copyright (c) 2002-2003 Matthew Wilcox for Hewlett-Packard
+ * Copyright (C) 2004 Hewlett-Packard Co
+ * Bjorn Helgaas <[EMAIL PROTECTED]>
+ *
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#include <sound/driver.h>
+#include <linux/init.h>
+#include <acpi/acpi_bus.h>
+#include <sound/core.h>
+#include <sound/mpu401.h>
+#define SNDRV_GET_ID
+#include <sound/initval.h>
+
+MODULE_AUTHOR("Clemens Ladisch <[EMAIL PROTECTED]>");
+MODULE_DESCRIPTION("MPU-401 UART (ACPI)");
+MODULE_LICENSE("GPL");
+MODULE_CLASSES("{sound}");
+
+static int index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX; /* Index 0-MAX */
+static char *id[SNDRV_CARDS] = SNDRV_DEFAULT_STR; /* ID for this card */
+static int enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_PNP; /* Enable this card */
+
+MODULE_PARM(index, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+MODULE_PARM_DESC(index, "Index value for MPU-401 device.");
+MODULE_PARM_SYNTAX(index, SNDRV_INDEX_DESC);
+MODULE_PARM(id, "1-" __MODULE_STRING(SNDRV_CARDS) "s");
+MODULE_PARM_DESC(id, "ID string for MPU-401 device.");
+MODULE_PARM_SYNTAX(id, SNDRV_ID_DESC);
+MODULE_PARM(enable, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+MODULE_PARM_DESC(enable, "Enable MPU-401 device.");
+MODULE_PARM_SYNTAX(enable, SNDRV_ENABLE_DESC);
+
+#define MPU401_PNP_ID "PNPB006"
+
+struct mpu401_resources {
+ unsigned long port;
+ int irq;
+};
+
+static acpi_status __devinit snd_mpu401_acpi_resource(struct acpi_resource *res, void
*data)
+{
+ struct mpu401_resources *resources = (struct mpu401_resources *)data;
+
+ if (res->id == ACPI_RSTYPE_IRQ) {
+ if (res->data.irq.number_of_interrupts > 0) {
+#ifdef CONFIG_IA64
+ resources->irq = acpi_register_irq(res->data.irq.interrupts[0],
+
res->data.irq.active_high_low,
+ res->data.irq.edge_level);
+#else
+ resources->irq = res->data.irq.interrupts[0];
+#endif
+ }
+ } else if (res->id == ACPI_RSTYPE_IO) {
+ if (res->data.io.range_length >= 2) {
+ resources->port = res->data.io.min_base_address;
+ }
+ }
+ return AE_OK;
+}
+
+static int __devinit snd_mpu401_acpi_add(struct acpi_device *device)
+{
+ static int dev;
+ snd_card_t *card;
+ struct mpu401_resources resources;
+ acpi_status status;
+ int err;
+
+ if (dev >= SNDRV_CARDS)
+ return -ENODEV;
+ if (!enable[dev]) {
+ ++dev;
+ return -ENOENT;
+ }
+
+ resources.port = -1;
+ resources.irq = -1;
+ status = acpi_walk_resources(device->handle, METHOD_NAME__CRS,
+ snd_mpu401_acpi_resource, &resources);
+ if (ACPI_FAILURE(status))
+ return -ENODEV;
+ if (resources.port < 0 || resources.irq < 0) {
+ snd_printk(KERN_ERR "no port or irq in %s _CRS\n",
+ acpi_device_bid(device));
+ return -ENODEV;
+ }
+
+ card = snd_card_new(index[dev], id[dev], THIS_MODULE, 0);
+ if (!card)
+ return -ENOMEM;
+
+ strcpy(card->driver, "MPU-401 (ACPI)");
+ strcpy(card->shortname, "MPU-401 UART");
+ snprintf(card->longname, sizeof(card->longname),
+ "%s at %#lx, irq %d, bus id %s", card->shortname,
+ resources.port, resources.irq, acpi_device_bid(device));
+
+ err = snd_mpu401_uart_new(card, 0, MPU401_HW_MPU401, resources.port,
+ 0, resources.irq, SA_INTERRUPT, NULL);
+ if (err < 0) {
+ printk(KERN_ERR "MPU401 not detected at %#lx\n", resources.port);
+ snd_card_free(card);
+ return err;
+ }
+
+ if ((err = snd_card_register(card)) < 0) {
+ snd_card_free(card);
+ return err;
+ }
+ acpi_driver_data(device) = card;
+ ++dev;
+ return 0;
+}
+
+static int __devexit snd_mpu401_acpi_remove(struct acpi_device *device, int type)
+{
+ snd_card_t *card;
+
+ if (!device || !acpi_driver_data(device))
+ return -EINVAL;
+
+ card = (snd_card_t *)acpi_driver_data(device);
+ snd_card_free(card);
+ acpi_driver_data(device) = NULL;
+ return 0;
+}
+
+static struct acpi_driver snd_mpu401_acpi_driver = {
+ .name = "snd-mpu401-acpi",
+ .class = "",
+ .ids = MPU401_PNP_ID,
+ .ops = {
+ .add = snd_mpu401_acpi_add,
+ .remove = __devexit_p(snd_mpu401_acpi_remove),
+ },
+};
+
+static int __init alsa_card_mpu401_acpi_init(void)
+{
+ int err;
+ err = acpi_bus_register_driver(&snd_mpu401_acpi_driver);
+ return err < 0 ? err : 0;
+}
+
+static void __exit alsa_card_mpu401_acpi_exit(void)
+{
+ acpi_bus_unregister_driver(&snd_mpu401_acpi_driver);
+}
+
+module_init(alsa_card_mpu401_acpi_init)
+module_exit(alsa_card_mpu401_acpi_exit)
+
+#ifndef MODULE
+
+/* format is: snd-mpu401-acpi=enable,index,id */
+
+static int __init alsa_card_mpu401_setup(char *str)
+{
+ static unsigned __initdata nr_dev = 0;
+
+ if (nr_dev >= SNDRV_CARDS)
+ return 0;
+ (void)(get_option(&str, &enable[nr_dev]) == 2 &&
+ get_option(&str, &index[nr_dev]) == 2 &&
+ get_id(&str, &id[nr_dev]) == 2);
+ nr_dev++;
+ return 1;
+}
+
+__setup("snd-mpu401-acpi=", alsa_card_mpu401_setup);
+
+#endif /* ifndef MODULE */
+
+EXPORT_NO_SYMBOLS;
-------------------------------------------------------
SF.Net is sponsored by: Speed Start Your Linux Apps Now.
Build and deploy apps & Web services for Linux with
a free DVD software kit from IBM. Click Now!
http://ads.osdn.com/?ad_id=1356&alloc_id=3438&op=click
_______________________________________________
Alsa-devel mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/alsa-devel