Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

gpio: add trace events for setting direction and value

This patch allows to trace gpio operations using ftrace

Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
Signed-off-by: Grant Likely <grant.likely@secretlab.ca>

authored by

Uwe Kleine-König and committed by
Grant Likely
3f397c21 cc300d9e

+72 -2
+16 -2
drivers/gpio/gpiolib.c
··· 12 12 #include <linux/idr.h> 13 13 #include <linux/slab.h> 14 14 15 + #define CREATE_TRACE_POINTS 16 + #include <trace/events/gpio.h> 15 17 16 18 /* Optional implementation infrastructure for GPIO interfaces. 17 19 * ··· 1407 1405 status = chip->direction_input(chip, gpio); 1408 1406 if (status == 0) 1409 1407 clear_bit(FLAG_IS_OUT, &desc->flags); 1408 + 1409 + trace_gpio_direction(chip->base + gpio, 1, status); 1410 1410 lose: 1411 1411 return status; 1412 1412 fail: ··· 1462 1458 status = chip->direction_output(chip, gpio, value); 1463 1459 if (status == 0) 1464 1460 set_bit(FLAG_IS_OUT, &desc->flags); 1461 + trace_gpio_value(chip->base + gpio, 0, value); 1462 + trace_gpio_direction(chip->base + gpio, 0, status); 1465 1463 lose: 1466 1464 return status; 1467 1465 fail: ··· 1553 1547 int __gpio_get_value(unsigned gpio) 1554 1548 { 1555 1549 struct gpio_chip *chip; 1550 + int value; 1556 1551 1557 1552 chip = gpio_to_chip(gpio); 1558 1553 WARN_ON(chip->can_sleep); 1559 - return chip->get ? chip->get(chip, gpio - chip->base) : 0; 1554 + value = chip->get ? chip->get(chip, gpio - chip->base) : 0; 1555 + trace_gpio_value(gpio, 1, value); 1556 + return value; 1560 1557 } 1561 1558 EXPORT_SYMBOL_GPL(__gpio_get_value); 1562 1559 ··· 1578 1569 1579 1570 chip = gpio_to_chip(gpio); 1580 1571 WARN_ON(chip->can_sleep); 1572 + trace_gpio_value(gpio, 0, value); 1581 1573 chip->set(chip, gpio - chip->base, value); 1582 1574 } 1583 1575 EXPORT_SYMBOL_GPL(__gpio_set_value); ··· 1629 1619 int gpio_get_value_cansleep(unsigned gpio) 1630 1620 { 1631 1621 struct gpio_chip *chip; 1622 + int value; 1632 1623 1633 1624 might_sleep_if(extra_checks); 1634 1625 chip = gpio_to_chip(gpio); 1635 - return chip->get ? chip->get(chip, gpio - chip->base) : 0; 1626 + value = chip->get ? chip->get(chip, gpio - chip->base) : 0; 1627 + trace_gpio_value(gpio, 1, value); 1628 + return value; 1636 1629 } 1637 1630 EXPORT_SYMBOL_GPL(gpio_get_value_cansleep); 1638 1631 ··· 1645 1632 1646 1633 might_sleep_if(extra_checks); 1647 1634 chip = gpio_to_chip(gpio); 1635 + trace_gpio_value(gpio, 0, value); 1648 1636 chip->set(chip, gpio - chip->base, value); 1649 1637 } 1650 1638 EXPORT_SYMBOL_GPL(gpio_set_value_cansleep);
+56
include/trace/events/gpio.h
··· 1 + #undef TRACE_SYSTEM 2 + #define TRACE_SYSTEM gpio 3 + 4 + #if !defined(_TRACE_GPIO_H) || defined(TRACE_HEADER_MULTI_READ) 5 + #define _TRACE_GPIO_H 6 + 7 + #include <linux/tracepoint.h> 8 + 9 + TRACE_EVENT(gpio_direction, 10 + 11 + TP_PROTO(unsigned gpio, int in, int err), 12 + 13 + TP_ARGS(gpio, in, err), 14 + 15 + TP_STRUCT__entry( 16 + __field(unsigned, gpio) 17 + __field(int, in) 18 + __field(int, err) 19 + ), 20 + 21 + TP_fast_assign( 22 + __entry->gpio = gpio; 23 + __entry->in = in; 24 + __entry->err = err; 25 + ), 26 + 27 + TP_printk("%u %3s (%d)", __entry->gpio, 28 + __entry->in ? "in" : "out", __entry->err) 29 + ); 30 + 31 + TRACE_EVENT(gpio_value, 32 + 33 + TP_PROTO(unsigned gpio, int get, int value), 34 + 35 + TP_ARGS(gpio, get, value), 36 + 37 + TP_STRUCT__entry( 38 + __field(unsigned, gpio) 39 + __field(int, get) 40 + __field(int, value) 41 + ), 42 + 43 + TP_fast_assign( 44 + __entry->gpio = gpio; 45 + __entry->get = get; 46 + __entry->value = value; 47 + ), 48 + 49 + TP_printk("%u %3s %d", __entry->gpio, 50 + __entry->get ? "get" : "set", __entry->value) 51 + ); 52 + 53 + #endif /* if !defined(_TRACE_GPIO_H) || defined(TRACE_HEADER_MULTI_READ) */ 54 + 55 + /* This part must be outside protection */ 56 + #include <trace/define_trace.h>