9
0
Fork 0

reset-source: Allow different priorities

Different devices may report the reset source with different levels
of certainty. For example a SoC may see a power-on reset, but this
may only be because an external PMIC has power cycled the SoC. This
means the PMIC knows the real reason better and thus the reset reason
from the PMIC should be preferred.

This patch introduces priorities for the reset_source to handle the
above scenario. Also add a of_get_reset_source_priority() function
to retrieve the desired priority from the device tree.

Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
This commit is contained in:
Sascha Hauer 2015-08-26 10:13:22 +02:00
parent ff2a4a0a13
commit 4a7534bf07
2 changed files with 34 additions and 3 deletions

View File

@ -30,6 +30,7 @@ static const char * const reset_src_names[] = {
};
static enum reset_src_type reset_source;
static unsigned int reset_source_priority;
enum reset_src_type reset_source_get(void)
{
@ -37,9 +38,13 @@ enum reset_src_type reset_source_get(void)
}
EXPORT_SYMBOL(reset_source_get);
void reset_source_set(enum reset_src_type st)
void reset_source_set_priority(enum reset_src_type st, unsigned int priority)
{
if (priority <= reset_source_priority)
return;
reset_source = st;
reset_source_priority = priority;
}
EXPORT_SYMBOL(reset_source_set);
@ -52,3 +57,19 @@ static int reset_source_init(void)
}
coredevice_initcall(reset_source_init);
/**
* of_get_reset_source_priority() - get the desired reset source priority from
* device tree
* @node: The device_node to read the property from
*
* return: The priority
*/
unsigned int of_get_reset_source_priority(struct device_node *node)
{
unsigned int priority = RESET_SOURCE_DEFAULT_PRIORITY;
of_property_read_u32(node, "reset-source-priority", &priority);
return priority;
}

View File

@ -25,10 +25,11 @@ enum reset_src_type {
};
#ifdef CONFIG_RESET_SOURCE
void reset_source_set(enum reset_src_type);
void reset_source_set_priority(enum reset_src_type, unsigned int priority);
enum reset_src_type reset_source_get(void);
#else
static inline void reset_source_set(enum reset_src_type unused)
static inline void reset_source_set_priority(enum reset_src_type type,
unsigned int priority)
{
}
@ -38,4 +39,13 @@ static inline enum reset_src_type reset_source_get(void)
}
#endif
#define RESET_SOURCE_DEFAULT_PRIORITY 100
static inline void reset_source_set(enum reset_src_type type)
{
reset_source_set_priority(type, RESET_SOURCE_DEFAULT_PRIORITY);
}
unsigned int of_get_reset_source_priority(struct device_node *node);
#endif /* __INCLUDE_RESET_SOURCE_H */