gpiolib-of.c 12.8 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13
/*
 * OF helpers for the GPIO API
 *
 * Copyright (c) 2007-2008  MontaVista Software, Inc.
 *
 * Author: Anton Vorontsov <avorontsov@ru.mvista.com>
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 */

G
Grant Likely 已提交
14
#include <linux/device.h>
15
#include <linux/err.h>
16
#include <linux/errno.h>
G
Grant Likely 已提交
17
#include <linux/module.h>
18
#include <linux/io.h>
19
#include <linux/gpio/consumer.h>
20
#include <linux/of.h>
G
Grant Likely 已提交
21
#include <linux/of_address.h>
22
#include <linux/of_gpio.h>
23
#include <linux/pinctrl/pinctrl.h>
G
Grant Likely 已提交
24
#include <linux/slab.h>
B
Benoit Parrot 已提交
25
#include <linux/gpio/machine.h>
26

27
#include "gpiolib.h"
28

29
static int of_gpiochip_match_node(struct gpio_chip *chip, void *data)
30
{
31 32
	return chip->gpiodev->dev.of_node == data;
}
33

34 35 36
static struct gpio_chip *of_find_gpiochip_by_node(struct device_node *np)
{
	return gpiochip_find(np, of_gpiochip_match_node);
37 38
}

39 40 41
static struct gpio_desc *of_xlate_and_get_gpiod_flags(struct gpio_chip *chip,
					struct of_phandle_args *gpiospec,
					enum of_gpio_flags *flags)
42 43 44
{
	int ret;

45 46 47 48 49 50 51 52
	if (chip->of_gpio_n_cells != gpiospec->args_count)
		return ERR_PTR(-EINVAL);

	ret = chip->of_xlate(chip, gpiospec, flags);
	if (ret < 0)
		return ERR_PTR(ret);

	return gpiochip_get_desc(chip, ret);
53 54
}

55
/**
56
 * of_get_named_gpiod_flags() - Get a GPIO descriptor and flags for GPIO API
57
 * @np:		device node to get GPIO from
58
 * @propname:	property name containing gpio specifier(s)
59
 * @index:	index of the GPIO
60
 * @flags:	a flags pointer to fill in
61
 *
62
 * Returns GPIO descriptor to use with Linux GPIO API, or one of the errno
63 64
 * value on the error condition. If @flags is not NULL the function also fills
 * in flags for the GPIO.
65
 */
66 67
struct gpio_desc *of_get_named_gpiod_flags(struct device_node *np,
		     const char *propname, int index, enum of_gpio_flags *flags)
68
{
69 70 71
	struct of_phandle_args gpiospec;
	struct gpio_chip *chip;
	struct gpio_desc *desc;
72
	int ret;
73

74
	ret = of_parse_phandle_with_args(np, propname, "#gpio-cells", index,
75
					 &gpiospec);
76
	if (ret) {
77 78
		pr_debug("%s: can't parse '%s' property of node '%s[%d]'\n",
			__func__, propname, np->full_name, index);
79
		return ERR_PTR(ret);
80 81
	}

82 83 84 85 86 87
	chip = of_find_gpiochip_by_node(gpiospec.np);
	if (!chip) {
		desc = ERR_PTR(-EPROBE_DEFER);
		goto out;
	}

88
	desc = of_xlate_and_get_gpiod_flags(chip, &gpiospec, flags);
89 90
	if (IS_ERR(desc))
		goto out;
91

92 93
	pr_debug("%s: parsed '%s' property of node '%s[%d]' - status (%d)\n",
		 __func__, propname, np->full_name, index,
94 95 96 97 98 99
		 PTR_ERR_OR_ZERO(desc));

out:
	of_node_put(gpiospec.np);

	return desc;
100 101
}

