diff options
Diffstat (limited to 'arch/arm/mach-davinci/include/mach/gpio.h')
-rw-r--r-- | arch/arm/mach-davinci/include/mach/gpio.h | 65 |
1 files changed, 23 insertions, 42 deletions
diff --git a/arch/arm/mach-davinci/include/mach/gpio.h b/arch/arm/mach-davinci/include/mach/gpio.h index bdab001950ba..82591d0d48fb 100644 --- a/arch/arm/mach-davinci/include/mach/gpio.h +++ b/arch/arm/mach-davinci/include/mach/gpio.h | |||
@@ -45,23 +45,13 @@ | |||
45 | /* Convert GPIO signal to GPIO pin number */ | 45 | /* Convert GPIO signal to GPIO pin number */ |
46 | #define GPIO_TO_PIN(bank, gpio) (16 * (bank) + (gpio)) | 46 | #define GPIO_TO_PIN(bank, gpio) (16 * (bank) + (gpio)) |
47 | 47 | ||
48 | struct davinci_gpio_regs { | ||
49 | u32 dir; | ||
50 | u32 out_data; | ||
51 | u32 set_data; | ||
52 | u32 clr_data; | ||
53 | u32 in_data; | ||
54 | u32 set_rising; | ||
55 | u32 clr_rising; | ||
56 | u32 set_falling; | ||
57 | u32 clr_falling; | ||
58 | u32 intstat; | ||
59 | }; | ||
60 | |||
61 | struct davinci_gpio_controller { | 48 | struct davinci_gpio_controller { |
62 | struct davinci_gpio_regs __iomem *regs; | ||
63 | struct gpio_chip chip; | 49 | struct gpio_chip chip; |
64 | int irq_base; | 50 | int irq_base; |
51 | void __iomem *regs; | ||
52 | void __iomem *set_data; | ||
53 | void __iomem *clr_data; | ||
54 | void __iomem *in_data; | ||
65 | }; | 55 | }; |
66 | 56 | ||
67 | /* The __gpio_to_controller() and __gpio_mask() functions inline to constants | 57 | /* The __gpio_to_controller() and __gpio_mask() functions inline to constants |
@@ -73,25 +63,16 @@ struct davinci_gpio_controller { | |||
73 | * | 63 | * |
74 | * These are NOT part of the cross-platform GPIO interface | 64 | * These are NOT part of the cross-platform GPIO interface |
75 | */ | 65 | */ |
76 | static inline struct davinci_gpio_regs __iomem * | 66 | static inline struct davinci_gpio_controller * |
77 | __gpio_to_controller(unsigned gpio) | 67 | __gpio_to_controller(unsigned gpio) |
78 | { | 68 | { |
79 | void __iomem *ptr; | 69 | struct davinci_gpio_controller *ctlrs = davinci_soc_info.gpio_ctlrs; |
80 | void __iomem *base = davinci_soc_info.gpio_base; | 70 | int index = gpio / 32; |
81 | 71 | ||
82 | if (gpio < 32 * 1) | 72 | if (!ctlrs || index >= davinci_soc_info.gpio_ctlrs_num) |
83 | ptr = base + 0x10; | 73 | return NULL; |
84 | else if (gpio < 32 * 2) | 74 | |
85 | ptr = base + 0x38; | 75 | return ctlrs + index; |
86 | else if (gpio < 32 * 3) | ||
87 | ptr = base + 0x60; | ||
88 | else if (gpio < 32 * 4) | ||
89 | ptr = base + 0x88; | ||
90 | else if (gpio < 32 * 5) | ||
91 | ptr = base + 0xb0; | ||
92 | else | ||
93 | ptr = NULL; | ||
94 | return ptr; | ||
95 | } | 76 | } |
96 | 77 | ||
97 | static inline u32 __gpio_mask(unsigned gpio) | 78 | static inline u32 __gpio_mask(unsigned gpio) |
@@ -107,16 +88,16 @@ static inline u32 __gpio_mask(unsigned gpio) | |||
107 | */ | 88 | */ |
108 | static inline void gpio_set_value(unsigned gpio, int value) | 89 | static inline void gpio_set_value(unsigned gpio, int value) |
109 | { | 90 | { |
110 | if (__builtin_constant_p(value) && gpio < DAVINCI_N_GPIO) { | 91 | if (__builtin_constant_p(value) && gpio < davinci_soc_info.gpio_num) { |
111 | struct davinci_gpio_regs __iomem *g; | 92 | struct davinci_gpio_controller *ctlr; |
112 | u32 mask; | 93 | u32 mask; |
113 | 94 | ||
114 | g = __gpio_to_controller(gpio); | 95 | ctlr = __gpio_to_controller(gpio); |
115 | mask = __gpio_mask(gpio); | 96 | mask = __gpio_mask(gpio); |
116 | if (value) | 97 | if (value) |
117 | __raw_writel(mask, &g->set_data); | 98 | __raw_writel(mask, ctlr->set_data); |
118 | else | 99 | else |
119 | __raw_writel(mask, &g->clr_data); | 100 | __raw_writel(mask, ctlr->clr_data); |
120 | return; | 101 | return; |
121 | } | 102 | } |
122 | 103 | ||
@@ -134,18 +115,18 @@ static inline void gpio_set_value(unsigned gpio, int value) | |||
134 | */ | 115 | */ |
135 | static inline int gpio_get_value(unsigned gpio) | 116 | static inline int gpio_get_value(unsigned gpio) |
136 | { | 117 | { |
137 | struct davinci_gpio_regs __iomem *g; | 118 | struct davinci_gpio_controller *ctlr; |
138 | 119 | ||
139 | if (!__builtin_constant_p(gpio) || gpio >= DAVINCI_N_GPIO) | 120 | if (!__builtin_constant_p(gpio) || gpio >= davinci_soc_info.gpio_num) |
140 | return __gpio_get_value(gpio); | 121 | return __gpio_get_value(gpio); |
141 | 122 | ||
142 | g = __gpio_to_controller(gpio); | 123 | ctlr = __gpio_to_controller(gpio); |
143 | return __gpio_mask(gpio) & __raw_readl(&g->in_data); | 124 | return __gpio_mask(gpio) & __raw_readl(ctlr->in_data); |
144 | } | 125 | } |
145 | 126 | ||
146 | static inline int gpio_cansleep(unsigned gpio) | 127 | static inline int gpio_cansleep(unsigned gpio) |
147 | { | 128 | { |
148 | if (__builtin_constant_p(gpio) && gpio < DAVINCI_N_GPIO) | 129 | if (__builtin_constant_p(gpio) && gpio < davinci_soc_info.gpio_num) |
149 | return 0; | 130 | return 0; |
150 | else | 131 | else |
151 | return __gpio_cansleep(gpio); | 132 | return __gpio_cansleep(gpio); |