Skip to content

Commit 2be589e

Browse files
pekonguptacomputersforpeace
authored andcommitted
mtd: nand: omap: add support for BCH16_ECC - ELM driver updates
ELM hardware engine is used to detect ECC errors for BCHx ecc-schemes (like BCH4/BCH8/BCH16). This patch extends configuration of ELM registers for adding support of BCH16_HW ecc-scheme. Signed-off-by: Pekon Gupta <pekon@ti.com> Signed-off-by: Brian Norris <computersforpeace@gmail.com>
1 parent 27c9fd6 commit 2be589e

File tree

2 files changed

+38
-1
lines changed
  • drivers/mtd/devices
  • include/linux/platform_data

2 files changed

+38
-1
lines changed

drivers/mtd/devices/elm.c

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -213,6 +213,28 @@ static void elm_load_syndrome(struct elm_info *info,
213213
val = cpu_to_be32(*(u32 *) &ecc[0]) >> 12;
214214
elm_write_reg(info, offset, val);
215215
break;
216+
case BCH16_ECC:
217+
val = cpu_to_be32(*(u32 *) &ecc[22]);
218+
elm_write_reg(info, offset, val);
219+
offset += 4;
220+
val = cpu_to_be32(*(u32 *) &ecc[18]);
221+
elm_write_reg(info, offset, val);
222+
offset += 4;
223+
val = cpu_to_be32(*(u32 *) &ecc[14]);
224+
elm_write_reg(info, offset, val);
225+
offset += 4;
226+
val = cpu_to_be32(*(u32 *) &ecc[10]);
227+
elm_write_reg(info, offset, val);
228+
offset += 4;
229+
val = cpu_to_be32(*(u32 *) &ecc[6]);
230+
elm_write_reg(info, offset, val);
231+
offset += 4;
232+
val = cpu_to_be32(*(u32 *) &ecc[2]);
233+
elm_write_reg(info, offset, val);
234+
offset += 4;
235+
val = cpu_to_be32(*(u32 *) &ecc[0]) >> 16;
236+
elm_write_reg(info, offset, val);
237+
break;
216238
default:
217239
pr_err("invalid config bch_type\n");
218240
}
@@ -436,6 +458,13 @@ static int elm_context_save(struct elm_info *info)
436458
for (i = 0; i < ERROR_VECTOR_MAX; i++) {
437459
offset = i * SYNDROME_FRAGMENT_REG_SIZE;
438460
switch (bch_type) {
461+
case BCH16_ECC:
462+
regs->elm_syndrome_fragment_6[i] = elm_read_reg(info,
463+
ELM_SYNDROME_FRAGMENT_6 + offset);
464+
regs->elm_syndrome_fragment_5[i] = elm_read_reg(info,
465+
ELM_SYNDROME_FRAGMENT_5 + offset);
466+
regs->elm_syndrome_fragment_4[i] = elm_read_reg(info,
467+
ELM_SYNDROME_FRAGMENT_4 + offset);
439468
case BCH8_ECC:
440469
regs->elm_syndrome_fragment_3[i] = elm_read_reg(info,
441470
ELM_SYNDROME_FRAGMENT_3 + offset);
@@ -474,6 +503,13 @@ static int elm_context_restore(struct elm_info *info)
474503
for (i = 0; i < ERROR_VECTOR_MAX; i++) {
475504
offset = i * SYNDROME_FRAGMENT_REG_SIZE;
476505
switch (bch_type) {
506+
case BCH16_ECC:
507+
elm_write_reg(info, ELM_SYNDROME_FRAGMENT_6 + offset,
508+
regs->elm_syndrome_fragment_6[i]);
509+
elm_write_reg(info, ELM_SYNDROME_FRAGMENT_5 + offset,
510+
regs->elm_syndrome_fragment_5[i]);
511+
elm_write_reg(info, ELM_SYNDROME_FRAGMENT_4 + offset,
512+
regs->elm_syndrome_fragment_4[i]);
477513
case BCH8_ECC:
478514
elm_write_reg(info, ELM_SYNDROME_FRAGMENT_3 + offset,
479515
regs->elm_syndrome_fragment_3[i]);

include/linux/platform_data/elm.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
enum bch_ecc {
2222
BCH4_ECC = 0,
2323
BCH8_ECC,
24+
BCH16_ECC,
2425
};
2526

2627
/* ELM support 8 error syndrome process */
@@ -38,7 +39,7 @@ struct elm_errorvec {
3839
bool error_reported;
3940
bool error_uncorrectable;
4041
int error_count;
41-
int error_loc[ERROR_VECTOR_MAX];
42+
int error_loc[16];
4243
};
4344

4445
void elm_decode_bch_error_page(struct device *dev, u8 *ecc_calc,

0 commit comments

Comments
 (0)