--- ./comedi/drivers/ni_mio_cs.c	2006-06-11 23:05:57.000000000 +0200
+++ ../comedi-cvs20060705_tmh/comedi/drivers/ni_mio_cs.c	2006-07-10 12:27:24.000000000 +0200
@@ -167,7 +167,7 @@
 #define NI_E_IRQ_FLAGS		SA_SHIRQ
 
 typedef struct{
-	dev_link_t *link;
+	struct pcmcia_device *link;
 
 	NI_PRIVATE_COMMON
 }ni_private;
@@ -232,12 +232,13 @@
 #include "ni_mio_common.c"
 
 
-static int ni_getboardtype(comedi_device *dev,dev_link_t *link);
+static int ni_getboardtype(comedi_device *dev,struct pcmcia_device *link);
 
 /* clean up allocated resources */
 /* called when driver is removed */
 static int mio_cs_detach(comedi_device *dev)
 {
+	printk("ni_mio_cs:detach");
 	mio_common_detach(dev);
 
 	/* PCMCIA layer frees the IO region */
@@ -249,39 +250,26 @@
 	return 0;
 }
 
-static void mio_cs_config(dev_link_t *link);
+static void mio_cs_config(struct pcmcia_device *link);
 static void cs_release(u_long arg);
 static void cs_detach(struct pcmcia_device *);
 
-static dev_link_t *dev_list = NULL;
+static struct pcmcia_device *dev_list = NULL;
 static dev_info_t dev_info = "ni_mio_cs";
 static dev_node_t dev_node = {
 	"ni_mio_cs",
 	COMEDI_MAJOR,0,
 	NULL
 };
