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 /common | |
parent | d11999163ba62a239022d7ba98bc524730575db8 (diff) | |
parent | e208e049f98de40157eb3d8f8f7cbb61147a5040 (diff) | |
download | barebox-e5fc57847e7a68ad4a662e9799afb103211e4073.tar.gz barebox-e5fc57847e7a68ad4a662e9799afb103211e4073.tar.xz |
Merge branch 'for-next/reset-source'
Diffstat (limited to 'common')
-rw-r--r-- | common/oftree.c | 19 | ||||
-rw-r--r-- | common/reset_source.c | 38 |
2 files changed, 44 insertions, 13 deletions
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); /** |