hc
2024-01-05 071106ecf68c401173c58808b1cf5f68cc50d390
kernel/drivers/mtd/nand/raw/cafe_nand.c
....@@ -1,3 +1,4 @@
1
+// SPDX-License-Identifier: GPL-2.0-only
12 /*
23 * Driver for One Laptop Per Child ‘CAFÉ’ controller, aka Marvell 88ALP01
34 *
....@@ -100,9 +101,8 @@
100101 #define cafe_readl(cafe, addr) readl((cafe)->mmio + CAFE_##addr)
101102 #define cafe_writel(cafe, datum, addr) writel(datum, (cafe)->mmio + CAFE_##addr)
102103
103
-static int cafe_device_ready(struct mtd_info *mtd)
104
+static int cafe_device_ready(struct nand_chip *chip)
104105 {
105
- struct nand_chip *chip = mtd_to_nand(mtd);
106106 struct cafe_priv *cafe = nand_get_controller_data(chip);
107107 int result = !!(cafe_readl(cafe, NAND_STATUS) & 0x40000000);
108108 uint32_t irqs = cafe_readl(cafe, NAND_IRQ);
....@@ -117,9 +117,8 @@
117117 }
118118
119119
120
-static void cafe_write_buf(struct mtd_info *mtd, const uint8_t *buf, int len)
120
+static void cafe_write_buf(struct nand_chip *chip, const uint8_t *buf, int len)
121121 {
122
- struct nand_chip *chip = mtd_to_nand(mtd);
123122 struct cafe_priv *cafe = nand_get_controller_data(chip);
124123
125124 if (cafe->usedma)
....@@ -133,9 +132,8 @@
133132 len, cafe->datalen);
134133 }
135134
136
-static void cafe_read_buf(struct mtd_info *mtd, uint8_t *buf, int len)
135
+static void cafe_read_buf(struct nand_chip *chip, uint8_t *buf, int len)
137136 {
138
- struct nand_chip *chip = mtd_to_nand(mtd);
139137 struct cafe_priv *cafe = nand_get_controller_data(chip);
140138
141139 if (cafe->usedma)
....@@ -148,22 +146,21 @@
148146 cafe->datalen += len;
149147 }
150148
151
-static uint8_t cafe_read_byte(struct mtd_info *mtd)
149
+static uint8_t cafe_read_byte(struct nand_chip *chip)
152150 {
153
- struct nand_chip *chip = mtd_to_nand(mtd);
154151 struct cafe_priv *cafe = nand_get_controller_data(chip);
155152 uint8_t d;
156153
157
- cafe_read_buf(mtd, &d, 1);
154
+ cafe_read_buf(chip, &d, 1);
158155 cafe_dev_dbg(&cafe->pdev->dev, "Read %02x\n", d);
159156
160157 return d;
161158 }
162159
163
-static void cafe_nand_cmdfunc(struct mtd_info *mtd, unsigned command,
160
+static void cafe_nand_cmdfunc(struct nand_chip *chip, unsigned command,
164161 int column, int page_addr)
165162 {
166
- struct nand_chip *chip = mtd_to_nand(mtd);
163
+ struct mtd_info *mtd = nand_to_mtd(chip);
167164 struct cafe_priv *cafe = nand_get_controller_data(chip);
168165 int adrbytes = 0;
169166 uint32_t ctl1;
....@@ -313,13 +310,12 @@
313310 cafe_writel(cafe, cafe->ctl2, NAND_CTRL2);
314311 return;
315312 }
316
- nand_wait_ready(mtd);
313
+ nand_wait_ready(chip);
317314 cafe_writel(cafe, cafe->ctl2, NAND_CTRL2);
318315 }
319316
320
-static void cafe_select_chip(struct mtd_info *mtd, int chipnr)
317
+static void cafe_select_chip(struct nand_chip *chip, int chipnr)
321318 {
322
- struct nand_chip *chip = mtd_to_nand(mtd);
323319 struct cafe_priv *cafe = nand_get_controller_data(chip);
324320
325321 cafe_dev_dbg(&cafe->pdev->dev, "select_chip %d\n", chipnr);
....@@ -346,17 +342,19 @@
346342 return IRQ_HANDLED;
347343 }
348344
349
-static int cafe_nand_write_oob(struct mtd_info *mtd,
350
- struct nand_chip *chip, int page)
345
+static int cafe_nand_write_oob(struct nand_chip *chip, int page)
351346 {
347
+ struct mtd_info *mtd = nand_to_mtd(chip);
348
+
352349 return nand_prog_page_op(chip, page, mtd->writesize, chip->oob_poi,
353350 mtd->oobsize);
354351 }
355352
356353 /* Don't use -- use nand_read_oob_std for now */
357
-static int cafe_nand_read_oob(struct mtd_info *mtd, struct nand_chip *chip,
358
- int page)
354
+static int cafe_nand_read_oob(struct nand_chip *chip, int page)
359355 {
356
+ struct mtd_info *mtd = nand_to_mtd(chip);
357
+
360358 return nand_read_oob_op(chip, page, 0, chip->oob_poi, mtd->oobsize);
361359 }
362360 /**
....@@ -369,9 +367,10 @@
369367 * The hw generator calculates the error syndrome automatically. Therefore
370368 * we need a special oob layout and handling.
371369 */
372
-static int cafe_nand_read_page(struct mtd_info *mtd, struct nand_chip *chip,
373
- uint8_t *buf, int oob_required, int page)
370
+static int cafe_nand_read_page(struct nand_chip *chip, uint8_t *buf,
371
+ int oob_required, int page)
374372 {
373
+ struct mtd_info *mtd = nand_to_mtd(chip);
375374 struct cafe_priv *cafe = nand_get_controller_data(chip);
376375 unsigned int max_bitflips = 0;
377376
....@@ -380,7 +379,7 @@
380379 cafe_readl(cafe, NAND_ECC_SYN01));
381380
382381 nand_read_page_op(chip, page, 0, buf, mtd->writesize);
383
- chip->read_buf(mtd, chip->oob_poi, mtd->oobsize);
382
+ chip->legacy.read_buf(chip, chip->oob_poi, mtd->oobsize);
384383
385384 if (checkecc && cafe_readl(cafe, NAND_ECC_RESULT) & (1<<18)) {
386385 unsigned short syn[8], pat[4];
....@@ -531,25 +530,20 @@
531530 };
532531
533532
534
-static int cafe_nand_write_page_lowlevel(struct mtd_info *mtd,
535
- struct nand_chip *chip,
536
- const uint8_t *buf, int oob_required,
537
- int page)
533
+static int cafe_nand_write_page_lowlevel(struct nand_chip *chip,
534
+ const uint8_t *buf, int oob_required,
535
+ int page)
538536 {
537
+ struct mtd_info *mtd = nand_to_mtd(chip);
539538 struct cafe_priv *cafe = nand_get_controller_data(chip);
540539
541540 nand_prog_page_begin_op(chip, page, 0, buf, mtd->writesize);
542
- chip->write_buf(mtd, chip->oob_poi, mtd->oobsize);
541
+ chip->legacy.write_buf(chip, chip->oob_poi, mtd->oobsize);
543542
544543 /* Set up ECC autogeneration */
545544 cafe->ctl2 |= (1<<30);
546545
547546 return nand_prog_page_end_op(chip);
548
-}
549
-
550
-static int cafe_nand_block_bad(struct mtd_info *mtd, loff_t ofs)
551
-{
552
- return 0;
553547 }
554548
555549 /* F_2[X]/(X**6+X+1) */
....@@ -635,7 +629,8 @@
635629 goto out_free_dma;
636630 }
637631
638
- cafe->nand.ecc.mode = NAND_ECC_HW_SYNDROME;
632
+ cafe->nand.ecc.engine_type = NAND_ECC_ENGINE_TYPE_ON_HOST;
633
+ cafe->nand.ecc.placement = NAND_ECC_PLACEMENT_INTERLEAVED;
639634 cafe->nand.ecc.size = mtd->writesize;
640635 cafe->nand.ecc.bytes = 14;
641636 cafe->nand.ecc.strength = 4;
....@@ -705,24 +700,22 @@
705700 goto out_ior;
706701 }
707702
708
- cafe->nand.cmdfunc = cafe_nand_cmdfunc;
709
- cafe->nand.dev_ready = cafe_device_ready;
710
- cafe->nand.read_byte = cafe_read_byte;
711
- cafe->nand.read_buf = cafe_read_buf;
712
- cafe->nand.write_buf = cafe_write_buf;
713
- cafe->nand.select_chip = cafe_select_chip;
714
- cafe->nand.set_features = nand_get_set_features_notsupp;
715
- cafe->nand.get_features = nand_get_set_features_notsupp;
703
+ cafe->nand.legacy.cmdfunc = cafe_nand_cmdfunc;
704
+ cafe->nand.legacy.dev_ready = cafe_device_ready;
705
+ cafe->nand.legacy.read_byte = cafe_read_byte;
706
+ cafe->nand.legacy.read_buf = cafe_read_buf;
707
+ cafe->nand.legacy.write_buf = cafe_write_buf;
708
+ cafe->nand.legacy.select_chip = cafe_select_chip;
709
+ cafe->nand.legacy.set_features = nand_get_set_features_notsupp;
710
+ cafe->nand.legacy.get_features = nand_get_set_features_notsupp;
716711
717
- cafe->nand.chip_delay = 0;
712
+ cafe->nand.legacy.chip_delay = 0;
718713
719714 /* Enable the following for a flash based bad block table */
720715 cafe->nand.bbt_options = NAND_BBT_USE_FLASH;
721716
722
- if (skipbbt) {
723
- cafe->nand.options |= NAND_SKIP_BBTSCAN;
724
- cafe->nand.block_bad = cafe_nand_block_bad;
725
- }
717
+ if (skipbbt)
718
+ cafe->nand.options |= NAND_SKIP_BBTSCAN | NAND_NO_BBM_QUIRK;
726719
727720 if (numtimings && numtimings != 3) {
728721 dev_warn(&cafe->pdev->dev, "%d timing register values ignored; precisely three are required\n", numtimings);
....@@ -782,7 +775,7 @@
782775 cafe->usedma = 0;
783776
784777 /* Scan to find existence of the device */
785
- cafe->nand.dummy_controller.ops = &cafe_nand_controller_ops;
778
+ cafe->nand.legacy.dummy_controller.ops = &cafe_nand_controller_ops;
786779 err = nand_scan(&cafe->nand, 2);
787780 if (err)
788781 goto out_irq;
....@@ -817,11 +810,14 @@
817810 struct mtd_info *mtd = pci_get_drvdata(pdev);
818811 struct nand_chip *chip = mtd_to_nand(mtd);
819812 struct cafe_priv *cafe = nand_get_controller_data(chip);
813
+ int ret;
820814
821815 /* Disable NAND IRQ in global IRQ mask register */
822816 cafe_writel(cafe, ~1 & cafe_readl(cafe, GLOBAL_IRQ_MASK), GLOBAL_IRQ_MASK);
823817 free_irq(pdev->irq, mtd);
824
- nand_release(chip);
818
+ ret = mtd_device_unregister(mtd);
819
+ WARN_ON(ret);
820
+ nand_cleanup(chip);
825821 free_rs(cafe->rs);
826822 pci_iounmap(pdev, cafe->mmio);
827823 dma_free_coherent(&cafe->pdev->dev, 2112, cafe->dmabuf, cafe->dmaaddr);