/*
 *  Definitions for the SCOOP interface found on various Sharp PDAs
 *
 *  Copyright (c) 2004 Richard Purdie
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License version 2 as
 *  published by the Free Software Foundation.
 *
 */

#define SCOOP_MCR  0x00
#define SCOOP_CDR  0x04
#define SCOOP_CSR  0x08
#define SCOOP_CPR  0x0C
#define SCOOP_CCR  0x10
#define SCOOP_IRR  0x14
#define SCOOP_IRM  0x14
#define SCOOP_IMR  0x18
#define SCOOP_ISR  0x1C
#define SCOOP_GPCR 0x20
#define SCOOP_GPWR 0x24
#define SCOOP_GPRR 0x28

#define SCOOP_GPCR_PA22	( 1 << 12 )
#define SCOOP_GPCR_PA21	( 1 << 11 )
#define SCOOP_GPCR_PA20	( 1 << 10 )
#define SCOOP_GPCR_PA19	( 1 << 9 )
#define SCOOP_GPCR_PA18	( 1 << 8 )
#define SCOOP_GPCR_PA17	( 1 << 7 )
#define SCOOP_GPCR_PA16	( 1 << 6 )
#define SCOOP_GPCR_PA15	( 1 << 5 )
#define SCOOP_GPCR_PA14	( 1 << 4 )
#define SCOOP_GPCR_PA13	( 1 << 3 )
#define SCOOP_GPCR_PA12	( 1 << 2 )
#define SCOOP_GPCR_PA11	( 1 << 1 )

struct scoop_config {
	unsigned short io_out;
	unsigned short io_dir;
};

/* Structure for linking scoop devices to PCMCIA sockets */
struct scoop_pcmcia_dev {
	struct device *dev;     /* Pointer to this socket's scoop device */
	int	irq;                /* irq for socket */
	int cd_irq;
	const char *cd_irq_str;
	unsigned char keep_vs;
	unsigned char keep_rd;
};

extern int scoop_num;
extern struct scoop_pcmcia_dev *scoop_devs;

void reset_scoop(struct device *dev);
unsigned short set_scoop_gpio(struct device *dev, unsigned short bit);
unsigned short reset_scoop_gpio(struct device *dev, unsigned short bit);
unsigned short read_scoop_reg(struct device *dev, unsigned short reg);
void write_scoop_reg(struct device *dev, unsigned short reg, unsigned short data);
