2 * Atmel PIO2 Port Multiplexer support
4 * Copyright (C) 2004-2006 Atmel Corporation
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License version 2 as
8 * published by the Free Software Foundation.
11 #include <linux/clk.h>
12 #include <linux/debugfs.h>
14 #include <linux/platform_device.h>
15 #include <linux/irq.h>
20 #include <mach/portmux.h>
24 #define MAX_NR_PIO_DEVICES 8
27 struct gpio_chip chip
;
29 const struct platform_device
*pdev
;
35 static struct pio_device pio_dev
[MAX_NR_PIO_DEVICES
];
37 static struct pio_device
*gpio_to_pio(unsigned int gpio
)
39 struct pio_device
*pio
;
43 if (index
>= MAX_NR_PIO_DEVICES
)
45 pio
= &pio_dev
[index
];
52 /* Pin multiplexing API */
53 static DEFINE_SPINLOCK(pio_lock
);
55 void __init
at32_select_periph(unsigned int port
, u32 pin_mask
,
56 unsigned int periph
, unsigned long flags
)
58 struct pio_device
*pio
;
60 /* assign and verify pio */
61 pio
= gpio_to_pio(port
);
63 printk(KERN_WARNING
"pio: invalid port %u\n", port
);
67 /* Test if any of the requested pins is already muxed */
69 if (unlikely(pio
->pinmux_mask
& pin_mask
)) {
70 printk(KERN_WARNING
"%s: pin(s) busy (requested 0x%x, busy 0x%x)\n",
71 pio
->name
, pin_mask
, pio
->pinmux_mask
& pin_mask
);
72 spin_unlock(&pio_lock
);
76 pio
->pinmux_mask
|= pin_mask
;
79 pio_writel(pio
, PUER
, pin_mask
);
81 /* select either peripheral A or B */
83 pio_writel(pio
, BSR
, pin_mask
);
85 pio_writel(pio
, ASR
, pin_mask
);
87 /* enable peripheral control */
88 pio_writel(pio
, PDR
, pin_mask
);
90 /* Disable pull ups if not requested. */
91 if (!(flags
& AT32_GPIOF_PULLUP
))
92 pio_writel(pio
, PUDR
, pin_mask
);
94 spin_unlock(&pio_lock
);
102 void __init
at32_select_gpio(unsigned int pin
, unsigned long flags
)
104 struct pio_device
*pio
;
105 unsigned int pin_index
= pin
& 0x1f;
106 u32 mask
= 1 << pin_index
;
108 pio
= gpio_to_pio(pin
);
109 if (unlikely(!pio
)) {
110 printk("pio: invalid pin %u\n", pin
);
114 if (unlikely(test_and_set_bit(pin_index
, &pio
->pinmux_mask
))) {
115 printk("%s: pin %u is busy\n", pio
->name
, pin_index
);
119 if (flags
& AT32_GPIOF_OUTPUT
) {
120 if (flags
& AT32_GPIOF_HIGH
)
121 pio_writel(pio
, SODR
, mask
);
123 pio_writel(pio
, CODR
, mask
);
124 if (flags
& AT32_GPIOF_MULTIDRV
)
125 pio_writel(pio
, MDER
, mask
);
127 pio_writel(pio
, MDDR
, mask
);
128 pio_writel(pio
, PUDR
, mask
);
129 pio_writel(pio
, OER
, mask
);
131 if (flags
& AT32_GPIOF_PULLUP
)
132 pio_writel(pio
, PUER
, mask
);
134 pio_writel(pio
, PUDR
, mask
);
135 if (flags
& AT32_GPIOF_DEGLITCH
)
136 pio_writel(pio
, IFER
, mask
);
138 pio_writel(pio
, IFDR
, mask
);
139 pio_writel(pio
, ODR
, mask
);
142 pio_writel(pio
, PER
, mask
);
151 * Undo a previous pin reservation. Will not affect the hardware
154 void at32_deselect_pin(unsigned int pin
)
156 struct pio_device
*pio
;
157 unsigned int pin_index
= pin
& 0x1f;
159 pio
= gpio_to_pio(pin
);
160 if (unlikely(!pio
)) {
161 printk("pio: invalid pin %u\n", pin
);
166 clear_bit(pin_index
, &pio
->pinmux_mask
);
169 /* Reserve a pin, preventing anyone else from changing its configuration. */
170 void __init
at32_reserve_pin(unsigned int port
, u32 pin_mask
)
172 struct pio_device
*pio
;
174 /* assign and verify pio */
175 pio
= gpio_to_pio(port
);
176 if (unlikely(!pio
)) {
177 printk(KERN_WARNING
"pio: invalid port %u\n", port
);
181 /* Test if any of the requested pins is already muxed */
182 spin_lock(&pio_lock
);
183 if (unlikely(pio
->pinmux_mask
& pin_mask
)) {
184 printk(KERN_WARNING
"%s: pin(s) busy (req. 0x%x, busy 0x%x)\n",
185 pio
->name
, pin_mask
, pio
->pinmux_mask
& pin_mask
);
186 spin_unlock(&pio_lock
);
191 pio
->pinmux_mask
|= pin_mask
;
192 spin_unlock(&pio_lock
);
199 /*--------------------------------------------------------------------------*/
203 static int direction_input(struct gpio_chip
*chip
, unsigned offset
)
205 struct pio_device
*pio
= container_of(chip
, struct pio_device
, chip
);
206 u32 mask
= 1 << offset
;
208 if (!(pio_readl(pio
, PSR
) & mask
))
211 pio_writel(pio
, ODR
, mask
);
215 static int gpio_get(struct gpio_chip
*chip
, unsigned offset
)
217 struct pio_device
*pio
= container_of(chip
, struct pio_device
, chip
);
219 return (pio_readl(pio
, PDSR
) >> offset
) & 1;
222 static void gpio_set(struct gpio_chip
*chip
, unsigned offset
, int value
);
224 static int direction_output(struct gpio_chip
*chip
, unsigned offset
, int value
)
226 struct pio_device
*pio
= container_of(chip
, struct pio_device
, chip
);
227 u32 mask
= 1 << offset
;
229 if (!(pio_readl(pio
, PSR
) & mask
))
232 gpio_set(chip
, offset
, value
);
233 pio_writel(pio
, OER
, mask
);
237 static void gpio_set(struct gpio_chip
*chip
, unsigned offset
, int value
)
239 struct pio_device
*pio
= container_of(chip
, struct pio_device
, chip
);
240 u32 mask
= 1 << offset
;
243 pio_writel(pio
, SODR
, mask
);
245 pio_writel(pio
, CODR
, mask
);
248 /*--------------------------------------------------------------------------*/
250 /* GPIO IRQ support */
252 static void gpio_irq_mask(unsigned irq
)
254 unsigned gpio
= irq_to_gpio(irq
);
255 struct pio_device
*pio
= &pio_dev
[gpio
>> 5];
257 pio_writel(pio
, IDR
, 1 << (gpio
& 0x1f));
260 static void gpio_irq_unmask(unsigned irq
)
262 unsigned gpio
= irq_to_gpio(irq
);
263 struct pio_device
*pio
= &pio_dev
[gpio
>> 5];
265 pio_writel(pio
, IER
, 1 << (gpio
& 0x1f));
268 static int gpio_irq_type(unsigned irq
, unsigned type
)
270 if (type
!= IRQ_TYPE_EDGE_BOTH
&& type
!= IRQ_TYPE_NONE
)
276 static struct irq_chip gpio_irqchip
= {
278 .mask
= gpio_irq_mask
,
279 .unmask
= gpio_irq_unmask
,
280 .set_type
= gpio_irq_type
,
283 static void gpio_irq_handler(unsigned irq
, struct irq_desc
*desc
)
285 struct pio_device
*pio
= get_irq_chip_data(irq
);
288 gpio_irq
= (unsigned) get_irq_data(irq
);
293 /* ack pending GPIO interrupts */
294 isr
= pio_readl(pio
, ISR
) & pio_readl(pio
, IMR
);
312 gpio_irq_setup(struct pio_device
*pio
, int irq
, int gpio_irq
)
316 set_irq_chip_data(irq
, pio
);
317 set_irq_data(irq
, (void *) gpio_irq
);
319 for (i
= 0; i
< 32; i
++, gpio_irq
++) {
320 set_irq_chip_data(gpio_irq
, pio
);
321 set_irq_chip_and_handler(gpio_irq
, &gpio_irqchip
,
325 set_irq_chained_handler(irq
, gpio_irq_handler
);
328 /*--------------------------------------------------------------------------*/
330 #ifdef CONFIG_DEBUG_FS
332 #include <linux/seq_file.h>
335 * This shows more info than the generic gpio dump code:
336 * pullups, deglitching, open drain drive.
338 static void pio_bank_show(struct seq_file
*s
, struct gpio_chip
*chip
)
340 struct pio_device
*pio
= container_of(chip
, struct pio_device
, chip
);
341 u32 psr
, osr
, imr
, pdsr
, pusr
, ifsr
, mdsr
;
346 psr
= pio_readl(pio
, PSR
);
347 osr
= pio_readl(pio
, OSR
);
348 imr
= pio_readl(pio
, IMR
);
349 pdsr
= pio_readl(pio
, PDSR
);
350 pusr
= pio_readl(pio
, PUSR
);
351 ifsr
= pio_readl(pio
, IFSR
);
352 mdsr
= pio_readl(pio
, MDSR
);
354 bank
= 'A' + pio
->pdev
->id
;
356 for (i
= 0, mask
= 1; i
< 32; i
++, mask
<<= 1) {
359 label
= gpiochip_is_requested(chip
, i
);
360 if (!label
&& (imr
& mask
))
365 seq_printf(s
, " gpio-%-3d P%c%-2d (%-12s) %s %s %s",
366 chip
->base
+ i
, bank
, i
,
368 (osr
& mask
) ? "out" : "in ",
369 (mask
& pdsr
) ? "hi" : "lo",
370 (mask
& pusr
) ? " " : "up");
372 seq_printf(s
, " deglitch");
373 if ((osr
& mdsr
) & mask
)
374 seq_printf(s
, " open-drain");
376 seq_printf(s
, " irq-%d edge-both",
377 gpio_to_irq(chip
->base
+ i
));
383 #define pio_bank_show NULL
387 /*--------------------------------------------------------------------------*/
389 static int __init
pio_probe(struct platform_device
*pdev
)
391 struct pio_device
*pio
= NULL
;
392 int irq
= platform_get_irq(pdev
, 0);
393 int gpio_irq_base
= GPIO_IRQ_BASE
+ pdev
->id
* 32;
395 BUG_ON(pdev
->id
>= MAX_NR_PIO_DEVICES
);
396 pio
= &pio_dev
[pdev
->id
];
399 pio
->chip
.label
= pio
->name
;
400 pio
->chip
.base
= pdev
->id
* 32;
401 pio
->chip
.ngpio
= 32;
402 pio
->chip
.dev
= &pdev
->dev
;
403 pio
->chip
.owner
= THIS_MODULE
;
405 pio
->chip
.direction_input
= direction_input
;
406 pio
->chip
.get
= gpio_get
;
407 pio
->chip
.direction_output
= direction_output
;
408 pio
->chip
.set
= gpio_set
;
409 pio
->chip
.dbg_show
= pio_bank_show
;
411 gpiochip_add(&pio
->chip
);
413 gpio_irq_setup(pio
, irq
, gpio_irq_base
);
415 platform_set_drvdata(pdev
, pio
);
417 printk(KERN_DEBUG
"%s: base 0x%p, irq %d chains %d..%d\n",
418 pio
->name
, pio
->regs
, irq
, gpio_irq_base
, gpio_irq_base
+ 31);
423 static struct platform_driver pio_driver
= {
429 static int __init
pio_init(void)
431 return platform_driver_probe(&pio_driver
, pio_probe
);
433 postcore_initcall(pio_init
);
435 void __init
at32_init_pio(struct platform_device
*pdev
)
437 struct resource
*regs
;
438 struct pio_device
*pio
;
440 if (pdev
->id
> MAX_NR_PIO_DEVICES
) {
441 dev_err(&pdev
->dev
, "only %d PIO devices supported\n",
446 pio
= &pio_dev
[pdev
->id
];
447 snprintf(pio
->name
, sizeof(pio
->name
), "pio%d", pdev
->id
);
449 regs
= platform_get_resource(pdev
, IORESOURCE_MEM
, 0);
451 dev_err(&pdev
->dev
, "no mmio resource defined\n");
455 pio
->clk
= clk_get(&pdev
->dev
, "mck");
456 if (IS_ERR(pio
->clk
))
458 * This is a fatal error, but if we continue we might
459 * be so lucky that we manage to initialize the
460 * console and display this message...
462 dev_err(&pdev
->dev
, "no mck clock defined\n");
464 clk_enable(pio
->clk
);
467 pio
->regs
= ioremap(regs
->start
, regs
->end
- regs
->start
+ 1);
469 /* start with irqs disabled and acked */
470 pio_writel(pio
, IDR
, ~0UL);
471 (void) pio_readl(pio
, ISR
);