PnP Changes for 2.5.66
Subsystems (2)
PATCH 1/1 PnP Changes for 2.5.66
drivers/pnp/card.c +44 -24
@@ -19,6 +19,7 @@#include "base.h" LIST_HEAD (pnp_cards); +LIST_HEAD (pnp_card_drivers);static const struct pnp_card_id *match_card (struct pnp_card_driver * drv,struct pnp_card * card)
@@ -32,21 +33,41 @@return NULL ; } -static void generic_card_remove (struct pnp_dev * dev) +static void card_remove (struct pnp_dev * dev) { dev->card_link =NULL ; } - -static void generic_card_remove_first (struct pnp_dev * dev) + +static void card_remove_first (struct pnp_dev * dev) {struct pnp_card_driver * drv =to_pnp_card_driver (dev->driver);if (!dev->card || !drv)return ;if (drv->remove) drv->remove (dev->card_link); - drv->link.remove = &generic_card_remove; + drv->link.remove = &card_remove;kfree (dev->card_link); -generic_card_remove (dev); +card_remove (dev); +} + +static int card_probe (struct pnp_card * card,struct pnp_card_driver * drv) +{ +const struct pnp_card_id *id =match_card (drv,card); +if (id) { +struct pnp_card_link * clink =pnp_alloc (sizeof (struct pnp_card_link )); +if (!clink) +return 0 ; + clink->card = card; + clink->driver = drv; +if (drv->probe) { +if (drv->probe (clink, id)>=0 ) +return 1 ; +else +kfree (clink); + }else +return 1 ; + } +return 0 ; }/**
@@ -103,7 +124,7 @@int pnp_add_card (struct pnp_card * card) {int error; -struct list_head * pos; +struct list_head * pos, * temp;if (!card || !card->protocol)return -EINVAL ;
@@ -112,6 +133,7 @@ card->dev.bus =NULL ; card->dev.release = &pnp_release_card; error =device_register (&card->dev); +if (error ==0 ) {spin_lock (&pnp_lock);list_add_tail (&card->global_list, &pnp_cards);
@@ -125,6 +147,12 @@struct pnp_dev *dev =card_to_pnp_dev (pos);__pnp_add_device (dev); } + +/* match with card drivers */ +list_for_each_safe (pos,temp,&pnp_card_drivers){ + struct pnp_card_driver * drv = list_entry(pos, struct pnp_card_driver, global_list); +card_probe (card,drv); + } }else pnp_err ("sysfs failure, card '%s' will be unavailable" , card->dev.bus_id);return error;
@@ -248,9 +276,9 @@if (!drv)return ;down_write (&dev->dev.bus->subsys.rwsem); - drv->link.remove = &generic_card_remove; + drv->link.remove = &card_remove;device_release_driver (&dev->dev); - drv->link.remove = &generic_card_remove_first; + drv->link.remove = &card_remove_first;up_write (&dev->dev.bus->subsys.rwsem); }
@@ -268,25 +296,16 @@ drv->link.id_table =NULL ;/* this will disable auto matching */ drv->link.flags = drv->flags; drv->link.probe =NULL ; - drv->link.remove = &generic_card_remove_first; + drv->link.remove = &card_remove_first; +spin_lock (&pnp_lock); +list_add_tail (&drv->global_list, &pnp_card_drivers); +spin_unlock (&pnp_lock);pnp_register_driver (&drv->link);list_for_each_safe (pos,temp,&pnp_cards){ struct pnp_card *card = list_entry(pos, struct pnp_card, global_list); -const struct pnp_card_id *id =match_card (drv,card); -if (id) { -struct pnp_card_link * clink =pnp_alloc (sizeof (struct pnp_card_link )); -if (!clink) -continue ; - clink->card = card; - clink->driver = drv; -if (drv->probe) { -if (drv->probe (clink, id)>=0 ) - count++; - }else - count++; - } + count +=card_probe (card,drv); }return count; }
@@ -298,9 +317,10 @@void pnp_unregister_card_driver (struct pnp_card_driver * drv) { +spin_lock (&pnp_lock); +list_del (&drv->global_list); +spin_unlock (&pnp_lock);pnp_unregister_driver (&drv->link); - -pnp_dbg ("the card driver '%s' has been unregistered" , drv->name); }EXPORT_SYMBOL (pnp_add_card);
include/linux/pnp.h +1 -0
@@ -315,6 +315,7 @@#define to_pnp_driver (drv) container_of(drv, struct pnp_driver, driver)struct pnp_card_driver { +struct list_head global_list;char * name;const struct pnp_card_id *id_table;unsigned int flags;
drivers/pnp/manager.c +2 -4
@@ -632,8 +632,7 @@if (!dev)return -EINVAL ;if (dev->active) { -pnp_info ("res: The PnP device '%s' is already active." , dev->dev.bus_id); -return -EBUSY ; +return 0 ;/* the device is already active */ }/* If this condition is true, advanced configuration failed, we need to get this device up and running * so we use the simple config engine which ignores cold conflicts, this of course may lead to new failures */
@@ -698,8 +697,7 @@if (!dev)return -EINVAL ;if (!dev->active) { -pnp_info ("res: The PnP device '%s' is already disabled." , dev->dev.bus_id); -return -EINVAL ; +return 0 ;/* the device is already disabled */ }if (dev->status !=PNP_READY ){pnp_info ("res: Disable failed becuase the PnP device '%s' is busy." , dev->dev.bus_id);
drivers/pnp/pnpbios/core.c +102 -35
@@ -32,6 +32,18 @@* along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +/* Change Log +* +* Adam Belay - <[email protected]> - March 16, 2003 +* rev 1.01 Only call pnp_bios_dev_node_info once +* Added pnpbios_print_status +* Added several new error messages and info messages +* Added pnpbios_interface_attach_device +* integrated core and proc init system +* Introduced PNPMODE flags +* Removed some useless includes +*/ #include <linux/types.h> #include <linux/module.h>
@@ -46,9 +58,7 @@#include <linux/mm.h> #include <linux/smp.h> #include <asm/desc.h> -#include <linux/ioport.h> #include <linux/slab.h> -#include <linux/pci.h> #include <linux/kmod.h> #include <linux/completion.h> #include <linux/spinlock.h>
@@ -93,6 +103,7 @@ } pnp_bios_callpoint;static union pnp_bios_expansion_header * pnp_bios_hdr =NULL ; +struct pnp_dev_node_info node_info;/* The PnP BIOS entries in the GDT */ #define PNP_GDT (GDT_ENTRY_PNPBIOS_BASE * 8)
@@ -237,9 +248,46 @@* */ -static void pnpbios_warn_unexpected_status (const char * module,u16 status) +static void pnpbios_print_status (const char * module,u16 status) { -printk (KERN_ERR "PnPBIOS: %s: Unexpected status 0x%x\n" , module, status); +switch (status) { +case PNP_SUCCESS : +printk (KERN_ERR "PnPBIOS: %s: function successful\n" , module); +case PNP_NOT_SET_STATICALLY : +printk (KERN_ERR "PnPBIOS: %s: unable to set static resources\n" , module); +case PNP_UNKNOWN_FUNCTION : +printk (KERN_ERR "PnPBIOS: %s: invalid function number passed\n" , module); +case PNP_FUNCTION_NOT_SUPPORTED : +printk (KERN_ERR "PnPBIOS: %s: function not supported on this system\n" , module); +case PNP_INVALID_HANDLE : +printk (KERN_ERR "PnPBIOS: %s: invalid handle\n" , module); +case PNP_BAD_PARAMETER : +printk (KERN_ERR "PnPBIOS: %s: invalid parameters were passed\n" , module); +case PNP_SET_FAILED : +printk (KERN_ERR "PnPBIOS: %s: unable to set resources\n" , module); +case PNP_EVENTS_NOT_PENDING : +printk (KERN_ERR "PnPBIOS: %s: no events are pending\n" , module); +case PNP_SYSTEM_NOT_DOCKED : +printk (KERN_ERR "PnPBIOS: %s: the system is not docked\n" , module); +case PNP_NO_ISA_PNP_CARDS : +printk (KERN_ERR "PnPBIOS: %s: no isapnp cards are installed on this system\n" , module); +case PNP_UNABLE_TO_DETERMINE_DOCK_CAPABILITIES : +printk (KERN_ERR "PnPBIOS: %s: cannot determine the capabilities of the docking station\n" , module); +case PNP_CONFIG_CHANGE_FAILED_NO_BATTERY : +printk (KERN_ERR "PnPBIOS: %s: unable to undock, the system does not have a battery\n" , module); +case PNP_CONFIG_CHANGE_FAILED_RESOURCE_CONFLICT : +printk (KERN_ERR "PnPBIOS: %s: could not dock due to resource conflicts\n" , module); +case PNP_BUFFER_TOO_SMALL : +printk (KERN_ERR "PnPBIOS: %s: the buffer passed is too small\n" , module); +case PNP_USE_ESCD_SUPPORT : +printk (KERN_ERR "PnPBIOS: %s: use ESCD instead\n" , module); +case PNP_MESSAGE_NOT_SUPPORTED : +printk (KERN_ERR "PnPBIOS: %s: the message is unsupported\n" , module); +case PNP_HARDWARE_ERROR : +printk (KERN_ERR "PnPBIOS: %s: a hardware failure has occured\n" , module); +default : +printk (KERN_ERR "PnPBIOS: %s: unexpected status 0x%x\n" , module, status); + } }void *pnpbios_kmalloc (size_t size,int f)
@@ -299,7 +347,7 @@ {int status =__pnp_bios_dev_node_info ( data );if ( status ) -pnpbios_warn_unexpected_status ("dev_node_info" , status ); +pnpbios_print_status ("dev_node_info" , status );return status; }
@@ -334,7 +382,7 @@int status; status =__pnp_bios_get_dev_node ( nodenum, boot, data );if ( status ) -pnpbios_warn_unexpected_status ("get_dev_node" , status ); +pnpbios_print_status ("get_dev_node" , status );return status; }
@@ -362,7 +410,7 @@int status; status =__pnp_bios_set_dev_node ( nodenum, boot, data );if ( status ) { -pnpbios_warn_unexpected_status ("set_dev_node" , status ); +pnpbios_print_status ("set_dev_node" , status );return status; }if ( !boot ) {/* Update devlist */
@@ -452,7 +500,7 @@int status; status =__pnp_bios_get_stat_res ( info );if ( status ) -pnpbios_warn_unexpected_status ("get_stat_res" , status ); +pnpbios_print_status ("get_stat_res" , status );return status; }
@@ -489,7 +537,7 @@int status; status =__pnp_bios_isapnp_config ( data );if ( status ) -pnpbios_warn_unexpected_status ("isapnp_config" , status ); +pnpbios_print_status ("isapnp_config" , status );return status; }
@@ -511,7 +559,7 @@int status; status =__pnp_bios_escd_info ( data );if ( status ) -pnpbios_warn_unexpected_status ("escd_info" , status ); +pnpbios_print_status ("escd_info" , status );return status; }
@@ -534,7 +582,7 @@int status; status =__pnp_bios_read_escd ( data, nvram_base );if ( status ) -pnpbios_warn_unexpected_status ("read_escd" , status ); +pnpbios_print_status ("read_escd" , status );return status; }
@@ -658,7 +706,7 @@ d =1 ;break ;default : -pnpbios_warn_unexpected_status ("pnp_dock_thread" , status ); +pnpbios_print_status ("pnp_dock_thread" , status );continue ; }if (d != docked)
@@ -753,19 +801,17 @@static int pnpbios_get_resources (struct pnp_dev * dev,struct pnp_resource_table * res) { -struct pnp_dev_node_info node_info;u8 nodenum = dev->number;struct pnp_bios_node * node;/* just in case */ if (!pnpbios_is_dynamic (dev))return -EPERM ; -if (pnp_bios_dev_node_info (&node_info) !=0 ) -return -ENODEV ; + node =pnpbios_kmalloc (node_info.max_node_size,GFP_KERNEL );if (!node)return -1 ; -if (pnp_bios_get_dev_node (&nodenum, (char )0 , node)) { +if (pnp_bios_get_dev_node (&nodenum, (char )PNPMODE_DYNAMIC , node)) {kfree (node);return -ENODEV ; }
@@ -777,7 +823,6 @@static int pnpbios_set_resources (struct pnp_dev * dev,struct pnp_resource_table * res) { -struct pnp_dev_node_info node_info;u8 nodenum = dev->number;struct pnp_bios_node * node;int ret;
@@ -785,18 +830,17 @@/* just in case */ if (!pnpbios_is_dynamic (dev))return -EPERM ; -if (pnp_bios_dev_node_info (&node_info) !=0 ) -return -ENODEV ; + node =pnpbios_kmalloc (node_info.max_node_size,GFP_KERNEL );if (!node)return -1 ; -if (pnp_bios_get_dev_node (&nodenum, (char )1 , node)) +if (pnp_bios_get_dev_node (&nodenum, (char )PNPMODE_STATIC , node))return -ENODEV ;if (!pnp_write_resources ((char *)node->data,(char *)node->data + node->size,res)){kfree (node);return -1 ; } - ret =pnp_bios_set_dev_node (node->handle, (char )0 , node); + ret =pnp_bios_set_dev_node (node->handle, (char )PNPMODE_DYNAMIC , node);kfree (node);if (ret >0 ) ret =-1 ;
@@ -805,23 +849,18 @@static int pnpbios_disable_resources (struct pnp_dev *dev) { -struct pnp_dev_node_info node_info;struct pnp_bios_node * node;int ret;/* just in case */ if (dev->flags &PNPBIOS_NO_DISABLE || !pnpbios_is_dynamic (dev))return -EPERM ; -if (!dev || !dev->active) -return -EINVAL ; -if (pnp_bios_dev_node_info (&node_info) !=0 ) -return -ENODEV ; +/* the value of this will be zero */ node =pnpbios_kmalloc (node_info.max_node_size,GFP_KERNEL );if (!node)return -ENOMEM ; - ret =pnp_bios_set_dev_node (dev->number, (char )0 , node); - dev->active =0 ; + ret =pnp_bios_set_dev_node (dev->number, (char )PNPMODE_DYNAMIC , node);kfree (node);if (ret >0 ) ret =-1 ;
@@ -879,6 +918,8 @@ dev->protocol = &pnpbios_protocol;pnp_add_device (dev); +pnpbios_interface_attach_device (node); +return 0 ; }
@@ -903,8 +944,16 @@for (nodenum=0 ; nodenum<0xff ; ) {u8 thisnodenum = nodenum; -if (pnp_bios_get_dev_node (&nodenum, (char )0 , node)) -break ; +/* eventually we will want to use PNPMODE_STATIC here but for now +* dynamic will help us catch buggy bioses to add to the blacklist. +*/ +if (!pnpbios_dont_use_current_config) { +if (pnp_bios_get_dev_node (&nodenum, (char )PNPMODE_DYNAMIC , node)) +break ; + }else { +if (pnp_bios_get_dev_node (&nodenum, (char )PNPMODE_STATIC , node)) +break ; + } nodes_got++; dev =pnpbios_kmalloc (sizeof (struct pnp_dev ),GFP_KERNEL );if (!dev)
@@ -972,7 +1021,8 @@if (pnpbios_disabled || (dmi_broken &BROKEN_PNP_BIOS )) {printk (KERN_INFO "PnPBIOS: Disabled\n" );return -ENODEV ; - } + }else +printk (KERN_INFO "PnPBIOS: Scanning system for PnP BIOS support...\n" );/* * Search the defined area (0xf0000-0xffff0) for a valid PnP BIOS
@@ -1016,17 +1066,34 @@ }break ; } -if (!pnp_bios_present ()) +if (!pnp_bios_present ()) { +printk (KERN_INFO "PnPBIOS: A PnP BIOS was not detected.\n" );return -ENODEV ; + } + +/* +* we found a pnpbios, now let's load the rest of the driver +*/ + +/* read the node info */ +if (pnp_bios_dev_node_info (&node_info)) { +printk (KERN_ERR "PnPBIOS: Unable to get node info. Aborting.\n" ); +return -EIO ; + } + +/* register with the pnp layer */ pnp_register_protocol (&pnpbios_protocol); -build_devlist (); -/*if ( ! dont_reserve_resources )*/ -/*reserve_resources();*/ +#ifdef CONFIG_PROC_FS +/* start the proc interface */ r =pnpbios_proc_init ();if (r)return r;#endif + +/* scan for pnpbios devices */ +build_devlist (); +return 0 ; }
drivers/pnp/pnpbios/proc.c +25 -40
95 lines not on this page · raw message
include/linux/pnpbios.h +10 -1
@@ -29,7 +29,7 @@#include <linux/pci.h> /* -* Status codes (warnings and errors) +* Return codes */ #define PNP_SUCCESS 0x00#define PNP_NOT_SET_STATICALLY 0x7f
@@ -75,6 +75,7 @@#define PNPMSG_POWER_OFF 0x41#define PNPMSG_PNP_OS_ACTIVE 0x42#define PNPMSG_PNP_OS_INACTIVE 0x43 +/* * Plug and Play BIOS flags */
@@ -88,6 +89,12 @@#define pnpbios_is_static (x) (((x)->flags & 0x0100) == 0x0000)#define pnpbios_is_dynamic (x) ((x)->flags & 0x0080) +/* +* Function Parameters +*/ +#define PNPMODE_STATIC 1 +#define PNPMODE_DYNAMIC 0 +/* 0x8000 through 0xffff are OEM defined */ #pragma pack(1)
@@ -125,8 +132,10 @@/* non-exported */ extern int pnpbios_dont_use_current_config; +extern struct pnp_dev_node_info node_info;extern void *pnpbios_kmalloc (size_t size,int f);extern int pnpbios_init (void ); +extern int pnpbios_interface_attach_device (struct pnp_bios_node * node);extern int pnpbios_proc_init (void );extern void pnpbios_proc_exit (void );
sound/isa/dt019x.c +105 -146
@@ -25,11 +25,7 @@#include <linux/init.h> #include <linux/sched.h> #include <linux/wait.h> -#ifndef LINUX_ISAPNP_H -#include <linux/isapnp.h> -#define isapnp_card pci_bus -#define isapnp_dev pci_dev -#endif +#include <linux/pnp.h> #include <sound/core.h> #define SNDRV_GET_ID #include <sound/initval.h>
@@ -87,159 +83,124 @@MODULE_PARM_SYNTAX (dma8,SNDRV_DMA8_DESC );struct snd_card_dt019x { -#ifdef __ISAPNP__ -struct isapnp_dev *dev; -struct isapnp_dev *devmpu; -struct isapnp_dev *devopl; -#endif /* __ISAPNP__ */ +struct pnp_dev *dev; +struct pnp_dev *devmpu; +struct pnp_dev *devopl; }; -static snd_card_t *snd_dt019x_cards[SNDRV_CARDS ] =SNDRV_DEFAULT_PTR ; - -#ifdef __ISAPNP__ -static struct isapnp_card *snd_dt019x_isapnp_cards[SNDRV_CARDS ]__devinitdata =SNDRV_DEFAULT_PTR ; -static const struct isapnp_card_id *snd_dt019x_isapnp_id[SNDRV_CARDS ]__devinitdata =SNDRV_DEFAULT_PTR ; - -static struct isapnp_card_id snd_dt019x_pnpids[]__devinitdata = { +static struct pnp_card_device_id snd_dt019x_pnpids[]__devinitdata = {/* DT197A30 */ - { -ISAPNP_CARD_ID ('R' ,'W' ,'B' ,0x1688 ), - .devs = {ISAPNP_DEVICE_ID ('@' ,'@' ,'@' ,0x0001 ), -ISAPNP_DEVICE_ID ('@' ,'X' ,'@' ,0x0001 ), -ISAPNP_DEVICE_ID ('@' ,'H' ,'@' ,0x0001 ) } - }, + { .id ="RWB1688" , .devs = { {"@@@0001" }, {"@X@0001" }, {"@H@0001" }, } },/* DT0196 / ALS-007 */ - { -ISAPNP_CARD_ID ('A' ,'L' ,'S' ,0x0007 ), - .devs = {ISAPNP_DEVICE_ID ('@' ,'@' ,'@' ,0x0001 ), -ISAPNP_DEVICE_ID ('@' ,'X' ,'@' ,0x0001 ), -ISAPNP_DEVICE_ID ('@' ,'H' ,'@' ,0x0001 ) } - }, - {ISAPNP_CARD_END , } + { .id ="ALS0007" , .devs = { {"@@@0001" }, {"@X@0001" }, {"@H@0001" }, } }, + { .id ="" , } }; -ISAPNP_CARD_TABLE (snd_dt019x_pnpids); +MODULE_DEVICE_TABLE (pnp_card, snd_dt019x_pnpids); -#endif /* __ISAPNP__ */ #define DRIVER_NAME "snd-card-dt019x" -#ifdef __ISAPNP__ -static int __init snd_card_dt019x_isapnp (int dev,struct snd_card_dt019x *acard) +static int __init snd_card_dt019x_isapnp (int dev,struct snd_card_dt019x *acard, +struct pnp_card_link *card, +const struct pnp_card_device_id *pid) { -const struct isapnp_card_id *id = snd_dt019x_isapnp_id[dev]; -struct isapnp_card *card = snd_dt019x_isapnp_cards[dev]; -struct isapnp_dev *pdev; - - acard->dev =isapnp_find_dev (card, id->devs[0 ].vendor, id->devs[0 ].function,NULL ); -if (acard->dev->active) { - acard->dev =NULL ; -return -EBUSY ; - } - acard->devmpu =isapnp_find_dev (card, id->devs[1 ].vendor, id->devs[1 ].function,NULL ); -if (acard->devmpu->active) { - acard->dev = acard->devmpu =NULL ; -return -EBUSY ; - } - acard->devopl =isapnp_find_dev (card, id->devs[2 ].vendor, id->devs[2 ].function,NULL ); -if (acard->devopl->active) { - acard->dev = acard->devmpu = acard->devopl =NULL ; -return -EBUSY ; +struct pnp_dev *pdev; +struct pnp_resource_table * cfg =kmalloc (sizeof (struct pnp_resource_table ),GFP_KERNEL ); +int err; + +if (!cfg) +return -ENOMEM ; + + acard->dev =pnp_request_card_device (card, pid->devs[0 ].id,NULL ); +if (acard->dev ==NULL ) { +kfree (cfg); +return -ENODEV ; } + acard->devmpu =pnp_request_card_device (card, pid->devs[1 ].id,NULL ); + acard->devopl =pnp_request_card_device (card, pid->devs[2 ].id,NULL ); pdev = acard->dev; -if (!pdev || pdev->prepare (pdev)<0 ) -return -EAGAIN ; +pnp_init_resource_table (cfg);if (port[dev] !=SNDRV_AUTO_PORT ) -isapnp_resource_change (&pdev->resource[0 ], port[dev],16 ); +pnp_resource_change (&cfg->port_resource[0 ], port[dev],16 );if (dma8[dev] !=SNDRV_AUTO_DMA ) -isapnp_resource_change (&pdev->dma_resource[0 ], dma8[dev], +pnp_resource_change (&cfg->dma_resource[0 ], dma8[dev],1 );if (irq[dev] !=SNDRV_AUTO_IRQ ) -isapnp_resource_change (&pdev->irq_resource[0 ], irq[dev],1 ); +pnp_resource_change (&cfg->irq_resource[0 ], irq[dev],1 ); -if (pdev->activate (pdev)<0 ) { - printk(KERN_ERR PFX "DT-019X AUDIO isapnp configure failure\n"); -return -EBUSY ; - } - port[dev] = pdev->resource[0 ].start; - dma8[dev] = pdev->dma_resource[0 ].start; - irq[dev] = pdev->irq_resource[0 ].start; +if ((pnp_manual_config_dev (pdev, cfg,0 )) <0 ) + printk(KERN_ERR PFX "DT-019X AUDIO the requested resources are invalid, using auto config\n"); + err =pnp_activate_dev (pdev); +if (err <0 ) { + printk(KERN_ERR PFX "DT-019X AUDIO pnp configure failure\n"); +kfree (cfg); +return err; + } + + port[dev] =pnp_port_start (pdev,0 ); + dma8[dev] =pnp_dma (pdev,0 ); + irq[dev] =pnp_irq (pdev,0 );snd_printdd ("dt019x: found audio interface: port=0x%lx, irq=0x%lx, dma=0x%lx\n" , port[dev],irq[dev],dma8[dev]); pdev = acard->devmpu; -if (!pdev || pdev->prepare (pdev)<0 ) -return 0 ; - -if (mpu_port[dev] !=SNDRV_AUTO_PORT ) -isapnp_resource_change (&pdev->resource[0 ], mpu_port[dev], -2 ); -if (mpu_irq[dev] !=SNDRV_AUTO_IRQ ) -isapnp_resource_change (&pdev->irq_resource[0 ], mpu_irq[dev], -1 ); -if (pdev->activate (pdev)<0 ) { - printk(KERN_ERR PFX "DT-019X MPU-401 isapnp configure failure\n"); - mpu_port[dev] =-1 ; - acard->devmpu =NULL ; - }else { - mpu_port[dev] = pdev->resource[0 ].start; - mpu_irq[dev] = pdev->irq_resource[0 ].start; +if (pdev !=NULL ) { +pnp_init_resource_table (cfg); +if (mpu_port[dev] !=SNDRV_AUTO_PORT ) +pnp_resource_change (&cfg->port_resource[0 ], mpu_port[dev],2 ); +if (mpu_irq[dev] !=SNDRV_AUTO_IRQ ) +pnp_resource_change (&cfg->irq_resource[0 ], mpu_irq[dev],1 ); +if ((pnp_manual_config_dev (pdev, cfg,0 )) <0 ) + printk(KERN_ERR PFX "DT-019X MPU401 the requested resources are invalid, using auto config\n"); + err =pnp_activate_dev (pdev); +if (err <0 ) + goto __mpu_error; + mpu_port[dev] =pnp_port_start (pdev,0 ); + mpu_irq[dev] =pnp_irq (pdev,0 );snd_printdd ("dt019x: found MPU-401: port=0x%lx, irq=0x%lx\n" , mpu_port[dev],mpu_irq[dev]); + }else { + __mpu_error: +if (pdev) { +pnp_release_card_device (pdev); + printk(KERN_ERR PFX "DT-019X MPU401 pnp configure failure, skipping\n"); + } + acard->devmpu =NULL ; + mpu_port[dev] =-1 ; } pdev = acard->devopl; -if (!pdev || pdev->prepare (pdev)<0 ) -return 0 ; - -if (fm_port[dev] !=SNDRV_AUTO_PORT ) -isapnp_resource_change (&pdev->resource[0 ], fm_port[dev],4 ); - -if (pdev->activate (pdev)<0 ) { - printk(KERN_ERR PFX "DT-019X OPL3 isapnp configure failure\n"); - fm_port[dev] =-1 ; - acard->devopl =NULL ; - }else { - fm_port[dev] = pdev->resource[0 ].start; +if (pdev !=NULL ) { +pnp_init_resource_table (cfg); +if (fm_port[dev] !=SNDRV_AUTO_PORT ) +pnp_resource_change (&cfg->port_resource[0 ], fm_port[dev],4 ); +if ((pnp_manual_config_dev (pdev, cfg,0 )) <0 ) + printk(KERN_ERR PFX "DT-019X OPL3 the requested resources are invalid, using auto config\n"); + err =pnp_activate_dev (pdev); +if (err <0 ) + goto __fm_error; + fm_port[dev] =pnp_port_start (pdev,0 );snd_printdd ("dt019x: found OPL3 synth: port=0x%lx\n" ,fm_port[dev]); - } - -return 0 ; -} - -static void snd_card_dt019x_deactivate (struct snd_card_dt019x *acard) -{ -if (acard->dev) { - acard->dev->deactivate (acard->dev); - acard->dev =NULL ; - } -if (acard->devmpu) { - acard->devmpu->deactivate (acard->devmpu); - acard->devmpu =NULL ; - } -if (acard->devopl) { - acard->devopl->deactivate (acard->devopl); + }else { + __fm_error: +if (pdev) { +pnp_release_card_device (pdev); + printk(KERN_ERR PFX "DT-019X OPL3 pnp configure failure, skipping\n"); + } acard->devopl =NULL ; + fm_port[dev] =-1 ; } -} -#endif /* __ISAPNP__ */ -static void snd_card_dt019x_free (snd_card_t *card) -{ -struct snd_card_dt019x *acard = (struct snd_card_dt019x *)card->private_data; - -if (acard !=NULL ) { -#ifdef __ISAPNP__ -snd_card_dt019x_deactivate (acard); -#endif /* __ISAPNP__ */ - } +kfree (cfg); +return 0 ; } -static int __init snd_card_dt019x_probe (int dev) +static int __init snd_card_dt019x_probe (int dev,struct pnp_card_link *pcard,const struct pnp_card_device_id *pid) {int error;sb_t *chip;
@@ -251,18 +212,11 @@ sizeof(struct snd_card_dt019x))) == NULL)return -ENOMEM ; acard = (struct snd_card_dt019x *)card->private_data; - card->private_free = snd_card_dt019x_free; -#ifdef __ISAPNP__ -if ((error =snd_card_dt019x_isapnp (dev, acard))) { +if ((error =snd_card_dt019x_isapnp (dev, acard, pcard, pid))) {snd_card_free (card);return error; } -#else - printk(KERN_ERR PFX "you have to enable PnP support ...\n"); -snd_card_free (card); -return -ENOSYS ; -#endif /* __ISAPNP__ */ if ((error = snd_sbdsp_create(card, port[dev], irq[dev],
@@ -324,13 +278,12 @@snd_card_free (card);return error; } - snd_dt019x_cards[dev] = card; +pnp_set_card_drvdata (pcard, card);return 0 ; } -#ifdef __ISAPNP__ -static int __init snd_dt019x_isapnp_detect (struct isapnp_card *card, -const struct isapnp_card_id *id) +static int __init snd_dt019x_pnp_probe (struct pnp_card_link *card, +const struct pnp_card_device_id *pid) {static int dev;int res;
@@ -338,9 +291,7 @@for ( ; dev <SNDRV_CARDS ; dev++) {if (!enable[dev])continue ; - snd_dt019x_isapnp_cards[dev] = card; - snd_dt019x_isapnp_id[dev] = id; - res =snd_card_dt019x_probe (dev); + res =snd_card_dt019x_probe (dev, card, pid);if (res <0 )return res; dev++;
@@ -348,17 +299,28 @@ }return -ENODEV ; } -#endif /* __ISAPNP__ */ + +static void __devexit snd_dt019x_pnp_remove(struct pnp_card_link * pcard) +{ +snd_card_t *card = (snd_card_t *)pnp_get_card_drvdata (pcard); +snd_card_disconnect (card); +snd_card_free_in_thread (card); +} + +static struct pnp_card_driver dt019x_pnpc_driver = { + .flags =PNP_DRIVER_RES_DISABLE , + .name ="dt019x" , + .id_table = snd_dt019x_pnpids, + .probe = snd_dt019x_pnp_probe, + .remove =__devexit_p (snd_dt019x_pnp_remove), +};static int __init alsa_card_dt019x_init (void ) {int cards =0 ; -#ifdef __ISAPNP__ - cards +=isapnp_probe_cards (snd_dt019x_pnpids, snd_dt019x_isapnp_detect); -#else - printk(KERN_ERR PFX "you have to enable ISA PnP support.\n"); -#endif + cards +=pnp_register_card_driver (&dt019x_pnpc_driver); +#ifdef MODULE if (!cards)printk (KERN_ERR "no DT-019X / ALS-007 based soundcards found\n" );
@@ -368,10 +330,7 @@ static void __exit alsa_card_dt019x_exit(void) { -int dev; - -for (dev =0 ; dev <SNDRV_CARDS ; dev++) -snd_card_free (snd_dt019x_cards[dev]); +pnp_unregister_card_driver (&dt019x_pnpc_driver); }module_init (alsa_card_dt019x_init)
sound/isa/azt2320.c +101 -129
@@ -36,11 +36,7 @@#include <linux/init.h> #include <linux/time.h> #include <linux/wait.h> -#ifndef LINUX_ISAPNP_H -#include <linux/isapnp.h> -#define isapnp_card pci_bus -#define isapnp_dev pci_dev -#endif +#include <linux/pnp.h> #include <sound/core.h> #define SNDRV_GET_ID #include <sound/initval.h>
@@ -109,134 +105,112 @@MODULE_PARM_SYNTAX (dma2,SNDRV_DMA_DESC );struct snd_card_azt2320 { -#ifdef __ISAPNP__ -struct isapnp_dev *dev; -struct isapnp_dev *devmpu; -#endif /* __ISAPNP__ */ +#ifdef CONFIG_PNP +int dev_no; +struct pnp_dev *dev; +struct pnp_dev *devmpu; +#endif /* CONFIG_PNP */ }; -static snd_card_t *snd_azt2320_cards[SNDRV_CARDS ] =SNDRV_DEFAULT_PTR ; - -#ifdef __ISAPNP__ - -static struct isapnp_card *snd_azt2320_isapnp_cards[SNDRV_CARDS ]__devinitdata =SNDRV_DEFAULT_PTR ; -static const struct isapnp_card_id *snd_azt2320_isapnp_id[SNDRV_CARDS ]__devinitdata =SNDRV_DEFAULT_PTR ; - -#define ISAPNP_AZT2320 (_va, _vb, _vc, _device, _audio, _mpu401) \ - { \ - ISAPNP_CARD_ID(_va, _vb, _vc, _device), \ - .devs = { ISAPNP_DEVICE_ID(_va, _vb, _vc, _audio), \ - ISAPNP_DEVICE_ID(_va, _vb, _vc, _mpu401), } \ - } - -static struct isapnp_card_id snd_azt2320_pnpids[]__devinitdata = { +static struct pnp_card_device_id snd_azt2320_pnpids[]__devinitdata = {/* PRO16V */ -ISAPNP_AZT2320 ('A' ,'Z' ,'T' ,0x1008 ,0x1008 ,0x2001 ), + { .id ="AZT1008" , .devs = { {"AZT1008" }, {"AZT2001" }, } },/* Aztech Sound Galaxy 16 */ -ISAPNP_AZT2320 ('A' ,'Z' ,'T' ,0x2320 ,0x0001 ,0x0002 ), + { .id ="AZT2320" , .devs = { {"AZT0001" }, {"AZT0002" }, } },/* Packard Bell Sound III 336 AM/SP */ -ISAPNP_AZT2320 ('A' ,'Z' ,'T' ,0x3000 ,0x1003 ,0x2001 ), + { .id ="AZT3000" , .devs = { {"AZT1003" }, {"AZT2001" }, } },/* AT3300 */ -ISAPNP_AZT2320 ('A' ,'Z' ,'T' ,0x3002 ,0x1004 ,0x2001 ), + { .id ="AZT3002" , .devs = { {"AZT1004" }, {"AZT2001" }, } },/* --- */ -ISAPNP_AZT2320 ('A' ,'Z' ,'T' ,0x3005 ,0x1003 ,0x2001 ), + { .id ="AZT3005" , .devs = { {"AZT1003" }, {"AZT2001" }, } },/* --- */ -ISAPNP_AZT2320 ('A' ,'Z' ,'T' ,0x3011 ,0x1003 ,0x2001 ), - {ISAPNP_CARD_END , }/* end */ + { .id ="AZT3011" , .devs = { {"AZT1003" }, {"AZT2001" }, } }, + { .id ="" }/* end */ }; -ISAPNP_CARD_TABLE (snd_azt2320_pnpids); - -#endif /* __ISAPNP__ */ +MODULE_DEVICE_TABLE (pnp_card, snd_azt2320_pnpids);#define DRIVER_NAME "snd-card-azt2320" - -#ifdef __ISAPNP__ -static int __init snd_card_azt2320_isapnp (int dev,struct snd_card_azt2320 *acard) +static int __init snd_card_azt2320_isapnp (int dev,struct snd_card_azt2320 *acard, +struct pnp_card_link *card, +const struct pnp_card_device_id *id) { -const struct isapnp_card_id *id = snd_azt2320_isapnp_id[dev]; -struct isapnp_card *card = snd_azt2320_isapnp_cards[dev]; -struct isapnp_dev *pdev; - - acard->dev =isapnp_find_dev (card, id->devs[0 ].vendor, id->devs[0 ].function,NULL ); -if (acard->dev->active) { - acard->dev =NULL ; -return -EBUSY ; - } - acard->devmpu =isapnp_find_dev (card, id->devs[1 ].vendor, id->devs[1 ].function,NULL ); -if (acard->devmpu->active) { - acard->dev = acard->devmpu =NULL ; -return -EBUSY ; +struct pnp_dev *pdev; +struct pnp_resource_table * cfg =kmalloc (sizeof (struct pnp_resource_table ),GFP_KERNEL ); +int err; + +if (!cfg) +return -ENOMEM ; + + acard->dev =pnp_request_card_device (card, id->devs[0 ].id,NULL ); +if (acard->dev ==NULL ) { +kfree (cfg); +return -ENODEV ; } + acard->devmpu =pnp_request_card_device (card, id->devs[1 ].id,NULL ); + pdev = acard->dev; -if (pdev->prepare (pdev) <0 ) -return -EAGAIN ; +pnp_init_resource_table (cfg); +/* override resources */ if (port[dev] !=SNDRV_AUTO_PORT ) -isapnp_resource_change (&pdev->resource[0 ], port[dev],16 ); +pnp_resource_change (&cfg->port_resource[0 ], port[dev],16 );if (fm_port[dev] !=SNDRV_AUTO_PORT ) -isapnp_resource_change (&pdev->resource[1 ], fm_port[dev],4 ); +pnp_resource_change (&cfg->port_resource[1 ], fm_port[dev],4 );if (wss_port[dev] !=SNDRV_AUTO_PORT ) -isapnp_resource_change (&pdev->resource[2 ], wss_port[dev], -4 ); +pnp_resource_change (&cfg->port_resource[2 ], wss_port[dev],4 );if (dma1[dev] !=SNDRV_AUTO_DMA ) -isapnp_resource_change (&pdev->dma_resource[0 ], dma1[dev], -1 ); +pnp_resource_change (&cfg->dma_resource[0 ], dma1[dev],1 );if (dma2[dev] !=SNDRV_AUTO_DMA ) -isapnp_resource_change (&pdev->dma_resource[1 ], dma2[dev], -1 ); +pnp_resource_change (&cfg->dma_resource[1 ], dma2[dev],1 );if (irq[dev] !=SNDRV_AUTO_IRQ ) -isapnp_resource_change (&pdev->irq_resource[0 ], irq[dev],1 ); - -if (pdev->activate (pdev) <0 ) { - printk(KERN_ERR PFX "AUDIO isapnp configure failure\n"); -return -EBUSY ; - } - - port[dev] = pdev->resource[0 ].start; - fm_port[dev] = pdev->resource[1 ].start; - wss_port[dev] = pdev->resource[2 ].start; - dma1[dev] = pdev->dma_resource[0 ].start; - dma2[dev] = pdev->dma_resource[1 ].start; - irq[dev] = pdev->irq_resource[0 ].start; +pnp_resource_change (&cfg->irq_resource[0 ], irq[dev],1 ); +if ((pnp_manual_config_dev (pdev, cfg,0 )) <0 ) + printk(KERN_ERR PFX "AUDIO the requested resources are invalid, using auto config\n"); + + err =pnp_activate_dev (pdev); +if (err <0 ) { + printk(KERN_ERR PFX "AUDIO pnp configure failure\n"); +kfree (cfg); +return err; + } + port[dev] =pnp_port_start (pdev,0 ); + fm_port[dev] =pnp_port_start (pdev,1 ); + wss_port[dev] =pnp_port_start (pdev,2 ); + dma1[dev] =pnp_dma (pdev,0 ); + dma2[dev] =pnp_dma (pdev,1 ); + irq[dev] =pnp_irq (pdev,0 ); pdev = acard->devmpu; -if (pdev ==NULL || pdev->prepare (pdev) <0 ) { - mpu_port[dev] =-1 ; -return 0 ; - } - -if (mpu_port[dev] !=SNDRV_AUTO_PORT ) -isapnp_resource_change (&pdev->resource[0 ], mpu_port[dev], -2 ); -if (mpu_irq[dev] !=SNDRV_AUTO_IRQ ) -isapnp_resource_change (&pdev->irq_resource[0 ], mpu_irq[dev], -1 ); - -if (pdev->activate (pdev) <0 ) { -/* not fatal error */ - printk(KERN_ERR PFX "MPU-401 isapnp configure failure\n"); - mpu_port[dev] =-1 ; - acard->devmpu =NULL ; +if (pdev !=NULL ) { +pnp_init_resource_table (cfg); +if (mpu_port[dev] !=SNDRV_AUTO_PORT ) +pnp_resource_change (&cfg->port_resource[0 ], mpu_port[dev],2 ); +if (mpu_irq[dev] !=SNDRV_AUTO_IRQ ) +pnp_resource_change (&cfg->irq_resource[0 ], mpu_irq[dev],1 ); +if ((pnp_manual_config_dev (pdev, cfg,0 )) <0 ) + printk(KERN_ERR PFX "MPU401 the requested resources are invalid, using auto config\n"); + err =pnp_activate_dev (pdev); +if (err <0 ) + goto __mpu_error; + mpu_port[dev] =pnp_port_start (pdev,0 ); + mpu_irq[dev] =pnp_irq (pdev,0 ); }else { - mpu_port[dev] = pdev->resource[0 ].start; - mpu_irq[dev] = pdev->irq_resource[0 ].start; + __mpu_error: +if (pdev) { +pnp_release_card_device (pdev); + printk(KERN_ERR PFX "MPU401 pnp configure failure, skipping\n"); + } + acard->devmpu =NULL ; + mpu_port[dev] =-1 ; } +kfree (cfg);return 0 ; } -static void snd_card_azt2320_deactivate (struct snd_card_azt2320 *acard) -{ -if (acard->dev) - acard->dev->deactivate (acard->dev); -if (acard->devmpu) - acard->devmpu->deactivate (acard->devmpu); -} -#endif /* __ISAPNP__ */ -/* same of snd_sbdsp_command by Jaroslav Kysela */ static int __init snd_card_azt2320_command (unsigned long port,unsigned char val) {
@@ -265,18 +239,9 @@return 0 ; } -static void snd_card_azt2320_free (snd_card_t *card) -{ -struct snd_card_azt2320 *acard = (struct snd_card_azt2320 *)card->private_data; - -if (acard) { -#ifdef __ISAPNP__ -snd_card_azt2320_deactivate (acard); -#endif /* __ISAPNP__ */ - } -} - -static int __init snd_card_azt2320_probe (int dev) +static int __init snd_card_azt2320_probe (int dev, +struct pnp_card_link *pcard, +const struct pnp_card_device_id *pid) {int error;snd_card_t *card;
@@ -288,14 +253,11 @@ sizeof(struct snd_card_azt2320))) == NULL)return -ENOMEM ; acard = (struct snd_card_azt2320 *)card->private_data; - card->private_free = snd_card_azt2320_free; -#ifdef __ISAPNP__ -if ((error =snd_card_azt2320_isapnp (dev, acard))) { +if ((error =snd_card_azt2320_isapnp (dev, acard, pcard, pid))) {snd_card_free (card);return error; } -#endif /* __ISAPNP__ */ if ((error =snd_card_azt2320_enable_wss (port[dev]))) {snd_card_free (card);
@@ -360,13 +322,12 @@snd_card_free (card);return error; } - snd_azt2320_cards[dev] = card; +pnp_set_card_drvdata (pcard, card);return 0 ; } -#ifdef __ISAPNP__ -static int __init snd_azt2320_isapnp_detect (struct isapnp_card *card, -const struct isapnp_card_id *id) +static int __init snd_azt2320_pnp_detect (struct pnp_card_link *card, +const struct pnp_card_device_id *id) {static int dev;int res;
@@ -374,9 +335,7 @@for ( ; dev <SNDRV_CARDS ; dev++) {if (!enable[dev])continue ; - snd_azt2320_isapnp_cards[dev] = card; - snd_azt2320_isapnp_id[dev] = id; - res =snd_card_azt2320_probe (dev); + res =snd_card_azt2320_probe (dev,card,id);if (res <0 )return res; dev++;
@@ -384,7 +343,22 @@ }return -ENODEV ; } -#endif + +static void __devexit snd_azt2320_pnp_remove(struct pnp_card_link * pcard) +{ +snd_card_t *card = (snd_card_t *)pnp_get_card_drvdata (pcard); + +snd_card_disconnect (card); +snd_card_free_in_thread (card); +} + +static struct pnp_card_driver azt2320_pnpc_driver = { + .flags =PNP_DRIVER_RES_DISABLE , + .name ="azt2320" , + .id_table = snd_azt2320_pnpids, + .probe = snd_azt2320_pnp_detect, + .remove =__devexit_p (snd_azt2320_pnp_remove), +};static int __init alsa_card_azt2320_init (void ) {
@@ -395,6 +369,7 @@#else printk(KERN_ERR PFX "you have to enable ISA PnP support.\n");#endif + cards +=pnp_register_card_driver (&azt2320_pnpc_driver);#ifdef MODULE if (!cards)printk (KERN_ERR "no AZT2320 based soundcards found\n" );
@@ -404,10 +379,7 @@ static void __exit alsa_card_azt2320_exit(void) { -int dev; - -for (dev =0 ; dev <SNDRV_CARDS ; dev++) -snd_card_free (snd_azt2320_cards[dev]); +pnp_unregister_card_driver (&azt2320_pnpc_driver); }module_init (alsa_card_azt2320_init)
sound/isa/als100.c +1 -1
@@ -121,7 +121,7 @@ const struct pnp_card_device_id *id) {struct pnp_dev *pdev; -struct pnp_resource_table * cfg =kmalloc (GFP_ATOMIC ,sizeof (struct pnp_resource_table )); +struct pnp_resource_table *cfg =kmalloc (sizeof (*cfg),GFP_KERNEL );int err;if (!cfg)return -ENOMEM ;
sound/isa/sb/es968.c +1 -1
@@ -95,7 +95,7 @@ const struct pnp_card_device_id *id) {struct pnp_dev *pdev; -struct pnp_resource_table * cfg =kmalloc (GFP_ATOMIC ,sizeof (struct pnp_resource_table )); +struct pnp_resource_table *cfg =kmalloc (sizeof (*cfg),GFP_KERNEL );int err;if (!cfg)return -ENOMEM ;
drivers/pnp/core.c +1 -1
@@ -170,7 +170,7 @@static int __init pnp_init (void ) { -printk (KERN_INFO "Linux Plug and Play Support v0.95 (c) Adam Belay\n" ); +printk (KERN_INFO "Linux Plug and Play Support v0.96 (c) Adam Belay\n" );return bus_register (&pnp_bus_type); }
sound/isa/sb/sb16.c +188 -192
@@ -23,11 +23,7 @@#include <asm/dma.h> #include <linux/init.h> #include <linux/slab.h> -#ifndef LINUX_ISAPNP_H -#include <linux/isapnp.h> -#define isapnp_card pci_bus -#define isapnp_dev pci_dev -#endif +#include <linux/pnp.h> #include <sound/core.h> #include <sound/sb.h> #include <sound/sb16_csp.h>
@@ -77,7 +73,7 @@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_ISAPNP ;/* Enable this card */ -#ifdef __ISAPNP__ +#ifdef CONFIG_PNP static int isapnp[SNDRV_CARDS ] = {[0 ... (SNDRV_CARDS -1 )] =1 };#endif static long port[SNDRV_CARDS ] =SNDRV_DEFAULT_PORT ;/* 0x220,0x240,0x260,0x280 */
@@ -106,10 +102,10 @@ MODULE_PARM(enable, "1-" __MODULE_STRING(SNDRV_CARDS) "i");MODULE_PARM_DESC (enable,"Enable SoundBlaster 16 soundcard." );MODULE_PARM_SYNTAX (enable,SNDRV_ENABLE_DESC ); -#ifdef __ISAPNP__ -MODULE_PARM(isapnp, "1-" __MODULE_STRING(SNDRV_CARDS) "i"); -MODULE_PARM_DESC (isapnp,"ISA PnP detection for specified soundcard." ); -MODULE_PARM_SYNTAX (isapnp,SNDRV_ISAPNP_DESC ); +#ifdef CONFIG_PNP +MODULE_PARM(pnp, "1-" __MODULE_STRING(SNDRV_CARDS) "i"); +MODULE_PARM_DESC (pnp,"PnP detection for specified soundcard." ); +MODULE_PARM_SYNTAX (pnp,SNDRV_ISAPNP_DESC );#endif MODULE_PARM(port, "1-" __MODULE_STRING(SNDRV_CARDS) "l");MODULE_PARM_DESC (port,"Port # for SB16 driver." );
@@ -148,231 +144,211 @@MODULE_PARM_SYNTAX (seq_ports,SNDRV_ENABLED ",allows:{{0,8}},skill:advanced" );#endif -struct snd_sb16 { +struct snd_card_sb16 {struct resource *fm_res;/* used to block FM i/o region for legacy cards */ -#ifdef __ISAPNP__ -struct isapnp_dev *dev; +#ifdef CONFIG_PNP +int dev_no; +struct pnp_dev *dev;#ifdef SNDRV_SBAWE_EMU8000 -struct isapnp_dev *devwt; +struct pnp_dev *devwt;#endif #endif }; -static snd_card_t *snd_sb16_cards[SNDRV_CARDS ] =SNDRV_DEFAULT_PTR ; - -#ifdef __ISAPNP__ - -static struct isapnp_card *snd_sb16_isapnp_cards[SNDRV_CARDS ] =SNDRV_DEFAULT_PTR ; -static const struct isapnp_card_id *snd_sb16_isapnp_id[SNDRV_CARDS ] =SNDRV_DEFAULT_PTR ; - -#define ISAPNP_SB16 (_va, _vb, _vc, _device, _audio) \ - { \ - ISAPNP_CARD_ID(_va, _vb, _vc, _device), \ - .devs = { ISAPNP_DEVICE_ID(_va, _vb, _vc, _audio), } \ - } -#define ISAPNP_SBAWE (_va, _vb, _vc, _device, _audio, _awe) \ - { \ - ISAPNP_CARD_ID(_va, _vb, _vc, _device), \ - .devs = { ISAPNP_DEVICE_ID(_va, _vb, _vc, _audio), \ - ISAPNP_DEVICE_ID(_va, _vb, _vc, _awe), } \ - } +static snd_card_t *snd_sb16_legacy[SNDRV_CARDS ] =SNDRV_DEFAULT_PTR ; -static struct isapnp_card_id snd_sb16_pnpids[]__devinitdata = { +static struct pnp_card_device_id snd_sb16_pnpids[]__devinitdata = { #ifndef SNDRV_SBAWE/* Sound Blaster 16 PnP */ -ISAPNP_SB16 ('C' ,'T' ,'L' ,0x0024 ,0x0031 ), + { .id ="CTL0024" , .devs = { {"CTL0031" } } },/* Sound Blaster 16 PnP */ -ISAPNP_SB16 ('C' ,'T' ,'L' ,0x0025 ,0x0031 ), + { .id ="CTL0025" , .devs = { {"CTL0031" } } },/* Sound Blaster 16 PnP */ -ISAPNP_SB16 ('C' ,'T' ,'L' ,0x0026 ,0x0031 ), + { .id ="CTL0026" , .devs = { {"CTL0031" } } },/* Sound Blaster 16 PnP */ -ISAPNP_SB16 ('C' ,'T' ,'L' ,0x0027 ,0x0031 ), + { .id ="CTL0027" , .devs = { {"CTL0031" } } },/* Sound Blaster 16 PnP */ -ISAPNP_SB16 ('C' ,'T' ,'L' ,0x0028 ,0x0031 ), + { .id ="CTL0028" , .devs = { {"CTL0031" } } },/* Sound Blaster 16 PnP */ -ISAPNP_SB16 ('C' ,'T' ,'L' ,0x0029 ,0x0031 ), + { .id ="CTL0029" , .devs = { {"CTL0031" } } },/* Sound Blaster 16 PnP */ -ISAPNP_SB16 ('C' ,'T' ,'L' ,0x002a ,0x0031 ), + { .id ="CTL002a" , .devs = { {"CTL0031" } } },/* Sound Blaster 16 PnP */ /* Note: This card has also a CTL0051:StereoEnhance device!!! */ -ISAPNP_SB16 ('C' ,'T' ,'L' ,0x002b ,0x0031 ), + { .id ="CTL002b" , .devs = { {"CTL0031" } } },/* Sound Blaster 16 PnP */ -ISAPNP_SB16 ('C' ,'T' ,'L' ,0x002c ,0x0031 ), + { .id ="CTL002c" , .devs = { {"CTL0031" } } },/* Sound Blaster Vibra16S */ -ISAPNP_SB16 ('C' ,'T' ,'L' ,0x0051 ,0x0001 ), + { .id ="CTL0051" , .devs = { {"CTL0001" } } },/* Sound Blaster Vibra16C */ -ISAPNP_SB16 ('C' ,'T' ,'L' ,0x0070 ,0x0001 ), + { .id ="CTL0070" , .devs = { {"CTL0001" } } },/* Sound Blaster Vibra16CL - added by [email protected] */ -ISAPNP_SB16 ('C' ,'T' ,'L' ,0x0080 ,0x0041 ), + { .id ="CTL0080" , .devs = { {"CTL0041" } } },/* Sound Blaster 16 'value' PnP. It says model ct4130 on the pcb, */ /* but ct4131 on a sticker on the board.. */ -ISAPNP_SB16 ('C' ,'T' ,'L' ,0x0086 ,0x0041 ), + { .id ="CTL0086" , .devs = { {"CTL0041" } } },/* Sound Blaster Vibra16X */ -ISAPNP_SB16 ('C' ,'T' ,'L' ,0x00f0 ,0x0043 ), + { .id ="CTL00f0" , .devs = { {"CTL0043" } } }, #else /* SNDRV_SBAWE defined *//* Sound Blaster AWE 32 PnP */ -ISAPNP_SBAWE ('C' ,'T' ,'L' ,0x0035 ,0x0031 ,0x0021 ), + { .id ="CTL0035" , .devs = { {"CTL0031" }, {"CTL0021" } } },/* Sound Blaster AWE 32 PnP */ -ISAPNP_SBAWE ('C' ,'T' ,'L' ,0x0039 ,0x0031 ,0x0021 ), + { .id ="CTL0039" , .devs = { {"CTL0031" }, {"CTL0021" } } },/* Sound Blaster AWE 32 PnP */ -ISAPNP_SBAWE ('C' ,'T' ,'L' ,0x0042 ,0x0031 ,0x0021 ), + { .id ="CTL0042" , .devs = { {"CTL0031" }, {"CTL0021" } } },/* Sound Blaster AWE 32 PnP */ -ISAPNP_SBAWE ('C' ,'T' ,'L' ,0x0043 ,0x0031 ,0x0021 ), + { .id ="CTL0043" , .devs = { {"CTL0031" }, {"CTL0021" } } },/* Sound Blaster AWE 32 PnP */ /* Note: This card has also a CTL0051:StereoEnhance device!!! */ -ISAPNP_SBAWE ('C' ,'T' ,'L' ,0x0044 ,0x0031 ,0x0021 ), + { .id ="CTL0044" , .devs = { {"CTL0031" }, {"CTL0021" } } },/* Sound Blaster AWE 32 PnP */ /* Note: This card has also a CTL0051:StereoEnhance device!!! */ -ISAPNP_SBAWE ('C' ,'T' ,'L' ,0x0045 ,0x0031 ,0x0021 ), + { .id ="CTL0045" , .devs = { {"CTL0031" }, {"CTL0021" } } },/* Sound Blaster AWE 32 PnP */ -ISAPNP_SBAWE ('C' ,'T' ,'L' ,0x0046 ,0x0031 ,0x0021 ), + { .id ="CTL0046" , .devs = { {"CTL0031" }, {"CTL0021" } } },/* Sound Blaster AWE 32 PnP */ -ISAPNP_SBAWE ('C' ,'T' ,'L' ,0x0047 ,0x0031 ,0x0021 ), + { .id ="CTL0047" , .devs = { {"CTL0031" }, {"CTL0021" } } },/* Sound Blaster AWE 32 PnP */ -ISAPNP_SBAWE ('C' ,'T' ,'L' ,0x0048 ,0x0031 ,0x0021 ), + { .id ="CTL0048" , .devs = { {"CTL0031" }, {"CTL0021" } } },/* Sound Blaster AWE 32 PnP */ -ISAPNP_SBAWE ('C' ,'T' ,'L' ,0x0054 ,0x0031 ,0x0021 ), + { .id ="CTL0054" , .devs = { {"CTL0031" }, {"CTL0021" } } },/* Sound Blaster AWE 32 PnP */ -ISAPNP_SBAWE ('C' ,'T' ,'L' ,0x009a ,0x0041 ,0x0021 ), + { .id ="CTL009a" , .devs = { {"CTL0041" }, {"CTL0021" } } },/* Sound Blaster AWE 32 PnP */ -ISAPNP_SBAWE ('C' ,'T' ,'L' ,0x009c ,0x0041 ,0x0021 ), + { .id ="CTL009c" , .devs = { {"CTL0041" }, {"CTL0021" } } },/* Sound Blaster 32 PnP */ -ISAPNP_SBAWE ('C' ,'T' ,'L' ,0x009f ,0x0041 ,0x0021 ), + { .id ="CTL009f" , .devs = { {"CTL0041" }, {"CTL0021" } } },/* Sound Blaster AWE 64 PnP */ -ISAPNP_SBAWE ('C' ,'T' ,'L' ,0x009d ,0x0042 ,0x0022 ), + { .id ="CTL009d" , .devs = { {"CTL0042" }, {"CTL0022" } } },/* Sound Blaster AWE 64 PnP Gold */ -ISAPNP_SBAWE ('C' ,'T' ,'L' ,0x009e ,0x0044 ,0x0023 ), + { .id ="CTL009e" , .devs = { {"CTL0044" }, {"CTL0023" } } },/* Sound Blaster AWE 64 PnP Gold */ -ISAPNP_SBAWE ('C' ,'T' ,'L' ,0x00b2 ,0x0044 ,0x0023 ), + { .id ="CTL00b2" , .devs = { {"CTL0044" }, {"CTL0023" } } },/* Sound Blaster AWE 64 PnP */ -ISAPNP_SBAWE ('C' ,'T' ,'L' ,0x00c1 ,0x0042 ,0x0022 ), + { .id ="CTL00c1" , .devs = { {"CTL0042" }, {"CTL0022" } } },/* Sound Blaster AWE 64 PnP */ -ISAPNP_SBAWE ('C' ,'T' ,'L' ,0x00c3 ,0x0045 ,0x0022 ), + { .id ="CTL00c3" , .devs = { {"CTL0045" }, {"CTL0022" } } },/* Sound Blaster AWE 64 PnP */ -ISAPNP_SBAWE ('C' ,'T' ,'L' ,0x00c5 ,0x0045 ,0x0022 ), + { .id ="CTL00c5" , .devs = { {"CTL0045" }, {"CTL0022" } } },/* Sound Blaster AWE 64 PnP */ -ISAPNP_SBAWE ('C' ,'T' ,'L' ,0x00c7 ,0x0045 ,0x0022 ), + { .id ="CTL00c7" , .devs = { {"CTL0045" }, {"CTL0022" } } },/* Sound Blaster AWE 64 PnP */ -ISAPNP_SBAWE ('C' ,'T' ,'L' ,0x00e4 ,0x0045 ,0x0022 ), + { .id ="CTL00e4" , .devs = { {"CTL0045" }, {"CTL0022" } } },/* Sound Blaster AWE 64 PnP */ -ISAPNP_SBAWE ('C' ,'T' ,'L' ,0x00e9 ,0x0045 ,0x0022 ), + { .id ="CTL00e9" , .devs = { {"CTL0045" }, {"CTL0022" } } },/* Sound Blaster 16 PnP (AWE) */ -ISAPNP_SBAWE ('C' ,'T' ,'L' ,0x00ed ,0x0041 ,0x0070 ), + { .id ="CTL00ed" , .devs = { {"CTL0041" }, {"CTL0070" } } },/* Generic entries */ -ISAPNP_SBAWE ('C' ,'T' ,'L' ,ISAPNP_ANY_ID ,0x0031 ,0x0021 ), -ISAPNP_SBAWE ('C' ,'T' ,'L' ,ISAPNP_ANY_ID ,0x0041 ,0x0021 ), -ISAPNP_SBAWE ('C' ,'T' ,'L' ,ISAPNP_ANY_ID ,0x0042 ,0x0022 ), -ISAPNP_SBAWE ('C' ,'T' ,'L' ,ISAPNP_ANY_ID ,0x0044 ,0x0023 ), -ISAPNP_SBAWE ('C' ,'T' ,'L' ,ISAPNP_ANY_ID ,0x0045 ,0x0022 ), + { .id ="CTLXXXX" , .devs = { {"CTL0031" }, {"CTL0021" } } }, + { .id ="CTLXXXX" , .devs = { {"CTL0041" }, {"CTL0021" } } }, + { .id ="CTLXXXX" , .devs = { {"CTL0042" }, {"CTL0022" } } }, + { .id ="CTLXXXX" , .devs = { {"CTL0044" }, {"CTL0023" } } }, + { .id ="CTLXXXX" , .devs = { {"CTL0045" }, {"CTL0022" } } }, #endif /* SNDRV_SBAWE */ - {ISAPNP_CARD_END , } + { .id ="" , } }; -ISAPNP_CARD_TABLE (snd_sb16_pnpids); +MODULE_DEVICE_TABLE (pnp_card, snd_sb16_pnpids); -static int __init snd_sb16_isapnp (int dev,struct snd_sb16 *acard) +#ifdef SNDRV_SBAWE_EMU8000 +#define DRIVER_NAME "snd-card-sbawe" +#else +#define DRIVER_NAME "snd-card-sb16" +#endif + +static int __devinit snd_card_sb16_pnp (int dev,struct snd_card_sb16 *acard, +struct pnp_card_link *card, +const struct pnp_card_device_id *id) { -const struct isapnp_card_id *id = snd_sb16_isapnp_id[dev]; -struct isapnp_card *card = snd_sb16_isapnp_cards[dev]; -struct isapnp_dev *pdev; - - acard->dev =isapnp_find_dev (card, id->devs[0 ].vendor, id->devs[0 ].function,NULL ); -if (acard->dev->active) { - acard->dev =NULL ; -return -EBUSY ; - } -#ifdef SNDRV_SBAWE_EMU8000 - acard->devwt =isapnp_find_dev (card, id->devs[1 ].vendor, id->devs[1 ].function,NULL ); -if (acard->devwt->active) { - acard->dev = acard->devwt =NULL ; -return -EBUSY ; - } -#endif +struct pnp_dev *pdev; +struct pnp_resource_table * cfg =kmalloc (GFP_ATOMIC ,sizeof (struct pnp_resource_table )); +int err; + +if (!cfg) +return -ENOMEM ; + acard->dev =pnp_request_card_device (card, id->devs[0 ].id,NULL ); +if (acard->dev ==NULL ) { +kfree (cfg); +return -ENODEV ; + } +#ifdef SNDRV_SBAWE_EMU8000 + acard->devwt =pnp_request_card_device (card, id->devs[1 ].id, acard->dev); +#endif /* Audio initialization */ pdev = acard->dev; -if (pdev->prepare (pdev) <0 ) -return -EAGAIN ; + +pnp_init_resource_table (cfg); + +/* override resources */ +if (port[dev] !=SNDRV_AUTO_PORT ) -isapnp_resource_change (&pdev->resource[0 ], port[dev],16 ); +pnp_resource_change (&cfg->port_resource[0 ], port[dev],16 );if (mpu_port[dev] !=SNDRV_AUTO_PORT ) -isapnp_resource_change (&pdev->resource[1 ], mpu_port[dev],2 ); +pnp_resource_change (&cfg->port_resource[1 ], mpu_port[dev],2 );if (fm_port[dev] !=SNDRV_AUTO_PORT ) -isapnp_resource_change (&pdev->resource[2 ], fm_port[dev],4 ); +pnp_resource_change (&cfg->port_resource[2 ], fm_port[dev],4 );if (dma8[dev] !=SNDRV_AUTO_DMA ) -isapnp_resource_change (&pdev->dma_resource[0 ], dma8[dev],1 ); +pnp_resource_change (&cfg->dma_resource[0 ], dma8[dev],1 );if (dma16[dev] !=SNDRV_AUTO_DMA ) -isapnp_resource_change (&pdev->dma_resource[1 ], dma16[dev],1 ); +pnp_resource_change (&cfg->dma_resource[1 ], dma16[dev],1 );if (irq[dev] !=SNDRV_AUTO_IRQ ) -isapnp_resource_change (&pdev->irq_resource[0 ], irq[dev],1 ); -if (pdev->activate (pdev) <0 ) { - printk(KERN_ERR PFX "isapnp configure failure (out of resources?)\n"); -return -EBUSY ; - } - port[dev] = pdev->resource[0 ].start; - mpu_port[dev] = pdev->resource[1 ].start; - fm_port[dev] = pdev->resource[2 ].start; - dma8[dev] = pdev->dma_resource[0 ].start; - dma16[dev] = pdev->dma_resource[1 ].start; - irq[dev] = pdev->irq_resource[0 ].start; -snd_printdd ("isapnp SB16: port=0x%lx, mpu port=0x%lx, fm port=0x%lx\n" , +pnp_resource_change (&cfg->irq_resource[0 ], irq[dev],1 ); +if ((pnp_manual_config_dev (pdev, cfg,0 )) <0 ) + printk(KERN_ERR PFX "AUDIO the requested resources are invalid, using auto config\n"); + err =pnp_activate_dev (pdev); +if (err <0 ) { + printk(KERN_ERR PFX "AUDIO pnp configure failure\n"); +kfree (cfg); +return err; + } + port[dev] =pnp_port_start (pdev,0 ); + mpu_port[dev] =pnp_port_start (pdev,1 ); + fm_port[dev] =pnp_port_start (pdev,2 ); + dma8[dev] =pnp_dma (pdev,0 ); + dma16[dev] =pnp_dma (pdev,1 ); + irq[dev] =pnp_irq (pdev,0 ); +snd_printdd ("pnp SB16: port=0x%lx, mpu port=0x%lx, fm port=0x%lx\n" , port[dev], mpu_port[dev], fm_port[dev]); -snd_printdd ("isapnp SB16: dma1=%i, dma2=%i, irq=%i\n" , +snd_printdd ("pnp SB16: dma1=%i, dma2=%i, irq=%i\n" , dma8[dev], dma16[dev], irq[dev]);#ifdef SNDRV_SBAWE_EMU8000 /* WaveTable initialization */ pdev = acard->devwt; -if (pdev->prepare (pdev)<0 ) { - acard->dev->deactivate (acard->dev); -return -EAGAIN ; - } -if (awe_port[dev] !=SNDRV_AUTO_PORT ) { -isapnp_resource_change (&pdev->resource[0 ], awe_port[dev],4 ); -isapnp_resource_change (&pdev->resource[1 ], awe_port[dev] +0x400 ,4 ); -isapnp_resource_change (&pdev->resource[2 ], awe_port[dev] +0x800 ,4 ); - } -if (pdev->activate (pdev)<0 ) { - printk(KERN_ERR PFX "WaveTable isapnp configure failure (out of resources?)\n"); - acard->dev->deactivate (acard->dev); -return -EBUSY ; - } - awe_port[dev] = pdev->resource[0 ].start; -snd_printdd ("isapnp SB16: wavetable port=0x%lx\n" , pdev->resource[0 ].start); -#endif -return 0 ; -} - -static void snd_sb16_deactivate (struct snd_sb16 *acard) -{ -if (acard->dev) { - acard->dev->deactivate (acard->dev); - acard->dev =NULL ; - } -#ifdef SNDRV_SBAWE_EMU8000 -if (acard->devwt) { - acard->devwt->deactivate (acard->devwt); +if (pdev !=NULL ) { +pnp_init_resource_table (cfg); + +/* override resources */ + +if (awe_port[dev] !=SNDRV_AUTO_PORT ) { +pnp_resource_change (&cfg->port_resource[0 ], awe_port[dev],4 ); +pnp_resource_change (&cfg->port_resource[1 ], awe_port[dev] +0x400 ,4 ); +pnp_resource_change (&cfg->port_resource[2 ], awe_port[dev] +0x800 ,4 ); + } +if ((pnp_manual_config_dev (pdev, cfg,0 )) <0 ) + printk(KERN_ERR PFX "WaveTable the requested resources are invalid, using auto config\n"); + err =pnp_activate_dev (pdev); +if (err <0 ) { + goto __wt_error; + } + awe_port[dev] =pnp_port_start (pdev,0 ); +snd_printdd ("pnp SB16: wavetable port=0x%lx\n" , pdev->resource[0 ].start); + }else { +__wt_error: +if (pdev) { +pnp_release_card_device (pdev); + printk(KERN_ERR PFX "WaveTable pnp configure failure\n"); + } acard->devwt =NULL ; + awe_port[dev] =-1 ; }#endif +kfree (cfg); +return 0 ; } -#endif /* __ISAPNP__ */ - -static void snd_sb16_free (snd_card_t *card) -{ -struct snd_sb16 *acard = (struct snd_sb16 *)card->private_data; - -if (acard ==NULL ) -return ; -if (acard->fm_res) { -release_resource (acard->fm_res); -kfree_nocheck (acard->fm_res); - } -#ifdef __ISAPNP__ -snd_sb16_deactivate (acard); -#endif -} - -static int __init snd_sb16_probe (int dev) +static int __init snd_sb16_probe (int dev, +struct pnp_card_link *pcard, +const struct pnp_card_device_id *pid) {static int possible_irqs[] = {5 ,9 ,10 ,7 ,-1 };static int possible_dmas8[] = {1 ,3 ,0 ,-1 };
@@ -380,7 +356,7 @@int xirq, xdma8, xdma16;sb_t *chip;snd_card_t *card; -struct snd_sb16 *acard; +struct snd_card_sb16 *acard;opl3_t *opl3;snd_hwdep_t *synth =NULL ;#ifdef CONFIG_SND_SB16_CSP
@@ -390,22 +366,21 @@int err; card =snd_card_new (index[dev], id[dev],THIS_MODULE , -sizeof (struct snd_sb16 )); +sizeof (struct snd_card_sb16 ));if (card ==NULL )return -ENOMEM ; - acard = (struct snd_sb16 *) card->private_data; - card->private_free = snd_sb16_free; -#ifdef __ISAPNP__ -if (isapnp[dev] &&snd_sb16_isapnp (dev, acard) <0 ) { -snd_card_free (card); -return -EBUSY ; + acard = (struct snd_card_sb16 *) card->private_data; +if (isapnp[dev]) { +if ((err =snd_card_sb16_pnp (dev, acard, pcard, pid))) { +snd_card_free (card); +return err; + } } -#endif xirq = irq[dev]; xdma8 = dma8[dev]; xdma16 = dma16[dev]; -#ifdef __ISAPNP__ +#ifdef CONFIG_PNP if (!isapnp[dev]) {#endif if (xirq ==SNDRV_AUTO_IRQ ) {
@@ -437,7 +412,7 @@/* non-PnP AWE port address is hardwired with base port address */ awe_port[dev] = port[dev] +0x400 ;#endif -#ifdef __ISAPNP__ +#ifdef CONFIG_PNP }#endif
@@ -458,7 +433,7 @@return -ENODEV ; } chip->mpu_port = mpu_port[dev]; -#ifdef __ISAPNP__ +#ifdef CONFIG_PNP if (!isapnp[dev] && (err =snd_sb16dsp_configure (chip)) <0 ) {#else if ((err =snd_sb16dsp_configure (chip)) <0 ) {
@@ -554,7 +529,10 @@snd_card_free (card);return err; } - snd_sb16_cards[dev] = card; +if (pcard) +pnp_set_card_drvdata (pcard, card); +else + snd_sb16_legacy[dev] = card;return 0 ; }
@@ -566,12 +544,12 @@for ( ; dev <SNDRV_CARDS ; dev++) {if (!enable[dev] || port[dev] !=SNDRV_AUTO_PORT )continue ; -#ifdef __ISAPNP__ +#ifdef CONFIG_PNP if (isapnp[dev])continue ;#endif port[dev] = xport; - res =snd_sb16_probe (dev); + res =snd_sb16_probe (dev,NULL ,NULL );if (res <0 ) port[dev] =SNDRV_AUTO_PORT ;return res;
@@ -579,10 +557,10 @@return -ENODEV ; } -#ifdef __ISAPNP__ +#ifdef CONFIG_PNP -static int __init snd_sb16_isapnp_detect (struct isapnp_card *card, -const struct isapnp_card_id *id) +static int __devinit snd_sb16_pnp_detect (struct pnp_card_link *card, +const struct pnp_card_device_id *id) {static int dev;int res;
@@ -590,9 +568,7 @@for ( ; dev <SNDRV_CARDS ; dev++) {if (!enable[dev] || !isapnp[dev])continue ; - snd_sb16_isapnp_cards[dev] = card; - snd_sb16_isapnp_id[dev] = id; - res =snd_sb16_probe (dev); + res =snd_sb16_probe (dev, card, id);if (res <0 )return res; dev++;
@@ -602,7 +578,23 @@return -ENODEV ; } -#endif /* __ISAPNP__ */ +#endif + +static void __devexit snd_sb16_pnp_remove(struct pnp_card_link * pcard) +{ +snd_card_t *card = (snd_card_t *)pnp_get_card_drvdata (pcard); + +snd_card_disconnect (card); +snd_card_free_in_thread (card); +} + +static struct pnp_card_driver sb16_pnpc_driver = { + .flags =PNP_DRIVER_RES_DISABLE , + .name ="sb16" , + .id_table = snd_sb16_pnpids, + .probe = snd_sb16_pnp_detect, + .remove =__devexit_p (snd_sb16_pnp_remove), +};static int __init alsa_card_sb16_init (void ) {
@@ -613,23 +605,23 @@for (dev =0 ; dev <SNDRV_CARDS ; dev++) {if (!enable[dev] || port[dev] ==SNDRV_AUTO_PORT )continue ; -#ifdef __ISAPNP__ +#ifdef CONFIG_PNP if (isapnp[dev])continue ;#endif -if (!snd_sb16_probe (dev)) { +if (!snd_sb16_probe (dev,NULL ,NULL )) { cards++;continue ; }#ifdef MODULE printk (KERN_ERR "Sound Blaster 16+ soundcard #%i not found at 0x%lx or device busy\n" , dev, port[dev]); -#endif +#endif }/* legacy auto configured cards */ cards +=snd_legacy_auto_probe (possible_ports, snd_sb16_probe_legacy_port); -#ifdef __ISAPNP__ -/* ISA PnP cards at last */ - cards +=isapnp_probe_cards (snd_sb16_pnpids, snd_sb16_isapnp_detect); +#ifdef CONFIG_PNP +/* PnP cards at last */ + cards +=pnp_register_card_driver (&sb16_pnpc_driver);#endif if (!cards) {
@@ -650,8 +642,12 @@ {int dev; +#ifdef CONFIG_PNP +/* PnP cards first */ +pnp_unregister_card_driver (&sb16_pnpc_driver); +#endif for (dev =0 ; dev <SNDRV_CARDS ; dev++) -snd_card_free (snd_sb16_cards[dev]); +snd_card_free (snd_sb16_legacy[dev]); }module_init (alsa_card_sb16_init)
@@ -659,7 +655,7 @@#ifndef MODULE -/* format is: snd-sb16=enable,index,id,isapnp, +/* format is: snd-sb16=enable,index,id,pnp, port,mpu_port,fm_port, irq,dma8,dma16, mic_agc,csp,
@@ -694,7 +690,7 @@get_option (&str,&seq_ports[nr_dev]) ==2 #endif ); -#ifdef __ISAPNP__ +#ifdef CONFIG_PNP if (pnp !=INT_MAX ) isapnp[nr_dev] = pnp;#endif
drivers/isdn/hisax/hisax_fcpcipnp.c +2 -2
@@ -909,7 +909,7 @@#ifdef CONFIG_PNP_CARD static int __devinit fcpnp_probe (struct pnp_card *card, -const struct pnp_card_id *card_id) +const struct pnp_card_device_id *card_id) {struct fritz_adapter *adapter;struct pnp_dev *pnp_dev;
@@ -955,7 +955,7 @@delete_adapter (adapter); } -static struct pnp_card_id fcpnp_ids[]__devinitdata = { +static struct pnp_card_device_id fcpnp_ids[]__devinitdata = { { .id ="AVM0900" , .driver_data = (unsigned long )"Fritz!Card PnP" , .devs = { {"AVM0900" } },
drivers/pnp/card.c +3 -3
@@ -22,9 +22,9 @@LIST_HEAD (pnp_card_drivers); -static const struct pnp_card_id *match_card (struct pnp_card_driver * drv,struct pnp_card * card) +static const struct pnp_card_device_id *match_card (struct pnp_card_driver * drv,struct pnp_card * card) { -const struct pnp_card_id * drv_id = drv->id_table; +const struct pnp_card_device_id * drv_id = drv->id_table;while (*drv_id->id){if (compare_pnp_id (card->id,drv_id->id))return drv_id;
@@ -52,7 +52,7 @@static int card_probe (struct pnp_card * card,struct pnp_card_driver * drv) { -const struct pnp_card_id *id =match_card (drv,card); +const struct pnp_card_device_id *id =match_card (drv,card);if (id) {struct pnp_card_link * clink =pnp_alloc (sizeof (struct pnp_card_link ));if (!clink)
include/linux/pnp.h +3 -3
@@ -295,7 +295,7 @@unsigned long driver_data;/* data private to the driver */ }; -struct pnp_card_id { +struct pnp_card_device_id {char id[PNP_ID_LEN ];unsigned long driver_data;/* data private to the driver */ struct {
@@ -317,9 +317,9 @@struct pnp_card_driver {struct list_head global_list;char * name; -const struct pnp_card_id *id_table; +const struct pnp_card_device_id *id_table;unsigned int flags; -int (*probe) (struct pnp_card_link *card,const struct pnp_card_id *card_id); +int (*probe) (struct pnp_card_link *card,const struct pnp_card_device_id *card_id);void (*remove) (struct pnp_card_link *card);struct pnp_driver link; };
sound/isa/als100.c +4 -4
@@ -98,7 +98,7 @@struct pnp_dev *devopl; }; -static struct pnp_card_id snd_als100_pnpids[]__devinitdata = { +static struct pnp_card_device_id snd_als100_pnpids[]__devinitdata = {/* ALS100 - PRO16PNP */ { .id ="ALS0001" , .devs = { {"@@@0001" }, {"@X@0001" }, {"@H@0001" }, } },/* ALS110 - MF1000 - Digimate 3D Sound */
@@ -118,7 +118,7 @@static int __devinit snd_card_als100_isapnp (int dev,struct snd_card_als100 *acard,struct pnp_card_link *card, -const struct pnp_card_id *id) +const struct pnp_card_device_id *id) {struct pnp_dev *pdev;struct pnp_resource_table * cfg =kmalloc (GFP_ATOMIC ,sizeof (struct pnp_resource_table ));
@@ -210,7 +210,7 @@static int __init snd_card_als100_probe (int dev,struct pnp_card_link *pcard, -const struct pnp_card_id *pid) +const struct pnp_card_device_id *pid) {int error;sb_t *chip;
@@ -288,7 +288,7 @@ }static int __devinit snd_als100_pnp_detect (struct pnp_card_link *card, -const struct pnp_card_id *id) +const struct pnp_card_device_id *id) {static int dev;int res;
sound/isa/sb/es968.c +4 -4
@@ -69,7 +69,7 @@struct pnp_dev *dev; }; -static struct pnp_card_id snd_es968_pnpids[]__devinitdata = { +static struct pnp_card_device_id snd_es968_pnpids[]__devinitdata = { { .id ="ESS0968" , .devs = { {"@@@0968" }, } }, { .id ="" , }/* end */ };
@@ -92,7 +92,7 @@static int __devinit snd_card_es968_isapnp (int dev,struct snd_card_es968 *acard,struct pnp_card_link *card, -const struct pnp_card_id *id) +const struct pnp_card_device_id *id) {struct pnp_dev *pdev;struct pnp_resource_table * cfg =kmalloc (GFP_ATOMIC ,sizeof (struct pnp_resource_table ));
@@ -133,7 +133,7 @@static int __init snd_card_es968_probe (int dev,struct pnp_card_link *pcard, -const struct pnp_card_id *pid) +const struct pnp_card_device_id *pid) {int error;sb_t *chip;
@@ -188,7 +188,7 @@ }static int __devinit snd_es968_pnp_detect (struct pnp_card_link *card, -const struct pnp_card_id *id) +const struct pnp_card_device_id *id) {static int dev;int res;
sound/oss/sb_card.c +1 -1
@@ -224,7 +224,7 @@ }/* Probe callback function for the PnP API */ -static int sb_pnp_probe (struct pnp_card_link *card,const struct pnp_card_id *card_id) +static int sb_pnp_probe (struct pnp_card_link *card,const struct pnp_card_device_id *card_id) {struct sb_card_config *scc;struct sb_module_options sbmo = {0 };/* Default to 0 for PnP */
sound/oss/sb_card.h +1 -1
@@ -23,7 +23,7 @@*/ /* Card PnP ID Table */ -static struct pnp_card_id sb_pnp_card_table[] = { +static struct pnp_card_device_id sb_pnp_card_table[] = {/* Sound Blaster 16 */ {.id ="CTL0024" , .driver_data =0 , devs : { {.id="CTL0031" }, } },/* Sound Blaster 16 */
sound/isa/als100.c +1 -0
@@ -151,6 +151,7 @@ err =pnp_activate_dev (pdev);if (err <0 ) { printk(KERN_ERR PFX "AUDIO pnp configure failure\n"); +kfree (cfg);return err; } port[dev] =pnp_port_start (pdev,0 );