[PATCH 1/1] lib: utils: support multiple reset drivers of same type

Jessica Clarke jrtc27 at jrtc27.com
Wed Jul 21 09:06:49 PDT 2021


On 21 Jul 2021, at 16:55, Heinrich Schuchardt <xypron.glpk at gmx.de> wrote:
> 
> The generic GPIO reset driver has two entries in the match table:
> "gpio-poweroff", "gpio-reset". Only the first entry is considered by
> fdt_reset_init().
> 
> Let fdt_reset_init() loop over all entries.
> 
> Fixes: e3d6919d10d7 ("lib: utils/reset: Add generic GPIO reset driver")
> Fixes: 7cc6fa4d8a65 ("lib: utils: Add simple FDT reset framework")
> Signed-off-by: Heinrich Schuchardt <heinrich.schuchardt at canonical.com>
> ---
> lib/utils/reset/fdt_reset.c | 34 ++++++++++++++++++++--------------
> 1 file changed, 20 insertions(+), 14 deletions(-)
> 
> diff --git a/lib/utils/reset/fdt_reset.c b/lib/utils/reset/fdt_reset.c
> index aa5f59f..a77a680 100644
> --- a/lib/utils/reset/fdt_reset.c
> +++ b/lib/utils/reset/fdt_reset.c
> @@ -7,6 +7,7 @@
>  *   Anup Patel <anup.patel at wdc.com>
>  */
> 
> +#include <libfdt.h>
> #include <sbi/sbi_error.h>
> #include <sbi/sbi_scratch.h>
> #include <sbi_utils/fdt/fdt_helper.h>
> @@ -24,8 +25,14 @@ static struct fdt_reset *reset_drivers[] = {
> 	&fdt_reset_thead,
> };
> 
> -static struct fdt_reset *current_driver = NULL;
> -
> +/**
> + * fdt_reset_init() - initialize reset drivers
> + *
> + * For each reset driver we iterate over the match table. For each matching
> + * entry we call the driver initialization code once. This is necessary as
> + * drivers may use different compatible string for different reset functions,
> + * e.g. both "gpio-poweroff" and "gpio-reset".
> + */
> int fdt_reset_init(void)
> {
> 	int pos, noff, rc;
> @@ -35,20 +42,19 @@ int fdt_reset_init(void)
> 
> 	for (pos = 0; pos < array_size(reset_drivers); pos++) {
> 		drv = reset_drivers[pos];
> -
> -		noff = fdt_find_match(fdt, -1, drv->match_table, &match);
> -		if (noff < 0)
> -			continue;
> -
> -		if (drv->init) {
> -			rc = drv->init(fdt, noff, match);
> -			if (rc == SBI_ENODEV)
> +		for(match = drv->match_table; match->compatible; ++match) {
> +			noff = fdt_node_offset_by_compatible(fdt, -1,
> +							     match->compatible);
> +			if (noff < 0)

I don’t understand this. Doesn’t fdt_find_match already contain an equivalent loop?

Jess




More information about the opensbi mailing list