102 103 104 105 106 107 108 109 110 111 112 113 114 115
int of_get_named_gpio_flags(struct device_node *np, const char *list_name,
			    int index, enum of_gpio_flags *flags)
{
	struct gpio_desc *desc;

	desc = of_get_named_gpiod_flags(np, list_name, index, flags);

	if (IS_ERR(desc))
		return PTR_ERR(desc);
	else
		return desc_to_gpio(desc);
}
EXPORT_SYMBOL(of_get_named_gpio_flags);

L
Linus Walleij 已提交
116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154
struct gpio_desc *of_find_gpio(struct device *dev, const char *con_id,
			       unsigned int idx,
			       enum gpio_lookup_flags *flags)
{
	char prop_name[32]; /* 32 is max size of property name */
	enum of_gpio_flags of_flags;
	struct gpio_desc *desc;
	unsigned int i;

	for (i = 0; i < ARRAY_SIZE(gpio_suffixes); i++) {
		if (con_id)
			snprintf(prop_name, sizeof(prop_name), "%s-%s", con_id,
				 gpio_suffixes[i]);
		else
			snprintf(prop_name, sizeof(prop_name), "%s",
				 gpio_suffixes[i]);

		desc = of_get_named_gpiod_flags(dev->of_node, prop_name, idx,
						&of_flags);
		if (!IS_ERR(desc) || (PTR_ERR(desc) != -ENOENT))
			break;
	}

	if (IS_ERR(desc))
		return desc;

	if (of_flags & OF_GPIO_ACTIVE_LOW)
		*flags |= GPIO_ACTIVE_LOW;

	if (of_flags & OF_GPIO_SINGLE_ENDED) {
		if (of_flags & OF_GPIO_ACTIVE_LOW)
			*flags |= GPIO_OPEN_DRAIN;
		else
			*flags |= GPIO_OPEN_SOURCE;
	}

	return desc;
}

B
Benoit Parrot 已提交
155
/**
156
 * of_parse_own_gpio() - Get a GPIO hog descriptor, names and flags for GPIO API
B
Benoit Parrot 已提交
157
 * @np:		device node to get GPIO from
158
 * @chip:	GPIO chip whose hog is parsed
B
Benoit Parrot 已提交
159 160
 * @name:	GPIO line name
 * @lflags:	gpio_lookup_flags - returned from of_find_gpio() or
161
 *		of_parse_own_gpio()
B
Benoit Parrot 已提交
162 163 164 165 166
 * @dflags:	gpiod_flags - optional GPIO initialization flags
 *
 * Returns GPIO descriptor to use with Linux GPIO API, or one of the errno
 * value on the error condition.
 */
167
static struct gpio_desc *of_parse_own_gpio(struct device_node *np,
168
					   struct gpio_chip *chip,
169 170 171
					   const char **name,
					   enum gpio_lookup_flags *lflags,
					   enum gpiod_flags *dflags)
B
Benoit Parrot 已提交
172 173 174
{
	struct device_node *chip_np;
	enum of_gpio_flags xlate_flags;
175 176
	struct of_phandle_args gpiospec;
	struct gpio_desc *desc;
B
Benoit Parrot 已提交
177
	u32 tmp;
178
	int ret;
B
Benoit Parrot 已提交
179

180
	chip_np = chip->of_node;
B
Benoit Parrot 已提交
181 182 183 184 185 186 187 188 189 190 191
	if (!chip_np)
		return ERR_PTR(-EINVAL);

	xlate_flags = 0;
	*lflags = 0;
	*dflags = 0;

	ret = of_property_read_u32(chip_np, "#gpio-cells", &tmp);
	if (ret)
		return ERR_PTR(ret);

192 193
	gpiospec.np = chip_np;
	gpiospec.args_count = tmp;
B
Benoit Parrot 已提交
194

195
	ret = of_property_read_u32_array(np, "gpios", gpiospec.args, tmp);
196 197
	if (ret)
		return ERR_PTR(ret);
B
Benoit Parrot 已提交
198

199
	desc = of_xlate_and_get_gpiod_flags(chip, &gpiospec, &xlate_flags);
200 201
	if (IS_ERR(desc))
		return desc;
B
Benoit Parrot 已提交
202 203 204 205 206 207 208 209 210 211 212 213

	if (xlate_flags & OF_GPIO_ACTIVE_LOW)
		*lflags |= GPIO_ACTIVE_LOW;

	if (of_property_read_bool(np, "input"))
		*dflags |= GPIOD_IN;
	else if (of_property_read_bool(np, "output-low"))
		*dflags |= GPIOD_OUT_LOW;
	else if (of_property_read_bool(np, "output-high"))
		*dflags |= GPIOD_OUT_HIGH;
	else {
		pr_warn("GPIO line %d (%s): no hogging state specified, bailing out\n",
214
			desc_to_gpio(desc), np->name);
B
Benoit Parrot 已提交
215 216 217 218 219 220
		return ERR_PTR(-EINVAL);
	}

	if (name && of_property_read_string(np, "line-name", name))
		*name = np->name;

221
	return desc;
B
Benoit Parrot 已提交
222 223
}

