diff options
-rw-r--r-- | drivers/regulator/core.c | 17 | ||||
-rw-r--r-- | include/trace/events/regulator.h | 141 |
2 files changed, 158 insertions, 0 deletions
diff --git a/drivers/regulator/core.c b/drivers/regulator/core.c index 67d3a61f378..8a5d0ae191b 100644 --- a/drivers/regulator/core.c +++ b/drivers/regulator/core.c | |||
@@ -25,6 +25,9 @@ | |||
25 | #include <linux/regulator/driver.h> | 25 | #include <linux/regulator/driver.h> |
26 | #include <linux/regulator/machine.h> | 26 | #include <linux/regulator/machine.h> |
27 | 27 | ||
28 | #define CREATE_TRACE_POINTS | ||
29 | #include <trace/events/regulator.h> | ||
30 | |||
28 | #include "dummy.h" | 31 | #include "dummy.h" |
29 | 32 | ||
30 | #define REGULATOR_VERSION "0.5" | 33 | #define REGULATOR_VERSION "0.5" |
@@ -1310,6 +1313,8 @@ static int _regulator_enable(struct regulator_dev *rdev) | |||
1310 | delay = 0; | 1313 | delay = 0; |
1311 | } | 1314 | } |
1312 | 1315 | ||
1316 | trace_regulator_enable(rdev_get_name(rdev)); | ||
1317 | |||
1313 | /* Allow the regulator to ramp; it would be useful | 1318 | /* Allow the regulator to ramp; it would be useful |
1314 | * to extend this for bulk operations so that the | 1319 | * to extend this for bulk operations so that the |
1315 | * regulators can ramp together. */ | 1320 | * regulators can ramp together. */ |
@@ -1317,6 +1322,8 @@ static int _regulator_enable(struct regulator_dev *rdev) | |||
1317 | if (ret < 0) | 1322 | if (ret < 0) |
1318 | return ret; | 1323 | return ret; |
1319 | 1324 | ||
1325 | trace_regulator_enable_delay(rdev_get_name(rdev)); | ||
1326 | |||
1320 | if (delay >= 1000) { | 1327 | if (delay >= 1000) { |
1321 | mdelay(delay / 1000); | 1328 | mdelay(delay / 1000); |
1322 | udelay(delay % 1000); | 1329 | udelay(delay % 1000); |
@@ -1324,6 +1331,8 @@ static int _regulator_enable(struct regulator_dev *rdev) | |||
1324 | udelay(delay); | 1331 | udelay(delay); |
1325 | } | 1332 | } |
1326 | 1333 | ||
1334 | trace_regulator_enable_complete(rdev_get_name(rdev)); | ||
1335 | |||
1327 | } else if (ret < 0) { | 1336 | } else if (ret < 0) { |
1328 | printk(KERN_ERR "%s: is_enabled() failed for %s: %d\n", | 1337 | printk(KERN_ERR "%s: is_enabled() failed for %s: %d\n", |
1329 | __func__, rdev_get_name(rdev), ret); | 1338 | __func__, rdev_get_name(rdev), ret); |
@@ -1379,6 +1388,8 @@ static int _regulator_disable(struct regulator_dev *rdev, | |||
1379 | /* we are last user */ | 1388 | /* we are last user */ |
1380 | if (_regulator_can_change_status(rdev) && | 1389 | if (_regulator_can_change_status(rdev) && |
1381 | rdev->desc->ops->disable) { | 1390 | rdev->desc->ops->disable) { |
1391 | trace_regulator_disable(rdev_get_name(rdev)); | ||
1392 | |||
1382 | ret = rdev->desc->ops->disable(rdev); | 1393 | ret = rdev->desc->ops->disable(rdev); |
1383 | if (ret < 0) { | 1394 | if (ret < 0) { |
1384 | printk(KERN_ERR "%s: failed to disable %s\n", | 1395 | printk(KERN_ERR "%s: failed to disable %s\n", |
@@ -1386,6 +1397,8 @@ static int _regulator_disable(struct regulator_dev *rdev, | |||
1386 | return ret; | 1397 | return ret; |
1387 | } | 1398 | } |
1388 | 1399 | ||
1400 | trace_regulator_disable_complete(rdev_get_name(rdev)); | ||
1401 | |||
1389 | _notifier_call_chain(rdev, REGULATOR_EVENT_DISABLE, | 1402 | _notifier_call_chain(rdev, REGULATOR_EVENT_DISABLE, |
1390 | NULL); | 1403 | NULL); |
1391 | } | 1404 | } |
@@ -1645,6 +1658,8 @@ int regulator_set_voltage(struct regulator *regulator, int min_uV, int max_uV) | |||
1645 | regulator->min_uV = min_uV; | 1658 | regulator->min_uV = min_uV; |
1646 | regulator->max_uV = max_uV; | 1659 | regulator->max_uV = max_uV; |
1647 | 1660 | ||
1661 | trace_regulator_set_voltage(rdev_get_name(rdev), min_uV, max_uV); | ||
1662 | |||
1648 | ret = rdev->desc->ops->set_voltage(rdev, min_uV, max_uV, &selector); | 1663 | ret = rdev->desc->ops->set_voltage(rdev, min_uV, max_uV, &selector); |
1649 | 1664 | ||
1650 | if (rdev->desc->ops->list_voltage) | 1665 | if (rdev->desc->ops->list_voltage) |
@@ -1652,6 +1667,8 @@ int regulator_set_voltage(struct regulator *regulator, int min_uV, int max_uV) | |||
1652 | else | 1667 | else |
1653 | selector = -1; | 1668 | selector = -1; |
1654 | 1669 | ||
1670 | trace_regulator_set_voltage_complete(rdev_get_name(rdev), selector); | ||
1671 | |||
1655 | out: | 1672 | out: |
1656 | _notifier_call_chain(rdev, REGULATOR_EVENT_VOLTAGE_CHANGE, NULL); | 1673 | _notifier_call_chain(rdev, REGULATOR_EVENT_VOLTAGE_CHANGE, NULL); |
1657 | mutex_unlock(&rdev->mutex); | 1674 | mutex_unlock(&rdev->mutex); |
diff --git a/include/trace/events/regulator.h b/include/trace/events/regulator.h new file mode 100644 index 00000000000..37502a7404b --- /dev/null +++ b/include/trace/events/regulator.h | |||
@@ -0,0 +1,141 @@ | |||
1 | #undef TRACE_SYSTEM | ||
2 | #define TRACE_SYSTEM regulator | ||
3 | |||
4 | #if !defined(_TRACE_REGULATOR_H) || defined(TRACE_HEADER_MULTI_READ) | ||
5 | #define _TRACE_REGULATOR_H | ||
6 | |||
7 | #include <linux/ktime.h> | ||
8 | #include <linux/tracepoint.h> | ||
9 | |||
10 | /* | ||
11 | * Events which just log themselves and the regulator name for enable/disable | ||
12 | * type tracking. | ||
13 | */ | ||
14 | DECLARE_EVENT_CLASS(regulator_basic, | ||
15 | |||
16 | TP_PROTO(const char *name), | ||
17 | |||
18 | TP_ARGS(name), | ||
19 | |||
20 | TP_STRUCT__entry( | ||
21 | __string( name, name ) | ||
22 | ), | ||
23 | |||
24 | TP_fast_assign( | ||
25 | __assign_str(name, name); | ||
26 | ), | ||
27 | |||
28 | TP_printk("name=%s", __get_str(name)) | ||
29 | |||
30 | ); | ||
31 | |||
32 | DEFINE_EVENT(regulator_basic, regulator_enable, | ||
33 | |||
34 | TP_PROTO(const char *name), | ||
35 | |||
36 | TP_ARGS(name) | ||
37 | |||
38 | ); | ||
39 | |||
40 | DEFINE_EVENT(regulator_basic, regulator_enable_delay, | ||
41 | |||
42 | TP_PROTO(const char *name), | ||
43 | |||
44 | TP_ARGS(name) | ||
45 | |||
46 | ); | ||
47 | |||
48 | DEFINE_EVENT(regulator_basic, regulator_enable_complete, | ||
49 | |||
50 | TP_PROTO(const char *name), | ||
51 | |||
52 | TP_ARGS(name) | ||
53 | |||
54 | ); | ||
55 | |||
56 | DEFINE_EVENT(regulator_basic, regulator_disable, | ||
57 | |||
58 | TP_PROTO(const char *name), | ||
59 | |||
60 | TP_ARGS(name) | ||
61 | |||
62 | ); | ||
63 | |||
64 | DEFINE_EVENT(regulator_basic, regulator_disable_complete, | ||
65 | |||
66 | TP_PROTO(const char *name), | ||
67 | |||
68 | TP_ARGS(name) | ||
69 | |||
70 | ); | ||
71 | |||
72 | /* | ||
73 | * Events that take a range of numerical values, mostly for voltages | ||
74 | * and so on. | ||
75 | */ | ||
76 | DECLARE_EVENT_CLASS(regulator_range, | ||
77 | |||
78 | TP_PROTO(const char *name, int min, int max), | ||
79 | |||
80 | TP_ARGS(name, min, max), | ||
81 | |||
82 | TP_STRUCT__entry( | ||
83 | __string( name, name ) | ||
84 | __field( int, min ) | ||
85 | __field( int, max ) | ||
86 | ), | ||
87 | |||
88 | TP_fast_assign( | ||
89 | __assign_str(name, name); | ||
90 | __entry->min = min; | ||
91 | __entry->max = max; | ||
92 | ), | ||
93 | |||
94 | TP_printk("name=%s (%d-%d)", __get_str(name), | ||
95 | (int)__entry->min, (int)__entry->max) | ||
96 | ); | ||
97 | |||
98 | DEFINE_EVENT(regulator_range, regulator_set_voltage, | ||
99 | |||
100 | TP_PROTO(const char *name, int min, int max), | ||
101 | |||
102 | TP_ARGS(name, min, max) | ||
103 | |||
104 | ); | ||
105 | |||
106 | |||
107 | /* | ||
108 | * Events that take a single value, mostly for readback and refcounts. | ||
109 | */ | ||
110 | DECLARE_EVENT_CLASS(regulator_value, | ||
111 | |||
112 | TP_PROTO(const char *name, unsigned int val), | ||
113 | |||
114 | TP_ARGS(name, val), | ||
115 | |||
116 | TP_STRUCT__entry( | ||
117 | __string( name, name ) | ||
118 | __field( unsigned int, val ) | ||
119 | ), | ||
120 | |||
121 | TP_fast_assign( | ||
122 | __assign_str(name, name); | ||
123 | __entry->val = val; | ||
124 | ), | ||
125 | |||
126 | TP_printk("name=%s, val=%u", __get_str(name), | ||
127 | (int)__entry->val) | ||
128 | ); | ||
129 | |||
130 | DEFINE_EVENT(regulator_value, regulator_set_voltage_complete, | ||
131 | |||
132 | TP_PROTO(const char *name, unsigned int value), | ||
133 | |||
134 | TP_ARGS(name, value) | ||
135 | |||
136 | ); | ||
137 | |||
138 | #endif /* _TRACE_POWER_H */ | ||
139 | |||
140 | /* This part must be outside protection */ | ||
141 | #include <trace/define_trace.h> | ||