summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndrey Smirnov <andrew.smirnov@gmail.com>2018-04-20 18:05:29 -0700
committerSascha Hauer <s.hauer@pengutronix.de>2018-04-26 13:46:28 +0200
commit505b5e65298e7b25aa2fe3d8ee0799ca8712a629 (patch)
tree1deaa76d65728f5fb504a0f0e95e2f4c272db8d1
parent9d8c00bdf7c1e8b614a797f0a15fa45bf6387224 (diff)
downloadbarebox-505b5e65298e7b25aa2fe3d8ee0799ca8712a629.tar.gz
barebox-505b5e65298e7b25aa2fe3d8ee0799ca8712a629.tar.xz
common: reset_source: Add the notion of "reset source instance"
In order to accomodate SoCs that come with multiple watchdogs (or any other reset sources of the same kind) add a notion of "reset source instance", similar to what we already have for bootsource API. Signed-off-by: Andrey Smirnov <andrew.smirnov@gmail.com> Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
-rw-r--r--common/reset_source.c17
-rw-r--r--include/reset_source.h11
2 files changed, 28 insertions, 0 deletions
diff --git a/common/reset_source.c b/common/reset_source.c
index 06e2ca85f5..6a6c4f5daf 100644
--- a/common/reset_source.c
+++ b/common/reset_source.c
@@ -32,6 +32,7 @@ static const char * const reset_src_names[] = {
static enum reset_src_type reset_source;
static unsigned int reset_source_priority;
+static int reset_source_instance;
enum reset_src_type reset_source_get(void)
{
@@ -39,6 +40,12 @@ enum reset_src_type reset_source_get(void)
}
EXPORT_SYMBOL(reset_source_get);
+int reset_source_get_instance(void)
+{
+ return reset_source_instance;
+}
+EXPORT_SYMBOL(reset_source_get_instance);
+
void reset_source_set_priority(enum reset_src_type st, unsigned int priority)
{
if (priority <= reset_source_priority)
@@ -46,17 +53,27 @@ void reset_source_set_priority(enum reset_src_type st, unsigned int priority)
reset_source = st;
reset_source_priority = priority;
+ reset_source_instance = 0;
pr_debug("Setting reset source to %s with priority %d\n",
reset_src_names[reset_source], priority);
}
EXPORT_SYMBOL(reset_source_set_priority);
+void reset_source_set_instance(enum reset_src_type type, int instance)
+{
+ if (reset_source == type)
+ reset_source_instance = instance;
+}
+EXPORT_SYMBOL(reset_source_set_instance);
+
static int reset_source_init(void)
{
globalvar_add_simple_enum("system.reset", (unsigned int *)&reset_source,
reset_src_names, ARRAY_SIZE(reset_src_names));
+ globalvar_add_simple_int("system.reset_instance", &reset_source_instance,
+ "%d");
return 0;
}
diff --git a/include/reset_source.h b/include/reset_source.h
index 3ff06b70ad..c9911c008c 100644
--- a/include/reset_source.h
+++ b/include/reset_source.h
@@ -27,6 +27,8 @@ enum reset_src_type {
#ifdef CONFIG_RESET_SOURCE
void reset_source_set_priority(enum reset_src_type, unsigned int priority);
enum reset_src_type reset_source_get(void);
+void reset_source_set_instance(enum reset_src_type type, int instance);
+int reset_source_get_instance(void);
unsigned int of_get_reset_source_priority(struct device_node *node);
#else
static inline void reset_source_set_priority(enum reset_src_type type,
@@ -34,11 +36,20 @@ static inline void reset_source_set_priority(enum reset_src_type type,
{
}
+static inline void reset_source_set_instance(enum reset_src_type type, int instance)
+{
+}
+
static inline enum reset_src_type reset_source_get(void)
{
return RESET_UKWN;
}
+static inline int reset_source_get_instance(void)
+{
+ return 0;
+}
+
static inline unsigned int of_get_reset_source_priority(struct device_node *node)
{
return 0;