33 #include <linux/slab.h>
35 #include <linux/module.h>
40 #define PINCTRL_DOUT(p) ((is_imx23_gpio(p) ? 0x0500 : 0x0700) + (p->id) * 0x10)
41 #define PINCTRL_DIN(p) ((is_imx23_gpio(p) ? 0x0600 : 0x0900) + (p->id) * 0x10)
42 #define PINCTRL_DOE(p) ((is_imx23_gpio(p) ? 0x0700 : 0x0b00) + (p->id) * 0x10)
43 #define PINCTRL_PIN2IRQ(p) ((is_imx23_gpio(p) ? 0x0800 : 0x1000) + (p->id) * 0x10)
44 #define PINCTRL_IRQEN(p) ((is_imx23_gpio(p) ? 0x0900 : 0x1100) + (p->id) * 0x10)
45 #define PINCTRL_IRQLEV(p) ((is_imx23_gpio(p) ? 0x0a00 : 0x1200) + (p->id) * 0x10)
46 #define PINCTRL_IRQPOL(p) ((is_imx23_gpio(p) ? 0x0b00 : 0x1300) + (p->id) * 0x10)
47 #define PINCTRL_IRQSTAT(p) ((is_imx23_gpio(p) ? 0x0c00 : 0x1400) + (p->id) * 0x10)
49 #define GPIO_INT_FALL_EDGE 0x0
50 #define GPIO_INT_LOW_LEV 0x1
51 #define GPIO_INT_RISE_EDGE 0x2
52 #define GPIO_INT_HIGH_LEV 0x3
53 #define GPIO_INT_LEV_MASK (1 << 0)
54 #define GPIO_INT_POL_MASK (1 << 1)
82 static int mxs_gpio_set_irq_type(
struct irq_data *
d,
unsigned int type)
85 struct irq_chip_generic *
gc = irq_data_get_irq_chip_data(d);
138 while (irq_stat != 0) {
139 int irqoffset = fls(irq_stat) - 1;
141 irq_stat &= ~(1 << irqoffset);
154 static int mxs_gpio_set_wake_irq(
struct irq_data *d,
unsigned int enable)
156 struct irq_chip_generic *gc = irq_data_get_irq_chip_data(d);
160 enable_irq_wake(port->
irq);
162 disable_irq_wake(port->
irq);
169 struct irq_chip_generic *gc;
170 struct irq_chip_type *
ct;
180 ct->chip.irq_set_type = mxs_gpio_set_irq_type;
181 ct->chip.irq_set_wake = mxs_gpio_set_wake_irq;
188 static int mxs_gpio_to_irq(
struct gpio_chip *gc,
unsigned offset)
199 .name =
"imx23-gpio",
202 .name =
"imx28-gpio",
211 { .compatible =
"fsl,imx23-gpio", .data = (
void *)
IMX23_GPIO, },
212 { .compatible =
"fsl,imx28-gpio", .data = (
void *)
IMX28_GPIO, },
283 goto out_irqdesc_free;
287 mxs_gpio_init_gc(port, irq_base);
290 irq_set_chained_handler(port->
irq, mxs_gpio_irq_handler);
298 goto out_irqdesc_free;
300 port->
bgc.gc.to_irq = mxs_gpio_to_irq;
301 port->
bgc.gc.base = port->
id * 32;
305 goto out_bgpio_remove;
320 .of_match_table = mxs_gpio_dt_ids,
322 .probe = mxs_gpio_probe,
323 .id_table = mxs_gpio_ids,
326 static int __init mxs_gpio_init(
void)
333 "Daniel Mack <danielncaiaq.de>, "