Skip to content

Commit

Permalink
sysreset: tegra: create arch specific sysreset driver
Browse files Browse the repository at this point in the history
Tegra uses built in Power Management Controller (PMC) to perform
CPU reset. Code to perform this was located in mach-tegra, so lest
create DM driver to handle this.

Signed-off-by: Svyatoslav Ryhel <[email protected]>
  • Loading branch information
clamor-s committed Oct 3, 2023
1 parent 8c3c527 commit 49dcdb5
Show file tree
Hide file tree
Showing 3 changed files with 53 additions and 0 deletions.
6 changes: 6 additions & 0 deletions drivers/sysreset/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -137,6 +137,12 @@ config SYSRESET_SOCFPGA_SOC64
This enables the system reset driver support for Intel SOCFPGA
SoC64 SoCs.

config SYSRESET_TEGRA
bool "Tegra PMC system reset driver"
depends on ARCH_TEGRA
help
This enables the system reset ability of PMC used in Tegra SoCs.

config SYSRESET_TI_SCI
bool "TI System Control Interface (TI SCI) system reset driver"
depends on TI_SCI_PROTOCOL
Expand Down
1 change: 1 addition & 0 deletions drivers/sysreset/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ obj-$(CONFIG_SYSRESET_PSCI) += sysreset_psci.o
obj-$(CONFIG_SYSRESET_SBI) += sysreset_sbi.o
obj-$(CONFIG_SYSRESET_SOCFPGA) += sysreset_socfpga.o
obj-$(CONFIG_SYSRESET_SOCFPGA_SOC64) += sysreset_socfpga_soc64.o
obj-$(CONFIG_SYSRESET_TEGRA) += sysreset_tegra.o
obj-$(CONFIG_SYSRESET_TI_SCI) += sysreset-ti-sci.o
obj-$(CONFIG_SYSRESET_SYSCON) += sysreset_syscon.o
obj-$(CONFIG_SYSRESET_WATCHDOG) += sysreset_watchdog.o
Expand Down
46 changes: 46 additions & 0 deletions drivers/sysreset/sysreset_tegra.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
// SPDX-License-Identifier: GPL-2.0+
/*
* Copyright(C) 2023 Svyatoslav Ryhel <[email protected]>
*/

#include <common.h>
#include <dm.h>
#include <errno.h>
#include <sysreset.h>
#include <linux/err.h>
#include <asm/arch-tegra/pmc.h>

static int tegra_sysreset_request(struct udevice *dev,
enum sysreset_t type)
{
u32 value;

switch (type) {
case SYSRESET_WARM:
case SYSRESET_COLD:
/* resets everything but scratch 0 and reset status */
value = tegra_pmc_readl(PMC_CNTRL);
value |= PMC_CNTRL_MAIN_RST;
tegra_pmc_writel(value, PMC_CNTRL);
break;
default:
return -EPROTONOSUPPORT;
}

return -EINPROGRESS;
}

static struct sysreset_ops tegra_sysreset = {
.request = tegra_sysreset_request,
};

U_BOOT_DRIVER(sysreset_tegra) = {
.id = UCLASS_SYSRESET,
.name = "sysreset_tegra",
.ops = &tegra_sysreset,
};

/* Link to Tegra PMC once there is a driver */
U_BOOT_DRVINFO(sysreset_tegra) = {
.name = "sysreset_tegra"
};

0 comments on commit 49dcdb5

Please sign in to comment.