Signed-off-by: Bill Gatliff <b...@billgatliff.com> --- drivers/of/gpio.c | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 55 insertions(+), 0 deletions(-)
diff --git a/drivers/of/gpio.c b/drivers/of/gpio.c index 6eea601..56b438a 100644 --- a/drivers/of/gpio.c +++ b/drivers/of/gpio.c @@ -217,3 +217,58 @@ err0: return ret; } EXPORT_SYMBOL(of_mm_gpiochip_add); + +/** + * of_i2c_gpiochip_add - Add memory I2C-based GPIO chip + * @np: device node of the GPIO chip + * @gc: pointer to the of_i2c_gpio_chip allocated structure + * + * To use this function you should allocate and fill gc with: + * + * 1) In the gpio_chip structure: + * - all the callbacks + * + * 2) In the of_gpio_chip structure: + * - gpio_cells + * - xlate callback (optional) + * + * If succeeded, this function will do something useful... + */ +int of_i2c_gpiochip_add(struct device_node *np, + struct of_i2c_gpio_chip *i2c_gc) +{ + int ret = -ENOMEM; + struct of_gpio_chip *of_gc = &i2c_gc->of_gc; + struct gpio_chip *gc = &of_gc->gc; + + gc->label = kstrdup(np->full_name, GFP_KERNEL); + if (!gc->label) + goto err0; + + gc->base = -1; + + if (!of_gc->xlate) + of_gc->xlate = of_gpio_simple_xlate; + + np->data = of_gc; + + ret = gpiochip_add(gc); + if (ret) + goto err2; + + /* We don't want to lose the node and its ->data */ + of_node_get(np); + + pr_debug("%s: registered as generic GPIO chip, base is %d\n", + np->full_name, gc->base); + return 0; +err2: + np->data = NULL; +err1: + kfree(gc->label); +err0: + pr_err("%s: GPIO chip registration failed with status %d\n", + np->full_name, ret); + return ret; +} +EXPORT_SYMBOL(of_i2c_gpiochip_add); -- 1.6.5 _______________________________________________ Linuxppc-dev mailing list Linuxppc-dev@lists.ozlabs.org https://lists.ozlabs.org/listinfo/linuxppc-dev