tizen 2.4 release
[kernel/u-boot-tm1.git] / drivers / gpio / sc8810_gpio.c
1 #include "asm/arch/sci_types.h"
2 #include <asm/io.h>
3 #ifndef GPIO_BASE
4 #define         GPIO_BASE 0x8A000000    //Sunny, for SC8810
5 #endif
6
7 static void __raw_bits_and(unsigned int v, unsigned int a)
8 {
9         __raw_writel((__raw_readl(a) & v), a);
10 }
11
12 static void __raw_bits_or(unsigned int v, unsigned int a)
13 {
14           __raw_writel((__raw_readl(a) | v), a);
15 }
16
17 void gpio_direction_output(int PinNo, int OutIn)        //Sunny only for uBoot gpio ops
18 {
19         int addr, maskbit, n;
20         if(PinNo >=192){
21                 addr = 0x820004C0;
22         }else if(PinNo >=176){
23                 addr = 0x82000480;
24         }else{
25                 n = (PinNo - 16)/16;
26                 addr =GPIO_BASE +  0x0080 * n;
27         }
28         maskbit = PinNo%16;
29
30         __raw_bits_or((1<<5),  0x8B000008);     //GPIO register Enable
31         __raw_bits_or((1<<maskbit), addr + 4);  //Mask
32         if(OutIn)
33                 __raw_bits_or((1<<maskbit), addr + 8);  //Dir out
34         else    __raw_bits_and(~(1<<maskbit), addr+ 8); //Dir in
35 }
36
37 void gpio_set_value(int PinNo, int Level)       //Sunny only for uBoot gpio ops
38 {
39         int addr, maskbit, n;
40         if(PinNo >=192){
41                 addr = 0x820004C0;
42         }else if(PinNo >=176){
43                 addr = 0x82000480;
44         }else{
45                 n = (PinNo - 16)/16;
46                 addr =GPIO_BASE +  0x0080 * n;
47         }
48         maskbit = PinNo%16;
49
50         __raw_bits_or((1<<maskbit), addr + 4);  //Mask
51         if(Level)
52                 __raw_bits_or((1<<maskbit), addr);      //High
53         else    __raw_bits_and(~(1<<maskbit), addr);    //Low
54 }
55
56 int gpio_get_value(int PinNo)   //Sunny only for uBoot gpio ops
57 {
58         int addr, maskbit, n;
59         uint32 ret;
60         if(PinNo >=192){
61                 addr = 0x820004C0;
62         }else if(PinNo >=176){
63                 addr = 0x82000480;
64         }else{
65                 n = (PinNo - 16)/16;
66                 addr =GPIO_BASE +  0x0080 * n;
67         }
68         maskbit = PinNo%16;
69
70         ret = __raw_readl(addr);
71
72         if(ret & (1<<maskbit))
73                 return 1;
74         else    return 0;
75 }
76