xref: /optee_os/core/drivers/bcm_sotp.c (revision 48ca91ed3940d943b1bda4983f006f76b00d18ba)
1525c44eeSSandeep Tripathy // SPDX-License-Identifier: BSD-2-Clause
2525c44eeSSandeep Tripathy /*
3525c44eeSSandeep Tripathy  * Copyright 2019 Broadcom.
4525c44eeSSandeep Tripathy  */
5525c44eeSSandeep Tripathy 
6525c44eeSSandeep Tripathy #include <assert.h>
7525c44eeSSandeep Tripathy #include <drivers/bcm_sotp.h>
8525c44eeSSandeep Tripathy #include <initcall.h>
9525c44eeSSandeep Tripathy #include <io.h>
10525c44eeSSandeep Tripathy #include <kernel/delay.h>
11525c44eeSSandeep Tripathy #include <mm/core_memprot.h>
12525c44eeSSandeep Tripathy #include <platform_config.h>
13525c44eeSSandeep Tripathy #include <util.h>
14525c44eeSSandeep Tripathy 
15*48ca91edSVahid Dukandar #define SOTP_PROG_CONTROL		0x00
16*48ca91edSVahid Dukandar #define SOTP_WRDATA_0			0x04
17*48ca91edSVahid Dukandar #define SOTP_WRDATA_1			0x08
18*48ca91edSVahid Dukandar #define SOTP_ADDR			0x0c
19*48ca91edSVahid Dukandar #define SOTP_CTRL_0			0x10
20*48ca91edSVahid Dukandar #define SOTP_STAT_0			0x18
21*48ca91edSVahid Dukandar #define SOTP_STATUS_1			0x1c
22*48ca91edSVahid Dukandar #define SOTP_RDDATA_0			0x20
23*48ca91edSVahid Dukandar #define SOTP_RDDATA_1			0x24
24*48ca91edSVahid Dukandar #define SOTP_REGS_SOTP_CHIP_STATES	0x28
25*48ca91edSVahid Dukandar #define SOTP_REGS_OTP_WR_LOCK		0x38
26*48ca91edSVahid Dukandar #define SOTP_CHIP_CTRL			0x4c
27*48ca91edSVahid Dukandar 
28525c44eeSSandeep Tripathy #define SOTP_PROG_CONTROL__OTP_CPU_MODE_EN	BIT(15)
29525c44eeSSandeep Tripathy #define SOTP_PROG_CONTROL__OTP_DISABLE_ECC	BIT(9)
30525c44eeSSandeep Tripathy #define SOTP_ADDR__OTP_ROW_ADDR_R		6
31*48ca91edSVahid Dukandar #define SOTP_PROG_CONTROL__OTP_ECC_WREN		BIT(8)
32525c44eeSSandeep Tripathy #define SOTP_CTRL_0__START			1
33525c44eeSSandeep Tripathy #define SOTP_STATUS_0__FDONE			BIT(3)
34525c44eeSSandeep Tripathy #define SOTP_STATUS_1__CMD_DONE			BIT(1)
35525c44eeSSandeep Tripathy #define SOTP_STATUS_1__ECC_DET			BIT(17)
36525c44eeSSandeep Tripathy 
37*48ca91edSVahid Dukandar #define SOTP_READ				0
38525c44eeSSandeep Tripathy #define SOTP_ADDR_MASK				0x3ff
39525c44eeSSandeep Tripathy #define SOTP_TIMEOUT_US				300
40525c44eeSSandeep Tripathy 
41*48ca91edSVahid Dukandar #define SOTP_PROG_WORD				10
42*48ca91edSVahid Dukandar #define SOTP_STATUS__PROGOK			BIT(2)
43*48ca91edSVahid Dukandar #define SOTP_PROG_ENABLE			2
44*48ca91edSVahid Dukandar 
45*48ca91edSVahid Dukandar #define SOTP_ROW_DATA_MASK			UINT32_MAX
46*48ca91edSVahid Dukandar #define SOTP_ECC_ERR_BITS_MASK			GENMASK_64(40, 32)
47*48ca91edSVahid Dukandar 
48*48ca91edSVahid Dukandar #define SOTP_CHIP_CTRL_SW_OVERRIDE_CHIP_STATES	4
49*48ca91edSVahid Dukandar #define SOTP_CHIP_CTRL_SW_MANU_PROG		5
50*48ca91edSVahid Dukandar #define SOTP_CHIP_CTRL_SW_CID_PROG		6
51*48ca91edSVahid Dukandar #define SOTP_CHIP_CTRL_SW_AB_DEVICE		8
52*48ca91edSVahid Dukandar #define SOTP_CHIP_CTRL_SW_AB_DEV_MODE		9
53*48ca91edSVahid Dukandar #define CHIP_STATE_UNPROGRAMMED			0x1
54*48ca91edSVahid Dukandar #define CHIP_STATE_UNASSIGNED			0x2
55*48ca91edSVahid Dukandar #define CHIP_STATE_DEFAULT			(CHIP_STATE_UNASSIGNED | \
56*48ca91edSVahid Dukandar 						 CHIP_STATE_UNPROGRAMMED)
57*48ca91edSVahid Dukandar 
58525c44eeSSandeep Tripathy static vaddr_t bcm_sotp_base;
59525c44eeSSandeep Tripathy 
otp_status_done_wait(vaddr_t addr,uint32_t bit)60525c44eeSSandeep Tripathy static TEE_Result otp_status_done_wait(vaddr_t addr, uint32_t bit)
61525c44eeSSandeep Tripathy {
62525c44eeSSandeep Tripathy 	uint64_t timeout = timeout_init_us(SOTP_TIMEOUT_US);
63525c44eeSSandeep Tripathy 
64525c44eeSSandeep Tripathy 	while (!(io_read32(addr) & bit))
65525c44eeSSandeep Tripathy 		if (timeout_elapsed(timeout))
66525c44eeSSandeep Tripathy 			return TEE_ERROR_BUSY;
67525c44eeSSandeep Tripathy 	return TEE_SUCCESS;
68525c44eeSSandeep Tripathy }
69525c44eeSSandeep Tripathy 
bcm_iproc_sotp_mem_read(uint32_t row_addr,bool sotp_add_ecc,uint64_t * rdata)70*48ca91edSVahid Dukandar TEE_Result bcm_iproc_sotp_mem_read(uint32_t row_addr, bool sotp_add_ecc,
71525c44eeSSandeep Tripathy 				   uint64_t *rdata)
72525c44eeSSandeep Tripathy {
73525c44eeSSandeep Tripathy 	uint64_t read_data = 0;
74525c44eeSSandeep Tripathy 	uint32_t reg_val = 0;
75525c44eeSSandeep Tripathy 	TEE_Result ret = TEE_SUCCESS;
76525c44eeSSandeep Tripathy 
77525c44eeSSandeep Tripathy 	assert(bcm_sotp_base);
78525c44eeSSandeep Tripathy 	/* Check for FDONE status */
79525c44eeSSandeep Tripathy 	ret = otp_status_done_wait((bcm_sotp_base + SOTP_STAT_0),
80525c44eeSSandeep Tripathy 				   SOTP_STATUS_0__FDONE);
81525c44eeSSandeep Tripathy 	if (ret) {
82*48ca91edSVahid Dukandar 		EMSG("FDONE status done wait failed and returned %#"PRIx32,
83*48ca91edSVahid Dukandar 		     ret);
84525c44eeSSandeep Tripathy 		return ret;
85525c44eeSSandeep Tripathy 	}
86525c44eeSSandeep Tripathy 
87525c44eeSSandeep Tripathy 	/* Enable OTP access by CPU */
88525c44eeSSandeep Tripathy 	io_setbits32((bcm_sotp_base + SOTP_PROG_CONTROL),
89525c44eeSSandeep Tripathy 		     SOTP_PROG_CONTROL__OTP_CPU_MODE_EN);
90525c44eeSSandeep Tripathy 
914afc3781SBharat Kumar Reddy Gooty 	/* ROWS does not support ECC */
924afc3781SBharat Kumar Reddy Gooty 	if (row_addr <= SOTP_NO_ECC_ROWS)
93*48ca91edSVahid Dukandar 		sotp_add_ecc = false;
944afc3781SBharat Kumar Reddy Gooty 
95*48ca91edSVahid Dukandar 	if (sotp_add_ecc) {
96525c44eeSSandeep Tripathy 		io_clrbits32((bcm_sotp_base + SOTP_PROG_CONTROL),
97525c44eeSSandeep Tripathy 			     SOTP_PROG_CONTROL__OTP_DISABLE_ECC);
98525c44eeSSandeep Tripathy 	} else {
99525c44eeSSandeep Tripathy 		io_setbits32((bcm_sotp_base + SOTP_PROG_CONTROL),
100525c44eeSSandeep Tripathy 			     SOTP_PROG_CONTROL__OTP_DISABLE_ECC);
101525c44eeSSandeep Tripathy 	}
102525c44eeSSandeep Tripathy 
103525c44eeSSandeep Tripathy 	/* 10 bit row address */
104525c44eeSSandeep Tripathy 	reg_val = (row_addr & SOTP_ADDR_MASK) << SOTP_ADDR__OTP_ROW_ADDR_R;
105525c44eeSSandeep Tripathy 	io_write32((bcm_sotp_base + SOTP_ADDR), reg_val);
106525c44eeSSandeep Tripathy 	reg_val = SOTP_READ;
107525c44eeSSandeep Tripathy 	io_write32((bcm_sotp_base + SOTP_CTRL_0), reg_val);
108525c44eeSSandeep Tripathy 
109525c44eeSSandeep Tripathy 	/* Start bit to tell SOTP to send command to the OTP controller */
110525c44eeSSandeep Tripathy 	io_setbits32((bcm_sotp_base + SOTP_CTRL_0), SOTP_CTRL_0__START);
111525c44eeSSandeep Tripathy 
112525c44eeSSandeep Tripathy 	/* Wait for SOTP command done to be set */
113525c44eeSSandeep Tripathy 	ret = otp_status_done_wait((bcm_sotp_base + SOTP_STAT_0),
114525c44eeSSandeep Tripathy 				   SOTP_STATUS_1__CMD_DONE);
115525c44eeSSandeep Tripathy 	if (ret) {
116*48ca91edSVahid Dukandar 		EMSG("FDONE cmd done wait failed and returned %#"PRIx32, ret);
117525c44eeSSandeep Tripathy 		return ret;
118525c44eeSSandeep Tripathy 	}
119525c44eeSSandeep Tripathy 
120*48ca91edSVahid Dukandar 	DMSG("CMD Done");
121525c44eeSSandeep Tripathy 
122525c44eeSSandeep Tripathy 	/* Clr Start bit after command done */
123525c44eeSSandeep Tripathy 	io_clrbits32((bcm_sotp_base + SOTP_CTRL_0), SOTP_CTRL_0__START);
124525c44eeSSandeep Tripathy 	read_data = io_read32(bcm_sotp_base + SOTP_RDDATA_1);
125525c44eeSSandeep Tripathy 	read_data = ((read_data & 0x1ff) << 32);
126525c44eeSSandeep Tripathy 	read_data |= io_read32(bcm_sotp_base + SOTP_RDDATA_0);
127525c44eeSSandeep Tripathy 
128525c44eeSSandeep Tripathy 	reg_val = io_read32(bcm_sotp_base + SOTP_STATUS_1);
1294afc3781SBharat Kumar Reddy Gooty 	/* No ECC check till SOTP_NO_ECC_ROWS */
1304afc3781SBharat Kumar Reddy Gooty 	if (row_addr > SOTP_NO_ECC_ROWS &&
1314afc3781SBharat Kumar Reddy Gooty 	    reg_val & SOTP_STATUS_1__ECC_DET) {
132*48ca91edSVahid Dukandar 		EMSG("SOTP ECC ERROR Detected ROW %"PRIu32, row_addr);
133525c44eeSSandeep Tripathy 		read_data = SOTP_ECC_ERR_DETECT;
134525c44eeSSandeep Tripathy 	}
135525c44eeSSandeep Tripathy 
136525c44eeSSandeep Tripathy 	/* Command done is cleared */
137525c44eeSSandeep Tripathy 	io_setbits32((bcm_sotp_base + SOTP_STATUS_1), SOTP_STATUS_1__CMD_DONE);
138525c44eeSSandeep Tripathy 	io_clrbits32((bcm_sotp_base + SOTP_PROG_CONTROL),
139525c44eeSSandeep Tripathy 		     SOTP_PROG_CONTROL__OTP_CPU_MODE_EN);
140*48ca91edSVahid Dukandar 	DMSG("read done");
141525c44eeSSandeep Tripathy 
142525c44eeSSandeep Tripathy 	*rdata = read_data;
143525c44eeSSandeep Tripathy 	return ret;
144525c44eeSSandeep Tripathy }
145525c44eeSSandeep Tripathy 
bcm_iproc_sotp_mem_write(uint32_t row_addr,bool sotp_add_ecc,uint64_t wdata)146*48ca91edSVahid Dukandar TEE_Result bcm_iproc_sotp_mem_write(uint32_t row_addr, bool sotp_add_ecc,
147*48ca91edSVahid Dukandar 				    uint64_t wdata)
148*48ca91edSVahid Dukandar {
149*48ca91edSVahid Dukandar 	uint32_t chip_state = 0;
150*48ca91edSVahid Dukandar 	uint32_t chip_ctrl_default = 0;
151*48ca91edSVahid Dukandar 	uint32_t chip_ctrl = 0;
152*48ca91edSVahid Dukandar 	uint32_t loop = 0;
153*48ca91edSVahid Dukandar 	uint8_t prog_array[4] = { 0x0F, 0x04, 0x08, 0x0D };
154*48ca91edSVahid Dukandar 	TEE_Result ret = TEE_SUCCESS;
155*48ca91edSVahid Dukandar 
156*48ca91edSVahid Dukandar 	assert(bcm_sotp_base);
157*48ca91edSVahid Dukandar 
158*48ca91edSVahid Dukandar 	chip_state = io_read32(bcm_sotp_base + SOTP_REGS_SOTP_CHIP_STATES);
159*48ca91edSVahid Dukandar 
160*48ca91edSVahid Dukandar 	if (chip_state & CHIP_STATE_DEFAULT) {
161*48ca91edSVahid Dukandar 		chip_ctrl_default = io_read32(bcm_sotp_base + SOTP_CHIP_CTRL);
162*48ca91edSVahid Dukandar 		DMSG("SOTP: enable special prog mode");
163*48ca91edSVahid Dukandar 
164*48ca91edSVahid Dukandar 		chip_ctrl = BIT(SOTP_CHIP_CTRL_SW_OVERRIDE_CHIP_STATES) |
165*48ca91edSVahid Dukandar 			    BIT(SOTP_CHIP_CTRL_SW_MANU_PROG) |
166*48ca91edSVahid Dukandar 			    BIT(SOTP_CHIP_CTRL_SW_CID_PROG) |
167*48ca91edSVahid Dukandar 			    BIT(SOTP_CHIP_CTRL_SW_AB_DEVICE);
168*48ca91edSVahid Dukandar 
169*48ca91edSVahid Dukandar 		io_write32(bcm_sotp_base + SOTP_CHIP_CTRL, chip_ctrl);
170*48ca91edSVahid Dukandar 	}
171*48ca91edSVahid Dukandar 
172*48ca91edSVahid Dukandar 	/* Check for FDONE status */
173*48ca91edSVahid Dukandar 	ret = otp_status_done_wait(bcm_sotp_base + SOTP_STAT_0,
174*48ca91edSVahid Dukandar 				   SOTP_STATUS_0__FDONE);
175*48ca91edSVahid Dukandar 	if (ret) {
176*48ca91edSVahid Dukandar 		EMSG("FDONE status done wait failed and returned %#"PRIx32,
177*48ca91edSVahid Dukandar 		     ret);
178*48ca91edSVahid Dukandar 		return ret;
179*48ca91edSVahid Dukandar 	}
180*48ca91edSVahid Dukandar 
181*48ca91edSVahid Dukandar 	/* Enable OTP access by CPU */
182*48ca91edSVahid Dukandar 	io_setbits32(bcm_sotp_base + SOTP_PROG_CONTROL,
183*48ca91edSVahid Dukandar 		     SOTP_PROG_CONTROL__OTP_CPU_MODE_EN);
184*48ca91edSVahid Dukandar 
185*48ca91edSVahid Dukandar 	if (row_addr <= SOTP_NO_ECC_ROWS) {
186*48ca91edSVahid Dukandar 		if (sotp_add_ecc) {
187*48ca91edSVahid Dukandar 			io_setbits32(bcm_sotp_base + SOTP_PROG_CONTROL,
188*48ca91edSVahid Dukandar 				     SOTP_PROG_CONTROL__OTP_ECC_WREN);
189*48ca91edSVahid Dukandar 		} else {
190*48ca91edSVahid Dukandar 			io_clrbits32(bcm_sotp_base + SOTP_PROG_CONTROL,
191*48ca91edSVahid Dukandar 				     SOTP_PROG_CONTROL__OTP_ECC_WREN);
192*48ca91edSVahid Dukandar 		}
193*48ca91edSVahid Dukandar 	} else {
194*48ca91edSVahid Dukandar 		io_clrbits32(bcm_sotp_base + SOTP_PROG_CONTROL,
195*48ca91edSVahid Dukandar 			     SOTP_PROG_CONTROL__OTP_ECC_WREN);
196*48ca91edSVahid Dukandar 	}
197*48ca91edSVahid Dukandar 
198*48ca91edSVahid Dukandar 	io_write32(bcm_sotp_base + SOTP_CTRL_0, SOTP_PROG_ENABLE << 1);
199*48ca91edSVahid Dukandar 
200*48ca91edSVahid Dukandar 	/*
201*48ca91edSVahid Dukandar 	 * In order to avoid unintentional writes/programming of the OTP array,
202*48ca91edSVahid Dukandar 	 * the OTP Controller must be put into programming mode before it will
203*48ca91edSVahid Dukandar 	 * accept program commands. This is done by writing 0xF, 0x4, 0x8, 0xD
204*48ca91edSVahid Dukandar 	 * with program commands prior to starting the actual programming
205*48ca91edSVahid Dukandar 	 * sequence.
206*48ca91edSVahid Dukandar 	 */
207*48ca91edSVahid Dukandar 	for (loop = 0; loop < ARRAY_SIZE(prog_array); loop++) {
208*48ca91edSVahid Dukandar 		io_write32(bcm_sotp_base + SOTP_WRDATA_0, prog_array[loop]);
209*48ca91edSVahid Dukandar 
210*48ca91edSVahid Dukandar 		/* Bit to tell SOTP to send command to the OTP controller */
211*48ca91edSVahid Dukandar 		io_setbits32(bcm_sotp_base + SOTP_CTRL_0, SOTP_CTRL_0__START);
212*48ca91edSVahid Dukandar 
213*48ca91edSVahid Dukandar 		/*  Wait for SOTP command done to be set */
214*48ca91edSVahid Dukandar 		ret = otp_status_done_wait(bcm_sotp_base + SOTP_STATUS_1,
215*48ca91edSVahid Dukandar 					   SOTP_STATUS_1__CMD_DONE);
216*48ca91edSVahid Dukandar 		if (ret) {
217*48ca91edSVahid Dukandar 			EMSG("FDONE cmd done wait failed and returned %"PRIx32,
218*48ca91edSVahid Dukandar 			     ret);
219*48ca91edSVahid Dukandar 			return ret;
220*48ca91edSVahid Dukandar 		}
221*48ca91edSVahid Dukandar 
222*48ca91edSVahid Dukandar 		/* Command done is cleared w1c */
223*48ca91edSVahid Dukandar 		io_setbits32(bcm_sotp_base + SOTP_STATUS_1,
224*48ca91edSVahid Dukandar 			     SOTP_STATUS_1__CMD_DONE);
225*48ca91edSVahid Dukandar 
226*48ca91edSVahid Dukandar 		/* Clear Start bit after command done */
227*48ca91edSVahid Dukandar 		io_clrbits32(bcm_sotp_base + SOTP_CTRL_0, SOTP_CTRL_0__START);
228*48ca91edSVahid Dukandar 	}
229*48ca91edSVahid Dukandar 
230*48ca91edSVahid Dukandar 	/* Check for PROGOK */
231*48ca91edSVahid Dukandar 	ret = otp_status_done_wait(bcm_sotp_base + SOTP_STAT_0,
232*48ca91edSVahid Dukandar 				   SOTP_STATUS__PROGOK);
233*48ca91edSVahid Dukandar 	if (ret) {
234*48ca91edSVahid Dukandar 		EMSG("PROGOK cmd wait failed and returned %#"PRIx32, ret);
235*48ca91edSVahid Dukandar 		return ret;
236*48ca91edSVahid Dukandar 	}
237*48ca91edSVahid Dukandar 
238*48ca91edSVahid Dukandar 	/* Set 10 bit row address */
239*48ca91edSVahid Dukandar 	io_write32(bcm_sotp_base + SOTP_ADDR,
240*48ca91edSVahid Dukandar 		   (row_addr & SOTP_ADDR_MASK) << SOTP_ADDR__OTP_ROW_ADDR_R);
241*48ca91edSVahid Dukandar 
242*48ca91edSVahid Dukandar 	/* Set SOTP Row data */
243*48ca91edSVahid Dukandar 	io_write32(bcm_sotp_base + SOTP_WRDATA_0, wdata & SOTP_ROW_DATA_MASK);
244*48ca91edSVahid Dukandar 
245*48ca91edSVahid Dukandar 	/* Set SOTP ECC and error bits */
246*48ca91edSVahid Dukandar 	io_write32(bcm_sotp_base + SOTP_WRDATA_1,
247*48ca91edSVahid Dukandar 		   (wdata & SOTP_ECC_ERR_BITS_MASK) >> 32);
248*48ca91edSVahid Dukandar 
249*48ca91edSVahid Dukandar 	/* Set prog_word command */
250*48ca91edSVahid Dukandar 	io_write32(bcm_sotp_base + SOTP_CTRL_0, SOTP_PROG_WORD << 1);
251*48ca91edSVahid Dukandar 
252*48ca91edSVahid Dukandar 	/* Start bit to tell SOTP to send command to the OTP controller */
253*48ca91edSVahid Dukandar 	io_setbits32(bcm_sotp_base + SOTP_CTRL_0, SOTP_CTRL_0__START);
254*48ca91edSVahid Dukandar 
255*48ca91edSVahid Dukandar 	/* Wait for SOTP command done to be set */
256*48ca91edSVahid Dukandar 	ret = otp_status_done_wait(bcm_sotp_base + SOTP_STATUS_1,
257*48ca91edSVahid Dukandar 				   SOTP_STATUS_1__CMD_DONE);
258*48ca91edSVahid Dukandar 	if (ret) {
259*48ca91edSVahid Dukandar 		EMSG("CMD DONE wait failed and returned %#"PRIx32, ret);
260*48ca91edSVahid Dukandar 		return ret;
261*48ca91edSVahid Dukandar 	}
262*48ca91edSVahid Dukandar 
263*48ca91edSVahid Dukandar 	/* Command done is cleared w1c */
264*48ca91edSVahid Dukandar 	io_setbits32(bcm_sotp_base + SOTP_STATUS_1, SOTP_STATUS_1__CMD_DONE);
265*48ca91edSVahid Dukandar 
266*48ca91edSVahid Dukandar 	/* disable OTP access by CPU */
267*48ca91edSVahid Dukandar 	io_clrbits32(bcm_sotp_base + SOTP_PROG_CONTROL,
268*48ca91edSVahid Dukandar 		     SOTP_PROG_CONTROL__OTP_CPU_MODE_EN);
269*48ca91edSVahid Dukandar 
270*48ca91edSVahid Dukandar 	/* Clr Start bit after command done */
271*48ca91edSVahid Dukandar 	io_clrbits32(bcm_sotp_base + SOTP_CTRL_0, SOTP_CTRL_0__START);
272*48ca91edSVahid Dukandar 
273*48ca91edSVahid Dukandar 	if (chip_state & CHIP_STATE_DEFAULT)
274*48ca91edSVahid Dukandar 		io_write32(bcm_sotp_base + SOTP_CHIP_CTRL, chip_ctrl_default);
275*48ca91edSVahid Dukandar 
276*48ca91edSVahid Dukandar 	return TEE_SUCCESS;
277*48ca91edSVahid Dukandar }
278*48ca91edSVahid Dukandar 
bcm_sotp_init(void)279525c44eeSSandeep Tripathy static TEE_Result bcm_sotp_init(void)
280525c44eeSSandeep Tripathy {
281c2e4eb43SAnton Rybakov 	bcm_sotp_base = (vaddr_t)phys_to_virt(SOTP_BASE, MEM_AREA_IO_SEC, 1);
282525c44eeSSandeep Tripathy 
283*48ca91edSVahid Dukandar 	DMSG("bcm_sotp init done");
284525c44eeSSandeep Tripathy 	return TEE_SUCCESS;
285525c44eeSSandeep Tripathy }
286525c44eeSSandeep Tripathy 
28719ac2e24SVahid Dukandar service_init(bcm_sotp_init);
288