From e0c563bbf4df3da50d654eb744441f695ceffcac Mon Sep 17 00:00:00 2001 From: Uwe Kleine-König Date: Sun, 25 Aug 2019 17:58:38 +0200 Subject: reset_source: use instance = -1 as default MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit As with platform device id (does someone still remember?) 0 might be a valid id. So use -1 for "unknown" or "doesn't apply" instead of 0. Also don't pass the instance to the device tree if negative. (This ends up as 0xffffffff otherwise.) Signed-off-by: Uwe Kleine-König Signed-off-by: Sascha Hauer --- common/oftree.c | 5 +++-- common/reset_source.c | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) (limited to 'common') diff --git a/common/oftree.c b/common/oftree.c index 5bb5420a78..28a3b965ff 100644 --- a/common/oftree.c +++ b/common/oftree.c @@ -144,6 +144,7 @@ static int of_fixup_bootargs(struct device_node *root, void *unused) struct device_node *node; const char *str; int err; + int instance = reset_source_get_instance(); str = linux_bootargs_get(); if (!str) @@ -160,8 +161,8 @@ static int of_fixup_bootargs(struct device_node *root, void *unused) return err; of_property_write_string(node, "reset-source", reset_source_name()); - of_property_write_u32(node, "reset-source-instance", - reset_source_get_instance()); + if (instance >= 0) + of_property_write_u32(node, "reset-source-instance", instance); return of_fixup_bootargs_bootsource(root, node); } diff --git a/common/reset_source.c b/common/reset_source.c index 1955d3f87e..e24aa337a7 100644 --- a/common/reset_source.c +++ b/common/reset_source.c @@ -54,7 +54,7 @@ void reset_source_set_priority(enum reset_src_type st, unsigned int priority) reset_source = st; reset_source_priority = priority; - reset_source_instance = 0; + reset_source_instance = -1; pr_debug("Setting reset source to %s with priority %d\n", reset_src_names[reset_source], priority); -- cgit v1.2.3 From 06a912b046aa0661f6eae29ea26bc883d5d6041b Mon Sep 17 00:00:00 2001 From: Uwe Kleine-König Date: Sun, 25 Aug 2019 17:58:39 +0200 Subject: reset_source: fix ordering of exported functions MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Declare and implement getters first, then setters. This syncs the order of functions in reset_source.c and reset_source.h. Signed-off-by: Uwe Kleine-König Signed-off-by: Sascha Hauer --- common/reset_source.c | 12 ++++++------ include/reset_source.h | 33 +++++++++++++++++++-------------- 2 files changed, 25 insertions(+), 20 deletions(-) (limited to 'common') diff --git a/common/reset_source.c b/common/reset_source.c index e24aa337a7..f400112483 100644 --- a/common/reset_source.c +++ b/common/reset_source.c @@ -41,6 +41,12 @@ enum reset_src_type reset_source_get(void) } EXPORT_SYMBOL(reset_source_get); +const char *reset_source_name(void) +{ + return reset_src_names[reset_source]; +} +EXPORT_SYMBOL(reset_source_name); + int reset_source_get_instance(void) { return reset_source_instance; @@ -61,12 +67,6 @@ void reset_source_set_priority(enum reset_src_type st, unsigned int priority) } EXPORT_SYMBOL(reset_source_set_priority); -const char *reset_source_name(void) -{ - return reset_src_names[reset_source]; -} -EXPORT_SYMBOL(reset_source_name); - void reset_source_set_instance(enum reset_src_type type, int instance) { if (reset_source == type) diff --git a/include/reset_source.h b/include/reset_source.h index 2848a91115..85329c8cea 100644 --- a/include/reset_source.h +++ b/include/reset_source.h @@ -26,25 +26,26 @@ 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); +const char *reset_source_name(void); int reset_source_get_instance(void); + +void reset_source_set_priority(enum reset_src_type, unsigned int priority); +void reset_source_set_instance(enum reset_src_type type, int instance); + unsigned int of_get_reset_source_priority(struct device_node *node); -const char *reset_source_name(void); + #else -static inline void reset_source_set_priority(enum reset_src_type type, - unsigned int priority) -{ -} -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 enum reset_src_type reset_source_get(void) +static inline const char *reset_source_name(void) { - return RESET_UKWN; + return "unknown"; } static inline int reset_source_get_instance(void) @@ -52,14 +53,18 @@ static inline int reset_source_get_instance(void) return -1; } -static inline unsigned int of_get_reset_source_priority(struct device_node *node) +static inline void reset_source_set_priority(enum reset_src_type type, + unsigned int priority) { - return 0; } -static inline const char *reset_source_name(void) +static inline void reset_source_set_instance(enum reset_src_type type, int instance) { - return "unknown"; +} + +static inline unsigned int of_get_reset_source_priority(struct device_node *node) +{ + return 0; } #endif -- cgit v1.2.3 From 935446094311ccbc6888dc2dbe238b764a8e073e Mon Sep 17 00:00:00 2001 From: Uwe Kleine-König Date: Sun, 25 Aug 2019 17:58:40 +0200 Subject: reset_source: drop reset_source_set_instance() MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The semantic of reset_source_set_instance() required a separate call to reset_source_set() (or reset_source_set_priority()) and checked right usage only using the type. Make the set of functions a bit easier to use by dropping reset_source_set_instance() and instead introduce a function that can set all relevant parameters (source, priority and instance) in one go. Signed-off-by: Uwe Kleine-König Signed-off-by: Sascha Hauer --- arch/arm/mach-imx/imx.c | 4 +--- common/reset_source.c | 15 ++++----------- drivers/watchdog/stm32_iwdg.c | 3 +-- include/reset_source.h | 14 ++++++++++---- 4 files changed, 16 insertions(+), 20 deletions(-) (limited to 'common') diff --git a/arch/arm/mach-imx/imx.c b/arch/arm/mach-imx/imx.c index 63914d306e..43b540b397 100644 --- a/arch/arm/mach-imx/imx.c +++ b/arch/arm/mach-imx/imx.c @@ -199,9 +199,7 @@ void imx_set_reset_reason(void __iomem *srsr, } } - reset_source_set_priority(type, - RESET_SOURCE_DEFAULT_PRIORITY); - reset_source_set_instance(type, instance); + reset_source_set_prinst(type, RESET_SOURCE_DEFAULT_PRIORITY, instance); pr_info("i.MX reset reason %s (SRSR: 0x%08x)\n", reset_source_name(), reg); diff --git a/common/reset_source.c b/common/reset_source.c index f400112483..f32b4eac28 100644 --- a/common/reset_source.c +++ b/common/reset_source.c @@ -53,26 +53,20 @@ int reset_source_get_instance(void) } EXPORT_SYMBOL(reset_source_get_instance); -void reset_source_set_priority(enum reset_src_type st, unsigned int priority) +void reset_source_set_prinst(enum reset_src_type st, + unsigned int priority, int instance) { if (priority <= reset_source_priority) return; reset_source = st; reset_source_priority = priority; - reset_source_instance = -1; + reset_source_instance = instance; 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); +EXPORT_SYMBOL(reset_source_set_prinst); static int reset_source_init(void) { @@ -83,7 +77,6 @@ static int reset_source_init(void) "%d"); return 0; } - coredevice_initcall(reset_source_init); /** diff --git a/drivers/watchdog/stm32_iwdg.c b/drivers/watchdog/stm32_iwdg.c index 7c2dc077af..20536cb4ab 100644 --- a/drivers/watchdog/stm32_iwdg.c +++ b/drivers/watchdog/stm32_iwdg.c @@ -182,8 +182,7 @@ static int stm32_set_reset_reason(struct regmap *rcc) } } - reset_source_set_priority(type, RESET_SOURCE_DEFAULT_PRIORITY); - reset_source_set_instance(type, instance); + reset_source_set_prinst(type, RESET_SOURCE_DEFAULT_PRIORITY, instance); pr_info("STM32 RCC reset reason %s (MP_RSTSR: 0x%08x)\n", reset_source_name(), reg); diff --git a/include/reset_source.h b/include/reset_source.h index 85329c8cea..22c51a0ea6 100644 --- a/include/reset_source.h +++ b/include/reset_source.h @@ -31,8 +31,8 @@ enum reset_src_type reset_source_get(void); const char *reset_source_name(void); int reset_source_get_instance(void); -void reset_source_set_priority(enum reset_src_type, unsigned int priority); -void reset_source_set_instance(enum reset_src_type type, int instance); +void reset_source_set_prinst(enum reset_src_type, + unsigned int priority, int instance); unsigned int of_get_reset_source_priority(struct device_node *node); @@ -53,8 +53,8 @@ static inline int reset_source_get_instance(void) return -1; } -static inline void reset_source_set_priority(enum reset_src_type type, - unsigned int priority) +static inline void reset_source_set_prinst(enum reset_src_type type, + unsigned int priority, int instance) { } @@ -70,6 +70,12 @@ static inline unsigned int of_get_reset_source_priority(struct device_node *node #define RESET_SOURCE_DEFAULT_PRIORITY 100 +static inline void reset_source_set_priority(enum reset_src_type type, + unsigned int priority) +{ + reset_source_set_prinst(type, priority, -1); +} + static inline void reset_source_set(enum reset_src_type type) { reset_source_set_priority(type, RESET_SOURCE_DEFAULT_PRIORITY); -- cgit v1.2.3 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(-) (limited to 'common') 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 From e208e049f98de40157eb3d8f8f7cbb61147a5040 Mon Sep 17 00:00:00 2001 From: Uwe Kleine-König Date: Sun, 25 Aug 2019 17:58:44 +0200 Subject: oftree: expose reset_source device in device tree MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Uwe Kleine-König Signed-off-by: Sascha Hauer --- common/oftree.c | 14 ++++++++++++++ include/reset_source.h | 5 +++++ 2 files changed, 19 insertions(+) (limited to 'common') diff --git a/common/oftree.c b/common/oftree.c index 28a3b965ff..09cb660212 100644 --- a/common/oftree.c +++ b/common/oftree.c @@ -145,6 +145,7 @@ static int of_fixup_bootargs(struct device_node *root, void *unused) const char *str; int err; int instance = reset_source_get_instance(); + struct device_d *dev; str = linux_bootargs_get(); if (!str) @@ -164,6 +165,19 @@ static int of_fixup_bootargs(struct device_node *root, void *unused) if (instance >= 0) of_property_write_u32(node, "reset-source-instance", instance); + + dev = reset_source_get_device(); + if (dev && dev->device_node) { + phandle phandle; + + phandle = of_node_create_phandle(dev->device_node); + + err = of_property_write_u32(node, + "reset-source-device", phandle); + if (err) + return err; + } + return of_fixup_bootargs_bootsource(root, node); } diff --git a/include/reset_source.h b/include/reset_source.h index 27ee077cc6..3ccd529fdd 100644 --- a/include/reset_source.h +++ b/include/reset_source.h @@ -55,6 +55,11 @@ static inline int reset_source_get_instance(void) return -1; } +static inline struct device_d *reset_source_get_device(void) +{ + return NULL; +} + static inline void reset_source_set_prinst(enum reset_src_type type, unsigned int priority, int instance) { -- cgit v1.2.3