Merge branch 'devel' of master.kernel.org:/home/rmk/linux-2.6-arm
[sfrench/cifs-2.6.git] / include / pcmcia / ds.h
index 61f7d2dec199fb3faa43f660f1cf1259cee3ae76..90ef552c42dd638f8557d6af3f0abc1963db7d8b 100644 (file)
@@ -96,6 +96,7 @@ typedef union ds_ioctl_arg_t {
 
 #ifdef __KERNEL__
 #include <linux/device.h>
+#include <pcmcia/ss.h>
 
 typedef struct dev_node_t {
     char               dev_name[DEV_NAME_LEN];
@@ -103,22 +104,15 @@ typedef struct dev_node_t {
     struct dev_node_t  *next;
 } dev_node_t;
 
-/* Flags for device state */
-#define DEV_PRESENT            0x01
-#define DEV_CONFIG             0x02
-#define DEV_SUSPEND_NORELEASE  0x04
-#define DEV_CONFIG_PENDING     0x10
-#define DEV_RELEASE_PENDING    0x20
-#define DEV_SUSPEND            0x40
-#define DEV_BUSY               0x80
-
-#define DEV_OK(l) \
-    ((l) && ((l->state & ~DEV_BUSY) == (DEV_CONFIG|DEV_PRESENT)))
-
 
 struct pcmcia_socket;
 struct config_t;
 
+struct pcmcia_dynids {
+       spinlock_t              lock;
+       struct list_head        list;
+};
+
 struct pcmcia_driver {
        int (*probe)            (struct pcmcia_device *dev);
        void (*remove)          (struct pcmcia_device *dev);
@@ -129,12 +123,14 @@ struct pcmcia_driver {
        struct module           *owner;
        struct pcmcia_device_id *id_table;
        struct device_driver    drv;
+       struct pcmcia_dynids    dynids;
 };
 
 /* driver registration */
 int pcmcia_register_driver(struct pcmcia_driver *driver);
 void pcmcia_unregister_driver(struct pcmcia_driver *driver);
 
+
 struct pcmcia_device {
        /* the socket and the device_no [for multifunction devices]
           uniquely define a pcmcia_device */
@@ -153,24 +149,34 @@ struct pcmcia_device {
 
        /* deprecated, will be cleaned up soon */
        dev_node_t              *dev_node;
-       u_int                   state;
        u_int                   open;
-       struct pcmcia_device    *handle;
        io_req_t                io;
        irq_req_t               irq;
        config_req_t            conf;
        window_handle_t         win;
-       void                    *priv;
 
-       u_int                   p_state;
+       /* Is the device suspended, or in the process of
+        * being removed? */
+       u16                     suspended:1;
+       u16                     _removed:1;
+
+       /* Flags whether io, irq, win configurations were
+        * requested, and whether the configuration is "locked" */
+       u16                     _irq:1;
+       u16                     _io:1;
+       u16                     _win:4;
+       u16                     _locked:1;
+
+       /* Flag whether a "fuzzy" func_id based match is
+        * allowed. */
+       u16                     allow_func_id_match:1;
 
        /* information about this device */
-       u                     has_manf_id:1;
-       u                     has_card_id:1;
-       u                     has_func_id:1;
+       u16                     has_manf_id:1;
+       u16                     has_card_id:1;
+       u16                     has_func_id:1;
 
-       u8                      allow_func_id_match:1;
-       u8                      reserved:4;
+       u16                     reserved:3;
 
        u8                      func_id;
        u16                     manf_id;
@@ -184,19 +190,18 @@ struct pcmcia_device {
        /* device driver wanted by cardmgr */
        struct pcmcia_driver *  cardmgr;
 #endif
+
+       /* data private to drivers */
+       void                    *priv;
 };
-typedef struct pcmcia_device dev_link_t;
 
 #define to_pcmcia_dev(n) container_of(n, struct pcmcia_device, dev)
 #define to_pcmcia_drv(n) container_of(n, struct pcmcia_driver, drv)
 
-#define handle_to_pdev(handle) (handle)
 #define handle_to_dev(handle) (handle->dev)
 
-#define dev_to_instance(dev) (dev)
-
 /* error reporting */
-void cs_error(client_handle_t handle, int func, int ret);
+void cs_error(struct pcmcia_device *handle, int func, int ret);
 
 #endif /* __KERNEL__ */
 #endif /* _LINUX_DS_H */