21 #include <linux/module.h>
31 static int ar7_gpio_get_value(
struct gpio_chip *
chip,
unsigned gpio)
40 static int titan_gpio_get_value(
struct gpio_chip *
chip,
unsigned gpio)
47 return readl(gpio >> 5 ? gpio_in1 : gpio_in0) & (1 << (gpio & 0x1f));
50 static void ar7_gpio_set_value(
struct gpio_chip *
chip,
64 static void titan_gpio_set_value(
struct gpio_chip *chip,
65 unsigned gpio,
int value)
73 tmp =
readl(gpio >> 5 ? gpio_out1 : gpio_out0) & ~(1 << (gpio & 0x1f));
75 tmp |= 1 << (gpio & 0x1f);
76 writel(tmp, gpio >> 5 ? gpio_out1 : gpio_out0);
79 static int ar7_gpio_direction_input(
struct gpio_chip *chip,
unsigned gpio)
90 static int titan_gpio_direction_input(
struct gpio_chip *chip,
unsigned gpio)
100 writel(
readl(gpio >> 5 ? gpio_dir1 : gpio_dir0) | (1 << (gpio & 0x1f)),
101 gpio >> 5 ? gpio_dir1 : gpio_dir0);
105 static int ar7_gpio_direction_output(
struct gpio_chip *chip,
106 unsigned gpio,
int value)
112 ar7_gpio_set_value(chip, gpio, value);
118 static int titan_gpio_direction_output(
struct gpio_chip *chip,
119 unsigned gpio,
int value)
129 titan_gpio_set_value(chip, gpio, value);
130 writel(
readl(gpio >> 5 ? gpio_dir1 : gpio_dir0) & ~(1 <<
131 (gpio & 0x1f)), gpio >> 5 ? gpio_dir1 : gpio_dir0);
139 .direction_input = ar7_gpio_direction_input,
140 .direction_output = ar7_gpio_direction_output,
141 .set = ar7_gpio_set_value,
142 .get = ar7_gpio_get_value,
148 static struct ar7_gpio_chip titan_gpio_chip = {
150 .label =
"titan-gpio",
151 .direction_input = titan_gpio_direction_input,
152 .direction_output = titan_gpio_direction_output,
153 .set = titan_gpio_set_value,
154 .get = titan_gpio_get_value,
160 static inline int ar7_gpio_enable_ar7(
unsigned gpio)
169 static inline int ar7_gpio_enable_titan(
unsigned gpio)
174 writel(
readl(gpio >> 5 ? gpio_en1 : gpio_en0) | (1 << (gpio & 0x1f)),
175 gpio >> 5 ? gpio_en1 : gpio_en0);
182 return ar7_is_titan() ? ar7_gpio_enable_titan(gpio) :
183 ar7_gpio_enable_ar7(gpio);
187 static inline int ar7_gpio_disable_ar7(
unsigned gpio)
196 static inline int ar7_gpio_disable_titan(
unsigned gpio)
201 writel(
readl(gpio >> 5 ? gpio_en1 : gpio_en0) & ~(1 << (gpio & 0x1f)),
202 gpio >> 5 ? gpio_en1 : gpio_en0);
209 return ar7_is_titan() ? ar7_gpio_disable_titan(gpio) :
210 ar7_gpio_disable_ar7(gpio);
276 static int titan_gpio_pinsel(
unsigned gpio)
279 u32 mux_status, pin_sel_reg,
tmp;
285 gpio_cfg = titan_gpio_table[
gpio];
286 pin_sel_reg = gpio_cfg.
reg - 1;
288 mux_status = (
readl(pin_sel + pin_sel_reg) >> gpio_cfg.shift) & 0x3;
291 if (!((mux_status == 0) || (mux_status == gpio_cfg.func)))
295 tmp =
readl(pin_sel + pin_sel_reg);
296 tmp |= ((gpio_cfg.func & 0x3) << gpio_cfg.shift);
297 writel(tmp, pin_sel + pin_sel_reg);
303 static void titan_gpio_init(
void)
307 for (i = 44; i < 48; i++) {
308 titan_gpio_pinsel(i);
309 ar7_gpio_enable_titan(i);
310 titan_gpio_direction_input(&titan_gpio_chip.
chip, i);
317 struct ar7_gpio_chip *gpch;
320 if (!ar7_is_titan()) {
321 gpch = &ar7_gpio_chip;
324 gpch = &titan_gpio_chip;
342 gpch->
chip.label, gpch->
chip.ngpio);