Lines Matching +full:enable +full:- +full:offset

1 // SPDX-License-Identifier: GPL-2.0-or-later
5 * Copyright (C) 2012 Texas Instruments Incorporated - https://www.ti.com/
8 #define DRIVER_NAME "omap-elm"
37 /* ELM Interrupt Enable Register */
50 /* ELM_ERROR_LOCATION_0-15 Registers */
85 static void elm_write_reg(struct elm_info *info, int offset, u32 val) in elm_write_reg() argument
87 writel(val, info->elm_base + offset); in elm_write_reg()
90 static u32 elm_read_reg(struct elm_info *info, int offset) in elm_read_reg() argument
92 return readl(info->elm_base + offset); in elm_read_reg()
96 * elm_config - Configure ELM module
110 dev_err(dev, "Unable to configure elm - device not probed?\n"); in elm_config()
111 return -EPROBE_DEFER; in elm_config()
115 dev_err(dev, "unsupported config ecc-size=%d\n", ecc_step_size); in elm_config()
116 return -EINVAL; in elm_config()
120 dev_err(dev, "unsupported config ecc-step=%d\n", ecc_steps); in elm_config()
121 return -EINVAL; in elm_config()
126 info->bch_type = bch_type; in elm_config()
127 info->ecc_steps = ecc_steps; in elm_config()
128 info->ecc_syndrome_size = ecc_syndrome_size; in elm_config()
135 * elm_configure_page_mode - Enable/Disable page mode
138 * @enable: enable/disable flag for page mode
140 * Enable page mode for syndrome fragment index
143 bool enable) in elm_configure_page_mode() argument
148 if (enable) in elm_configure_page_mode()
149 reg_val |= BIT(index); /* enable page mode */ in elm_configure_page_mode()
157 * elm_load_syndrome - Load ELM syndrome reg
167 int i, offset; in elm_load_syndrome() local
170 for (i = 0; i < info->ecc_steps; i++) { in elm_load_syndrome()
175 offset = ELM_SYNDROME_FRAGMENT_0 + in elm_load_syndrome()
177 switch (info->bch_type) { in elm_load_syndrome()
179 /* syndrome fragment 0 = ecc[9-12B] */ in elm_load_syndrome()
181 elm_write_reg(info, offset, val); in elm_load_syndrome()
183 /* syndrome fragment 1 = ecc[5-8B] */ in elm_load_syndrome()
184 offset += 4; in elm_load_syndrome()
186 elm_write_reg(info, offset, val); in elm_load_syndrome()
188 /* syndrome fragment 2 = ecc[1-4B] */ in elm_load_syndrome()
189 offset += 4; in elm_load_syndrome()
191 elm_write_reg(info, offset, val); in elm_load_syndrome()
194 offset += 4; in elm_load_syndrome()
196 elm_write_reg(info, offset, val); in elm_load_syndrome()
199 /* syndrome fragment 0 = ecc[20-52b] bits */ in elm_load_syndrome()
202 elm_write_reg(info, offset, val); in elm_load_syndrome()
204 /* syndrome fragment 1 = ecc[0-20b] bits */ in elm_load_syndrome()
205 offset += 4; in elm_load_syndrome()
207 elm_write_reg(info, offset, val); in elm_load_syndrome()
211 elm_write_reg(info, offset, val); in elm_load_syndrome()
212 offset += 4; in elm_load_syndrome()
214 elm_write_reg(info, offset, val); in elm_load_syndrome()
215 offset += 4; in elm_load_syndrome()
217 elm_write_reg(info, offset, val); in elm_load_syndrome()
218 offset += 4; in elm_load_syndrome()
220 elm_write_reg(info, offset, val); in elm_load_syndrome()
221 offset += 4; in elm_load_syndrome()
223 elm_write_reg(info, offset, val); in elm_load_syndrome()
224 offset += 4; in elm_load_syndrome()
226 elm_write_reg(info, offset, val); in elm_load_syndrome()
227 offset += 4; in elm_load_syndrome()
229 elm_write_reg(info, offset, val); in elm_load_syndrome()
237 ecc += info->ecc_syndrome_size; in elm_load_syndrome()
242 * elm_start_processing - start elm syndrome processing
253 int i, offset; in elm_start_processing() local
260 for (i = 0; i < info->ecc_steps; i++) { in elm_start_processing()
262 offset = ELM_SYNDROME_FRAGMENT_6 + in elm_start_processing()
264 reg_val = elm_read_reg(info, offset); in elm_start_processing()
266 elm_write_reg(info, offset, reg_val); in elm_start_processing()
272 * elm_error_correction - locate correctable error position
286 int offset; in elm_error_correction() local
289 for (i = 0; i < info->ecc_steps; i++) { in elm_error_correction()
293 offset = ELM_LOCATION_STATUS + ERROR_LOCATION_SIZE * i; in elm_error_correction()
294 reg_val = elm_read_reg(info, offset); in elm_error_correction()
298 offset = ELM_ERROR_LOCATION_0 + in elm_error_correction()
308 reg_val = elm_read_reg(info, offset); in elm_error_correction()
313 offset += 4; in elm_error_correction()
329 * elm_decode_bch_error_page - Locate error position
343 /* Enable page mode interrupt */ in elm_decode_bch_error_page()
351 /* Enable syndrome processing for which syndrome fragment is updated */ in elm_decode_bch_error_page()
355 wait_for_completion(&info->elm_completion); in elm_decode_bch_error_page()
375 complete(&info->elm_completion); in elm_isr()
388 info = devm_kzalloc(&pdev->dev, sizeof(*info), GFP_KERNEL); in elm_probe()
390 return -ENOMEM; in elm_probe()
392 info->dev = &pdev->dev; in elm_probe()
398 info->elm_base = devm_platform_ioremap_resource(pdev, 0); in elm_probe()
399 if (IS_ERR(info->elm_base)) in elm_probe()
400 return PTR_ERR(info->elm_base); in elm_probe()
402 ret = devm_request_irq(&pdev->dev, irq, elm_isr, 0, in elm_probe()
403 pdev->name, info); in elm_probe()
405 dev_err(&pdev->dev, "failure requesting %d\n", irq); in elm_probe()
409 pm_runtime_enable(&pdev->dev); in elm_probe()
410 if (pm_runtime_get_sync(&pdev->dev) < 0) { in elm_probe()
411 ret = -EINVAL; in elm_probe()
412 pm_runtime_put_sync(&pdev->dev); in elm_probe()
413 pm_runtime_disable(&pdev->dev); in elm_probe()
414 dev_err(&pdev->dev, "can't enable clock\n"); in elm_probe()
418 init_completion(&info->elm_completion); in elm_probe()
419 INIT_LIST_HEAD(&info->list); in elm_probe()
420 list_add(&info->list, &elm_devices); in elm_probe()
427 pm_runtime_put_sync(&pdev->dev); in elm_remove()
428 pm_runtime_disable(&pdev->dev); in elm_remove()
434 * saves ELM configurations to preserve them across Hardware powered-down
438 struct elm_registers *regs = &info->elm_regs; in elm_context_save()
439 enum bch_ecc bch_type = info->bch_type; in elm_context_save()
440 u32 offset = 0, i; in elm_context_save() local
442 regs->elm_irqenable = elm_read_reg(info, ELM_IRQENABLE); in elm_context_save()
443 regs->elm_sysconfig = elm_read_reg(info, ELM_SYSCONFIG); in elm_context_save()
444 regs->elm_location_config = elm_read_reg(info, ELM_LOCATION_CONFIG); in elm_context_save()
445 regs->elm_page_ctrl = elm_read_reg(info, ELM_PAGE_CTRL); in elm_context_save()
447 offset = i * SYNDROME_FRAGMENT_REG_SIZE; in elm_context_save()
450 regs->elm_syndrome_fragment_6[i] = elm_read_reg(info, in elm_context_save()
451 ELM_SYNDROME_FRAGMENT_6 + offset); in elm_context_save()
452 regs->elm_syndrome_fragment_5[i] = elm_read_reg(info, in elm_context_save()
453 ELM_SYNDROME_FRAGMENT_5 + offset); in elm_context_save()
454 regs->elm_syndrome_fragment_4[i] = elm_read_reg(info, in elm_context_save()
455 ELM_SYNDROME_FRAGMENT_4 + offset); in elm_context_save()
458 regs->elm_syndrome_fragment_3[i] = elm_read_reg(info, in elm_context_save()
459 ELM_SYNDROME_FRAGMENT_3 + offset); in elm_context_save()
460 regs->elm_syndrome_fragment_2[i] = elm_read_reg(info, in elm_context_save()
461 ELM_SYNDROME_FRAGMENT_2 + offset); in elm_context_save()
464 regs->elm_syndrome_fragment_1[i] = elm_read_reg(info, in elm_context_save()
465 ELM_SYNDROME_FRAGMENT_1 + offset); in elm_context_save()
466 regs->elm_syndrome_fragment_0[i] = elm_read_reg(info, in elm_context_save()
467 ELM_SYNDROME_FRAGMENT_0 + offset); in elm_context_save()
470 return -EINVAL; in elm_context_save()
474 regs->elm_syndrome_fragment_6[i] = elm_read_reg(info, in elm_context_save()
475 ELM_SYNDROME_FRAGMENT_6 + offset); in elm_context_save()
482 * writes configurations saved duing power-down back into ELM registers
486 struct elm_registers *regs = &info->elm_regs; in elm_context_restore()
487 enum bch_ecc bch_type = info->bch_type; in elm_context_restore()
488 u32 offset = 0, i; in elm_context_restore() local
490 elm_write_reg(info, ELM_IRQENABLE, regs->elm_irqenable); in elm_context_restore()
491 elm_write_reg(info, ELM_SYSCONFIG, regs->elm_sysconfig); in elm_context_restore()
492 elm_write_reg(info, ELM_LOCATION_CONFIG, regs->elm_location_config); in elm_context_restore()
493 elm_write_reg(info, ELM_PAGE_CTRL, regs->elm_page_ctrl); in elm_context_restore()
495 offset = i * SYNDROME_FRAGMENT_REG_SIZE; in elm_context_restore()
498 elm_write_reg(info, ELM_SYNDROME_FRAGMENT_6 + offset, in elm_context_restore()
499 regs->elm_syndrome_fragment_6[i]); in elm_context_restore()
500 elm_write_reg(info, ELM_SYNDROME_FRAGMENT_5 + offset, in elm_context_restore()
501 regs->elm_syndrome_fragment_5[i]); in elm_context_restore()
502 elm_write_reg(info, ELM_SYNDROME_FRAGMENT_4 + offset, in elm_context_restore()
503 regs->elm_syndrome_fragment_4[i]); in elm_context_restore()
506 elm_write_reg(info, ELM_SYNDROME_FRAGMENT_3 + offset, in elm_context_restore()
507 regs->elm_syndrome_fragment_3[i]); in elm_context_restore()
508 elm_write_reg(info, ELM_SYNDROME_FRAGMENT_2 + offset, in elm_context_restore()
509 regs->elm_syndrome_fragment_2[i]); in elm_context_restore()
512 elm_write_reg(info, ELM_SYNDROME_FRAGMENT_1 + offset, in elm_context_restore()
513 regs->elm_syndrome_fragment_1[i]); in elm_context_restore()
514 elm_write_reg(info, ELM_SYNDROME_FRAGMENT_0 + offset, in elm_context_restore()
515 regs->elm_syndrome_fragment_0[i]); in elm_context_restore()
518 return -EINVAL; in elm_context_restore()
521 elm_write_reg(info, ELM_SYNDROME_FRAGMENT_6 + offset, in elm_context_restore()
522 regs->elm_syndrome_fragment_6[i] & in elm_context_restore()
549 { .compatible = "ti,am3352-elm" },
550 { .compatible = "ti,am64-elm" },