18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * Copyright (c) 2013-2014, NVIDIA CORPORATION. All rights reserved. 48c2ecf20Sopenharmony_ci */ 58c2ecf20Sopenharmony_ci 68c2ecf20Sopenharmony_ci#include <linux/device.h> 78c2ecf20Sopenharmony_ci#include <linux/clk.h> 88c2ecf20Sopenharmony_ci#include <linux/err.h> 98c2ecf20Sopenharmony_ci#include <linux/io.h> 108c2ecf20Sopenharmony_ci#include <linux/kernel.h> 118c2ecf20Sopenharmony_ci#include <linux/nvmem-consumer.h> 128c2ecf20Sopenharmony_ci#include <linux/of_device.h> 138c2ecf20Sopenharmony_ci#include <linux/of_address.h> 148c2ecf20Sopenharmony_ci#include <linux/platform_device.h> 158c2ecf20Sopenharmony_ci#include <linux/random.h> 168c2ecf20Sopenharmony_ci 178c2ecf20Sopenharmony_ci#include <soc/tegra/fuse.h> 188c2ecf20Sopenharmony_ci 198c2ecf20Sopenharmony_ci#include "fuse.h" 208c2ecf20Sopenharmony_ci 218c2ecf20Sopenharmony_ci#define FUSE_BEGIN 0x100 228c2ecf20Sopenharmony_ci 238c2ecf20Sopenharmony_ci/* Tegra30 and later */ 248c2ecf20Sopenharmony_ci#define FUSE_VENDOR_CODE 0x100 258c2ecf20Sopenharmony_ci#define FUSE_FAB_CODE 0x104 268c2ecf20Sopenharmony_ci#define FUSE_LOT_CODE_0 0x108 278c2ecf20Sopenharmony_ci#define FUSE_LOT_CODE_1 0x10c 288c2ecf20Sopenharmony_ci#define FUSE_WAFER_ID 0x110 298c2ecf20Sopenharmony_ci#define FUSE_X_COORDINATE 0x114 308c2ecf20Sopenharmony_ci#define FUSE_Y_COORDINATE 0x118 318c2ecf20Sopenharmony_ci 328c2ecf20Sopenharmony_ci#define FUSE_HAS_REVISION_INFO BIT(0) 338c2ecf20Sopenharmony_ci 348c2ecf20Sopenharmony_ci#if defined(CONFIG_ARCH_TEGRA_3x_SOC) || \ 358c2ecf20Sopenharmony_ci defined(CONFIG_ARCH_TEGRA_114_SOC) || \ 368c2ecf20Sopenharmony_ci defined(CONFIG_ARCH_TEGRA_124_SOC) || \ 378c2ecf20Sopenharmony_ci defined(CONFIG_ARCH_TEGRA_132_SOC) || \ 388c2ecf20Sopenharmony_ci defined(CONFIG_ARCH_TEGRA_210_SOC) || \ 398c2ecf20Sopenharmony_ci defined(CONFIG_ARCH_TEGRA_186_SOC) || \ 408c2ecf20Sopenharmony_ci defined(CONFIG_ARCH_TEGRA_194_SOC) || \ 418c2ecf20Sopenharmony_ci defined(CONFIG_ARCH_TEGRA_234_SOC) 428c2ecf20Sopenharmony_cistatic u32 tegra30_fuse_read_early(struct tegra_fuse *fuse, unsigned int offset) 438c2ecf20Sopenharmony_ci{ 448c2ecf20Sopenharmony_ci if (WARN_ON(!fuse->base)) 458c2ecf20Sopenharmony_ci return 0; 468c2ecf20Sopenharmony_ci 478c2ecf20Sopenharmony_ci return readl_relaxed(fuse->base + FUSE_BEGIN + offset); 488c2ecf20Sopenharmony_ci} 498c2ecf20Sopenharmony_ci 508c2ecf20Sopenharmony_cistatic u32 tegra30_fuse_read(struct tegra_fuse *fuse, unsigned int offset) 518c2ecf20Sopenharmony_ci{ 528c2ecf20Sopenharmony_ci u32 value; 538c2ecf20Sopenharmony_ci int err; 548c2ecf20Sopenharmony_ci 558c2ecf20Sopenharmony_ci err = clk_prepare_enable(fuse->clk); 568c2ecf20Sopenharmony_ci if (err < 0) { 578c2ecf20Sopenharmony_ci dev_err(fuse->dev, "failed to enable FUSE clock: %d\n", err); 588c2ecf20Sopenharmony_ci return 0; 598c2ecf20Sopenharmony_ci } 608c2ecf20Sopenharmony_ci 618c2ecf20Sopenharmony_ci value = readl_relaxed(fuse->base + FUSE_BEGIN + offset); 628c2ecf20Sopenharmony_ci 638c2ecf20Sopenharmony_ci clk_disable_unprepare(fuse->clk); 648c2ecf20Sopenharmony_ci 658c2ecf20Sopenharmony_ci return value; 668c2ecf20Sopenharmony_ci} 678c2ecf20Sopenharmony_ci 688c2ecf20Sopenharmony_cistatic void __init tegra30_fuse_add_randomness(void) 698c2ecf20Sopenharmony_ci{ 708c2ecf20Sopenharmony_ci u32 randomness[12]; 718c2ecf20Sopenharmony_ci 728c2ecf20Sopenharmony_ci randomness[0] = tegra_sku_info.sku_id; 738c2ecf20Sopenharmony_ci randomness[1] = tegra_read_straps(); 748c2ecf20Sopenharmony_ci randomness[2] = tegra_read_chipid(); 758c2ecf20Sopenharmony_ci randomness[3] = tegra_sku_info.cpu_process_id << 16; 768c2ecf20Sopenharmony_ci randomness[3] |= tegra_sku_info.soc_process_id; 778c2ecf20Sopenharmony_ci randomness[4] = tegra_sku_info.cpu_speedo_id << 16; 788c2ecf20Sopenharmony_ci randomness[4] |= tegra_sku_info.soc_speedo_id; 798c2ecf20Sopenharmony_ci randomness[5] = tegra_fuse_read_early(FUSE_VENDOR_CODE); 808c2ecf20Sopenharmony_ci randomness[6] = tegra_fuse_read_early(FUSE_FAB_CODE); 818c2ecf20Sopenharmony_ci randomness[7] = tegra_fuse_read_early(FUSE_LOT_CODE_0); 828c2ecf20Sopenharmony_ci randomness[8] = tegra_fuse_read_early(FUSE_LOT_CODE_1); 838c2ecf20Sopenharmony_ci randomness[9] = tegra_fuse_read_early(FUSE_WAFER_ID); 848c2ecf20Sopenharmony_ci randomness[10] = tegra_fuse_read_early(FUSE_X_COORDINATE); 858c2ecf20Sopenharmony_ci randomness[11] = tegra_fuse_read_early(FUSE_Y_COORDINATE); 868c2ecf20Sopenharmony_ci 878c2ecf20Sopenharmony_ci add_device_randomness(randomness, sizeof(randomness)); 888c2ecf20Sopenharmony_ci} 898c2ecf20Sopenharmony_ci 908c2ecf20Sopenharmony_cistatic void __init tegra30_fuse_init(struct tegra_fuse *fuse) 918c2ecf20Sopenharmony_ci{ 928c2ecf20Sopenharmony_ci fuse->read_early = tegra30_fuse_read_early; 938c2ecf20Sopenharmony_ci fuse->read = tegra30_fuse_read; 948c2ecf20Sopenharmony_ci 958c2ecf20Sopenharmony_ci tegra_init_revision(); 968c2ecf20Sopenharmony_ci 978c2ecf20Sopenharmony_ci if (fuse->soc->speedo_init) 988c2ecf20Sopenharmony_ci fuse->soc->speedo_init(&tegra_sku_info); 998c2ecf20Sopenharmony_ci 1008c2ecf20Sopenharmony_ci tegra30_fuse_add_randomness(); 1018c2ecf20Sopenharmony_ci} 1028c2ecf20Sopenharmony_ci#endif 1038c2ecf20Sopenharmony_ci 1048c2ecf20Sopenharmony_ci#ifdef CONFIG_ARCH_TEGRA_3x_SOC 1058c2ecf20Sopenharmony_cistatic const struct tegra_fuse_info tegra30_fuse_info = { 1068c2ecf20Sopenharmony_ci .read = tegra30_fuse_read, 1078c2ecf20Sopenharmony_ci .size = 0x2a4, 1088c2ecf20Sopenharmony_ci .spare = 0x144, 1098c2ecf20Sopenharmony_ci}; 1108c2ecf20Sopenharmony_ci 1118c2ecf20Sopenharmony_ciconst struct tegra_fuse_soc tegra30_fuse_soc = { 1128c2ecf20Sopenharmony_ci .init = tegra30_fuse_init, 1138c2ecf20Sopenharmony_ci .speedo_init = tegra30_init_speedo_data, 1148c2ecf20Sopenharmony_ci .info = &tegra30_fuse_info, 1158c2ecf20Sopenharmony_ci .soc_attr_group = &tegra_soc_attr_group, 1168c2ecf20Sopenharmony_ci}; 1178c2ecf20Sopenharmony_ci#endif 1188c2ecf20Sopenharmony_ci 1198c2ecf20Sopenharmony_ci#ifdef CONFIG_ARCH_TEGRA_114_SOC 1208c2ecf20Sopenharmony_cistatic const struct tegra_fuse_info tegra114_fuse_info = { 1218c2ecf20Sopenharmony_ci .read = tegra30_fuse_read, 1228c2ecf20Sopenharmony_ci .size = 0x2a0, 1238c2ecf20Sopenharmony_ci .spare = 0x180, 1248c2ecf20Sopenharmony_ci}; 1258c2ecf20Sopenharmony_ci 1268c2ecf20Sopenharmony_ciconst struct tegra_fuse_soc tegra114_fuse_soc = { 1278c2ecf20Sopenharmony_ci .init = tegra30_fuse_init, 1288c2ecf20Sopenharmony_ci .speedo_init = tegra114_init_speedo_data, 1298c2ecf20Sopenharmony_ci .info = &tegra114_fuse_info, 1308c2ecf20Sopenharmony_ci .soc_attr_group = &tegra_soc_attr_group, 1318c2ecf20Sopenharmony_ci}; 1328c2ecf20Sopenharmony_ci#endif 1338c2ecf20Sopenharmony_ci 1348c2ecf20Sopenharmony_ci#if defined(CONFIG_ARCH_TEGRA_124_SOC) || defined(CONFIG_ARCH_TEGRA_132_SOC) 1358c2ecf20Sopenharmony_cistatic const struct nvmem_cell_lookup tegra124_fuse_lookups[] = { 1368c2ecf20Sopenharmony_ci { 1378c2ecf20Sopenharmony_ci .nvmem_name = "fuse", 1388c2ecf20Sopenharmony_ci .cell_name = "xusb-pad-calibration", 1398c2ecf20Sopenharmony_ci .dev_id = "7009f000.padctl", 1408c2ecf20Sopenharmony_ci .con_id = "calibration", 1418c2ecf20Sopenharmony_ci }, { 1428c2ecf20Sopenharmony_ci .nvmem_name = "fuse", 1438c2ecf20Sopenharmony_ci .cell_name = "sata-calibration", 1448c2ecf20Sopenharmony_ci .dev_id = "70020000.sata", 1458c2ecf20Sopenharmony_ci .con_id = "calibration", 1468c2ecf20Sopenharmony_ci }, { 1478c2ecf20Sopenharmony_ci .nvmem_name = "fuse", 1488c2ecf20Sopenharmony_ci .cell_name = "tsensor-common", 1498c2ecf20Sopenharmony_ci .dev_id = "700e2000.thermal-sensor", 1508c2ecf20Sopenharmony_ci .con_id = "common", 1518c2ecf20Sopenharmony_ci }, { 1528c2ecf20Sopenharmony_ci .nvmem_name = "fuse", 1538c2ecf20Sopenharmony_ci .cell_name = "tsensor-realignment", 1548c2ecf20Sopenharmony_ci .dev_id = "700e2000.thermal-sensor", 1558c2ecf20Sopenharmony_ci .con_id = "realignment", 1568c2ecf20Sopenharmony_ci }, { 1578c2ecf20Sopenharmony_ci .nvmem_name = "fuse", 1588c2ecf20Sopenharmony_ci .cell_name = "tsensor-cpu0", 1598c2ecf20Sopenharmony_ci .dev_id = "700e2000.thermal-sensor", 1608c2ecf20Sopenharmony_ci .con_id = "cpu0", 1618c2ecf20Sopenharmony_ci }, { 1628c2ecf20Sopenharmony_ci .nvmem_name = "fuse", 1638c2ecf20Sopenharmony_ci .cell_name = "tsensor-cpu1", 1648c2ecf20Sopenharmony_ci .dev_id = "700e2000.thermal-sensor", 1658c2ecf20Sopenharmony_ci .con_id = "cpu1", 1668c2ecf20Sopenharmony_ci }, { 1678c2ecf20Sopenharmony_ci .nvmem_name = "fuse", 1688c2ecf20Sopenharmony_ci .cell_name = "tsensor-cpu2", 1698c2ecf20Sopenharmony_ci .dev_id = "700e2000.thermal-sensor", 1708c2ecf20Sopenharmony_ci .con_id = "cpu2", 1718c2ecf20Sopenharmony_ci }, { 1728c2ecf20Sopenharmony_ci .nvmem_name = "fuse", 1738c2ecf20Sopenharmony_ci .cell_name = "tsensor-cpu3", 1748c2ecf20Sopenharmony_ci .dev_id = "700e2000.thermal-sensor", 1758c2ecf20Sopenharmony_ci .con_id = "cpu3", 1768c2ecf20Sopenharmony_ci }, { 1778c2ecf20Sopenharmony_ci .nvmem_name = "fuse", 1788c2ecf20Sopenharmony_ci .cell_name = "tsensor-mem0", 1798c2ecf20Sopenharmony_ci .dev_id = "700e2000.thermal-sensor", 1808c2ecf20Sopenharmony_ci .con_id = "mem0", 1818c2ecf20Sopenharmony_ci }, { 1828c2ecf20Sopenharmony_ci .nvmem_name = "fuse", 1838c2ecf20Sopenharmony_ci .cell_name = "tsensor-mem1", 1848c2ecf20Sopenharmony_ci .dev_id = "700e2000.thermal-sensor", 1858c2ecf20Sopenharmony_ci .con_id = "mem1", 1868c2ecf20Sopenharmony_ci }, { 1878c2ecf20Sopenharmony_ci .nvmem_name = "fuse", 1888c2ecf20Sopenharmony_ci .cell_name = "tsensor-gpu", 1898c2ecf20Sopenharmony_ci .dev_id = "700e2000.thermal-sensor", 1908c2ecf20Sopenharmony_ci .con_id = "gpu", 1918c2ecf20Sopenharmony_ci }, { 1928c2ecf20Sopenharmony_ci .nvmem_name = "fuse", 1938c2ecf20Sopenharmony_ci .cell_name = "tsensor-pllx", 1948c2ecf20Sopenharmony_ci .dev_id = "700e2000.thermal-sensor", 1958c2ecf20Sopenharmony_ci .con_id = "pllx", 1968c2ecf20Sopenharmony_ci }, 1978c2ecf20Sopenharmony_ci}; 1988c2ecf20Sopenharmony_ci 1998c2ecf20Sopenharmony_cistatic const struct tegra_fuse_info tegra124_fuse_info = { 2008c2ecf20Sopenharmony_ci .read = tegra30_fuse_read, 2018c2ecf20Sopenharmony_ci .size = 0x300, 2028c2ecf20Sopenharmony_ci .spare = 0x200, 2038c2ecf20Sopenharmony_ci}; 2048c2ecf20Sopenharmony_ci 2058c2ecf20Sopenharmony_ciconst struct tegra_fuse_soc tegra124_fuse_soc = { 2068c2ecf20Sopenharmony_ci .init = tegra30_fuse_init, 2078c2ecf20Sopenharmony_ci .speedo_init = tegra124_init_speedo_data, 2088c2ecf20Sopenharmony_ci .info = &tegra124_fuse_info, 2098c2ecf20Sopenharmony_ci .lookups = tegra124_fuse_lookups, 2108c2ecf20Sopenharmony_ci .num_lookups = ARRAY_SIZE(tegra124_fuse_lookups), 2118c2ecf20Sopenharmony_ci .soc_attr_group = &tegra_soc_attr_group, 2128c2ecf20Sopenharmony_ci}; 2138c2ecf20Sopenharmony_ci#endif 2148c2ecf20Sopenharmony_ci 2158c2ecf20Sopenharmony_ci#if defined(CONFIG_ARCH_TEGRA_210_SOC) 2168c2ecf20Sopenharmony_cistatic const struct nvmem_cell_lookup tegra210_fuse_lookups[] = { 2178c2ecf20Sopenharmony_ci { 2188c2ecf20Sopenharmony_ci .nvmem_name = "fuse", 2198c2ecf20Sopenharmony_ci .cell_name = "tsensor-cpu1", 2208c2ecf20Sopenharmony_ci .dev_id = "700e2000.thermal-sensor", 2218c2ecf20Sopenharmony_ci .con_id = "cpu1", 2228c2ecf20Sopenharmony_ci }, { 2238c2ecf20Sopenharmony_ci .nvmem_name = "fuse", 2248c2ecf20Sopenharmony_ci .cell_name = "tsensor-cpu2", 2258c2ecf20Sopenharmony_ci .dev_id = "700e2000.thermal-sensor", 2268c2ecf20Sopenharmony_ci .con_id = "cpu2", 2278c2ecf20Sopenharmony_ci }, { 2288c2ecf20Sopenharmony_ci .nvmem_name = "fuse", 2298c2ecf20Sopenharmony_ci .cell_name = "tsensor-cpu0", 2308c2ecf20Sopenharmony_ci .dev_id = "700e2000.thermal-sensor", 2318c2ecf20Sopenharmony_ci .con_id = "cpu0", 2328c2ecf20Sopenharmony_ci }, { 2338c2ecf20Sopenharmony_ci .nvmem_name = "fuse", 2348c2ecf20Sopenharmony_ci .cell_name = "xusb-pad-calibration", 2358c2ecf20Sopenharmony_ci .dev_id = "7009f000.padctl", 2368c2ecf20Sopenharmony_ci .con_id = "calibration", 2378c2ecf20Sopenharmony_ci }, { 2388c2ecf20Sopenharmony_ci .nvmem_name = "fuse", 2398c2ecf20Sopenharmony_ci .cell_name = "tsensor-cpu3", 2408c2ecf20Sopenharmony_ci .dev_id = "700e2000.thermal-sensor", 2418c2ecf20Sopenharmony_ci .con_id = "cpu3", 2428c2ecf20Sopenharmony_ci }, { 2438c2ecf20Sopenharmony_ci .nvmem_name = "fuse", 2448c2ecf20Sopenharmony_ci .cell_name = "sata-calibration", 2458c2ecf20Sopenharmony_ci .dev_id = "70020000.sata", 2468c2ecf20Sopenharmony_ci .con_id = "calibration", 2478c2ecf20Sopenharmony_ci }, { 2488c2ecf20Sopenharmony_ci .nvmem_name = "fuse", 2498c2ecf20Sopenharmony_ci .cell_name = "tsensor-gpu", 2508c2ecf20Sopenharmony_ci .dev_id = "700e2000.thermal-sensor", 2518c2ecf20Sopenharmony_ci .con_id = "gpu", 2528c2ecf20Sopenharmony_ci }, { 2538c2ecf20Sopenharmony_ci .nvmem_name = "fuse", 2548c2ecf20Sopenharmony_ci .cell_name = "tsensor-mem0", 2558c2ecf20Sopenharmony_ci .dev_id = "700e2000.thermal-sensor", 2568c2ecf20Sopenharmony_ci .con_id = "mem0", 2578c2ecf20Sopenharmony_ci }, { 2588c2ecf20Sopenharmony_ci .nvmem_name = "fuse", 2598c2ecf20Sopenharmony_ci .cell_name = "tsensor-mem1", 2608c2ecf20Sopenharmony_ci .dev_id = "700e2000.thermal-sensor", 2618c2ecf20Sopenharmony_ci .con_id = "mem1", 2628c2ecf20Sopenharmony_ci }, { 2638c2ecf20Sopenharmony_ci .nvmem_name = "fuse", 2648c2ecf20Sopenharmony_ci .cell_name = "tsensor-pllx", 2658c2ecf20Sopenharmony_ci .dev_id = "700e2000.thermal-sensor", 2668c2ecf20Sopenharmony_ci .con_id = "pllx", 2678c2ecf20Sopenharmony_ci }, { 2688c2ecf20Sopenharmony_ci .nvmem_name = "fuse", 2698c2ecf20Sopenharmony_ci .cell_name = "tsensor-common", 2708c2ecf20Sopenharmony_ci .dev_id = "700e2000.thermal-sensor", 2718c2ecf20Sopenharmony_ci .con_id = "common", 2728c2ecf20Sopenharmony_ci }, { 2738c2ecf20Sopenharmony_ci .nvmem_name = "fuse", 2748c2ecf20Sopenharmony_ci .cell_name = "gpu-calibration", 2758c2ecf20Sopenharmony_ci .dev_id = "57000000.gpu", 2768c2ecf20Sopenharmony_ci .con_id = "calibration", 2778c2ecf20Sopenharmony_ci }, { 2788c2ecf20Sopenharmony_ci .nvmem_name = "fuse", 2798c2ecf20Sopenharmony_ci .cell_name = "xusb-pad-calibration-ext", 2808c2ecf20Sopenharmony_ci .dev_id = "7009f000.padctl", 2818c2ecf20Sopenharmony_ci .con_id = "calibration-ext", 2828c2ecf20Sopenharmony_ci }, 2838c2ecf20Sopenharmony_ci}; 2848c2ecf20Sopenharmony_ci 2858c2ecf20Sopenharmony_cistatic const struct tegra_fuse_info tegra210_fuse_info = { 2868c2ecf20Sopenharmony_ci .read = tegra30_fuse_read, 2878c2ecf20Sopenharmony_ci .size = 0x300, 2888c2ecf20Sopenharmony_ci .spare = 0x280, 2898c2ecf20Sopenharmony_ci}; 2908c2ecf20Sopenharmony_ci 2918c2ecf20Sopenharmony_ciconst struct tegra_fuse_soc tegra210_fuse_soc = { 2928c2ecf20Sopenharmony_ci .init = tegra30_fuse_init, 2938c2ecf20Sopenharmony_ci .speedo_init = tegra210_init_speedo_data, 2948c2ecf20Sopenharmony_ci .info = &tegra210_fuse_info, 2958c2ecf20Sopenharmony_ci .lookups = tegra210_fuse_lookups, 2968c2ecf20Sopenharmony_ci .num_lookups = ARRAY_SIZE(tegra210_fuse_lookups), 2978c2ecf20Sopenharmony_ci .soc_attr_group = &tegra_soc_attr_group, 2988c2ecf20Sopenharmony_ci}; 2998c2ecf20Sopenharmony_ci#endif 3008c2ecf20Sopenharmony_ci 3018c2ecf20Sopenharmony_ci#if defined(CONFIG_ARCH_TEGRA_186_SOC) 3028c2ecf20Sopenharmony_cistatic const struct nvmem_cell_lookup tegra186_fuse_lookups[] = { 3038c2ecf20Sopenharmony_ci { 3048c2ecf20Sopenharmony_ci .nvmem_name = "fuse", 3058c2ecf20Sopenharmony_ci .cell_name = "xusb-pad-calibration", 3068c2ecf20Sopenharmony_ci .dev_id = "3520000.padctl", 3078c2ecf20Sopenharmony_ci .con_id = "calibration", 3088c2ecf20Sopenharmony_ci }, { 3098c2ecf20Sopenharmony_ci .nvmem_name = "fuse", 3108c2ecf20Sopenharmony_ci .cell_name = "xusb-pad-calibration-ext", 3118c2ecf20Sopenharmony_ci .dev_id = "3520000.padctl", 3128c2ecf20Sopenharmony_ci .con_id = "calibration-ext", 3138c2ecf20Sopenharmony_ci }, 3148c2ecf20Sopenharmony_ci}; 3158c2ecf20Sopenharmony_ci 3168c2ecf20Sopenharmony_cistatic const struct tegra_fuse_info tegra186_fuse_info = { 3178c2ecf20Sopenharmony_ci .read = tegra30_fuse_read, 3188c2ecf20Sopenharmony_ci .size = 0x300, 3198c2ecf20Sopenharmony_ci .spare = 0x280, 3208c2ecf20Sopenharmony_ci}; 3218c2ecf20Sopenharmony_ci 3228c2ecf20Sopenharmony_ciconst struct tegra_fuse_soc tegra186_fuse_soc = { 3238c2ecf20Sopenharmony_ci .init = tegra30_fuse_init, 3248c2ecf20Sopenharmony_ci .info = &tegra186_fuse_info, 3258c2ecf20Sopenharmony_ci .lookups = tegra186_fuse_lookups, 3268c2ecf20Sopenharmony_ci .num_lookups = ARRAY_SIZE(tegra186_fuse_lookups), 3278c2ecf20Sopenharmony_ci .soc_attr_group = &tegra_soc_attr_group, 3288c2ecf20Sopenharmony_ci}; 3298c2ecf20Sopenharmony_ci#endif 3308c2ecf20Sopenharmony_ci 3318c2ecf20Sopenharmony_ci#if defined(CONFIG_ARCH_TEGRA_194_SOC) 3328c2ecf20Sopenharmony_cistatic const struct nvmem_cell_lookup tegra194_fuse_lookups[] = { 3338c2ecf20Sopenharmony_ci { 3348c2ecf20Sopenharmony_ci .nvmem_name = "fuse", 3358c2ecf20Sopenharmony_ci .cell_name = "xusb-pad-calibration", 3368c2ecf20Sopenharmony_ci .dev_id = "3520000.padctl", 3378c2ecf20Sopenharmony_ci .con_id = "calibration", 3388c2ecf20Sopenharmony_ci }, { 3398c2ecf20Sopenharmony_ci .nvmem_name = "fuse", 3408c2ecf20Sopenharmony_ci .cell_name = "xusb-pad-calibration-ext", 3418c2ecf20Sopenharmony_ci .dev_id = "3520000.padctl", 3428c2ecf20Sopenharmony_ci .con_id = "calibration-ext", 3438c2ecf20Sopenharmony_ci }, 3448c2ecf20Sopenharmony_ci}; 3458c2ecf20Sopenharmony_ci 3468c2ecf20Sopenharmony_cistatic const struct tegra_fuse_info tegra194_fuse_info = { 3478c2ecf20Sopenharmony_ci .read = tegra30_fuse_read, 3488c2ecf20Sopenharmony_ci .size = 0x300, 3498c2ecf20Sopenharmony_ci .spare = 0x280, 3508c2ecf20Sopenharmony_ci}; 3518c2ecf20Sopenharmony_ci 3528c2ecf20Sopenharmony_ciconst struct tegra_fuse_soc tegra194_fuse_soc = { 3538c2ecf20Sopenharmony_ci .init = tegra30_fuse_init, 3548c2ecf20Sopenharmony_ci .info = &tegra194_fuse_info, 3558c2ecf20Sopenharmony_ci .lookups = tegra194_fuse_lookups, 3568c2ecf20Sopenharmony_ci .num_lookups = ARRAY_SIZE(tegra194_fuse_lookups), 3578c2ecf20Sopenharmony_ci .soc_attr_group = &tegra194_soc_attr_group, 3588c2ecf20Sopenharmony_ci}; 3598c2ecf20Sopenharmony_ci#endif 3608c2ecf20Sopenharmony_ci 3618c2ecf20Sopenharmony_ci#if defined(CONFIG_ARCH_TEGRA_234_SOC) 3628c2ecf20Sopenharmony_cistatic const struct nvmem_cell_lookup tegra234_fuse_lookups[] = { 3638c2ecf20Sopenharmony_ci { 3648c2ecf20Sopenharmony_ci .nvmem_name = "fuse", 3658c2ecf20Sopenharmony_ci .cell_name = "xusb-pad-calibration", 3668c2ecf20Sopenharmony_ci .dev_id = "3520000.padctl", 3678c2ecf20Sopenharmony_ci .con_id = "calibration", 3688c2ecf20Sopenharmony_ci }, { 3698c2ecf20Sopenharmony_ci .nvmem_name = "fuse", 3708c2ecf20Sopenharmony_ci .cell_name = "xusb-pad-calibration-ext", 3718c2ecf20Sopenharmony_ci .dev_id = "3520000.padctl", 3728c2ecf20Sopenharmony_ci .con_id = "calibration-ext", 3738c2ecf20Sopenharmony_ci }, 3748c2ecf20Sopenharmony_ci}; 3758c2ecf20Sopenharmony_ci 3768c2ecf20Sopenharmony_cistatic const struct tegra_fuse_info tegra234_fuse_info = { 3778c2ecf20Sopenharmony_ci .read = tegra30_fuse_read, 3788c2ecf20Sopenharmony_ci .size = 0x300, 3798c2ecf20Sopenharmony_ci .spare = 0x280, 3808c2ecf20Sopenharmony_ci}; 3818c2ecf20Sopenharmony_ci 3828c2ecf20Sopenharmony_ciconst struct tegra_fuse_soc tegra234_fuse_soc = { 3838c2ecf20Sopenharmony_ci .init = tegra30_fuse_init, 3848c2ecf20Sopenharmony_ci .info = &tegra234_fuse_info, 3858c2ecf20Sopenharmony_ci .lookups = tegra234_fuse_lookups, 3868c2ecf20Sopenharmony_ci .num_lookups = ARRAY_SIZE(tegra234_fuse_lookups), 3878c2ecf20Sopenharmony_ci .soc_attr_group = &tegra194_soc_attr_group, 3888c2ecf20Sopenharmony_ci}; 3898c2ecf20Sopenharmony_ci#endif 390