[PATCH] pcmcia: add a config option for the PCMICA ioctl

Add a new config option to control the building of the PCMCIA IOCTL. Currently,
it is not yet made public, though the help text is there already.

Signed-off-by: Dominik Brodowski <linux@dominikbrodowksi.net>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
diff --git a/drivers/pcmcia/Kconfig b/drivers/pcmcia/Kconfig
index 22f7e8c..85af1fb 100644
--- a/drivers/pcmcia/Kconfig
+++ b/drivers/pcmcia/Kconfig
@@ -14,8 +14,8 @@
 	  Say Y here if you want to attach PCMCIA- or PC-cards to your Linux
 	  computer.  These are credit-card size devices such as network cards,
 	  modems or hard drives often used with laptops computers.  There are
-	  actually two varieties of these cards: the older 16 bit PCMCIA cards
-	  and the newer 32 bit CardBus cards.
+	  actually two varieties of these cards: 16 bit PCMCIA and 32 bit
+	  CardBus cards.
 
 	  To compile this driver as modules, choose M here: the
 	  module will be called pcmcia_core.
@@ -48,10 +48,9 @@
 	   PC-cards are such 16-bit PCMCIA cards, so unless you know you're
 	   only using 32-bit CardBus cards, say Y or M here.
 
-	   To use 16-bit PCMCIA cards, you will need supporting software from 
-	   David Hinds' pcmcia-cs package (see the file <file:Documentation/Changes>
- 	   for location).  Please also read the PCMCIA-HOWTO, available from
-	   <http://www.tldp.org/docs.html#howto>.
+	   To use 16-bit PCMCIA cards, you will need supporting software in
+	   most cases. (see the file <file:Documentation/Changes> for
+	   location and details).
 
 	   To compile this driver as modules, choose M here: the
 	   module will be called pcmcia.
@@ -72,6 +71,21 @@
 
 	  If unsure, say Y.
 
+config PCMCIA_IOCTL
+	bool
+	depends on PCMCIA
+	default y
+	help
+	  If you say Y here, the deprecated ioctl interface to the PCMCIA
+	  subsystem will be built. It is needed by cardmgr and cardctl
+	  (pcmcia-cs) to function properly.
+
+	  If you do not use the new pcmciautils package, and have a
+	  yenta, Cirrus PD6729, i82092, i82365 or tcic compatible bridge,
+	  you need to say Y here to be able to use 16-bit PCMCIA cards.
+
+	  If unsure, say Y.
+
 config CARDBUS
 	bool "32-bit CardBus support"	
 	depends on PCI
@@ -91,8 +105,6 @@
 
 config YENTA
 	tristate "CardBus yenta-compatible bridge support"
-	depends on PCI
-#fixme: remove dependendcy on CARDBUS
 	depends on CARDBUS
 	select PCCARD_NONSTATIC
 	---help---
diff --git a/drivers/pcmcia/ds.c b/drivers/pcmcia/ds.c
index 2c3c3da..0c7dc5b 100644
--- a/drivers/pcmcia/ds.c
+++ b/drivers/pcmcia/ds.c
@@ -116,8 +116,13 @@
 #define DS_SOCKET_DEAD			0x80
 
 /*====================================================================*/
+#ifdef CONFIG_PCMCIA_IOCTL
 
 static int major_dev = -1;
+static struct pcmcia_bus_socket * get_socket_info_by_nr(unsigned int nr);
+static struct pcmcia_driver * get_pcmcia_driver (dev_info_t *dev_info);
+
+#endif
 
 static int unbind_request(struct pcmcia_bus_socket *s);
 
@@ -356,8 +361,6 @@
 
 /*======================================================================*/
 
-static struct pcmcia_driver * get_pcmcia_driver (dev_info_t *dev_info);
-static struct pcmcia_bus_socket * get_socket_info_by_nr(unsigned int nr);
 
 static void pcmcia_release_bus_socket(struct kref *refcount)
 {
@@ -411,6 +414,7 @@
 }
 EXPORT_SYMBOL(pcmcia_unregister_driver);
 
+#ifdef CONFIG_PCMCIA_IOCTL
 #ifdef CONFIG_PROC_FS
 static struct proc_dir_entry *proc_pccard = NULL;
 
