aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/of/gpio.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/of/gpio.c')
-rw-r--r--drivers/of/gpio.c15
1 files changed, 12 insertions, 3 deletions
diff --git a/drivers/of/gpio.c b/drivers/of/gpio.c
index fde53a3a45a3..c8618d3282cf 100644
--- a/drivers/of/gpio.c
+++ b/drivers/of/gpio.c
@@ -46,7 +46,7 @@ int of_get_gpio_flags(struct device_node *np, int index,
46 goto err0; 46 goto err0;
47 } 47 }
48 48
49 gc = gpio_np->data; 49 gc = of_node_to_gpiochip(gpio_np);
50 if (!gc) { 50 if (!gc) {
51 pr_debug("%s: gpio controller %s isn't registered\n", 51 pr_debug("%s: gpio controller %s isn't registered\n",
52 np->full_name, gpio_np->full_name); 52 np->full_name, gpio_np->full_name);
@@ -193,7 +193,6 @@ int of_mm_gpiochip_add(struct device_node *np,
193 if (mm_gc->save_regs) 193 if (mm_gc->save_regs)
194 mm_gc->save_regs(mm_gc); 194 mm_gc->save_regs(mm_gc);
195 195
196 np->data = &mm_gc->gc;
197 mm_gc->gc.of_node = np; 196 mm_gc->gc.of_node = np;
198 197
199 ret = gpiochip_add(gc); 198 ret = gpiochip_add(gc);
@@ -207,7 +206,6 @@ int of_mm_gpiochip_add(struct device_node *np,
207 np->full_name, gc->base); 206 np->full_name, gc->base);
208 return 0; 207 return 0;
209err2: 208err2:
210 np->data = NULL;
211 iounmap(mm_gc->regs); 209 iounmap(mm_gc->regs);
212err1: 210err1:
213 kfree(gc->label); 211 kfree(gc->label);
@@ -217,3 +215,14 @@ err0:
217 return ret; 215 return ret;
218} 216}
219EXPORT_SYMBOL(of_mm_gpiochip_add); 217EXPORT_SYMBOL(of_mm_gpiochip_add);
218
219/* Private function for resolving node pointer to gpio_chip */
220static int of_gpiochip_is_match(struct gpio_chip *chip, void *data)
221{
222 return chip->of_node == data;
223}
224
225struct gpio_chip *of_node_to_gpiochip(struct device_node *np)
226{
227 return gpiochip_find(np, of_gpiochip_is_match);
228}