diff options
Diffstat (limited to 'drivers/gpio/gpiolib.c')
-rw-r--r-- | drivers/gpio/gpiolib.c | 19 |
1 files changed, 17 insertions, 2 deletions
diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c index 36a2974815b7..137a8ca67822 100644 --- a/drivers/gpio/gpiolib.c +++ b/drivers/gpio/gpiolib.c | |||
@@ -12,6 +12,8 @@ | |||
12 | #include <linux/idr.h> | 12 | #include <linux/idr.h> |
13 | #include <linux/slab.h> | 13 | #include <linux/slab.h> |
14 | 14 | ||
15 | #define CREATE_TRACE_POINTS | ||
16 | #include <trace/events/gpio.h> | ||
15 | 17 | ||
16 | /* Optional implementation infrastructure for GPIO interfaces. | 18 | /* Optional implementation infrastructure for GPIO interfaces. |
17 | * | 19 | * |
@@ -1165,6 +1167,7 @@ struct gpio_chip *gpiochip_find(void *data, | |||
1165 | 1167 | ||
1166 | return chip; | 1168 | return chip; |
1167 | } | 1169 | } |
1170 | EXPORT_SYMBOL_GPL(gpiochip_find); | ||
1168 | 1171 | ||
1169 | /* These "optional" allocation calls help prevent drivers from stomping | 1172 | /* These "optional" allocation calls help prevent drivers from stomping |
1170 | * on each other, and help provide better diagnostics in debugfs. | 1173 | * on each other, and help provide better diagnostics in debugfs. |
@@ -1404,6 +1407,8 @@ int gpio_direction_input(unsigned gpio) | |||
1404 | status = chip->direction_input(chip, gpio); | 1407 | status = chip->direction_input(chip, gpio); |
1405 | if (status == 0) | 1408 | if (status == 0) |
1406 | clear_bit(FLAG_IS_OUT, &desc->flags); | 1409 | clear_bit(FLAG_IS_OUT, &desc->flags); |
1410 | |||
1411 | trace_gpio_direction(chip->base + gpio, 1, status); | ||
1407 | lose: | 1412 | lose: |
1408 | return status; | 1413 | return status; |
1409 | fail: | 1414 | fail: |
@@ -1457,6 +1462,8 @@ int gpio_direction_output(unsigned gpio, int value) | |||
1457 | status = chip->direction_output(chip, gpio, value); | 1462 | status = chip->direction_output(chip, gpio, value); |
1458 | if (status == 0) | 1463 | if (status == 0) |
1459 | set_bit(FLAG_IS_OUT, &desc->flags); | 1464 | set_bit(FLAG_IS_OUT, &desc->flags); |
1465 | trace_gpio_value(chip->base + gpio, 0, value); | ||
1466 | trace_gpio_direction(chip->base + gpio, 0, status); | ||
1460 | lose: | 1467 | lose: |
1461 | return status; | 1468 | return status; |
1462 | fail: | 1469 | fail: |
@@ -1546,10 +1553,13 @@ EXPORT_SYMBOL_GPL(gpio_set_debounce); | |||
1546 | int __gpio_get_value(unsigned gpio) | 1553 | int __gpio_get_value(unsigned gpio) |
1547 | { | 1554 | { |
1548 | struct gpio_chip *chip; | 1555 | struct gpio_chip *chip; |
1556 | int value; | ||
1549 | 1557 | ||
1550 | chip = gpio_to_chip(gpio); | 1558 | chip = gpio_to_chip(gpio); |
1551 | WARN_ON(chip->can_sleep); | 1559 | WARN_ON(chip->can_sleep); |
1552 | return chip->get ? chip->get(chip, gpio - chip->base) : 0; | 1560 | value = chip->get ? chip->get(chip, gpio - chip->base) : 0; |
1561 | trace_gpio_value(gpio, 1, value); | ||
1562 | return value; | ||
1553 | } | 1563 | } |
1554 | EXPORT_SYMBOL_GPL(__gpio_get_value); | 1564 | EXPORT_SYMBOL_GPL(__gpio_get_value); |
1555 | 1565 | ||
@@ -1568,6 +1578,7 @@ void __gpio_set_value(unsigned gpio, int value) | |||
1568 | 1578 | ||
1569 | chip = gpio_to_chip(gpio); | 1579 | chip = gpio_to_chip(gpio); |
1570 | WARN_ON(chip->can_sleep); | 1580 | WARN_ON(chip->can_sleep); |
1581 | trace_gpio_value(gpio, 0, value); | ||
1571 | chip->set(chip, gpio - chip->base, value); | 1582 | chip->set(chip, gpio - chip->base, value); |
1572 | } | 1583 | } |
1573 | EXPORT_SYMBOL_GPL(__gpio_set_value); | 1584 | EXPORT_SYMBOL_GPL(__gpio_set_value); |
@@ -1618,10 +1629,13 @@ EXPORT_SYMBOL_GPL(__gpio_to_irq); | |||
1618 | int gpio_get_value_cansleep(unsigned gpio) | 1629 | int gpio_get_value_cansleep(unsigned gpio) |
1619 | { | 1630 | { |
1620 | struct gpio_chip *chip; | 1631 | struct gpio_chip *chip; |
1632 | int value; | ||
1621 | 1633 | ||
1622 | might_sleep_if(extra_checks); | 1634 | might_sleep_if(extra_checks); |
1623 | chip = gpio_to_chip(gpio); | 1635 | chip = gpio_to_chip(gpio); |
1624 | return chip->get ? chip->get(chip, gpio - chip->base) : 0; | 1636 | value = chip->get ? chip->get(chip, gpio - chip->base) : 0; |
1637 | trace_gpio_value(gpio, 1, value); | ||
1638 | return value; | ||
1625 | } | 1639 | } |
1626 | EXPORT_SYMBOL_GPL(gpio_get_value_cansleep); | 1640 | EXPORT_SYMBOL_GPL(gpio_get_value_cansleep); |
1627 | 1641 | ||
@@ -1631,6 +1645,7 @@ void gpio_set_value_cansleep(unsigned gpio, int value) | |||
1631 | 1645 | ||
1632 | might_sleep_if(extra_checks); | 1646 | might_sleep_if(extra_checks); |
1633 | chip = gpio_to_chip(gpio); | 1647 | chip = gpio_to_chip(gpio); |
1648 | trace_gpio_value(gpio, 0, value); | ||
1634 | chip->set(chip, gpio - chip->base, value); | 1649 | chip->set(chip, gpio - chip->base, value); |
1635 | } | 1650 | } |
1636 | EXPORT_SYMBOL_GPL(gpio_set_value_cansleep); | 1651 | EXPORT_SYMBOL_GPL(gpio_set_value_cansleep); |