[PATCH] pcmcia: make PCMCIA status a bitfield
authorDominik Brodowski <linux@dominikbrodowski.net>
Mon, 27 Jun 2005 23:28:50 +0000 (16:28 -0700)
committerLinus Torvalds <torvalds@ppc970.osdl.org>
Tue, 28 Jun 2005 01:03:19 +0000 (18:03 -0700)
make pcmcia_bus_socket->state a bitfield, and rename it pcmcia_state to
prepare for struct pcmcia_bus_socket integration into struct pcmcia_socket.

Signed-off-by: Dominik Brodowski <linux@dominikbrodowski.net>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
drivers/pcmcia/ds.c
drivers/pcmcia/ds_internal.h
drivers/pcmcia/pcmcia_ioctl.c

index 54068f4..85e2cb2 100644 (file)
@@ -622,14 +622,14 @@ static void pcmcia_delayed_add_pseudo_device(void *data)
 {
        struct pcmcia_bus_socket *s = data;
        pcmcia_device_add(s, 0);
-       s->device_add_pending = 0;
+       s->pcmcia_state.device_add_pending = 0;
 }
 
 static inline void pcmcia_add_pseudo_device(struct pcmcia_bus_socket *s)
 {
-       if (!s->device_add_pending) {
+       if (!s->pcmcia_state.device_add_pending) {
                schedule_work(&s->device_add);
-               s->device_add_pending = 1;
+               s->pcmcia_state.device_add_pending = 1;
        }
        return;
 }
@@ -981,14 +981,14 @@ static int ds_event(struct pcmcia_socket *skt, event_t event, int priority)
        switch (event) {
 
        case CS_EVENT_CARD_REMOVAL:
-               s->state &= ~DS_SOCKET_PRESENT;
+               s->pcmcia_state.present = 0;
                send_event(skt, event, priority);
                unbind_request(s);
                handle_event(s, event);
                break;
        
        case CS_EVENT_CARD_INSERTION:
-               s->state |= DS_SOCKET_PRESENT;
+               s->pcmcia_state.present = 1;
                pcmcia_card_add(skt);
                handle_event(s, event);
                break;
@@ -1229,7 +1229,7 @@ static void pcmcia_bus_remove_socket(struct class_device *class_dev)
 
        pccard_register_pcmcia(socket, NULL);
 
-       socket->pcmcia->state |= DS_SOCKET_DEAD;
+       socket->pcmcia->pcmcia_state.dead = 1;
        pcmcia_put_bus_socket(socket->pcmcia);
        socket->pcmcia = NULL;
 
index b05bc39..2c3bb18 100644 (file)
@@ -5,7 +5,6 @@ struct user_info_t;
 /* Socket state information */
 struct pcmcia_bus_socket {
        struct kref             refcount;
-       int                     state;
        struct pcmcia_socket    *parent;
 
        /* the PCMCIA devices connected to this socket (normally one, more
@@ -15,7 +14,14 @@ struct pcmcia_bus_socket {
                                               * only internally and subject
                                               * to incorrectness and change */
 
-       u8                      device_add_pending;
+       struct {
+               u8              present:1,
+                               busy:1,
+                               dead:1,
+                               device_add_pending:1,
+                               reserved:4;
+       }                       pcmcia_state;
+
        struct work_struct      device_add;
 
 
@@ -29,10 +35,6 @@ extern spinlock_t pcmcia_dev_list_lock;
 extern struct bus_type pcmcia_bus_type;
 
 
-#define DS_SOCKET_PRESENT              0x01
-#define DS_SOCKET_BUSY                 0x02
-#define DS_SOCKET_DEAD                 0x80
-
 extern struct pcmcia_device * pcmcia_get_dev(struct pcmcia_device *p_dev);
 extern void pcmcia_put_dev(struct pcmcia_device *p_dev);
 
index e8d2c95..b223f52 100644 (file)
@@ -404,12 +404,12 @@ static int ds_open(struct inode *inode, struct file *file)
            return -ENODEV;
 
     if ((file->f_flags & O_ACCMODE) != O_RDONLY) {
-           if (s->state & DS_SOCKET_BUSY) {
+           if (s->pcmcia_state.busy) {
                    pcmcia_put_bus_socket(s);
                    return -EBUSY;
            }
        else
-           s->state |= DS_SOCKET_BUSY;
+           s->pcmcia_state.busy = 1;
     }
 
     user = kmalloc(sizeof(user_info_t), GFP_KERNEL);
@@ -424,7 +424,7 @@ static int ds_open(struct inode *inode, struct file *file)
     s->user = user;
     file->private_data = user;
 
-    if (s->state & DS_SOCKET_PRESENT)
+    if (s->pcmcia_state.present)
        queue_event(user, CS_EVENT_CARD_INSERTION);
     return 0;
 } /* ds_open */
@@ -446,7 +446,7 @@ static int ds_release(struct inode *inode, struct file *file)
 
     /* Unlink user data structure */
     if ((file->f_flags & O_ACCMODE) != O_RDONLY) {
-       s->state &= ~DS_SOCKET_BUSY;
+       s->pcmcia_state.busy = 0;
     }
     file->private_data = NULL;
     for (link = &s->user; *link; link = &(*link)->next)
@@ -480,7 +480,7 @@ static ssize_t ds_read(struct file *file, char __user *buf,
        return -EIO;
 
     s = user->socket;
-    if (s->state & DS_SOCKET_DEAD)
+    if (s->pcmcia_state.dead)
         return -EIO;
 
     ret = wait_event_interruptible(s->queue, !queue_empty(user));
@@ -550,7 +550,7 @@ static int ds_ioctl(struct inode * inode, struct file * file,
        return -EIO;
 
     s = user->socket;
-    if (s->state & DS_SOCKET_DEAD)
+    if (s->pcmcia_state.dead)
         return -EIO;
 
     size = (cmd & IOCSIZE_MASK) >> IOCSIZE_SHIFT;