tizen 2.4 release
[kernel/u-boot-tm1.git] / arch / arm / include / asm / arch-sc8800g / gpio_phy.h
1 #ifndef __GPIO_PHY_H__
2 #define __GPIO_PHY_H__
3
4 #include <linux/types.h>
5 #include <asm/io.h>
6 #include <asm/arch/io.h>
7 #include <common.h>
8
9 #include <asm/arch/gpio.h>
10 //#include <mach/adi_hal_internal.h>
11 #include <asm/arch/adi_hal_internal.h>
12 #include <asm/arch/sc8800g_module_config.h>
13
14 #define GPIO_DBG(fmt...) printf(fmt)
15
16 enum gpio_section_type {
17     GPIO_SECTION_GPI = 0x0,
18     GPIO_SECTION_GPO,
19     GPIO_SECTION_GPIO,
20     GPIO_SECTION_INVALID
21 };
22
23
24 struct gpio_section
25 {
26     u32 page_base;
27     u32 page_size;
28     enum gpio_section_type  section_type;
29 };
30
31 enum gpio_die {
32         A_DIE = 0,
33         D_DIE = 1,
34 };
35
36 #define NR_D_DIE_GPIOS 160
37
38 /*
39         gpio is locate in Digital Die(D die) or Analog Die(A die),
40  */
41 static __inline int __get_gpio_die( u32 gpio)
42 {
43         if (gpio < NR_D_DIE_GPIOS)
44                 return D_DIE;
45         else if (gpio < GPIO_MAX_PIN_NUM)
46                 return A_DIE;
47         else {
48                 WARN(1, "wrong gpio %d\r\n", gpio);
49                 return -1;
50         }
51 }
52 static __inline u32 __get_base_addr (u32 gpio_id)
53 {
54     if (gpio_id >= NR_D_DIE_GPIOS)
55     {
56        return ( (gpio_id - NR_D_DIE_GPIOS) >>4) * 0x80 + ANA_GPIO_BASE;
57     }
58
59     return (gpio_id>>4) * 0x80 + (u32) GPIO_BASE;
60 }
61
62 static __inline u32 __get_bit_num (u32 gpio_id)
63 {
64     return (gpio_id & 0xF);
65 }
66 static __inline void gpio_reg_set (u32 reg_addr, int die, u32 value)
67 {
68 //  GPIO_DBG("set %s die reg:%x, value %x\r\n",
69 //                      (die == D_DIE) ? "D die" : "A die", reg_addr, value);
70     if (die == D_DIE) {
71         __raw_writel(value, reg_addr);
72     }
73     else
74     {
75         ANA_REG_SET (reg_addr,value);
76     }
77     return;
78 }
79
80 static __inline u32 gpio_reg_get (u32 reg_addr, int die)
81 {
82 //      GPIO_DBG("read %s die reg:%x\r\n",
83 //                      (die == D_DIE) ? "D die" : "A die", reg_addr);
84         if (die == D_DIE)
85                 return __raw_readl (reg_addr);
86         else
87                 return ANA_REG_GET (reg_addr);
88 }
89 static __inline void gpio_reg_and (u32 reg_addr, int die, u32 value)
90 {
91         if (die == D_DIE)
92                 __raw_bits_and(value, reg_addr);
93         else
94                 ANA_REG_AND (reg_addr,value);
95 }
96 static __inline void gpio_reg_or (u32 reg_addr, int die, u32 value)
97 {
98
99         if (die == D_DIE)
100                 __raw_bits_or(value, reg_addr);
101         else
102                 ANA_REG_OR (reg_addr,value);
103 }
104
105 struct gpio_section *gpio_get_section_table(u32 * table_size);
106
107 #endif
108