aboutsummaryrefslogtreecommitdiffstats
path: root/arch/cris/include/arch-v32/arch/io.h
blob: 72024452cea90da81cbf53a9b69843fc307b4cfa (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
#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 (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 (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