diff options
author | Sascha Hauer <s.hauer@pengutronix.de> | 2019-09-12 07:53:18 +0200 |
---|---|---|
committer | Sascha Hauer <s.hauer@pengutronix.de> | 2019-09-12 07:53:18 +0200 |
commit | e5fc57847e7a68ad4a662e9799afb103211e4073 (patch) | |
tree | fba7865660b3acf477eac3998affeeca83e57638 | |
parent | d11999163ba62a239022d7ba98bc524730575db8 (diff) | |
parent | e208e049f98de40157eb3d8f8f7cbb61147a5040 (diff) | |
download | barebox-e5fc57847e7a68ad4a662e9799afb103211e4073.tar.gz barebox-e5fc57847e7a68ad4a662e9799afb103211e4073.tar.xz |
Merge branch 'for-next/reset-source'
-rw-r--r-- | arch/arm/mach-imx/imx.c | 4 | ||||
-rw-r--r-- | common/oftree.c | 19 | ||||
-rw-r--r-- | common/reset_source.c | 38 | ||||
-rw-r--r-- | drivers/mfd/da9053.c | 5 | ||||
-rw-r--r-- | drivers/mfd/da9063.c | 5 | ||||
-rw-r--r-- | drivers/watchdog/stm32_iwdg.c | 3 | ||||
-rw-r--r-- | include/reset_source.h | 46 |
7 files changed, 80 insertions, 40 deletions
diff --git a/arch/arm/mach-imx/imx.c b/arch/arm/mach-imx/imx.c index ad9b3c4d3e..0942d50695 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/oftree.c b/common/oftree.c index 5bb5420a78..09cb660212 100644 --- a/common/oftree.c +++ b/common/oftree.c @@ -144,6 +144,8 @@ 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(); + struct device_d *dev; str = linux_bootargs_get(); if (!str) @@ -160,8 +162,21 @@ 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); + + + 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/common/reset_source.c b/common/reset_source.c index 1955d3f87e..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) { @@ -41,38 +42,54 @@ 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; } EXPORT_SYMBOL(reset_source_get_instance); -void reset_source_set_priority(enum reset_src_type st, unsigned int priority) +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; reset_source = st; reset_source_priority = priority; - reset_source_instance = 0; + 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); } -EXPORT_SYMBOL(reset_source_set_priority); -const char *reset_source_name(void) +void reset_source_set_prinst(enum reset_src_type st, + unsigned int priority, int instance) { - return reset_src_names[reset_source]; + __reset_source_set(NULL, st, priority, instance); } -EXPORT_SYMBOL(reset_source_name); +EXPORT_SYMBOL(reset_source_set_prinst); -void reset_source_set_instance(enum reset_src_type type, int instance) +void reset_source_set_device(struct device_d *dev, enum reset_src_type st) { - if (reset_source == type) - reset_source_instance = instance; + int priority = of_get_reset_source_priority(dev->device_node); + + __reset_source_set(dev, st, priority, -1); } -EXPORT_SYMBOL(reset_source_set_instance); +EXPORT_SYMBOL(reset_source_set_device); static int reset_source_init(void) { @@ -83,7 +100,6 @@ static int reset_source_init(void) "%d"); return 0; } - coredevice_initcall(reset_source_init); /** diff --git a/drivers/mfd/da9053.c b/drivers/mfd/da9053.c index b156bf113f..1faba813be 100644 --- a/drivers/mfd/da9053.c +++ b/drivers/mfd/da9053.c @@ -214,7 +214,6 @@ static int da9053_set_timeout(struct watchdog *wd, unsigned timeout) static void da9053_detect_reset_source(struct da9053_priv *da9053) { - unsigned int priority; enum reset_src_type type; int ret; u8 val; @@ -236,9 +235,7 @@ static void da9053_detect_reset_source(struct da9053_priv *da9053) else return; - priority = of_get_reset_source_priority(da9053->dev->device_node); - - reset_source_set_priority(type, priority); + reset_source_set_device(da9053->dev, ltype); ret = da9053_reg_write(da9053, DA9053_FAULTLOG_REG, val); if (ret < 0) diff --git a/drivers/mfd/da9063.c b/drivers/mfd/da9063.c index a7fff2c5bf..5f77e5935b 100644 --- a/drivers/mfd/da9063.c +++ b/drivers/mfd/da9063.c @@ -161,7 +161,6 @@ static void da9063_detect_reset_source(struct da9063 *priv) { int ret; u8 val; - unsigned int priority; enum reset_src_type type; ret = i2c_read_reg(priv->client, DA9063_REG_FAULT_LOG, &val, 1); @@ -180,9 +179,7 @@ static void da9063_detect_reset_source(struct da9063 *priv) else return; - priority = of_get_reset_source_priority(priv->dev->device_node); - - reset_source_set_priority(type, priority); + reset_source_set_device(priv->dev, type); } static void da9063_restart(struct restart_handler *rst) 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 13bc3bcfde..3ccd529fdd 100644 --- a/include/reset_source.h +++ b/include/reset_source.h @@ -26,45 +26,63 @@ 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); +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); + 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 enum reset_src_type reset_source_get(void) { + return RESET_UKWN; } -static inline void reset_source_set_instance(enum reset_src_type type, int instance) +static inline const char *reset_source_name(void) { + return "unknown"; } -static inline enum reset_src_type reset_source_get(void) +static inline int reset_source_get_instance(void) { - return RESET_UKWN; + return -1; } -static inline int reset_source_get_instance(void) +static inline struct device_d *reset_source_get_device(void) { - return 0; + return NULL; } -static inline unsigned int of_get_reset_source_priority(struct device_node *node) +static inline void reset_source_set_prinst(enum reset_src_type type, + unsigned int priority, int instance) { - 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 #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); |