#ifndef _ASM_ARCH_CRIS_IO_H
#define _ASM_ARCH_CRIS_IO_H

#include <linux/spinlock.h>
#include <hwregs/reg_map.h>
#include <hwregs/reg_rdwr.h>
#include <hwregs/gio_defs.h>

enum crisv32_io_dir
{
  crisv32_io_dir_in = 0,
  crisv32_io_dir_out = 1
};

struct crisv32_ioport
{
  volatile unsigned long *oe;
  volatile unsigned long *data;
  volatile unsigned long *data_in;
  unsigned int pin_count;
  spinlock_t lock;
};

struct crisv32_iopin
{
  struct crisv32_ioport* port;
  int bit;
};

extern struct crisv32_ioport crisv32_ioports[];

extern struct crisv32_iopin crisv32_led1_green;
extern struct crisv32_iopin crisv32_led1_red;
extern struct crisv32_iopin crisv32_led2_green;
extern struct crisv32_iopin crisv32_led2_red;
extern struct crisv32_iopin crisv32_led3_green;
extern struct crisv32_iopin crisv32_led3_red;

extern struct crisv32_iopin crisv32_led_net0_green;
extern struct crisv32_iopin crisv32_led_net0_red;
extern struct crisv32_iopin crisv32_led_net1_green;
extern struct crisv32_iopin crisv32_led_net1_red;

static inline void crisv32_io_set(struct crisv32_iopin *iopin, int val)
{
	unsigned long flags;
	spin_lock_irqsave(&iopin->port->lock, flags);

	if (iopin->port->data) {
		if (val)
			*iopin->port->data |= iopin->bit;
		else
			*iopin->port->data &= ~iopin->bit;
	}

	spin_unlock_irqrestore(&iopin->port->lock, flags);
}

static inline void crisv32_io_set_dir(struct crisv32_iopin* iopin,
			       enum crisv32_io_dir dir)
{
	unsigned long flags;
	spin_lock_irqsave(&iopin->port->lock, flags);

	if (iopin->port->oe) {
		if (dir == crisv32_io_dir_in)
			*iopin->port->oe &= ~iopin->bit;
		else
			*iopin->port->oe |= iopin->bit;
	}

	spin_unlock_irqrestore(&iopin->port->lock, flags);
}

static inline int crisv32_io_rd(struct crisv32_iopin* iopin)
{
	return ((*iopin->port->data_in & iopin->bit) ? 1 : 0);
}

int crisv32_io_get(struct crisv32_iopin* iopin,
                   unsigned int port, unsigned int pin);
int crisv32_io_get_name(struct crisv32_iopin* iopin,
			const char *name);

#define CRIS_LED_OFF    0x00
#define CRIS_LED_GREEN  0x01
#define CRIS_LED_RED    0x02
#define CRIS_LED_ORANGE (CRIS_LED_GREEN | CRIS_LED_RED)

#if (defined(CONFIG_ETRAX_NBR_LED_GRP_ONE) || defined(CONFIG_ETRAX_NBR_LED_GRP_TWO))
#define CRIS_LED_NETWORK_GRP0_SET(x)                          \
	do {                                             \
		CRIS_LED_NETWORK_GRP0_SET_G((x) & CRIS_LED_GREEN); \
		CRIS_LED_NETWORK_GRP0_SET_R((x) & CRIS_LED_RED);   \
	} while (0)
#else
#define CRIS_LED_NETWORK_GRP0_SET(x) while (0) {}
#endif

#define CRIS_LED_NETWORK_GRP0_SET_G(x) \
	crisv32_io_set(&crisv32_led_net0_green, !(x));

#define CRIS_LED_NETWORK_GRP0_SET_R(x) \
	crisv32_io_set(&crisv32_led_net0_red, !(x));

#if defined(CONFIG_ETRAX_NBR_LED_GRP_TWO)
#define CRIS_LED_NETWORK_GRP1_SET(x)                          \
	do {                                             \
		CRIS_LED_NETWORK_GRP1_SET_G((x) & CRIS_LED_GREEN); \
		CRIS_LED_NETWORK_GRP1_SET_R((x) & CRIS_LED_RED);   \
	} while (0)
#else
#define CRIS_LED_NETWORK_GRP1_SET(x) while (0) {}
#endif

#define CRIS_LED_NETWORK_GRP1_SET_G(x) \
	crisv32_io_set(&crisv32_led_net1_green, !(x));

#define CRIS_LED_NETWORK_GRP1_SET_R(x) \
	crisv32_io_set(&crisv32_led_net1_red, !(x));

#define CRIS_LED_ACTIVE_SET(x)                           \
	do {                                        \
		CRIS_LED_ACTIVE_SET_G((x) & CRIS_LED_GREEN);  \
		CRIS_LED_ACTIVE_SET_R((x) & CRIS_LED_RED);    \
	} while (0)

#define CRIS_LED_ACTIVE_SET_G(x) \
	crisv32_io_set(&crisv32_led2_green, !(x));
#define CRIS_LED_ACTIVE_SET_R(x) \
	crisv32_io_set(&crisv32_led2_red, !(x));
#define CRIS_LED_DISK_WRITE(x) \
         do{\
		crisv32_io_set(&crisv32_led3_green, !(x)); \
		crisv32_io_set(&crisv32_led3_red, !(x));   \
        }while(0)
#define CRIS_LED_DISK_READ(x) \
	crisv32_io_set(&crisv32_led3_green, !(x));

#endif
