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