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