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>
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
);
19 case MCPU_GPIO_INPUT
:
20 writel(readl(&gpio_reg
->pin_dir
)&~gpio
, &gpio_reg
->pin_dir
);
22 case MCPU_GPIO_OUTPUT
:
23 writel(readl(&gpio_reg
->pin_dir
)|gpio
, &gpio_reg
->pin_dir
);
26 spin_unlock(&gpio_lock
);
28 EXPORT_SYMBOL(mcpu_gpio_inout
);
30 u32
mcpu_gpio_get_inout(u32 gpio
)
34 spin_lock(&gpio_lock
);
35 if ( readl(&gpio_reg
->pin_dir
) & gpio
)
36 ret
= MCPU_GPIO_OUTPUT
;
38 ret
= MCPU_GPIO_INPUT
;
39 spin_unlock(&gpio_lock
);
43 void mcpu_gpio_set(u32 gpio
, int highlow
)
45 spin_lock(&gpio_lock
);
48 writel(readl(&gpio_reg
->data_out
)|gpio
, &gpio_reg
->data_out
);
51 writel(readl(&gpio_reg
->data_out
)&~gpio
, &gpio_reg
->data_out
);
54 spin_unlock(&gpio_lock
);
56 EXPORT_SYMBOL(mcpu_gpio_set
);
58 u32
mcpu_gpio_get(u32 gpio
)
62 spin_lock(&gpio_lock
);
63 #if 0 // mask by Victor Yu. 04-20-2007
64 ret
= readl(&gpio_reg
->data_in
) & gpio
;
66 ret
= readl(&gpio_reg
->pin_dir
);
67 if ( ret
& gpio
) // this is output GPIO
68 ret
= readl(&gpio_reg
->data_out
) & gpio
;
70 ret
= readl(&gpio_reg
->data_in
) & gpio
;
72 spin_unlock(&gpio_lock
);
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
);