@@ -443,6 +447,7 @@
 	return (p - buf);
 }
 #endif
+#endif
 
 /* pcmcia_device handling */
 
@@ -998,6 +1003,8 @@
     
 ======================================================================*/
 
+#ifdef CONFIG_PCMCIA_IOCTL
+
 static int queue_empty(user_info_t *user)
 {
     return (user->event_head == user->event_tail);
@@ -1024,6 +1031,11 @@
 	queue_event(user, event);
     wake_up_interruptible(&s->queue);
 }
+#else
+static inline void handle_event(struct pcmcia_bus_socket *s, event_t event) { return; }
+static inline int handle_request(struct pcmcia_bus_socket *s, event_t event) { return CS_SUCCESS; }
+#endif
+
 
 
 /*======================================================================
@@ -1142,6 +1154,8 @@
 
 ======================================================================*/
 
+#ifdef CONFIG_PCMCIA_IOCTL
+
 static int bind_request(struct pcmcia_bus_socket *s, bind_info_t *bind_info)
 {
 	struct pcmcia_driver *p_drv;
@@ -1237,6 +1251,8 @@
 	return (ret);
 } /* bind_request */
 
+#endif
+
 
 int pcmcia_register_client(client_handle_t *handle, client_reg_t *req)
 {
@@ -1334,6 +1350,7 @@
 
 
 /*====================================================================*/
+#ifdef CONFIG_PCMCIA_IOCTL
 
 extern struct pci_bus *pcmcia_lookup_bus(struct pcmcia_socket *s);
 
@@ -1422,6 +1439,8 @@
 	return (ret);
 } /* get_device_info */
 
+#endif
+
 /*====================================================================*/
 
 /* unbind _all_ devices attached to a given pcmcia_bus_socket. The
@@ -1495,6 +1514,8 @@
 
 ======================================================================*/
 
+#ifdef CONFIG_PCMCIA_IOCTL
+
 static int ds_open(struct inode *inode, struct file *file)
 {
     socket_t i = iminor(inode);
@@ -1855,6 +1876,8 @@
 	.poll		= ds_poll,
 };
 
+#endif
+
 static int __devinit pcmcia_bus_add_socket(struct class_device *class_dev)
 {
 	struct pcmcia_socket *socket = class_get_devdata(class_dev);
@@ -1939,13 +1962,16 @@
 
 static int __init init_pcmcia_bus(void)
 {
+#ifdef CONFIG_PCMCIA_IOCTL
 	int i;
+#endif
 
 	spin_lock_init(&pcmcia_dev_list_lock);
 
 	bus_register(&pcmcia_bus_type);
 	class_interface_register(&pcmcia_bus_interface);
 
+#ifdef CONFIG_PCMCIA_IOCTL
 	/* Set up character device for user mode clients */
 	i = register_chrdev(0, "pcmcia", &ds_fops);
 	if (i < 0)
@@ -1959,6 +1985,7 @@
 	if (proc_pccard)
 		create_proc_read_entry("drivers",0,proc_pccard,proc_read_drivers,NULL);
 #endif
+#endif
 
 	return 0;
 }
@@ -1970,6 +1997,7 @@
 {
 	class_interface_unregister(&pcmcia_bus_interface);
 
+#ifdef CONFIG_PCMCIA_IOCTL
 #ifdef CONFIG_PROC_FS
 	if (proc_pccard) {
 		remove_proc_entry("drivers", proc_pccard);
@@ -1978,6 +2006,7 @@
 #endif
 	if (major_dev != -1)
 		unregister_chrdev(major_dev, "pcmcia");
+#endif
 
 	bus_unregister(&pcmcia_bus_type);
 }
@@ -1986,7 +2015,7 @@
 
 
 /* helpers for backwards-compatible functions */
-
+#ifdef CONFIG_PCMCIA_IOCTL
 static struct pcmcia_bus_socket * get_socket_info_by_nr(unsigned int nr)
 {
 	struct pcmcia_socket * s = pcmcia_get_socket_by_nr(nr);
@@ -2011,5 +2040,6 @@
 
 	return (p_drv);
 }
+#endif
 
 MODULE_ALIAS("ds");