Skip to content

Commit 0e1db39

Browse files
Arseniy Krasnovmiquelraynal
authored andcommitted
mtd: rawnand: meson: support for 512B ECC step size
Meson NAND supports both 512B and 1024B ECC step size. Signed-off-by: Arseniy Krasnov <AVKrasnov@sberdevices.ru> Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com> Link: https://lore.kernel.org/linux-mtd/20230717053402.1203724-3-AVKrasnov@sberdevices.ru
1 parent 350301a commit 0e1db39

1 file changed

Lines changed: 34 additions & 11 deletions

File tree

drivers/mtd/nand/raw/meson_nand.c

Lines changed: 34 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,7 @@ struct meson_nfc_nand_chip {
135135
struct meson_nand_ecc {
136136
u32 bch;
137137
u32 strength;
138+
u32 size;
138139
};
139140

140141
struct meson_nfc_data {
@@ -190,23 +191,25 @@ struct meson_nfc {
190191
};
191192

192193
enum {
193-
NFC_ECC_BCH8_1K = 2,
194+
NFC_ECC_BCH8_512 = 1,
195+
NFC_ECC_BCH8_1K,
194196
NFC_ECC_BCH24_1K,
195197
NFC_ECC_BCH30_1K,
196198
NFC_ECC_BCH40_1K,
197199
NFC_ECC_BCH50_1K,
198200
NFC_ECC_BCH60_1K,
199201
};
200202

201-
#define MESON_ECC_DATA(b, s) { .bch = (b), .strength = (s)}
203+
#define MESON_ECC_DATA(b, s, sz) { .bch = (b), .strength = (s), .size = (sz) }
202204

203205
static struct meson_nand_ecc meson_ecc[] = {
204-
MESON_ECC_DATA(NFC_ECC_BCH8_1K, 8),
205-
MESON_ECC_DATA(NFC_ECC_BCH24_1K, 24),
206-
MESON_ECC_DATA(NFC_ECC_BCH30_1K, 30),
207-
MESON_ECC_DATA(NFC_ECC_BCH40_1K, 40),
208-
MESON_ECC_DATA(NFC_ECC_BCH50_1K, 50),
209-
MESON_ECC_DATA(NFC_ECC_BCH60_1K, 60),
206+
MESON_ECC_DATA(NFC_ECC_BCH8_512, 8, 512),
207+
MESON_ECC_DATA(NFC_ECC_BCH8_1K, 8, 1024),
208+
MESON_ECC_DATA(NFC_ECC_BCH24_1K, 24, 1024),
209+
MESON_ECC_DATA(NFC_ECC_BCH30_1K, 30, 1024),
210+
MESON_ECC_DATA(NFC_ECC_BCH40_1K, 40, 1024),
211+
MESON_ECC_DATA(NFC_ECC_BCH50_1K, 50, 1024),
212+
MESON_ECC_DATA(NFC_ECC_BCH60_1K, 60, 1024),
210213
};
211214

212215
static int meson_nand_calc_ecc_bytes(int step_size, int strength)
@@ -224,8 +227,27 @@ static int meson_nand_calc_ecc_bytes(int step_size, int strength)
224227

225228
NAND_ECC_CAPS_SINGLE(meson_gxl_ecc_caps,
226229
meson_nand_calc_ecc_bytes, 1024, 8, 24, 30, 40, 50, 60);
227-
NAND_ECC_CAPS_SINGLE(meson_axg_ecc_caps,
228-
meson_nand_calc_ecc_bytes, 1024, 8);
230+
231+
static const int axg_stepinfo_strengths[] = { 8 };
232+
static const struct nand_ecc_step_info axg_stepinfo_1024 = {
233+
.stepsize = 1024,
234+
.strengths = axg_stepinfo_strengths,
235+
.nstrengths = ARRAY_SIZE(axg_stepinfo_strengths)
236+
};
237+
238+
static const struct nand_ecc_step_info axg_stepinfo_512 = {
239+
.stepsize = 512,
240+
.strengths = axg_stepinfo_strengths,
241+
.nstrengths = ARRAY_SIZE(axg_stepinfo_strengths)
242+
};
243+
244+
static const struct nand_ecc_step_info axg_stepinfo[] = { axg_stepinfo_1024, axg_stepinfo_512 };
245+
246+
static const struct nand_ecc_caps meson_axg_ecc_caps = {
247+
.stepinfos = axg_stepinfo,
248+
.nstepinfos = ARRAY_SIZE(axg_stepinfo),
249+
.calc_ecc_bytes = meson_nand_calc_ecc_bytes,
250+
};
229251

230252
static struct meson_nfc_nand_chip *to_meson_nand(struct nand_chip *nand)
231253
{
@@ -1257,7 +1279,8 @@ static int meson_nand_bch_mode(struct nand_chip *nand)
12571279
return -EINVAL;
12581280

12591281
for (i = 0; i < ARRAY_SIZE(meson_ecc); i++) {
1260-
if (meson_ecc[i].strength == nand->ecc.strength) {
1282+
if (meson_ecc[i].strength == nand->ecc.strength &&
1283+
meson_ecc[i].size == nand->ecc.size) {
12611284
meson_chip->bch_mode = meson_ecc[i].bch;
12621285
return 0;
12631286
}

0 commit comments

Comments
 (0)