pcmcia: only copy CIS override data once
[safe/jmp/linux-2.6] / include / pcmcia / ss.h
index 25e6bf0..e34bef0 100644 (file)
 #ifndef _LINUX_SS_H
 #define _LINUX_SS_H
 
-#include <linux/config.h>
 #include <linux/device.h>
 #include <linux/sched.h>       /* task_struct, completion */
+#include <linux/mutex.h>
 
 #include <pcmcia/cs_types.h>
 #include <pcmcia/cs.h>
-#include <pcmcia/bulkmem.h>
 #ifdef CONFIG_CARDBUS
 #include <linux/pci.h>
 #endif
@@ -92,7 +91,7 @@ typedef struct pccard_io_map {
     u_char     map;
     u_char     flags;
     u_short    speed;
-    kio_addr_t start, stop;
+    u_int      start, stop;
 } pccard_io_map;
 
 typedef struct pccard_mem_map {
@@ -119,14 +118,13 @@ struct pccard_operations {
        int (*init)(struct pcmcia_socket *sock);
        int (*suspend)(struct pcmcia_socket *sock);
        int (*get_status)(struct pcmcia_socket *sock, u_int *value);
-       int (*get_socket)(struct pcmcia_socket *sock, socket_state_t *state);
        int (*set_socket)(struct pcmcia_socket *sock, socket_state_t *state);
        int (*set_io_map)(struct pcmcia_socket *sock, struct pccard_io_map *io);
        int (*set_mem_map)(struct pcmcia_socket *sock, struct pccard_mem_map *mem);
 };
 
 struct pccard_resource_ops {
-       void    (*validate_mem)         (struct pcmcia_socket *s);
+       int     (*validate_mem)         (struct pcmcia_socket *s);
        int     (*adjust_io_region)     (struct resource *res,
                                         unsigned long r_start,
                                         unsigned long r_end,
@@ -137,8 +135,14 @@ struct pccard_resource_ops {
        struct resource* (*find_mem)    (unsigned long base, unsigned long num,
                                         unsigned long align, int low,
                                         struct pcmcia_socket *s);
-       int     (*adjust_resource)      (struct pcmcia_socket *s,
-                                        adjust_t *adj);
+       int     (*add_io)               (struct pcmcia_socket *s,
+                                        unsigned int action,
+                                        unsigned long r_start,
+                                        unsigned long r_end);
+       int     (*add_mem)              (struct pcmcia_socket *s,
+                                        unsigned int action,
+                                        unsigned long r_start,
+                                        unsigned long r_end);
        int     (*init)                 (struct pcmcia_socket *s);
        void    (*exit)                 (struct pcmcia_socket *s);
 };
@@ -147,15 +151,16 @@ extern struct pccard_resource_ops pccard_static_ops;
 /* !SS_CAP_STATIC_MAP */
 extern struct pccard_resource_ops pccard_nonstatic_ops;
 
+/* static mem, dynamic IO sockets */
+extern struct pccard_resource_ops pccard_iodyn_ops;
+
 /*
  *  Calls to set up low-level "Socket Services" drivers
  */
 struct pcmcia_socket;
 
 typedef struct io_window_t {
-       u_int                   Attributes;
-       kio_addr_t              BasePort, NumPorts;
-       kio_addr_t              InUse, Config;
+       u_int                   InUse, Config;
        struct resource         *res;
 } io_window_t;
 
@@ -163,7 +168,7 @@ typedef struct io_window_t {
 typedef struct window_t {
        u_short                 magic;
        u_short                 index;
-       client_handle_t         handle;
+       struct pcmcia_device    *handle;
        struct pcmcia_socket    *sock;
        pccard_mem_map          ctl;
 } window_t;
@@ -187,7 +192,6 @@ struct pcmcia_socket {
        u_short                         lock_count;
        pccard_mem_map                  cis_mem;
        void __iomem                    *cis_virt;
-       struct config_t                 *config;
        struct {
                u_int                   AssignedIRQ;
                u_int                   Config;
@@ -195,8 +199,8 @@ struct pcmcia_socket {
        io_window_t                     io[MAX_IO_WIN];
        window_t                        win[MAX_WIN];
        struct list_head                cis_cache;
-       u_int                           fake_cis_len;
-       char                            *fake_cis;
+       size_t                          fake_cis_len;
+       u8                              *fake_cis;
 
        struct list_head                socket_list;
        struct completion               socket_released;
@@ -209,7 +213,7 @@ struct pcmcia_socket {
        u_int                           features;
        u_int                           irq_mask;
        u_int                           map_size;
-       kio_addr_t                      io_offset;
+       u_int                           io_offset;
        u_char                          pci_irq;
        struct pci_dev *                cb_dev;
 
@@ -242,11 +246,10 @@ struct pcmcia_socket {
 #endif
 
        /* state thread */
-       struct semaphore                skt_sem;        /* protects socket h/w state */
+       struct mutex                    skt_mutex;      /* protects socket h/w state */
 
        struct task_struct              *thread;
        struct completion               thread_done;
-       wait_queue_head_t               thread_wait;
        spinlock_t                      thread_lock;    /* protects thread_events */
        unsigned int                    thread_events;
 
@@ -263,9 +266,10 @@ struct pcmcia_socket {
                u8                      present:1,      /* PCMCIA card is present in socket */
                                        busy:1,         /* "master" ioctl is used */
                                        dead:1,         /* pcmcia module is being unloaded */
-                                       device_add_pending:1, /* a pseudo-multifunction-device
+                                       device_add_pending:1, /* a multifunction-device
                                                               * add event is pending */
-                                       reserved:4;
+                                       mfc_pfc:1,      /* the pending event adds a mfc (1) or pfc (0) */
+                                       reserved:3;
        }                               pcmcia_state;
 
        struct work_struct              device_add;     /* for adding further pseudo-multifunction
@@ -284,7 +288,7 @@ struct pcmcia_socket {
 #endif
 
        /* socket device */
-       struct class_device             dev;
+       struct device                   dev;
        void                            *driver_data;   /* data internal to the socket driver */
 
 };