Skip to content

Commit 722463f

Browse files
Christophe Kerellokrzk
authored andcommitted
memory: stm32-fmc2-ebi: check regmap_read return value
Check regmap_read return value to avoid to use uninitialized local variables. Signed-off-by: Christophe Kerello <christophe.kerello@foss.st.com> Link: https://lore.kernel.org/r/20240226101428.37791-3-christophe.kerello@foss.st.com Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
1 parent 97dcd1e commit 722463f

1 file changed

Lines changed: 88 additions & 34 deletions

File tree

drivers/memory/stm32-fmc2-ebi.c

Lines changed: 88 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -181,8 +181,11 @@ static int stm32_fmc2_ebi_check_mux(struct stm32_fmc2_ebi *ebi,
181181
int cs)
182182
{
183183
u32 bcr;
184+
int ret;
184185

185-
regmap_read(ebi->regmap, FMC2_BCR(cs), &bcr);
186+
ret = regmap_read(ebi->regmap, FMC2_BCR(cs), &bcr);
187+
if (ret)
188+
return ret;
186189

187190
if (bcr & FMC2_BCR_MTYP)
188191
return 0;
@@ -195,8 +198,11 @@ static int stm32_fmc2_ebi_check_waitcfg(struct stm32_fmc2_ebi *ebi,
195198
int cs)
196199
{
197200
u32 bcr, val = FIELD_PREP(FMC2_BCR_MTYP, FMC2_BCR_MTYP_NOR);
201+
int ret;
198202

199-
regmap_read(ebi->regmap, FMC2_BCR(cs), &bcr);
203+
ret = regmap_read(ebi->regmap, FMC2_BCR(cs), &bcr);
204+
if (ret)
205+
return ret;
200206

201207
if ((bcr & FMC2_BCR_MTYP) == val && bcr & FMC2_BCR_BURSTEN)
202208
return 0;
@@ -209,8 +215,11 @@ static int stm32_fmc2_ebi_check_sync_trans(struct stm32_fmc2_ebi *ebi,
209215
int cs)
210216
{
211217
u32 bcr;
218+
int ret;
212219

213-
regmap_read(ebi->regmap, FMC2_BCR(cs), &bcr);
220+
ret = regmap_read(ebi->regmap, FMC2_BCR(cs), &bcr);
221+
if (ret)
222+
return ret;
214223

215224
if (bcr & FMC2_BCR_BURSTEN)
216225
return 0;
@@ -223,8 +232,11 @@ static int stm32_fmc2_ebi_check_async_trans(struct stm32_fmc2_ebi *ebi,
223232
int cs)
224233
{
225234
u32 bcr;
235+
int ret;
226236

227-
regmap_read(ebi->regmap, FMC2_BCR(cs), &bcr);
237+
ret = regmap_read(ebi->regmap, FMC2_BCR(cs), &bcr);
238+
if (ret)
239+
return ret;
228240

229241
if (!(bcr & FMC2_BCR_BURSTEN) || !(bcr & FMC2_BCR_CBURSTRW))
230242
return 0;
@@ -237,8 +249,11 @@ static int stm32_fmc2_ebi_check_cpsize(struct stm32_fmc2_ebi *ebi,
237249
int cs)
238250
{
239251
u32 bcr, val = FIELD_PREP(FMC2_BCR_MTYP, FMC2_BCR_MTYP_PSRAM);
252+
int ret;
240253

241-
regmap_read(ebi->regmap, FMC2_BCR(cs), &bcr);
254+
ret = regmap_read(ebi->regmap, FMC2_BCR(cs), &bcr);
255+
if (ret)
256+
return ret;
242257

243258
if ((bcr & FMC2_BCR_MTYP) == val && bcr & FMC2_BCR_BURSTEN)
244259
return 0;
@@ -251,12 +266,18 @@ static int stm32_fmc2_ebi_check_address_hold(struct stm32_fmc2_ebi *ebi,
251266
int cs)
252267
{
253268
u32 bcr, bxtr, val = FIELD_PREP(FMC2_BXTR_ACCMOD, FMC2_BXTR_EXTMOD_D);
269+
int ret;
270+
271+
ret = regmap_read(ebi->regmap, FMC2_BCR(cs), &bcr);
272+
if (ret)
273+
return ret;
254274

255-
regmap_read(ebi->regmap, FMC2_BCR(cs), &bcr);
256275
if (prop->reg_type == FMC2_REG_BWTR)
257-
regmap_read(ebi->regmap, FMC2_BWTR(cs), &bxtr);
276+
ret = regmap_read(ebi->regmap, FMC2_BWTR(cs), &bxtr);
258277
else
259-
regmap_read(ebi->regmap, FMC2_BTR(cs), &bxtr);
278+
ret = regmap_read(ebi->regmap, FMC2_BTR(cs), &bxtr);
279+
if (ret)
280+
return ret;
260281

261282
if ((!(bcr & FMC2_BCR_BURSTEN) || !(bcr & FMC2_BCR_CBURSTRW)) &&
262283
((bxtr & FMC2_BXTR_ACCMOD) == val || bcr & FMC2_BCR_MUXEN))
@@ -270,12 +291,19 @@ static int stm32_fmc2_ebi_check_clk_period(struct stm32_fmc2_ebi *ebi,
270291
int cs)
271292
{
272293
u32 bcr, bcr1;
294+
int ret;
273295

274-
regmap_read(ebi->regmap, FMC2_BCR(cs), &bcr);
275-
if (cs)
276-
regmap_read(ebi->regmap, FMC2_BCR1, &bcr1);
277-
else
296+
ret = regmap_read(ebi->regmap, FMC2_BCR(cs), &bcr);
297+
if (ret)
298+
return ret;
299+
300+
if (cs) {
301+
ret = regmap_read(ebi->regmap, FMC2_BCR1, &bcr1);
302+
if (ret)
303+
return ret;
304+
} else {
278305
bcr1 = bcr;
306+
}
279307

280308
if (bcr & FMC2_BCR_BURSTEN && (!cs || !(bcr1 & FMC2_BCR1_CCLKEN)))
281309
return 0;
@@ -307,12 +335,18 @@ static u32 stm32_fmc2_ebi_ns_to_clk_period(struct stm32_fmc2_ebi *ebi,
307335
{
308336
u32 nb_clk_cycles = stm32_fmc2_ebi_ns_to_clock_cycles(ebi, cs, setup);
309337
u32 bcr, btr, clk_period;
338+
int ret;
339+
340+
ret = regmap_read(ebi->regmap, FMC2_BCR1, &bcr);
341+
if (ret)
342+
return ret;
310343

311-
regmap_read(ebi->regmap, FMC2_BCR1, &bcr);
312344
if (bcr & FMC2_BCR1_CCLKEN || !cs)
313-
regmap_read(ebi->regmap, FMC2_BTR1, &btr);
345+
ret = regmap_read(ebi->regmap, FMC2_BTR1, &btr);
314346
else
315-
regmap_read(ebi->regmap, FMC2_BTR(cs), &btr);
347+
ret = regmap_read(ebi->regmap, FMC2_BTR(cs), &btr);
348+
if (ret)
349+
return ret;
316350

317351
clk_period = FIELD_GET(FMC2_BTR_CLKDIV, btr) + 1;
318352

@@ -571,11 +605,16 @@ static int stm32_fmc2_ebi_set_address_setup(struct stm32_fmc2_ebi *ebi,
571605
if (ret)
572606
return ret;
573607

574-
regmap_read(ebi->regmap, FMC2_BCR(cs), &bcr);
608+
ret = regmap_read(ebi->regmap, FMC2_BCR(cs), &bcr);
609+
if (ret)
610+
return ret;
611+
575612
if (prop->reg_type == FMC2_REG_BWTR)
576-
regmap_read(ebi->regmap, FMC2_BWTR(cs), &bxtr);
613+
ret = regmap_read(ebi->regmap, FMC2_BWTR(cs), &bxtr);
577614
else
578-
regmap_read(ebi->regmap, FMC2_BTR(cs), &bxtr);
615+
ret = regmap_read(ebi->regmap, FMC2_BTR(cs), &bxtr);
616+
if (ret)
617+
return ret;
579618

580619
if ((bxtr & FMC2_BXTR_ACCMOD) == val || bcr & FMC2_BCR_MUXEN)
581620
val = clamp_val(setup, 1, FMC2_BXTR_ADDSET_MAX);
@@ -693,11 +732,14 @@ static int stm32_fmc2_ebi_set_max_low_pulse(struct stm32_fmc2_ebi *ebi,
693732
int cs, u32 setup)
694733
{
695734
u32 old_val, new_val, pcscntr;
735+
int ret;
696736

697737
if (setup < 1)
698738
return 0;
699739

700-
regmap_read(ebi->regmap, FMC2_PCSCNTR, &pcscntr);
740+
ret = regmap_read(ebi->regmap, FMC2_PCSCNTR, &pcscntr);
741+
if (ret)
742+
return ret;
701743

702744
/* Enable counter for the bank */
703745
regmap_update_bits(ebi->regmap, FMC2_PCSCNTR,
@@ -944,17 +986,20 @@ static void stm32_fmc2_ebi_disable_bank(struct stm32_fmc2_ebi *ebi, int cs)
944986
regmap_update_bits(ebi->regmap, FMC2_BCR(cs), FMC2_BCR_MBKEN, 0);
945987
}
946988

947-
static void stm32_fmc2_ebi_save_setup(struct stm32_fmc2_ebi *ebi)
989+
static int stm32_fmc2_ebi_save_setup(struct stm32_fmc2_ebi *ebi)
948990
{
949991
unsigned int cs;
992+
int ret;
950993

951994
for (cs = 0; cs < FMC2_MAX_EBI_CE; cs++) {
952-
regmap_read(ebi->regmap, FMC2_BCR(cs), &ebi->bcr[cs]);
953-
regmap_read(ebi->regmap, FMC2_BTR(cs), &ebi->btr[cs]);
954-
regmap_read(ebi->regmap, FMC2_BWTR(cs), &ebi->bwtr[cs]);
995+
ret = regmap_read(ebi->regmap, FMC2_BCR(cs), &ebi->bcr[cs]);
996+
ret |= regmap_read(ebi->regmap, FMC2_BTR(cs), &ebi->btr[cs]);
997+
ret |= regmap_read(ebi->regmap, FMC2_BWTR(cs), &ebi->bwtr[cs]);
998+
if (ret)
999+
return ret;
9551000
}
9561001

957-
regmap_read(ebi->regmap, FMC2_PCSCNTR, &ebi->pcscntr);
1002+
return regmap_read(ebi->regmap, FMC2_PCSCNTR, &ebi->pcscntr);
9581003
}
9591004

9601005
static void stm32_fmc2_ebi_set_setup(struct stm32_fmc2_ebi *ebi)
@@ -983,22 +1028,29 @@ static void stm32_fmc2_ebi_disable_banks(struct stm32_fmc2_ebi *ebi)
9831028
}
9841029

9851030
/* NWAIT signal can not be connected to EBI controller and NAND controller */
986-
static bool stm32_fmc2_ebi_nwait_used_by_ctrls(struct stm32_fmc2_ebi *ebi)
1031+
static int stm32_fmc2_ebi_nwait_used_by_ctrls(struct stm32_fmc2_ebi *ebi)
9871032
{
1033+
struct device *dev = ebi->dev;
9881034
unsigned int cs;
9891035
u32 bcr;
1036+
int ret;
9901037

9911038
for (cs = 0; cs < FMC2_MAX_EBI_CE; cs++) {
9921039
if (!(ebi->bank_assigned & BIT(cs)))
9931040
continue;
9941041

995-
regmap_read(ebi->regmap, FMC2_BCR(cs), &bcr);
1042+
ret = regmap_read(ebi->regmap, FMC2_BCR(cs), &bcr);
1043+
if (ret)
1044+
return ret;
1045+
9961046
if ((bcr & FMC2_BCR_WAITEN || bcr & FMC2_BCR_ASYNCWAIT) &&
997-
ebi->bank_assigned & BIT(FMC2_NAND))
998-
return true;
1047+
ebi->bank_assigned & BIT(FMC2_NAND)) {
1048+
dev_err(dev, "NWAIT signal connected to EBI and NAND controllers\n");
1049+
return -EINVAL;
1050+
}
9991051
}
10001052

1001-
return false;
1053+
return 0;
10021054
}
10031055

10041056
static void stm32_fmc2_ebi_enable(struct stm32_fmc2_ebi *ebi)
@@ -1085,10 +1137,9 @@ static int stm32_fmc2_ebi_parse_dt(struct stm32_fmc2_ebi *ebi)
10851137
return -ENODEV;
10861138
}
10871139

1088-
if (stm32_fmc2_ebi_nwait_used_by_ctrls(ebi)) {
1089-
dev_err(dev, "NWAIT signal connected to EBI and NAND controllers\n");
1090-
return -EINVAL;
1091-
}
1140+
ret = stm32_fmc2_ebi_nwait_used_by_ctrls(ebi);
1141+
if (ret)
1142+
return ret;
10921143

10931144
stm32_fmc2_ebi_enable(ebi);
10941145

@@ -1133,7 +1184,10 @@ static int stm32_fmc2_ebi_probe(struct platform_device *pdev)
11331184
if (ret)
11341185
goto err_release;
11351186

1136-
stm32_fmc2_ebi_save_setup(ebi);
1187+
ret = stm32_fmc2_ebi_save_setup(ebi);
1188+
if (ret)
1189+
goto err_release;
1190+
11371191
platform_set_drvdata(pdev, ebi);
11381192

11391193
return 0;

0 commit comments

Comments
 (0)