Update of /cvsroot/alsa/alsa-driver/drivers/mpu401 In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv4490/drivers/mpu401
Modified Files: Makefile Added Files: mpu401_acpi.c Log Message: Tentative MPU-401 driver with PnP for ACPI-enabled systems --- NEW FILE: mpu401_acpi.c --- /* * 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; Index: Makefile =================================================================== RCS file: /cvsroot/alsa/alsa-driver/drivers/mpu401/Makefile,v retrieving revision 1.10 retrieving revision 1.11 diff -u -r1.10 -r1.11 --- Makefile 11 Nov 2003 13:12:17 -0000 1.10 +++ Makefile 2 Mar 2004 16:52:21 -0000 1.11 @@ -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 ------------------------------------------------------- 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-cvslog mailing list [EMAIL PROTECTED] https://lists.sourceforge.net/lists/listinfo/alsa-cvslog