| .. | .. |
|---|
| 144 | 144 | int max_ecc_strength; |
|---|
| 145 | 145 | u32 *oob_buf; |
|---|
| 146 | 146 | u32 *page_buf; |
|---|
| 147 | + struct mtd_info *mtd; |
|---|
| 147 | 148 | }; |
|---|
| 148 | 149 | |
|---|
| 149 | 150 | static inline struct rk_nfc *to_rk_nfc(struct nand_controller *ctrl) |
|---|
| .. | .. |
|---|
| 338 | 339 | if (bch_st & NANDC_V9_BCH0_ST_ERR || |
|---|
| 339 | 340 | bch_st & NANDC_V9_BCH1_ST_ERR) { |
|---|
| 340 | 341 | mtd->ecc_stats.failed++; |
|---|
| 341 | | - max_bitflips = -1; |
|---|
| 342 | + max_bitflips = 0; |
|---|
| 342 | 343 | } else { |
|---|
| 343 | 344 | ret = NANDC_V9_ECC_ERR_CNT0(bch_st); |
|---|
| 344 | 345 | mtd->ecc_stats.corrected += ret; |
|---|
| .. | .. |
|---|
| 584 | 585 | if (max_strength > nfc->max_ecc_strength) |
|---|
| 585 | 586 | max_strength = nfc->max_ecc_strength; |
|---|
| 586 | 587 | |
|---|
| 587 | | - nfc->page_buf = kmalloc(mtd->writesize, GFP_KERNEL | GFP_DMA); |
|---|
| 588 | | - if (!nfc->page_buf) |
|---|
| 589 | | - return -ENOMEM; |
|---|
| 590 | | - nfc->oob_buf = kmalloc(ecc->steps * 128, GFP_KERNEL | GFP_DMA); |
|---|
| 591 | | - if (!nfc->oob_buf) { |
|---|
| 592 | | - kfree(nfc->page_buf); |
|---|
| 593 | | - return -ENOMEM; |
|---|
| 594 | | - } |
|---|
| 595 | | - |
|---|
| 596 | 588 | for (i = 0; i < ARRAY_SIZE(strengths); i++) |
|---|
| 597 | 589 | if (max_strength >= strengths[i]) |
|---|
| 598 | 590 | break; |
|---|
| .. | .. |
|---|
| 602 | 594 | return -ENOTSUPP; |
|---|
| 603 | 595 | } |
|---|
| 604 | 596 | |
|---|
| 597 | + nfc->page_buf = (u32 *)__get_free_pages(GFP_KERNEL | GFP_DMA32, get_order(mtd->writesize)); |
|---|
| 598 | + if (!nfc->page_buf) |
|---|
| 599 | + return -ENOMEM; |
|---|
| 600 | + nfc->oob_buf = (u32 *)__get_free_pages(GFP_KERNEL | GFP_DMA32, get_order(ecc->steps * 128)); |
|---|
| 601 | + if (!nfc->oob_buf) { |
|---|
| 602 | + free_pages((unsigned long)nfc->page_buf, get_order(mtd->writesize)); |
|---|
| 603 | + return -ENOMEM; |
|---|
| 604 | + } |
|---|
| 605 | + nfc->mtd = mtd; |
|---|
| 605 | 606 | nfc->ecc_mode = strengths[i]; |
|---|
| 606 | 607 | rk_nfc_hw_ecc_setup(mtd, ecc, nfc->ecc_mode); |
|---|
| 607 | 608 | |
|---|
| .. | .. |
|---|
| 936 | 937 | static int rk_nfc_remove(struct platform_device *pdev) |
|---|
| 937 | 938 | { |
|---|
| 938 | 939 | struct rk_nfc *nfc = platform_get_drvdata(pdev); |
|---|
| 940 | + struct nand_chip *nand = mtd_to_nand(nfc->mtd); |
|---|
| 939 | 941 | |
|---|
| 940 | 942 | rk_nand_chips_cleanup(nfc); |
|---|
| 941 | | - kfree(nfc->page_buf); |
|---|
| 942 | | - kfree(nfc->oob_buf); |
|---|
| 943 | + free_pages((unsigned long)nfc->page_buf, get_order(nfc->mtd->writesize)); |
|---|
| 944 | + free_pages((unsigned long)nfc->oob_buf, get_order(nand->ecc.steps * 128)); |
|---|
| 943 | 945 | clk_disable_unprepare(nfc->clk); |
|---|
| 944 | 946 | clk_disable_unprepare(nfc->hclk); |
|---|
| 945 | 947 | if (!(IS_ERR(nfc->gclk))) |
|---|