aboutsummaryrefslogtreecommitdiff
path: root/include/asm-ppc/iopin_85xx.h
blob: f854df633aac866755a194d7cf92beac2e079835 (plain)
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
137
138
139
140
141
142
143
144
145
146
/*
 * MPC85xx I/O port pin manipulation functions
 */

#ifndef _ASM_IOPIN_85xx_H_
#define _ASM_IOPIN_85xx_H_

#include <linux/types.h>
#include <asm/immap_85xx.h>

#ifdef __KERNEL__

typedef struct {
	u_char port:2;		/* port number (A=0, B=1, C=2, D=3) */
	u_char pin:5;		/* port pin (0-31) */
	u_char flag:1;		/* for whatever */
} iopin_t;

#define IOPIN_PORTA	0
#define IOPIN_PORTB	1
#define IOPIN_PORTC	2
#define IOPIN_PORTD	3

extern __inline__ void iopin_set_high (iopin_t * iopin)
{
	volatile uint *datp = &((immap_t *) CFG_IMMR)->im_cpm.im_cpm_iop.pdata;
	datp[iopin->port * 8] |= (1 << (31 - iopin->pin));
}

extern __inline__ void iopin_set_low (iopin_t * iopin)
{
	volatile uint *datp = &((immap_t *) CFG_IMMR)->im_cpm.im_cpm_iop.pdata;
	datp[iopin->port * 8] &= ~(1 << (31 - iopin->pin));
}

extern __inline__ uint iopin_is_high (iopin_t * iopin)
{
	volatile uint *datp = &((immap_t *) CFG_IMMR)->im_cpm.im_cpm_iop.pdata;
	return (datp[iopin->port * 8] >> (31 - iopin->pin)) & 1;
}

extern __inline__ uint iopin_is_low (iopin_t * iopin)
{
	volatile uint *datp = &((immap_t *) CFG_IMMR)->im_cpm.im_cpm_iop.pdata;
	return ((datp[iopin->port * 8] >> (31 - iopin->pin)) & 1) ^ 1;
}

extern __inline__ void iopin_set_out (iopin_t * iopin)
{
	volatile uint *dirp = &((immap_t *) CFG_IMMR)->im_cpm.im_cpm_iop.pdira;
	dirp[iopin->port * 8] |= (1 << (31 - iopin->pin));
}

extern __inline__ void iopin_set_in (iopin_t * iopin)
{
	volatile uint *dirp = &((immap_t *) CFG_IMMR)->im_cpm.im_cpm_iop.pdira;
	dirp[iopin->port * 8] &= ~(1 << (31 - iopin->pin));
}

extern __inline__ uint iopin_is_out (iopin_t * iopin)
{
	volatile uint *dirp = &((immap_t *) CFG_IMMR)->im_cpm.im_cpm_iop.pdira;
	return (dirp[iopin->port * 8] >> (31 - iopin->pin)) & 1;
}

extern __inline__ uint iopin_is_in (iopin_t * iopin)
{
	volatile uint *dirp = &((immap_t *) CFG_IMMR)->im_cpm.im_cpm_iop.pdira;
	return ((dirp[iopin->port * 8] >> (31 - iopin->pin)) & 1) ^ 1;
}

extern __inline__ void iopin_set_odr (iopin_t * iopin)
{
	volatile uint *odrp = &((immap_t *) CFG_IMMR)->im_cpm.im_cpm_iop.podra;
	odrp[iopin->port * 8] |= (1 << (31 - iopin->pin));
}

extern __inline__ void iopin_set_act (iopin_t * iopin)
{
	volatile uint *odrp = &((immap_t *) CFG_IMMR)->im_cpm.im_cpm_iop.podra;
	odrp[iopin->port * 8] &= ~(1 << (31 - iopin->pin));
}

extern __inline__ uint iopin_is_odr (iopin_t * iopin)
{
	volatile uint *odrp = &((immap_t *) CFG_IMMR)->im_cpm.im_cpm_iop.podra;
	return (odrp[iopin->port * 8] >> (31 - iopin->pin)) & 1;
}

extern __inline__ uint iopin_is_act (iopin_t * iopin)
{
	volatile uint *odrp = &((immap_t *) CFG_IMMR)->im_cpm.im_cpm_iop.podra;
	return ((odrp[iopin->port * 8] >> (31 - iopin->pin)) & 1) ^ 1;
}

extern __inline__ void iopin_set_ded (iopin_t * iopin)
{
	volatile uint *parp = &((immap_t *) CFG_IMMR)->im_cpm.im_cpm_iop.ppara;
	parp[iopin->port * 8] |= (1 << (31 - iopin->pin));
}

extern __inline__ void iopin_set_gen (iopin_t * iopin)
{
	volatile uint *parp = &((immap_t *) CFG_IMMR)->im_cpm.im_cpm_iop.ppara;
	parp[iopin->port * 8] &= ~(1 << (31 - iopin->pin));
}

extern __inline__ uint iopin_is_ded (iopin_t * iopin)
{
	volatile uint *parp = &((immap_t *) CFG_IMMR)->im_cpm.im_cpm_iop.ppara;
	return (parp[iopin->port * 8] >> (31 - iopin->pin)) & 1;
}

extern __inline__ uint iopin_is_gen (iopin_t * iopin)
{
	volatile uint *parp = &((immap_t *) CFG_IMMR)->im_cpm.im_cpm_iop.ppara;
	return ((parp[iopin->port * 8] >> (31 - iopin->pin)) & 1) ^ 1;
}

extern __inline__ void iopin_set_opt2 (iopin_t * iopin)
{
	volatile uint *sorp = &((immap_t *) CFG_IMMR)->im_cpm.im_cpm_iop.psora;
	sorp[iopin->port * 8] |= (1 << (31 - iopin->pin));
}

extern __inline__ void iopin_set_opt1 (iopin_t * iopin)
{
	volatile uint *sorp = &((immap_t *) CFG_IMMR)->im_cpm.im_cpm_iop.psora;
	sorp[iopin->port * 8] &= ~(1 << (31 - iopin->pin));
}

extern __inline__ uint iopin_is_opt2 (iopin_t * iopin)
{
	volatile uint *sorp = &((immap_t *) CFG_IMMR)->im_cpm.im_cpm_iop.psora;
	return (sorp[iopin->port * 8] >> (31 - iopin->pin)) & 1;
}

extern __inline__ uint iopin_is_opt1 (iopin_t * iopin)
{
	volatile uint *sorp = &((immap_t *) CFG_IMMR)->im_cpm.im_cpm_iop.psora;
	return ((sorp[iopin->port * 8] >> (31 - iopin->pin)) & 1) ^ 1;
}

#endif /* __KERNEL__ */

#endif /* _ASM_IOPIN_85xx_H_ */