MOXA linux-2.6.x / linux-2.6.9-uc0 from sdlinux-moxaart.tgz
[linux-2.6.9-moxart.git] / arch / arm / mach-moxacpu / gpio.c
blob2cc159c416b87b1ae70159c3a5ceea1d3e6b5357
2 #include <linux/config.h>
3 #include <linux/module.h>
4 #include <linux/kernel.h>
5 #include <linux/types.h>
6 #include <linux/spinlock.h>
8 #include <asm/io.h>
9 #include <asm/arch/cpe/cpe.h>
10 #include <asm/arch/gpio.h>
12 static mcpu_gpio_reg_t *gpio_reg=(mcpu_gpio_reg_t *)CPE_GPIO_VA_BASE;
13 static spinlock_t gpio_lock=SPIN_LOCK_UNLOCKED;
15 void mcpu_gpio_inout(u32 gpio, int inout)
17 spin_lock(&gpio_lock);
18 switch ( inout ) {
19 case MCPU_GPIO_INPUT :
20 writel(readl(&gpio_reg->pin_dir)&~gpio, &gpio_reg->pin_dir);
21 break;
22 case MCPU_GPIO_OUTPUT :
23 writel(readl(&gpio_reg->pin_dir)|gpio, &gpio_reg->pin_dir);
24 break;
26 spin_unlock(&gpio_lock);
28 EXPORT_SYMBOL(mcpu_gpio_inout);
30 u32 mcpu_gpio_get_inout(u32 gpio)
32 u32 ret;
34 spin_lock(&gpio_lock);
35 if ( readl(&gpio_reg->pin_dir) & gpio )
36 ret = MCPU_GPIO_OUTPUT;
37 else
38 ret = MCPU_GPIO_INPUT;
39 spin_unlock(&gpio_lock);
40 return ret;
43 void mcpu_gpio_set(u32 gpio, int highlow)
45 spin_lock(&gpio_lock);
46 switch ( highlow ) {
47 case MCPU_GPIO_HIGH :
48 writel(readl(&gpio_reg->data_out)|gpio, &gpio_reg->data_out);
49 break;
50 case MCPU_GPIO_LOW :
51 writel(readl(&gpio_reg->data_out)&~gpio, &gpio_reg->data_out);
52 break;
54 spin_unlock(&gpio_lock);
56 EXPORT_SYMBOL(mcpu_gpio_set);
58 u32 mcpu_gpio_get(u32 gpio)
60 u32 ret;
62 spin_lock(&gpio_lock);
63 #if 0 // mask by Victor Yu. 04-20-2007
64 ret = readl(&gpio_reg->data_in) & gpio;
65 #else
66 ret = readl(&gpio_reg->pin_dir);
67 if ( ret & gpio ) // this is output GPIO
68 ret = readl(&gpio_reg->data_out) & gpio;
69 else
70 ret = readl(&gpio_reg->data_in) & gpio;
71 #endif
72 spin_unlock(&gpio_lock);
73 return ret;
75 EXPORT_SYMBOL(mcpu_gpio_get);
77 void mcpu_gpio_mp_set(u32 gpio)
79 spin_lock(&gpio_lock);
80 *(volatile unsigned int *)(CPE_PMU_VA_BASE+0x100) |= gpio;
81 spin_unlock(&gpio_lock);
83 EXPORT_SYMBOL(mcpu_gpio_mp_set);
85 void mcpu_gpio_mp_clear(u32 gpio)
87 spin_lock(&gpio_lock);
88 *(volatile unsigned int *)(CPE_PMU_VA_BASE+0x100) &= ~gpio;
89 spin_unlock(&gpio_lock);
91 EXPORT_SYMBOL(mcpu_gpio_mp_clear);