2 * Allocator for I/O pins. All pins are allocated to GPIO at bootup.
3 * Unassigned pins and GPIO pins can be allocated to a fixed interface
4 * or the I/O processor instead.
6 * Copyright (c) 2004 Axis Communications AB.
9 #include <linux/init.h>
10 #include <linux/errno.h>
11 #include <linux/kernel.h>
12 #include <linux/string.h>
13 #include <linux/spinlock.h>
14 #include <asm/arch/hwregs/reg_map.h>
15 #include <asm/arch/hwregs/reg_rdwr.h>
16 #include <asm/arch/pinmux.h>
17 #include <asm/arch/hwregs/pinmux_defs.h>
24 static char pins
[PORTS
][PORT_PINS
];
25 static DEFINE_SPINLOCK(pinmux_lock
);
27 static void crisv32_pinmux_set(int port
);
30 crisv32_pinmux_init(void)
32 static int initialized
= 0;
35 reg_pinmux_rw_pa pa
= REG_RD(pinmux
, regi_pinmux
, rw_pa
);
37 pa
.pa0
= pa
.pa1
= pa
.pa2
= pa
.pa3
=
38 pa
.pa4
= pa
.pa5
= pa
.pa6
= pa
.pa7
= regk_pinmux_yes
;
39 REG_WR(pinmux
, regi_pinmux
, rw_pa
, pa
);
40 crisv32_pinmux_alloc(PORT_B
, 0, PORT_PINS
- 1, pinmux_gpio
);
41 crisv32_pinmux_alloc(PORT_C
, 0, PORT_PINS
- 1, pinmux_gpio
);
42 crisv32_pinmux_alloc(PORT_D
, 0, PORT_PINS
- 1, pinmux_gpio
);
43 crisv32_pinmux_alloc(PORT_E
, 0, PORT_PINS
- 1, pinmux_gpio
);
50 crisv32_pinmux_alloc(int port
, int first_pin
, int last_pin
, enum pin_mode mode
)
55 crisv32_pinmux_init();
60 spin_lock_irqsave(&pinmux_lock
, flags
);
62 for (i
= first_pin
; i
<= last_pin
; i
++)
64 if ((pins
[port
][i
] != pinmux_none
) && (pins
[port
][i
] != pinmux_gpio
) &&
65 (pins
[port
][i
] != mode
))
67 spin_unlock_irqrestore(&pinmux_lock
, flags
);
69 panic("Pinmux alloc failed!\n");
75 for (i
= first_pin
; i
<= last_pin
; i
++)
78 crisv32_pinmux_set(port
);
80 spin_unlock_irqrestore(&pinmux_lock
, flags
);
86 crisv32_pinmux_alloc_fixed(enum fixed_function function
)
89 char saved
[sizeof pins
];
92 spin_lock_irqsave(&pinmux_lock
, flags
);
94 /* Save internal data for recovery */
95 memcpy(saved
, pins
, sizeof pins
);
97 reg_pinmux_rw_hwprot hwprot
= REG_RD(pinmux
, regi_pinmux
, rw_hwprot
);
102 ret
= crisv32_pinmux_alloc(PORT_C
, 4, 7, pinmux_fixed
);
103 hwprot
.ser1
= regk_pinmux_yes
;
106 ret
= crisv32_pinmux_alloc(PORT_C
, 8, 11, pinmux_fixed
);
107 hwprot
.ser2
= regk_pinmux_yes
;
110 ret
= crisv32_pinmux_alloc(PORT_C
, 12, 15, pinmux_fixed
);
111 hwprot
.ser3
= regk_pinmux_yes
;
114 ret
= crisv32_pinmux_alloc(PORT_C
, 0, 3, pinmux_fixed
);
115 ret
|= crisv32_pinmux_alloc(PORT_C
, 16, 16, pinmux_fixed
);
116 hwprot
.sser0
= regk_pinmux_yes
;
119 ret
= crisv32_pinmux_alloc(PORT_D
, 0, 4, pinmux_fixed
);
120 hwprot
.sser1
= regk_pinmux_yes
;
123 ret
= crisv32_pinmux_alloc(PORT_D
, 5, 7, pinmux_fixed
);
124 ret
|= crisv32_pinmux_alloc(PORT_D
, 15, 17, pinmux_fixed
);
125 hwprot
.ata0
= regk_pinmux_yes
;
128 ret
= crisv32_pinmux_alloc(PORT_D
, 0, 4, pinmux_fixed
);
129 ret
|= crisv32_pinmux_alloc(PORT_E
, 17, 17, pinmux_fixed
);
130 hwprot
.ata1
= regk_pinmux_yes
;
133 ret
= crisv32_pinmux_alloc(PORT_C
, 11, 15, pinmux_fixed
);
134 ret
|= crisv32_pinmux_alloc(PORT_E
, 3, 3, pinmux_fixed
);
135 hwprot
.ata2
= regk_pinmux_yes
;
138 ret
= crisv32_pinmux_alloc(PORT_C
, 8, 10, pinmux_fixed
);
139 ret
|= crisv32_pinmux_alloc(PORT_C
, 0, 2, pinmux_fixed
);
140 hwprot
.ata2
= regk_pinmux_yes
;
143 ret
= crisv32_pinmux_alloc(PORT_B
, 0, 15, pinmux_fixed
);
144 ret
|= crisv32_pinmux_alloc(PORT_D
, 8, 15, pinmux_fixed
);
145 hwprot
.ata
= regk_pinmux_yes
;
148 ret
= crisv32_pinmux_alloc(PORT_E
, 0, 17, pinmux_fixed
);
149 hwprot
.eth1
= regk_pinmux_yes
;
150 hwprot
.eth1_mgm
= regk_pinmux_yes
;
153 ret
= crisv32_pinmux_alloc(PORT_C
, 16, 16, pinmux_fixed
);
154 hwprot
.timer
= regk_pinmux_yes
;
155 spin_unlock_irqrestore(&pinmux_lock
, flags
);
160 REG_WR(pinmux
, regi_pinmux
, rw_hwprot
, hwprot
);
162 memcpy(pins
, saved
, sizeof pins
);
164 spin_unlock_irqrestore(&pinmux_lock
, flags
);
170 crisv32_pinmux_set(int port
)
176 for (i
= 0; i
< PORT_PINS
; i
++)
178 if (pins
[port
][i
] == pinmux_gpio
)
179 gpio_val
|= (1 << i
);
180 else if (pins
[port
][i
] == pinmux_iop
)
184 REG_WRITE(int, regi_pinmux
+ REG_RD_ADDR_pinmux_rw_pb_gio
+ 8*port
, gpio_val
);
185 REG_WRITE(int, regi_pinmux
+ REG_RD_ADDR_pinmux_rw_pb_iop
+ 8*port
, iop_val
);
188 crisv32_pinmux_dump();
193 crisv32_pinmux_dealloc(int port
, int first_pin
, int last_pin
)
198 crisv32_pinmux_init();
203 spin_lock_irqsave(&pinmux_lock
, flags
);
205 for (i
= first_pin
; i
<= last_pin
; i
++)
206 pins
[port
][i
] = pinmux_none
;
208 crisv32_pinmux_set(port
);
209 spin_unlock_irqrestore(&pinmux_lock
, flags
);
215 crisv32_pinmux_dump(void)
219 crisv32_pinmux_init();
221 for (i
= 0; i
< PORTS
; i
++)
223 printk("Port %c\n", 'B'+i
);
224 for (j
= 0; j
< PORT_PINS
; j
++)
225 printk(" Pin %d = %d\n", j
, pins
[i
][j
]);
229 __initcall(crisv32_pinmux_init
);