Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b5e43913 authored by Dominik Brodowski's avatar Dominik Brodowski Committed by Linus Torvalds
Browse files

[PATCH] pcmcia: make PCMCIA status a bitfield



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: default avatarDominik Brodowski <linux@dominikbrodowski.net>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 90c6cdd1
Loading
Loading
Loading
Loading
+6 −6
Original line number Diff line number Diff line
@@ -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;

+8 −6
Original line number Diff line number Diff line
@@ -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);

+6 −6
Original line number Diff line number Diff line
@@ -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;