Commit c792495f authored by Dominik Brodowski's avatar Dominik Brodowski Committed by Russell King

[PCMCIA] core socket sysfs support, export card type

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.
parent b5b41e49
...@@ -18,7 +18,7 @@ obj-$(CONFIG_PCMCIA_SA1100) += sa11xx_core.o sa1100_cs.o ...@@ -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_SA1111) += sa11xx_core.o sa1111_cs.o
obj-$(CONFIG_PCMCIA_PXA2XX) += pxa2xx_core.o pxa2xx_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 pcmcia_core-$(CONFIG_CARDBUS) += cardbus.o
sa11xx_core-y += soc_common.o sa11xx_base.o sa11xx_core-y += soc_common.o sa11xx_base.o
......
...@@ -695,6 +695,13 @@ static int pccardd(void *__skt) ...@@ -695,6 +695,13 @@ static int pccardd(void *__skt)
skt->thread = NULL; skt->thread = NULL;
complete_and_exit(&skt->thread_done, 0); 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); complete(&skt->thread_done);
add_wait_queue(&skt->thread_wait, &wait); add_wait_queue(&skt->thread_wait, &wait);
......
...@@ -192,6 +192,9 @@ void undo_irq(u_int Attributes, int irq); ...@@ -192,6 +192,9 @@ void undo_irq(u_int Attributes, int irq);
int adjust_resource_info(client_handle_t handle, adjust_t *adj); int adjust_resource_info(client_handle_t handle, adjust_t *adj);
void release_resource_db(void); 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 rw_semaphore pcmcia_socket_list_rwsem;
extern struct list_head pcmcia_socket_list; extern struct list_head pcmcia_socket_list;
......
/*
* 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);
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment