2 * This program is free software; you can redistribute it and/or modify it
3 * under the terms of the GNU General Public License version 2 as published
4 * by the Free Software Foundation.
6 * Copyright (C) 2010 John Crispin <blogic@openwrt.org>
9 #include <linux/slab.h>
10 #include <linux/export.h>
11 #include <linux/platform_device.h>
12 #include <linux/gpio.h>
13 #include <linux/ioport.h>
16 #include <lantiq_soc.h>
18 #define LTQ_GPIO_OUT 0x00
19 #define LTQ_GPIO_IN 0x04
20 #define LTQ_GPIO_DIR 0x08
21 #define LTQ_GPIO_ALTSEL0 0x0C
22 #define LTQ_GPIO_ALTSEL1 0x10
23 #define LTQ_GPIO_OD 0x14
25 #define PINS_PER_PORT 16
28 #define ltq_gpio_getbit(m, r, p) (!!(ltq_r32(m + r) & (1 << p)))
29 #define ltq_gpio_setbit(m, r, p) ltq_w32_mask(0, (1 << p), m + r)
30 #define ltq_gpio_clearbit(m, r, p) ltq_w32_mask((1 << p), 0, m + r)
33 void __iomem
*membase
;
34 struct gpio_chip chip
;
37 static struct ltq_gpio ltq_gpio_port
[MAX_PORTS
];
39 int gpio_to_irq(unsigned int gpio
)
43 EXPORT_SYMBOL(gpio_to_irq
);
45 int irq_to_gpio(unsigned int gpio
)
49 EXPORT_SYMBOL(irq_to_gpio
);
51 int ltq_gpio_request(unsigned int pin
, unsigned int alt0
,
52 unsigned int alt1
, unsigned int dir
, const char *name
)
56 if (pin
>= (MAX_PORTS
* PINS_PER_PORT
))
58 if (gpio_request(pin
, name
)) {
59 pr_err("failed to setup lantiq gpio: %s\n", name
);
63 gpio_direction_output(pin
, 1);
65 gpio_direction_input(pin
);
66 while (pin
>= PINS_PER_PORT
) {
71 ltq_gpio_setbit(ltq_gpio_port
[id
].membase
,
72 LTQ_GPIO_ALTSEL0
, pin
);
74 ltq_gpio_clearbit(ltq_gpio_port
[id
].membase
,
75 LTQ_GPIO_ALTSEL0
, pin
);
77 ltq_gpio_setbit(ltq_gpio_port
[id
].membase
,
78 LTQ_GPIO_ALTSEL1
, pin
);
80 ltq_gpio_clearbit(ltq_gpio_port
[id
].membase
,
81 LTQ_GPIO_ALTSEL1
, pin
);
84 EXPORT_SYMBOL(ltq_gpio_request
);
86 static void ltq_gpio_set(struct gpio_chip
*chip
, unsigned int offset
, int value
)
88 struct ltq_gpio
*ltq_gpio
= container_of(chip
, struct ltq_gpio
, chip
);
91 ltq_gpio_setbit(ltq_gpio
->membase
, LTQ_GPIO_OUT
, offset
);
93 ltq_gpio_clearbit(ltq_gpio
->membase
, LTQ_GPIO_OUT
, offset
);
96 static int ltq_gpio_get(struct gpio_chip
*chip
, unsigned int offset
)
98 struct ltq_gpio
*ltq_gpio
= container_of(chip
, struct ltq_gpio
, chip
);
100 return ltq_gpio_getbit(ltq_gpio
->membase
, LTQ_GPIO_IN
, offset
);
103 static int ltq_gpio_direction_input(struct gpio_chip
*chip
, unsigned int offset
)
105 struct ltq_gpio
*ltq_gpio
= container_of(chip
, struct ltq_gpio
, chip
);
107 ltq_gpio_clearbit(ltq_gpio
->membase
, LTQ_GPIO_OD
, offset
);
108 ltq_gpio_clearbit(ltq_gpio
->membase
, LTQ_GPIO_DIR
, offset
);
113 static int ltq_gpio_direction_output(struct gpio_chip
*chip
,
114 unsigned int offset
, int value
)
116 struct ltq_gpio
*ltq_gpio
= container_of(chip
, struct ltq_gpio
, chip
);
118 ltq_gpio_setbit(ltq_gpio
->membase
, LTQ_GPIO_OD
, offset
);
119 ltq_gpio_setbit(ltq_gpio
->membase
, LTQ_GPIO_DIR
, offset
);
120 ltq_gpio_set(chip
, offset
, value
);
125 static int ltq_gpio_req(struct gpio_chip
*chip
, unsigned offset
)
127 struct ltq_gpio
*ltq_gpio
= container_of(chip
, struct ltq_gpio
, chip
);
129 ltq_gpio_clearbit(ltq_gpio
->membase
, LTQ_GPIO_ALTSEL0
, offset
);
130 ltq_gpio_clearbit(ltq_gpio
->membase
, LTQ_GPIO_ALTSEL1
, offset
);
134 static int ltq_gpio_probe(struct platform_device
*pdev
)
136 struct resource
*res
;
138 if (pdev
->id
>= MAX_PORTS
) {
139 dev_err(&pdev
->dev
, "invalid gpio port %d\n",
143 res
= platform_get_resource(pdev
, IORESOURCE_MEM
, 0);
145 dev_err(&pdev
->dev
, "failed to get memory for gpio port %d\n",
149 res
= devm_request_mem_region(&pdev
->dev
, res
->start
,
150 resource_size(res
), dev_name(&pdev
->dev
));
153 "failed to request memory for gpio port %d\n",
157 ltq_gpio_port
[pdev
->id
].membase
= devm_ioremap_nocache(&pdev
->dev
,
158 res
->start
, resource_size(res
));
159 if (!ltq_gpio_port
[pdev
->id
].membase
) {
160 dev_err(&pdev
->dev
, "failed to remap memory for gpio port %d\n",
164 ltq_gpio_port
[pdev
->id
].chip
.label
= "ltq_gpio";
165 ltq_gpio_port
[pdev
->id
].chip
.direction_input
= ltq_gpio_direction_input
;
166 ltq_gpio_port
[pdev
->id
].chip
.direction_output
=
167 ltq_gpio_direction_output
;
168 ltq_gpio_port
[pdev
->id
].chip
.get
= ltq_gpio_get
;
169 ltq_gpio_port
[pdev
->id
].chip
.set
= ltq_gpio_set
;
170 ltq_gpio_port
[pdev
->id
].chip
.request
= ltq_gpio_req
;
171 ltq_gpio_port
[pdev
->id
].chip
.base
= PINS_PER_PORT
* pdev
->id
;
172 ltq_gpio_port
[pdev
->id
].chip
.ngpio
= PINS_PER_PORT
;
173 platform_set_drvdata(pdev
, <q_gpio_port
[pdev
->id
]);
174 return gpiochip_add(<q_gpio_port
[pdev
->id
].chip
);
177 static struct platform_driver
179 .probe
= ltq_gpio_probe
,
182 .owner
= THIS_MODULE
,
186 int __init
ltq_gpio_init(void)
188 int ret
= platform_driver_register(<q_gpio_driver
);
191 pr_info("ltq_gpio : Error registering platfom driver!");
195 postcore_initcall(ltq_gpio_init
);