forked from Minki/linux
02fa3ec01a
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>
142 lines
2.4 KiB
C
142 lines
2.4 KiB
C
#undef TRACE_SYSTEM
|
|
#define TRACE_SYSTEM regulator
|
|
|
|
#if !defined(_TRACE_REGULATOR_H) || defined(TRACE_HEADER_MULTI_READ)
|
|
#define _TRACE_REGULATOR_H
|
|
|
|
#include <linux/ktime.h>
|
|
#include <linux/tracepoint.h>
|
|
|
|
/*
|
|
* Events which just log themselves and the regulator name for enable/disable
|
|
* type tracking.
|
|
*/
|
|
DECLARE_EVENT_CLASS(regulator_basic,
|
|
|
|
TP_PROTO(const char *name),
|
|
|
|
TP_ARGS(name),
|
|
|
|
TP_STRUCT__entry(
|
|
__string( name, name )
|
|
),
|
|
|
|
TP_fast_assign(
|
|
__assign_str(name, name);
|
|
),
|
|
|
|
TP_printk("name=%s", __get_str(name))
|
|
|
|
);
|
|
|
|
DEFINE_EVENT(regulator_basic, regulator_enable,
|
|
|
|
TP_PROTO(const char *name),
|
|
|
|
TP_ARGS(name)
|
|
|
|
);
|
|
|
|
DEFINE_EVENT(regulator_basic, regulator_enable_delay,
|
|
|
|
TP_PROTO(const char *name),
|
|
|
|
TP_ARGS(name)
|
|
|
|
);
|
|
|
|
DEFINE_EVENT(regulator_basic, regulator_enable_complete,
|
|
|
|
TP_PROTO(const char *name),
|
|
|
|
TP_ARGS(name)
|
|
|
|
);
|
|
|
|
DEFINE_EVENT(regulator_basic, regulator_disable,
|
|
|
|
TP_PROTO(const char *name),
|
|
|
|
TP_ARGS(name)
|
|
|
|
);
|
|
|
|
DEFINE_EVENT(regulator_basic, regulator_disable_complete,
|
|
|
|
TP_PROTO(const char *name),
|
|
|
|
TP_ARGS(name)
|
|
|
|
);
|
|
|
|
/*
|
|
* Events that take a range of numerical values, mostly for voltages
|
|
* and so on.
|
|
*/
|
|
DECLARE_EVENT_CLASS(regulator_range,
|
|
|
|
TP_PROTO(const char *name, int min, int max),
|
|
|
|
TP_ARGS(name, min, max),
|
|
|
|
TP_STRUCT__entry(
|
|
__string( name, name )
|
|
__field( int, min )
|
|
__field( int, max )
|
|
),
|
|
|
|
TP_fast_assign(
|
|
__assign_str(name, name);
|
|
__entry->min = min;
|
|
__entry->max = max;
|
|
),
|
|
|
|
TP_printk("name=%s (%d-%d)", __get_str(name),
|
|
(int)__entry->min, (int)__entry->max)
|
|
);
|
|
|
|
DEFINE_EVENT(regulator_range, regulator_set_voltage,
|
|
|
|
TP_PROTO(const char *name, int min, int max),
|
|
|
|
TP_ARGS(name, min, max)
|
|
|
|
);
|
|
|
|
|
|
/*
|
|
* Events that take a single value, mostly for readback and refcounts.
|
|
*/
|
|
DECLARE_EVENT_CLASS(regulator_value,
|
|
|
|
TP_PROTO(const char *name, unsigned int val),
|
|
|
|
TP_ARGS(name, val),
|
|
|
|
TP_STRUCT__entry(
|
|
__string( name, name )
|
|
__field( unsigned int, val )
|
|
),
|
|
|
|
TP_fast_assign(
|
|
__assign_str(name, name);
|
|
__entry->val = val;
|
|
),
|
|
|
|
TP_printk("name=%s, val=%u", __get_str(name),
|
|
(int)__entry->val)
|
|
);
|
|
|
|
DEFINE_EVENT(regulator_value, regulator_set_voltage_complete,
|
|
|
|
TP_PROTO(const char *name, unsigned int value),
|
|
|
|
TP_ARGS(name, value)
|
|
|
|
);
|
|
|
|
#endif /* _TRACE_POWER_H */
|
|
|
|
/* This part must be outside protection */
|
|
#include <trace/define_trace.h>
|