[PATCH 3/6] lib: utils/regmap: Add simple FDT based regmap framework
Xiang W
wxjstz at 126.com
Fri Jul 28 06:41:51 PDT 2023
在 2023-07-21星期五的 22:40 +0530,Anup Patel写道:
> We add a simple FDT based regmap framework which is built on top of
> generic regmap library. The phandle of FDT regmap DT node is treated
> as unique regmap ID. The FDT based regmap drivers will be probed
> on-demand from fdt_regmap_get_by_phandle() and fdt_regmap_get()
> called by the regmap client drivers.
>
> Signed-off-by: Anup Patel <apatel at ventanamicro.com>
Look good to me.
Reviewed-by: Xiang W <wxjstz at 126.com>
> ---
> include/sbi_utils/regmap/fdt_regmap.h | 31 +++++++
> lib/utils/regmap/Kconfig | 6 ++
> lib/utils/regmap/fdt_regmap.c | 94 ++++++++++++++++++++++
> lib/utils/regmap/fdt_regmap_drivers.carray | 3 +
> lib/utils/regmap/objects.mk | 3 +
> platform/generic/configs/defconfig | 2 +-
> 6 files changed, 138 insertions(+), 1 deletion(-)
> create mode 100644 include/sbi_utils/regmap/fdt_regmap.h
> create mode 100644 lib/utils/regmap/fdt_regmap.c
> create mode 100644 lib/utils/regmap/fdt_regmap_drivers.carray
>
> diff --git a/include/sbi_utils/regmap/fdt_regmap.h b/include/sbi_utils/regmap/fdt_regmap.h
> new file mode 100644
> index 0000000..0672162
> --- /dev/null
> +++ b/include/sbi_utils/regmap/fdt_regmap.h
> @@ -0,0 +1,31 @@
> +/*
> + * SPDX-License-Identifier: BSD-2-Clause
> + *
> + * Copyright (c) 2023 Ventana Micro Systems Inc.
> + *
> + * Authors:
> + * Anup Patel <apatel at ventanamicro.com>
> + */
> +
> +#ifndef __FDT_REGMAP_H__
> +#define __FDT_REGMAP_H__
> +
> +#include <sbi_utils/regmap/regmap.h>
> +
> +struct fdt_phandle_args;
> +
> +/** FDT based regmap driver */
> +struct fdt_regmap {
> + const struct fdt_match *match_table;
> + int (*init)(void *fdt, int nodeoff, u32 phandle,
> + const struct fdt_match *match);
> +};
> +
> +/** Get regmap instance based on phandle */
> +int fdt_regmap_get_by_phandle(void *fdt, u32 phandle,
> + struct regmap **out_rmap);
> +
> +/** Get regmap instance based on "regmap' property of the specified DT node */
> +int fdt_regmap_get(void *fdt, int nodeoff, struct regmap **out_rmap);
> +
> +#endif
> diff --git a/lib/utils/regmap/Kconfig b/lib/utils/regmap/Kconfig
> index 8db5c8b..b1ff501 100644
> --- a/lib/utils/regmap/Kconfig
> +++ b/lib/utils/regmap/Kconfig
> @@ -2,6 +2,12 @@
>
> menu "Regmap Support"
>
> +config FDT_REGMAP
> + bool "FDT based regmap drivers"
> + depends on FDT
> + select REGMAP
> + default n
> +
> config REGMAP
> bool "Regmap support"
> default n
> diff --git a/lib/utils/regmap/fdt_regmap.c b/lib/utils/regmap/fdt_regmap.c
> new file mode 100644
> index 0000000..fffac1d
> --- /dev/null
> +++ b/lib/utils/regmap/fdt_regmap.c
> @@ -0,0 +1,94 @@
> +/*
> + * SPDX-License-Identifier: BSD-2-Clause
> + *
> + * Copyright (c) 2023 Ventana Micro Systems Inc.
> + *
> + * Authors:
> + * Anup Patel <apatel at ventanamicro.com>
> + */
> +
> +#include <libfdt.h>
> +#include <sbi/sbi_error.h>
> +#include <sbi_utils/fdt/fdt_helper.h>
> +#include <sbi_utils/regmap/fdt_regmap.h>
> +
> +/* List of FDT regmap drivers generated at compile time */
> +extern struct fdt_regmap *fdt_regmap_drivers[];
> +extern unsigned long fdt_regmap_drivers_size;
> +
> +static int fdt_regmap_init(void *fdt, int nodeoff, u32 phandle)
> +{
> + int pos, rc;
> + struct fdt_regmap *drv;
> + const struct fdt_match *match;
> +
> + /* Try all I2C drivers one-by-one */
> + for (pos = 0; pos < fdt_regmap_drivers_size; pos++) {
> + drv = fdt_regmap_drivers[pos];
> + match = fdt_match_node(fdt, nodeoff, drv->match_table);
> + if (match && drv->init) {
> + rc = drv->init(fdt, nodeoff, phandle, match);
> + if (rc == SBI_ENODEV)
> + continue;
> + if (rc)
> + return rc;
> + return 0;
> + }
> + }
> +
> + return SBI_ENOSYS;
> +}
> +
> +static int fdt_regmap_find(void *fdt, int nodeoff, u32 phandle,
> + struct regmap **out_rmap)
> +{
> + int rc;
> + struct regmap *rmap = regmap_find(phandle);
> +
> + if (!rmap) {
> + /* Regmap not found so initialize matching driver */
> + rc = fdt_regmap_init(fdt, nodeoff, phandle);
> + if (rc)
> + return rc;
> +
> + /* Try to find regmap again */
> + rmap = regmap_find(phandle);
> + if (!rmap)
> + return SBI_ENOSYS;
> + }
> +
> + if (out_rmap)
> + *out_rmap = rmap;
> +
> + return 0;
> +}
> +
> +int fdt_regmap_get_by_phandle(void *fdt, u32 phandle,
> + struct regmap **out_rmap)
> +{
> + int pnodeoff;
> +
> + if (!fdt || !out_rmap)
> + return SBI_EINVAL;
> +
> + pnodeoff = fdt_node_offset_by_phandle(fdt, phandle);
> + if (pnodeoff < 0)
> + return pnodeoff;
> +
> + return fdt_regmap_find(fdt, pnodeoff, phandle, out_rmap);
> +}
> +
> +int fdt_regmap_get(void *fdt, int nodeoff, struct regmap **out_rmap)
> +{
> + int len;
> + const fdt32_t *val;
> +
> + if (!fdt || (nodeoff < 0) || !out_rmap)
> + return SBI_EINVAL;
> +
> + val = fdt_getprop(fdt, nodeoff, "regmap", &len);
> + if (!val)
> + return SBI_ENOENT;
> +
> + return fdt_regmap_get_by_phandle(fdt, fdt32_to_cpu(*val), out_rmap);
> +}
> diff --git a/lib/utils/regmap/fdt_regmap_drivers.carray b/lib/utils/regmap/fdt_regmap_drivers.carray
> new file mode 100644
> index 0000000..c2f1c9d
> --- /dev/null
> +++ b/lib/utils/regmap/fdt_regmap_drivers.carray
> @@ -0,0 +1,3 @@
> +HEADER: sbi_utils/regmap/fdt_regmap.h
> +TYPE: struct fdt_regmap
> +NAME: fdt_regmap_drivers
> diff --git a/lib/utils/regmap/objects.mk b/lib/utils/regmap/objects.mk
> index 5d1bead..5ce2373 100644
> --- a/lib/utils/regmap/objects.mk
> +++ b/lib/utils/regmap/objects.mk
> @@ -7,4 +7,7 @@
> # Anup Patel <apatel at ventanamicro.com>
> #
>
> +libsbiutils-objs-$(CONFIG_FDT_REGMAP) += regmap/fdt_regmap.o
> +libsbiutils-objs-$(CONFIG_FDT_REGMAP) += regmap/fdt_regmap_drivers.o
> +
> libsbiutils-objs-$(CONFIG_REGMAP) += regmap/regmap.o
> diff --git a/platform/generic/configs/defconfig b/platform/generic/configs/defconfig
> index d8793ea..ad585e3 100644
> --- a/platform/generic/configs/defconfig
> +++ b/platform/generic/configs/defconfig
> @@ -18,7 +18,7 @@ CONFIG_FDT_IRQCHIP=y
> CONFIG_FDT_IRQCHIP_APLIC=y
> CONFIG_FDT_IRQCHIP_IMSIC=y
> CONFIG_FDT_IRQCHIP_PLIC=y
> -CONFIG_REGMAP=y
> +CONFIG_FDT_REGMAP=y
> CONFIG_FDT_RESET=y
> CONFIG_FDT_RESET_ATCWDT200=y
> CONFIG_FDT_RESET_GPIO=y
> --
> 2.34.1
>
>
More information about the opensbi
mailing list