[U-Boot] [PATCH 1/3] reset: add reset driver for HiSilicon platform

Igor Opaniuk igor.opaniuk at linaro.org
Tue Jan 29 21:57:33 UTC 2019


Reviewed-by: Igor Opaniuk <igor.opaniuk at linaro.org>

On Mon, 28 Jan 2019 at 11:15, Shawn Guo <shawn.guo at linaro.org> wrote:
>
> It adds a Driver Model compatible reset driver for HiSlicon platform.
> The driver implements a custom .of_xlate function, and uses .data field
> as reset register offset and .id field as bit shift.
>
> Signed-off-by: Shawn Guo <shawn.guo at linaro.org>
> ---
>  drivers/reset/Kconfig           |  6 +++
>  drivers/reset/Makefile          |  1 +
>  drivers/reset/reset-hisilicon.c | 95 +++++++++++++++++++++++++++++++++
>  3 files changed, 102 insertions(+)
>  create mode 100644 drivers/reset/reset-hisilicon.c
>
> diff --git a/drivers/reset/Kconfig b/drivers/reset/Kconfig
> index a81e76769604..6ec6f39c85f0 100644
> --- a/drivers/reset/Kconfig
> +++ b/drivers/reset/Kconfig
> @@ -121,4 +121,10 @@ config RESET_SUNXI
>           This enables support for common reset driver for
>           Allwinner SoCs.
>
> +config RESET_HISILICON
> +       bool "Reset controller driver for HiSilicon SoCs"
> +       depends on DM_RESET
> +       help
> +         Support for reset controller on HiSilicon SoCs.
> +
>  endmenu
> diff --git a/drivers/reset/Makefile b/drivers/reset/Makefile
> index 4fad7d412985..7fec75bb4923 100644
> --- a/drivers/reset/Makefile
> +++ b/drivers/reset/Makefile
> @@ -19,3 +19,4 @@ obj-$(CONFIG_RESET_MESON) += reset-meson.o
>  obj-$(CONFIG_RESET_SOCFPGA) += reset-socfpga.o
>  obj-$(CONFIG_RESET_MEDIATEK) += reset-mediatek.o
>  obj-$(CONFIG_RESET_SUNXI) += reset-sunxi.o
> +obj-$(CONFIG_RESET_HISILICON) += reset-hisilicon.o
> diff --git a/drivers/reset/reset-hisilicon.c b/drivers/reset/reset-hisilicon.c
> new file mode 100644
> index 000000000000..3a06110f76f3
> --- /dev/null
> +++ b/drivers/reset/reset-hisilicon.c
> @@ -0,0 +1,95 @@
> +// SPDX-License-Identifier: GPL-2.0
> +/*
> + * Copyright (c) 2019, Linaro Limited
> + */
> +
> +#include <asm/io.h>
> +#include <common.h>
> +#include <dm.h>
> +#include <reset-uclass.h>
> +
> +struct hisi_reset_priv {
> +       void __iomem *base;
> +};
> +
> +static int hisi_reset_deassert(struct reset_ctl *rst)
> +{
> +       struct hisi_reset_priv *priv = dev_get_priv(rst->dev);
> +       u32 val;
> +
> +       val = readl(priv->base + rst->data);
> +       val &= ~BIT(rst->id);
> +       writel(val, priv->base + rst->data);
> +
> +       return 0;
> +}
> +
> +static int hisi_reset_assert(struct reset_ctl *rst)
> +{
> +       struct hisi_reset_priv *priv = dev_get_priv(rst->dev);
> +       u32 val;
> +
> +       val = readl(priv->base + rst->data);
> +       val |= BIT(rst->id);
> +       writel(val, priv->base + rst->data);
> +
> +       return 0;
> +}
> +
> +static int hisi_reset_free(struct reset_ctl *rst)
> +{
> +       return 0;
> +}
> +
> +static int hisi_reset_request(struct reset_ctl *rst)
> +{
> +       return 0;
> +}
> +
> +static int hisi_reset_of_xlate(struct reset_ctl *rst,
> +                              struct ofnode_phandle_args *args)
> +{
> +       if (args->args_count != 2) {
> +               debug("Invalid args_count: %d\n", args->args_count);
> +               return -EINVAL;
> +       }
> +
> +       /* We use .data field as register offset and .id field as bit shift. */
> +       rst->data = args->args[0];
> +       rst->id = args->args[1];
> +
> +       return 0;
> +}
> +
> +static const struct reset_ops hisi_reset_reset_ops = {
> +       .of_xlate = hisi_reset_of_xlate,
> +       .request = hisi_reset_request,
> +       .free = hisi_reset_free,
> +       .rst_assert = hisi_reset_assert,
> +       .rst_deassert = hisi_reset_deassert,
> +};
> +
> +static const struct udevice_id hisi_reset_ids[] = {
> +       { .compatible = "hisilicon,hi3798cv200-crg" },
> +       { }
> +};
> +
> +static int hisi_reset_probe(struct udevice *dev)
> +{
> +       struct hisi_reset_priv *priv = dev_get_priv(dev);
> +
> +       priv->base = dev_remap_addr(dev);
> +       if (!priv->base)
> +               return -ENOMEM;
> +
> +       return 0;
> +}
> +
> +U_BOOT_DRIVER(hisi_reset) = {
> +       .name = "hisilicon_reset",
> +       .id = UCLASS_RESET,
> +       .of_match = hisi_reset_ids,
> +       .ops = &hisi_reset_reset_ops,
> +       .probe = hisi_reset_probe,
> +       .priv_auto_alloc_size = sizeof(struct hisi_reset_priv),
> +};
> --
> 2.18.0
>


-- 
Regards,
Igor Opaniuk


More information about the U-Boot mailing list