summaryrefslogtreecommitdiff
path: root/drivers/soc/tegra/fuse
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2026-10-22 07:52:50 -1000
committerLinus Torvalds <torvalds@linux-foundation.org>2026-10-22 07:52:50 -1000
commit2e51c645fee243dbcb5cee3eb063b5713317444c (patch)
treeee6bfb3eabdc46763c050c98a7549e504313a286 /drivers/soc/tegra/fuse
parent7b9a0e857b427cdda5a08b662dbea7321e6bb470 (diff)
parent0045cd6b8ab2319e9d8de46e5e329cdc35ce6d05 (diff)
Merge tag 'soc-drivers-7.4' of git://git.kernel.org/pub/scm/linux/kernel/git/soc/soc
Pull SoC driver updates from Arnd Bergmann: "There are lots of minor updates for driver subsystems managed through the soc tree (turris-omnia platform, cache driver, tee drivers, arm-cci, bus, memory) as well as soc vendor specific drivers (starfive, xilinx, microchip, nxp, amlogic, imx, renesas, samsung, ti, nvidia). The more notable changes are: - Larger updates for Qualcomm SoCs including support for SM8950 (Maili) SM8975 (Hawi), Glymur, Shikra, and IPQ5424 - Added SoC support for Exynos5515, Tegra264, Tegra410, R8A774A3, and MT8167 in existing drivers - Arm SCMI firmware driver support for ACPI PCC transport and module autoloading of protocol specific drivers - Apple crash log support for CrgA embedded controller" * tag 'soc-drivers-7.4' of git://git.kernel.org/pub/scm/linux/kernel/git/soc/soc: (176 commits) platform: cznic: turris-omnia-mcu: stop button emulation producers cache: Make cpu_cache_invalidate_memregion() error out if there are no handlers soc: mpfs: use kref cleanup on probe failure arm64: enable HAVE_SHARED_GPIOS for all ARM64 platforms bus: arm-cci: Drop cci-control-port node reference in __cci_ace_get_port() bus: arm-cci: Drop CPU node reference in cci_ace_init_ports() soc: fsl: dpio: Free the IRQ before releasing the I/O object soc: fsl: dpio: Fix cleanup on IRQ registration failure bus: fsl-mc: Annotate fsl_mc_io.portal_virt_addr with __counted_by_ptr bus: fsl-mc: drop the fwnode links of the dpmacs nodes soc: fsl: cpm1: tsa: Fix clock leak in tsa_of_parse_tdms() soc: qcom: geni-se: Drop unused icc_ddr parameter from geni_icc_get() firmware: qcom: scm: Allow QSEECOM on ThinkPad T14s Gen 7 dt-bindings: mailbox: qcom: Document Maili CPUCP mailbox controller dt-bindings: spmi: glymur-spmi-pmic-arb: Add compatible for Qualcomm Maili SoC soc: qcom: pmic_pdcharger_ulog: prevent work requeue during remove ASoC: dt-bindings: qcom,apr: Add modem_apps GLINK channel for shikra firmware: qcom: tzmem: disable SHM bridge for SM7125 platform soc: qcom: ubwc: Add Kalambo UBWC config firmware: qcom: scm: Allow QSEECOM on Kalambo CRD ...
Diffstat (limited to 'drivers/soc/tegra/fuse')
-rw-r--r--drivers/soc/tegra/fuse/fuse-tegra.c12
-rw-r--r--drivers/soc/tegra/fuse/fuse-tegra30.c168
-rw-r--r--drivers/soc/tegra/fuse/fuse.h7
-rw-r--r--drivers/soc/tegra/fuse/speedo-tegra210.c22
-rw-r--r--drivers/soc/tegra/fuse/tegra-apbmisc.c51
5 files changed, 235 insertions, 25 deletions
diff --git a/drivers/soc/tegra/fuse/fuse-tegra.c b/drivers/soc/tegra/fuse/fuse-tegra.c
index 39654964c35c..04075e2b6434 100644
--- a/drivers/soc/tegra/fuse/fuse-tegra.c
+++ b/drivers/soc/tegra/fuse/fuse-tegra.c
@@ -34,6 +34,7 @@ static const char *tegra_revision_name[TEGRA_REVISION_MAX] = {
[TEGRA_REVISION_A03] = "A03",
[TEGRA_REVISION_A03p] = "A03 prime",
[TEGRA_REVISION_A04] = "A04",
+ [TEGRA_REVISION_B01] = "B01",
};
static const char *tegra_platform_name[TEGRA_PLATFORM_MAX] = {
@@ -65,6 +66,9 @@ static struct tegra_fuse *fuse = &(struct tegra_fuse) {
};
static const struct of_device_id tegra_fuse_match[] = {
+#ifdef CONFIG_ARCH_TEGRA_264_SOC
+ { .compatible = "nvidia,tegra264-efuse", .data = &tegra264_fuse_soc },
+#endif
#ifdef CONFIG_ARCH_TEGRA_234_SOC
{ .compatible = "nvidia,tegra234-efuse", .data = &tegra234_fuse_soc },
#endif
@@ -176,6 +180,11 @@ static int tegra_fuse_probe(struct platform_device *pdev)
fuse->soc = &tegra241_fuse_soc;
break;
#endif
+#if defined(CONFIG_ARCH_TEGRA_264_SOC)
+ case TEGRA264:
+ fuse->soc = &tegra264_fuse_soc;
+ break;
+#endif
default:
return dev_err_probe(&pdev->dev, -EINVAL, "Unsupported SoC: %02x\n", chip);
}
@@ -413,7 +422,8 @@ const struct attribute_group tegra_soc_attr_group = {
#if IS_ENABLED(CONFIG_ARCH_TEGRA_194_SOC) || \
IS_ENABLED(CONFIG_ARCH_TEGRA_234_SOC) || \
- IS_ENABLED(CONFIG_ARCH_TEGRA_241_SOC)
+ IS_ENABLED(CONFIG_ARCH_TEGRA_241_SOC) || \
+ IS_ENABLED(CONFIG_ARCH_TEGRA_264_SOC)
static ssize_t platform_show(struct device *dev, struct device_attribute *attr,
char *buf)
{
diff --git a/drivers/soc/tegra/fuse/fuse-tegra30.c b/drivers/soc/tegra/fuse/fuse-tegra30.c
index 2fad8b13a3b9..623848116b69 100644
--- a/drivers/soc/tegra/fuse/fuse-tegra30.c
+++ b/drivers/soc/tegra/fuse/fuse-tegra30.c
@@ -39,7 +39,8 @@
defined(CONFIG_ARCH_TEGRA_186_SOC) || \
defined(CONFIG_ARCH_TEGRA_194_SOC) || \
defined(CONFIG_ARCH_TEGRA_234_SOC) || \
- defined(CONFIG_ARCH_TEGRA_241_SOC)
+ defined(CONFIG_ARCH_TEGRA_241_SOC) || \
+ defined(CONFIG_ARCH_TEGRA_264_SOC)
static u32 tegra30_fuse_read_early(struct tegra_fuse *fuse, unsigned int offset)
{
if (WARN_ON(!fuse->base))
@@ -802,3 +803,168 @@ const struct tegra_fuse_soc tegra241_fuse_soc = {
.soc_attr_group = &tegra194_soc_attr_group,
};
#endif
+
+#ifdef CONFIG_ARCH_TEGRA_264_SOC
+static const struct nvmem_keepout tegra264_fuse_keepouts[] = {
+ { .start = 0x0019c, .end = 0x001a0 },
+ { .start = 0x00308, .end = 0x00310 },
+ { .start = 0x0032c, .end = 0x00334 },
+ { .start = 0x00350, .end = 0x00354 },
+ { .start = 0x00494, .end = 0x0049c },
+ { .start = 0x0078c, .end = 0x00790 },
+ { .start = 0x007a0, .end = 0x007a8 },
+ { .start = 0x007dc, .end = 0x007e4 },
+ { .start = 0x008d8, .end = 0x008dc },
+ { .start = 0x0096c, .end = 0x00970 },
+ { .start = 0x00974, .end = 0x0097c },
+ { .start = 0x009f4, .end = 0x009f8 },
+ { .start = 0x00a14, .end = 0x00a20 },
+ { .start = 0x00a44, .end = 0x00a4c },
+ { .start = 0x00a50, .end = 0x00a58 },
+ { .start = 0x00a5c, .end = 0x00a64 },
+ { .start = 0x00a68, .end = 0x00a70 },
+ { .start = 0x00acc, .end = 0x00ad0 },
+ { .start = 0x00b0c, .end = 0x00b18 },
+ { .start = 0x00c80, .end = 0x00c8c },
+ { .start = 0x00dac, .end = 0x00db4 },
+ { .start = 0x00db8, .end = 0x00dbc },
+ { .start = 0x00e0c, .end = 0x00e10 },
+ { .start = 0x00fd0, .end = 0x01f00 },
+ { .start = 0x01f1c, .end = 0x10064 },
+ { .start = 0x10084, .end = 0x100a0 },
+ { .start = 0x100a4, .end = 0x1019c },
+ { .start = 0x101a0, .end = 0x101cc },
+ { .start = 0x101d0, .end = 0x10308 },
+ { .start = 0x10310, .end = 0x1055c },
+ { .start = 0x1057c, .end = 0x106b0 },
+ { .start = 0x106b4, .end = 0x11008 },
+ { .start = 0x1100c, .end = 0x11018 },
+ { .start = 0x11020, .end = 0x110b8 },
+ { .start = 0x110c4, .end = 0x110c8 },
+ { .start = 0x110e8, .end = 0x110ec },
+ { .start = 0x110f0, .end = 0x11124 },
+ { .start = 0x11128, .end = 0x11168 },
+ { .start = 0x1116c, .end = 0x111b8 },
+ { .start = 0x111bc, .end = 0x111e4 },
+ { .start = 0x111e8, .end = 0x111ec },
+ { .start = 0x111f0, .end = 0x1121c },
+ { .start = 0x11250, .end = 0x1133c },
+ { .start = 0x11340, .end = 0x113c8 },
+ { .start = 0x113d0, .end = 0x11420 },
+ { .start = 0x11430, .end = 0x11440 },
+ { .start = 0x11444, .end = 0x11468 },
+ { .start = 0x1146c, .end = 0x114a8 },
+ { .start = 0x114ac, .end = 0x115cc },
+ { .start = 0x115d0, .end = 0x115dc },
+ { .start = 0x115e0, .end = 0x116b4 },
+ { .start = 0x116bc, .end = 0x11740 },
+ { .start = 0x11744, .end = 0x117b8 },
+ { .start = 0x117bc, .end = 0x11810 },
+ { .start = 0x11814, .end = 0x11850 },
+ { .start = 0x11858, .end = 0x118a0 },
+ { .start = 0x118ac, .end = 0x11b48 },
+ { .start = 0x11b50, .end = 0x11b5c },
+ { .start = 0x11b60, .end = 0x11bf8 },
+ { .start = 0x11bfc, .end = 0x11c18 },
+ { .start = 0x11c40, .end = 0x12000 },
+ { .start = 0x12004, .end = 0x12010 },
+ { .start = 0x12014, .end = 0x120fc },
+ { .start = 0x1211c, .end = 0x12120 },
+ { .start = 0x12124, .end = 0x12144 },
+ { .start = 0x1214c, .end = 0x12300 },
+ { .start = 0x12308, .end = 0x1236c },
+ { .start = 0x12370, .end = 0x126ac },
+ { .start = 0x126b0, .end = 0x12c60 },
+ { .start = 0x12c64, .end = 0x12d94 },
+ { .start = 0x12da4, .end = 0x13004 },
+ { .start = 0x13008, .end = 0x1300c },
+ { .start = 0x13010, .end = 0x13014 },
+ { .start = 0x13018, .end = 0x13020 },
+ { .start = 0x13064, .end = 0x13084 },
+ { .start = 0x130a0, .end = 0x130a4 },
+ { .start = 0x130b8, .end = 0x130c4 },
+ { .start = 0x130c8, .end = 0x130e8 },
+ { .start = 0x130ec, .end = 0x130f0 },
+ { .start = 0x130fc, .end = 0x1311c },
+ { .start = 0x13120, .end = 0x13128 },
+ { .start = 0x13144, .end = 0x1314c },
+ { .start = 0x13168, .end = 0x1316c },
+ { .start = 0x1319c, .end = 0x131a0 },
+ { .start = 0x131ac, .end = 0x131c0 },
+ { .start = 0x131cc, .end = 0x131d0 },
+ { .start = 0x131e4, .end = 0x131e8 },
+ { .start = 0x131ec, .end = 0x131f0 },
+ { .start = 0x1321c, .end = 0x13250 },
+ { .start = 0x132f0, .end = 0x13310 },
+ { .start = 0x1332c, .end = 0x13334 },
+ { .start = 0x1333c, .end = 0x13344 },
+ { .start = 0x13350, .end = 0x13354 },
+ { .start = 0x1336c, .end = 0x13370 },
+ { .start = 0x133ac, .end = 0x133b0 },
+ { .start = 0x133c8, .end = 0x133d0 },
+ { .start = 0x13420, .end = 0x13430 },
+ { .start = 0x13440, .end = 0x13444 },
+ { .start = 0x13468, .end = 0x13470 },
+ { .start = 0x13494, .end = 0x1349c },
+ { .start = 0x134a8, .end = 0x134ac },
+ { .start = 0x13544, .end = 0x1354c },
+ { .start = 0x1355c, .end = 0x1357c },
+ { .start = 0x135cc, .end = 0x135e0 },
+ { .start = 0x135e4, .end = 0x13608 },
+ { .start = 0x1360c, .end = 0x13620 },
+ { .start = 0x136ac, .end = 0x136bc },
+ { .start = 0x136c0, .end = 0x136c8 },
+ { .start = 0x13714, .end = 0x13718 },
+ { .start = 0x13724, .end = 0x13728 },
+ { .start = 0x1372c, .end = 0x13730 },
+ { .start = 0x13734, .end = 0x1373c },
+ { .start = 0x13740, .end = 0x13744 },
+ { .start = 0x13754, .end = 0x13758 },
+ { .start = 0x13760, .end = 0x13784 },
+ { .start = 0x1378c, .end = 0x13790 },
+ { .start = 0x137a0, .end = 0x137a8 },
+ { .start = 0x137b8, .end = 0x137bc },
+ { .start = 0x137dc, .end = 0x137e4 },
+ { .start = 0x137ec, .end = 0x137f0 },
+ { .start = 0x13800, .end = 0x13818 },
+ { .start = 0x13820, .end = 0x13828 },
+ { .start = 0x13830, .end = 0x13858 },
+ { .start = 0x138a0, .end = 0x138b0 },
+ { .start = 0x138d0, .end = 0x138dc },
+ { .start = 0x1396c, .end = 0x13970 },
+ { .start = 0x13974, .end = 0x1397c },
+ { .start = 0x139f4, .end = 0x139f8 },
+ { .start = 0x13a14, .end = 0x13a20 },
+ { .start = 0x13a44, .end = 0x13a4c },
+ { .start = 0x13a50, .end = 0x13a58 },
+ { .start = 0x13a5c, .end = 0x13a64 },
+ { .start = 0x13a68, .end = 0x13a70 },
+ { .start = 0x13acc, .end = 0x13ad8 },
+ { .start = 0x13b0c, .end = 0x13b18 },
+ { .start = 0x13b48, .end = 0x13b50 },
+ { .start = 0x13b5c, .end = 0x13b60 },
+ { .start = 0x13bf8, .end = 0x13bfc },
+ { .start = 0x13c18, .end = 0x13c40 },
+ { .start = 0x13c60, .end = 0x13c64 },
+ { .start = 0x13c74, .end = 0x13c8c },
+ { .start = 0x13d94, .end = 0x13da4 },
+ { .start = 0x13dac, .end = 0x13db4 },
+ { .start = 0x13db8, .end = 0x13dbc },
+ { .start = 0x13df4, .end = 0x13e04 },
+ { .start = 0x13e0c, .end = 0x13e10 },
+};
+
+static const struct tegra_fuse_info tegra264_fuse_info = {
+ .read = tegra30_fuse_read,
+ .size = 0x13eb8,
+};
+
+const struct tegra_fuse_soc tegra264_fuse_soc = {
+ .init = tegra30_fuse_init,
+ .info = &tegra264_fuse_info,
+ .keepouts = tegra264_fuse_keepouts,
+ .num_keepouts = ARRAY_SIZE(tegra264_fuse_keepouts),
+ .soc_attr_group = &tegra194_soc_attr_group,
+ .clk_suspend_on = false,
+};
+#endif
diff --git a/drivers/soc/tegra/fuse/fuse.h b/drivers/soc/tegra/fuse/fuse.h
index 9fee6ad6ad9e..0fb97508db0a 100644
--- a/drivers/soc/tegra/fuse/fuse.h
+++ b/drivers/soc/tegra/fuse/fuse.h
@@ -125,7 +125,8 @@ extern const struct tegra_fuse_soc tegra186_fuse_soc;
#if IS_ENABLED(CONFIG_ARCH_TEGRA_194_SOC) || \
IS_ENABLED(CONFIG_ARCH_TEGRA_234_SOC) || \
- IS_ENABLED(CONFIG_ARCH_TEGRA_241_SOC)
+ IS_ENABLED(CONFIG_ARCH_TEGRA_241_SOC) || \
+ IS_ENABLED(CONFIG_ARCH_TEGRA_264_SOC)
extern const struct attribute_group tegra194_soc_attr_group;
#endif
@@ -141,4 +142,8 @@ extern const struct tegra_fuse_soc tegra234_fuse_soc;
extern const struct tegra_fuse_soc tegra241_fuse_soc;
#endif
+#ifdef CONFIG_ARCH_TEGRA_264_SOC
+extern const struct tegra_fuse_soc tegra264_fuse_soc;
+#endif
+
#endif
diff --git a/drivers/soc/tegra/fuse/speedo-tegra210.c b/drivers/soc/tegra/fuse/speedo-tegra210.c
index 06c2bcbee573..699751f4bd0c 100644
--- a/drivers/soc/tegra/fuse/speedo-tegra210.c
+++ b/drivers/soc/tegra/fuse/speedo-tegra210.c
@@ -65,7 +65,25 @@ static void __init rev_sku_to_speedo_ids(struct tegra_sku_info *sku_info,
sku_info->gpu_speedo_id = 0;
*threshold = THRESHOLD_INDEX_0;
- if (sku_info->revision >= TEGRA_REVISION_A02) {
+ if (sku_info->revision >= TEGRA_REVISION_B01) {
+ sku_info->gpu_speedo_id = 1;
+
+ switch (sku) {
+ case 0x00: /* Engineering SKU */
+ case 0x01: /* Engineering SKU */
+ case 0x83:
+ break;
+
+ case 0x87:
+ sku_info->cpu_speedo_id = 3;
+ break;
+
+ default:
+ pr_err("Tegra210B01: unknown SKU %#04x\n", sku);
+ /* Using the default for the error case */
+ break;
+ }
+ } else if (sku_info->revision >= TEGRA_REVISION_A02) {
switch (sku) {
case 0x00: /* Engineering SKU */
case 0x01: /* Engineering SKU */
@@ -154,7 +172,7 @@ void __init tegra210_init_speedo_data(struct tegra_sku_info *sku_info)
speedo_revision = get_speedo_revision();
pr_info("Speedo Revision %u\n", speedo_revision);
- if (speedo_revision >= 3) {
+ if (sku_info->revision == TEGRA_REVISION_B01 || speedo_revision >= 3) {
sku_info->cpu_speedo_value = cpu_speedo[0];
sku_info->gpu_speedo_value = cpu_speedo[2];
sku_info->soc_speedo_value = soc_speedo[0];
diff --git a/drivers/soc/tegra/fuse/tegra-apbmisc.c b/drivers/soc/tegra/fuse/tegra-apbmisc.c
index f86c88fab168..3ad4629335fe 100644
--- a/drivers/soc/tegra/fuse/tegra-apbmisc.c
+++ b/drivers/soc/tegra/fuse/tegra-apbmisc.c
@@ -167,30 +167,41 @@ static const struct of_device_id apbmisc_match[] __initconst = {
void __init tegra_init_revision(void)
{
- u8 chip_id, minor_rev;
+ u8 chip_id, major_rev, minor_rev;
chip_id = tegra_get_chip_id();
+ major_rev = tegra_get_major_rev();
minor_rev = tegra_get_minor_rev();
- switch (minor_rev) {
- case 1:
- tegra_sku_info.revision = TEGRA_REVISION_A01;
- break;
- case 2:
- tegra_sku_info.revision = TEGRA_REVISION_A02;
- break;
- case 3:
- if (chip_id == TEGRA20 && (tegra_fuse_read_spare(18) ||
- tegra_fuse_read_spare(19)))
- tegra_sku_info.revision = TEGRA_REVISION_A03p;
- else
- tegra_sku_info.revision = TEGRA_REVISION_A03;
- break;
- case 4:
- tegra_sku_info.revision = TEGRA_REVISION_A04;
- break;
- default:
- tegra_sku_info.revision = TEGRA_REVISION_UNKNOWN;
+ if (major_rev > 1) {
+ switch (minor_rev) {
+ case 1:
+ tegra_sku_info.revision = TEGRA_REVISION_B01;
+ break;
+ default:
+ tegra_sku_info.revision = TEGRA_REVISION_UNKNOWN;
+ }
+ } else {
+ switch (minor_rev) {
+ case 1:
+ tegra_sku_info.revision = TEGRA_REVISION_A01;
+ break;
+ case 2:
+ tegra_sku_info.revision = TEGRA_REVISION_A02;
+ break;
+ case 3:
+ if (chip_id == TEGRA20 && (tegra_fuse_read_spare(18) ||
+ tegra_fuse_read_spare(19)))
+ tegra_sku_info.revision = TEGRA_REVISION_A03p;
+ else
+ tegra_sku_info.revision = TEGRA_REVISION_A03;
+ break;
+ case 4:
+ tegra_sku_info.revision = TEGRA_REVISION_A04;
+ break;
+ default:
+ tegra_sku_info.revision = TEGRA_REVISION_UNKNOWN;
+ }
}
tegra_sku_info.sku_id = tegra_fuse_read_early(FUSE_SKU_INFO);