2 * Ralink SoC specific GPIO support
4 * Copyright (C) 2009-2011 Gabor Juhos <juhosg@openwrt.org>
6 * This program is free software; you can redistribute it and/or modify it
7 * under the terms of the GNU General Public License version 2 as published
8 * by the Free Software Foundation.
11 #include <linux/init.h>
14 #include <asm/mach-ralink/ramips_gpio.h>
15 #include <ralink_soc.h>
17 static inline struct ramips_gpio_chip
*to_ramips_gpio(struct gpio_chip
*chip
)
19 struct ramips_gpio_chip
*rg
;
21 rg
= container_of(chip
, struct ramips_gpio_chip
, chip
);
25 static inline void ramips_gpio_wr(struct ramips_gpio_chip
*rg
, u8 reg
, u32 val
)
27 __raw_writel(val
, rg
->regs_base
+ rg
->regs
[reg
]);
30 static inline u32
ramips_gpio_rr(struct ramips_gpio_chip
*rg
, u8 reg
)
32 return __raw_readl(rg
->regs_base
+ rg
->regs
[reg
]);
35 static int ramips_gpio_direction_input(struct gpio_chip
*chip
, unsigned offset
)
37 struct ramips_gpio_chip
*rg
= to_ramips_gpio(chip
);
41 spin_lock_irqsave(&rg
->lock
, flags
);
42 t
= ramips_gpio_rr(rg
, RAMIPS_GPIO_REG_DIR
);
44 ramips_gpio_wr(rg
, RAMIPS_GPIO_REG_DIR
, t
);
45 spin_unlock_irqrestore(&rg
->lock
, flags
);
50 static int ramips_gpio_direction_output(struct gpio_chip
*chip
,
51 unsigned offset
, int value
)
53 struct ramips_gpio_chip
*rg
= to_ramips_gpio(chip
);
58 reg
= (value
) ? RAMIPS_GPIO_REG_SET
: RAMIPS_GPIO_REG_RESET
;
60 spin_lock_irqsave(&rg
->lock
, flags
);
61 ramips_gpio_wr(rg
, reg
, 1 << offset
);
63 t
= ramips_gpio_rr(rg
, RAMIPS_GPIO_REG_DIR
);
65 ramips_gpio_wr(rg
, RAMIPS_GPIO_REG_DIR
, t
);
66 spin_unlock_irqrestore(&rg
->lock
, flags
);
71 static void ramips_gpio_set(struct gpio_chip
*chip
, unsigned offset
, int value
)
73 struct ramips_gpio_chip
*rg
= to_ramips_gpio(chip
);
76 reg
= (value
) ? RAMIPS_GPIO_REG_SET
: RAMIPS_GPIO_REG_RESET
;
77 ramips_gpio_wr(rg
, reg
, 1 << offset
);
80 static int ramips_gpio_get(struct gpio_chip
*chip
, unsigned offset
)
82 struct ramips_gpio_chip
*rg
= to_ramips_gpio(chip
);
85 t
= ramips_gpio_rr(rg
, RAMIPS_GPIO_REG_DATA
);
86 return !!(t
& (1 << offset
));
89 static struct ramips_gpio_chip ramips_gpio_chip0
= {
91 .label
= "ramips-gpio0",
93 .ngpio
= RALINK_SOC_GPIO0_COUNT
,
96 [RAMIPS_GPIO_REG_INT
] = GPIO0_REG_INT
,
97 [RAMIPS_GPIO_REG_EDGE
] = GPIO0_REG_EDGE
,
98 [RAMIPS_GPIO_REG_RENA
] = GPIO0_REG_RENA
,
99 [RAMIPS_GPIO_REG_FENA
] = GPIO0_REG_FENA
,
100 [RAMIPS_GPIO_REG_DATA
] = GPIO0_REG_DATA
,
101 [RAMIPS_GPIO_REG_DIR
] = GPIO0_REG_DIR
,
102 [RAMIPS_GPIO_REG_POL
] = GPIO0_REG_POL
,
103 [RAMIPS_GPIO_REG_SET
] = GPIO0_REG_SET
,
104 [RAMIPS_GPIO_REG_RESET
] = GPIO0_REG_RESET
,
105 [RAMIPS_GPIO_REG_TOGGLE
] = GPIO0_REG_TOGGLE
,
107 .map_base
= RALINK_SOC_GPIO_BASE
,
108 .map_size
= PAGE_SIZE
,
111 static struct ramips_gpio_chip ramips_gpio_chip1
= {
113 .label
= "ramips-gpio1",
115 .ngpio
= RALINK_SOC_GPIO1_COUNT
,
118 [RAMIPS_GPIO_REG_INT
] = GPIO1_REG_INT
,
119 [RAMIPS_GPIO_REG_EDGE
] = GPIO1_REG_EDGE
,
120 [RAMIPS_GPIO_REG_RENA
] = GPIO1_REG_RENA
,
121 [RAMIPS_GPIO_REG_FENA
] = GPIO1_REG_FENA
,
122 [RAMIPS_GPIO_REG_DATA
] = GPIO1_REG_DATA
,
123 [RAMIPS_GPIO_REG_DIR
] = GPIO1_REG_DIR
,
124 [RAMIPS_GPIO_REG_POL
] = GPIO1_REG_POL
,
125 [RAMIPS_GPIO_REG_SET
] = GPIO1_REG_SET
,
126 [RAMIPS_GPIO_REG_RESET
] = GPIO1_REG_RESET
,
127 [RAMIPS_GPIO_REG_TOGGLE
] = GPIO1_REG_TOGGLE
,
129 .map_base
= RALINK_SOC_GPIO_BASE
,
130 .map_size
= PAGE_SIZE
,
133 static struct ramips_gpio_chip ramips_gpio_chip2
= {
135 .label
= "ramips-gpio2",
137 .ngpio
= RALINK_SOC_GPIO2_COUNT
,
140 [RAMIPS_GPIO_REG_INT
] = GPIO2_REG_INT
,
141 [RAMIPS_GPIO_REG_EDGE
] = GPIO2_REG_EDGE
,
142 [RAMIPS_GPIO_REG_RENA
] = GPIO2_REG_RENA
,
143 [RAMIPS_GPIO_REG_FENA
] = GPIO2_REG_FENA
,
144 [RAMIPS_GPIO_REG_DATA
] = GPIO2_REG_DATA
,
145 [RAMIPS_GPIO_REG_DIR
] = GPIO2_REG_DIR
,
146 [RAMIPS_GPIO_REG_POL
] = GPIO2_REG_POL
,
147 [RAMIPS_GPIO_REG_SET
] = GPIO2_REG_SET
,
148 [RAMIPS_GPIO_REG_RESET
] = GPIO2_REG_RESET
,
149 [RAMIPS_GPIO_REG_TOGGLE
] = GPIO2_REG_TOGGLE
,
151 .map_base
= RALINK_SOC_GPIO_BASE
,
152 .map_size
= PAGE_SIZE
,
155 static __init
void ramips_gpio_chip_add(struct ramips_gpio_chip
*rg
)
157 spin_lock_init(&rg
->lock
);
159 rg
->regs_base
= ioremap(rg
->map_base
, rg
->map_size
);
161 rg
->chip
.direction_input
= ramips_gpio_direction_input
;
162 rg
->chip
.direction_output
= ramips_gpio_direction_output
;
163 rg
->chip
.get
= ramips_gpio_get
;
164 rg
->chip
.set
= ramips_gpio_set
;
166 /* set polarity to low for all lines */
167 ramips_gpio_wr(rg
, RAMIPS_GPIO_REG_POL
, 0);
169 gpiochip_add(&rg
->chip
);
172 __init
int ramips_gpio_init(void)
174 ramips_gpio_chip_add(&ramips_gpio_chip0
);
175 ramips_gpio_chip_add(&ramips_gpio_chip1
);
176 ramips_gpio_chip_add(&ramips_gpio_chip2
);