From: Keerthy Date: Thu, 27 Jan 2022 12:16:51 +0000 (+0100) Subject: reset: dra7: Add a reset driver X-Git-Url: http://git.dujemihanovic.xyz/?a=commitdiff_plain;h=795b2c476f7dd7ecf9de95d8dca8ef0c8657dde4;p=u-boot.git reset: dra7: Add a reset driver Add a reset driver to bring IPs out of reset. Signed-off-by: Keerthy [Amjad: reset_ops structure member "free" has been renamed to "rfree", use the latter instead] Signed-off-by: Amjad Ouled-Ameur --- diff --git a/MAINTAINERS b/MAINTAINERS index dcdd99e368..d51306910b 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -542,6 +542,7 @@ F: drivers/ram/k3* F: drivers/remoteproc/k3_system_controller.c F: drivers/remoteproc/pruc_rpoc.c F: drivers/remoteproc/ti* +F: drivers/reset/reset-dra7.c F: drivers/reset/reset-ti-sci.c F: drivers/rtc/davinci.c F: drivers/serial/serial_omap.c diff --git a/drivers/reset/Kconfig b/drivers/reset/Kconfig index d73daf5e31..b57714111b 100644 --- a/drivers/reset/Kconfig +++ b/drivers/reset/Kconfig @@ -206,4 +206,10 @@ config RESET_ZYNQMP passing request via Xilinx firmware interface to TF-A and PMU firmware. +config RESET_DRA7 + bool "Support for TI's DRA7 Reset driver" + depends on DM_RESET + help + Support for TI DRA7-RESET subsystem. Basic Assert/Deassert + is supported. endmenu diff --git a/drivers/reset/Makefile b/drivers/reset/Makefile index d69486bdeb..97e3a782c0 100644 --- a/drivers/reset/Makefile +++ b/drivers/reset/Makefile @@ -30,3 +30,4 @@ obj-$(CONFIG_RESET_SYSCON) += reset-syscon.o obj-$(CONFIG_RESET_RASPBERRYPI) += reset-raspberrypi.o obj-$(CONFIG_RESET_SCMI) += reset-scmi.o obj-$(CONFIG_RESET_ZYNQMP) += reset-zynqmp.o +obj-$(CONFIG_RESET_DRA7) += reset-dra7.o diff --git a/drivers/reset/reset-dra7.c b/drivers/reset/reset-dra7.c new file mode 100644 index 0000000000..585f8323c5 --- /dev/null +++ b/drivers/reset/reset-dra7.c @@ -0,0 +1,97 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Texas Instruments DRA7 reset driver + * + * Copyright (C) 2019 Texas Instruments Incorporated - http://www.ti.com/ + * Author: Keerthy + */ + +#include +#include +#include +#include +#include + +struct dra7_reset_priv { + u32 rstctrl; + u32 rstst; + u8 nreset; +}; + +static int dra7_reset_request(struct reset_ctl *reset_ctl) +{ + return 0; +} + +static int dra7_reset_free(struct reset_ctl *reset_ctl) +{ + return 0; +} + +static inline void dra7_reset_rmw(u32 addr, u32 value, u32 mask) +{ + writel(((readl(addr) & (~mask)) | (value & mask)), addr); +} + +static int dra7_reset_deassert(struct reset_ctl *reset_ctl) +{ + struct dra7_reset_priv *priv = dev_get_priv(reset_ctl->dev); + int mask = 1 << reset_ctl->id; + + if (reset_ctl->id < 0 || reset_ctl->id >= priv->nreset) + return -EINVAL; + + dra7_reset_rmw(priv->rstctrl, 0x0, mask); + + while ((readl(priv->rstst) & mask) != mask) + ; + + return 0; +} + +static int dra7_reset_assert(struct reset_ctl *reset_ctl) +{ + struct dra7_reset_priv *priv = dev_get_priv(reset_ctl->dev); + int mask = 1 << reset_ctl->id; + + if (reset_ctl->id < 0 || reset_ctl->id >= priv->nreset) + return -EINVAL; + + dra7_reset_rmw(priv->rstctrl, mask, 0x0); + + return 0; +} + +struct reset_ops dra7_reset_ops = { + .request = dra7_reset_request, + .rfree = dra7_reset_free, + .rst_assert = dra7_reset_assert, + .rst_deassert = dra7_reset_deassert, +}; + +static const struct udevice_id dra7_reset_ids[] = { + { .compatible = "ti,dra7-reset" }, + { } +}; + +static int dra7_reset_probe(struct udevice *dev) +{ + struct dra7_reset_priv *priv = dev_get_priv(dev); + + priv->rstctrl = dev_read_addr(dev); + priv->rstst = priv->rstctrl + 0x4; + priv->nreset = dev_read_u32_default(dev, "ti,nresets", 1); + + dev_info(dev, "dra7-reset successfully probed %s\n", dev->name); + + return 0; +} + +U_BOOT_DRIVER(dra7_reset) = { + .name = "dra7_reset", + .id = UCLASS_RESET, + .of_match = dra7_reset_ids, + .probe = dra7_reset_probe, + .ops = &dra7_reset_ops, + .priv_auto = sizeof(struct dra7_reset_priv), +};