224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268
/**
 * of_gpiochip_set_names() - set up the names of the lines
 * @chip: GPIO chip whose lines should be named, if possible
 */
static void of_gpiochip_set_names(struct gpio_chip *gc)
{
	struct gpio_device *gdev = gc->gpiodev;
	struct device_node *np = gc->of_node;
	int i;
	int nstrings;

	nstrings = of_property_count_strings(np, "gpio-line-names");
	if (nstrings <= 0)
		/* Lines names not present */
		return;

	/* This is normally not what you want */
	if (gdev->ngpio != nstrings)
		dev_info(&gdev->dev, "gpio-line-names specifies %d line "
			 "names but there are %d lines on the chip\n",
			 nstrings, gdev->ngpio);

	/*
	 * Make sure to not index beyond the end of the number of descriptors
	 * of the GPIO device.
	 */
	for (i = 0; i < gdev->ngpio; i++) {
		const char *name;
		int ret;

		ret = of_property_read_string_index(np,
						    "gpio-line-names",
						    i,
						    &name);
		if (ret) {
			if (ret != -ENODATA)
                                dev_err(&gdev->dev,
                                        "unable to name line %d: %d\n",
                                        i, ret);
			break;
		}
		gdev->descs[i].name = name;
	}
}

B
Benoit Parrot 已提交
269
/**
270
 * of_gpiochip_scan_gpios - Scan gpio-controller for gpio definitions
B
Benoit Parrot 已提交
271 272 273 274
 * @chip:	gpio chip to act on
 *
 * This is only used by of_gpiochip_add to request/set GPIO initial
 * configuration.
275
 * It retures error if it fails otherwise 0 on success.
B
Benoit Parrot 已提交
276
 */
277
static int of_gpiochip_scan_gpios(struct gpio_chip *chip)
B
Benoit Parrot 已提交
278 279 280 281 282 283
{
	struct gpio_desc *desc = NULL;
	struct device_node *np;
	const char *name;
	enum gpio_lookup_flags lflags;
	enum gpiod_flags dflags;
284
	int ret;
B
Benoit Parrot 已提交
285

286
	for_each_available_child_of_node(chip->of_node, np) {
B
Benoit Parrot 已提交
287 288 289
		if (!of_property_read_bool(np, "gpio-hog"))
			continue;

290
		desc = of_parse_own_gpio(np, chip, &name, &lflags, &dflags);
B
Benoit Parrot 已提交
291 292 293
		if (IS_ERR(desc))
			continue;

294 295 296
		ret = gpiod_hog(desc, name, lflags, dflags);
		if (ret < 0)
			return ret;
B
Benoit Parrot 已提交
297
	}
298 299

	return 0;
B
Benoit Parrot 已提交
300 301
}

