gpiolib-of.c 12.0 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_and_xlate(struct gpio_chip *chip, void *data)
30
{
31 32 33 34
	struct of_phandle_args *gpiospec = data;

	return chip->gpiodev->dev.of_node == gpiospec->np &&
				chip->of_xlate(chip, gpiospec, NULL) >= 0;
35
}
36

37 38
static struct gpio_chip *of_find_gpiochip_by_xlate(
					struct of_phandle_args *gpiospec)
39
{
40
	return gpiochip_find(gpiospec, of_gpiochip_match_node_and_xlate);
41 42
}

43 44 45
static struct gpio_desc *of_xlate_and_get_gpiod_flags(struct gpio_chip *chip,
					struct of_phandle_args *gpiospec,
					enum of_gpio_flags *flags)
46 47 48
{
	int ret;

49 50 51 52 53 54 55 56
	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);
57 58
}

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

78
	ret = of_parse_phandle_with_args(np, propname, "#gpio-cells", index,
79
					 &gpiospec);
80
	if (ret) {
81 82
		pr_debug("%s: can't parse '%s' property of node '%pOF[%d]'\n",
			__func__, propname, np, index);
83
		return ERR_PTR(ret);
84 85
	}

86
	chip = of_find_gpiochip_by_xlate(&gpiospec);
87 88 89 90 91
	if (!chip) {
		desc = ERR_PTR(-EPROBE_DEFER);
		goto out;
	}

92
	desc = of_xlate_and_get_gpiod_flags(chip, &gpiospec, flags);
93 94
	if (IS_ERR(desc))
		goto out;
95

96 97
	pr_debug("%s: parsed '%s' property of node '%pOF[%d]' - status (%d)\n",
		 __func__, propname, np, index,
98 99 100 101 102 103
		 PTR_ERR_OR_ZERO(desc));

out:
	of_node_put(gpiospec.np);

	return desc;
104 105
}

106 107 108 109 110 111 112 113 114 115 116 117 118 119
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 已提交
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
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) {
150
		if (of_flags & OF_GPIO_OPEN_DRAIN)
L
Linus Walleij 已提交
151 152 153 154 155
			*flags |= GPIO_OPEN_DRAIN;
		else
			*flags |= GPIO_OPEN_SOURCE;
	}

A
Andrew Jeffery 已提交
156 157
	if (of_flags & OF_GPIO_SLEEP_MAY_LOSE_VALUE)
		*flags |= GPIO_SLEEP_MAY_LOSE_VALUE;
158

L
Linus Walleij 已提交
159 160 161
	return desc;
}

B
Benoit Parrot 已提交
162
/**
163
 * of_parse_own_gpio() - Get a GPIO hog descriptor, names and flags for GPIO API
B
Benoit Parrot 已提交
164
 * @np:		device node to get GPIO from
165
 * @chip:	GPIO chip whose hog is parsed
166
 * @idx:	Index of the GPIO to parse
B
Benoit Parrot 已提交
167 168
 * @name:	GPIO line name
 * @lflags:	gpio_lookup_flags - returned from of_find_gpio() or
169
 *		of_parse_own_gpio()
B
Benoit Parrot 已提交
170 171 172 173 174
 * @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.
 */
175
static struct gpio_desc *of_parse_own_gpio(struct device_node *np,
176
					   struct gpio_chip *chip,
177
					   unsigned int idx, const char **name,
178 179
					   enum gpio_lookup_flags *lflags,
					   enum gpiod_flags *dflags)
B
Benoit Parrot 已提交
180 181 182
{
	struct device_node *chip_np;
	enum of_gpio_flags xlate_flags;
183 184
	struct of_phandle_args gpiospec;
	struct gpio_desc *desc;
185
	unsigned int i;
B
Benoit Parrot 已提交
186
	u32 tmp;
187
	int ret;
B
Benoit Parrot 已提交
188

189
	chip_np = chip->of_node;
B
Benoit Parrot 已提交
190 191 192 193 194 195 196 197 198 199 200
	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);

201 202
	gpiospec.np = chip_np;
	gpiospec.args_count = tmp;
B
Benoit Parrot 已提交
203

204 205 206 207 208 209
	for (i = 0; i < tmp; i++) {
		ret = of_property_read_u32_index(np, "gpios", idx * tmp + i,
						 &gpiospec.args[i]);
		if (ret)
			return ERR_PTR(ret);
	}
