2 * Copyright (C) 2007-2009, OpenWrt.org, Florian Fainelli <florian@openwrt.org>
3 * Architecture specific GPIO support
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License as published by the
7 * Free Software Foundation; either version 2 of the License, or (at your
8 * option) any later version.
10 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
11 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
12 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
13 * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
14 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
15 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
16 * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
17 * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
18 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
19 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
21 * You should have received a copy of the GNU General Public License along
22 * with this program; if not, write to the Free Software Foundation, Inc.,
23 * 675 Mass Ave, Cambridge, MA 02139, USA.
26 * au1000 SoC have only one GPIO line : GPIO1
27 * others have a second one : GPIO2
30 #include <linux/kernel.h>
31 #include <linux/module.h>
32 #include <linux/types.h>
33 #include <linux/platform_device.h>
34 #include <linux/gpio.h>
36 #include <asm/mach-au1x00/au1000.h>
39 struct au1000_gpio_chip
{
40 struct gpio_chip chip
;
41 void __iomem
*regbase
;
44 #if !defined(CONFIG_SOC_AU1000)
45 static int au1000_gpio2_get(struct gpio_chip
*chip
, unsigned offset
)
47 u32 mask
= 1 << offset
;
48 struct au1000_gpio_chip
*gpch
;
50 gpch
= container_of(chip
, struct au1000_gpio_chip
, chip
);
51 return readl(gpch
->regbase
+ AU1000_GPIO2_ST
) & mask
;
54 static void au1000_gpio2_set(struct gpio_chip
*chip
,
55 unsigned offset
, int value
)
57 u32 mask
= ((GPIO2_OUT_EN_MASK
<< offset
) | (!!value
<< offset
));
58 struct au1000_gpio_chip
*gpch
;
61 gpch
= container_of(chip
, struct au1000_gpio_chip
, chip
);
63 local_irq_save(flags
);
64 writel(mask
, gpch
->regbase
+ AU1000_GPIO2_OUT
);
65 local_irq_restore(flags
);
68 static int au1000_gpio2_direction_input(struct gpio_chip
*chip
, unsigned offset
)
70 u32 mask
= 1 << offset
;
72 struct au1000_gpio_chip
*gpch
;
75 gpch
= container_of(chip
, struct au1000_gpio_chip
, chip
);
77 local_irq_save(flags
);
78 tmp
= readl(gpch
->regbase
+ AU1000_GPIO2_DIR
);
80 writel(tmp
, gpch
->regbase
+ AU1000_GPIO2_DIR
);
81 local_irq_restore(flags
);
86 static int au1000_gpio2_direction_output(struct gpio_chip
*chip
,
87 unsigned offset
, int value
)
89 u32 mask
= 1 << offset
;
90 u32 out_mask
= ((GPIO2_OUT_EN_MASK
<< offset
) | (!!value
<< offset
));
92 struct au1000_gpio_chip
*gpch
;
95 gpch
= container_of(chip
, struct au1000_gpio_chip
, chip
);
97 local_irq_save(flags
);
98 tmp
= readl(gpch
->regbase
+ AU1000_GPIO2_DIR
);
100 writel(tmp
, gpch
->regbase
+ AU1000_GPIO2_DIR
);
101 writel(out_mask
, gpch
->regbase
+ AU1000_GPIO2_OUT
);
102 local_irq_restore(flags
);
106 #endif /* !defined(CONFIG_SOC_AU1000) */
108 static int au1000_gpio1_get(struct gpio_chip
*chip
, unsigned offset
)
110 u32 mask
= 1 << offset
;
111 struct au1000_gpio_chip
*gpch
;
113 gpch
= container_of(chip
, struct au1000_gpio_chip
, chip
);
114 return readl(gpch
->regbase
+ AU1000_GPIO1_ST
) & mask
;
117 static void au1000_gpio1_set(struct gpio_chip
*chip
,
118 unsigned offset
, int value
)
120 u32 mask
= 1 << offset
;
122 struct au1000_gpio_chip
*gpch
;
125 gpch
= container_of(chip
, struct au1000_gpio_chip
, chip
);
128 reg_offset
= AU1000_GPIO1_OUT
;
130 reg_offset
= AU1000_GPIO1_CLR
;
132 local_irq_save(flags
);
133 writel(mask
, gpch
->regbase
+ reg_offset
);
134 local_irq_restore(flags
);
137 static int au1000_gpio1_direction_input(struct gpio_chip
*chip
, unsigned offset
)
139 u32 mask
= 1 << offset
;
140 struct au1000_gpio_chip
*gpch
;
142 gpch
= container_of(chip
, struct au1000_gpio_chip
, chip
);
143 writel(mask
, gpch
->regbase
+ AU1000_GPIO1_ST
);
148 static int au1000_gpio1_direction_output(struct gpio_chip
*chip
,
149 unsigned offset
, int value
)
151 u32 mask
= 1 << offset
;
152 struct au1000_gpio_chip
*gpch
;
154 gpch
= container_of(chip
, struct au1000_gpio_chip
, chip
);
156 writel(mask
, gpch
->regbase
+ AU1000_GPIO1_TRI_OUT
);
157 au1000_gpio1_set(chip
, offset
, value
);
162 struct au1000_gpio_chip au1000_gpio_chip
[] = {
164 .regbase
= (void __iomem
*)SYS_BASE
,
166 .label
= "au1000-gpio1",
167 .direction_input
= au1000_gpio1_direction_input
,
168 .direction_output
= au1000_gpio1_direction_output
,
169 .get
= au1000_gpio1_get
,
170 .set
= au1000_gpio1_set
,
175 #if !defined(CONFIG_SOC_AU1000)
177 .regbase
= (void __iomem
*)GPIO2_BASE
,
179 .label
= "au1000-gpio2",
180 .direction_input
= au1000_gpio2_direction_input
,
181 .direction_output
= au1000_gpio2_direction_output
,
182 .get
= au1000_gpio2_get
,
183 .set
= au1000_gpio2_set
,
184 .base
= AU1XXX_GPIO_BASE
,
191 static int __init
au1000_gpio_init(void)
193 gpiochip_add(&au1000_gpio_chip
[0].chip
);
194 #if !defined(CONFIG_SOC_AU1000)
195 gpiochip_add(&au1000_gpio_chip
[1].chip
);
200 arch_initcall(au1000_gpio_init
);