2 * linux/arch/arm/mach-sa1100/gpio.c
4 * Generic SA-1100 GPIO handling
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.
10 #include <linux/gpio.h>
11 #include <linux/init.h>
12 #include <linux/module.h>
14 #include <linux/syscore_ops.h>
15 #include <mach/hardware.h>
16 #include <mach/irqs.h>
18 static int sa1100_gpio_get(struct gpio_chip
*chip
, unsigned offset
)
20 return !!(GPLR
& GPIO_GPIO(offset
));
23 static void sa1100_gpio_set(struct gpio_chip
*chip
, unsigned offset
, int value
)
26 GPSR
= GPIO_GPIO(offset
);
28 GPCR
= GPIO_GPIO(offset
);
31 static int sa1100_direction_input(struct gpio_chip
*chip
, unsigned offset
)
35 local_irq_save(flags
);
36 GPDR
&= ~GPIO_GPIO(offset
);
37 local_irq_restore(flags
);
41 static int sa1100_direction_output(struct gpio_chip
*chip
, unsigned offset
, int value
)
45 local_irq_save(flags
);
46 sa1100_gpio_set(chip
, offset
, value
);
47 GPDR
|= GPIO_GPIO(offset
);
48 local_irq_restore(flags
);
52 static int sa1100_to_irq(struct gpio_chip
*chip
, unsigned offset
)
54 return IRQ_GPIO0
+ offset
;
57 static struct gpio_chip sa1100_gpio_chip
= {
59 .direction_input
= sa1100_direction_input
,
60 .direction_output
= sa1100_direction_output
,
61 .set
= sa1100_gpio_set
,
62 .get
= sa1100_gpio_get
,
63 .to_irq
= sa1100_to_irq
,
65 .ngpio
= GPIO_MAX
+ 1,
69 * SA1100 GPIO edge detection for IRQs:
70 * IRQs are generated on Falling-Edge, Rising-Edge, or both.
71 * Use this instead of directly setting GRER/GFER.
73 static int GPIO_IRQ_rising_edge
;
74 static int GPIO_IRQ_falling_edge
;
75 static int GPIO_IRQ_mask
;
77 static int sa1100_gpio_type(struct irq_data
*d
, unsigned int type
)
83 if (type
== IRQ_TYPE_PROBE
) {
84 if ((GPIO_IRQ_rising_edge
| GPIO_IRQ_falling_edge
) & mask
)
86 type
= IRQ_TYPE_EDGE_RISING
| IRQ_TYPE_EDGE_FALLING
;
89 if (type
& IRQ_TYPE_EDGE_RISING
)
90 GPIO_IRQ_rising_edge
|= mask
;
92 GPIO_IRQ_rising_edge
&= ~mask
;
93 if (type
& IRQ_TYPE_EDGE_FALLING
)
94 GPIO_IRQ_falling_edge
|= mask
;
96 GPIO_IRQ_falling_edge
&= ~mask
;
98 GRER
= GPIO_IRQ_rising_edge
& GPIO_IRQ_mask
;
99 GFER
= GPIO_IRQ_falling_edge
& GPIO_IRQ_mask
;
105 * GPIO IRQs must be acknowledged.
107 static void sa1100_gpio_ack(struct irq_data
*d
)
109 GEDR
= BIT(d
->hwirq
);
112 static void sa1100_gpio_mask(struct irq_data
*d
)
114 unsigned int mask
= BIT(d
->hwirq
);
116 GPIO_IRQ_mask
&= ~mask
;
122 static void sa1100_gpio_unmask(struct irq_data
*d
)
124 unsigned int mask
= BIT(d
->hwirq
);
126 GPIO_IRQ_mask
|= mask
;
128 GRER
= GPIO_IRQ_rising_edge
& GPIO_IRQ_mask
;
129 GFER
= GPIO_IRQ_falling_edge
& GPIO_IRQ_mask
;
132 static int sa1100_gpio_wake(struct irq_data
*d
, unsigned int on
)
135 PWER
|= BIT(d
->hwirq
);
137 PWER
&= ~BIT(d
->hwirq
);
142 * This is for GPIO IRQs
144 static struct irq_chip sa1100_gpio_irq_chip
= {
146 .irq_ack
= sa1100_gpio_ack
,
147 .irq_mask
= sa1100_gpio_mask
,
148 .irq_unmask
= sa1100_gpio_unmask
,
149 .irq_set_type
= sa1100_gpio_type
,
150 .irq_set_wake
= sa1100_gpio_wake
,
153 static int sa1100_gpio_irqdomain_map(struct irq_domain
*d
,
154 unsigned int irq
, irq_hw_number_t hwirq
)
156 irq_set_chip_and_handler(irq
, &sa1100_gpio_irq_chip
,
163 static const struct irq_domain_ops sa1100_gpio_irqdomain_ops
= {
164 .map
= sa1100_gpio_irqdomain_map
,
165 .xlate
= irq_domain_xlate_onetwocell
,
168 static struct irq_domain
*sa1100_gpio_irqdomain
;
171 * IRQ 0-11 (GPIO) handler. We enter here with the
172 * irq_controller_lock held, and IRQs disabled. Decode the IRQ
173 * and call the handler.
175 static void sa1100_gpio_handler(struct irq_desc
*desc
)
177 unsigned int irq
, mask
;
182 * clear down all currently active IRQ sources.
183 * We will be processing them all.
190 generic_handle_irq(irq
);
199 static int sa1100_gpio_suspend(void)
202 * Set the appropriate edges for wakeup.
204 GRER
= PWER
& GPIO_IRQ_rising_edge
;
205 GFER
= PWER
& GPIO_IRQ_falling_edge
;
208 * Clear any pending GPIO interrupts.
215 static void sa1100_gpio_resume(void)
217 GRER
= GPIO_IRQ_rising_edge
& GPIO_IRQ_mask
;
218 GFER
= GPIO_IRQ_falling_edge
& GPIO_IRQ_mask
;
221 static struct syscore_ops sa1100_gpio_syscore_ops
= {
222 .suspend
= sa1100_gpio_suspend
,
223 .resume
= sa1100_gpio_resume
,
226 static int __init
sa1100_gpio_init_devicefs(void)
228 register_syscore_ops(&sa1100_gpio_syscore_ops
);
232 device_initcall(sa1100_gpio_init_devicefs
);
234 void __init
sa1100_init_gpio(void)
236 /* clear all GPIO edge detects */
241 gpiochip_add_data(&sa1100_gpio_chip
, NULL
);
243 sa1100_gpio_irqdomain
= irq_domain_add_simple(NULL
,
245 &sa1100_gpio_irqdomain_ops
, NULL
);
248 * Install handlers for GPIO 0-10 edge detect interrupts
250 irq_set_chained_handler(IRQ_GPIO0_SC
, sa1100_gpio_handler
);
251 irq_set_chained_handler(IRQ_GPIO1_SC
, sa1100_gpio_handler
);
252 irq_set_chained_handler(IRQ_GPIO2_SC
, sa1100_gpio_handler
);
253 irq_set_chained_handler(IRQ_GPIO3_SC
, sa1100_gpio_handler
);
254 irq_set_chained_handler(IRQ_GPIO4_SC
, sa1100_gpio_handler
);
255 irq_set_chained_handler(IRQ_GPIO5_SC
, sa1100_gpio_handler
);
256 irq_set_chained_handler(IRQ_GPIO6_SC
, sa1100_gpio_handler
);
257 irq_set_chained_handler(IRQ_GPIO7_SC
, sa1100_gpio_handler
);
258 irq_set_chained_handler(IRQ_GPIO8_SC
, sa1100_gpio_handler
);
259 irq_set_chained_handler(IRQ_GPIO9_SC
, sa1100_gpio_handler
);
260 irq_set_chained_handler(IRQ_GPIO10_SC
, sa1100_gpio_handler
);
262 * Install handler for GPIO 11-27 edge detect interrupts
264 irq_set_chained_handler(IRQ_GPIO11_27
, sa1100_gpio_handler
);