Source
115
115
return ret;
116
116
}
117
117
118
118
/* 128 Byte efuse, 96 Byte for secure, 32 Byte for non-secure */
119
119
offset += RK3328_SECURE_SIZES;
120
120
addr_start = rounddown(offset, RK3399_NBYTES) / RK3399_NBYTES;
121
121
addr_end = roundup(offset + bytes, RK3399_NBYTES) / RK3399_NBYTES;
122
122
addr_offset = offset % RK3399_NBYTES;
123
123
addr_len = addr_end - addr_start;
124
124
125
-
buf = kzalloc(sizeof(*buf) * addr_len * RK3399_NBYTES, GFP_KERNEL);
125
+
buf = kzalloc(array3_size(addr_len, RK3399_NBYTES, sizeof(*buf)),
126
+
GFP_KERNEL);
126
127
if (!buf) {
127
128
ret = -ENOMEM;
128
129
goto nomem;
129
130
}
130
131
131
132
while (addr_len--) {
132
133
writel(RK3328_AUTO_RD | RK3328_AUTO_ENB |
133
134
((addr_start++ & RK3399_A_MASK) << RK3399_A_SHIFT),
134
135
efuse->base + RK3328_AUTO_CTRL);
135
136
udelay(4);
167
168
if (ret < 0) {
168
169
dev_err(efuse->dev, "failed to prepare/enable efuse clk\n");
169
170
return ret;
170
171
}
171
172
172
173
addr_start = rounddown(offset, RK3399_NBYTES) / RK3399_NBYTES;
173
174
addr_end = roundup(offset + bytes, RK3399_NBYTES) / RK3399_NBYTES;
174
175
addr_offset = offset % RK3399_NBYTES;
175
176
addr_len = addr_end - addr_start;
176
177
177
-
buf = kzalloc(sizeof(*buf) * addr_len * RK3399_NBYTES, GFP_KERNEL);
178
+
buf = kzalloc(array3_size(addr_len, RK3399_NBYTES, sizeof(*buf)),
179
+
GFP_KERNEL);
178
180
if (!buf) {
179
181
clk_disable_unprepare(efuse->clk);
180
182
return -ENOMEM;
181
183
}
182
184
183
185
writel(RK3399_LOAD | RK3399_PGENB | RK3399_STROBSFTSEL | RK3399_RSB,
184
186
efuse->base + REG_EFUSE_CTRL);
185
187
udelay(1);
186
188
while (addr_len--) {
187
189
writel(readl(efuse->base + REG_EFUSE_CTRL) | RK3399_STROBE |