From a0748840c104a3ea9af5e9e27741541e526edbd5 Mon Sep 17 00:00:00 2001 From: Uwe Kleine-König Date: Sun, 25 Aug 2019 17:58:41 +0200 Subject: reset_source: implement helper to set a device as reset source MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This allows to remove some boilerplate from drivers. Signed-off-by: Uwe Kleine-König Signed-off-by: Sascha Hauer --- common/reset_source.c | 27 +++++++++++++++++++++++++-- include/reset_source.h | 2 ++ 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/common/reset_source.c b/common/reset_source.c index f32b4eac28..8fdf052157 100644 --- a/common/reset_source.c +++ b/common/reset_source.c @@ -34,6 +34,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; +static struct device_d *reset_source_device; enum reset_src_type reset_source_get(void) { @@ -53,8 +54,15 @@ int reset_source_get_instance(void) } EXPORT_SYMBOL(reset_source_get_instance); -void reset_source_set_prinst(enum reset_src_type st, - unsigned int priority, int instance) +struct device_d *reset_source_get_device(void) +{ + return reset_source_device; +} +EXPORT_SYMBOL(reset_source_get_device); + +static void __reset_source_set(struct device_d *dev, + enum reset_src_type st, + unsigned int priority, int instance) { if (priority <= reset_source_priority) return; @@ -62,12 +70,27 @@ void reset_source_set_prinst(enum reset_src_type st, reset_source = st; reset_source_priority = priority; reset_source_instance = instance; + reset_source_device = NULL; pr_debug("Setting reset source to %s with priority %d\n", reset_src_names[reset_source], priority); } + +void reset_source_set_prinst(enum reset_src_type st, + unsigned int priority, int instance) +{ + __reset_source_set(NULL, st, priority, instance); +} EXPORT_SYMBOL(reset_source_set_prinst); +void reset_source_set_device(struct device_d *dev, enum reset_src_type st) +{ + int priority = of_get_reset_source_priority(dev->device_node); + + __reset_source_set(dev, st, priority, -1); +} +EXPORT_SYMBOL(reset_source_set_device); + static int reset_source_init(void) { globalvar_add_simple_enum("system.reset", (unsigned int *)&reset_source, diff --git a/include/reset_source.h b/include/reset_source.h index 22c51a0ea6..27ee077cc6 100644 --- a/include/reset_source.h +++ b/include/reset_source.h @@ -30,7 +30,9 @@ enum reset_src_type { enum reset_src_type reset_source_get(void); const char *reset_source_name(void); int reset_source_get_instance(void); +struct device_d *reset_source_get_device(void); +void reset_source_set_device(struct device_d *dev, enum reset_src_type st); void reset_source_set_prinst(enum reset_src_type, unsigned int priority, int instance); -- cgit v1.2.3