B
Benoit Parrot 已提交
210

211
	desc = of_xlate_and_get_gpiod_flags(chip, &gpiospec, &xlate_flags);
212 213
	if (IS_ERR(desc))
		return desc;
B
Benoit Parrot 已提交
214 215 216 217 218 219 220 221 222 223 224 225

	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",
226
			desc_to_gpio(desc), np->name);
B
Benoit Parrot 已提交
227 228 229 230 231 232
		return ERR_PTR(-EINVAL);
	}

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

233
	return desc;
B
Benoit Parrot 已提交
234 235 236
}

/**
237
 * of_gpiochip_scan_gpios - Scan gpio-controller for gpio definitions
B
Benoit Parrot 已提交
238 239 240 241
 * @chip:	gpio chip to act on
 *
 * This is only used by of_gpiochip_add to request/set GPIO initial
 * configuration.
242
 * It returns error if it fails otherwise 0 on success.
B
Benoit Parrot 已提交
243
 */
244
static int of_gpiochip_scan_gpios(struct gpio_chip *chip)
B
Benoit Parrot 已提交
245 246 247 248 249 250
{
	struct gpio_desc *desc = NULL;
	struct device_node *np;
	const char *name;
	enum gpio_lookup_flags lflags;
	enum gpiod_flags dflags;
251
	unsigned int i;
252
	int ret;
B
Benoit Parrot 已提交
253

254
	for_each_available_child_of_node(chip->of_node, np) {
B
Benoit Parrot 已提交
255 256 257
		if (!of_property_read_bool(np, "gpio-hog"))
			continue;

258 259 260 261 262 263 264 265 266 267 268
		for (i = 0;; i++) {
			desc = of_parse_own_gpio(np, chip, i, &name, &lflags,
						 &dflags);
			if (IS_ERR(desc))
				break;

			ret = gpiod_hog(desc, name, lflags, dflags);
			if (ret < 0) {
				of_node_put(np);
				return ret;
			}
269
		}
B
Benoit Parrot 已提交
270
	}
271 272

	return 0;
B
Benoit Parrot 已提交
273 274
}

275
/**
T
Thierry Reding 已提交
276
 * of_gpio_simple_xlate - translate gpiospec to the GPIO number and flags
277
 * @gc:		pointer to the gpio_chip structure
T
Thierry Reding 已提交
278
 * @gpiospec:	GPIO specifier as found in the device tree
279
 * @flags:	a flags pointer to fill in
280 281
 *
 * This is simple translation function, suitable for the most 1:1 mapped
T
Thierry Reding 已提交
282
 * GPIO chips. This function performs only one sanity check: whether GPIO
283 284
 * is less than ngpios (that is specified in the gpio_chip).
 */
285 286
int of_gpio_simple_xlate(struct gpio_chip *gc,
			 const struct of_phandle_args *gpiospec, u32 *flags)
287
{
288 289
	/*
	 * We're discouraging gpio_cells < 2, since that way you'll have to
290
	 * write your own xlate function (that will have to retrieve the GPIO
291 292 293
	 * number and the flags from a single gpio cell -- this is possible,
	 * but not recommended).
	 */
294
	if (gc->of_gpio_n_cells < 2) {
295 296 297 298
		WARN_ON(1);
		return -EINVAL;
	}

299 300 301
	if (WARN_ON(gpiospec->args_count < gc->of_gpio_n_cells))
		return -EINVAL;

302
	if (gpiospec->args[0] >= gc->ngpio)
303 304
		return -EINVAL;

305
	if (flags)
306
		*flags = gpiospec->args[1];
307

308
	return gpiospec->args[0];
309
}
310
EXPORT_SYMBOL(of_gpio_simple_xlate);
311 312

/**
313
 * of_mm_gpiochip_add_data - Add memory mapped GPIO chip (bank)
314 315
 * @np:		device node of the GPIO chip
 * @mm_gc:	pointer to the of_mm_gpio_chip allocated structure
316
 * @data:	driver data to store in the struct gpio_chip
317 318 319 320 321
 *
 * To use this function you should allocate and fill mm_gc with:
 *
 * 1) In the gpio_chip structure:
 *    - all the callbacks
322 323
 *    - of_gpio_n_cells
 *    - of_xlate callback (optional)
324 325 326 327 328 329 330 331
 *
 * 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.
 */
