xref: /OK3568_Linux_fs/kernel/drivers/soc/tegra/fuse/fuse-tegra30.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0-only
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * Copyright (c) 2013-2014, NVIDIA CORPORATION.  All rights reserved.
4*4882a593Smuzhiyun  */
5*4882a593Smuzhiyun 
6*4882a593Smuzhiyun #include <linux/device.h>
7*4882a593Smuzhiyun #include <linux/clk.h>
8*4882a593Smuzhiyun #include <linux/err.h>
9*4882a593Smuzhiyun #include <linux/io.h>
10*4882a593Smuzhiyun #include <linux/kernel.h>
11*4882a593Smuzhiyun #include <linux/nvmem-consumer.h>
12*4882a593Smuzhiyun #include <linux/of_device.h>
13*4882a593Smuzhiyun #include <linux/of_address.h>
14*4882a593Smuzhiyun #include <linux/platform_device.h>
15*4882a593Smuzhiyun #include <linux/random.h>
16*4882a593Smuzhiyun 
17*4882a593Smuzhiyun #include <soc/tegra/fuse.h>
18*4882a593Smuzhiyun 
19*4882a593Smuzhiyun #include "fuse.h"
20*4882a593Smuzhiyun 
21*4882a593Smuzhiyun #define FUSE_BEGIN	0x100
22*4882a593Smuzhiyun 
23*4882a593Smuzhiyun /* Tegra30 and later */
24*4882a593Smuzhiyun #define FUSE_VENDOR_CODE	0x100
25*4882a593Smuzhiyun #define FUSE_FAB_CODE		0x104
26*4882a593Smuzhiyun #define FUSE_LOT_CODE_0		0x108
27*4882a593Smuzhiyun #define FUSE_LOT_CODE_1		0x10c
28*4882a593Smuzhiyun #define FUSE_WAFER_ID		0x110
29*4882a593Smuzhiyun #define FUSE_X_COORDINATE	0x114
30*4882a593Smuzhiyun #define FUSE_Y_COORDINATE	0x118
31*4882a593Smuzhiyun 
32*4882a593Smuzhiyun #define FUSE_HAS_REVISION_INFO	BIT(0)
33*4882a593Smuzhiyun 
34*4882a593Smuzhiyun #if defined(CONFIG_ARCH_TEGRA_3x_SOC) || \
35*4882a593Smuzhiyun     defined(CONFIG_ARCH_TEGRA_114_SOC) || \
36*4882a593Smuzhiyun     defined(CONFIG_ARCH_TEGRA_124_SOC) || \
37*4882a593Smuzhiyun     defined(CONFIG_ARCH_TEGRA_132_SOC) || \
38*4882a593Smuzhiyun     defined(CONFIG_ARCH_TEGRA_210_SOC) || \
39*4882a593Smuzhiyun     defined(CONFIG_ARCH_TEGRA_186_SOC) || \
40*4882a593Smuzhiyun     defined(CONFIG_ARCH_TEGRA_194_SOC) || \
41*4882a593Smuzhiyun     defined(CONFIG_ARCH_TEGRA_234_SOC)
tegra30_fuse_read_early(struct tegra_fuse * fuse,unsigned int offset)42*4882a593Smuzhiyun static u32 tegra30_fuse_read_early(struct tegra_fuse *fuse, unsigned int offset)
43*4882a593Smuzhiyun {
44*4882a593Smuzhiyun 	if (WARN_ON(!fuse->base))
45*4882a593Smuzhiyun 		return 0;
46*4882a593Smuzhiyun 
47*4882a593Smuzhiyun 	return readl_relaxed(fuse->base + FUSE_BEGIN + offset);
48*4882a593Smuzhiyun }
49*4882a593Smuzhiyun 
tegra30_fuse_read(struct tegra_fuse * fuse,unsigned int offset)50*4882a593Smuzhiyun static u32 tegra30_fuse_read(struct tegra_fuse *fuse, unsigned int offset)
51*4882a593Smuzhiyun {
52*4882a593Smuzhiyun 	u32 value;
53*4882a593Smuzhiyun 	int err;
54*4882a593Smuzhiyun 
55*4882a593Smuzhiyun 	err = clk_prepare_enable(fuse->clk);
56*4882a593Smuzhiyun 	if (err < 0) {
57*4882a593Smuzhiyun 		dev_err(fuse->dev, "failed to enable FUSE clock: %d\n", err);
58*4882a593Smuzhiyun 		return 0;
59*4882a593Smuzhiyun 	}
60*4882a593Smuzhiyun 
61*4882a593Smuzhiyun 	value = readl_relaxed(fuse->base + FUSE_BEGIN + offset);
62*4882a593Smuzhiyun 
63*4882a593Smuzhiyun 	clk_disable_unprepare(fuse->clk);
64*4882a593Smuzhiyun 
65*4882a593Smuzhiyun 	return value;
66*4882a593Smuzhiyun }
67*4882a593Smuzhiyun 
tegra30_fuse_add_randomness(void)68*4882a593Smuzhiyun static void __init tegra30_fuse_add_randomness(void)
69*4882a593Smuzhiyun {
70*4882a593Smuzhiyun 	u32 randomness[12];
71*4882a593Smuzhiyun 
72*4882a593Smuzhiyun 	randomness[0] = tegra_sku_info.sku_id;
73*4882a593Smuzhiyun 	randomness[1] = tegra_read_straps();
74*4882a593Smuzhiyun 	randomness[2] = tegra_read_chipid();
75*4882a593Smuzhiyun 	randomness[3] = tegra_sku_info.cpu_process_id << 16;
76*4882a593Smuzhiyun 	randomness[3] |= tegra_sku_info.soc_process_id;
77*4882a593Smuzhiyun 	randomness[4] = tegra_sku_info.cpu_speedo_id << 16;
78*4882a593Smuzhiyun 	randomness[4] |= tegra_sku_info.soc_speedo_id;
79*4882a593Smuzhiyun 	randomness[5] = tegra_fuse_read_early(FUSE_VENDOR_CODE);
80*4882a593Smuzhiyun 	randomness[6] = tegra_fuse_read_early(FUSE_FAB_CODE);
81*4882a593Smuzhiyun 	randomness[7] = tegra_fuse_read_early(FUSE_LOT_CODE_0);
82*4882a593Smuzhiyun 	randomness[8] = tegra_fuse_read_early(FUSE_LOT_CODE_1);
83*4882a593Smuzhiyun 	randomness[9] = tegra_fuse_read_early(FUSE_WAFER_ID);
84*4882a593Smuzhiyun 	randomness[10] = tegra_fuse_read_early(FUSE_X_COORDINATE);
85*4882a593Smuzhiyun 	randomness[11] = tegra_fuse_read_early(FUSE_Y_COORDINATE);
86*4882a593Smuzhiyun 
87*4882a593Smuzhiyun 	add_device_randomness(randomness, sizeof(randomness));
88*4882a593Smuzhiyun }
89*4882a593Smuzhiyun 
tegra30_fuse_init(struct tegra_fuse * fuse)90*4882a593Smuzhiyun static void __init tegra30_fuse_init(struct tegra_fuse *fuse)
91*4882a593Smuzhiyun {
92*4882a593Smuzhiyun 	fuse->read_early = tegra30_fuse_read_early;
93*4882a593Smuzhiyun 	fuse->read = tegra30_fuse_read;
94*4882a593Smuzhiyun 
95*4882a593Smuzhiyun 	tegra_init_revision();
96*4882a593Smuzhiyun 
97*4882a593Smuzhiyun 	if (fuse->soc->speedo_init)
98*4882a593Smuzhiyun 		fuse->soc->speedo_init(&tegra_sku_info);
99*4882a593Smuzhiyun 
100*4882a593Smuzhiyun 	tegra30_fuse_add_randomness();
101*4882a593Smuzhiyun }
102*4882a593Smuzhiyun #endif
103*4882a593Smuzhiyun 
104*4882a593Smuzhiyun #ifdef CONFIG_ARCH_TEGRA_3x_SOC
105*4882a593Smuzhiyun static const struct tegra_fuse_info tegra30_fuse_info = {
106*4882a593Smuzhiyun 	.read = tegra30_fuse_read,
107*4882a593Smuzhiyun 	.size = 0x2a4,
108*4882a593Smuzhiyun 	.spare = 0x144,
109*4882a593Smuzhiyun };
110*4882a593Smuzhiyun 
111*4882a593Smuzhiyun const struct tegra_fuse_soc tegra30_fuse_soc = {
112*4882a593Smuzhiyun 	.init = tegra30_fuse_init,
113*4882a593Smuzhiyun 	.speedo_init = tegra30_init_speedo_data,
114*4882a593Smuzhiyun 	.info = &tegra30_fuse_info,
115*4882a593Smuzhiyun 	.soc_attr_group = &tegra_soc_attr_group,
116*4882a593Smuzhiyun };
117*4882a593Smuzhiyun #endif
118*4882a593Smuzhiyun 
119*4882a593Smuzhiyun #ifdef CONFIG_ARCH_TEGRA_114_SOC
120*4882a593Smuzhiyun static const struct tegra_fuse_info tegra114_fuse_info = {
121*4882a593Smuzhiyun 	.read = tegra30_fuse_read,
122*4882a593Smuzhiyun 	.size = 0x2a0,
123*4882a593Smuzhiyun 	.spare = 0x180,
124*4882a593Smuzhiyun };
125*4882a593Smuzhiyun 
126*4882a593Smuzhiyun const struct tegra_fuse_soc tegra114_fuse_soc = {
127*4882a593Smuzhiyun 	.init = tegra30_fuse_init,
128*4882a593Smuzhiyun 	.speedo_init = tegra114_init_speedo_data,
129*4882a593Smuzhiyun 	.info = &tegra114_fuse_info,
130*4882a593Smuzhiyun 	.soc_attr_group = &tegra_soc_attr_group,
131*4882a593Smuzhiyun };
132*4882a593Smuzhiyun #endif
133*4882a593Smuzhiyun 
134*4882a593Smuzhiyun #if defined(CONFIG_ARCH_TEGRA_124_SOC) || defined(CONFIG_ARCH_TEGRA_132_SOC)
135*4882a593Smuzhiyun static const struct nvmem_cell_lookup tegra124_fuse_lookups[] = {
136*4882a593Smuzhiyun 	{
137*4882a593Smuzhiyun 		.nvmem_name = "fuse",
138*4882a593Smuzhiyun 		.cell_name = "xusb-pad-calibration",
139*4882a593Smuzhiyun 		.dev_id = "7009f000.padctl",
140*4882a593Smuzhiyun 		.con_id = "calibration",
141*4882a593Smuzhiyun 	}, {
142*4882a593Smuzhiyun 		.nvmem_name = "fuse",
143*4882a593Smuzhiyun 		.cell_name = "sata-calibration",
144*4882a593Smuzhiyun 		.dev_id = "70020000.sata",
145*4882a593Smuzhiyun 		.con_id = "calibration",
146*4882a593Smuzhiyun 	}, {
147*4882a593Smuzhiyun 		.nvmem_name = "fuse",
148*4882a593Smuzhiyun 		.cell_name = "tsensor-common",
149*4882a593Smuzhiyun 		.dev_id = "700e2000.thermal-sensor",
150*4882a593Smuzhiyun 		.con_id = "common",
151*4882a593Smuzhiyun 	}, {
152*4882a593Smuzhiyun 		.nvmem_name = "fuse",
153*4882a593Smuzhiyun 		.cell_name = "tsensor-realignment",
154*4882a593Smuzhiyun 		.dev_id = "700e2000.thermal-sensor",
155*4882a593Smuzhiyun 		.con_id = "realignment",
156*4882a593Smuzhiyun 	}, {
157*4882a593Smuzhiyun 		.nvmem_name = "fuse",
158*4882a593Smuzhiyun 		.cell_name = "tsensor-cpu0",
159*4882a593Smuzhiyun 		.dev_id = "700e2000.thermal-sensor",
160*4882a593Smuzhiyun 		.con_id = "cpu0",
161*4882a593Smuzhiyun 	}, {
162*4882a593Smuzhiyun 		.nvmem_name = "fuse",
163*4882a593Smuzhiyun 		.cell_name = "tsensor-cpu1",
164*4882a593Smuzhiyun 		.dev_id = "700e2000.thermal-sensor",
165*4882a593Smuzhiyun 		.con_id = "cpu1",
166*4882a593Smuzhiyun 	}, {
167*4882a593Smuzhiyun 		.nvmem_name = "fuse",
168*4882a593Smuzhiyun 		.cell_name = "tsensor-cpu2",
169*4882a593Smuzhiyun 		.dev_id = "700e2000.thermal-sensor",
170*4882a593Smuzhiyun 		.con_id = "cpu2",
171*4882a593Smuzhiyun 	}, {
172*4882a593Smuzhiyun 		.nvmem_name = "fuse",
173*4882a593Smuzhiyun 		.cell_name = "tsensor-cpu3",
174*4882a593Smuzhiyun 		.dev_id = "700e2000.thermal-sensor",
175*4882a593Smuzhiyun 		.con_id = "cpu3",
176*4882a593Smuzhiyun 	}, {
177*4882a593Smuzhiyun 		.nvmem_name = "fuse",
178*4882a593Smuzhiyun 		.cell_name = "tsensor-mem0",
179*4882a593Smuzhiyun 		.dev_id = "700e2000.thermal-sensor",
180*4882a593Smuzhiyun 		.con_id = "mem0",
181*4882a593Smuzhiyun 	}, {
182*4882a593Smuzhiyun 		.nvmem_name = "fuse",
183*4882a593Smuzhiyun 		.cell_name = "tsensor-mem1",
184*4882a593Smuzhiyun 		.dev_id = "700e2000.thermal-sensor",
185*4882a593Smuzhiyun 		.con_id = "mem1",
186*4882a593Smuzhiyun 	}, {
187*4882a593Smuzhiyun 		.nvmem_name = "fuse",
188*4882a593Smuzhiyun 		.cell_name = "tsensor-gpu",
189*4882a593Smuzhiyun 		.dev_id = "700e2000.thermal-sensor",
190*4882a593Smuzhiyun 		.con_id = "gpu",
191*4882a593Smuzhiyun 	}, {
192*4882a593Smuzhiyun 		.nvmem_name = "fuse",
193*4882a593Smuzhiyun 		.cell_name = "tsensor-pllx",
194*4882a593Smuzhiyun 		.dev_id = "700e2000.thermal-sensor",
195*4882a593Smuzhiyun 		.con_id = "pllx",
196*4882a593Smuzhiyun 	},
197*4882a593Smuzhiyun };
198*4882a593Smuzhiyun 
199*4882a593Smuzhiyun static const struct tegra_fuse_info tegra124_fuse_info = {
200*4882a593Smuzhiyun 	.read = tegra30_fuse_read,
201*4882a593Smuzhiyun 	.size = 0x300,
202*4882a593Smuzhiyun 	.spare = 0x200,
203*4882a593Smuzhiyun };
204*4882a593Smuzhiyun 
205*4882a593Smuzhiyun const struct tegra_fuse_soc tegra124_fuse_soc = {
206*4882a593Smuzhiyun 	.init = tegra30_fuse_init,
207*4882a593Smuzhiyun 	.speedo_init = tegra124_init_speedo_data,
208*4882a593Smuzhiyun 	.info = &tegra124_fuse_info,
209*4882a593Smuzhiyun 	.lookups = tegra124_fuse_lookups,
210*4882a593Smuzhiyun 	.num_lookups = ARRAY_SIZE(tegra124_fuse_lookups),
211*4882a593Smuzhiyun 	.soc_attr_group = &tegra_soc_attr_group,
212*4882a593Smuzhiyun };
213*4882a593Smuzhiyun #endif
214*4882a593Smuzhiyun 
215*4882a593Smuzhiyun #if defined(CONFIG_ARCH_TEGRA_210_SOC)
216*4882a593Smuzhiyun static const struct nvmem_cell_lookup tegra210_fuse_lookups[] = {
217*4882a593Smuzhiyun 	{
218*4882a593Smuzhiyun 		.nvmem_name = "fuse",
219*4882a593Smuzhiyun 		.cell_name = "tsensor-cpu1",
220*4882a593Smuzhiyun 		.dev_id = "700e2000.thermal-sensor",
221*4882a593Smuzhiyun 		.con_id = "cpu1",
222*4882a593Smuzhiyun 	}, {
223*4882a593Smuzhiyun 		.nvmem_name = "fuse",
224*4882a593Smuzhiyun 		.cell_name = "tsensor-cpu2",
225*4882a593Smuzhiyun 		.dev_id = "700e2000.thermal-sensor",
226*4882a593Smuzhiyun 		.con_id = "cpu2",
227*4882a593Smuzhiyun 	}, {
228*4882a593Smuzhiyun 		.nvmem_name = "fuse",
229*4882a593Smuzhiyun 		.cell_name = "tsensor-cpu0",
230*4882a593Smuzhiyun 		.dev_id = "700e2000.thermal-sensor",
231*4882a593Smuzhiyun 		.con_id = "cpu0",
232*4882a593Smuzhiyun 	}, {
233*4882a593Smuzhiyun 		.nvmem_name = "fuse",
234*4882a593Smuzhiyun 		.cell_name = "xusb-pad-calibration",
235*4882a593Smuzhiyun 		.dev_id = "7009f000.padctl",
236*4882a593Smuzhiyun 		.con_id = "calibration",
237*4882a593Smuzhiyun 	}, {
238*4882a593Smuzhiyun 		.nvmem_name = "fuse",
239*4882a593Smuzhiyun 		.cell_name = "tsensor-cpu3",
240*4882a593Smuzhiyun 		.dev_id = "700e2000.thermal-sensor",
241*4882a593Smuzhiyun 		.con_id = "cpu3",
242*4882a593Smuzhiyun 	}, {
243*4882a593Smuzhiyun 		.nvmem_name = "fuse",
244*4882a593Smuzhiyun 		.cell_name = "sata-calibration",
245*4882a593Smuzhiyun 		.dev_id = "70020000.sata",
246*4882a593Smuzhiyun 		.con_id = "calibration",
247*4882a593Smuzhiyun 	}, {
248*4882a593Smuzhiyun 		.nvmem_name = "fuse",
249*4882a593Smuzhiyun 		.cell_name = "tsensor-gpu",
250*4882a593Smuzhiyun 		.dev_id = "700e2000.thermal-sensor",
251*4882a593Smuzhiyun 		.con_id = "gpu",
252*4882a593Smuzhiyun 	}, {
253*4882a593Smuzhiyun 		.nvmem_name = "fuse",
254*4882a593Smuzhiyun 		.cell_name = "tsensor-mem0",
255*4882a593Smuzhiyun 		.dev_id = "700e2000.thermal-sensor",
256*4882a593Smuzhiyun 		.con_id = "mem0",
257*4882a593Smuzhiyun 	}, {
258*4882a593Smuzhiyun 		.nvmem_name = "fuse",
259*4882a593Smuzhiyun 		.cell_name = "tsensor-mem1",
260*4882a593Smuzhiyun 		.dev_id = "700e2000.thermal-sensor",
261*4882a593Smuzhiyun 		.con_id = "mem1",
262*4882a593Smuzhiyun 	}, {
263*4882a593Smuzhiyun 		.nvmem_name = "fuse",
264*4882a593Smuzhiyun 		.cell_name = "tsensor-pllx",
265*4882a593Smuzhiyun 		.dev_id = "700e2000.thermal-sensor",
266*4882a593Smuzhiyun 		.con_id = "pllx",
267*4882a593Smuzhiyun 	}, {
268*4882a593Smuzhiyun 		.nvmem_name = "fuse",
269*4882a593Smuzhiyun 		.cell_name = "tsensor-common",
270*4882a593Smuzhiyun 		.dev_id = "700e2000.thermal-sensor",
271*4882a593Smuzhiyun 		.con_id = "common",
272*4882a593Smuzhiyun 	}, {
273*4882a593Smuzhiyun 		.nvmem_name = "fuse",
274*4882a593Smuzhiyun 		.cell_name = "gpu-calibration",
275*4882a593Smuzhiyun 		.dev_id = "57000000.gpu",
276*4882a593Smuzhiyun 		.con_id = "calibration",
277*4882a593Smuzhiyun 	}, {
278*4882a593Smuzhiyun 		.nvmem_name = "fuse",
279*4882a593Smuzhiyun 		.cell_name = "xusb-pad-calibration-ext",
280*4882a593Smuzhiyun 		.dev_id = "7009f000.padctl",
281*4882a593Smuzhiyun 		.con_id = "calibration-ext",
282*4882a593Smuzhiyun 	},
283*4882a593Smuzhiyun };
284*4882a593Smuzhiyun 
285*4882a593Smuzhiyun static const struct tegra_fuse_info tegra210_fuse_info = {
286*4882a593Smuzhiyun 	.read = tegra30_fuse_read,
287*4882a593Smuzhiyun 	.size = 0x300,
288*4882a593Smuzhiyun 	.spare = 0x280,
289*4882a593Smuzhiyun };
290*4882a593Smuzhiyun 
291*4882a593Smuzhiyun const struct tegra_fuse_soc tegra210_fuse_soc = {
292*4882a593Smuzhiyun 	.init = tegra30_fuse_init,
293*4882a593Smuzhiyun 	.speedo_init = tegra210_init_speedo_data,
294*4882a593Smuzhiyun 	.info = &tegra210_fuse_info,
295*4882a593Smuzhiyun 	.lookups = tegra210_fuse_lookups,
296*4882a593Smuzhiyun 	.num_lookups = ARRAY_SIZE(tegra210_fuse_lookups),
297*4882a593Smuzhiyun 	.soc_attr_group = &tegra_soc_attr_group,
298*4882a593Smuzhiyun };
299*4882a593Smuzhiyun #endif
300*4882a593Smuzhiyun 
301*4882a593Smuzhiyun #if defined(CONFIG_ARCH_TEGRA_186_SOC)
302*4882a593Smuzhiyun static const struct nvmem_cell_lookup tegra186_fuse_lookups[] = {
303*4882a593Smuzhiyun 	{
304*4882a593Smuzhiyun 		.nvmem_name = "fuse",
305*4882a593Smuzhiyun 		.cell_name = "xusb-pad-calibration",
306*4882a593Smuzhiyun 		.dev_id = "3520000.padctl",
307*4882a593Smuzhiyun 		.con_id = "calibration",
308*4882a593Smuzhiyun 	}, {
309*4882a593Smuzhiyun 		.nvmem_name = "fuse",
310*4882a593Smuzhiyun 		.cell_name = "xusb-pad-calibration-ext",
311*4882a593Smuzhiyun 		.dev_id = "3520000.padctl",
312*4882a593Smuzhiyun 		.con_id = "calibration-ext",
313*4882a593Smuzhiyun 	},
314*4882a593Smuzhiyun };
315*4882a593Smuzhiyun 
316*4882a593Smuzhiyun static const struct tegra_fuse_info tegra186_fuse_info = {
317*4882a593Smuzhiyun 	.read = tegra30_fuse_read,
318*4882a593Smuzhiyun 	.size = 0x300,
319*4882a593Smuzhiyun 	.spare = 0x280,
320*4882a593Smuzhiyun };
321*4882a593Smuzhiyun 
322*4882a593Smuzhiyun const struct tegra_fuse_soc tegra186_fuse_soc = {
323*4882a593Smuzhiyun 	.init = tegra30_fuse_init,
324*4882a593Smuzhiyun 	.info = &tegra186_fuse_info,
325*4882a593Smuzhiyun 	.lookups = tegra186_fuse_lookups,
326*4882a593Smuzhiyun 	.num_lookups = ARRAY_SIZE(tegra186_fuse_lookups),
327*4882a593Smuzhiyun 	.soc_attr_group = &tegra_soc_attr_group,
328*4882a593Smuzhiyun };
329*4882a593Smuzhiyun #endif
330*4882a593Smuzhiyun 
331*4882a593Smuzhiyun #if defined(CONFIG_ARCH_TEGRA_194_SOC)
332*4882a593Smuzhiyun static const struct nvmem_cell_lookup tegra194_fuse_lookups[] = {
333*4882a593Smuzhiyun 	{
334*4882a593Smuzhiyun 		.nvmem_name = "fuse",
335*4882a593Smuzhiyun 		.cell_name = "xusb-pad-calibration",
336*4882a593Smuzhiyun 		.dev_id = "3520000.padctl",
337*4882a593Smuzhiyun 		.con_id = "calibration",
338*4882a593Smuzhiyun 	}, {
339*4882a593Smuzhiyun 		.nvmem_name = "fuse",
340*4882a593Smuzhiyun 		.cell_name = "xusb-pad-calibration-ext",
341*4882a593Smuzhiyun 		.dev_id = "3520000.padctl",
342*4882a593Smuzhiyun 		.con_id = "calibration-ext",
343*4882a593Smuzhiyun 	},
344*4882a593Smuzhiyun };
345*4882a593Smuzhiyun 
346*4882a593Smuzhiyun static const struct tegra_fuse_info tegra194_fuse_info = {
347*4882a593Smuzhiyun 	.read = tegra30_fuse_read,
348*4882a593Smuzhiyun 	.size = 0x300,
349*4882a593Smuzhiyun 	.spare = 0x280,
350*4882a593Smuzhiyun };
351*4882a593Smuzhiyun 
352*4882a593Smuzhiyun const struct tegra_fuse_soc tegra194_fuse_soc = {
353*4882a593Smuzhiyun 	.init = tegra30_fuse_init,
354*4882a593Smuzhiyun 	.info = &tegra194_fuse_info,
355*4882a593Smuzhiyun 	.lookups = tegra194_fuse_lookups,
356*4882a593Smuzhiyun 	.num_lookups = ARRAY_SIZE(tegra194_fuse_lookups),
357*4882a593Smuzhiyun 	.soc_attr_group = &tegra194_soc_attr_group,
358*4882a593Smuzhiyun };
359*4882a593Smuzhiyun #endif
360*4882a593Smuzhiyun 
361*4882a593Smuzhiyun #if defined(CONFIG_ARCH_TEGRA_234_SOC)
362*4882a593Smuzhiyun static const struct nvmem_cell_lookup tegra234_fuse_lookups[] = {
363*4882a593Smuzhiyun 	{
364*4882a593Smuzhiyun 		.nvmem_name = "fuse",
365*4882a593Smuzhiyun 		.cell_name = "xusb-pad-calibration",
366*4882a593Smuzhiyun 		.dev_id = "3520000.padctl",
367*4882a593Smuzhiyun 		.con_id = "calibration",
368*4882a593Smuzhiyun 	}, {
369*4882a593Smuzhiyun 		.nvmem_name = "fuse",
370*4882a593Smuzhiyun 		.cell_name = "xusb-pad-calibration-ext",
371*4882a593Smuzhiyun 		.dev_id = "3520000.padctl",
372*4882a593Smuzhiyun 		.con_id = "calibration-ext",
373*4882a593Smuzhiyun 	},
374*4882a593Smuzhiyun };
375*4882a593Smuzhiyun 
376*4882a593Smuzhiyun static const struct tegra_fuse_info tegra234_fuse_info = {
377*4882a593Smuzhiyun 	.read = tegra30_fuse_read,
378*4882a593Smuzhiyun 	.size = 0x300,
379*4882a593Smuzhiyun 	.spare = 0x280,
380*4882a593Smuzhiyun };
381*4882a593Smuzhiyun 
382*4882a593Smuzhiyun const struct tegra_fuse_soc tegra234_fuse_soc = {
383*4882a593Smuzhiyun 	.init = tegra30_fuse_init,
384*4882a593Smuzhiyun 	.info = &tegra234_fuse_info,
385*4882a593Smuzhiyun 	.lookups = tegra234_fuse_lookups,
386*4882a593Smuzhiyun 	.num_lookups = ARRAY_SIZE(tegra234_fuse_lookups),
387*4882a593Smuzhiyun 	.soc_attr_group = &tegra194_soc_attr_group,
388*4882a593Smuzhiyun };
389*4882a593Smuzhiyun #endif
390