linux/include/pcmcia/ds.h
<<
>>
Prefs
   1/*
   2 * ds.h -- 16-bit PCMCIA core support
   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 * (C) 2003 - 2008      Dominik Brodowski
  14 */
  15
  16#ifndef _LINUX_DS_H
  17#define _LINUX_DS_H
  18
  19#ifdef __KERNEL__
  20#include <linux/mod_devicetable.h>
  21#endif
  22
  23#include <pcmcia/cs_types.h>
  24#include <pcmcia/device_id.h>
  25
  26#ifdef __KERNEL__
  27#include <linux/device.h>
  28#include <pcmcia/ss.h>
  29
  30/*
  31 * PCMCIA device drivers (16-bit cards only; 32-bit cards require CardBus
  32 * a.k.a. PCI drivers
  33 */
  34struct pcmcia_socket;
  35struct pcmcia_device;
  36struct config_t;
  37struct net_device;
  38
  39/* dynamic device IDs for PCMCIA device drivers. See
  40 * Documentation/pcmcia/driver.txt for details.
  41*/
  42struct pcmcia_dynids {
  43        spinlock_t              lock;
  44        struct list_head        list;
  45};
  46
  47struct pcmcia_driver {
  48        int (*probe)            (struct pcmcia_device *dev);
  49        void (*remove)          (struct pcmcia_device *dev);
  50
  51        int (*suspend)          (struct pcmcia_device *dev);
  52        int (*resume)           (struct pcmcia_device *dev);
  53
  54        struct module           *owner;
  55        struct pcmcia_device_id *id_table;
  56        struct device_driver    drv;
  57        struct pcmcia_dynids    dynids;
  58};
  59
  60/* driver registration */
  61int pcmcia_register_driver(struct pcmcia_driver *driver);
  62void pcmcia_unregister_driver(struct pcmcia_driver *driver);
  63
  64/* Some drivers use dev_node_t to store char or block device information.
  65 * Don't use this in new drivers, though.
  66 */
  67typedef struct dev_node_t {
  68        char                    dev_name[DEV_NAME_LEN];
  69        u_short                 major, minor;
  70        struct dev_node_t       *next;
  71} dev_node_t;
  72
  73struct pcmcia_device {
  74        /* the socket and the device_no [for multifunction devices]
  75           uniquely define a pcmcia_device */
  76        struct pcmcia_socket    *socket;
  77
  78        char                    *devname;
  79
  80        u8                      device_no;
  81
  82        /* the hardware "function" device; certain subdevices can
  83         * share one hardware "function" device. */
  84        u8                      func;
  85        struct config_t         *function_config;
  86
  87        struct list_head        socket_device_list;
  88
  89        /* deprecated, will be cleaned up soon */
  90        dev_node_t              *dev_node;
  91        u_int                   open;
  92        io_req_t                io;
  93        irq_req_t               irq;
  94        config_req_t            conf;
  95        window_handle_t         win;
  96
  97        /* Is the device suspended, or in the process of
  98         * being removed? */
  99        u16                     suspended:1;
 100        u16                     _removed:1;
 101
 102        /* Flags whether io, irq, win configurations were
 103         * requested, and whether the configuration is "locked" */
 104        u16                     _irq:1;
 105        u16                     _io:1;
 106        u16                     _win:4;
 107        u16                     _locked:1;
 108
 109        /* Flag whether a "fuzzy" func_id based match is
 110         * allowed. */
 111        u16                     allow_func_id_match:1;
 112
 113        /* information about this device */
 114        u16                     has_manf_id:1;
 115        u16                     has_card_id:1;
 116        u16                     has_func_id:1;
 117
 118        u16                     reserved:3;
 119
 120        u8                      func_id;
 121        u16                     manf_id;
 122        u16                     card_id;
 123
 124        char                    *prod_id[4];
 125
 126        u64                     dma_mask;
 127        struct device           dev;
 128
 129#ifdef CONFIG_PCMCIA_IOCTL
 130        /* device driver wanted by cardmgr */
 131        struct pcmcia_driver    *cardmgr;
 132#endif
 133
 134        /* data private to drivers */
 135        void                    *priv;
 136};
 137
 138#define to_pcmcia_dev(n) container_of(n, struct pcmcia_device, dev)
 139#define to_pcmcia_drv(n) container_of(n, struct pcmcia_driver, drv)
 140
 141
 142/*
 143 * CIS access.
 144 *
 145 * Please use the following functions to access CIS tuples:
 146 * - pcmcia_get_tuple()
 147 * - pcmcia_loop_tuple()
 148 * - pcmcia_get_mac_from_cis()
 149 *
 150 * To parse a tuple_t, pcmcia_parse_tuple() exists. Its interface
 151 * might change in future.
 152 */
 153
 154/* get the very first CIS entry of type @code. Note that buf is pointer
 155 * to u8 *buf; and that you need to kfree(buf) afterwards. */
 156size_t pcmcia_get_tuple(struct pcmcia_device *p_dev, cisdata_t code,
 157                        u8 **buf);
 158
 159/* loop over CIS entries */
 160int pcmcia_loop_tuple(struct pcmcia_device *p_dev, cisdata_t code,
 161                      int (*loop_tuple) (struct pcmcia_device *p_dev,
 162                                         tuple_t *tuple,
 163                                         void *priv_data),
 164                      void *priv_data);
 165
 166/* get the MAC address from CISTPL_FUNCE */
 167int pcmcia_get_mac_from_cis(struct pcmcia_device *p_dev,
 168                            struct net_device *dev);
 169
 170
 171/* parse a tuple_t */
 172int pcmcia_parse_tuple(tuple_t *tuple, cisparse_t *parse);
 173
 174/* loop CIS entries for valid configuration */
 175int pcmcia_loop_config(struct pcmcia_device *p_dev,
 176                       int      (*conf_check)   (struct pcmcia_device *p_dev,
 177                                                 cistpl_cftable_entry_t *cf,
 178                                                 cistpl_cftable_entry_t *dflt,
 179                                                 unsigned int vcc,
 180                                                 void *priv_data),
 181                       void *priv_data);
 182
 183/* is the device still there? */
 184struct pcmcia_device *pcmcia_dev_present(struct pcmcia_device *p_dev);
 185
 186/* low-level interface reset */
 187int pcmcia_reset_card(struct pcmcia_socket *skt);
 188
 189/* CIS config */
 190int pcmcia_access_configuration_register(struct pcmcia_device *p_dev,
 191                                         conf_reg_t *reg);
 192
 193/* device configuration */
 194int pcmcia_request_io(struct pcmcia_device *p_dev, io_req_t *req);
 195int pcmcia_request_irq(struct pcmcia_device *p_dev, irq_req_t *req);
 196int pcmcia_request_configuration(struct pcmcia_device *p_dev,
 197                                 config_req_t *req);
 198
 199int pcmcia_request_window(struct pcmcia_device *p_dev, win_req_t *req,
 200                          window_handle_t *wh);
 201int pcmcia_release_window(struct pcmcia_device *p_dev, window_handle_t win);
 202int pcmcia_map_mem_page(struct pcmcia_device *p_dev, window_handle_t win,
 203                        memreq_t *req);
 204
 205int pcmcia_modify_configuration(struct pcmcia_device *p_dev, modconf_t *mod);
 206void pcmcia_disable_device(struct pcmcia_device *p_dev);
 207
 208#endif /* __KERNEL__ */
 209
 210
 211
 212/* Below, there are only definitions which are used by
 213 * - the PCMCIA ioctl
 214 * - deprecated PCMCIA userspace tools only
 215 *
 216 * here be dragons ... here be dragons ... here be dragons ... here be drag
 217 */
 218
 219#if defined(CONFIG_PCMCIA_IOCTL) || !defined(__KERNEL__)
 220
 221#if defined(__arm__) || defined(__mips__) || defined(__avr32__) || \
 222        defined(__bfin__)
 223/* This (ioaddr_t) is exposed to userspace & hence cannot be changed. */
 224typedef u_int   ioaddr_t;
 225#else
 226typedef u_short ioaddr_t;
 227#endif
 228
 229/* for AdjustResourceInfo */
 230typedef struct adjust_t {
 231        u_int                   Action;
 232        u_int                   Resource;
 233        u_int                   Attributes;
 234        union {
 235                struct memory {
 236                        u_long          Base;
 237                        u_long          Size;
 238                } memory;
 239                struct io {
 240                        ioaddr_t        BasePort;
 241                        ioaddr_t        NumPorts;
 242                        u_int           IOAddrLines;
 243                } io;
 244                struct irq {
 245                        u_int           IRQ;
 246                } irq;
 247        } resource;
 248} adjust_t;
 249
 250/* Action field */
 251#define REMOVE_MANAGED_RESOURCE         1
 252#define ADD_MANAGED_RESOURCE            2
 253#define GET_FIRST_MANAGED_RESOURCE      3
 254#define GET_NEXT_MANAGED_RESOURCE       4
 255/* Resource field */
 256#define RES_MEMORY_RANGE                1
 257#define RES_IO_RANGE                    2
 258#define RES_IRQ                         3
 259/* Attribute field */
 260#define RES_IRQ_TYPE                    0x03
 261#define RES_IRQ_TYPE_EXCLUSIVE          0
 262#define RES_IRQ_TYPE_TIME               1
 263#define RES_IRQ_TYPE_DYNAMIC            2
 264#define RES_IRQ_CSC                     0x04
 265#define RES_SHARED                      0x08
 266#define RES_RESERVED                    0x10
 267#define RES_ALLOCATED                   0x20
 268#define RES_REMOVED                     0x40
 269
 270
 271typedef struct tuple_parse_t {
 272        tuple_t                 tuple;
 273        cisdata_t               data[255];
 274        cisparse_t              parse;
 275} tuple_parse_t;
 276
 277typedef struct win_info_t {
 278        window_handle_t         handle;
 279        win_req_t               window;
 280        memreq_t                map;
 281} win_info_t;
 282
 283typedef struct bind_info_t {
 284        dev_info_t              dev_info;
 285        u_char                  function;
 286        struct pcmcia_device    *instance;
 287        char                    name[DEV_NAME_LEN];
 288        u_short                 major, minor;
 289        void                    *next;
 290} bind_info_t;
 291
 292typedef struct mtd_info_t {
 293        dev_info_t              dev_info;
 294        u_int                   Attributes;
 295        u_int                   CardOffset;
 296} mtd_info_t;
 297
 298typedef struct region_info_t {
 299        u_int                   Attributes;
 300        u_int                   CardOffset;
 301        u_int                   RegionSize;
 302        u_int                   AccessSpeed;
 303        u_int                   BlockSize;
 304        u_int                   PartMultiple;
 305        u_char                  JedecMfr, JedecInfo;
 306        memory_handle_t         next;
 307} region_info_t;
 308
 309#define REGION_TYPE             0x0001
 310#define REGION_TYPE_CM          0x0000
 311#define REGION_TYPE_AM          0x0001
 312#define REGION_PREFETCH         0x0008
 313#define REGION_CACHEABLE        0x0010
 314#define REGION_BAR_MASK         0xe000
 315#define REGION_BAR_SHIFT        13
 316
 317/* For ReplaceCIS */
 318typedef struct cisdump_t {
 319        u_int                   Length;
 320        cisdata_t               Data[CISTPL_MAX_CIS_SIZE];
 321} cisdump_t;
 322
 323/* for GetConfigurationInfo */
 324typedef struct config_info_t {
 325        u_char                  Function;
 326        u_int                   Attributes;
 327        u_int                   Vcc, Vpp1, Vpp2;
 328        u_int                   IntType;
 329        u_int                   ConfigBase;
 330        u_char                  Status, Pin, Copy, Option, ExtStatus;
 331        u_int                   Present;
 332        u_int                   CardValues;
 333        u_int                   AssignedIRQ;
 334        u_int                   IRQAttributes;
 335        ioaddr_t                BasePort1;
 336        ioaddr_t                NumPorts1;
 337        u_int                   Attributes1;
 338        ioaddr_t                BasePort2;
 339        ioaddr_t                NumPorts2;
 340        u_int                   Attributes2;
 341        u_int                   IOAddrLines;
 342} config_info_t;
 343
 344/* For ValidateCIS */
 345typedef struct cisinfo_t {
 346        u_int                   Chains;
 347} cisinfo_t;
 348
 349typedef struct cs_status_t {
 350        u_char                  Function;
 351        event_t                 CardState;
 352        event_t                 SocketState;
 353} cs_status_t;
 354
 355typedef union ds_ioctl_arg_t {
 356        adjust_t                adjust;
 357        config_info_t           config;
 358        tuple_t                 tuple;
 359        tuple_parse_t           tuple_parse;
 360        client_req_t            client_req;
 361        cs_status_t             status;
 362        conf_reg_t              conf_reg;
 363        cisinfo_t               cisinfo;
 364        region_info_t           region;
 365        bind_info_t             bind_info;
 366        mtd_info_t              mtd_info;
 367        win_info_t              win_info;
 368        cisdump_t               cisdump;
 369} ds_ioctl_arg_t;
 370
 371#define DS_ADJUST_RESOURCE_INFO                 _IOWR('d',  2, adjust_t)
 372#define DS_GET_CONFIGURATION_INFO               _IOWR('d',  3, config_info_t)
 373#define DS_GET_FIRST_TUPLE                      _IOWR('d',  4, tuple_t)
 374#define DS_GET_NEXT_TUPLE                       _IOWR('d',  5, tuple_t)
 375#define DS_GET_TUPLE_DATA                       _IOWR('d',  6, tuple_parse_t)
 376#define DS_PARSE_TUPLE                          _IOWR('d',  7, tuple_parse_t)
 377#define DS_RESET_CARD                           _IO  ('d',  8)
 378#define DS_GET_STATUS                           _IOWR('d',  9, cs_status_t)
 379#define DS_ACCESS_CONFIGURATION_REGISTER        _IOWR('d', 10, conf_reg_t)
 380#define DS_VALIDATE_CIS                         _IOR ('d', 11, cisinfo_t)
 381#define DS_SUSPEND_CARD                         _IO  ('d', 12)
 382#define DS_RESUME_CARD                          _IO  ('d', 13)
 383#define DS_EJECT_CARD                           _IO  ('d', 14)
 384#define DS_INSERT_CARD                          _IO  ('d', 15)
 385#define DS_GET_FIRST_REGION                     _IOWR('d', 16, region_info_t)
 386#define DS_GET_NEXT_REGION                      _IOWR('d', 17, region_info_t)
 387#define DS_REPLACE_CIS                          _IOWR('d', 18, cisdump_t)
 388#define DS_GET_FIRST_WINDOW                     _IOR ('d', 19, win_info_t)
 389#define DS_GET_NEXT_WINDOW                      _IOWR('d', 20, win_info_t)
 390#define DS_GET_MEM_PAGE                         _IOWR('d', 21, win_info_t)
 391
 392#define DS_BIND_REQUEST                         _IOWR('d', 60, bind_info_t)
 393#define DS_GET_DEVICE_INFO                      _IOWR('d', 61, bind_info_t)
 394#define DS_GET_NEXT_DEVICE                      _IOWR('d', 62, bind_info_t)
 395#define DS_UNBIND_REQUEST                       _IOW ('d', 63, bind_info_t)
 396#define DS_BIND_MTD                             _IOWR('d', 64, mtd_info_t)
 397
 398
 399/* used in userspace only */
 400#define CS_IN_USE                       0x1e
 401
 402#define INFO_MASTER_CLIENT      0x01
 403#define INFO_IO_CLIENT          0x02
 404#define INFO_MTD_CLIENT         0x04
 405#define INFO_MEM_CLIENT         0x08
 406#define MAX_NUM_CLIENTS         3
 407
 408#define INFO_CARD_SHARE         0x10
 409#define INFO_CARD_EXCL          0x20
 410
 411
 412#endif /* !defined(__KERNEL__) || defined(CONFIG_PCMCIA_IOCTL) */
 413
 414#endif /* _LINUX_DS_H */
 415
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.