home *** CD-ROM | disk | FTP | other *** search
/ PC Welt 2006 November (DVD) / PCWELT_11_2006.ISO / casper / filesystem.squashfs / usr / src / linux-headers-2.6.17-6 / include / pcmcia / ss.h < prev    next >
Encoding:
C/C++ Source or Header  |  2006-08-11  |  7.8 KB  |  306 lines

  1. /*
  2.  * ss.h
  3.  *
  4.  * This program is free software; you can redistribute it and/or modify
  5.  * it under the terms of the GNU General Public License version 2 as
  6.  * published by the Free Software Foundation.
  7.  *
  8.  * The initial developer of the original code is David A. Hinds
  9.  * <dahinds@users.sourceforge.net>.  Portions created by David A. Hinds
  10.  * are Copyright (C) 1999 David A. Hinds.  All Rights Reserved.
  11.  *
  12.  * (C) 1999             David A. Hinds
  13.  */
  14.  
  15. #ifndef _LINUX_SS_H
  16. #define _LINUX_SS_H
  17.  
  18. #include <linux/device.h>
  19. #include <linux/sched.h>    /* task_struct, completion */
  20. #include <linux/mutex.h>
  21.  
  22. #include <pcmcia/cs_types.h>
  23. #include <pcmcia/cs.h>
  24. #include <pcmcia/bulkmem.h>
  25. #ifdef CONFIG_CARDBUS
  26. #include <linux/pci.h>
  27. #endif
  28.  
  29. /* Definitions for card status flags for GetStatus */
  30. #define SS_WRPROT    0x0001
  31. #define SS_CARDLOCK    0x0002
  32. #define SS_EJECTION    0x0004
  33. #define SS_INSERTION    0x0008
  34. #define SS_BATDEAD    0x0010
  35. #define SS_BATWARN    0x0020
  36. #define SS_READY    0x0040
  37. #define SS_DETECT    0x0080
  38. #define SS_POWERON    0x0100
  39. #define SS_GPI        0x0200
  40. #define SS_STSCHG    0x0400
  41. #define SS_CARDBUS    0x0800
  42. #define SS_3VCARD    0x1000
  43. #define SS_XVCARD    0x2000
  44. #define SS_PENDING    0x4000
  45. #define SS_ZVCARD    0x8000
  46.  
  47. /* InquireSocket capabilities */
  48. #define SS_CAP_PAGE_REGS    0x0001
  49. #define SS_CAP_VIRTUAL_BUS    0x0002
  50. #define SS_CAP_MEM_ALIGN    0x0004
  51. #define SS_CAP_STATIC_MAP    0x0008
  52. #define SS_CAP_PCCARD        0x4000
  53. #define SS_CAP_CARDBUS        0x8000
  54.  
  55. /* for GetSocket, SetSocket */
  56. typedef struct socket_state_t {
  57.     u_int    flags;
  58.     u_int    csc_mask;
  59.     u_char    Vcc, Vpp;
  60.     u_char    io_irq;
  61. } socket_state_t;
  62.  
  63. extern socket_state_t dead_socket;
  64.  
  65. /* Socket configuration flags */
  66. #define SS_PWR_AUTO    0x0010
  67. #define SS_IOCARD    0x0020
  68. #define SS_RESET    0x0040
  69. #define SS_DMA_MODE    0x0080
  70. #define SS_SPKR_ENA    0x0100
  71. #define SS_OUTPUT_ENA    0x0200
  72.  
  73. /* Flags for I/O port and memory windows */
  74. #define MAP_ACTIVE    0x01
  75. #define MAP_16BIT    0x02
  76. #define MAP_AUTOSZ    0x04
  77. #define MAP_0WS        0x08
  78. #define MAP_WRPROT    0x10
  79. #define MAP_ATTRIB    0x20
  80. #define MAP_USE_WAIT    0x40
  81. #define MAP_PREFETCH    0x80
  82.  
  83. /* Use this just for bridge windows */
  84. #define MAP_IOSPACE    0x20
  85.  
  86. /* power hook operations */
  87. #define HOOK_POWER_PRE    0x01
  88. #define HOOK_POWER_POST    0x02
  89.  
  90.  
  91. typedef struct pccard_io_map {
  92.     u_char    map;
  93.     u_char    flags;
  94.     u_short    speed;
  95.     kio_addr_t    start, stop;
  96. } pccard_io_map;
  97.  
  98. typedef struct pccard_mem_map {
  99.     u_char    map;
  100.     u_char    flags;
  101.     u_short    speed;
  102.     u_long    static_start;
  103.     u_int    card_start;
  104.     struct resource *res;
  105. } pccard_mem_map;
  106.  
  107. typedef struct cb_bridge_map {
  108.     u_char    map;
  109.     u_char    flags;
  110.     u_int    start, stop;
  111. } cb_bridge_map;
  112.  
  113. /*
  114.  * Socket operations.
  115.  */
  116. struct pcmcia_socket;
  117.  
  118. struct pccard_operations {
  119.     int (*init)(struct pcmcia_socket *sock);
  120.     int (*suspend)(struct pcmcia_socket *sock);
  121.     int (*get_status)(struct pcmcia_socket *sock, u_int *value);
  122.     int (*set_socket)(struct pcmcia_socket *sock, socket_state_t *state);
  123.     int (*set_io_map)(struct pcmcia_socket *sock, struct pccard_io_map *io);
  124.     int (*set_mem_map)(struct pcmcia_socket *sock, struct pccard_mem_map *mem);
  125. };
  126.  
  127. struct pccard_resource_ops {
  128.     int    (*validate_mem)        (struct pcmcia_socket *s);
  129.     int    (*adjust_io_region)    (struct resource *res,
  130.                      unsigned long r_start,
  131.                      unsigned long r_end,
  132.                      struct pcmcia_socket *s);
  133.     struct resource* (*find_io)    (unsigned long base, int num,
  134.                      unsigned long align,
  135.                      struct pcmcia_socket *s);
  136.     struct resource* (*find_mem)    (unsigned long base, unsigned long num,
  137.                      unsigned long align, int low,
  138.                      struct pcmcia_socket *s);
  139.     int    (*adjust_resource)    (struct pcmcia_socket *s,
  140.                      adjust_t *adj);
  141.     int    (*init)            (struct pcmcia_socket *s);
  142.     void    (*exit)            (struct pcmcia_socket *s);
  143. };
  144. /* SS_CAP_STATIC_MAP */
  145. extern struct pccard_resource_ops pccard_static_ops;
  146. /* !SS_CAP_STATIC_MAP */
  147. extern struct pccard_resource_ops pccard_nonstatic_ops;
  148.  
  149. /* static mem, dynamic IO sockets */
  150. extern struct pccard_resource_ops pccard_iodyn_ops;
  151.  
  152. /*
  153.  *  Calls to set up low-level "Socket Services" drivers
  154.  */
  155. struct pcmcia_socket;
  156.  
  157. typedef struct io_window_t {
  158.     kio_addr_t        InUse, Config;
  159.     struct resource        *res;
  160. } io_window_t;
  161.  
  162. #define WINDOW_MAGIC    0xB35C
  163. typedef struct window_t {
  164.     u_short            magic;
  165.     u_short            index;
  166.     struct pcmcia_device    *handle;
  167.     struct pcmcia_socket     *sock;
  168.     pccard_mem_map        ctl;
  169. } window_t;
  170.  
  171. /* Maximum number of IO windows per socket */
  172. #define MAX_IO_WIN 2
  173.  
  174. /* Maximum number of memory windows per socket */
  175. #define MAX_WIN 4
  176.  
  177. struct config_t;
  178. struct pcmcia_callback;
  179. struct user_info_t;
  180.  
  181. struct pcmcia_socket {
  182.     struct module            *owner;
  183.     spinlock_t            lock;
  184.     socket_state_t            socket;
  185.     u_int                state;
  186.     u_short                functions;
  187.     u_short                lock_count;
  188.     pccard_mem_map            cis_mem;
  189.     void __iomem             *cis_virt;
  190.     struct {
  191.         u_int            AssignedIRQ;
  192.         u_int            Config;
  193.     } irq;
  194.     io_window_t            io[MAX_IO_WIN];
  195.     window_t            win[MAX_WIN];
  196.     struct list_head        cis_cache;
  197.     u_int                fake_cis_len;
  198.     char                *fake_cis;
  199.  
  200.     struct list_head        socket_list;
  201.     struct completion        socket_released;
  202.  
  203.      /* deprecated */
  204.     unsigned int            sock;        /* socket number */
  205.  
  206.  
  207.     /* socket capabilities */
  208.     u_int                features;
  209.     u_int                irq_mask;
  210.     u_int                map_size;
  211.     kio_addr_t            io_offset;
  212.     u_char                pci_irq;
  213.     struct pci_dev *        cb_dev;
  214.  
  215.  
  216.     /* socket setup is done so resources should be able to be allocated. Only
  217.      * if set to 1, calls to find_{io,mem}_region are handled, and insertion
  218.      * events are actually managed by the PCMCIA layer.*/
  219.     u8                resource_setup_done:1;
  220.  
  221.     /* is set to one if resource setup is done using adjust_resource_info() */
  222.     u8                resource_setup_old:1;
  223.     u8                resource_setup_new:1;
  224.  
  225.     u8                reserved:5;
  226.  
  227.     /* socket operations */
  228.     struct pccard_operations *    ops;
  229.     struct pccard_resource_ops *    resource_ops;
  230.     void *                resource_data;
  231.  
  232.     /* Zoom video behaviour is so chip specific its not worth adding
  233.        this to _ops */
  234.     void                 (*zoom_video)(struct pcmcia_socket *, int);
  235.  
  236.     /* so is power hook */
  237.     int (*power_hook)(struct pcmcia_socket *sock, int operation);
  238. #ifdef CONFIG_CARDBUS
  239.     /* allows tuning the CB bridge before loading driver for the CB card */
  240.     void (*tune_bridge)(struct pcmcia_socket *sock, struct pci_bus *bus);
  241. #endif
  242.  
  243.     /* state thread */
  244.     struct mutex            skt_mutex;    /* protects socket h/w state */
  245.  
  246.     struct task_struct        *thread;
  247.     struct completion        thread_done;
  248.     wait_queue_head_t        thread_wait;
  249.     spinlock_t            thread_lock;    /* protects thread_events */
  250.     unsigned int            thread_events;
  251.  
  252.     /* pcmcia (16-bit) */
  253.     struct pcmcia_callback        *callback;
  254.  
  255. #if defined(CONFIG_PCMCIA) || defined(CONFIG_PCMCIA_MODULE)
  256.     struct list_head        devices_list;    /*  PCMCIA devices */
  257.     u8                device_count;    /* the number of devices, used
  258.                              * only internally and subject
  259.                              * to incorrectness and change */
  260.  
  261.     struct {
  262.         u8            present:1,    /* PCMCIA card is present in socket */
  263.                     busy:1,        /* "master" ioctl is used */
  264.                     dead:1,        /* pcmcia module is being unloaded */
  265.                     device_add_pending:1, /* a pseudo-multifunction-device
  266.                                    * add event is pending */
  267.                     reserved:4;
  268.     }                 pcmcia_state;
  269.  
  270.     struct work_struct        device_add;    /* for adding further pseudo-multifunction
  271.                              * devices */
  272.  
  273. #ifdef CONFIG_PCMCIA_IOCTL
  274.     struct user_info_t        *user;
  275.     wait_queue_head_t        queue;
  276. #endif
  277. #endif
  278.  
  279.     /* cardbus (32-bit) */
  280. #ifdef CONFIG_CARDBUS
  281.     struct resource *        cb_cis_res;
  282.     void __iomem            *cb_cis_virt;
  283. #endif
  284.  
  285.     /* socket device */
  286.     struct class_device        dev;
  287.     void                *driver_data;    /* data internal to the socket driver */
  288.  
  289. };
  290.  
  291. struct pcmcia_socket * pcmcia_get_socket_by_nr(unsigned int nr);
  292.  
  293.  
  294.  
  295. extern void pcmcia_parse_events(struct pcmcia_socket *socket, unsigned int events);
  296. extern int pcmcia_register_socket(struct pcmcia_socket *socket);
  297. extern void pcmcia_unregister_socket(struct pcmcia_socket *socket);
  298.  
  299. extern struct class pcmcia_socket_class;
  300.  
  301. /* socket drivers are expected to use these callbacks in their .drv struct */
  302. extern int pcmcia_socket_dev_suspend(struct device *dev, pm_message_t state);
  303. extern int pcmcia_socket_dev_resume(struct device *dev);
  304.  
  305. #endif /* _LINUX_SS_H */
  306.