aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKevin Hilman <khilman@ti.com>2011-04-20 19:31:23 -0400
committerKevin Hilman <khilman@ti.com>2011-06-16 14:13:42 -0400
commitfa87931acb8203a1f40a3c637863ad238f70cd40 (patch)
treefd79e56fb9819bbb1096c9d3904f0ba04bec832a
parenta8be8dafd00e3ccf4f85e2f30babf42be5076324 (diff)
gpio/omap: consolidate direction, input, output, remove #ifdefs
Add register offset fields to GPIO platform_data for registers. This patch adds registers that control direction, input and output data. Using these register offsets in the common driver allows removal of #ifdefs and greatly improves readability. Also create dedicated data out functions: one for banks with dedicated set/clear registers, and another for banks with a single mask register. Signed-off-by: Kevin Hilman <khilman@ti.com>
-rw-r--r--arch/arm/mach-omap1/gpio15xx.c14
-rw-r--r--arch/arm/mach-omap1/gpio16xx.c19
-rw-r--r--arch/arm/mach-omap1/gpio7xx.c19
-rw-r--r--arch/arm/mach-omap2/gpio.c16
-rw-r--r--arch/arm/plat-omap/include/plat/gpio.h10
-rw-r--r--drivers/gpio/gpio-omap.c243
6 files changed, 121 insertions, 200 deletions
diff --git a/arch/arm/mach-omap1/gpio15xx.c b/arch/arm/mach-omap1/gpio15xx.c
index 04c4b04cf54e..a622d567b53e 100644
--- a/arch/arm/mach-omap1/gpio15xx.c
+++ b/arch/arm/mach-omap1/gpio15xx.c
@@ -34,11 +34,18 @@ static struct __initdata resource omap15xx_mpu_gpio_resources[] = {
34 }, 34 },
35}; 35};
36 36
37static struct omap_gpio_reg_offs omap15xx_mpuio_regs = {
38 .direction = OMAP_MPUIO_IO_CNTL,
39 .datain = OMAP_MPUIO_INPUT_LATCH,
40 .dataout = OMAP_MPUIO_OUTPUT,
41};
42
37static struct __initdata omap_gpio_platform_data omap15xx_mpu_gpio_config = { 43static struct __initdata omap_gpio_platform_data omap15xx_mpu_gpio_config = {
38 .virtual_irq_start = IH_MPUIO_BASE, 44 .virtual_irq_start = IH_MPUIO_BASE,
39 .bank_type = METHOD_MPUIO, 45 .bank_type = METHOD_MPUIO,
40 .bank_width = 16, 46 .bank_width = 16,
41 .bank_stride = 1, 47 .bank_stride = 1,
48 .regs = &omap15xx_mpuio_regs,
42}; 49};
43 50
44static struct __initdata platform_device omap15xx_mpu_gpio = { 51static struct __initdata platform_device omap15xx_mpu_gpio = {
@@ -64,10 +71,17 @@ static struct __initdata resource omap15xx_gpio_resources[] = {
64 }, 71 },
65}; 72};
66 73
74static struct omap_gpio_reg_offs omap15xx_gpio_regs = {
75 .direction = OMAP1510_GPIO_DIR_CONTROL,
76 .datain = OMAP1510_GPIO_DATA_INPUT,
77 .dataout = OMAP1510_GPIO_DATA_OUTPUT,
78};
79
67static struct __initdata omap_gpio_platform_data omap15xx_gpio_config = { 80static struct __initdata omap_gpio_platform_data omap15xx_gpio_config = {
68 .virtual_irq_start = IH_GPIO_BASE, 81 .virtual_irq_start = IH_GPIO_BASE,
69 .bank_type = METHOD_GPIO_1510, 82 .bank_type = METHOD_GPIO_1510,
70 .bank_width = 16, 83 .bank_width = 16,
84 .regs = &omap15xx_gpio_regs,
71}; 85};
72 86
73static struct __initdata platform_device omap15xx_gpio = { 87static struct __initdata platform_device omap15xx_gpio = {
diff --git a/arch/arm/mach-omap1/gpio16xx.c b/arch/arm/mach-omap1/gpio16xx.c
index 5dd0d4c82b24..4ff6ff36ab73 100644
--- a/arch/arm/mach-omap1/gpio16xx.c
+++ b/arch/arm/mach-omap1/gpio16xx.c
@@ -37,11 +37,18 @@ static struct __initdata resource omap16xx_mpu_gpio_resources[] = {
37 }, 37 },
38}; 38};
39 39
40static struct omap_gpio_reg_offs omap16xx_mpuio_regs = {
41 .direction = OMAP_MPUIO_IO_CNTL,
42 .datain = OMAP_MPUIO_INPUT_LATCH,
43 .dataout = OMAP_MPUIO_OUTPUT,
44};
45
40static struct __initdata omap_gpio_platform_data omap16xx_mpu_gpio_config = { 46static struct __initdata omap_gpio_platform_data omap16xx_mpu_gpio_config = {
41 .virtual_irq_start = IH_MPUIO_BASE, 47 .virtual_irq_start = IH_MPUIO_BASE,
42 .bank_type = METHOD_MPUIO, 48 .bank_type = METHOD_MPUIO,
43 .bank_width = 16, 49 .bank_width = 16,
44 .bank_stride = 1, 50 .bank_stride = 1,
51 .regs = &omap16xx_mpuio_regs,
45}; 52};
46 53
47static struct __initdata platform_device omap16xx_mpu_gpio = { 54static struct __initdata platform_device omap16xx_mpu_gpio = {
@@ -67,10 +74,19 @@ static struct __initdata resource omap16xx_gpio1_resources[] = {
67 }, 74 },
68}; 75};
69 76
77static struct omap_gpio_reg_offs omap16xx_gpio_regs = {
78 .direction = OMAP1610_GPIO_DIRECTION,
79 .set_dataout = OMAP1610_GPIO_SET_DATAOUT,
80 .clr_dataout = OMAP1610_GPIO_CLEAR_DATAOUT,
81 .datain = OMAP1610_GPIO_DATAIN,
82 .dataout = OMAP1610_GPIO_DATAOUT,
83};
84
70static struct __initdata omap_gpio_platform_data omap16xx_gpio1_config = { 85static struct __initdata omap_gpio_platform_data omap16xx_gpio1_config = {
71 .virtual_irq_start = IH_GPIO_BASE, 86 .virtual_irq_start = IH_GPIO_BASE,
72 .bank_type = METHOD_GPIO_1610, 87 .bank_type = METHOD_GPIO_1610,
73 .bank_width = 16, 88 .bank_width = 16,
89 .regs = &omap16xx_gpio_regs,
74}; 90};
75 91
76static struct __initdata platform_device omap16xx_gpio1 = { 92static struct __initdata platform_device omap16xx_gpio1 = {
@@ -100,6 +116,7 @@ static struct __initdata omap_gpio_platform_data omap16xx_gpio2_config = {
100 .virtual_irq_start = IH_GPIO_BASE + 16, 116 .virtual_irq_start = IH_GPIO_BASE + 16,
101 .bank_type = METHOD_GPIO_1610, 117 .bank_type = METHOD_GPIO_1610,
102 .bank_width = 16, 118 .bank_width = 16,
119 .regs = &omap16xx_gpio_regs,
103}; 120};
104 121
105static struct __initdata platform_device omap16xx_gpio2 = { 122static struct __initdata platform_device omap16xx_gpio2 = {
@@ -129,6 +146,7 @@ static struct __initdata omap_gpio_platform_data omap16xx_gpio3_config = {
129 .virtual_irq_start = IH_GPIO_BASE + 32, 146 .virtual_irq_start = IH_GPIO_BASE + 32,
130 .bank_type = METHOD_GPIO_1610, 147 .bank_type = METHOD_GPIO_1610,
131 .bank_width = 16, 148 .bank_width = 16,
149 .regs = &omap16xx_gpio_regs,
132}; 150};
133 151
134static struct __initdata platform_device omap16xx_gpio3 = { 152static struct __initdata platform_device omap16xx_gpio3 = {
@@ -158,6 +176,7 @@ static struct __initdata omap_gpio_platform_data omap16xx_gpio4_config = {
158 .virtual_irq_start = IH_GPIO_BASE + 48, 176 .virtual_irq_start = IH_GPIO_BASE + 48,
159 .bank_type = METHOD_GPIO_1610, 177 .bank_type = METHOD_GPIO_1610,
160 .bank_width = 16, 178 .bank_width = 16,
179 .regs = &omap16xx_gpio_regs,
161}; 180};
162 181
163static struct __initdata platform_device omap16xx_gpio4 = { 182static struct __initdata platform_device omap16xx_gpio4 = {
diff --git a/arch/arm/mach-omap1/gpio7xx.c b/arch/arm/mach-omap1/gpio7xx.c
index 1204c8b871af..efe4dccaa4f2 100644
--- a/arch/arm/mach-omap1/gpio7xx.c
+++ b/arch/arm/mach-omap1/gpio7xx.c
@@ -39,11 +39,18 @@ static struct __initdata resource omap7xx_mpu_gpio_resources[] = {
39 }, 39 },
40}; 40};
41 41
42static struct omap_gpio_reg_offs omap7xx_mpuio_regs = {
43 .direction = OMAP_MPUIO_IO_CNTL / 2,
44 .datain = OMAP_MPUIO_INPUT_LATCH / 2,
45 .dataout = OMAP_MPUIO_OUTPUT / 2,
46};
47
42static struct __initdata omap_gpio_platform_data omap7xx_mpu_gpio_config = { 48static struct __initdata omap_gpio_platform_data omap7xx_mpu_gpio_config = {
43 .virtual_irq_start = IH_MPUIO_BASE, 49 .virtual_irq_start = IH_MPUIO_BASE,
44 .bank_type = METHOD_MPUIO, 50 .bank_type = METHOD_MPUIO,
45 .bank_width = 32, 51 .bank_width = 32,
46 .bank_stride = 2, 52 .bank_stride = 2,
53 .regs = &omap7xx_mpuio_regs,
47}; 54};
48 55
49static struct __initdata platform_device omap7xx_mpu_gpio = { 56static struct __initdata platform_device omap7xx_mpu_gpio = {
@@ -69,10 +76,17 @@ static struct __initdata resource omap7xx_gpio1_resources[] = {
69 }, 76 },
70}; 77};
71 78
79static struct omap_gpio_reg_offs omap7xx_gpio_regs = {
80 .direction = OMAP7XX_GPIO_DIR_CONTROL,
81 .datain = OMAP7XX_GPIO_DATA_INPUT,
82 .dataout = OMAP7XX_GPIO_DATA_OUTPUT,
83};
84
72static struct __initdata omap_gpio_platform_data omap7xx_gpio1_config = { 85static struct __initdata omap_gpio_platform_data omap7xx_gpio1_config = {
73 .virtual_irq_start = IH_GPIO_BASE, 86 .virtual_irq_start = IH_GPIO_BASE,
74 .bank_type = METHOD_GPIO_7XX, 87 .bank_type = METHOD_GPIO_7XX,
75 .bank_width = 32, 88 .bank_width = 32,
89 .regs = &omap7xx_gpio_regs,
76}; 90};
77 91
78static struct __initdata platform_device omap7xx_gpio1 = { 92static struct __initdata platform_device omap7xx_gpio1 = {
@@ -102,6 +116,7 @@ static struct __initdata omap_gpio_platform_data omap7xx_gpio2_config = {
102 .virtual_irq_start = IH_GPIO_BASE + 32, 116 .virtual_irq_start = IH_GPIO_BASE + 32,
103 .bank_type = METHOD_GPIO_7XX, 117 .bank_type = METHOD_GPIO_7XX,
104 .bank_width = 32, 118 .bank_width = 32,
119 .regs = &omap7xx_gpio_regs,
105}; 120};
106 121
107static struct __initdata platform_device omap7xx_gpio2 = { 122static struct __initdata platform_device omap7xx_gpio2 = {
@@ -131,6 +146,7 @@ static struct __initdata omap_gpio_platform_data omap7xx_gpio3_config = {
131 .virtual_irq_start = IH_GPIO_BASE + 64, 146 .virtual_irq_start = IH_GPIO_BASE + 64,
132 .bank_type = METHOD_GPIO_7XX, 147 .bank_type = METHOD_GPIO_7XX,
133 .bank_width = 32, 148 .bank_width = 32,
149 .regs = &omap7xx_gpio_regs,
134}; 150};
135 151
136static struct __initdata platform_device omap7xx_gpio3 = { 152static struct __initdata platform_device omap7xx_gpio3 = {
@@ -160,6 +176,7 @@ static struct __initdata omap_gpio_platform_data omap7xx_gpio4_config = {
160 .virtual_irq_start = IH_GPIO_BASE + 96, 176 .virtual_irq_start = IH_GPIO_BASE + 96,
161 .bank_type = METHOD_GPIO_7XX, 177 .bank_type = METHOD_GPIO_7XX,
162 .bank_width = 32, 178 .bank_width = 32,
179 .regs = &omap7xx_gpio_regs,
163}; 180};
164 181
165static struct __initdata platform_device omap7xx_gpio4 = { 182static struct __initdata platform_device omap7xx_gpio4 = {
@@ -189,6 +206,7 @@ static struct __initdata omap_gpio_platform_data omap7xx_gpio5_config = {
189 .virtual_irq_start = IH_GPIO_BASE + 128, 206 .virtual_irq_start = IH_GPIO_BASE + 128,
190 .bank_type = METHOD_GPIO_7XX, 207 .bank_type = METHOD_GPIO_7XX,
191 .bank_width = 32, 208 .bank_width = 32,
209 .regs = &omap7xx_gpio_regs,
192}; 210};
193 211
194static struct __initdata platform_device omap7xx_gpio5 = { 212static struct __initdata platform_device omap7xx_gpio5 = {
@@ -218,6 +236,7 @@ static struct __initdata omap_gpio_platform_data omap7xx_gpio6_config = {
218 .virtual_irq_start = IH_GPIO_BASE + 160, 236 .virtual_irq_start = IH_GPIO_BASE + 160,
219 .bank_type = METHOD_GPIO_7XX, 237 .bank_type = METHOD_GPIO_7XX,
220 .bank_width = 32, 238 .bank_width = 32,
239 .regs = &omap7xx_gpio_regs,
221}; 240};
222 241
223static struct __initdata platform_device omap7xx_gpio6 = { 242static struct __initdata platform_device omap7xx_gpio6 = {
diff --git a/arch/arm/mach-omap2/gpio.c b/arch/arm/mach-omap2/gpio.c
index 9529842ae054..357e06956b0c 100644
--- a/arch/arm/mach-omap2/gpio.c
+++ b/arch/arm/mach-omap2/gpio.c
@@ -61,13 +61,29 @@ static int omap2_gpio_dev_init(struct omap_hwmod *oh, void *unused)
61 pdata->dbck_flag = dev_attr->dbck_flag; 61 pdata->dbck_flag = dev_attr->dbck_flag;
62 pdata->virtual_irq_start = IH_GPIO_BASE + 32 * (id - 1); 62 pdata->virtual_irq_start = IH_GPIO_BASE + 32 * (id - 1);
63 63
64 pdata->regs = kzalloc(sizeof(struct omap_gpio_reg_offs), GFP_KERNEL);
65 if (!pdata) {
66 pr_err("gpio%d: Memory allocation failed\n", id);
67 return -ENOMEM;
68 }
69
64 switch (oh->class->rev) { 70 switch (oh->class->rev) {
65 case 0: 71 case 0:
66 case 1: 72 case 1:
67 pdata->bank_type = METHOD_GPIO_24XX; 73 pdata->bank_type = METHOD_GPIO_24XX;
74 pdata->regs->direction = OMAP24XX_GPIO_OE;
75 pdata->regs->datain = OMAP24XX_GPIO_DATAIN;
76 pdata->regs->dataout = OMAP24XX_GPIO_DATAOUT;
77 pdata->regs->set_dataout = OMAP24XX_GPIO_SETDATAOUT;
78 pdata->regs->clr_dataout = OMAP24XX_GPIO_CLEARDATAOUT;
68 break; 79 break;
69 case 2: 80 case 2:
70 pdata->bank_type = METHOD_GPIO_44XX; 81 pdata->bank_type = METHOD_GPIO_44XX;
82 pdata->regs->direction = OMAP4_GPIO_OE;
83 pdata->regs->datain = OMAP4_GPIO_DATAIN;
84 pdata->regs->dataout = OMAP4_GPIO_DATAOUT;
85 pdata->regs->set_dataout = OMAP4_GPIO_SETDATAOUT;
86 pdata->regs->clr_dataout = OMAP4_GPIO_CLEARDATAOUT;
71 break; 87 break;
72 default: 88 default:
73 WARN(1, "Invalid gpio bank_type\n"); 89 WARN(1, "Invalid gpio bank_type\n");
diff --git a/arch/arm/plat-omap/include/plat/gpio.h b/arch/arm/plat-omap/include/plat/gpio.h
index ec97e00cb581..268bccd0f7f6 100644
--- a/arch/arm/plat-omap/include/plat/gpio.h
+++ b/arch/arm/plat-omap/include/plat/gpio.h
@@ -174,12 +174,22 @@ struct omap_gpio_dev_attr {
174 bool dbck_flag; /* dbck required or not - True for OMAP3&4 */ 174 bool dbck_flag; /* dbck required or not - True for OMAP3&4 */
175}; 175};
176 176
177struct omap_gpio_reg_offs {
178 u16 direction;
179 u16 datain;
180 u16 dataout;
181 u16 set_dataout;
182 u16 clr_dataout;
183};
184
177struct omap_gpio_platform_data { 185struct omap_gpio_platform_data {
178 u16 virtual_irq_start; 186 u16 virtual_irq_start;
179 int bank_type; 187 int bank_type;
180 int bank_width; /* GPIO bank width */ 188 int bank_width; /* GPIO bank width */
181 int bank_stride; /* Only needed for omap1 MPUIO */ 189 int bank_stride; /* Only needed for omap1 MPUIO */
182 bool dbck_flag; /* dbck required or not - True for OMAP3&4 */ 190 bool dbck_flag; /* dbck required or not - True for OMAP3&4 */
191
192 struct omap_gpio_reg_offs *regs;
183}; 193};
184 194
185/* TODO: Analyze removing gpio_bank_count usage from driver code */ 195/* TODO: Analyze removing gpio_bank_count usage from driver code */
diff --git a/drivers/gpio/gpio-omap.c b/drivers/gpio/gpio-omap.c
index 25a7ee6bddb0..945642143e1b 100644
--- a/drivers/gpio/gpio-omap.c
+++ b/drivers/gpio/gpio-omap.c
@@ -55,6 +55,10 @@ struct gpio_bank {
55 bool dbck_flag; 55 bool dbck_flag;
56 int stride; 56 int stride;
57 u32 width; 57 u32 width;
58
59 void (*set_dataout)(struct gpio_bank *bank, int gpio, int enable);
60
61 struct omap_gpio_reg_offs *regs;
58}; 62};
59 63
60#ifdef CONFIG_ARCH_OMAP3 64#ifdef CONFIG_ARCH_OMAP3
@@ -125,41 +129,7 @@ static void _set_gpio_direction(struct gpio_bank *bank, int gpio, int is_input)
125 void __iomem *reg = bank->base; 129 void __iomem *reg = bank->base;
126 u32 l; 130 u32 l;
127 131
128 switch (bank->method) { 132 reg += bank->regs->direction;
129#ifdef CONFIG_ARCH_OMAP1
130 case METHOD_MPUIO:
131 reg += OMAP_MPUIO_IO_CNTL / bank->stride;
132 break;
133#endif
134#ifdef CONFIG_ARCH_OMAP15XX
135 case METHOD_GPIO_1510:
136 reg += OMAP1510_GPIO_DIR_CONTROL;
137 break;
138#endif
139#ifdef CONFIG_ARCH_OMAP16XX
140 case METHOD_GPIO_1610:
141 reg += OMAP1610_GPIO_DIRECTION;
142 break;
143#endif
144#if defined(CONFIG_ARCH_OMAP730) || defined(CONFIG_ARCH_OMAP850)
145 case METHOD_GPIO_7XX:
146 reg += OMAP7XX_GPIO_DIR_CONTROL;
147 break;
148#endif
149#if defined(CONFIG_ARCH_OMAP2) || defined(CONFIG_ARCH_OMAP3)
150 case METHOD_GPIO_24XX:
151 reg += OMAP24XX_GPIO_OE;
152 break;
153#endif
154#if defined(CONFIG_ARCH_OMAP4)
155 case METHOD_GPIO_44XX:
156 reg += OMAP4_GPIO_OE;
157 break;
158#endif
159 default:
160 WARN_ON(1);
161 return;
162 }
163 l = __raw_readl(reg); 133 l = __raw_readl(reg);
164 if (is_input) 134 if (is_input)
165 l |= 1 << gpio; 135 l |= 1 << gpio;
@@ -168,163 +138,52 @@ static void _set_gpio_direction(struct gpio_bank *bank, int gpio, int is_input)
168 __raw_writel(l, reg); 138 __raw_writel(l, reg);
169} 139}
170 140
171static void _set_gpio_dataout(struct gpio_bank *bank, int gpio, int enable) 141
142/* set data out value using dedicate set/clear register */
143static void _set_gpio_dataout_reg(struct gpio_bank *bank, int gpio, int enable)
172{ 144{
173 void __iomem *reg = bank->base; 145 void __iomem *reg = bank->base;
174 u32 l = 0; 146 u32 l = GPIO_BIT(bank, gpio);
175 147
176 switch (bank->method) { 148 if (enable)
177#ifdef CONFIG_ARCH_OMAP1 149 reg += bank->regs->set_dataout;
178 case METHOD_MPUIO: 150 else
179 reg += OMAP_MPUIO_OUTPUT / bank->stride; 151 reg += bank->regs->clr_dataout;
180 l = __raw_readl(reg); 152
181 if (enable) 153 __raw_writel(l, reg);
182 l |= 1 << gpio; 154}
183 else 155
184 l &= ~(1 << gpio); 156/* set data out value using mask register */
185 break; 157static void _set_gpio_dataout_mask(struct gpio_bank *bank, int gpio, int enable)
186#endif 158{
187#ifdef CONFIG_ARCH_OMAP15XX 159 void __iomem *reg = bank->base + bank->regs->dataout;
188 case METHOD_GPIO_1510: 160 u32 gpio_bit = GPIO_BIT(bank, gpio);
189 reg += OMAP1510_GPIO_DATA_OUTPUT; 161 u32 l;
190 l = __raw_readl(reg); 162
191 if (enable) 163 l = __raw_readl(reg);
192 l |= 1 << gpio; 164 if (enable)
193 else 165 l |= gpio_bit;
194 l &= ~(1 << gpio); 166 else
195 break; 167 l &= ~gpio_bit;
196#endif
197#ifdef CONFIG_ARCH_OMAP16XX
198 case METHOD_GPIO_1610:
199 if (enable)
200 reg += OMAP1610_GPIO_SET_DATAOUT;
201 else
202 reg += OMAP1610_GPIO_CLEAR_DATAOUT;
203 l = 1 << gpio;
204 break;
205#endif
206#if defined(CONFIG_ARCH_OMAP730) || defined(CONFIG_ARCH_OMAP850)
207 case METHOD_GPIO_7XX:
208 reg += OMAP7XX_GPIO_DATA_OUTPUT;
209 l = __raw_readl(reg);
210 if (enable)
211 l |= 1 << gpio;
212 else
213 l &= ~(1 << gpio);
214 break;
215#endif
216#if defined(CONFIG_ARCH_OMAP2) || defined(CONFIG_ARCH_OMAP3)
217 case METHOD_GPIO_24XX:
218 if (enable)
219 reg += OMAP24XX_GPIO_SETDATAOUT;
220 else
221 reg += OMAP24XX_GPIO_CLEARDATAOUT;
222 l = 1 << gpio;
223 break;
224#endif
225#ifdef CONFIG_ARCH_OMAP4
226 case METHOD_GPIO_44XX:
227 if (enable)
228 reg += OMAP4_GPIO_SETDATAOUT;
229 else
230 reg += OMAP4_GPIO_CLEARDATAOUT;
231 l = 1 << gpio;
232 break;
233#endif
234 default:
235 WARN_ON(1);
236 return;
237 }
238 __raw_writel(l, reg); 168 __raw_writel(l, reg);
239} 169}
240 170
241static int _get_gpio_datain(struct gpio_bank *bank, int gpio) 171static int _get_gpio_datain(struct gpio_bank *bank, int gpio)
242{ 172{
243 void __iomem *reg; 173 void __iomem *reg = bank->base + bank->regs->datain;
244 174
245 if (check_gpio(gpio) < 0) 175 if (check_gpio(gpio) < 0)
246 return -EINVAL; 176 return -EINVAL;
247 reg = bank->base; 177
248 switch (bank->method) { 178 return (__raw_readl(reg) & GPIO_BIT(bank, gpio)) != 0;
249#ifdef CONFIG_ARCH_OMAP1
250 case METHOD_MPUIO:
251 reg += OMAP_MPUIO_INPUT_LATCH / bank->stride;
252 break;
253#endif
254#ifdef CONFIG_ARCH_OMAP15XX
255 case METHOD_GPIO_1510:
256 reg += OMAP1510_GPIO_DATA_INPUT;
257 break;
258#endif
259#ifdef CONFIG_ARCH_OMAP16XX
260 case METHOD_GPIO_1610:
261 reg += OMAP1610_GPIO_DATAIN;
262 break;
263#endif
264#if defined(CONFIG_ARCH_OMAP730) || defined(CONFIG_ARCH_OMAP850)
265 case METHOD_GPIO_7XX:
266 reg += OMAP7XX_GPIO_DATA_INPUT;
267 break;
268#endif
269#if defined(CONFIG_ARCH_OMAP2) || defined(CONFIG_ARCH_OMAP3)
270 case METHOD_GPIO_24XX:
271 reg += OMAP24XX_GPIO_DATAIN;
272 break;
273#endif
274#ifdef CONFIG_ARCH_OMAP4
275 case METHOD_GPIO_44XX:
276 reg += OMAP4_GPIO_DATAIN;
277 break;
278#endif
279 default:
280 return -EINVAL;
281 }
282 return (__raw_readl(reg)
283 & (GPIO_BIT(bank, gpio))) != 0;
284} 179}
285 180
286static int _get_gpio_dataout(struct gpio_bank *bank, int gpio) 181static int _get_gpio_dataout(struct gpio_bank *bank, int gpio)
287{ 182{
288 void __iomem *reg; 183 void __iomem *reg = bank->base + bank->regs->dataout;
289 184
290 if (check_gpio(gpio) < 0) 185 if (check_gpio(gpio) < 0)
291 return -EINVAL; 186 return -EINVAL;
292 reg = bank->base;
293
294 switch (bank->method) {
295#ifdef CONFIG_ARCH_OMAP1
296 case METHOD_MPUIO:
297 reg += OMAP_MPUIO_OUTPUT / bank->stride;
298 break;
299#endif
300#ifdef CONFIG_ARCH_OMAP15XX
301 case METHOD_GPIO_1510:
302 reg += OMAP1510_GPIO_DATA_OUTPUT;
303 break;
304#endif
305#ifdef CONFIG_ARCH_OMAP16XX
306 case METHOD_GPIO_1610:
307 reg += OMAP1610_GPIO_DATAOUT;
308 break;
309#endif
310#if defined(CONFIG_ARCH_OMAP730) || defined(CONFIG_ARCH_OMAP850)
311 case METHOD_GPIO_7XX:
312 reg += OMAP7XX_GPIO_DATA_OUTPUT;
313 break;
314#endif
315#if defined(CONFIG_ARCH_OMAP2) || defined(CONFIG_ARCH_OMAP3)
316 case METHOD_GPIO_24XX:
317 reg += OMAP24XX_GPIO_DATAOUT;
318 break;
319#endif
320#ifdef CONFIG_ARCH_OMAP4
321 case METHOD_GPIO_44XX:
322 reg += OMAP4_GPIO_DATAOUT;
323 break;
324#endif
325 default:
326 return -EINVAL;
327 }
328 187
329 return (__raw_readl(reg) & GPIO_BIT(bank, gpio)) != 0; 188 return (__raw_readl(reg) & GPIO_BIT(bank, gpio)) != 0;
330} 189}
@@ -1281,31 +1140,8 @@ static int gpio_input(struct gpio_chip *chip, unsigned offset)
1281 1140
1282static int gpio_is_input(struct gpio_bank *bank, int mask) 1141static int gpio_is_input(struct gpio_bank *bank, int mask)
1283{ 1142{
1284 void __iomem *reg = bank->base; 1143 void __iomem *reg = bank->base + bank->regs->direction;
1285 1144
1286 switch (bank->method) {
1287 case METHOD_MPUIO:
1288 reg += OMAP_MPUIO_IO_CNTL / bank->stride;
1289 break;
1290 case METHOD_GPIO_1510:
1291 reg += OMAP1510_GPIO_DIR_CONTROL;
1292 break;
1293 case METHOD_GPIO_1610:
1294 reg += OMAP1610_GPIO_DIRECTION;
1295 break;
1296 case METHOD_GPIO_7XX:
1297 reg += OMAP7XX_GPIO_DIR_CONTROL;
1298 break;
1299 case METHOD_GPIO_24XX:
1300 reg += OMAP24XX_GPIO_OE;
1301 break;
1302 case METHOD_GPIO_44XX:
1303 reg += OMAP4_GPIO_OE;
1304 break;
1305 default:
1306 WARN_ONCE(1, "gpio_is_input: incorrect OMAP GPIO method");
1307 return -EINVAL;
1308 }
1309 return __raw_readl(reg) & mask; 1145 return __raw_readl(reg) & mask;
1310} 1146}
1311 1147
@@ -1334,7 +1170,7 @@ static int gpio_output(struct gpio_chip *chip, unsigned offset, int value)
1334 1170
1335 bank = container_of(chip, struct gpio_bank, chip); 1171 bank = container_of(chip, struct gpio_bank, chip);
1336 spin_lock_irqsave(&bank->lock, flags); 1172 spin_lock_irqsave(&bank->lock, flags);
1337 _set_gpio_dataout(bank, offset, value); 1173 bank->set_dataout(bank, offset, value);
1338 _set_gpio_direction(bank, offset, 0); 1174 _set_gpio_direction(bank, offset, 0);
1339 spin_unlock_irqrestore(&bank->lock, flags); 1175 spin_unlock_irqrestore(&bank->lock, flags);
1340 return 0; 1176 return 0;
@@ -1368,7 +1204,7 @@ static void gpio_set(struct gpio_chip *chip, unsigned offset, int value)
1368 1204
1369 bank = container_of(chip, struct gpio_bank, chip); 1205 bank = container_of(chip, struct gpio_bank, chip);
1370 spin_lock_irqsave(&bank->lock, flags); 1206 spin_lock_irqsave(&bank->lock, flags);
1371 _set_gpio_dataout(bank, offset, value); 1207 bank->set_dataout(bank, offset, value);
1372 spin_unlock_irqrestore(&bank->lock, flags); 1208 spin_unlock_irqrestore(&bank->lock, flags);
1373} 1209}
1374 1210
@@ -1564,6 +1400,13 @@ static int __devinit omap_gpio_probe(struct platform_device *pdev)
1564 bank->stride = pdata->bank_stride; 1400 bank->stride = pdata->bank_stride;
1565 bank->width = pdata->bank_width; 1401 bank->width = pdata->bank_width;
1566 1402
1403 bank->regs = pdata->regs;
1404
1405 if (bank->regs->set_dataout && bank->regs->clr_dataout)
1406 bank->set_dataout = _set_gpio_dataout_reg;
1407 else
1408 bank->set_dataout = _set_gpio_dataout_mask;
1409
1567 spin_lock_init(&bank->lock); 1410 spin_lock_init(&bank->lock);
1568 1411
1569 /* Static mapping, never released */ 1412 /* Static mapping, never released */