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>
This commit is contained in:

committed by
Brian Norris

parent
27c9fd6075
commit
2be589e4b2
@@ -213,6 +213,28 @@ static void elm_load_syndrome(struct elm_info *info,
|
||||
val = cpu_to_be32(*(u32 *) &ecc[0]) >> 12;
|
||||
elm_write_reg(info, offset, val);
|
||||
break;
|
||||
case BCH16_ECC:
|
||||
val = cpu_to_be32(*(u32 *) &ecc[22]);
|
||||
elm_write_reg(info, offset, val);
|
||||
offset += 4;
|
||||
val = cpu_to_be32(*(u32 *) &ecc[18]);
|
||||
elm_write_reg(info, offset, val);
|
||||
offset += 4;
|
||||
val = cpu_to_be32(*(u32 *) &ecc[14]);
|
||||
elm_write_reg(info, offset, val);
|
||||
offset += 4;
|
||||
val = cpu_to_be32(*(u32 *) &ecc[10]);
|
||||
elm_write_reg(info, offset, val);
|
||||
offset += 4;
|
||||
val = cpu_to_be32(*(u32 *) &ecc[6]);
|
||||
elm_write_reg(info, offset, val);
|
||||
offset += 4;
|
||||
val = cpu_to_be32(*(u32 *) &ecc[2]);
|
||||
elm_write_reg(info, offset, val);
|
||||
offset += 4;
|
||||
val = cpu_to_be32(*(u32 *) &ecc[0]) >> 16;
|
||||
elm_write_reg(info, offset, val);
|
||||
break;
|
||||
default:
|
||||
pr_err("invalid config bch_type\n");
|
||||
}
|
||||
@@ -436,6 +458,13 @@ static int elm_context_save(struct elm_info *info)
|
||||
for (i = 0; i < ERROR_VECTOR_MAX; i++) {
|
||||
offset = i * SYNDROME_FRAGMENT_REG_SIZE;
|
||||
switch (bch_type) {
|
||||
case BCH16_ECC:
|
||||
regs->elm_syndrome_fragment_6[i] = elm_read_reg(info,
|
||||
ELM_SYNDROME_FRAGMENT_6 + offset);
|
||||
regs->elm_syndrome_fragment_5[i] = elm_read_reg(info,
|
||||
ELM_SYNDROME_FRAGMENT_5 + offset);
|
||||
regs->elm_syndrome_fragment_4[i] = elm_read_reg(info,
|
||||
ELM_SYNDROME_FRAGMENT_4 + offset);
|
||||
case BCH8_ECC:
|
||||
regs->elm_syndrome_fragment_3[i] = elm_read_reg(info,
|
||||
ELM_SYNDROME_FRAGMENT_3 + offset);
|
||||
@@ -474,6 +503,13 @@ static int elm_context_restore(struct elm_info *info)
|
||||
for (i = 0; i < ERROR_VECTOR_MAX; i++) {
|
||||
offset = i * SYNDROME_FRAGMENT_REG_SIZE;
|
||||
switch (bch_type) {
|
||||
case BCH16_ECC:
|
||||
elm_write_reg(info, ELM_SYNDROME_FRAGMENT_6 + offset,
|
||||
regs->elm_syndrome_fragment_6[i]);
|
||||
elm_write_reg(info, ELM_SYNDROME_FRAGMENT_5 + offset,
|
||||
regs->elm_syndrome_fragment_5[i]);
|
||||
elm_write_reg(info, ELM_SYNDROME_FRAGMENT_4 + offset,
|
||||
regs->elm_syndrome_fragment_4[i]);
|
||||
case BCH8_ECC:
|
||||
elm_write_reg(info, ELM_SYNDROME_FRAGMENT_3 + offset,
|
||||
regs->elm_syndrome_fragment_3[i]);
|
||||
|
Reference in New Issue
Block a user