302
/**
303
 * of_gpio_simple_xlate - translate gpio_spec to the GPIO number and flags
304
 * @gc:		pointer to the gpio_chip structure
305 306
 * @np:		device node of the GPIO chip
 * @gpio_spec:	gpio specifier as found in the device tree
307
 * @flags:	a flags pointer to fill in
308 309 310 311 312
 *
 * This is simple translation function, suitable for the most 1:1 mapped
 * gpio chips. This function performs only one sanity check: whether gpio
 * is less than ngpios (that is specified in the gpio_chip).
 */
313 314
int of_gpio_simple_xlate(struct gpio_chip *gc,
			 const struct of_phandle_args *gpiospec, u32 *flags)
315
{
316 317
	/*
	 * We're discouraging gpio_cells < 2, since that way you'll have to
318
	 * write your own xlate function (that will have to retrieve the GPIO
319 320 321
	 * number and the flags from a single gpio cell -- this is possible,
	 * but not recommended).
	 */
322
	if (gc->of_gpio_n_cells < 2) {
323 324 325 326
		WARN_ON(1);
		return -EINVAL;
	}

327 328 329
	if (WARN_ON(gpiospec->args_count < gc->of_gpio_n_cells))
		return -EINVAL;

330
	if (gpiospec->args[0] >= gc->ngpio)
331 332
		return -EINVAL;

333
	if (flags)
334
		*flags = gpiospec->args[1];
335

336
	return gpiospec->args[0];
337
}
338
EXPORT_SYMBOL(of_gpio_simple_xlate);
339 340

/**
341
 * of_mm_gpiochip_add_data - Add memory mapped GPIO chip (bank)
342 343
 * @np:		device node of the GPIO chip
 * @mm_gc:	pointer to the of_mm_gpio_chip allocated structure
344
 * @data:	driver data to store in the struct gpio_chip
345 346 347 348 349
 *
 * To use this function you should allocate and fill mm_gc with:
 *
 * 1) In the gpio_chip structure:
 *    - all the callbacks
350 351
 *    - of_gpio_n_cells
 *    - of_xlate callback (optional)
352 353 354 355 356 357 358 359
 *
 * 3) In the of_mm_gpio_chip structure:
 *    - save_regs callback (optional)
 *
 * If succeeded, this function will map bank's memory and will
 * do all necessary work for you. Then you'll able to use .regs
 * to manage GPIOs from the callbacks.
 */
360 361 362
int of_mm_gpiochip_add_data(struct device_node *np,
			    struct of_mm_gpio_chip *mm_gc,
			    void *data)
363 364
{
	int ret = -ENOMEM;
365
	struct gpio_chip *gc = &mm_gc->gc;
366 367 368 369 370 371 372 373 374

	gc->label = kstrdup(np->full_name, GFP_KERNEL);
	if (!gc->label)
		goto err0;

	mm_gc->regs = of_iomap(np, 0);
	if (!mm_gc->regs)
		goto err1;

375
	gc->base = -1;
376 377 378 379

	if (mm_gc->save_regs)
		mm_gc->save_regs(mm_gc);

380
	mm_gc->gc.of_node = np;
381

382
	ret = gpiochip_add_data(gc, data);
383 384 385 386 387 388 389 390 391 392 393 394 395
	if (ret)
		goto err2;

	return 0;
err2:
	iounmap(mm_gc->regs);
err1:
	kfree(gc->label);
err0:
	pr_err("%s: GPIO chip registration failed with status %d\n",
	       np->full_name, ret);
	return ret;
}
396
EXPORT_SYMBOL(of_mm_gpiochip_add_data);
397

398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414
/**
 * of_mm_gpiochip_remove - Remove memory mapped GPIO chip (bank)
 * @mm_gc:	pointer to the of_mm_gpio_chip allocated structure
 */