332 333 334
int of_mm_gpiochip_add_data(struct device_node *np,
			    struct of_mm_gpio_chip *mm_gc,
			    void *data)
335 336
{
	int ret = -ENOMEM;
337
	struct gpio_chip *gc = &mm_gc->gc;
338

339
	gc->label = kasprintf(GFP_KERNEL, "%pOF", np);
340 341 342 343 344 345 346
	if (!gc->label)
		goto err0;

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

347
	gc->base = -1;
348 349 350 351

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

352
	mm_gc->gc.of_node = np;
353

354
	ret = gpiochip_add_data(gc, data);
355 356 357 358 359 360 361 362 363
	if (ret)
		goto err2;

	return 0;
err2:
	iounmap(mm_gc->regs);
err1:
	kfree(gc->label);
err0:
364
	pr_err("%pOF: GPIO chip registration failed with status %d\n", np, ret);
365 366
	return ret;
}
367
EXPORT_SYMBOL(of_mm_gpiochip_add_data);
368

369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385
/**
 * 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);

386
#ifdef CONFIG_PINCTRL
387
static int of_gpiochip_add_pin_range(struct gpio_chip *chip)
388 389 390
{
	struct device_node *np = chip->of_node;
	struct of_phandle_args pinspec;
391
	struct pinctrl_dev *pctldev;
392
	int index = 0, ret;
393 394 395
	const char *name;
	static const char group_names_propname[] = "gpio-ranges-group-names";
	struct property *group_names;
396 397

	if (!np)
398
		return 0;
399

400 401
	group_names = of_find_property(np, group_names_propname, NULL);

402
	for (;; index++) {
403 404
		ret = of_parse_phandle_with_fixed_args(np, "gpio-ranges", 3,
				index, &pinspec);
405 406 407
		if (ret)
			break;

408
		pctldev = of_pinctrl_get(pinspec.np);
409
		of_node_put(pinspec.np);
410
		if (!pctldev)
411
			return -EPROBE_DEFER;
412

413 414
		if (pinspec.args[2]) {
			if (group_names) {
415
				of_property_read_string_index(np,
416 417 418
						group_names_propname,
						index, &name);
				if (strlen(name)) {
419 420
					pr_err("%pOF: Group name of numeric GPIO ranges must be the empty string.\n",
						np);
421 422 423 424 425 426 427 428 429 430
					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)
431
				return ret;
432 433 434
		} else {
			/* npins == 0: special range */
			if (pinspec.args[1]) {
435 436
				pr_err("%pOF: Illegal gpio-range format.\n",
					np);
437 438 439 440
				break;
			}

			if (!group_names) {
441 442
				pr_err("%pOF: GPIO group range requested but no %s property.\n",
					np, group_names_propname);
443 444 445 446 447 448 449 450 451 452
				break;
			}

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

			if (!strlen(name)) {
453 454
				pr_err("%pOF: Group name of GPIO group range cannot be the empty string.\n",
				np);
455 456 457 458 459 460
				break;
			}

			ret = gpiochip_add_pingroup_range(chip, pctldev,
						pinspec.args[0], name);
			if (ret)
461
				return ret;
462
		}
463
	}
464 465

	return 0;
466 467 468
}

#else
469
static int of_gpiochip_add_pin_range(struct gpio_chip *chip) { return 0; }
470 471
#endif

472
int of_gpiochip_add(struct gpio_chip *chip)
473
{
474 475
	int status;

476 477
	if ((!chip->of_node) && (chip->parent))
		chip->of_node = chip->parent->of_node;
478 479

	if (!chip->of_node)
480
		return 0;
481 482 483 484 485 486

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

487 488 489
	if (chip->of_gpio_n_cells > MAX_PHANDLE_ARGS)
		return -EINVAL;

490 491 492 493
	status = of_gpiochip_add_pin_range(chip);
	if (status)
		return status;

494 495
	/* If the chip defines names itself, these take precedence */
	if (!chip->names)
496
		devprop_gpiochip_set_names(chip);
497

498
	of_node_get(chip->of_node);
B
Benoit Parrot 已提交
499

500
	return of_gpiochip_scan_gpios(chip);
501 502 503 504
}

void of_gpiochip_remove(struct gpio_chip *chip)
{
505
	gpiochip_remove_pin_ranges(chip);
506
	of_node_put(chip->of_node);
507
}