| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | /*======================================================================
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     A driver for PCMCIA parallel port adapters | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     (specifically, for the Quatech SPP-100 EPP card: other cards will | 
					
						
							|  |  |  |     probably require driver tweaks) | 
					
						
							|  |  |  |      | 
					
						
							|  |  |  |     parport_cs.c 1.29 2002/10/11 06:57:41 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     The contents of this file are subject to the Mozilla Public | 
					
						
							|  |  |  |     License Version 1.1 (the "License"); you may not use this file | 
					
						
							|  |  |  |     except in compliance with the License. You may obtain a copy of | 
					
						
							|  |  |  |     the License at http://www.mozilla.org/MPL/
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     Software distributed under the License is distributed on an "AS | 
					
						
							|  |  |  |     IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or | 
					
						
							|  |  |  |     implied. See the License for the specific language governing | 
					
						
							|  |  |  |     rights and limitations under the License. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     The initial developer of the original code is David A. Hinds | 
					
						
							|  |  |  |     <dahinds@users.sourceforge.net>.  Portions created by David A. Hinds | 
					
						
							|  |  |  |     are Copyright (C) 1999 David A. Hinds.  All Rights Reserved. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     Alternatively, the contents of this file may be used under the | 
					
						
							|  |  |  |     terms of the GNU General Public License version 2 (the "GPL"), in | 
					
						
							|  |  |  |     which case the provisions of the GPL are applicable instead of the | 
					
						
							|  |  |  |     above.  If you wish to allow the use of your version of this file | 
					
						
							|  |  |  |     only under the terms of the GPL and not to allow others to use | 
					
						
							|  |  |  |     your version of this file under the MPL, indicate your decision | 
					
						
							|  |  |  |     by deleting the provisions above and replace them with the notice | 
					
						
							|  |  |  |     and other provisions required by the GPL.  If you do not delete | 
					
						
							|  |  |  |     the provisions above, a recipient may use your version of this | 
					
						
							|  |  |  |     file under either the MPL or the GPL. | 
					
						
							|  |  |  |      | 
					
						
							|  |  |  | ======================================================================*/ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <linux/kernel.h>
 | 
					
						
							|  |  |  | #include <linux/module.h>
 | 
					
						
							|  |  |  | #include <linux/init.h>
 | 
					
						
							|  |  |  | #include <linux/ptrace.h>
 | 
					
						
							|  |  |  | #include <linux/slab.h>
 | 
					
						
							|  |  |  | #include <linux/string.h>
 | 
					
						
							|  |  |  | #include <linux/timer.h>
 | 
					
						
							|  |  |  | #include <linux/ioport.h>
 | 
					
						
							|  |  |  | #include <linux/major.h>
 | 
					
						
							| 
									
										
										
										
											2009-04-07 15:30:57 +01:00
										 |  |  | #include <linux/interrupt.h>
 | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | #include <linux/parport.h>
 | 
					
						
							|  |  |  | #include <linux/parport_pc.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <pcmcia/cs.h>
 | 
					
						
							|  |  |  | #include <pcmcia/cistpl.h>
 | 
					
						
							|  |  |  | #include <pcmcia/ds.h>
 | 
					
						
							|  |  |  | #include <pcmcia/cisreg.h>
 | 
					
						
							|  |  |  | #include <pcmcia/ciscode.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /*====================================================================*/ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* Module parameters */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | MODULE_AUTHOR("David Hinds <dahinds@users.sourceforge.net>"); | 
					
						
							|  |  |  | MODULE_DESCRIPTION("PCMCIA parallel port card driver"); | 
					
						
							|  |  |  | MODULE_LICENSE("Dual MPL/GPL"); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #define INT_MODULE_PARM(n, v) static int n = v; module_param(n, int, 0)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | INT_MODULE_PARM(epp_mode, 1); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /*====================================================================*/ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #define FORCE_EPP_MODE	0x08
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | typedef struct parport_info_t { | 
					
						
							| 
									
										
										
										
											2006-03-05 10:45:09 +01:00
										 |  |  | 	struct pcmcia_device	*p_dev; | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  |     int			ndev; | 
					
						
							|  |  |  |     struct parport	*port; | 
					
						
							|  |  |  | } parport_info_t; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-11-14 21:23:14 +01:00
										 |  |  | static void parport_detach(struct pcmcia_device *p_dev); | 
					
						
							| 
									
										
										
										
											2006-03-31 17:26:06 +02:00
										 |  |  | static int parport_config(struct pcmcia_device *link); | 
					
						
							| 
									
										
										
										
											2006-03-31 17:21:06 +02:00
										 |  |  | static void parport_cs_release(struct pcmcia_device *); | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | /*======================================================================
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     parport_attach() creates an "instance" of the driver, allocating | 
					
						
							|  |  |  |     local data structures for one device.  The device is registered | 
					
						
							|  |  |  |     with Card Services. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ======================================================================*/ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-03-31 17:26:06 +02:00
										 |  |  | static int parport_probe(struct pcmcia_device *link) | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | { | 
					
						
							|  |  |  |     parport_info_t *info; | 
					
						
							| 
									
										
										
										
											2005-11-14 21:25:51 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-24 15:55:39 +02:00
										 |  |  |     dev_dbg(&link->dev, "parport_attach()\n"); | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     /* Create new parport device */ | 
					
						
							| 
									
										
											  
											
												some kmalloc/memset ->kzalloc (tree wide)
Transform some calls to kmalloc/memset to a single kzalloc (or kcalloc).
Here is a short excerpt of the semantic patch performing
this transformation:
@@
type T2;
expression x;
identifier f,fld;
expression E;
expression E1,E2;
expression e1,e2,e3,y;
statement S;
@@
 x =
- kmalloc
+ kzalloc
  (E1,E2)
  ...  when != \(x->fld=E;\|y=f(...,x,...);\|f(...,x,...);\|x=E;\|while(...) S\|for(e1;e2;e3) S\)
- memset((T2)x,0,E1);
@@
expression E1,E2,E3;
@@
- kzalloc(E1 * E2,E3)
+ kcalloc(E1,E2,E3)
[akpm@linux-foundation.org: get kcalloc args the right way around]
Signed-off-by: Yoann Padioleau <padator@wanadoo.fr>
Cc: Richard Henderson <rth@twiddle.net>
Cc: Ivan Kokshaysky <ink@jurassic.park.msu.ru>
Acked-by: Russell King <rmk@arm.linux.org.uk>
Cc: Bryan Wu <bryan.wu@analog.com>
Acked-by: Jiri Slaby <jirislaby@gmail.com>
Cc: Dave Airlie <airlied@linux.ie>
Acked-by: Roland Dreier <rolandd@cisco.com>
Cc: Jiri Kosina <jkosina@suse.cz>
Acked-by: Dmitry Torokhov <dtor@mail.ru>
Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Acked-by: Mauro Carvalho Chehab <mchehab@infradead.org>
Acked-by: Pierre Ossman <drzeus-list@drzeus.cx>
Cc: Jeff Garzik <jeff@garzik.org>
Cc: "David S. Miller" <davem@davemloft.net>
Acked-by: Greg KH <greg@kroah.com>
Cc: James Bottomley <James.Bottomley@steeleye.com>
Cc: "Antonino A. Daplas" <adaplas@pol.net>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
											
										 
											2007-07-19 01:49:03 -07:00
										 |  |  |     info = kzalloc(sizeof(*info), GFP_KERNEL); | 
					
						
							| 
									
										
										
										
											2005-11-14 21:25:51 +01:00
										 |  |  |     if (!info) return -ENOMEM; | 
					
						
							| 
									
										
										
										
											2006-03-05 10:45:09 +01:00
										 |  |  |     link->priv = info; | 
					
						
							| 
									
										
										
										
											2006-03-31 17:21:06 +02:00
										 |  |  |     info->p_dev = link; | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-07-24 17:23:51 +02:00
										 |  |  |     link->resource[0]->flags |= IO_DATA_PATH_WIDTH_8; | 
					
						
							|  |  |  |     link->resource[1]->flags |= IO_DATA_PATH_WIDTH_8; | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  |     link->conf.Attributes = CONF_ENABLE_IRQ; | 
					
						
							|  |  |  |     link->conf.IntType = INT_MEMORY_AND_IO; | 
					
						
							| 
									
										
										
										
											2005-11-14 21:25:51 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-03-31 17:26:06 +02:00
										 |  |  |     return parport_config(link); | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | } /* parport_attach */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /*======================================================================
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     This deletes a driver "instance".  The device is de-registered | 
					
						
							|  |  |  |     with Card Services.  If it has been released, all local data | 
					
						
							|  |  |  |     structures are freed.  Otherwise, the structures will be freed | 
					
						
							|  |  |  |     when the device is released. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ======================================================================*/ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-03-31 17:21:06 +02:00
										 |  |  | static void parport_detach(struct pcmcia_device *link) | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2009-10-24 15:55:39 +02:00
										 |  |  |     dev_dbg(&link->dev, "parport_detach\n"); | 
					
						
							| 
									
										
										
										
											2005-11-14 21:23:14 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-03-02 00:09:29 +01:00
										 |  |  |     parport_cs_release(link); | 
					
						
							| 
									
										
										
										
											2005-11-14 21:23:14 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  |     kfree(link->priv); | 
					
						
							|  |  |  | } /* parport_detach */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /*======================================================================
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     parport_config() is scheduled to run after a CARD_INSERTION event | 
					
						
							|  |  |  |     is received, to configure the PCMCIA socket, and to make the | 
					
						
							|  |  |  |     parport device available to the system. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ======================================================================*/ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-07-29 08:38:55 +02:00
										 |  |  | static int parport_config_check(struct pcmcia_device *p_dev, | 
					
						
							|  |  |  | 				cistpl_cftable_entry_t *cfg, | 
					
						
							| 
									
										
										
										
											2008-08-02 15:30:31 +02:00
										 |  |  | 				cistpl_cftable_entry_t *dflt, | 
					
						
							| 
									
										
										
										
											2008-08-02 16:12:00 +02:00
										 |  |  | 				unsigned int vcc, | 
					
						
							| 
									
										
										
										
											2008-07-29 08:38:55 +02:00
										 |  |  | 				void *priv_data) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	if ((cfg->io.nwin > 0) || (dflt->io.nwin > 0)) { | 
					
						
							|  |  |  | 		cistpl_io_t *io = (cfg->io.nwin) ? &cfg->io : &dflt->io; | 
					
						
							| 
									
										
										
										
											2010-07-24 17:23:51 +02:00
										 |  |  | 		p_dev->io_lines = io->flags & CISTPL_IO_LINES_MASK; | 
					
						
							| 
									
										
										
										
											2008-07-29 08:38:55 +02:00
										 |  |  | 		if (epp_mode) | 
					
						
							|  |  |  | 			p_dev->conf.ConfigIndex |= FORCE_EPP_MODE; | 
					
						
							| 
									
										
										
										
											2010-07-24 17:23:51 +02:00
										 |  |  | 		p_dev->resource[0]->start = io->win[0].base; | 
					
						
							|  |  |  | 		p_dev->resource[0]->end = io->win[0].len; | 
					
						
							| 
									
										
										
										
											2008-07-29 08:38:55 +02:00
										 |  |  | 		if (io->nwin == 2) { | 
					
						
							| 
									
										
										
										
											2010-07-24 17:23:51 +02:00
										 |  |  | 			p_dev->resource[1]->start = io->win[1].base; | 
					
						
							|  |  |  | 			p_dev->resource[1]->end = io->win[1].len; | 
					
						
							| 
									
										
										
										
											2008-07-29 08:38:55 +02:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2010-07-24 17:23:51 +02:00
										 |  |  | 		if (pcmcia_request_io(p_dev) != 0) | 
					
						
							| 
									
										
										
										
											2008-08-02 15:30:31 +02:00
										 |  |  | 			return -ENODEV; | 
					
						
							| 
									
										
										
										
											2008-07-29 08:38:55 +02:00
										 |  |  | 		return 0; | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2008-08-02 16:12:00 +02:00
										 |  |  | 	return -ENODEV; | 
					
						
							| 
									
										
										
										
											2008-07-29 08:38:55 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-03-31 17:26:06 +02:00
										 |  |  | static int parport_config(struct pcmcia_device *link) | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | { | 
					
						
							|  |  |  |     parport_info_t *info = link->priv; | 
					
						
							|  |  |  |     struct parport *p; | 
					
						
							| 
									
										
										
										
											2009-10-24 15:55:39 +02:00
										 |  |  |     int ret; | 
					
						
							| 
									
										
										
										
											2008-07-29 08:38:55 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-24 15:55:39 +02:00
										 |  |  |     dev_dbg(&link->dev, "parport_config\n"); | 
					
						
							| 
									
										
										
										
											2008-07-29 08:38:55 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-24 15:55:39 +02:00
										 |  |  |     ret = pcmcia_loop_config(link, parport_config_check, NULL); | 
					
						
							|  |  |  |     if (ret) | 
					
						
							| 
									
										
										
										
											2008-07-29 08:38:55 +02:00
										 |  |  | 	    goto failed; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-07 12:21:16 +01:00
										 |  |  |     if (!link->irq) | 
					
						
							| 
									
										
										
										
											2009-10-24 15:55:39 +02:00
										 |  |  | 	    goto failed; | 
					
						
							|  |  |  |     ret = pcmcia_request_configuration(link, &link->conf); | 
					
						
							|  |  |  |     if (ret) | 
					
						
							|  |  |  | 	    goto failed; | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-07-24 15:58:54 +02:00
										 |  |  |     p = parport_pc_probe_port(link->resource[0]->start, | 
					
						
							|  |  |  | 			      link->resource[1]->start, | 
					
						
							| 
									
										
										
										
											2010-03-07 12:21:16 +01:00
										 |  |  | 			      link->irq, PARPORT_DMA_NONE, | 
					
						
							| 
									
										
										
										
											2009-04-07 15:30:57 +01:00
										 |  |  | 			      &link->dev, IRQF_SHARED); | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  |     if (p == NULL) { | 
					
						
							|  |  |  | 	printk(KERN_NOTICE "parport_cs: parport_pc_probe_port() at " | 
					
						
							| 
									
										
										
										
											2010-07-24 15:58:54 +02:00
										 |  |  | 	       "0x%3x, irq %u failed\n", | 
					
						
							|  |  |  | 	       (unsigned int) link->resource[0]->start, | 
					
						
							| 
									
										
										
										
											2010-03-07 12:21:16 +01:00
										 |  |  | 	       link->irq); | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 	goto failed; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     p->modes |= PARPORT_MODE_PCSPP; | 
					
						
							|  |  |  |     if (epp_mode) | 
					
						
							|  |  |  | 	p->modes |= PARPORT_MODE_TRISTATE | PARPORT_MODE_EPP; | 
					
						
							|  |  |  |     info->ndev = 1; | 
					
						
							|  |  |  |     info->port = p; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-03-31 17:26:06 +02:00
										 |  |  |     return 0; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | failed: | 
					
						
							|  |  |  |     parport_cs_release(link); | 
					
						
							| 
									
										
										
										
											2006-03-31 17:26:06 +02:00
										 |  |  |     return -ENODEV; | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | } /* parport_config */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /*======================================================================
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     After a card is removed, parport_cs_release() will unregister the | 
					
						
							|  |  |  |     device, and release the PCMCIA configuration.  If the device is | 
					
						
							|  |  |  |     still open, this will be postponed until it is closed. | 
					
						
							|  |  |  |      | 
					
						
							|  |  |  | ======================================================================*/ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-07-25 19:46:22 -07:00
										 |  |  | static void parport_cs_release(struct pcmcia_device *link) | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2006-01-15 09:32:39 +01:00
										 |  |  | 	parport_info_t *info = link->priv; | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-24 15:55:39 +02:00
										 |  |  | 	dev_dbg(&link->dev, "parport_release\n"); | 
					
						
							| 
									
										
										
										
											2006-01-15 09:32:39 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	if (info->ndev) { | 
					
						
							|  |  |  | 		struct parport *p = info->port; | 
					
						
							|  |  |  | 		parport_pc_unregister_port(p); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	info->ndev = 0; | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-03-31 17:21:06 +02:00
										 |  |  | 	pcmcia_disable_device(link); | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | } /* parport_cs_release */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-11-14 21:21:18 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-06-27 16:28:29 -07:00
										 |  |  | static struct pcmcia_device_id parport_ids[] = { | 
					
						
							|  |  |  | 	PCMCIA_DEVICE_FUNC_ID(3), | 
					
						
							| 
									
										
										
										
											2006-11-29 08:54:51 +00:00
										 |  |  | 	PCMCIA_MFC_DEVICE_PROD_ID12(1,"Elan","Serial+Parallel Port: SP230",0x3beb8cf2,0xdb9e58bc), | 
					
						
							| 
									
										
										
										
											2005-06-27 16:28:29 -07:00
										 |  |  | 	PCMCIA_DEVICE_MANF_CARD(0x0137, 0x0003), | 
					
						
							|  |  |  | 	PCMCIA_DEVICE_NULL | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | MODULE_DEVICE_TABLE(pcmcia, parport_ids); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | static struct pcmcia_driver parport_cs_driver = { | 
					
						
							|  |  |  | 	.owner		= THIS_MODULE, | 
					
						
							|  |  |  | 	.drv		= { | 
					
						
							|  |  |  | 		.name	= "parport_cs", | 
					
						
							|  |  |  | 	}, | 
					
						
							| 
									
										
										
										
											2006-03-31 17:26:06 +02:00
										 |  |  | 	.probe		= parport_probe, | 
					
						
							| 
									
										
										
										
											2005-11-14 21:23:14 +01:00
										 |  |  | 	.remove		= parport_detach, | 
					
						
							| 
									
										
										
										
											2005-06-27 16:28:29 -07:00
										 |  |  | 	.id_table	= parport_ids, | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static int __init init_parport_cs(void) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	return pcmcia_register_driver(&parport_cs_driver); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static void __exit exit_parport_cs(void) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	pcmcia_unregister_driver(&parport_cs_driver); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | module_init(init_parport_cs); | 
					
						
							|  |  |  | module_exit(exit_parport_cs); |