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) 2005-2007 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 <hwregs/reg_map.h>
15 #include <hwregs/reg_rdwr.h>
17 #include <hwregs/pinmux_defs.h>
18 #include <hwregs/clkgen_defs.h>
26 static char pins
[PINS
];
27 static DEFINE_SPINLOCK(pinmux_lock
);
29 static void crisv32_pinmux_set(int port
);
32 crisv32_pinmux_init(void)
34 static int initialized
;
38 REG_WR_INT(pinmux
, regi_pinmux
, rw_hwprot
, 0);
39 crisv32_pinmux_alloc(PORT_A
, 0, 31, pinmux_gpio
);
40 crisv32_pinmux_alloc(PORT_B
, 0, 31, pinmux_gpio
);
41 crisv32_pinmux_alloc(PORT_C
, 0, 15, pinmux_gpio
);
48 crisv32_pinmux_alloc(int port
, int first_pin
, int last_pin
, enum pin_mode mode
)
53 crisv32_pinmux_init();
58 spin_lock_irqsave(&pinmux_lock
, flags
);
60 for (i
= first_pin
; i
<= last_pin
; i
++) {
61 if ((pins
[port
* PORT_PINS
+ i
] != pinmux_none
) &&
62 (pins
[port
* PORT_PINS
+ i
] != pinmux_gpio
) &&
63 (pins
[port
* PORT_PINS
+ i
] != mode
)) {
64 spin_unlock_irqrestore(&pinmux_lock
, flags
);
66 panic("Pinmux alloc failed!\n");
72 for (i
= first_pin
; i
<= last_pin
; i
++)
73 pins
[port
* PORT_PINS
+ i
] = mode
;
75 crisv32_pinmux_set(port
);
77 spin_unlock_irqrestore(&pinmux_lock
, flags
);
83 crisv32_pinmux_alloc_fixed(enum fixed_function function
)
86 char saved
[sizeof pins
];
89 spin_lock_irqsave(&pinmux_lock
, flags
);
91 /* Save internal data for recovery */
92 memcpy(saved
, pins
, sizeof pins
);
94 crisv32_pinmux_init(); /* must be done before we read rw_hwprot */
96 reg_pinmux_rw_hwprot hwprot
= REG_RD(pinmux
, regi_pinmux
, rw_hwprot
);
97 reg_clkgen_rw_clk_ctrl clk_ctrl
= REG_RD(clkgen
, regi_clkgen
,
102 clk_ctrl
.eth
= regk_clkgen_yes
;
103 clk_ctrl
.dma0_1_eth
= regk_clkgen_yes
;
104 ret
= crisv32_pinmux_alloc(PORT_B
, 8, 23, pinmux_fixed
);
105 ret
|= crisv32_pinmux_alloc(PORT_B
, 24, 25, pinmux_fixed
);
106 hwprot
.eth
= hwprot
.eth_mdio
= regk_pinmux_yes
;
109 ret
= crisv32_pinmux_alloc(PORT_B
, 0, 7, pinmux_fixed
);
110 hwprot
.geth
= regk_pinmux_yes
;
113 clk_ctrl
.ccd_tg_100
= clk_ctrl
.ccd_tg_200
= regk_clkgen_yes
;
114 ret
= crisv32_pinmux_alloc(PORT_B
, 27, 29, pinmux_fixed
);
115 hwprot
.tg_clk
= regk_pinmux_yes
;
118 clk_ctrl
.ccd_tg_100
= clk_ctrl
.ccd_tg_200
= regk_clkgen_yes
;
119 ret
= crisv32_pinmux_alloc(PORT_B
, 27, 31, pinmux_fixed
);
120 ret
|= crisv32_pinmux_alloc(PORT_C
, 0, 15, pinmux_fixed
);
121 hwprot
.tg
= hwprot
.tg_clk
= regk_pinmux_yes
;
124 clk_ctrl
.strdma0_2_video
= regk_clkgen_yes
;
125 ret
= crisv32_pinmux_alloc(PORT_A
, 8, 18, pinmux_fixed
);
126 hwprot
.vout
= hwprot
.vout_sync
= regk_pinmux_yes
;
129 clk_ctrl
.sser_ser_dma6_7
= regk_clkgen_yes
;
130 ret
= crisv32_pinmux_alloc(PORT_A
, 24, 25, pinmux_fixed
);
131 hwprot
.ser1
= regk_pinmux_yes
;
134 clk_ctrl
.sser_ser_dma6_7
= regk_clkgen_yes
;
135 ret
= crisv32_pinmux_alloc(PORT_A
, 26, 27, pinmux_fixed
);
136 hwprot
.ser2
= regk_pinmux_yes
;
139 clk_ctrl
.sser_ser_dma6_7
= regk_clkgen_yes
;
140 ret
= crisv32_pinmux_alloc(PORT_A
, 28, 29, pinmux_fixed
);
141 hwprot
.ser3
= regk_pinmux_yes
;
144 clk_ctrl
.sser_ser_dma6_7
= regk_clkgen_yes
;
145 ret
= crisv32_pinmux_alloc(PORT_A
, 30, 31, pinmux_fixed
);
146 hwprot
.ser4
= regk_pinmux_yes
;
149 clk_ctrl
.sser_ser_dma6_7
= regk_clkgen_yes
;
150 ret
= crisv32_pinmux_alloc(PORT_A
, 19, 23, pinmux_fixed
);
151 hwprot
.sser
= regk_pinmux_yes
;
154 hwprot
.pio
= regk_pinmux_yes
;
158 ret
= crisv32_pinmux_alloc(PORT_A
, 30, 30, pinmux_fixed
);
159 hwprot
.pwm0
= regk_pinmux_yes
;
162 ret
= crisv32_pinmux_alloc(PORT_A
, 31, 31, pinmux_fixed
);
163 hwprot
.pwm1
= regk_pinmux_yes
;
166 ret
= crisv32_pinmux_alloc(PORT_B
, 26, 26, pinmux_fixed
);
167 hwprot
.pwm2
= regk_pinmux_yes
;
170 ret
= crisv32_pinmux_alloc(PORT_A
, 0, 1, pinmux_fixed
);
171 hwprot
.i2c0
= regk_pinmux_yes
;
174 ret
= crisv32_pinmux_alloc(PORT_A
, 2, 3, pinmux_fixed
);
175 hwprot
.i2c1
= regk_pinmux_yes
;
177 case pinmux_i2c1_3wire
:
178 ret
= crisv32_pinmux_alloc(PORT_A
, 2, 3, pinmux_fixed
);
179 ret
|= crisv32_pinmux_alloc(PORT_A
, 7, 7, pinmux_fixed
);
180 hwprot
.i2c1
= hwprot
.i2c1_sen
= regk_pinmux_yes
;
182 case pinmux_i2c1_sda1
:
183 ret
= crisv32_pinmux_alloc(PORT_A
, 2, 4, pinmux_fixed
);
184 hwprot
.i2c1
= hwprot
.i2c1_sda1
= regk_pinmux_yes
;
186 case pinmux_i2c1_sda2
:
187 ret
= crisv32_pinmux_alloc(PORT_A
, 2, 3, pinmux_fixed
);
188 ret
|= crisv32_pinmux_alloc(PORT_A
, 5, 5, pinmux_fixed
);
189 hwprot
.i2c1
= hwprot
.i2c1_sda2
= regk_pinmux_yes
;
191 case pinmux_i2c1_sda3
:
192 ret
= crisv32_pinmux_alloc(PORT_A
, 2, 3, pinmux_fixed
);
193 ret
|= crisv32_pinmux_alloc(PORT_A
, 6, 6, pinmux_fixed
);
194 hwprot
.i2c1
= hwprot
.i2c1_sda3
= regk_pinmux_yes
;
202 REG_WR(pinmux
, regi_pinmux
, rw_hwprot
, hwprot
);
203 REG_WR(clkgen
, regi_clkgen
, rw_clk_ctrl
, clk_ctrl
);
205 memcpy(pins
, saved
, sizeof pins
);
207 spin_unlock_irqrestore(&pinmux_lock
, flags
);
213 crisv32_pinmux_set(int port
)
218 int pin
= port
* PORT_PINS
;
220 for (i
= 0; (i
< PORT_PINS
) && (pin
< PINS
); i
++, pin
++) {
221 if (pins
[pin
] == pinmux_gpio
)
222 gpio_val
|= (1 << i
);
223 else if (pins
[pin
] == pinmux_iop
)
227 REG_WRITE(int, regi_pinmux
+ REG_RD_ADDR_pinmux_rw_gio_pa
+ 4 * port
,
229 REG_WRITE(int, regi_pinmux
+ REG_RD_ADDR_pinmux_rw_iop_pa
+ 4 * port
,
233 crisv32_pinmux_dump();
238 crisv32_pinmux_dealloc(int port
, int first_pin
, int last_pin
)
243 crisv32_pinmux_init();
248 spin_lock_irqsave(&pinmux_lock
, flags
);
250 for (i
= first_pin
; i
<= last_pin
; i
++)
251 pins
[port
* PORT_PINS
+ i
] = pinmux_none
;
253 crisv32_pinmux_set(port
);
254 spin_unlock_irqrestore(&pinmux_lock
, flags
);
260 crisv32_pinmux_dealloc_fixed(enum fixed_function function
)
263 char saved
[sizeof pins
];
266 spin_lock_irqsave(&pinmux_lock
, flags
);
268 /* Save internal data for recovery */
269 memcpy(saved
, pins
, sizeof pins
);
271 crisv32_pinmux_init(); /* must be done before we read rw_hwprot */
273 reg_pinmux_rw_hwprot hwprot
= REG_RD(pinmux
, regi_pinmux
, rw_hwprot
);
277 ret
= crisv32_pinmux_dealloc(PORT_B
, 8, 23);
278 ret
|= crisv32_pinmux_dealloc(PORT_B
, 24, 25);
279 ret
|= crisv32_pinmux_dealloc(PORT_B
, 0, 7);
280 hwprot
.eth
= hwprot
.eth_mdio
= hwprot
.geth
= regk_pinmux_no
;
283 ret
= crisv32_pinmux_dealloc(PORT_B
, 27, 29);
284 hwprot
.tg_clk
= regk_pinmux_no
;
287 ret
= crisv32_pinmux_dealloc(PORT_B
, 27, 31);
288 ret
|= crisv32_pinmux_dealloc(PORT_C
, 0, 15);
289 hwprot
.tg
= hwprot
.tg_clk
= regk_pinmux_no
;
292 ret
= crisv32_pinmux_dealloc(PORT_A
, 8, 18);
293 hwprot
.vout
= hwprot
.vout_sync
= regk_pinmux_no
;
296 ret
= crisv32_pinmux_dealloc(PORT_A
, 24, 25);
297 hwprot
.ser1
= regk_pinmux_no
;
300 ret
= crisv32_pinmux_dealloc(PORT_A
, 26, 27);
301 hwprot
.ser2
= regk_pinmux_no
;
304 ret
= crisv32_pinmux_dealloc(PORT_A
, 28, 29);
305 hwprot
.ser3
= regk_pinmux_no
;
308 ret
= crisv32_pinmux_dealloc(PORT_A
, 30, 31);
309 hwprot
.ser4
= regk_pinmux_no
;
312 ret
= crisv32_pinmux_dealloc(PORT_A
, 19, 23);
313 hwprot
.sser
= regk_pinmux_no
;
316 ret
= crisv32_pinmux_dealloc(PORT_A
, 30, 30);
317 hwprot
.pwm0
= regk_pinmux_no
;
320 ret
= crisv32_pinmux_dealloc(PORT_A
, 31, 31);
321 hwprot
.pwm1
= regk_pinmux_no
;
324 ret
= crisv32_pinmux_dealloc(PORT_B
, 26, 26);
325 hwprot
.pwm2
= regk_pinmux_no
;
328 ret
= crisv32_pinmux_dealloc(PORT_A
, 0, 1);
329 hwprot
.i2c0
= regk_pinmux_no
;
332 ret
= crisv32_pinmux_dealloc(PORT_A
, 2, 3);
333 hwprot
.i2c1
= regk_pinmux_no
;
335 case pinmux_i2c1_3wire
:
336 ret
= crisv32_pinmux_dealloc(PORT_A
, 2, 3);
337 ret
|= crisv32_pinmux_dealloc(PORT_A
, 7, 7);
338 hwprot
.i2c1
= hwprot
.i2c1_sen
= regk_pinmux_no
;
340 case pinmux_i2c1_sda1
:
341 ret
= crisv32_pinmux_dealloc(PORT_A
, 2, 4);
342 hwprot
.i2c1_sda1
= regk_pinmux_no
;
344 case pinmux_i2c1_sda2
:
345 ret
= crisv32_pinmux_dealloc(PORT_A
, 2, 3);
346 ret
|= crisv32_pinmux_dealloc(PORT_A
, 5, 5);
347 hwprot
.i2c1_sda2
= regk_pinmux_no
;
349 case pinmux_i2c1_sda3
:
350 ret
= crisv32_pinmux_dealloc(PORT_A
, 2, 3);
351 ret
|= crisv32_pinmux_dealloc(PORT_A
, 6, 6);
352 hwprot
.i2c1_sda3
= regk_pinmux_no
;
360 REG_WR(pinmux
, regi_pinmux
, rw_hwprot
, hwprot
);
362 memcpy(pins
, saved
, sizeof pins
);
364 spin_unlock_irqrestore(&pinmux_lock
, flags
);
370 crisv32_pinmux_dump(void)
375 crisv32_pinmux_init();
377 for (i
= 0; i
< PORTS
; i
++) {
379 printk(KERN_DEBUG
"Port %c\n", 'A'+i
);
380 for (j
= 0; (j
< PORT_PINS
) && (pin
< PINS
); j
++, pin
++)
382 " Pin %d = %d\n", j
, pins
[i
* PORT_PINS
+ j
]);
386 __initcall(crisv32_pinmux_init
);