aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/regulator
diff options
context:
space:
mode:
authorMark Brown <broonie@opensource.wolfsonmicro.com>2010-11-10 09:38:30 -0500
committerLiam Girdwood <lrg@slimlogic.co.uk>2011-01-12 09:33:00 -0500
commit02fa3ec01a0df7a8ccc356d8e245a9a1423b3596 (patch)
treec80875047e60cc495892bd61d51b0cba6e7ee23b /drivers/regulator
parent3a93f2a9f4d8f73d74c0e552feb68a10f778a219 (diff)
regulator: Add basic trace facilities
Provide some basic trace facilities to the regulator API. We generate events on regulator enable, disable and voltage setting over the actual hardware operations (which are assumed to be the expensive ones which require interaction with the actual device). This is intended to facilitate debug of the performance and behaviour with consumers allowing unified traces to be generated including the regulator operations within the context of the other components of the system. For enable we log the explicit delay for the voltage ramp separately to the interaction with the hardware to highlight the time consumed in I/O. We should add a similar delay for voltage changes, though there the relatively small magnitude of the changes in the context of the I/O costs makes it much less critical for most regulators. Only hardware interactions are currently traced as the primary focus is on the performance and synchronisation of actual hardware interactions. Additional tracepoints for debugging of the logical operations can be added later if required. Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com> Signed-off-by: Liam Girdwood <lrg@slimlogic.co.uk>
Diffstat (limited to 'drivers/regulator')
-rw-r--r--drivers/regulator/core.c17
1 files changed, 17 insertions, 0 deletions
diff --git a/drivers/regulator/core.c b/drivers/regulator/core.c
index 67d3a61f3785..8a5d0ae191b3 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
1655out: 1672out:
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);