//	pcmcia.h - Header file for PCMCIA support

#ifndef INCLUDE_PCMCIA_H
#define	INCLUDE_PCMCIA_H 1
#include "etherboot.h"

typedef unsigned char	u_char;
typedef unsigned short	u_short;
typedef unsigned int	u_int;
typedef unsigned long	u_long;

typedef u_short		ioaddr_t;
extern int sockets;

#define	MAXPCCSOCKS	8
#define	MAXPCCCONFIGS	8

typedef	enum ebpdriver_t	{ I82365, SOMEDRIVER						} ebpdriver_t;
typedef enum interface_func_t	{ INIT, SHUTDOWN, MAPATTRMEM, UNMAPATTRMEM, SELECTCONFIG	} interface_func_t;
typedef enum ebpstatus_t	{ EMPTY, HASCARD, INITIALIZED, SUSPENDED, OTHERDEVICE, UNKNOWN	} ebpstatus_t;

struct	driver_interact_t {
	ebpdriver_t	id;
	int		(*f)(interface_func_t,int,int,int,int);
	char		*name;
};
struct	pccsock_t {
	ebpdriver_t	device;
	int		drivernum;
	ebpstatus_t	status;
		// Internal usage of the drivers:
	int		internalid;
	int		flags;
	int		ioaddr;
	int		type;
	int		configoffset;
	int		possibleconfignum;
	int		stringoffset;
	u_int		stringlength;
	int		rmask0;
};

extern struct	pccsock_t	pccsock[MAXPCCSOCKS];
extern u_int	pccsocks;

struct	pcc_config_t {
	u_char	index;
	u_char	irq;
	int	iowin;
	int	iolen;
};


int	i82365_interfacer(interface_func_t,int,int,int,void *);
void	sleepticks(int);

#define	EINVAL	22


//*********************************************************** cc.h:
/* Definitions for card status flags for GetStatus */
#define SS_WRPROT       0x0001
#define SS_CARDLOCK     0x0002
#define SS_EJECTION     0x0004
#define SS_INSERTION    0x0008
#define SS_BATDEAD      0x0010
#define SS_BATWARN      0x0020
#define SS_READY        0x0040
#define SS_DETECT       0x0080
#define SS_POWERON      0x0100
#define SS_GPI          0x0200
#define SS_STSCHG       0x0400
#define SS_CARDBUS      0x0800
#define SS_3VCARD       0x1000
#define SS_XVCARD       0x2000
#define SS_PENDING      0x4000

/* cc.h: for InquireSocket */
typedef struct socket_cap_t {
    u_int       features;
    u_int       irq_mask;
    u_int       map_size;
    ioaddr_t    io_offset;
    u_char      pci_irq;
    //struct pci_dev *cb_dev;
    //struct bus_operations *bus;
    void *cb_dev;
    void *bus;
} socket_cap_t;
/* InquireSocket capabilities */
#define SS_CAP_PAGE_REGS        0x0001
#define SS_CAP_VIRTUAL_BUS      0x0002
#define SS_CAP_MEM_ALIGN        0x0004
#define SS_CAP_STATIC_MAP       0x0008
#define SS_CAP_PCCARD           0x4000
#define SS_CAP_CARDBUS          0x8000

/* for GetSocket, SetSocket */
typedef struct socket_state_t {
    u_int       flags;
    u_int       csc_mask;
    u_char      Vcc, Vpp;
    u_char      io_irq;
} socket_state_t;

extern socket_state_t dead_socket;

/* Socket configuration flags */
#define SS_PWR_AUTO     0x0010
#define SS_IOCARD       0x0020
#define SS_RESET        0x0040
#define SS_DMA_MODE     0x0080
#define SS_SPKR_ENA     0x0100
#define SS_OUTPUT_ENA   0x0200
#define SS_DEBOUNCED    0x0400  /* Tell driver that the debounce delay has ended */
#define SS_ZVCARD       0x0800

/* Flags for I/O port and memory windows */
#define MAP_ACTIVE      0x01
#define MAP_16BIT       0x02
#define MAP_AUTOSZ      0x04
#define MAP_0WS         0x08
#define MAP_WRPROT      0x10
#define MAP_ATTRIB      0x20
#define MAP_USE_WAIT    0x40
#define MAP_PREFETCH    0x80

/* Use this just for bridge windows */
#define MAP_IOSPACE     0x20

typedef struct pccard_io_map {
    u_char      map;
    u_char      flags;
    u_short     speed;
    ioaddr_t    start, stop;
} pccard_io_map;


typedef struct pccard_mem_map {
    u_char      map;
    u_char      flags;
    u_short     speed;
    u_long      sys_start, sys_stop;
    u_int       card_start;
} pccard_mem_map;

typedef struct cb_bridge_map {
    u_char      map;
    u_char      flags;
    u_int       start, stop;
} cb_bridge_map;
// need the global function pointer struct? *TODO*
//************************************* end cc.h



#endif
