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);
107 struct elm_info *info = dev_get_drvdata(dev);
109 if (!info) {
125 elm_write_reg(info, ELM_LOCATION_CONFIG, reg_val);
126 info->bch_type = bch_type;
127 info->ecc_steps = ecc_steps;
128 info->ecc_syndrome_size = ecc_syndrome_size;
136 * @info: elm info
142 static void elm_configure_page_mode(struct elm_info *info, int index,
147 reg_val = elm_read_reg(info, ELM_PAGE_CTRL);
153 elm_write_reg(info, ELM_PAGE_CTRL, reg_val);
158 * @info: elm info
164 static void elm_load_syndrome(struct elm_info *info,
170 for (i = 0; i < info->ecc_steps; i++) {
174 elm_configure_page_mode(info, i, true);
177 switch (info->bch_type) {
181 elm_write_reg(info, offset, val);
186 elm_write_reg(info, offset, val);
191 elm_write_reg(info, offset, val);
196 elm_write_reg(info, offset, val);
202 elm_write_reg(info, offset, val);
207 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);
229 elm_write_reg(info, offset, val);
237 ecc += info->ecc_syndrome_size;
243 * @info: elm info
250 static void elm_start_processing(struct elm_info *info,
260 for (i = 0; i < info->ecc_steps; i++) {
264 reg_val = elm_read_reg(info, offset);
266 elm_write_reg(info, offset, reg_val);
273 * @info: elm info
282 static void elm_error_correction(struct elm_info *info,
289 for (i = 0; i < info->ecc_steps; i++) {
294 reg_val = elm_read_reg(info, offset);
308 reg_val = elm_read_reg(info, offset);
320 elm_write_reg(info, ELM_IRQSTATUS, BIT(i));
323 elm_configure_page_mode(info, i, false);
340 struct elm_info *info = dev_get_drvdata(dev);
344 reg_val = elm_read_reg(info, ELM_IRQSTATUS);
345 elm_write_reg(info, ELM_IRQSTATUS, reg_val & INTR_STATUS_PAGE_VALID);
346 elm_write_reg(info, ELM_IRQENABLE, INTR_EN_PAGE_MASK);
349 elm_load_syndrome(info, err_vec, ecc_calc);
352 elm_start_processing(info, err_vec);
355 wait_for_completion(&info->elm_completion);
358 reg_val = elm_read_reg(info, ELM_IRQENABLE);
359 elm_write_reg(info, ELM_IRQENABLE, reg_val & ~INTR_EN_PAGE_MASK);
360 elm_error_correction(info, err_vec);
367 struct elm_info *info = dev_id;
369 reg_val = elm_read_reg(info, ELM_IRQSTATUS);
373 elm_write_reg(info, ELM_IRQSTATUS,
375 complete(&info->elm_completion);
385 struct elm_info *info;
388 info = devm_kzalloc(&pdev->dev, sizeof(*info), GFP_KERNEL);
389 if (!info)
392 info->dev = &pdev->dev;
398 info->elm_base = devm_platform_ioremap_resource(pdev, 0);
399 if (IS_ERR(info->elm_base))
400 return PTR_ERR(info->elm_base);
403 pdev->name, info);
418 init_completion(&info->elm_completion);
419 INIT_LIST_HEAD(&info->list);
420 list_add(&info->list, &elm_devices);
421 platform_set_drvdata(pdev, info);
436 static int elm_context_save(struct elm_info *info)
438 struct elm_registers *regs = &info->elm_regs;
439 enum bch_ecc bch_type = info->bch_type;
442 regs->elm_irqenable = elm_read_reg(info, ELM_IRQENABLE);
443 regs->elm_sysconfig = elm_read_reg(info, ELM_SYSCONFIG);
444 regs->elm_location_config = elm_read_reg(info, ELM_LOCATION_CONFIG);
445 regs->elm_page_ctrl = elm_read_reg(info, ELM_PAGE_CTRL);
450 regs->elm_syndrome_fragment_6[i] = elm_read_reg(info,
452 regs->elm_syndrome_fragment_5[i] = elm_read_reg(info,
454 regs->elm_syndrome_fragment_4[i] = elm_read_reg(info,
458 regs->elm_syndrome_fragment_3[i] = elm_read_reg(info,
460 regs->elm_syndrome_fragment_2[i] = elm_read_reg(info,
464 regs->elm_syndrome_fragment_1[i] = elm_read_reg(info,
466 regs->elm_syndrome_fragment_0[i] = elm_read_reg(info,
474 regs->elm_syndrome_fragment_6[i] = elm_read_reg(info,
484 static int elm_context_restore(struct elm_info *info)
486 struct elm_registers *regs = &info->elm_regs;
487 enum bch_ecc bch_type = info->bch_type;
490 elm_write_reg(info, ELM_IRQENABLE, regs->elm_irqenable);
491 elm_write_reg(info, ELM_SYSCONFIG, regs->elm_sysconfig);
492 elm_write_reg(info, ELM_LOCATION_CONFIG, regs->elm_location_config);
493 elm_write_reg(info, ELM_PAGE_CTRL, regs->elm_page_ctrl);
498 elm_write_reg(info, ELM_SYNDROME_FRAGMENT_6 + offset,
500 elm_write_reg(info, ELM_SYNDROME_FRAGMENT_5 + offset,
502 elm_write_reg(info, ELM_SYNDROME_FRAGMENT_4 + offset,
506 elm_write_reg(info, ELM_SYNDROME_FRAGMENT_3 + offset,
508 elm_write_reg(info, ELM_SYNDROME_FRAGMENT_2 + offset,
512 elm_write_reg(info, ELM_SYNDROME_FRAGMENT_1 + offset,
514 elm_write_reg(info, ELM_SYNDROME_FRAGMENT_0 + offset,
521 elm_write_reg(info, ELM_SYNDROME_FRAGMENT_6 + offset,
530 struct elm_info *info = dev_get_drvdata(dev);
531 elm_context_save(info);
538 struct elm_info *info = dev_get_drvdata(dev);
540 elm_context_restore(info);