void of_mm_gpiochip_remove(struct of_mm_gpio_chip *mm_gc)
{
	struct gpio_chip *gc = &mm_gc->gc;

	if (!mm_gc)
		return;

	gpiochip_remove(gc);
	iounmap(mm_gc->regs);
	kfree(gc->label);
}
EXPORT_SYMBOL(of_mm_gpiochip_remove);

415
#ifdef CONFIG_PINCTRL
416
static int of_gpiochip_add_pin_range(struct gpio_chip *chip)
417 418 419
{
	struct device_node *np = chip->of_node;
	struct of_phandle_args pinspec;
420
	struct pinctrl_dev *pctldev;
421
	int index = 0, ret;
422 423 424
	const char *name;
	static const char group_names_propname[] = "gpio-ranges-group-names";
	struct property *group_names;
425 426

	if (!np)
427
		return 0;
428

429 430
	group_names = of_find_property(np, group_names_propname, NULL);

431
	for (;; index++) {
432 433
		ret = of_parse_phandle_with_fixed_args(np, "gpio-ranges", 3,
				index, &pinspec);
434 435 436
		if (ret)
			break;

437
		pctldev = of_pinctrl_get(pinspec.np);
438
		of_node_put(pinspec.np);
439
		if (!pctldev)
440
			return -EPROBE_DEFER;
441

442 443
		if (pinspec.args[2]) {
			if (group_names) {
444
				of_property_read_string_index(np,
445 446 447 448 449 450 451 452 453 454 455 456 457 458 459
						group_names_propname,
						index, &name);
				if (strlen(name)) {
					pr_err("%s: Group name of numeric GPIO ranges must be the empty string.\n",
						np->full_name);
					break;
				}
			}
			/* npins != 0: linear range */
			ret = gpiochip_add_pin_range(chip,
					pinctrl_dev_get_devname(pctldev),
					pinspec.args[0],
					pinspec.args[1],
					pinspec.args[2]);
			if (ret)
460
				return ret;
461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489
		} else {
			/* npins == 0: special range */
			if (pinspec.args[1]) {
				pr_err("%s: Illegal gpio-range format.\n",
					np->full_name);
				break;
			}

			if (!group_names) {
				pr_err("%s: GPIO group range requested but no %s property.\n",
					np->full_name, group_names_propname);
				break;
			}

			ret = of_property_read_string_index(np,
						group_names_propname,
						index, &name);
			if (ret)
				break;

			if (!strlen(name)) {
				pr_err("%s: Group name of GPIO group range cannot be the empty string.\n",
				np->full_name);
				break;
			}

			ret = gpiochip_add_pingroup_range(chip, pctldev,
						pinspec.args[0], name);
			if (ret)
490
				return ret;
491
		}
492
	}
493 494

	return 0;
495 496 497
}

#else
498
static int of_gpiochip_add_pin_range(struct gpio_chip *chip) { return 0; }
499 500
#endif

501
int of_gpiochip_add(struct gpio_chip *chip)
502
{
503 504
	int status;

505 506
	if ((!chip->of_node) && (chip->parent))
		chip->of_node = chip->parent->of_node;
507 508

	if (!chip->of_node)
509
		return 0;
510 511 512 513 514 515

	if (!chip->of_xlate) {
		chip->of_gpio_n_cells = 2;
		chip->of_xlate = of_gpio_simple_xlate;
	}

516 517 518
	if (chip->of_gpio_n_cells > MAX_PHANDLE_ARGS)
		return -EINVAL;

519 520 521 522
	status = of_gpiochip_add_pin_range(chip);
	if (status)
		return status;

523 524 525 526
	/* If the chip defines names itself, these take precedence */
	if (!chip->names)
		of_gpiochip_set_names(chip);

527
	of_node_get(chip->of_node);
B
Benoit Parrot 已提交
528

529
	return of_gpiochip_scan_gpios(chip);
530 531 532 533
}

void of_gpiochip_remove(struct gpio_chip *chip)
{
534
	gpiochip_remove_pin_ranges(chip);
535
	of_node_put(chip->of_node);
536
}