Lines Matching refs:info

85 static void elm_write_reg(struct elm_info *info, int offset, u32 val)
87 writel(val, info->elm_base + offset);
90 static u32 elm_read_reg(struct elm_info *info, int offset)
92 return readl(info->elm_base + offset);
104 struct elm_info *info = dev_get_drvdata(dev);
106 if (!info) {
122 elm_write_reg(info, ELM_LOCATION_CONFIG, reg_val);
123 info->bch_type = bch_type;
124 info->ecc_steps = ecc_steps;
125 info->ecc_syndrome_size = ecc_syndrome_size;
133 * @info: elm info
139 static void elm_configure_page_mode(struct elm_info *info, int index,
144 reg_val = elm_read_reg(info, ELM_PAGE_CTRL);
150 elm_write_reg(info, ELM_PAGE_CTRL, reg_val);
155 * @info: elm info
161 static void elm_load_syndrome(struct elm_info *info,
167 for (i = 0; i < info->ecc_steps; i++) {
171 elm_configure_page_mode(info, i, true);
174 switch (info->bch_type) {
178 elm_write_reg(info, offset, val);
183 elm_write_reg(info, offset, val);
188 elm_write_reg(info, offset, val);
193 elm_write_reg(info, offset, val);
199 elm_write_reg(info, offset, val);
204 elm_write_reg(info, offset, val);
208 elm_write_reg(info, offset, val);
211 elm_write_reg(info, offset, val);
214 elm_write_reg(info, offset, val);
217 elm_write_reg(info, offset, val);
220 elm_write_reg(info, offset, val);
223 elm_write_reg(info, offset, val);
226 elm_write_reg(info, offset, val);
234 ecc += info->ecc_syndrome_size;
240 * @info: elm info
247 static void elm_start_processing(struct elm_info *info,
257 for (i = 0; i < info->ecc_steps; i++) {
261 reg_val = elm_read_reg(info, offset);
263 elm_write_reg(info, offset, reg_val);
270 * @info: elm info
279 static void elm_error_correction(struct elm_info *info,
286 for (i = 0; i < info->ecc_steps; i++) {
291 reg_val = elm_read_reg(info, offset);
305 reg_val = elm_read_reg(info, offset);
319 elm_write_reg(info, ELM_IRQSTATUS, BIT(i));
322 elm_configure_page_mode(info, i, false);
339 struct elm_info *info = dev_get_drvdata(dev);
343 reg_val = elm_read_reg(info, ELM_IRQSTATUS);
344 elm_write_reg(info, ELM_IRQSTATUS, reg_val & INTR_STATUS_PAGE_VALID);
345 elm_write_reg(info, ELM_IRQENABLE, INTR_EN_PAGE_MASK);
348 elm_load_syndrome(info, err_vec, ecc_calc);
351 elm_start_processing(info, err_vec);
354 wait_for_completion(&info->elm_completion);
357 reg_val = elm_read_reg(info, ELM_IRQENABLE);
358 elm_write_reg(info, ELM_IRQENABLE, reg_val & ~INTR_EN_PAGE_MASK);
359 elm_error_correction(info, err_vec);
366 struct elm_info *info = dev_id;
368 reg_val = elm_read_reg(info, ELM_IRQSTATUS);
372 elm_write_reg(info, ELM_IRQSTATUS,
374 complete(&info->elm_completion);
385 struct elm_info *info;
387 info = devm_kzalloc(&pdev->dev, sizeof(*info), GFP_KERNEL);
388 if (!info)
391 info->dev = &pdev->dev;
400 info->elm_base = devm_ioremap_resource(&pdev->dev, res);
401 if (IS_ERR(info->elm_base))
402 return PTR_ERR(info->elm_base);
405 pdev->name, info);
420 init_completion(&info->elm_completion);
421 INIT_LIST_HEAD(&info->list);
422 list_add(&info->list, &elm_devices);
423 platform_set_drvdata(pdev, info);
439 static int elm_context_save(struct elm_info *info)
441 struct elm_registers *regs = &info->elm_regs;
442 enum bch_ecc bch_type = info->bch_type;
445 regs->elm_irqenable = elm_read_reg(info, ELM_IRQENABLE);
446 regs->elm_sysconfig = elm_read_reg(info, ELM_SYSCONFIG);
447 regs->elm_location_config = elm_read_reg(info, ELM_LOCATION_CONFIG);
448 regs->elm_page_ctrl = elm_read_reg(info, ELM_PAGE_CTRL);
453 regs->elm_syndrome_fragment_6[i] = elm_read_reg(info,
455 regs->elm_syndrome_fragment_5[i] = elm_read_reg(info,
457 regs->elm_syndrome_fragment_4[i] = elm_read_reg(info,
461 regs->elm_syndrome_fragment_3[i] = elm_read_reg(info,
463 regs->elm_syndrome_fragment_2[i] = elm_read_reg(info,
467 regs->elm_syndrome_fragment_1[i] = elm_read_reg(info,
469 regs->elm_syndrome_fragment_0[i] = elm_read_reg(info,
477 regs->elm_syndrome_fragment_6[i] = elm_read_reg(info,
487 static int elm_context_restore(struct elm_info *info)
489 struct elm_registers *regs = &info->elm_regs;
490 enum bch_ecc bch_type = info->bch_type;
493 elm_write_reg(info, ELM_IRQENABLE, regs->elm_irqenable);
494 elm_write_reg(info, ELM_SYSCONFIG, regs->elm_sysconfig);
495 elm_write_reg(info, ELM_LOCATION_CONFIG, regs->elm_location_config);
496 elm_write_reg(info, ELM_PAGE_CTRL, regs->elm_page_ctrl);
501 elm_write_reg(info, ELM_SYNDROME_FRAGMENT_6 + offset,
503 elm_write_reg(info, ELM_SYNDROME_FRAGMENT_5 + offset,
505 elm_write_reg(info, ELM_SYNDROME_FRAGMENT_4 + offset,
509 elm_write_reg(info, ELM_SYNDROME_FRAGMENT_3 + offset,
511 elm_write_reg(info, ELM_SYNDROME_FRAGMENT_2 + offset,
515 elm_write_reg(info, ELM_SYNDROME_FRAGMENT_1 + offset,
517 elm_write_reg(info, ELM_SYNDROME_FRAGMENT_0 + offset,
524 elm_write_reg(info, ELM_SYNDROME_FRAGMENT_6 + offset,
533 struct elm_info *info = dev_get_drvdata(dev);
534 elm_context_save(info);
541 struct elm_info *info = dev_get_drvdata(dev);
543 elm_context_restore(info);