Lines Matching defs:pmecc
53 #include "pmecc.h"
169 struct atmel_pmecc *pmecc;
277 static int atmel_pmecc_prepare_user_req(struct atmel_pmecc *pmecc,
309 for (i = 0; i < pmecc->caps->nstrengths; i++) {
310 int nbytes, strength = pmecc->caps->strengths[i];
343 atmel_pmecc_create_user(struct atmel_pmecc *pmecc,
350 ret = atmel_pmecc_prepare_user_req(pmecc, req);
369 user->pmecc = pmecc;
392 for (strength = 0; strength < pmecc->caps->nstrengths; strength++) {
393 if (pmecc->caps->strengths[strength] == req->ecc.strength)
419 const int *strengths = user->pmecc->caps->strengths;
437 value = readl_relaxed(user->pmecc->regs.base +
645 struct atmel_pmecc *pmecc = user->pmecc;
652 writel(PMERRLOC_DISABLE, pmecc->regs.errloc + ATMEL_PMERRLOC_ELDIS);
656 pmecc->regs.errloc + ATMEL_PMERRLOC_SIGMA(i));
664 writel(val, pmecc->regs.errloc + ATMEL_PMERRLOC_ELCFG);
666 pmecc->regs.errloc + ATMEL_PMERRLOC_ELEN);
668 ret = readl_relaxed_poll_timeout(pmecc->regs.errloc +
673 dev_err(pmecc->dev,
693 struct atmel_pmecc *pmecc = user->pmecc;
715 errpos = readl_relaxed(pmecc->regs.errloc +
716 ATMEL_PMERRLOC_EL(pmecc->caps->el_offset, i));
729 dev_dbg(pmecc->dev,
735 dev_dbg(pmecc->dev,
748 return user->pmecc->caps->correct_erased_chunks;
755 struct atmel_pmecc *pmecc = user->pmecc;
760 ptr[i] = readb_relaxed(pmecc->regs.base +
765 void atmel_pmecc_reset(struct atmel_pmecc *pmecc)
767 writel(PMECC_CTRL_RST, pmecc->regs.base + ATMEL_PMECC_CTRL);
768 writel(PMECC_CTRL_DISABLE, pmecc->regs.base + ATMEL_PMECC_CTRL);
774 struct atmel_pmecc *pmecc = user->pmecc;
778 dev_err(pmecc->dev, "Bad ECC operation!");
782 mutex_lock(&user->pmecc->lock);
790 writel(cfg, pmecc->regs.base + ATMEL_PMECC_CFG);
791 writel(user->cache.sarea, pmecc->regs.base + ATMEL_PMECC_SAREA);
792 writel(user->cache.saddr, pmecc->regs.base + ATMEL_PMECC_SADDR);
793 writel(user->cache.eaddr, pmecc->regs.base + ATMEL_PMECC_EADDR);
795 writel(PMECC_CTRL_ENABLE, pmecc->regs.base + ATMEL_PMECC_CTRL);
796 writel(PMECC_CTRL_DATA, pmecc->regs.base + ATMEL_PMECC_CTRL);
804 atmel_pmecc_reset(user->pmecc);
805 mutex_unlock(&user->pmecc->lock);
811 struct atmel_pmecc *pmecc = user->pmecc;
815 ret = readl_relaxed_poll_timeout(pmecc->regs.base +
820 dev_err(pmecc->dev,
825 user->isr = readl_relaxed(pmecc->regs.base + ATMEL_PMECC_ISR);
836 struct atmel_pmecc *pmecc;
838 pmecc = devm_kzalloc(dev, sizeof(*pmecc), GFP_KERNEL);
839 if (!pmecc)
842 pmecc->caps = caps;
843 pmecc->dev = dev;
844 mutex_init(&pmecc->lock);
846 pmecc->regs.base = devm_platform_ioremap_resource(pdev, pmecc_res_idx);
847 if (IS_ERR(pmecc->regs.base))
848 return ERR_CAST(pmecc->regs.base);
850 pmecc->regs.errloc = devm_platform_ioremap_resource(pdev, errloc_res_idx);
851 if (IS_ERR(pmecc->regs.errloc))
852 return ERR_CAST(pmecc->regs.errloc);
855 writel(0xffffffff, pmecc->regs.base + ATMEL_PMECC_IDR);
856 atmel_pmecc_reset(pmecc);
858 return pmecc;
863 struct atmel_pmecc **pmecc = res;
865 put_device((*pmecc)->dev);
872 struct atmel_pmecc *pmecc, **ptr;
878 pmecc = platform_get_drvdata(pdev);
879 if (!pmecc) {
890 *ptr = pmecc;
894 return pmecc;
931 struct atmel_pmecc *pmecc;
942 pmecc = atmel_pmecc_get_by_node(userdev, np);
956 "atmel,has-pmecc"))
967 pmecc = atmel_pmecc_create(pdev, caps, 1, 2);
970 return pmecc;
975 { .compatible = "atmel,at91sam9g45-pmecc", &at91sam9g45_caps },
976 { .compatible = "atmel,sama5d4-pmecc", &sama5d4_caps },
977 { .compatible = "atmel,sama5d2-pmecc", &sama5d2_caps },
986 struct atmel_pmecc *pmecc;
994 pmecc = atmel_pmecc_create(pdev, caps, 0, 1);
995 if (IS_ERR(pmecc))
996 return PTR_ERR(pmecc);
998 platform_set_drvdata(pdev, pmecc);
1005 .name = "atmel-pmecc",