Cadet PnP Update (3/6)
Subsystems (2)
PATCH 1/1 Cadet PnP Update (3/6)
Converts the radio-cadet driver. Once again I don't have the hardware for this.
-Adam
drivers/media/radio/radio-cadet.c +34 -32
@@ -1,4 +1,4 @@ -/* radio-cadet.c - A video4linux driver for the ADS Cadet AM/FM Radio Card +/* radio-cadet.c - A video4linux driver for the ADS Cadet AM/FM Radio Card * * by Fred Gleason <[email protected]> * Version 0.3.3
@@ -20,6 +20,9 @@* Removed dead CONFIG_RADIO_CADET_PORT code * PnP detection on load is now default (no args necessary) * +* 2002-01-17 Adam Belay <[email protected]> +* Updated to latest pnp code +* */ #include <linux/module.h> /* Modules */
@@ -30,7 +33,7 @@#include <asm/uaccess.h> /* copy to/from user */ #include <linux/videodev.h> /* kernel radio structs */ #include <linux/param.h> -#include <linux/isapnp.h> +#include <linux/pnp.h> #define RDS_BUFFER 256
@@ -47,8 +50,6 @@static int cadet_lock=0 ;static int cadet_probe (void ); -static struct pnp_dev *dev =NULL ; -static int isapnp_cadet_probe (void );/* * Signal Strength Threshold Values
@@ -152,7 +153,7 @@*/ outb (curvol,io+1 ); cadet_lock--; - +return fifo; }
@@ -541,22 +542,23 @@ .fops = &cadet_fops, }; -static int isapnp_cadet_probe (void ) -{ - dev =pnp_find_dev (NULL ,ISAPNP_VENDOR ('M' ,'S' ,'M' ), -ISAPNP_FUNCTION (0x0c24 ),NULL ); +static struct pnp_device_id cadet_pnp_devices[] = { +/* ADS Cadet AM/FM Radio Card */ + {.id ="MSM0c24" , .driver_data =0 }, + {.id ="" } +}; +MODULE_DEVICE_TABLE (pnp, id_table); + +static int cadet_pnp_probe (struct pnp_dev * dev,const struct pnp_device_id *dev_id) +{if (!dev)return -ENODEV ; -if (pnp_device_attach (dev) <0 ) -return -EAGAIN ; -if (pnp_activate_dev (dev,NULL ) <0 ) { -printk ("radio-cadet: pnp configure failed (out of resources?)\n" ); -pnp_device_detach (dev); -return -EIO ; - } +/* only support one device */ +if (io >0 ) +return -EBUSY ; +if (!pnp_port_valid (dev,0 )) { -pnp_device_detach (dev);return -ENODEV ; }
@@ -567,6 +569,13 @@return io; } +static struct pnp_driver cadet_pnp_driver = { + .name ="radio-cadet" , + .id_table = cadet_pnp_devices, + .probe = cadet_pnp_probe, + .remove =NULL , +}; +static int cadet_probe (void ) {static int iovals[8 ]={0x330 ,0x332 ,0x334 ,0x336 ,0x338 ,0x33a ,0x33c ,0x33e };
@@ -597,7 +606,7 @@* If a probe was requested then probe ISAPnP first (safest) */ if (io <0 ) - io =isapnp_cadet_probe (); +pnp_register_driver (&cadet_pnp_driver);/* * If that fails then probe unsafely if probe is requested */
@@ -612,16 +621,19 @@#ifdef MODULE printk (KERN_ERR "You must set an I/O address with io=0x???\n" );#endif -return -EINVAL ; + goto fail; }if (!request_region (io,2 ,"cadet" )) -return -EBUSY ; + goto fail;if (video_register_device (&cadet_radio,VFL_TYPE_RADIO ,radio_nr)==-1 ) {release_region (io,2 ); -return -EINVAL ; + goto fail; }printk (KERN_INFO "ADS Cadet Radio Card at 0x%x\n" ,io);return 0 ; +fail: +pnp_unregister_driver (&cadet_pnp_driver); +return -1 ; }
@@ -634,21 +646,11 @@MODULE_PARM_DESC (io,"I/O address of Cadet card (0x330,0x332,0x334,0x336,0x338,0x33a,0x33c,0x33e)" );MODULE_PARM (radio_nr,"i" ); -static struct isapnp_device_id id_table[]__devinitdata = { - {ISAPNP_ANY_ID ,ISAPNP_ANY_ID , -ISAPNP_VENDOR ('M' ,'S' ,'M' ),ISAPNP_FUNCTION (0x0c24 ),0 }, - {0 } -}; - -MODULE_DEVICE_TABLE (isapnp, id_table); - static void __exit cadet_cleanup_module(void) {video_unregister_device (&cadet_radio);release_region (io,2 ); - -if (dev) -pnp_device_detach (dev); +pnp_unregister_driver (&cadet_pnp_driver); }module_init (cadet_init);