linux/drivers/gpio/gpiolib-of.c
<<
>>
Prefs
   1/*
   2 * OF helpers for the GPIO API
   3 *
   4 * Copyright (c) 2007-2008  MontaVista Software, Inc.
   5 *
   6 * Author: Anton Vorontsov <avorontsov@ru.mvista.com>
   7 *
   8 * This program is free software; you can redistribute it and/or modify
   9 * it under the terms of the GNU General Public License as published by
  10 * the Free Software Foundation; either version 2 of the License, or
  11 * (at your option) any later version.
  12 */
  13
  14#include <linux/device.h>
  15#include <linux/errno.h>
  16#include <linux/module.h>
  17#include <linux/io.h>
  18#include <linux/gpio.h>
  19#include <linux/of.h>
  20#include <linux/of_address.h>
  21#include <linux/of_gpio.h>
  22#include <linux/slab.h>
  23
  24/* Private data structure for of_gpiochip_find_and_xlate */
  25struct gg_data {
  26        enum of_gpio_flags *flags;
  27        struct of_phandle_args gpiospec;
  28
  29        int out_gpio;
  30};
  31
  32/* Private function for resolving node pointer to gpio_chip */
  33static int of_gpiochip_find_and_xlate(struct gpio_chip *gc, void *data)
  34{
  35        struct gg_data *gg_data = data;
  36        int ret;
  37
  38        if ((gc->of_node != gg_data->gpiospec.np) ||
  39            (gc->of_gpio_n_cells != gg_data->gpiospec.args_count) ||
  40            (!gc->of_xlate))
  41                return false;
  42
  43        ret = gc->of_xlate(gc, &gg_data->gpiospec, gg_data->flags);
  44        if (ret < 0)
  45                return false;
  46
  47        gg_data->out_gpio = ret + gc->base;
  48        return true;
  49}
  50
  51/**
  52 * of_get_named_gpio_flags() - Get a GPIO number and flags to use with GPIO API
  53 * @np:         device node to get GPIO from
  54 * @propname:   property name containing gpio specifier(s)
  55 * @index:      index of the GPIO
  56 * @flags:      a flags pointer to fill in
  57 *
  58 * Returns GPIO number to use with Linux generic GPIO API, or one of the errno
  59 * value on the error condition. If @flags is not NULL the function also fills
  60 * in flags for the GPIO.
  61 */
  62int of_get_named_gpio_flags(struct device_node *np, const char *propname,
  63                           int index, enum of_gpio_flags *flags)
  64{
  65        /* Return -EPROBE_DEFER to support probe() functions to be called
  66         * later when the GPIO actually becomes available
  67         */
  68        struct gg_data gg_data = { .flags = flags, .out_gpio = -EPROBE_DEFER };
  69        int ret;
  70
  71        /* .of_xlate might decide to not fill in the flags, so clear it. */
  72        if (flags)
  73                *flags = 0;
  74
  75        ret = of_parse_phandle_with_args(np, propname, "#gpio-cells", index,
  76                                         &gg_data.gpiospec);
  77        if (ret) {
  78                pr_debug("%s: can't parse gpios property\n", __func__);
  79                return ret;
  80        }
  81
  82        gpiochip_find(&gg_data, of_gpiochip_find_and_xlate);
  83
  84        of_node_put(gg_data.gpiospec.np);
  85        pr_debug("%s exited with status %d\n", __func__, gg_data.out_gpio);
  86        return gg_data.out_gpio;
  87}
  88EXPORT_SYMBOL(of_get_named_gpio_flags);
  89
  90/**
  91 * of_gpio_named_count - Count GPIOs for a device
  92 * @np:         device node to count GPIOs for
  93 * @propname:   property name containing gpio specifier(s)
  94 *
  95 * The function returns the count of GPIOs specified for a node.
  96 *
  97 * Note that the empty GPIO specifiers counts too. For example,
  98 *
  99 * gpios = <0
 100 *          &pio1 1 2
 101 *          0
 102 *          &pio2 3 4>;
 103 *
 104 * defines four GPIOs (so this function will return 4), two of which
 105 * are not specified.
 106 */
 107unsigned int of_gpio_named_count(struct device_node *np, const char* propname)
 108{
 109        unsigned int cnt = 0;
 110
 111        do {
 112                int ret;
 113
 114                ret = of_parse_phandle_with_args(np, propname, "#gpio-cells",
 115                                                 cnt, NULL);
 116                /* A hole in the gpios = <> counts anyway. */
 117                if (ret < 0 && ret != -EEXIST)
 118                        break;
 119        } while (++cnt);
 120
 121        return cnt;
 122}
 123EXPORT_SYMBOL(of_gpio_named_count);
 124
 125/**
 126 * of_gpio_simple_xlate - translate gpio_spec to the GPIO number and flags
 127 * @gc:         pointer to the gpio_chip structure
 128 * @np:         device node of the GPIO chip
 129 * @gpio_spec:  gpio specifier as found in the device tree
 130 * @flags:      a flags pointer to fill in
 131 *
 132 * This is simple translation function, suitable for the most 1:1 mapped
 133 * gpio chips. This function performs only one sanity check: whether gpio
 134 * is less than ngpios (that is specified in the gpio_chip).
 135 */
 136int of_gpio_simple_xlate(struct gpio_chip *gc,
 137                         const struct of_phandle_args *gpiospec, u32 *flags)
 138{
 139        /*
 140         * We're discouraging gpio_cells < 2, since that way you'll have to
 141         * write your own xlate function (that will have to retrive the GPIO
 142         * number and the flags from a single gpio cell -- this is possible,
 143         * but not recommended).
 144         */
 145        if (gc->of_gpio_n_cells < 2) {
 146                WARN_ON(1);
 147                return -EINVAL;
 148        }
 149
 150        if (WARN_ON(gpiospec->args_count < gc->of_gpio_n_cells))
 151                return -EINVAL;
 152
 153        if (gpiospec->args[0] >= gc->ngpio)
 154                return -EINVAL;
 155
 156        if (flags)
 157                *flags = gpiospec->args[1];
 158
 159        return gpiospec->args[0];
 160}
 161EXPORT_SYMBOL(of_gpio_simple_xlate);
 162
 163/**
 164 * of_mm_gpiochip_add - Add memory mapped GPIO chip (bank)
 165 * @np:         device node of the GPIO chip
 166 * @mm_gc:      pointer to the of_mm_gpio_chip allocated structure
 167 *
 168 * To use this function you should allocate and fill mm_gc with:
 169 *
 170 * 1) In the gpio_chip structure:
 171 *    - all the callbacks
 172 *    - of_gpio_n_cells
 173 *    - of_xlate callback (optional)
 174 *
 175 * 3) In the of_mm_gpio_chip structure:
 176 *    - save_regs callback (optional)
 177 *
 178 * If succeeded, this function will map bank's memory and will
 179 * do all necessary work for you. Then you'll able to use .regs
 180 * to manage GPIOs from the callbacks.
 181 */
 182int of_mm_gpiochip_add(struct device_node *np,
 183                       struct of_mm_gpio_chip *mm_gc)
 184{
 185        int ret = -ENOMEM;
 186        struct gpio_chip *gc = &mm_gc->gc;
 187
 188        gc->label = kstrdup(np->full_name, GFP_KERNEL);
 189        if (!gc->label)
 190                goto err0;
 191
 192        mm_gc->regs = of_iomap(np, 0);
 193        if (!mm_gc->regs)
 194                goto err1;
 195
 196        gc->base = -1;
 197
 198        if (mm_gc->save_regs)
 199                mm_gc->save_regs(mm_gc);
 200
 201        mm_gc->gc.of_node = np;
 202
 203        ret = gpiochip_add(gc);
 204        if (ret)
 205                goto err2;
 206
 207        return 0;
 208err2:
 209        iounmap(mm_gc->regs);
 210err1:
 211        kfree(gc->label);
 212err0:
 213        pr_err("%s: GPIO chip registration failed with status %d\n",
 214               np->full_name, ret);
 215        return ret;
 216}
 217EXPORT_SYMBOL(of_mm_gpiochip_add);
 218
 219void of_gpiochip_add(struct gpio_chip *chip)
 220{
 221        if ((!chip->of_node) && (chip->dev))
 222                chip->of_node = chip->dev->of_node;
 223
 224        if (!chip->of_node)
 225                return;
 226
 227        if (!chip->of_xlate) {
 228                chip->of_gpio_n_cells = 2;
 229                chip->of_xlate = of_gpio_simple_xlate;
 230        }
 231
 232        of_node_get(chip->of_node);
 233}
 234
 235void of_gpiochip_remove(struct gpio_chip *chip)
 236{
 237        if (chip->of_node)
 238                of_node_put(chip->of_node);
 239}
 240
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.