]> git.hungrycats.org Git - linux/commitdiff
[PCMCIA] core socket sysfs support, export card type
authorDominik Brodowski <linux@de.rmk.(none)>
Tue, 6 Jul 2004 21:45:17 +0000 (22:45 +0100)
committerRussell King <rmk@flint.arm.linux.org.uk>
Tue, 6 Jul 2004 21:45:17 +0000 (22:45 +0100)
Patch from Dominik Brodowski

Add a first socket-related sysfs entry; and to keep things ordered,
do so in a new file drivers/pcmcia/socket_sysfs.c. To keep things
easy, all files will be present all the time, even if no card is in
the socket at a specific moment -- however, accessing the file will
result in -ENODEV then, so that

# cat /sys/class/pcmcia_socket/pcmcia_socket1/card_type

will cause an error message like

"cat: card_type: No such device"

which is quite self-explanatory.

The attribute "card_type" will return either "16-bit" or "32-bit",
depending on whether the PCCard is a 16-bit PCMCIA card or a 32-bit
CardBus card. The result "invalid" should not happen, and if it
happens, something strange is going on.

drivers/pcmcia/Makefile
drivers/pcmcia/cs.c
drivers/pcmcia/cs_internal.h
drivers/pcmcia/socket_sysfs.c [new file with mode: 0644]

index caefaebfb777d8ca387e3f3d1bbcd7eeabe2b58d..86acf410a401922823790dbc7d10f23ac16c525f 100644 (file)
@@ -18,7 +18,7 @@ obj-$(CONFIG_PCMCIA_SA1100)                   += sa11xx_core.o sa1100_cs.o
 obj-$(CONFIG_PCMCIA_SA1111)                    += sa11xx_core.o sa1111_cs.o
 obj-$(CONFIG_PCMCIA_PXA2XX)                     += pxa2xx_core.o pxa2xx_cs.o
 
-pcmcia_core-y                                  += cistpl.o rsrc_mgr.o bulkmem.o cs.o
+pcmcia_core-y                                  += cistpl.o rsrc_mgr.o bulkmem.o cs.o socket_sysfs.o
 pcmcia_core-$(CONFIG_CARDBUS)                  += cardbus.o
 
 sa11xx_core-y                                  += soc_common.o sa11xx_base.o
index 23ab71385a8ed17fd482ec1f874c7e698782155c..ee0170e0f421cb4e3072d3689a4c23fbe5b74edd 100644 (file)
@@ -695,6 +695,13 @@ static int pccardd(void *__skt)
                skt->thread = NULL;
                complete_and_exit(&skt->thread_done, 0);
        }
+       if (pccard_sysfs_init(skt)) {
+               printk(KERN_WARNING "PCMCIA: unable to register sysfs attributes for socket 0x%p\n",
+                       skt);
+               skt->thread = NULL;
+               class_device_unregister(&skt->dev);
+               complete_and_exit(&skt->thread_done, 0);
+       }
        complete(&skt->thread_done);
 
        add_wait_queue(&skt->thread_wait, &wait);
index 88396d87be216b1b437ee837d71d8d81082b1f13..8aa7ac532fb8fdd7c2de3e3ac543663d86726e50 100644 (file)
@@ -192,6 +192,9 @@ void undo_irq(u_int Attributes, int irq);
 int adjust_resource_info(client_handle_t handle, adjust_t *adj);
 void release_resource_db(void);
 
+/* In socket_sysfs.c */
+int pccard_sysfs_init(struct pcmcia_socket *s);
+
 extern struct rw_semaphore pcmcia_socket_list_rwsem;
 extern struct list_head pcmcia_socket_list;
 
diff --git a/drivers/pcmcia/socket_sysfs.c b/drivers/pcmcia/socket_sysfs.c
new file mode 100644 (file)
index 0000000..7550b6d
--- /dev/null
@@ -0,0 +1,76 @@
+/*
+ * socket_sysfs.c -- most of socket-related sysfs output
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * (C) 2003 - 2004             Dominik Brodowski
+ */
+
+#include <linux/module.h>
+#include <linux/moduleparam.h>
+#include <linux/init.h>
+#include <linux/kernel.h>
+#include <linux/config.h>
+#include <linux/string.h>
+#include <linux/major.h>
+#include <linux/errno.h>
+#include <linux/slab.h>
+#include <linux/mm.h>
+#include <linux/interrupt.h>
+#include <linux/timer.h>
+#include <linux/ioport.h>
+#include <linux/delay.h>
+#include <linux/pm.h>
+#include <linux/pci.h>
+#include <linux/device.h>
+#include <linux/suspend.h>
+#include <asm/system.h>
+#include <asm/irq.h>
+
+#define IN_CARD_SERVICES
+#include <pcmcia/version.h>
+#include <pcmcia/cs_types.h>
+#include <pcmcia/ss.h>
+#include <pcmcia/cs.h>
+#include <pcmcia/bulkmem.h>
+#include <pcmcia/cistpl.h>
+#include <pcmcia/cisreg.h>
+#include <pcmcia/ds.h>
+#include "cs_internal.h"
+
+#define to_socket(_dev) container_of(_dev, struct pcmcia_socket, dev)
+
+static ssize_t pccard_show_type(struct class_device *dev, char *buf)
+{
+       int val;
+       struct pcmcia_socket *s = to_socket(dev);
+
+        if (!(s->state & SOCKET_PRESENT))
+                return -ENODEV;
+       s->ops->get_status(s, &val);
+       if (val & SS_CARDBUS)
+               return sprintf(buf, "32-bit\n");
+       if (val & SS_DETECT)
+               return sprintf(buf, "16-bit\n");
+       return sprintf(buf, "invalid\n");
+}
+static CLASS_DEVICE_ATTR(card_type, 0400, pccard_show_type, NULL);
+
+static struct class_device_attribute *pccard_socket_attributes[] = {
+       &class_device_attr_card_type,
+       NULL,
+};
+
+int pccard_sysfs_init(struct pcmcia_socket *s)
+{
+       struct class_device_attribute *attr;
+       unsigned int i;
+       int ret = 0;
+        for (i = 0; (attr = pccard_socket_attributes[i]); i++) {
+                if ((ret = class_device_create_file(&s->dev, attr)))
+                       return (ret);
+        }
+       return (ret);
+}