-static int cs_attach(struct pcmcia_device *p_dev)
+static int cs_attach(struct pcmcia_device *link)
 {
-	dev_link_t *link;
-
-	link=kmalloc(sizeof(*link),GFP_KERNEL);
-	if(!link)return -ENOMEM;
-	memset(link,0,sizeof(*link));
-
 	link->io.Attributes1 = IO_DATA_PATH_WIDTH_16;
 	link->io.NumPorts1 = 16;
 	link->irq.Attributes = IRQ_TYPE_EXCLUSIVE;
 	link->irq.IRQInfo1 = IRQ_LEVEL_ID;
 	link->conf.Attributes = CONF_ENABLE_IRQ;
-	link->conf.Vcc = 50;
 	link->conf.IntType = INT_MEMORY_AND_IO;
-	
-	link->next = dev_list;
 	dev_list = link;
-
-	link->handle = p_dev;
-	p_dev->instance = link;
-	link->state |= DEV_PRESENT | DEV_CONFIG_PENDING;
 	mio_cs_config(link);
 
 	return 0;
@@ -289,71 +277,37 @@
 
 static void cs_release(u_long arg)
 {
-	dev_link_t *link=(void *)arg;
+	struct pcmcia_device *link=(void *)arg;
 
-	pcmcia_release_configuration(link->handle);
-	pcmcia_release_io(link->handle, &link->io);
-	pcmcia_release_irq(link->handle, &link->irq);
-
-	link->state &= ~DEV_CONFIG;
+	printk("ni_cs:release\n");
+	pcmcia_disable_device(link);
 }
 
-static void cs_detach(struct pcmcia_device *p_dev)
+static void cs_detach(struct pcmcia_device *link)
 {
-	dev_link_t *link = dev_to_instance(p_dev);
-	dev_link_t **linkp;
 	
 	DPRINTK("cs_detach(link=%p)\n",link);
 	
-	for(linkp = &dev_list; *linkp; linkp = &(*linkp)->next)
-		if (*linkp == link) break;
-	if (*linkp==NULL)
-		return;
-
-	//save_flags
-	//cli
-	if (link->state & DEV_RELEASE_PENDING){
-		printk("dev release pending bug\n");
-		link->state &= ~DEV_RELEASE_PENDING;
-	}
-	//restore_flags
-
-	if(link->state & DEV_CONFIG) {
-		cs_release((u_long)link);
-	}
+	cs_release((u_long)link);
 
 	/* Unlink device structure, and free it */
-	*linkp = link->next;
-	kfree(link);
+	dev_list = NULL;
 }
 
-static int mio_cs_suspend(struct pcmcia_device *p_dev)
+static int mio_cs_suspend(struct pcmcia_device *link)
 {
-	dev_link_t *link = dev_to_instance(p_dev);
-
 	DPRINTK("pm suspend\n");
-	link->state |= DEV_SUSPEND;
-	if(link->state & DEV_CONFIG)
-		pcmcia_release_configuration(link->handle);
-
 	return 0;
 }
 
-static int mio_cs_resume(struct pcmcia_device *p_dev)
+static int mio_cs_resume(struct pcmcia_device *link)
 {
-	dev_link_t *link = dev_to_instance(p_dev);
-
 	DPRINTK("pm resume\n");
-	link->state &= ~DEV_SUSPEND;
-	if(DEV_OK(link))
-		pcmcia_request_configuration(link->handle, &link->conf);
-
 	return 0;
 }
 
-static void mio_cs_config(dev_link_t *link)
+static void mio_cs_config(struct pcmcia_device *link)
 {
-	client_handle_t handle = link->handle;
 	tuple_t tuple;
 	u_short buf[128];
 	cisparse_t parse;
@@ -369,16 +323,14 @@
 	tuple.Attributes = 0;
 	
 	tuple.DesiredTuple = CISTPL_CONFIG;
-	ret = pcmcia_get_first_tuple(handle, &tuple);
-	ret = pcmcia_get_tuple_data(handle, &tuple);
-	ret = pcmcia_parse_tuple(handle, &tuple, &parse);
+	ret = pcmcia_get_first_tuple(link, &tuple);
+	ret = pcmcia_get_tuple_data(link, &tuple);
+	ret = pcmcia_parse_tuple(link, &tuple, &parse);
 	link->conf.ConfigBase = parse.config.base;
 	link->conf.Present = parse.config.rmask[0];
 
-	link->state |= DEV_CONFIG;
 
-	pcmcia_get_configuration_info(handle, &conf);
-	link->conf.Vcc=conf.Vcc;
+	pcmcia_get_configuration_info(link, &conf);
 #if 0
 	tuple.DesiredTuple = CISTPL_LONGLINK_MFC;
 	tuple.Attributes = TUPLE_RETURN_COMMON | TUPLE_RETURN_LINK;
@@ -387,8 +339,8 @@
 
 	tuple.DesiredTuple = CISTPL_MANFID;
 	tuple.Attributes = TUPLE_RETURN_COMMON;
-	if((pcmcia_get_first_tuple(handle, &tuple) == CS_SUCCESS) &&
-	   (pcmcia_get_tuple_data(handle, &tuple) == CS_SUCCESS)){
+	if((pcmcia_get_first_tuple(link, &tuple) == CS_SUCCESS) &&
+	   (pcmcia_get_tuple_data(link, &tuple) == CS_SUCCESS)){
 		manfid = le16_to_cpu(buf[0]);
 		prodid = le16_to_cpu(buf[1]);
 	}
@@ -396,9 +348,9 @@
 
 	tuple.DesiredTuple = CISTPL_CFTABLE_ENTRY;
 	tuple.Attributes = 0;
-	ret = pcmcia_get_first_tuple(handle, &tuple);
-	ret = pcmcia_get_tuple_data(handle, &tuple);
-	ret = pcmcia_parse_tuple(handle, &tuple, &parse);
+	ret = pcmcia_get_first_tuple(link, &tuple);
+	ret = pcmcia_get_tuple_data(link, &tuple);
+	ret = pcmcia_parse_tuple(link, &tuple, &parse);
 
 #if 0
 	printk(" index: 0x%x\n",parse.cftable_entry.index);
@@ -428,7 +380,7 @@
 		int base;
 		for(base=0x000;base<0x400;base+=0x20){
 			link->io.BasePort1=base;
-			ret = pcmcia_request_io(handle, &link->io);
+			ret = pcmcia_request_io(link, &link->io);
 			//printk("RequestIO 0x%02x\n",ret);
 			if(!ret)break;
 		}
@@ -436,25 +388,24 @@
 
 	link->irq.IRQInfo1=parse.cftable_entry.irq.IRQInfo1;
 	link->irq.IRQInfo2=parse.cftable_entry.irq.IRQInfo2;
-	ret = pcmcia_request_irq(handle, &link->irq);
+	ret = pcmcia_request_irq(link, &link->irq);
 	//printk("RequestIRQ 0x%02x\n",ret);
 
 	link->conf.ConfigIndex=1;
 
-	ret = pcmcia_request_configuration(handle, &link->conf);
+	ret = pcmcia_request_configuration(link, &link->conf);
 	//printk("RequestConfiguration %d\n",ret);
 
-	link->dev = &dev_node;
-	link->state &= ~DEV_CONFIG_PENDING;
+	link->dev_node = &dev_node;
 }
 
 static int mio_cs_attach(comedi_device *dev,comedi_devconfig *it)
 {
-	dev_link_t *link;
+	struct pcmcia_device *link;
 	int ret;
 	
+	printk("ni_mio_cs:attach\n");
 	DPRINTK("mio_cs_attach(dev=%p,it=%p)\n",dev,it);
-
 	link = dev_list; /* XXX hack */
 	if(!link)return -EIO;
 
@@ -509,9 +460,8 @@
 }
 
 
-static int get_prodid(comedi_device *dev,dev_link_t *link)
+static int get_prodid(comedi_device *dev,struct pcmcia_device *link)
 {
-	client_handle_t handle = link->handle;
 	tuple_t tuple;
 	u_short buf[128];
 	int prodid = 0;
@@ -521,15 +471,15 @@
 	tuple.TupleDataMax = 255;
 	tuple.DesiredTuple = CISTPL_MANFID;
 	tuple.Attributes = TUPLE_RETURN_COMMON;
-	if((pcmcia_get_first_tuple(handle, &tuple) == CS_SUCCESS) &&
-	   (pcmcia_get_tuple_data(handle, &tuple) == CS_SUCCESS)){
+	if((pcmcia_get_first_tuple(link, &tuple) == CS_SUCCESS) &&
+	   (pcmcia_get_tuple_data(link, &tuple) == CS_SUCCESS)){
 		prodid = le16_to_cpu(buf[1]);
 	}
 	
 	return prodid;
 }
 
-static int ni_getboardtype(comedi_device *dev,dev_link_t *link)
+static int ni_getboardtype(comedi_device *dev,struct pcmcia_device *link)
 {
 	int id;
 	int i;
@@ -577,20 +527,28 @@
 	},	
 };
 
-int init_module(void)
+static int __init ni_mio_cs_init(void)
 {
+	printk("ni_mio_cs:init\n");
 	pcmcia_register_driver(&ni_mio_cs_driver);
+	printk("ni_mio_cs:driver reg\n");
 	comedi_driver_register(&driver_ni_mio_cs);
+	printk("ni_mio_cs:reg return\n");
 	return 0;
 }
 
-void cleanup_module(void)
+static void __exit ni_mio_cs_exit(void)
 {
+	printk("ni_mio_cs:exit\n");
 	pcmcia_unregister_driver(&ni_mio_cs_driver);
 #if 0
 	while(dev_list != NULL)
 		cs_detach(dev_list->handle);
 #endif
+	printk("ni_mio_cs:driver unreg\n");
 	comedi_driver_unregister(&driver_ni_mio_cs);
 }
 #endif
+
+module_init(ni_mio_cs_init);
+module_exit(ni_mio_cs_exit);

