Commit 2be589e4b28457f148640dc6addf6da24af64b7f
Committed by
Brian Norris
1 parent
27c9fd6075
Exists in
ti-lsk-linux-4.1.y
and in
10 other branches
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>
Showing 2 changed files with 38 additions and 1 deletions Side-by-side Diff
drivers/mtd/devices/elm.c
... | ... | @@ -213,6 +213,28 @@ |
213 | 213 | val = cpu_to_be32(*(u32 *) &ecc[0]) >> 12; |
214 | 214 | elm_write_reg(info, offset, val); |
215 | 215 | 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; | |
216 | 238 | default: |
217 | 239 | pr_err("invalid config bch_type\n"); |
218 | 240 | } |
... | ... | @@ -436,6 +458,13 @@ |
436 | 458 | for (i = 0; i < ERROR_VECTOR_MAX; i++) { |
437 | 459 | offset = i * SYNDROME_FRAGMENT_REG_SIZE; |
438 | 460 | 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); | |
439 | 468 | case BCH8_ECC: |
440 | 469 | regs->elm_syndrome_fragment_3[i] = elm_read_reg(info, |
441 | 470 | ELM_SYNDROME_FRAGMENT_3 + offset); |
... | ... | @@ -474,6 +503,13 @@ |
474 | 503 | for (i = 0; i < ERROR_VECTOR_MAX; i++) { |
475 | 504 | offset = i * SYNDROME_FRAGMENT_REG_SIZE; |
476 | 505 | 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]); | |
477 | 513 | case BCH8_ECC: |
478 | 514 | elm_write_reg(info, ELM_SYNDROME_FRAGMENT_3 + offset, |
479 | 515 | regs->elm_syndrome_fragment_3[i]); |
include/linux/platform_data/elm.h
... | ... | @@ -21,6 +21,7 @@ |
21 | 21 | enum bch_ecc { |
22 | 22 | BCH4_ECC = 0, |
23 | 23 | BCH8_ECC, |
24 | + BCH16_ECC, | |
24 | 25 | }; |
25 | 26 | |
26 | 27 | /* ELM support 8 error syndrome process */ |
... | ... | @@ -38,7 +39,7 @@ |
38 | 39 | bool error_reported; |
39 | 40 | bool error_uncorrectable; |
40 | 41 | int error_count; |
41 | - int error_loc[ERROR_VECTOR_MAX]; | |
42 | + int error_loc[16]; | |
42 | 43 | }; |
43 | 44 | |
44 | 45 | void elm_decode_bch_error_page(struct device *dev, u8 *ecc_calc, |