From 74a161d20ef60bb8db333a5203284796429ecb99 Mon Sep 17 00:00:00 2001 From: Jon Hunter Date: Wed, 15 Jul 2026 12:10:37 +0100 Subject: [PATCH 1/5] soc/tegra: pmc: Don't register sys-off handler for multi-socket devices The kernel does not permit a device to register multiple sys-off handlers for non-default priority levels. Hence, for multi-socket Tegra devices, registering the sys-off handler in the Tegra PMC driver (which uses the low priority level) more than once fails. The Tegra PMC sys-off handler is supported for all current generations of the Tegra SoC, however, it is only used as a low priority handler if everything else fails. For example, on Tegra264 the EFI reboot handler is called to restart the device. Therefore, for multi-socket devices, skip the registering of the sys-off handler to because this is not critical. Signed-off-by: Jon Hunter Signed-off-by: Thierry Reding --- drivers/soc/tegra/pmc.c | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/drivers/soc/tegra/pmc.c b/drivers/soc/tegra/pmc.c index f419a5395545..41ed716d5857 100644 --- a/drivers/soc/tegra/pmc.c +++ b/drivers/soc/tegra/pmc.c @@ -3074,15 +3074,18 @@ static int tegra_pmc_probe(struct platform_device *pdev) } } - err = devm_register_sys_off_handler(&pdev->dev, - SYS_OFF_MODE_RESTART, - SYS_OFF_PRIO_LOW, - tegra_pmc_restart_handler, - pmc); - if (err) { - dev_err(&pdev->dev, "failed to register sys-off handler: %d\n", - err); - return err; + if (dev_to_node(&pdev->dev) == NUMA_NO_NODE) { + err = devm_register_sys_off_handler(&pdev->dev, + SYS_OFF_MODE_RESTART, + SYS_OFF_PRIO_LOW, + tegra_pmc_restart_handler, + pmc); + if (err) { + dev_err(&pdev->dev, + "failed to register sys-off handler: %d\n", + err); + return err; + } } /* From b46a43e6c68860ebf843c2138e30553c84083ff7 Mon Sep 17 00:00:00 2001 From: Pan Chuang Date: Thu, 23 Jul 2026 10:37:58 +0800 Subject: [PATCH 2/5] soc/tegra: cbb: Remove redundant dev_err() Since commit 55b48e23f5c4 ("genirq/devres: Add error handling in devm_request_*_irq()"), devm_request_irq() automatically logs detailed error messages on failure. Remove the now-redundant driver-specific dev_err() calls. Signed-off-by: Pan Chuang Reviewed-by: Mikko Perttunen Signed-off-by: Thierry Reding --- drivers/soc/tegra/cbb/tegra194-cbb.c | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/drivers/soc/tegra/cbb/tegra194-cbb.c b/drivers/soc/tegra/cbb/tegra194-cbb.c index 2f69e104c838..69ef929e04f8 100644 --- a/drivers/soc/tegra/cbb/tegra194-cbb.c +++ b/drivers/soc/tegra/cbb/tegra194-cbb.c @@ -2072,20 +2072,15 @@ static int tegra194_cbb_interrupt_enable(struct tegra_cbb *cbb) if (priv->sec_irq) { err = devm_request_irq(dev, priv->sec_irq, tegra194_cbb_err_isr, 0, dev_name(dev), priv); - if (err) { - dev_err(dev, "failed to register interrupt %u: %d\n", priv->sec_irq, err); + if (err) return err; - } } if (priv->nonsec_irq) { err = devm_request_irq(dev, priv->nonsec_irq, tegra194_cbb_err_isr, 0, dev_name(dev), priv); - if (err) { - dev_err(dev, "failed to register interrupt %u: %d\n", priv->nonsec_irq, - err); + if (err) return err; - } } return 0; From 43e7ae814c981f0ecdc365746a752a094415a8b7 Mon Sep 17 00:00:00 2001 From: Kartik Rajput Date: Thu, 14 May 2026 10:42:52 +0530 Subject: [PATCH 3/5] soc/tegra: fuse: Do not use fuse data as entropy source MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fuse values are static and device-unique but not secret. Using them as an entropy source weakens the overall randomness pool because the data is constant and externally observable over the device’s lifetime. Stop feeding fuse data into the kernel’s randomness subsystem. Signed-off-by: Kartik Rajput Signed-off-by: Thierry Reding --- drivers/soc/tegra/fuse/fuse-tegra30.c | 24 ------------------------ 1 file changed, 24 deletions(-) diff --git a/drivers/soc/tegra/fuse/fuse-tegra30.c b/drivers/soc/tegra/fuse/fuse-tegra30.c index 524fa1b0cd3d..2fad8b13a3b9 100644 --- a/drivers/soc/tegra/fuse/fuse-tegra30.c +++ b/drivers/soc/tegra/fuse/fuse-tegra30.c @@ -64,28 +64,6 @@ static u32 tegra30_fuse_read(struct tegra_fuse *fuse, unsigned int offset) return value; } -static void __init tegra30_fuse_add_randomness(void) -{ - u32 randomness[12]; - - randomness[0] = tegra_sku_info.sku_id; - randomness[1] = tegra_read_straps(); - randomness[2] = tegra_read_chipid(); - randomness[3] = tegra_sku_info.cpu_process_id << 16; - randomness[3] |= tegra_sku_info.soc_process_id; - randomness[4] = tegra_sku_info.cpu_speedo_id << 16; - randomness[4] |= tegra_sku_info.soc_speedo_id; - randomness[5] = tegra_fuse_read_early(FUSE_VENDOR_CODE); - randomness[6] = tegra_fuse_read_early(FUSE_FAB_CODE); - randomness[7] = tegra_fuse_read_early(FUSE_LOT_CODE_0); - randomness[8] = tegra_fuse_read_early(FUSE_LOT_CODE_1); - randomness[9] = tegra_fuse_read_early(FUSE_WAFER_ID); - randomness[10] = tegra_fuse_read_early(FUSE_X_COORDINATE); - randomness[11] = tegra_fuse_read_early(FUSE_Y_COORDINATE); - - add_device_randomness(randomness, sizeof(randomness)); -} - static void __init tegra30_fuse_init(struct tegra_fuse *fuse) { fuse->read_early = tegra30_fuse_read_early; @@ -95,8 +73,6 @@ static void __init tegra30_fuse_init(struct tegra_fuse *fuse) if (fuse->soc->speedo_init) fuse->soc->speedo_init(&tegra_sku_info); - - tegra30_fuse_add_randomness(); } #endif From 863515d1eb678c7c17bb4cc19819ba2992400022 Mon Sep 17 00:00:00 2001 From: Kartik Rajput Date: Thu, 14 May 2026 11:05:18 +0530 Subject: [PATCH 4/5] soc/tegra: fuse: Use device-specific instance in suspend/resume MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Avoid using the default fuse instance in suspend/resume callbacks, as it always runs the suspend/resume callbacks for the default instance rather than the device’s own. Get the correct fuse instance by using `dev_get_drvdata()`. Signed-off-by: Kartik Rajput Signed-off-by: Thierry Reding --- drivers/soc/tegra/fuse/fuse-tegra.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/drivers/soc/tegra/fuse/fuse-tegra.c b/drivers/soc/tegra/fuse/fuse-tegra.c index 071cd9620634..77a54124e9f4 100644 --- a/drivers/soc/tegra/fuse/fuse-tegra.c +++ b/drivers/soc/tegra/fuse/fuse-tegra.c @@ -259,6 +259,7 @@ static int tegra_fuse_probe(struct platform_device *pdev) static int __maybe_unused tegra_fuse_runtime_resume(struct device *dev) { + struct tegra_fuse *fuse = dev_get_drvdata(dev); int err; err = clk_prepare_enable(fuse->clk); @@ -272,6 +273,8 @@ static int __maybe_unused tegra_fuse_runtime_resume(struct device *dev) static int __maybe_unused tegra_fuse_runtime_suspend(struct device *dev) { + struct tegra_fuse *fuse = dev_get_drvdata(dev); + clk_disable_unprepare(fuse->clk); return 0; @@ -279,6 +282,7 @@ static int __maybe_unused tegra_fuse_runtime_suspend(struct device *dev) static int __maybe_unused tegra_fuse_suspend(struct device *dev) { + struct tegra_fuse *fuse = dev_get_drvdata(dev); int ret; /* @@ -295,6 +299,7 @@ static int __maybe_unused tegra_fuse_suspend(struct device *dev) static int __maybe_unused tegra_fuse_resume(struct device *dev) { + struct tegra_fuse *fuse = dev_get_drvdata(dev); int ret = 0; if (fuse->soc->clk_suspend_on) From 97ffe9cb67ccafb4644f820ef68662217b76c224 Mon Sep 17 00:00:00 2001 From: Sasha Levin Date: Sat, 25 Apr 2026 20:03:04 -0400 Subject: [PATCH 5/5] soc/tegra: Add PM dependency to SOC_TEGRA_PMC Kconfig kconfiglint reports: K006: config SOC_TEGRA_PMC selects PM_GENERIC_DOMAINS which depends on PM, but SOC_TEGRA_PMC does not depend on PM SOC_TEGRA_PMC is an internal bool symbol (no prompt) that is selected by ARCH_TEGRA_*_SOC options to enable the Power Management Controller driver. It was originally introduced in commit 5e7d4c652941 ("soc/tegra: Implement Tegra186 PMC support") as a bare `bool` with no selects of its own. Over time, additional selects were added: - Commit 5098e2b95e8e ("soc/tegra: pmc: Select GENERIC_PINCONF") added select GENERIC_PINCONF - Commit 28dbe8231066 ("soc/tegra: pmc: Select IRQ_DOMAIN_HIERARCHY") added select IRQ_DOMAIN_HIERARCHY - Commit f880ee9e9688 ("soc/tegra: pmc: Add core power domain") added select PM_OPP and select PM_GENERIC_DOMAINS to support core power domain voltage scaling PM_GENERIC_DOMAINS is defined in kernel/power/Kconfig as: config PM_GENERIC_DOMAINS bool depends on PM When commit f880ee9e9688 ("soc/tegra: pmc: Add core power domain") added the select, it did not add a corresponding `depends on PM` to SOC_TEGRA_PMC. This was not a functional problem because all callers of SOC_TEGRA_PMC are inside `if ARCH_TEGRA` blocks, and both the ARM32 definition (arch/arm/mach-tegra/Kconfig) and the ARM64 definition (arch/arm64/Kconfig.platforms) of ARCH_TEGRA select PM. Thus PM is always enabled when SOC_TEGRA_PMC is selected in practice. However, the dependency chain is implicit rather than explicit. Add `depends on PM` to SOC_TEGRA_PMC to make the requirement explicit and prevent a theoretical misconfiguration if SOC_TEGRA_PMC were ever selected outside the ARCH_TEGRA context. Assisted-by: Claude:claude-opus-4-6 kconfiglint Signed-off-by: Sasha Levin Signed-off-by: Thierry Reding --- drivers/soc/tegra/Kconfig | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/soc/tegra/Kconfig b/drivers/soc/tegra/Kconfig index 073346c1542b..8b6fdb9ad1ea 100644 --- a/drivers/soc/tegra/Kconfig +++ b/drivers/soc/tegra/Kconfig @@ -171,6 +171,7 @@ config SOC_TEGRA_FLOWCTRL config SOC_TEGRA_PMC bool + depends on PM select GENERIC_PINCONF select IRQ_DOMAIN_HIERARCHY select PM_OPP