linux/drivers/block/paride/paride.h
<<
>>
Prefs
   1#ifndef __DRIVERS_PARIDE_H__
   2#define __DRIVERS_PARIDE_H__
   3
   4/* 
   5        paride.h        (c) 1997-8  Grant R. Guenther <grant@torque.net>
   6                                    Under the terms of the GPL.
   7
   8   This file defines the interface between the high-level parallel
   9   IDE device drivers (pd, pf, pcd, pt) and the adapter chips.
  10
  11*/
  12
  13/* Changes:
  14
  15        1.01    GRG 1998.05.05  init_proto, release_proto
  16*/
  17
  18#define PARIDE_H_VERSION        "1.01"
  19
  20/* Some adapters need to know what kind of device they are in
  21
  22   Values for devtype:
  23*/
  24
  25#define PI_PD   0       /* IDE disk */
  26#define PI_PCD  1       /* ATAPI CDrom */
  27#define PI_PF   2       /* ATAPI disk */
  28#define PI_PT   3       /* ATAPI tape */
  29#define PI_PG   4       /* ATAPI generic */
  30
  31/* The paride module contains no state, instead the drivers allocate
  32   a pi_adapter data structure and pass it to paride in every operation.
  33
  34*/
  35
  36struct pi_adapter  {
  37
  38        struct pi_protocol *proto;   /* adapter protocol */
  39        int     port;                /* base address of parallel port */
  40        int     mode;                /* transfer mode in use */
  41        int     delay;               /* adapter delay setting */
  42        int     devtype;             /* device type: PI_PD etc. */
  43        char    *device;             /* name of driver */
  44        int     unit;                /* unit number for chained adapters */
  45        int     saved_r0;            /* saved port state */
  46        int     saved_r2;            /* saved port state */
  47        int     reserved;            /* number of ports reserved */
  48        unsigned long   private;     /* for protocol module */
  49
  50        wait_queue_head_t parq;     /* semaphore for parport sharing */
  51        void    *pardev;             /* pointer to pardevice */
  52        char    *parname;            /* parport name */
  53        int     claimed;             /* parport has already been claimed */
  54        void (*claim_cont)(void);    /* continuation for parport wait */
  55};
  56
  57typedef struct pi_adapter PIA;
  58
  59/* functions exported by paride to the high level drivers */
  60
  61extern int pi_init(PIA *pi, 
  62        int autoprobe,          /* 1 to autoprobe */
  63        int port,               /* base port address */
  64        int mode,               /* -1 for autoprobe */
  65        int unit,               /* unit number, if supported */
  66        int protocol,           /* protocol to use */
  67        int delay,              /* -1 to use adapter specific default */
  68        char * scratch,         /* address of 512 byte buffer */
  69        int devtype,            /* device type: PI_PD, PI_PCD, etc ... */
  70        int verbose,            /* log verbose data while probing */
  71        char *device            /* name of the driver */
  72        );                      /* returns 0 on failure, 1 on success */
  73
  74extern void pi_release(PIA *pi);
  75
  76/* registers are addressed as (cont,regr)
  77
  78        cont: 0 for command register file, 1 for control register(s)
  79        regr: 0-7 for register number.
  80
  81*/
  82
  83extern void pi_write_regr(PIA *pi, int cont, int regr, int val);
  84
  85extern int pi_read_regr(PIA *pi, int cont, int regr);
  86
  87extern void pi_write_block(PIA *pi, char * buf, int count);
  88
  89extern void pi_read_block(PIA *pi, char * buf, int count);
  90
  91extern void pi_connect(PIA *pi);
  92
  93extern void pi_disconnect(PIA *pi);
  94
  95extern void pi_do_claimed(PIA *pi, void (*cont)(void));
  96extern int pi_schedule_claimed(PIA *pi, void (*cont)(void));
  97
  98/* macros and functions exported to the protocol modules */
  99
 100#define delay_p                 (pi->delay?udelay(pi->delay):(void)0)
 101#define out_p(offs,byte)        outb(byte,pi->port+offs); delay_p;
 102#define in_p(offs)              (delay_p,inb(pi->port+offs))
 103
 104#define w0(byte)                {out_p(0,byte);}
 105#define r0()                    (in_p(0) & 0xff)
 106#define w1(byte)                {out_p(1,byte);}
 107#define r1()                    (in_p(1) & 0xff)
 108#define w2(byte)                {out_p(2,byte);}
 109#define r2()                    (in_p(2) & 0xff)
 110#define w3(byte)                {out_p(3,byte);}
 111#define w4(byte)                {out_p(4,byte);}
 112#define r4()                    (in_p(4) & 0xff)
 113#define w4w(data)               {outw(data,pi->port+4); delay_p;}
 114#define w4l(data)               {outl(data,pi->port+4); delay_p;}
 115#define r4w()                   (delay_p,inw(pi->port+4)&0xffff)
 116#define r4l()                   (delay_p,inl(pi->port+4)&0xffffffff)
 117
 118static inline u16 pi_swab16( char *b, int k)
 119
 120{       union { u16 u; char t[2]; } r;
 121
 122        r.t[0]=b[2*k+1]; r.t[1]=b[2*k];
 123        return r.u;
 124}
 125
 126static inline u32 pi_swab32( char *b, int k)
 127
 128{       union { u32 u; char f[4]; } r;
 129
 130        r.f[0]=b[4*k+1]; r.f[1]=b[4*k];
 131        r.f[2]=b[4*k+3]; r.f[3]=b[4*k+2];
 132        return r.u;
 133}
 134
 135struct pi_protocol {
 136
 137        char    name[8];        /* name for this protocol */
 138        int     index;          /* index into protocol table */
 139
 140        int     max_mode;       /* max mode number */
 141        int     epp_first;      /* modes >= this use 8 ports */
 142        
 143        int     default_delay;  /* delay parameter if not specified */
 144        int     max_units;      /* max chained units probed for */
 145
 146        void (*write_regr)(PIA *,int,int,int);
 147        int  (*read_regr)(PIA *,int,int);
 148        void (*write_block)(PIA *,char *,int);
 149        void (*read_block)(PIA *,char *,int);
 150
 151        void (*connect)(PIA *);
 152        void (*disconnect)(PIA *);
 153        
 154        int  (*test_port)(PIA *);
 155        int  (*probe_unit)(PIA *);
 156        int  (*test_proto)(PIA *,char *,int);
 157        void (*log_adapter)(PIA *,char *,int);
 158        
 159        int (*init_proto)(PIA *);
 160        void (*release_proto)(PIA *);
 161        struct module *owner;
 162};
 163
 164typedef struct pi_protocol PIP;
 165
 166extern int paride_register( PIP * );
 167extern void paride_unregister ( PIP * );
 168void *pi_register_driver(char *);
 169void pi_unregister_driver(void *);
 170
 171#endif /* __DRIVERS_PARIDE_H__ */
 172/* end of paride.h */
 173