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;
  37
  38/* dynamic device IDs for PCMCIA device drivers. See
  39 * Documentation/pcmcia/driver.txt for details.
  40*/
  41struct pcmcia_dynids {
  42        spinlock_t              lock;
  43        struct list_head        list;
  44};
  45
  46struct pcmcia_driver {
  47        int (*probe)            (struct pcmcia_device *dev);
  48        void (*remove)          (struct pcmcia_device *dev);
  49
  50        int (*suspend)          (struct pcmcia_device *dev);
  51        int (*resume)           (struct pcmcia_device *dev);
  52
  53        struct module           *owner;
  54        struct pcmcia_device_id *id_table;
  55        struct device_driver    drv;
  56        struct pcmcia_dynids    dynids;
  57};
  58
  59/* driver registration */
  60int pcmcia_register_driver(struct pcmcia_driver *driver);
  61void pcmcia_unregister_driver(struct pcmcia_driver *driver);
  62
  63/* Some drivers use dev_node_t to store char or block device information.
  64 * Don't use this in new drivers, though.
  65 */
  66typedef struct dev_node_t {
  67        char                    dev_name[DEV_NAME_LEN];
  68        u_short                 major, minor;
  69        struct dev_node_t       *next;
  70} dev_node_t;
  71
  72struct pcmcia_device {
  73        /* the socket and the device_no [for multifunction devices]
  74           uniquely define a pcmcia_device */
  75        struct pcmcia_socket    *socket;
  76
  77        char                    *devname;
  78
  79        u8                      device_no;
  80
  81        /* the hardware "function" device; certain subdevices can
  82         * share one hardware "function" device. */
  83        u8                      func;
  84        struct config_t*        function_config;
  85
  86        struct list_head        socket_device_list;
  87
  88        /* deprecated, will be cleaned up soon */
  89        dev_node_t              *dev_node;
  90        u_int                   open;
  91        io_req_t                io;
  92        irq_req_t               irq;
  93        config_req_t            conf;
  94        window_handle_t         win;
  95
  96        /* Is the device suspended, or in the process of
  97         * being removed? */
  98        u16                     suspended:1;
  99        u16                     _removed:1;
 100
 101        /* Flags whether io, irq, win configurations were
 102         * requested, and whether the configuration is "locked" */
 103        u16                     _irq:1;
 104        u16                     _io:1;
 105        u16                     _win:4;
 106        u16                     _locked:1;
 107
 108        /* Flag whether a "fuzzy" func_id based match is
 109         * allowed. */
 110        u16                     allow_func_id_match:1;
 111
 112        /* information about this device */
 113        u16                     has_manf_id:1;
 114        u16                     has_card_id:1;
 115        u16                     has_func_id:1;
 116
 117        u16                     reserved:3;
 118
 119        u8                      func_id;
 120        u16                     manf_id;
 121        u16                     card_id;
 122
 123        char *                  prod_id[4];
 124
 125        u64                     dma_mask;
 126        struct device           dev;
 127
 128#ifdef CONFIG_PCMCIA_IOCTL
 129        /* device driver wanted by cardmgr */
 130        struct pcmcia_driver *  cardmgr;
 131#endif
 132
 133        /* data private to drivers */
 134        void                    *priv;
 135};
 136
 137#define to_pcmcia_dev(n) container_of(n, struct pcmcia_device, dev)
 138#define to_pcmcia_drv(n) container_of(n, struct pcmcia_driver, drv)
 139
 140/* deprecated -- don't use! */
 141#define handle_to_dev(handle) (handle->dev)
 142
 143
 144/* (deprecated) error reporting by PCMCIA devices. Use dev_printk()
 145 * or dev_dbg() directly in the driver, without referring to pcmcia_error_func()
 146 * and/or pcmcia_error_ret() for those functions will go away soon.
 147 */
 148enum service {
 149    AccessConfigurationRegister, AddSocketServices,
 150    AdjustResourceInfo, CheckEraseQueue, CloseMemory, CopyMemory,
 151    DeregisterClient, DeregisterEraseQueue, GetCardServicesInfo,
 152    GetClientInfo, GetConfigurationInfo, GetEventMask,
 153    GetFirstClient, GetFirstPartion, GetFirstRegion, GetFirstTuple,
 154    GetNextClient, GetNextPartition, GetNextRegion, GetNextTuple,
 155    GetStatus, GetTupleData, MapLogSocket, MapLogWindow, MapMemPage,
 156    MapPhySocket, MapPhyWindow, ModifyConfiguration, ModifyWindow,
 157    OpenMemory, ParseTuple, ReadMemory, RegisterClient,
 158    RegisterEraseQueue, RegisterMTD, RegisterTimer,
 159    ReleaseConfiguration, ReleaseExclusive, ReleaseIO, ReleaseIRQ,
 160    ReleaseSocketMask, ReleaseWindow, ReplaceSocketServices,
 161    RequestConfiguration, RequestExclusive, RequestIO, RequestIRQ,
 162    RequestSocketMask, RequestWindow, ResetCard, ReturnSSEntry,
 163    SetEventMask, SetRegion, ValidateCIS, VendorSpecific,
 164    WriteMemory, BindDevice, BindMTD, ReportError,
 165    SuspendCard, ResumeCard, EjectCard, InsertCard, ReplaceCIS,
 166    GetFirstWindow, GetNextWindow, GetMemPage
 167};
 168const char *pcmcia_error_func(int func);
 169const char *pcmcia_error_ret(int ret);
 170
 171#define cs_error(p_dev, func, ret)                      \
 172        {                                               \
 173                dev_printk(KERN_NOTICE, &p_dev->dev,    \
 174                           "%s : %s\n",                 \
 175                           pcmcia_error_func(func),     \
 176                           pcmcia_error_ret(ret));      \
 177        }
 178
 179/* CIS access.
 180 * Use the pcmcia_* versions in PCMCIA drivers
 181 */
 182int pcmcia_parse_tuple(tuple_t *tuple, cisparse_t *parse);
 183
 184int pccard_get_first_tuple(struct pcmcia_socket *s, unsigned int function,
 185                           tuple_t *tuple);
 186#define pcmcia_get_first_tuple(p_dev, tuple) \
 187                pccard_get_first_tuple(p_dev->socket, p_dev->func, tuple)
 188
 189int pccard_get_next_tuple(struct pcmcia_socket *s, unsigned int function,
 190                          tuple_t *tuple);
 191#define pcmcia_get_next_tuple(p_dev, tuple) \
 192                pccard_get_next_tuple(p_dev->socket, p_dev->func, tuple)
 193
 194int pccard_get_tuple_data(struct pcmcia_socket *s, tuple_t *tuple);
 195#define pcmcia_get_tuple_data(p_dev, tuple) \
 196                pccard_get_tuple_data(p_dev->socket, tuple)
 197
 198
 199/* loop CIS entries for valid configuration */
 200int pcmcia_loop_config(struct pcmcia_device *p_dev,
 201                       int      (*conf_check)   (struct pcmcia_device *p_dev,
 202                                                 cistpl_cftable_entry_t *cf,
 203                                                 cistpl_cftable_entry_t *dflt,
 204                                                 unsigned int vcc,
 205                                                 void *priv_data),
 206                       void *priv_data);
 207
 208/* is the device still there? */
 209struct pcmcia_device *pcmcia_dev_present(struct pcmcia_device *p_dev);
 210
 211/* low-level interface reset */
 212int pcmcia_reset_card(struct pcmcia_socket *skt);
 213
 214/* CIS config */
 215int pcmcia_access_configuration_register(struct pcmcia_device *p_dev,
 216                                         conf_reg_t *reg);
 217
 218/* device configuration */
 219int pcmcia_request_io(struct pcmcia_device *p_dev, io_req_t *req);
 220int pcmcia_request_irq(struct pcmcia_device *p_dev, irq_req_t *req);
 221int pcmcia_request_configuration(struct pcmcia_device *p_dev,
 222                                 config_req_t *req);
 223
 224int pcmcia_request_window(struct pcmcia_device **p_dev, win_req_t *req,
 225                          window_handle_t *wh);
 226int pcmcia_release_window(window_handle_t win);
 227
 228int pcmcia_get_mem_page(window_handle_t win, memreq_t *req);
 229int pcmcia_map_mem_page(window_handle_t win, memreq_t *req);
 230
 231int pcmcia_modify_configuration(struct pcmcia_device *p_dev, modconf_t *mod);
 232void pcmcia_disable_device(struct pcmcia_device *p_dev);
 233
 234#endif /* __KERNEL__ */
 235
 236
 237
 238/* Below, there are only definitions which are used by
 239 * - the PCMCIA ioctl
 240 * - deprecated PCMCIA userspace tools only
 241 *
 242 * here be dragons ... here be dragons ... here be dragons ... here be drag
 243 */
 244
 245#if defined(CONFIG_PCMCIA_IOCTL) || !defined(__KERNEL__)
 246
 247#if defined(__arm__) || defined(__mips__) || defined(__avr32__) || \
 248        defined(__bfin__)
 249/* This (ioaddr_t) is exposed to userspace & hence cannot be changed. */
 250typedef u_int   ioaddr_t;
 251#else
 252typedef u_short ioaddr_t;
 253#endif
 254
 255/* for AdjustResourceInfo */
 256typedef struct adjust_t {
 257        u_int                   Action;
 258        u_int                   Resource;
 259        u_int                   Attributes;
 260        union {
 261                struct memory {
 262                        u_long          Base;
 263                        u_long          Size;
 264                } memory;
 265                struct io {
 266                        ioaddr_t        BasePort;
 267                        ioaddr_t        NumPorts;
 268                        u_int           IOAddrLines;
 269                } io;
 270                struct irq {
 271                        u_int           IRQ;
 272                } irq;
 273        } resource;
 274} adjust_t;
 275
 276/* Action field */
 277#define REMOVE_MANAGED_RESOURCE         1
 278#define ADD_MANAGED_RESOURCE            2
 279#define GET_FIRST_MANAGED_RESOURCE      3
 280#define GET_NEXT_MANAGED_RESOURCE       4
 281/* Resource field */
 282#define RES_MEMORY_RANGE                1
 283#define RES_IO_RANGE                    2
 284#define RES_IRQ                         3
 285/* Attribute field */
 286#define RES_IRQ_TYPE                    0x03
 287#define RES_IRQ_TYPE_EXCLUSIVE          0
 288#define RES_IRQ_TYPE_TIME               1
 289#define RES_IRQ_TYPE_DYNAMIC            2
 290#define RES_IRQ_CSC                     0x04
 291#define RES_SHARED                      0x08
 292#define RES_RESERVED                    0x10
 293#define RES_ALLOCATED                   0x20
 294#define RES_REMOVED                     0x40
 295
 296
 297typedef struct tuple_parse_t {
 298        tuple_t                 tuple;
 299        cisdata_t               data[255];
 300        cisparse_t              parse;
 301} tuple_parse_t;
 302
 303typedef struct win_info_t {
 304        window_handle_t         handle;
 305        win_req_t               window;
 306        memreq_t                map;
 307} win_info_t;
 308
 309typedef struct bind_info_t {
 310        dev_info_t              dev_info;
 311        u_char                  function;
 312        struct pcmcia_device    *instance;
 313        char                    name[DEV_NAME_LEN];
 314        u_short                 major, minor;
 315        void                    *next;
 316} bind_info_t;
 317
 318typedef struct mtd_info_t {
 319        dev_info_t              dev_info;
 320        u_int                   Attributes;
 321        u_int                   CardOffset;
 322} mtd_info_t;
 323
 324typedef struct region_info_t {
 325        u_int                   Attributes;
 326        u_int                   CardOffset;
 327        u_int                   RegionSize;
 328        u_int                   AccessSpeed;
 329        u_int                   BlockSize;
 330        u_int                   PartMultiple;
 331        u_char                  JedecMfr, JedecInfo;
 332        memory_handle_t         next;
 333} region_info_t;
 334
 335#define REGION_TYPE             0x0001
 336#define REGION_TYPE_CM          0x0000
 337#define REGION_TYPE_AM          0x0001
 338#define REGION_PREFETCH         0x0008
 339#define REGION_CACHEABLE        0x0010
 340#define REGION_BAR_MASK         0xe000
 341#define REGION_BAR_SHIFT        13
 342
 343/* For ReplaceCIS */
 344typedef struct cisdump_t {
 345        u_int                   Length;
 346        cisdata_t               Data[CISTPL_MAX_CIS_SIZE];
 347} cisdump_t;
 348
 349/* for GetConfigurationInfo */
 350typedef struct config_info_t {
 351        u_char                  Function;
 352        u_int                   Attributes;
 353        u_int                   Vcc, Vpp1, Vpp2;
 354        u_int                   IntType;
 355        u_int                   ConfigBase;
 356        u_char                  Status, Pin, Copy, Option, ExtStatus;
 357        u_int                   Present;
 358        u_int                   CardValues;
 359        u_int                   AssignedIRQ;
 360        u_int                   IRQAttributes;
 361        ioaddr_t                BasePort1;
 362        ioaddr_t                NumPorts1;
 363        u_int                   Attributes1;
 364        ioaddr_t                BasePort2;
 365        ioaddr_t                NumPorts2;
 366        u_int                   Attributes2;
 367        u_int                   IOAddrLines;
 368} config_info_t;
 369
 370/* For ValidateCIS */
 371typedef struct cisinfo_t {
 372        u_int                   Chains;
 373} cisinfo_t;
 374
 375typedef struct cs_status_t {
 376        u_char                  Function;
 377        event_t                 CardState;
 378        event_t                 SocketState;
 379} cs_status_t;
 380
 381typedef union ds_ioctl_arg_t {
 382        adjust_t                adjust;
 383        config_info_t           config;
 384        tuple_t                 tuple;
 385        tuple_parse_t           tuple_parse;
 386        client_req_t            client_req;
 387        cs_status_t             status;
 388        conf_reg_t              conf_reg;
 389        cisinfo_t               cisinfo;
 390        region_info_t           region;
 391        bind_info_t             bind_info;
 392        mtd_info_t              mtd_info;
 393        win_info_t              win_info;
 394        cisdump_t               cisdump;
 395} ds_ioctl_arg_t;
 396
 397#define DS_ADJUST_RESOURCE_INFO                 _IOWR('d',  2, adjust_t)
 398#define DS_GET_CONFIGURATION_INFO               _IOWR('d',  3, config_info_t)
 399#define DS_GET_FIRST_TUPLE                      _IOWR('d',  4, tuple_t)
 400#define DS_GET_NEXT_TUPLE                       _IOWR('d',  5, tuple_t)
 401#define DS_GET_TUPLE_DATA                       _IOWR('d',  6, tuple_parse_t)
 402#define DS_PARSE_TUPLE                          _IOWR('d',  7, tuple_parse_t)
 403#define DS_RESET_CARD                           _IO  ('d',  8)
 404#define DS_GET_STATUS                           _IOWR('d',  9, cs_status_t)
 405#define DS_ACCESS_CONFIGURATION_REGISTER        _IOWR('d', 10, conf_reg_t)
 406#define DS_VALIDATE_CIS                         _IOR ('d', 11, cisinfo_t)
 407#define DS_SUSPEND_CARD                         _IO  ('d', 12)
 408#define DS_RESUME_CARD                          _IO  ('d', 13)
 409#define DS_EJECT_CARD                           _IO  ('d', 14)
 410#define DS_INSERT_CARD                          _IO  ('d', 15)
 411#define DS_GET_FIRST_REGION                     _IOWR('d', 16, region_info_t)
 412#define DS_GET_NEXT_REGION                      _IOWR('d', 17, region_info_t)
 413#define DS_REPLACE_CIS                          _IOWR('d', 18, cisdump_t)
 414#define DS_GET_FIRST_WINDOW                     _IOR ('d', 19, win_info_t)
 415#define DS_GET_NEXT_WINDOW                      _IOWR('d', 20, win_info_t)
 416#define DS_GET_MEM_PAGE                         _IOWR('d', 21, win_info_t)
 417
 418#define DS_BIND_REQUEST                         _IOWR('d', 60, bind_info_t)
 419#define DS_GET_DEVICE_INFO                      _IOWR('d', 61, bind_info_t)
 420#define DS_GET_NEXT_DEVICE                      _IOWR('d', 62, bind_info_t)
 421#define DS_UNBIND_REQUEST                       _IOW ('d', 63, bind_info_t)
 422#define DS_BIND_MTD                             _IOWR('d', 64, mtd_info_t)
 423
 424
 425/* used in userspace only */
 426#define CS_IN_USE                       0x1e
 427
 428#define INFO_MASTER_CLIENT      0x01
 429#define INFO_IO_CLIENT          0x02
 430#define INFO_MTD_CLIENT         0x04
 431#define INFO_MEM_CLIENT         0x08
 432#define MAX_NUM_CLIENTS         3
 433
 434#define INFO_CARD_SHARE         0x10
 435#define INFO_CARD_EXCL          0x20
 436
 437
 438#endif /* !defined(__KERNEL__) || defined(CONFIG_PCMCIA_IOCTL) */
 439
 440#endif /* _LINUX_DS_H */
 441