Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge tag 'mtd/for-6.4' of git://git.kernel.org/pub/scm/linux/kernel/git/mtd/linux

Pull mtd updates from Miquel Raynal:
"Core MTD changes:
- dt-bindings: Drop unneeded quotes
- mtdblock: Tolerate corrected bit-flips
- Use of_property_read_bool() for boolean properties
- Avoid magic values
- Avoid printing error messages on probe deferrals
- Prepare mtd_otp_nvmem_add() to handle -EPROBE_DEFER
- Fix error path for nvmem provider
- Fix nvmem error reporting
- Provide unique name for nvmem device

MTD device changes:
- lpddr_cmds: Remove unused words variable
- bcm63xxpart: Remove MODULE_LICENSE in non-modules

SPI NOR core changes:
- Introduce Read While Write support for flashes featuring several
banks
- Set the 4-Byte Address Mode method based on SFDP data
- Allow post_sfdp hook to return errors
- Parse SCCR MC table and introduce support for multi-chip devices

SPI NOR manufacturer drivers changes:
- macronix: Add support for mx25uw51245g with RWW
- spansion:
- Determine current address mode at runtime as it can be changed
in a non-volatile way and differ from factory defaults or from
what SFDP advertises.
- Enable JFFS2 write buffer mode for few ECC'd NOR flashes:
S25FS256T, s25hx and s28hx
- Add support for s25hl02gt and s25hs02gt

Raw NAND core changes:
- Convert to platform remove callback returning void
- Fix spelling mistake waifunc() -> waitfunc()

Raw NAND controller driver changes:
- imx: Remove unused is_imx51_nfc and imx53_nfc functions
- omap2: Drop obsolete dependency on COMPILE_TEST
- orion: Use devm_platform_ioremap_resource()
- qcom:
- Use of_property_present() for testing DT property presence
- Use devm_platform_get_and_ioremap_resource()
- stm32_fmc2: Depends on ARCH_STM32 instead of MACH_STM32MP157
- tmio: Remove reference to config MTD_NAND_TMIO in the parsers

Raw NAND manufacturer driver changes:
- hynix: Fix up bit 0 of sdr_timing_mode

SPI-NAND changes:
- Add support for ESMT F50x1G41LB"

* tag 'mtd/for-6.4' of git://git.kernel.org/pub/scm/linux/kernel/git/mtd/linux: (55 commits)
mtd: nand: Convert to platform remove callback returning void
mtd: onenand: omap2: Drop obsolete dependency on COMPILE_TEST
mtd: spi-nor: spansion: Add support for s25hl02gt and s25hs02gt
mtd: spi-nor: spansion: Add a new ->ready() hook for multi-chip device
mtd: spi-nor: spansion: Rework cypress_nor_quad_enable_volatile() for multi-chip device support
mtd: spi-nor: spansion: Rework cypress_nor_get_page_size() for multi-chip device support
mtd: spi-nor: sfdp: Add support for SCCR map for multi-chip device
mtd: spi-nor: Extract volatile register offset from SCCR map
mtd: spi-nor: Allow post_sfdp hook to return errors
mtd: spi-nor: spansion: Rename method to cypress_nor_get_page_size
mtd: spi-nor: spansion: Enable JFFS2 write buffer for S25FS256T
mtd: spi-nor: spansion: Enable JFFS2 write buffer for Infineon s25hx SEMPER flash
mtd: spi-nor: spansion: Enable JFFS2 write buffer for Infineon s28hx SEMPER flash
mtd: spi-nor: spansion: Determine current address mode
mtd: spi-nor: core: Introduce spi_nor_set_4byte_addr_mode()
mtd: spi-nor: core: Update flash's current address mode when changing address mode
mtd: spi-nor: Stop exporting spi_nor_restore()
mtd: spi-nor: Set the 4-Byte Address Mode method based on SFDP data
mtd: spi-nor: core: Make spi_nor_set_4byte_addr_mode_brwr public
mtd: spi-nor: core: Update name and description of spi_nor_set_4byte_addr_mode
...

+1413 -447
+1 -1
Documentation/devicetree/bindings/mtd/allwinner,sun4i-a10-nand.yaml
··· 7 7 title: Allwinner A10 NAND Controller 8 8 9 9 allOf: 10 - - $ref: "nand-controller.yaml" 10 + - $ref: nand-controller.yaml 11 11 12 12 maintainers: 13 13 - Chen-Yu Tsai <wens@csie.org>
+1 -1
Documentation/devicetree/bindings/mtd/arasan,nand-controller.yaml
··· 7 7 title: Arasan NAND Flash Controller with ONFI 3.1 support 8 8 9 9 allOf: 10 - - $ref: "nand-controller.yaml" 10 + - $ref: nand-controller.yaml 11 11 12 12 maintainers: 13 13 - Naga Sureshkumar Relli <naga.sureshkumar.relli@xilinx.com>
+1 -1
Documentation/devicetree/bindings/mtd/arm,pl353-nand-r2p1.yaml
··· 7 7 title: PL353 NAND Controller 8 8 9 9 allOf: 10 - - $ref: "nand-controller.yaml" 10 + - $ref: nand-controller.yaml 11 11 12 12 maintainers: 13 13 - Miquel Raynal <miquel.raynal@bootlin.com>
+1 -1
Documentation/devicetree/bindings/mtd/gpmi-nand.yaml
··· 93 93 unevaluatedProperties: false 94 94 95 95 allOf: 96 - - $ref: "nand-controller.yaml" 96 + - $ref: nand-controller.yaml 97 97 98 98 - if: 99 99 properties:
+1 -1
Documentation/devicetree/bindings/mtd/intel,lgm-ebunand.yaml
··· 7 7 title: Intel LGM SoC NAND Controller 8 8 9 9 allOf: 10 - - $ref: "nand-controller.yaml" 10 + - $ref: nand-controller.yaml 11 11 12 12 maintainers: 13 13 - Ramuthevar Vadivel Murugan <vadivel.muruganx.ramuthevar@linux.intel.com>
+1 -1
Documentation/devicetree/bindings/mtd/jedec,spi-nor.yaml
··· 10 10 - Rob Herring <robh@kernel.org> 11 11 12 12 allOf: 13 - - $ref: "mtd.yaml#" 13 + - $ref: mtd.yaml# 14 14 - $ref: /schemas/spi/spi-peripheral-props.yaml# 15 15 16 16 properties:
+1 -1
Documentation/devicetree/bindings/mtd/mtd-physmap.yaml
··· 14 14 file systems on embedded devices. 15 15 16 16 allOf: 17 - - $ref: "mtd.yaml#" 17 + - $ref: mtd.yaml# 18 18 - $ref: /schemas/memory-controllers/mc-peripheral-props.yaml# 19 19 20 20 properties:
+1 -1
Documentation/devicetree/bindings/mtd/mxc-nand.yaml
··· 10 10 - Uwe Kleine-König <u.kleine-koenig@pengutronix.de> 11 11 12 12 allOf: 13 - - $ref: "nand-controller.yaml" 13 + - $ref: nand-controller.yaml 14 14 15 15 properties: 16 16 compatible:
+1 -1
Documentation/devicetree/bindings/mtd/nand-chip.yaml
··· 10 10 - Miquel Raynal <miquel.raynal@bootlin.com> 11 11 12 12 allOf: 13 - - $ref: "mtd.yaml#" 13 + - $ref: mtd.yaml# 14 14 15 15 description: | 16 16 This file covers the generic description of a NAND chip. It implies that the
+1 -1
Documentation/devicetree/bindings/mtd/nand-controller.yaml
··· 51 51 52 52 patternProperties: 53 53 "^nand@[a-f0-9]$": 54 - $ref: "nand-chip.yaml#" 54 + $ref: nand-chip.yaml# 55 55 56 56 properties: 57 57 reg:
+1 -1
Documentation/devicetree/bindings/mtd/partitions/brcm,bcm4908-partitions.yaml
··· 31 31 32 32 patternProperties: 33 33 "^partition@[0-9a-f]+$": 34 - $ref: "partition.yaml#" 34 + $ref: partition.yaml# 35 35 properties: 36 36 compatible: 37 37 const: brcm,bcm4908-firmware
+1 -1
Documentation/devicetree/bindings/mtd/partitions/linksys,ns-partitions.yaml
··· 32 32 33 33 patternProperties: 34 34 "^partition@[0-9a-f]+$": 35 - $ref: "partition.yaml#" 35 + $ref: partition.yaml# 36 36 properties: 37 37 compatible: 38 38 items:
+1 -1
Documentation/devicetree/bindings/mtd/qcom,nandc.yaml
··· 46 46 - 512 47 47 48 48 allOf: 49 - - $ref: "nand-controller.yaml#" 49 + - $ref: nand-controller.yaml# 50 50 51 51 - if: 52 52 properties:
+1 -1
Documentation/devicetree/bindings/mtd/renesas-nandc.yaml
··· 10 10 - Miquel Raynal <miquel.raynal@bootlin.com> 11 11 12 12 allOf: 13 - - $ref: "nand-controller.yaml" 13 + - $ref: nand-controller.yaml 14 14 15 15 properties: 16 16 compatible:
+1 -1
Documentation/devicetree/bindings/mtd/rockchip,nand-controller.yaml
··· 7 7 title: Rockchip SoCs NAND FLASH Controller (NFC) 8 8 9 9 allOf: 10 - - $ref: "nand-controller.yaml#" 10 + - $ref: nand-controller.yaml# 11 11 12 12 maintainers: 13 13 - Heiko Stuebner <heiko@sntech.de>
+1 -1
Documentation/devicetree/bindings/mtd/spi-nand.yaml
··· 10 10 - Miquel Raynal <miquel.raynal@bootlin.com> 11 11 12 12 allOf: 13 - - $ref: "nand-chip.yaml#" 13 + - $ref: nand-chip.yaml# 14 14 - $ref: /schemas/spi/spi-peripheral-props.yaml# 15 15 16 16 properties:
+1 -1
Documentation/devicetree/bindings/mtd/st,stm32-fmc2-nand.yaml
··· 45 45 enum: [1, 4, 8] 46 46 47 47 allOf: 48 - - $ref: "nand-controller.yaml#" 48 + - $ref: nand-controller.yaml# 49 49 50 50 - if: 51 51 properties:
+2 -2
Documentation/devicetree/bindings/mtd/ti,gpmc-nand.yaml
··· 63 63 64 64 patternProperties: 65 65 "@[0-9a-f]+$": 66 - $ref: "/schemas/mtd/partitions/partition.yaml" 66 + $ref: /schemas/mtd/partitions/partition.yaml 67 67 68 68 allOf: 69 - - $ref: "/schemas/memory-controllers/ti,gpmc-child.yaml" 69 + - $ref: /schemas/memory-controllers/ti,gpmc-child.yaml 70 70 71 71 required: 72 72 - compatible
+2 -2
Documentation/devicetree/bindings/mtd/ti,gpmc-onenand.yaml
··· 36 36 37 37 patternProperties: 38 38 "@[0-9a-f]+$": 39 - $ref: "/schemas/mtd/partitions/partition.yaml" 39 + $ref: /schemas/mtd/partitions/partition.yaml 40 40 41 41 allOf: 42 - - $ref: "/schemas/memory-controllers/ti,gpmc-child.yaml" 42 + - $ref: /schemas/memory-controllers/ti,gpmc-child.yaml 43 43 44 44 required: 45 45 - compatible
-3
Documentation/driver-api/mtd/spi-nor.rst
··· 63 63 initialize the necessary fields for spi_nor{}. Please see 64 64 drivers/mtd/spi-nor/spi-nor.c for detail. Please also refer to spi-fsl-qspi.c 65 65 when you want to write a new driver for a SPI NOR controller. 66 - Another API is spi_nor_restore(), this is used to restore the status of SPI 67 - flash chip such as addressing mode. Call it whenever detach the driver from 68 - device or reboot the system.
+2 -2
drivers/mtd/devices/spear_smi.c
··· 820 820 pdata->board_flash_info->mem_base = be32_to_cpup(&addr[0]); 821 821 pdata->board_flash_info->size = be32_to_cpup(&addr[1]); 822 822 823 - if (of_get_property(pp, "st,smi-fast-mode", NULL)) 824 - pdata->board_flash_info->fast_mode = 1; 823 + pdata->board_flash_info->fast_mode = 824 + of_property_read_bool(pp, "st,smi-fast-mode"); 825 825 826 826 i++; 827 827 }
+2 -5
drivers/mtd/lpddr/lpddr_cmds.c
··· 406 406 { 407 407 struct lpddr_private *lpddr = map->fldrv_priv; 408 408 map_word datum; 409 - int ret, wbufsize, word_gap, words; 409 + int ret, wbufsize, word_gap; 410 410 const struct kvec *vec; 411 411 unsigned long vec_seek; 412 412 unsigned long prog_buf_ofs; ··· 421 421 } 422 422 /* Figure out the number of words to write */ 423 423 word_gap = (-adr & (map_bankwidth(map)-1)); 424 - words = (len - word_gap + map_bankwidth(map) - 1) / map_bankwidth(map); 425 - if (!word_gap) { 426 - words--; 427 - } else { 424 + if (word_gap) { 428 425 word_gap = map_bankwidth(map) - word_gap; 429 426 adr -= word_gap; 430 427 datum = map_word_ff(map);
+1 -1
drivers/mtd/maps/sun_uflash.c
··· 112 112 /* Flashprom must have the "user" property in order to 113 113 * be used by this driver. 114 114 */ 115 - if (!of_find_property(dp, "user", NULL)) 115 + if (!of_property_read_bool(dp, "user")) 116 116 return -ENODEV; 117 117 118 118 return uflash_devinit(op, dp);
+3 -1
drivers/mtd/mtdblock_ro.c
··· 16 16 unsigned long block, char *buf) 17 17 { 18 18 size_t retlen; 19 + int err; 19 20 20 - if (mtd_read(dev->mtd, (block * 512), 512, &retlen, buf)) 21 + err = mtd_read(dev->mtd, (block * 512), 512, &retlen, buf); 22 + if (err && !mtd_is_bitflip(err)) 21 23 return 1; 22 24 return 0; 23 25 }
+22 -17
drivers/mtd/mtdcore.c
··· 519 519 struct device_node *node = mtd_get_of_node(mtd); 520 520 struct nvmem_config config = {}; 521 521 522 - config.id = -1; 522 + config.id = NVMEM_DEVID_NONE; 523 523 config.dev = &mtd->dev; 524 524 config.name = dev_name(&mtd->dev); 525 525 config.owner = THIS_MODULE; ··· 536 536 mtd->nvmem = nvmem_register(&config); 537 537 if (IS_ERR(mtd->nvmem)) { 538 538 /* Just ignore if there is no NVMEM support in the kernel */ 539 - if (PTR_ERR(mtd->nvmem) == -EOPNOTSUPP) { 539 + if (PTR_ERR(mtd->nvmem) == -EOPNOTSUPP) 540 540 mtd->nvmem = NULL; 541 - } else { 542 - dev_err(&mtd->dev, "Failed to register NVMEM device\n"); 543 - return PTR_ERR(mtd->nvmem); 544 - } 541 + else 542 + return dev_err_probe(&mtd->dev, PTR_ERR(mtd->nvmem), 543 + "Failed to register NVMEM device\n"); 545 544 } 546 545 547 546 return 0; ··· 738 739 739 740 mutex_unlock(&mtd_table_mutex); 740 741 741 - if (of_find_property(mtd_get_of_node(mtd), "linux,rootfs", NULL)) { 742 + if (of_property_read_bool(mtd_get_of_node(mtd), "linux,rootfs")) { 742 743 if (IS_BUILTIN(CONFIG_MTD)) { 743 744 pr_info("mtd: setting mtd%d (%s) as root device\n", mtd->index, mtd->name); 744 745 ROOT_DEV = MKDEV(MTD_BLOCK_MAJOR, mtd->index); ··· 887 888 888 889 /* OTP nvmem will be registered on the physical device */ 889 890 config.dev = mtd->dev.parent; 890 - config.name = kasprintf(GFP_KERNEL, "%s-%s", dev_name(&mtd->dev), compatible); 891 - config.id = NVMEM_DEVID_NONE; 891 + config.name = compatible; 892 + config.id = NVMEM_DEVID_AUTO; 892 893 config.owner = THIS_MODULE; 893 894 config.type = NVMEM_TYPE_OTP; 894 895 config.root_only = true; ··· 904 905 nvmem = NULL; 905 906 906 907 of_node_put(np); 907 - kfree(config.name); 908 908 909 909 return nvmem; 910 910 } ··· 938 940 939 941 static int mtd_otp_nvmem_add(struct mtd_info *mtd) 940 942 { 943 + struct device *dev = mtd->dev.parent; 941 944 struct nvmem_device *nvmem; 942 945 ssize_t size; 943 946 int err; ··· 952 953 nvmem = mtd_otp_nvmem_register(mtd, "user-otp", size, 953 954 mtd_nvmem_user_otp_reg_read); 954 955 if (IS_ERR(nvmem)) { 955 - dev_err(&mtd->dev, "Failed to register OTP NVMEM device\n"); 956 - return PTR_ERR(nvmem); 956 + err = PTR_ERR(nvmem); 957 + goto err; 957 958 } 958 959 mtd->otp_user_nvmem = nvmem; 959 960 } ··· 970 971 nvmem = mtd_otp_nvmem_register(mtd, "factory-otp", size, 971 972 mtd_nvmem_fact_otp_reg_read); 972 973 if (IS_ERR(nvmem)) { 973 - dev_err(&mtd->dev, "Failed to register OTP NVMEM device\n"); 974 974 err = PTR_ERR(nvmem); 975 975 goto err; 976 976 } ··· 981 983 982 984 err: 983 985 nvmem_unregister(mtd->otp_user_nvmem); 984 - return err; 986 + return dev_err_probe(dev, err, "Failed to register OTP NVMEM device\n"); 985 987 } 986 988 987 989 /** ··· 1021 1023 1022 1024 mtd_set_dev_defaults(mtd); 1023 1025 1026 + ret = mtd_otp_nvmem_add(mtd); 1027 + if (ret) 1028 + goto out; 1029 + 1024 1030 if (IS_ENABLED(CONFIG_MTD_PARTITIONED_MASTER)) { 1025 1031 ret = add_mtd_device(mtd); 1026 1032 if (ret) 1027 - return ret; 1033 + goto out; 1028 1034 } 1029 1035 1030 1036 /* Prefer parsed partitions over driver-provided fallback */ ··· 1063 1061 register_reboot_notifier(&mtd->reboot_notifier); 1064 1062 } 1065 1063 1066 - ret = mtd_otp_nvmem_add(mtd); 1067 - 1068 1064 out: 1065 + if (ret) { 1066 + nvmem_unregister(mtd->otp_user_nvmem); 1067 + nvmem_unregister(mtd->otp_factory_nvmem); 1068 + } 1069 + 1069 1070 if (ret && device_is_registered(&mtd->dev)) 1070 1071 del_mtd_device(mtd); 1071 1072
+2 -4
drivers/mtd/nand/ecc-mxic.c
··· 848 848 return 0; 849 849 } 850 850 851 - static int mxic_ecc_remove(struct platform_device *pdev) 851 + static void mxic_ecc_remove(struct platform_device *pdev) 852 852 { 853 853 struct mxic_ecc_engine *mxic = platform_get_drvdata(pdev); 854 854 855 855 nand_ecc_unregister_on_host_hw_engine(&mxic->external_engine); 856 - 857 - return 0; 858 856 } 859 857 860 858 static const struct of_device_id mxic_ecc_of_ids[] = { ··· 869 871 .of_match_table = mxic_ecc_of_ids, 870 872 }, 871 873 .probe = mxic_ecc_probe, 872 - .remove = mxic_ecc_remove, 874 + .remove_new = mxic_ecc_remove, 873 875 }; 874 876 module_platform_driver(mxic_ecc_driver); 875 877
+1 -1
drivers/mtd/nand/onenand/Kconfig
··· 25 25 config MTD_ONENAND_OMAP2 26 26 tristate "OneNAND on OMAP2/OMAP3 support" 27 27 depends on ARCH_OMAP2 || ARCH_OMAP3 || (COMPILE_TEST && ARM) 28 - depends on OF || COMPILE_TEST 28 + depends on OF 29 29 depends on OMAP_GPMC 30 30 help 31 31 Support for a OneNAND flash device connected to an OMAP2/OMAP3 SoC
+2 -4
drivers/mtd/nand/onenand/generic.c
··· 85 85 return err; 86 86 } 87 87 88 - static int generic_onenand_remove(struct platform_device *pdev) 88 + static void generic_onenand_remove(struct platform_device *pdev) 89 89 { 90 90 struct onenand_info *info = platform_get_drvdata(pdev); 91 91 struct resource *res = pdev->resource; ··· 97 97 iounmap(info->onenand.base); 98 98 kfree(info); 99 99 } 100 - 101 - return 0; 102 100 } 103 101 104 102 static struct platform_driver generic_onenand_driver = { ··· 104 106 .name = DRIVER_NAME, 105 107 }, 106 108 .probe = generic_onenand_probe, 107 - .remove = generic_onenand_remove, 109 + .remove_new = generic_onenand_remove, 108 110 }; 109 111 110 112 module_platform_driver(generic_onenand_driver);
+2 -4
drivers/mtd/nand/onenand/onenand_omap2.c
··· 581 581 return r; 582 582 } 583 583 584 - static int omap2_onenand_remove(struct platform_device *pdev) 584 + static void omap2_onenand_remove(struct platform_device *pdev) 585 585 { 586 586 struct omap2_onenand *c = dev_get_drvdata(&pdev->dev); 587 587 ··· 589 589 if (c->dma_chan) 590 590 dma_release_channel(c->dma_chan); 591 591 omap2_onenand_shutdown(pdev); 592 - 593 - return 0; 594 592 } 595 593 596 594 static const struct of_device_id omap2_onenand_id_table[] = { ··· 599 601 600 602 static struct platform_driver omap2_onenand_driver = { 601 603 .probe = omap2_onenand_probe, 602 - .remove = omap2_onenand_remove, 604 + .remove_new = omap2_onenand_remove, 603 605 .shutdown = omap2_onenand_shutdown, 604 606 .driver = { 605 607 .name = DRIVER_NAME,
+2 -4
drivers/mtd/nand/onenand/onenand_samsung.c
··· 943 943 return 0; 944 944 } 945 945 946 - static int s3c_onenand_remove(struct platform_device *pdev) 946 + static void s3c_onenand_remove(struct platform_device *pdev) 947 947 { 948 948 struct mtd_info *mtd = platform_get_drvdata(pdev); 949 949 950 950 onenand_release(mtd); 951 - 952 - return 0; 953 951 } 954 952 955 953 static int s3c_pm_ops_suspend(struct device *dev) ··· 994 996 }, 995 997 .id_table = s3c_onenand_driver_ids, 996 998 .probe = s3c_onenand_probe, 997 - .remove = s3c_onenand_remove, 999 + .remove_new = s3c_onenand_remove, 998 1000 }; 999 1001 1000 1002 module_platform_driver(s3c_onenand_driver);
+1 -1
drivers/mtd/nand/raw/Kconfig
··· 373 373 374 374 config MTD_NAND_STM32_FMC2 375 375 tristate "Support for NAND controller on STM32MP SoCs" 376 - depends on MACH_STM32MP157 || COMPILE_TEST 376 + depends on ARCH_STM32 || COMPILE_TEST 377 377 select MFD_SYSCON 378 378 help 379 379 Enables support for NAND Flash chips on SoCs containing the FMC2
+2 -4
drivers/mtd/nand/raw/ams-delta.c
··· 397 397 /* 398 398 * Clean up routine 399 399 */ 400 - static int gpio_nand_remove(struct platform_device *pdev) 400 + static void gpio_nand_remove(struct platform_device *pdev) 401 401 { 402 402 struct gpio_nand *priv = platform_get_drvdata(pdev); 403 403 struct mtd_info *mtd = nand_to_mtd(&priv->nand_chip); ··· 410 410 ret = mtd_device_unregister(mtd); 411 411 WARN_ON(ret); 412 412 nand_cleanup(mtd_to_nand(mtd)); 413 - 414 - return 0; 415 413 } 416 414 417 415 #ifdef CONFIG_OF ··· 432 434 433 435 static struct platform_driver gpio_nand_driver = { 434 436 .probe = gpio_nand_probe, 435 - .remove = gpio_nand_remove, 437 + .remove_new = gpio_nand_remove, 436 438 .id_table = gpio_nand_plat_id_table, 437 439 .driver = { 438 440 .name = "ams-delta-nand",
+2 -4
drivers/mtd/nand/raw/arasan-nand-controller.c
··· 1496 1496 return ret; 1497 1497 } 1498 1498 1499 - static int anfc_remove(struct platform_device *pdev) 1499 + static void anfc_remove(struct platform_device *pdev) 1500 1500 { 1501 1501 struct arasan_nfc *nfc = platform_get_drvdata(pdev); 1502 1502 ··· 1504 1504 1505 1505 clk_disable_unprepare(nfc->bus_clk); 1506 1506 clk_disable_unprepare(nfc->controller_clk); 1507 - 1508 - return 0; 1509 1507 } 1510 1508 1511 1509 static const struct of_device_id anfc_ids[] = { ··· 1523 1525 .of_match_table = anfc_ids, 1524 1526 }, 1525 1527 .probe = anfc_probe, 1526 - .remove = anfc_remove, 1528 + .remove_new = anfc_remove, 1527 1529 }; 1528 1530 module_platform_driver(anfc_driver); 1529 1531
+2 -4
drivers/mtd/nand/raw/atmel/nand-controller.c
··· 2626 2626 return caps->ops->probe(pdev, caps); 2627 2627 } 2628 2628 2629 - static int atmel_nand_controller_remove(struct platform_device *pdev) 2629 + static void atmel_nand_controller_remove(struct platform_device *pdev) 2630 2630 { 2631 2631 struct atmel_nand_controller *nc = platform_get_drvdata(pdev); 2632 2632 2633 2633 WARN_ON(nc->caps->ops->remove(nc)); 2634 - 2635 - return 0; 2636 2634 } 2637 2635 2638 2636 static __maybe_unused int atmel_nand_controller_resume(struct device *dev) ··· 2661 2663 .pm = &atmel_nand_controller_pm_ops, 2662 2664 }, 2663 2665 .probe = atmel_nand_controller_probe, 2664 - .remove = atmel_nand_controller_remove, 2666 + .remove_new = atmel_nand_controller_remove, 2665 2667 }; 2666 2668 module_platform_driver(atmel_nand_controller_driver); 2667 2669
+2 -3
drivers/mtd/nand/raw/au1550nd.c
··· 337 337 return ret; 338 338 } 339 339 340 - static int au1550nd_remove(struct platform_device *pdev) 340 + static void au1550nd_remove(struct platform_device *pdev) 341 341 { 342 342 struct au1550nd_ctx *ctx = platform_get_drvdata(pdev); 343 343 struct resource *r = platform_get_resource(pdev, IORESOURCE_MEM, 0); ··· 350 350 iounmap(ctx->base); 351 351 release_mem_region(r->start, 0x1000); 352 352 kfree(ctx); 353 - return 0; 354 353 } 355 354 356 355 static struct platform_driver au1550nd_driver = { ··· 357 358 .name = "au1550-nand", 358 359 }, 359 360 .probe = au1550nd_probe, 360 - .remove = au1550nd_remove, 361 + .remove_new = au1550nd_remove, 361 362 }; 362 363 363 364 module_platform_driver(au1550nd_driver);
+2 -4
drivers/mtd/nand/raw/bcm47xxnflash/main.c
··· 57 57 return 0; 58 58 } 59 59 60 - static int bcm47xxnflash_remove(struct platform_device *pdev) 60 + static void bcm47xxnflash_remove(struct platform_device *pdev) 61 61 { 62 62 struct bcm47xxnflash *nflash = platform_get_drvdata(pdev); 63 63 struct nand_chip *chip = &nflash->nand_chip; ··· 66 66 ret = mtd_device_unregister(nand_to_mtd(chip)); 67 67 WARN_ON(ret); 68 68 nand_cleanup(chip); 69 - 70 - return 0; 71 69 } 72 70 73 71 static struct platform_driver bcm47xxnflash_driver = { 74 72 .probe = bcm47xxnflash_probe, 75 - .remove = bcm47xxnflash_remove, 73 + .remove_new = bcm47xxnflash_remove, 76 74 .driver = { 77 75 .name = "bcma_nflash", 78 76 },
+2 -4
drivers/mtd/nand/raw/cadence-nand-controller.c
··· 3055 3055 return 0; 3056 3056 } 3057 3057 3058 - static int cadence_nand_dt_remove(struct platform_device *ofdev) 3058 + static void cadence_nand_dt_remove(struct platform_device *ofdev) 3059 3059 { 3060 3060 struct cadence_nand_dt *dt = platform_get_drvdata(ofdev); 3061 3061 3062 3062 cadence_nand_remove(&dt->cdns_ctrl); 3063 - 3064 - return 0; 3065 3063 } 3066 3064 3067 3065 static struct platform_driver cadence_nand_dt_driver = { 3068 3066 .probe = cadence_nand_dt_probe, 3069 - .remove = cadence_nand_dt_remove, 3067 + .remove_new = cadence_nand_dt_remove, 3070 3068 .driver = { 3071 3069 .name = "cadence-nand-controller", 3072 3070 .of_match_table = cadence_nand_dt_ids,
+2 -4
drivers/mtd/nand/raw/davinci_nand.c
··· 821 821 return ret; 822 822 } 823 823 824 - static int nand_davinci_remove(struct platform_device *pdev) 824 + static void nand_davinci_remove(struct platform_device *pdev) 825 825 { 826 826 struct davinci_nand_info *info = platform_get_drvdata(pdev); 827 827 struct nand_chip *chip = &info->chip; ··· 835 835 ret = mtd_device_unregister(nand_to_mtd(chip)); 836 836 WARN_ON(ret); 837 837 nand_cleanup(chip); 838 - 839 - return 0; 840 838 } 841 839 842 840 static struct platform_driver nand_davinci_driver = { 843 841 .probe = nand_davinci_probe, 844 - .remove = nand_davinci_remove, 842 + .remove_new = nand_davinci_remove, 845 843 .driver = { 846 844 .name = "davinci_nand", 847 845 .of_match_table = of_match_ptr(davinci_nand_of_match),
+2 -4
drivers/mtd/nand/raw/denali_dt.c
··· 233 233 return ret; 234 234 } 235 235 236 - static int denali_dt_remove(struct platform_device *pdev) 236 + static void denali_dt_remove(struct platform_device *pdev) 237 237 { 238 238 struct denali_dt *dt = platform_get_drvdata(pdev); 239 239 ··· 243 243 clk_disable_unprepare(dt->clk_ecc); 244 244 clk_disable_unprepare(dt->clk_x); 245 245 clk_disable_unprepare(dt->clk); 246 - 247 - return 0; 248 246 } 249 247 250 248 static struct platform_driver denali_dt_driver = { 251 249 .probe = denali_dt_probe, 252 - .remove = denali_dt_remove, 250 + .remove_new = denali_dt_remove, 253 251 .driver = { 254 252 .name = "denali-nand-dt", 255 253 .of_match_table = denali_nand_dt_ids,
+2 -4
drivers/mtd/nand/raw/fsl_elbc_nand.c
··· 963 963 return ret; 964 964 } 965 965 966 - static int fsl_elbc_nand_remove(struct platform_device *pdev) 966 + static void fsl_elbc_nand_remove(struct platform_device *pdev) 967 967 { 968 968 struct fsl_elbc_fcm_ctrl *elbc_fcm_ctrl = fsl_lbc_ctrl_dev->nand; 969 969 struct fsl_elbc_mtd *priv = dev_get_drvdata(&pdev->dev); ··· 984 984 } 985 985 mutex_unlock(&fsl_elbc_nand_mutex); 986 986 987 - return 0; 988 - 989 987 } 990 988 991 989 static const struct of_device_id fsl_elbc_nand_match[] = { ··· 998 1000 .of_match_table = fsl_elbc_nand_match, 999 1001 }, 1000 1002 .probe = fsl_elbc_nand_probe, 1001 - .remove = fsl_elbc_nand_remove, 1003 + .remove_new = fsl_elbc_nand_remove, 1002 1004 }; 1003 1005 1004 1006 module_platform_driver(fsl_elbc_nand_driver);
+2 -4
drivers/mtd/nand/raw/fsl_ifc_nand.c
··· 1094 1094 return ret; 1095 1095 } 1096 1096 1097 - static int fsl_ifc_nand_remove(struct platform_device *dev) 1097 + static void fsl_ifc_nand_remove(struct platform_device *dev) 1098 1098 { 1099 1099 struct fsl_ifc_mtd *priv = dev_get_drvdata(&dev->dev); 1100 1100 struct nand_chip *chip = &priv->chip; ··· 1113 1113 kfree(ifc_nand_ctrl); 1114 1114 } 1115 1115 mutex_unlock(&fsl_ifc_nand_mutex); 1116 - 1117 - return 0; 1118 1116 } 1119 1117 1120 1118 static const struct of_device_id fsl_ifc_nand_match[] = { ··· 1129 1131 .of_match_table = fsl_ifc_nand_match, 1130 1132 }, 1131 1133 .probe = fsl_ifc_nand_probe, 1132 - .remove = fsl_ifc_nand_remove, 1134 + .remove_new = fsl_ifc_nand_remove, 1133 1135 }; 1134 1136 1135 1137 module_platform_driver(fsl_ifc_nand_driver);
+2 -4
drivers/mtd/nand/raw/fsl_upm.c
··· 235 235 return 0; 236 236 } 237 237 238 - static int fun_remove(struct platform_device *ofdev) 238 + static void fun_remove(struct platform_device *ofdev) 239 239 { 240 240 struct fsl_upm_nand *fun = dev_get_drvdata(&ofdev->dev); 241 241 struct nand_chip *chip = &fun->chip; ··· 245 245 ret = mtd_device_unregister(mtd); 246 246 WARN_ON(ret); 247 247 nand_cleanup(chip); 248 - 249 - return 0; 250 248 } 251 249 252 250 static const struct of_device_id of_fun_match[] = { ··· 259 261 .of_match_table = of_fun_match, 260 262 }, 261 263 .probe = fun_probe, 262 - .remove = fun_remove, 264 + .remove_new = fun_remove, 263 265 }; 264 266 265 267 module_platform_driver(of_fun_driver);
+3 -5
drivers/mtd/nand/raw/fsmc_nand.c
··· 880 880 } 881 881 } 882 882 883 - if (of_get_property(np, "nand-skip-bbtscan", NULL)) 883 + if (of_property_read_bool(np, "nand-skip-bbtscan")) 884 884 nand->options |= NAND_SKIP_BBTSCAN; 885 885 886 886 host->dev_timings = devm_kzalloc(&pdev->dev, ··· 1165 1165 /* 1166 1166 * Clean up routine 1167 1167 */ 1168 - static int fsmc_nand_remove(struct platform_device *pdev) 1168 + static void fsmc_nand_remove(struct platform_device *pdev) 1169 1169 { 1170 1170 struct fsmc_nand_data *host = platform_get_drvdata(pdev); 1171 1171 ··· 1184 1184 } 1185 1185 clk_disable_unprepare(host->clk); 1186 1186 } 1187 - 1188 - return 0; 1189 1187 } 1190 1188 1191 1189 #ifdef CONFIG_PM_SLEEP ··· 1222 1224 MODULE_DEVICE_TABLE(of, fsmc_nand_id_table); 1223 1225 1224 1226 static struct platform_driver fsmc_nand_driver = { 1225 - .remove = fsmc_nand_remove, 1227 + .remove_new = fsmc_nand_remove, 1226 1228 .driver = { 1227 1229 .name = "fsmc-nand", 1228 1230 .of_match_table = fsmc_nand_id_table,
+2 -4
drivers/mtd/nand/raw/gpio.c
··· 265 265 return platform_get_resource(pdev, IORESOURCE_MEM, 1); 266 266 } 267 267 268 - static int gpio_nand_remove(struct platform_device *pdev) 268 + static void gpio_nand_remove(struct platform_device *pdev) 269 269 { 270 270 struct gpiomtd *gpiomtd = platform_get_drvdata(pdev); 271 271 struct nand_chip *chip = &gpiomtd->nand_chip; ··· 280 280 gpiod_set_value(gpiomtd->nwp, 0); 281 281 if (gpiomtd->nce && !IS_ERR(gpiomtd->nce)) 282 282 gpiod_set_value(gpiomtd->nce, 0); 283 - 284 - return 0; 285 283 } 286 284 287 285 static int gpio_nand_probe(struct platform_device *pdev) ··· 392 394 393 395 static struct platform_driver gpio_nand_driver = { 394 396 .probe = gpio_nand_probe, 395 - .remove = gpio_nand_remove, 397 + .remove_new = gpio_nand_remove, 396 398 .driver = { 397 399 .name = "gpio-nand", 398 400 .of_match_table = of_match_ptr(gpio_nand_id_table),
+2 -3
drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.c
··· 2777 2777 return ret; 2778 2778 } 2779 2779 2780 - static int gpmi_nand_remove(struct platform_device *pdev) 2780 + static void gpmi_nand_remove(struct platform_device *pdev) 2781 2781 { 2782 2782 struct gpmi_nand_data *this = platform_get_drvdata(pdev); 2783 2783 struct nand_chip *chip = &this->nand; ··· 2791 2791 nand_cleanup(chip); 2792 2792 gpmi_free_dma_buffer(this); 2793 2793 release_resources(this); 2794 - return 0; 2795 2794 } 2796 2795 2797 2796 #ifdef CONFIG_PM_SLEEP ··· 2859 2860 .of_match_table = gpmi_nand_id_table, 2860 2861 }, 2861 2862 .probe = gpmi_nand_probe, 2862 - .remove = gpmi_nand_remove, 2863 + .remove_new = gpmi_nand_remove, 2863 2864 }; 2864 2865 module_platform_driver(gpmi_nand_driver); 2865 2866
+2 -4
drivers/mtd/nand/raw/hisi504_nand.c
··· 798 798 return 0; 799 799 } 800 800 801 - static int hisi_nfc_remove(struct platform_device *pdev) 801 + static void hisi_nfc_remove(struct platform_device *pdev) 802 802 { 803 803 struct hinfc_host *host = platform_get_drvdata(pdev); 804 804 struct nand_chip *chip = &host->chip; ··· 807 807 ret = mtd_device_unregister(nand_to_mtd(chip)); 808 808 WARN_ON(ret); 809 809 nand_cleanup(chip); 810 - 811 - return 0; 812 810 } 813 811 814 812 #ifdef CONFIG_PM_SLEEP ··· 858 860 .pm = &hisi_nfc_pm_ops, 859 861 }, 860 862 .probe = hisi_nfc_probe, 861 - .remove = hisi_nfc_remove, 863 + .remove_new = hisi_nfc_remove, 862 864 }; 863 865 864 866 module_platform_driver(hisi_nfc_driver);
+2 -4
drivers/mtd/nand/raw/ingenic/ingenic_nand_drv.c
··· 522 522 return 0; 523 523 } 524 524 525 - static int ingenic_nand_remove(struct platform_device *pdev) 525 + static void ingenic_nand_remove(struct platform_device *pdev) 526 526 { 527 527 struct ingenic_nfc *nfc = platform_get_drvdata(pdev); 528 528 ··· 530 530 ingenic_ecc_release(nfc->ecc); 531 531 532 532 ingenic_nand_cleanup_chips(nfc); 533 - 534 - return 0; 535 533 } 536 534 537 535 static const struct jz_soc_info jz4740_soc_info = { ··· 562 564 563 565 static struct platform_driver ingenic_nand_driver = { 564 566 .probe = ingenic_nand_probe, 565 - .remove = ingenic_nand_remove, 567 + .remove_new = ingenic_nand_remove, 566 568 .driver = { 567 569 .name = DRV_NAME, 568 570 .of_match_table = ingenic_nand_dt_match,
+2 -4
drivers/mtd/nand/raw/intel-nand-controller.c
··· 706 706 return ret; 707 707 } 708 708 709 - static int ebu_nand_remove(struct platform_device *pdev) 709 + static void ebu_nand_remove(struct platform_device *pdev) 710 710 { 711 711 struct ebu_nand_controller *ebu_host = platform_get_drvdata(pdev); 712 712 int ret; ··· 717 717 ebu_nand_disable(&ebu_host->chip); 718 718 ebu_dma_cleanup(ebu_host); 719 719 clk_disable_unprepare(ebu_host->clk); 720 - 721 - return 0; 722 720 } 723 721 724 722 static const struct of_device_id ebu_nand_match[] = { ··· 727 729 728 730 static struct platform_driver ebu_nand_driver = { 729 731 .probe = ebu_nand_probe, 730 - .remove = ebu_nand_remove, 732 + .remove_new = ebu_nand_remove, 731 733 .driver = { 732 734 .name = "intel-nand-controller", 733 735 .of_match_table = ebu_nand_match,
+2 -4
drivers/mtd/nand/raw/lpc32xx_mlc.c
··· 827 827 /* 828 828 * Remove NAND device 829 829 */ 830 - static int lpc32xx_nand_remove(struct platform_device *pdev) 830 + static void lpc32xx_nand_remove(struct platform_device *pdev) 831 831 { 832 832 struct lpc32xx_nand_host *host = platform_get_drvdata(pdev); 833 833 struct nand_chip *chip = &host->nand_chip; ··· 846 846 847 847 lpc32xx_wp_enable(host); 848 848 gpiod_put(host->wp_gpio); 849 - 850 - return 0; 851 849 } 852 850 853 851 static int lpc32xx_nand_resume(struct platform_device *pdev) ··· 887 889 888 890 static struct platform_driver lpc32xx_nand_driver = { 889 891 .probe = lpc32xx_nand_probe, 890 - .remove = lpc32xx_nand_remove, 892 + .remove_new = lpc32xx_nand_remove, 891 893 .resume = pm_ptr(lpc32xx_nand_resume), 892 894 .suspend = pm_ptr(lpc32xx_nand_suspend), 893 895 .driver = {
+2 -4
drivers/mtd/nand/raw/lpc32xx_slc.c
··· 946 946 /* 947 947 * Remove NAND device. 948 948 */ 949 - static int lpc32xx_nand_remove(struct platform_device *pdev) 949 + static void lpc32xx_nand_remove(struct platform_device *pdev) 950 950 { 951 951 uint32_t tmp; 952 952 struct lpc32xx_nand_host *host = platform_get_drvdata(pdev); ··· 965 965 966 966 clk_disable_unprepare(host->clk); 967 967 lpc32xx_wp_enable(host); 968 - 969 - return 0; 970 968 } 971 969 972 970 static int lpc32xx_nand_resume(struct platform_device *pdev) ··· 1013 1015 1014 1016 static struct platform_driver lpc32xx_nand_driver = { 1015 1017 .probe = lpc32xx_nand_probe, 1016 - .remove = lpc32xx_nand_remove, 1018 + .remove_new = lpc32xx_nand_remove, 1017 1019 .resume = pm_ptr(lpc32xx_nand_resume), 1018 1020 .suspend = pm_ptr(lpc32xx_nand_suspend), 1019 1021 .driver = {
+2 -4
drivers/mtd/nand/raw/marvell_nand.c
··· 3004 3004 return ret; 3005 3005 } 3006 3006 3007 - static int marvell_nfc_remove(struct platform_device *pdev) 3007 + static void marvell_nfc_remove(struct platform_device *pdev) 3008 3008 { 3009 3009 struct marvell_nfc *nfc = platform_get_drvdata(pdev); 3010 3010 ··· 3017 3017 3018 3018 clk_disable_unprepare(nfc->reg_clk); 3019 3019 clk_disable_unprepare(nfc->core_clk); 3020 - 3021 - return 0; 3022 3020 } 3023 3021 3024 3022 static int __maybe_unused marvell_nfc_suspend(struct device *dev) ··· 3152 3154 }, 3153 3155 .id_table = marvell_nfc_platform_ids, 3154 3156 .probe = marvell_nfc_probe, 3155 - .remove = marvell_nfc_remove, 3157 + .remove_new = marvell_nfc_remove, 3156 3158 }; 3157 3159 module_platform_driver(marvell_nfc_driver); 3158 3160
+2 -4
drivers/mtd/nand/raw/meson_nand.c
··· 1440 1440 return ret; 1441 1441 } 1442 1442 1443 - static int meson_nfc_remove(struct platform_device *pdev) 1443 + static void meson_nfc_remove(struct platform_device *pdev) 1444 1444 { 1445 1445 struct meson_nfc *nfc = platform_get_drvdata(pdev); 1446 1446 1447 1447 meson_nfc_nand_chip_cleanup(nfc); 1448 1448 1449 1449 meson_nfc_disable_clk(nfc); 1450 - 1451 - return 0; 1452 1450 } 1453 1451 1454 1452 static struct platform_driver meson_nfc_driver = { 1455 1453 .probe = meson_nfc_probe, 1456 - .remove = meson_nfc_remove, 1454 + .remove_new = meson_nfc_remove, 1457 1455 .driver = { 1458 1456 .name = "meson-nand", 1459 1457 .of_match_table = meson_nfc_id_table,
+2 -4
drivers/mtd/nand/raw/mpc5121_nfc.c
··· 822 822 return retval; 823 823 } 824 824 825 - static int mpc5121_nfc_remove(struct platform_device *op) 825 + static void mpc5121_nfc_remove(struct platform_device *op) 826 826 { 827 827 struct device *dev = &op->dev; 828 828 struct mtd_info *mtd = dev_get_drvdata(dev); ··· 832 832 WARN_ON(ret); 833 833 nand_cleanup(mtd_to_nand(mtd)); 834 834 mpc5121_nfc_free(dev, mtd); 835 - 836 - return 0; 837 835 } 838 836 839 837 static const struct of_device_id mpc5121_nfc_match[] = { ··· 842 844 843 845 static struct platform_driver mpc5121_nfc_driver = { 844 846 .probe = mpc5121_nfc_probe, 845 - .remove = mpc5121_nfc_remove, 847 + .remove_new = mpc5121_nfc_remove, 846 848 .driver = { 847 849 .name = DRV_NAME, 848 850 .of_match_table = mpc5121_nfc_match,
+2 -4
drivers/mtd/nand/raw/mtk_nand.c
··· 1601 1601 return ret; 1602 1602 } 1603 1603 1604 - static int mtk_nfc_remove(struct platform_device *pdev) 1604 + static void mtk_nfc_remove(struct platform_device *pdev) 1605 1605 { 1606 1606 struct mtk_nfc *nfc = platform_get_drvdata(pdev); 1607 1607 struct mtk_nfc_nand_chip *mtk_chip; ··· 1620 1620 1621 1621 mtk_ecc_release(nfc->ecc); 1622 1622 mtk_nfc_disable_clk(&nfc->clk); 1623 - 1624 - return 0; 1625 1623 } 1626 1624 1627 1625 #ifdef CONFIG_PM_SLEEP ··· 1661 1663 1662 1664 static struct platform_driver mtk_nfc_driver = { 1663 1665 .probe = mtk_nfc_probe, 1664 - .remove = mtk_nfc_remove, 1666 + .remove_new = mtk_nfc_remove, 1665 1667 .driver = { 1666 1668 .name = MTK_NAME, 1667 1669 .of_match_table = mtk_nfc_id_table,
+2 -14
drivers/mtd/nand/raw/mxc_nand.c
··· 1599 1599 return host->devtype_data == &imx25_nand_devtype_data; 1600 1600 } 1601 1601 1602 - static inline int is_imx51_nfc(struct mxc_nand_host *host) 1603 - { 1604 - return host->devtype_data == &imx51_nand_devtype_data; 1605 - } 1606 - 1607 - static inline int is_imx53_nfc(struct mxc_nand_host *host) 1608 - { 1609 - return host->devtype_data == &imx53_nand_devtype_data; 1610 - } 1611 - 1612 1602 static const struct of_device_id mxcnd_dt_ids[] = { 1613 1603 { .compatible = "fsl,imx21-nand", .data = &imx21_nand_devtype_data, }, 1614 1604 { .compatible = "fsl,imx27-nand", .data = &imx27_nand_devtype_data, }, ··· 1821 1831 return err; 1822 1832 } 1823 1833 1824 - static int mxcnd_remove(struct platform_device *pdev) 1834 + static void mxcnd_remove(struct platform_device *pdev) 1825 1835 { 1826 1836 struct mxc_nand_host *host = platform_get_drvdata(pdev); 1827 1837 struct nand_chip *chip = &host->nand; ··· 1832 1842 nand_cleanup(chip); 1833 1843 if (host->clk_act) 1834 1844 clk_disable_unprepare(host->clk); 1835 - 1836 - return 0; 1837 1845 } 1838 1846 1839 1847 static struct platform_driver mxcnd_driver = { ··· 1840 1852 .of_match_table = mxcnd_dt_ids, 1841 1853 }, 1842 1854 .probe = mxcnd_probe, 1843 - .remove = mxcnd_remove, 1855 + .remove_new = mxcnd_remove, 1844 1856 }; 1845 1857 module_platform_driver(mxcnd_driver); 1846 1858
+2 -3
drivers/mtd/nand/raw/mxic_nand.c
··· 553 553 return err; 554 554 } 555 555 556 - static int mxic_nfc_remove(struct platform_device *pdev) 556 + static void mxic_nfc_remove(struct platform_device *pdev) 557 557 { 558 558 struct mxic_nand_ctlr *nfc = platform_get_drvdata(pdev); 559 559 struct nand_chip *chip = &nfc->chip; ··· 564 564 nand_cleanup(chip); 565 565 566 566 mxic_nfc_clk_disable(nfc); 567 - return 0; 568 567 } 569 568 570 569 static const struct of_device_id mxic_nfc_of_ids[] = { ··· 574 575 575 576 static struct platform_driver mxic_nfc_driver = { 576 577 .probe = mxic_nfc_probe, 577 - .remove = mxic_nfc_remove, 578 + .remove_new = mxic_nfc_remove, 578 579 .driver = { 579 580 .name = "mxic-nfc", 580 581 .of_match_table = mxic_nfc_of_ids,
+13
drivers/mtd/nand/raw/nand_hynix.c
··· 728 728 return ret; 729 729 } 730 730 731 + static void hynix_fixup_onfi_param_page(struct nand_chip *chip, 732 + struct nand_onfi_params *p) 733 + { 734 + /* 735 + * Certain chips might report a 0 on sdr_timing_mode field 736 + * (bytes 129-130). This has been seen on H27U4G8F2GDA-BI. 737 + * According to ONFI specification, bit 0 of this field "shall be 1". 738 + * Forcibly set this bit. 739 + */ 740 + p->sdr_timing_modes |= cpu_to_le16(BIT(0)); 741 + } 742 + 731 743 const struct nand_manufacturer_ops hynix_nand_manuf_ops = { 732 744 .detect = hynix_nand_decode_id, 733 745 .init = hynix_nand_init, 734 746 .cleanup = hynix_nand_cleanup, 747 + .fixup_onfi_param_page = hynix_fixup_onfi_param_page, 735 748 };
+2 -3
drivers/mtd/nand/raw/nand_macronix.c
··· 93 93 struct nand_parameters *p = &chip->parameters; 94 94 struct nand_onfi_vendor_macronix *mxic; 95 95 struct device_node *dn = nand_get_flash_node(chip); 96 - int rand_otp = 0; 96 + int rand_otp; 97 97 int ret; 98 98 99 99 if (!p->onfi) 100 100 return; 101 101 102 - if (of_find_property(dn, "mxic,enable-randomizer-otp", NULL)) 103 - rand_otp = 1; 102 + rand_otp = of_property_read_bool(dn, "mxic,enable-randomizer-otp"); 104 103 105 104 mxic = (struct nand_onfi_vendor_macronix *)p->onfi->vendor; 106 105 /* Subpage write is prohibited in randomizer operatoin */
+2 -4
drivers/mtd/nand/raw/ndfc.c
··· 240 240 return 0; 241 241 } 242 242 243 - static int ndfc_remove(struct platform_device *ofdev) 243 + static void ndfc_remove(struct platform_device *ofdev) 244 244 { 245 245 struct ndfc_controller *ndfc = dev_get_drvdata(&ofdev->dev); 246 246 struct nand_chip *chip = &ndfc->chip; ··· 251 251 WARN_ON(ret); 252 252 nand_cleanup(chip); 253 253 kfree(mtd->name); 254 - 255 - return 0; 256 254 } 257 255 258 256 static const struct of_device_id ndfc_match[] = { ··· 265 267 .of_match_table = ndfc_match, 266 268 }, 267 269 .probe = ndfc_probe, 268 - .remove = ndfc_remove, 270 + .remove_new = ndfc_remove, 269 271 }; 270 272 271 273 module_platform_driver(ndfc_driver);
+2 -3
drivers/mtd/nand/raw/omap2.c
··· 2273 2273 return err; 2274 2274 } 2275 2275 2276 - static int omap_nand_remove(struct platform_device *pdev) 2276 + static void omap_nand_remove(struct platform_device *pdev) 2277 2277 { 2278 2278 struct mtd_info *mtd = platform_get_drvdata(pdev); 2279 2279 struct nand_chip *nand_chip = mtd_to_nand(mtd); ··· 2285 2285 dma_release_channel(info->dma); 2286 2286 WARN_ON(mtd_device_unregister(mtd)); 2287 2287 nand_cleanup(nand_chip); 2288 - return 0; 2289 2288 } 2290 2289 2291 2290 /* omap_nand_ids defined in linux/platform_data/mtd-nand-omap2.h */ ··· 2292 2293 2293 2294 static struct platform_driver omap_nand_driver = { 2294 2295 .probe = omap_nand_probe, 2295 - .remove = omap_nand_remove, 2296 + .remove_new = omap_nand_remove, 2296 2297 .driver = { 2297 2298 .name = DRIVER_NAME, 2298 2299 .of_match_table = omap_nand_ids,
+2 -3
drivers/mtd/nand/raw/omap_elm.c
··· 422 422 return ret; 423 423 } 424 424 425 - static int elm_remove(struct platform_device *pdev) 425 + static void elm_remove(struct platform_device *pdev) 426 426 { 427 427 pm_runtime_put_sync(&pdev->dev); 428 428 pm_runtime_disable(&pdev->dev); 429 - return 0; 430 429 } 431 430 432 431 #ifdef CONFIG_PM_SLEEP ··· 560 561 .pm = &elm_pm_ops, 561 562 }, 562 563 .probe = elm_probe, 563 - .remove = elm_remove, 564 + .remove_new = elm_remove, 564 565 }; 565 566 566 567 module_platform_driver(elm_driver);
+3 -7
drivers/mtd/nand/raw/orion_nand.c
··· 102 102 struct mtd_info *mtd; 103 103 struct nand_chip *nc; 104 104 struct orion_nand_data *board; 105 - struct resource *res; 106 105 void __iomem *io_base; 107 106 int ret = 0; 108 107 u32 val = 0; ··· 118 119 info->controller.ops = &orion_nand_ops; 119 120 nc->controller = &info->controller; 120 121 121 - res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 122 - io_base = devm_ioremap_resource(&pdev->dev, res); 122 + io_base = devm_platform_ioremap_resource(pdev, 0); 123 123 124 124 if (IS_ERR(io_base)) 125 125 return PTR_ERR(io_base); ··· 205 207 return ret; 206 208 } 207 209 208 - static int orion_nand_remove(struct platform_device *pdev) 210 + static void orion_nand_remove(struct platform_device *pdev) 209 211 { 210 212 struct orion_nand_info *info = platform_get_drvdata(pdev); 211 213 struct nand_chip *chip = &info->chip; ··· 217 219 nand_cleanup(chip); 218 220 219 221 clk_disable_unprepare(info->clk); 220 - 221 - return 0; 222 222 } 223 223 224 224 #ifdef CONFIG_OF ··· 228 232 #endif 229 233 230 234 static struct platform_driver orion_nand_driver = { 231 - .remove = orion_nand_remove, 235 + .remove_new = orion_nand_remove, 232 236 .driver = { 233 237 .name = "orion_nand", 234 238 .of_match_table = of_match_ptr(orion_nand_of_match_table),
+2 -4
drivers/mtd/nand/raw/oxnas_nand.c
··· 171 171 return err; 172 172 } 173 173 174 - static int oxnas_nand_remove(struct platform_device *pdev) 174 + static void oxnas_nand_remove(struct platform_device *pdev) 175 175 { 176 176 struct oxnas_nand_ctrl *oxnas = platform_get_drvdata(pdev); 177 177 struct nand_chip *chip; ··· 184 184 } 185 185 186 186 clk_disable_unprepare(oxnas->clk); 187 - 188 - return 0; 189 187 } 190 188 191 189 static const struct of_device_id oxnas_nand_match[] = { ··· 194 196 195 197 static struct platform_driver oxnas_nand_driver = { 196 198 .probe = oxnas_nand_probe, 197 - .remove = oxnas_nand_remove, 199 + .remove_new = oxnas_nand_remove, 198 200 .driver = { 199 201 .name = "oxnas_nand", 200 202 .of_match_table = oxnas_nand_match,
+2 -4
drivers/mtd/nand/raw/pasemi_nand.c
··· 197 197 return err; 198 198 } 199 199 200 - static int pasemi_nand_remove(struct platform_device *ofdev) 200 + static void pasemi_nand_remove(struct platform_device *ofdev) 201 201 { 202 202 struct pasemi_ddata *ddata = platform_get_drvdata(ofdev); 203 203 struct mtd_info *pasemi_nand_mtd; ··· 218 218 219 219 /* Free the MTD device structure */ 220 220 kfree(ddata); 221 - 222 - return 0; 223 221 } 224 222 225 223 static const struct of_device_id pasemi_nand_match[] = ··· 237 239 .of_match_table = pasemi_nand_match, 238 240 }, 239 241 .probe = pasemi_nand_probe, 240 - .remove = pasemi_nand_remove, 242 + .remove_new = pasemi_nand_remove, 241 243 }; 242 244 243 245 module_platform_driver(pasemi_nand_driver);
+2 -4
drivers/mtd/nand/raw/pl35x-nand-controller.c
··· 1163 1163 return 0; 1164 1164 } 1165 1165 1166 - static int pl35x_nand_remove(struct platform_device *pdev) 1166 + static void pl35x_nand_remove(struct platform_device *pdev) 1167 1167 { 1168 1168 struct pl35x_nandc *nfc = platform_get_drvdata(pdev); 1169 1169 1170 1170 pl35x_nand_chips_cleanup(nfc); 1171 - 1172 - return 0; 1173 1171 } 1174 1172 1175 1173 static const struct of_device_id pl35x_nand_of_match[] = { ··· 1178 1180 1179 1181 static struct platform_driver pl35x_nandc_driver = { 1180 1182 .probe = pl35x_nand_probe, 1181 - .remove = pl35x_nand_remove, 1183 + .remove_new = pl35x_nand_remove, 1182 1184 .driver = { 1183 1185 .name = PL35X_NANDC_DRIVER_NAME, 1184 1186 .of_match_table = pl35x_nand_of_match,
+2 -4
drivers/mtd/nand/raw/plat_nand.c
··· 122 122 /* 123 123 * Remove a NAND device. 124 124 */ 125 - static int plat_nand_remove(struct platform_device *pdev) 125 + static void plat_nand_remove(struct platform_device *pdev) 126 126 { 127 127 struct plat_nand_data *data = platform_get_drvdata(pdev); 128 128 struct platform_nand_data *pdata = dev_get_platdata(&pdev->dev); ··· 134 134 nand_cleanup(chip); 135 135 if (pdata->ctrl.remove) 136 136 pdata->ctrl.remove(pdev); 137 - 138 - return 0; 139 137 } 140 138 141 139 static const struct of_device_id plat_nand_match[] = { ··· 144 146 145 147 static struct platform_driver plat_nand_driver = { 146 148 .probe = plat_nand_probe, 147 - .remove = plat_nand_remove, 149 + .remove_new = plat_nand_remove, 148 150 .driver = { 149 151 .name = "gen_nand", 150 152 .of_match_table = plat_nand_match,
+4 -7
drivers/mtd/nand/raw/qcom_nandc.c
··· 3054 3054 struct device *dev = nandc->dev; 3055 3055 int partitions_count, i, j, ret; 3056 3056 3057 - if (!of_find_property(dn, "qcom,boot-partitions", NULL)) 3057 + if (!of_property_present(dn, "qcom,boot-partitions")) 3058 3058 return 0; 3059 3059 3060 3060 partitions_count = of_property_count_u32_elems(dn, "qcom,boot-partitions"); ··· 3269 3269 if (ret) 3270 3270 return ret; 3271 3271 3272 - res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 3273 - nandc->base = devm_ioremap_resource(dev, res); 3272 + nandc->base = devm_platform_get_and_ioremap_resource(pdev, 0, &res); 3274 3273 if (IS_ERR(nandc->base)) 3275 3274 return PTR_ERR(nandc->base); 3276 3275 ··· 3314 3315 return ret; 3315 3316 } 3316 3317 3317 - static int qcom_nandc_remove(struct platform_device *pdev) 3318 + static void qcom_nandc_remove(struct platform_device *pdev) 3318 3319 { 3319 3320 struct qcom_nand_controller *nandc = platform_get_drvdata(pdev); 3320 3321 struct resource *res = platform_get_resource(pdev, IORESOURCE_MEM, 0); ··· 3336 3337 3337 3338 dma_unmap_resource(&pdev->dev, nandc->base_dma, resource_size(res), 3338 3339 DMA_BIDIRECTIONAL, 0); 3339 - 3340 - return 0; 3341 3340 } 3342 3341 3343 3342 static const struct qcom_nandc_props ipq806x_nandc_props = { ··· 3402 3405 .of_match_table = qcom_nandc_of_match, 3403 3406 }, 3404 3407 .probe = qcom_nandc_probe, 3405 - .remove = qcom_nandc_remove, 3408 + .remove_new = qcom_nandc_remove, 3406 3409 }; 3407 3410 module_platform_driver(qcom_nandc_driver); 3408 3411
+2 -4
drivers/mtd/nand/raw/renesas-nand-controller.c
··· 1386 1386 return ret; 1387 1387 } 1388 1388 1389 - static int rnandc_remove(struct platform_device *pdev) 1389 + static void rnandc_remove(struct platform_device *pdev) 1390 1390 { 1391 1391 struct rnandc *rnandc = platform_get_drvdata(pdev); 1392 1392 1393 1393 rnandc_chips_cleanup(rnandc); 1394 1394 1395 1395 pm_runtime_put(&pdev->dev); 1396 - 1397 - return 0; 1398 1396 } 1399 1397 1400 1398 static const struct of_device_id rnandc_id_table[] = { ··· 1408 1410 .of_match_table = rnandc_id_table, 1409 1411 }, 1410 1412 .probe = rnandc_probe, 1411 - .remove = rnandc_remove, 1413 + .remove_new = rnandc_remove, 1412 1414 }; 1413 1415 module_platform_driver(rnandc_driver); 1414 1416
+2 -4
drivers/mtd/nand/raw/rockchip-nand-controller.c
··· 1427 1427 return ret; 1428 1428 } 1429 1429 1430 - static int rk_nfc_remove(struct platform_device *pdev) 1430 + static void rk_nfc_remove(struct platform_device *pdev) 1431 1431 { 1432 1432 struct rk_nfc *nfc = platform_get_drvdata(pdev); 1433 1433 ··· 1435 1435 kfree(nfc->oob_buf); 1436 1436 rk_nfc_chips_cleanup(nfc); 1437 1437 rk_nfc_disable_clks(nfc); 1438 - 1439 - return 0; 1440 1438 } 1441 1439 1442 1440 static int __maybe_unused rk_nfc_suspend(struct device *dev) ··· 1474 1476 1475 1477 static struct platform_driver rk_nfc_driver = { 1476 1478 .probe = rk_nfc_probe, 1477 - .remove = rk_nfc_remove, 1479 + .remove_new = rk_nfc_remove, 1478 1480 .driver = { 1479 1481 .name = "rockchip-nfc", 1480 1482 .of_match_table = rk_nfc_id_table,
+3 -5
drivers/mtd/nand/raw/s3c2410.c
··· 709 709 710 710 /* device management functions */ 711 711 712 - static int s3c24xx_nand_remove(struct platform_device *pdev) 712 + static void s3c24xx_nand_remove(struct platform_device *pdev) 713 713 { 714 714 struct s3c2410_nand_info *info = to_nand_info(pdev); 715 715 716 716 if (info == NULL) 717 - return 0; 717 + return; 718 718 719 719 /* Release all our mtds and their partitions, then go through 720 720 * freeing the resources used ··· 735 735 736 736 if (!IS_ERR(info->clk)) 737 737 s3c2410_nand_clk_set_state(info, CLOCK_DISABLE); 738 - 739 - return 0; 740 738 } 741 739 742 740 static int s3c2410_nand_add_partition(struct s3c2410_nand_info *info, ··· 1216 1218 1217 1219 static struct platform_driver s3c24xx_nand_driver = { 1218 1220 .probe = s3c24xx_nand_probe, 1219 - .remove = s3c24xx_nand_remove, 1221 + .remove_new = s3c24xx_nand_remove, 1220 1222 .suspend = s3c24xx_nand_suspend, 1221 1223 .resume = s3c24xx_nand_resume, 1222 1224 .id_table = s3c24xx_driver_ids,
+2 -4
drivers/mtd/nand/raw/sh_flctl.c
··· 1203 1203 return ret; 1204 1204 } 1205 1205 1206 - static int flctl_remove(struct platform_device *pdev) 1206 + static void flctl_remove(struct platform_device *pdev) 1207 1207 { 1208 1208 struct sh_flctl *flctl = platform_get_drvdata(pdev); 1209 1209 struct nand_chip *chip = &flctl->chip; ··· 1214 1214 WARN_ON(ret); 1215 1215 nand_cleanup(chip); 1216 1216 pm_runtime_disable(&pdev->dev); 1217 - 1218 - return 0; 1219 1217 } 1220 1218 1221 1219 static struct platform_driver flctl_driver = { 1222 - .remove = flctl_remove, 1220 + .remove_new = flctl_remove, 1223 1221 .driver = { 1224 1222 .name = "sh_flctl", 1225 1223 .of_match_table = of_flctl_match,
+2 -4
drivers/mtd/nand/raw/sharpsl.c
··· 210 210 /* 211 211 * Clean up routine 212 212 */ 213 - static int sharpsl_nand_remove(struct platform_device *pdev) 213 + static void sharpsl_nand_remove(struct platform_device *pdev) 214 214 { 215 215 struct sharpsl_nand *sharpsl = platform_get_drvdata(pdev); 216 216 struct nand_chip *chip = &sharpsl->chip; ··· 227 227 228 228 /* Free the driver's structure */ 229 229 kfree(sharpsl); 230 - 231 - return 0; 232 230 } 233 231 234 232 static struct platform_driver sharpsl_nand_driver = { ··· 234 236 .name = "sharpsl-nand", 235 237 }, 236 238 .probe = sharpsl_nand_probe, 237 - .remove = sharpsl_nand_remove, 239 + .remove_new = sharpsl_nand_remove, 238 240 }; 239 241 240 242 module_platform_driver(sharpsl_nand_driver);
+2 -4
drivers/mtd/nand/raw/socrates_nand.c
··· 201 201 /* 202 202 * Remove a NAND device. 203 203 */ 204 - static int socrates_nand_remove(struct platform_device *ofdev) 204 + static void socrates_nand_remove(struct platform_device *ofdev) 205 205 { 206 206 struct socrates_nand_host *host = dev_get_drvdata(&ofdev->dev); 207 207 struct nand_chip *chip = &host->nand_chip; ··· 212 212 nand_cleanup(chip); 213 213 214 214 iounmap(host->io_base); 215 - 216 - return 0; 217 215 } 218 216 219 217 static const struct of_device_id socrates_nand_match[] = ··· 230 232 .of_match_table = socrates_nand_match, 231 233 }, 232 234 .probe = socrates_nand_probe, 233 - .remove = socrates_nand_remove, 235 + .remove_new = socrates_nand_remove, 234 236 }; 235 237 236 238 module_platform_driver(socrates_nand_driver);
+2 -4
drivers/mtd/nand/raw/stm32_fmc2_nand.c
··· 2024 2024 return ret; 2025 2025 } 2026 2026 2027 - static int stm32_fmc2_nfc_remove(struct platform_device *pdev) 2027 + static void stm32_fmc2_nfc_remove(struct platform_device *pdev) 2028 2028 { 2029 2029 struct stm32_fmc2_nfc *nfc = platform_get_drvdata(pdev); 2030 2030 struct stm32_fmc2_nand *nand = &nfc->nand; ··· 2048 2048 clk_disable_unprepare(nfc->clk); 2049 2049 2050 2050 stm32_fmc2_nfc_wp_enable(nand); 2051 - 2052 - return 0; 2053 2051 } 2054 2052 2055 2053 static int __maybe_unused stm32_fmc2_nfc_suspend(struct device *dev) ··· 2104 2106 2105 2107 static struct platform_driver stm32_fmc2_nfc_driver = { 2106 2108 .probe = stm32_fmc2_nfc_probe, 2107 - .remove = stm32_fmc2_nfc_remove, 2109 + .remove_new = stm32_fmc2_nfc_remove, 2108 2110 .driver = { 2109 2111 .name = "stm32_fmc2_nfc", 2110 2112 .of_match_table = stm32_fmc2_nfc_match,
+2 -4
drivers/mtd/nand/raw/sunxi_nand.c
··· 2173 2173 return ret; 2174 2174 } 2175 2175 2176 - static int sunxi_nfc_remove(struct platform_device *pdev) 2176 + static void sunxi_nfc_remove(struct platform_device *pdev) 2177 2177 { 2178 2178 struct sunxi_nfc *nfc = platform_get_drvdata(pdev); 2179 2179 ··· 2185 2185 dma_release_channel(nfc->dmac); 2186 2186 clk_disable_unprepare(nfc->mod_clk); 2187 2187 clk_disable_unprepare(nfc->ahb_clk); 2188 - 2189 - return 0; 2190 2188 } 2191 2189 2192 2190 static const struct sunxi_nfc_caps sunxi_nfc_a10_caps = { ··· 2217 2219 .of_match_table = sunxi_nfc_ids, 2218 2220 }, 2219 2221 .probe = sunxi_nfc_probe, 2220 - .remove = sunxi_nfc_remove, 2222 + .remove_new = sunxi_nfc_remove, 2221 2223 }; 2222 2224 module_platform_driver(sunxi_nfc_driver); 2223 2225
+2 -4
drivers/mtd/nand/raw/tegra_nand.c
··· 1220 1220 return err; 1221 1221 } 1222 1222 1223 - static int tegra_nand_remove(struct platform_device *pdev) 1223 + static void tegra_nand_remove(struct platform_device *pdev) 1224 1224 { 1225 1225 struct tegra_nand_controller *ctrl = platform_get_drvdata(pdev); 1226 1226 struct nand_chip *chip = ctrl->chip; ··· 1232 1232 1233 1233 pm_runtime_put_sync_suspend(ctrl->dev); 1234 1234 pm_runtime_force_suspend(ctrl->dev); 1235 - 1236 - return 0; 1237 1235 } 1238 1236 1239 1237 static int __maybe_unused tegra_nand_runtime_resume(struct device *dev) ··· 1275 1277 .pm = &tegra_nand_pm, 1276 1278 }, 1277 1279 .probe = tegra_nand_probe, 1278 - .remove = tegra_nand_remove, 1280 + .remove_new = tegra_nand_remove, 1279 1281 }; 1280 1282 module_platform_driver(tegra_nand_driver); 1281 1283
+2 -3
drivers/mtd/nand/raw/vf610_nfc.c
··· 909 909 return err; 910 910 } 911 911 912 - static int vf610_nfc_remove(struct platform_device *pdev) 912 + static void vf610_nfc_remove(struct platform_device *pdev) 913 913 { 914 914 struct vf610_nfc *nfc = platform_get_drvdata(pdev); 915 915 struct nand_chip *chip = &nfc->chip; ··· 919 919 WARN_ON(ret); 920 920 nand_cleanup(chip); 921 921 clk_disable_unprepare(nfc->clk); 922 - return 0; 923 922 } 924 923 925 924 #ifdef CONFIG_PM_SLEEP ··· 954 955 .pm = &vf610_nfc_pm_ops, 955 956 }, 956 957 .probe = vf610_nfc_probe, 957 - .remove = vf610_nfc_remove, 958 + .remove_new = vf610_nfc_remove, 958 959 }; 959 960 960 961 module_platform_driver(vf610_nfc_driver);
+2 -4
drivers/mtd/nand/raw/xway_nand.c
··· 238 238 /* 239 239 * Remove a NAND device. 240 240 */ 241 - static int xway_nand_remove(struct platform_device *pdev) 241 + static void xway_nand_remove(struct platform_device *pdev) 242 242 { 243 243 struct xway_nand_data *data = platform_get_drvdata(pdev); 244 244 struct nand_chip *chip = &data->chip; ··· 247 247 ret = mtd_device_unregister(nand_to_mtd(chip)); 248 248 WARN_ON(ret); 249 249 nand_cleanup(chip); 250 - 251 - return 0; 252 250 } 253 251 254 252 static const struct of_device_id xway_nand_match[] = { ··· 256 258 257 259 static struct platform_driver xway_nand_driver = { 258 260 .probe = xway_nand_probe, 259 - .remove = xway_nand_remove, 261 + .remove_new = xway_nand_remove, 260 262 .driver = { 261 263 .name = "lantiq,nand-xway", 262 264 .of_match_table = xway_nand_match,
+2 -1
drivers/mtd/nand/spi/Makefile
··· 1 1 # SPDX-License-Identifier: GPL-2.0 2 - spinand-objs := core.o alliancememory.o ato.o gigadevice.o macronix.o micron.o paragon.o toshiba.o winbond.o xtx.o 2 + spinand-objs := core.o alliancememory.o ato.o esmt.o gigadevice.o macronix.o 3 + spinand-objs += micron.o paragon.o toshiba.o winbond.o xtx.o 3 4 obj-$(CONFIG_MTD_SPI_NAND) += spinand.o
+1
drivers/mtd/nand/spi/core.c
··· 939 939 static const struct spinand_manufacturer *spinand_manufacturers[] = { 940 940 &alliancememory_spinand_manufacturer, 941 941 &ato_spinand_manufacturer, 942 + &esmt_c8_spinand_manufacturer, 942 943 &gigadevice_spinand_manufacturer, 943 944 &macronix_spinand_manufacturer, 944 945 &micron_spinand_manufacturer,
+135
drivers/mtd/nand/spi/esmt.c
··· 1 + // SPDX-License-Identifier: GPL-2.0 2 + /* 3 + * Author: 4 + * Chuanhong Guo <gch981213@gmail.com> - the main driver logic 5 + * Martin Kurbanov <mmkurbanov@sberdevices.ru> - OOB layout 6 + */ 7 + 8 + #include <linux/device.h> 9 + #include <linux/kernel.h> 10 + #include <linux/mtd/spinand.h> 11 + 12 + /* ESMT uses GigaDevice 0xc8 JECDEC ID on some SPI NANDs */ 13 + #define SPINAND_MFR_ESMT_C8 0xc8 14 + 15 + static SPINAND_OP_VARIANTS(read_cache_variants, 16 + SPINAND_PAGE_READ_FROM_CACHE_X4_OP(0, 1, NULL, 0), 17 + SPINAND_PAGE_READ_FROM_CACHE_X2_OP(0, 1, NULL, 0), 18 + SPINAND_PAGE_READ_FROM_CACHE_OP(true, 0, 1, NULL, 0), 19 + SPINAND_PAGE_READ_FROM_CACHE_OP(false, 0, 1, NULL, 0)); 20 + 21 + static SPINAND_OP_VARIANTS(write_cache_variants, 22 + SPINAND_PROG_LOAD_X4(true, 0, NULL, 0), 23 + SPINAND_PROG_LOAD(true, 0, NULL, 0)); 24 + 25 + static SPINAND_OP_VARIANTS(update_cache_variants, 26 + SPINAND_PROG_LOAD_X4(false, 0, NULL, 0), 27 + SPINAND_PROG_LOAD(false, 0, NULL, 0)); 28 + 29 + /* 30 + * OOB spare area map (64 bytes) 31 + * 32 + * Bad Block Markers 33 + * filled by HW and kernel Reserved 34 + * | +-----------------------+-----------------------+ 35 + * | | | | 36 + * | | OOB free data Area |non ECC protected | 37 + * | +-------------|-----+-----------------|-----+-----------------|-----+ 38 + * | | | | | | | | 39 + * +-|---|----------+--|-----|--------------+--|-----|--------------+--|-----|--------------+ 40 + * | | | section0 | | | section1 | | | section2 | | | section3 | 41 + * +-v-+-v-+---+----+--v--+--v--+-----+-----+--v--+--v--+-----+-----+--v--+--v--+-----+-----+ 42 + * | | | | | | | | | | | | | | | | | 43 + * |0:1|2:3|4:7|8:15|16:17|18:19|20:23|24:31|32:33|34:35|36:39|40:47|48:49|50:51|52:55|56:63| 44 + * | | | | | | | | | | | | | | | | | 45 + * +---+---+-^-+--^-+-----+-----+--^--+--^--+-----+-----+--^--+--^--+-----+-----+--^--+--^--+ 46 + * | | | | | | | | 47 + * | +----------------|-----+-----------------|-----+-----------------|-----+ 48 + * | ECC Area|(Main + Spare) - filled|by ESMT NAND HW | 49 + * | | | | 50 + * +---------------------+-----------------------+-----------------------+ 51 + * OOB ECC protected Area - not used due to 52 + * partial programming from some filesystems 53 + * (like JFFS2 with cleanmarkers) 54 + */ 55 + 56 + #define ESMT_OOB_SECTION_COUNT 4 57 + #define ESMT_OOB_SECTION_SIZE(nand) \ 58 + (nanddev_per_page_oobsize(nand) / ESMT_OOB_SECTION_COUNT) 59 + #define ESMT_OOB_FREE_SIZE(nand) \ 60 + (ESMT_OOB_SECTION_SIZE(nand) / 2) 61 + #define ESMT_OOB_ECC_SIZE(nand) \ 62 + (ESMT_OOB_SECTION_SIZE(nand) - ESMT_OOB_FREE_SIZE(nand)) 63 + #define ESMT_OOB_BBM_SIZE 2 64 + 65 + static int f50l1g41lb_ooblayout_ecc(struct mtd_info *mtd, int section, 66 + struct mtd_oob_region *region) 67 + { 68 + struct nand_device *nand = mtd_to_nanddev(mtd); 69 + 70 + if (section >= ESMT_OOB_SECTION_COUNT) 71 + return -ERANGE; 72 + 73 + region->offset = section * ESMT_OOB_SECTION_SIZE(nand) + 74 + ESMT_OOB_FREE_SIZE(nand); 75 + region->length = ESMT_OOB_ECC_SIZE(nand); 76 + 77 + return 0; 78 + } 79 + 80 + static int f50l1g41lb_ooblayout_free(struct mtd_info *mtd, int section, 81 + struct mtd_oob_region *region) 82 + { 83 + struct nand_device *nand = mtd_to_nanddev(mtd); 84 + 85 + if (section >= ESMT_OOB_SECTION_COUNT) 86 + return -ERANGE; 87 + 88 + /* 89 + * Reserve space for bad blocks markers (section0) and 90 + * reserved bytes (sections 1-3) 91 + */ 92 + region->offset = section * ESMT_OOB_SECTION_SIZE(nand) + 2; 93 + 94 + /* Use only 2 non-protected ECC bytes per each OOB section */ 95 + region->length = 2; 96 + 97 + return 0; 98 + } 99 + 100 + static const struct mtd_ooblayout_ops f50l1g41lb_ooblayout = { 101 + .ecc = f50l1g41lb_ooblayout_ecc, 102 + .free = f50l1g41lb_ooblayout_free, 103 + }; 104 + 105 + static const struct spinand_info esmt_c8_spinand_table[] = { 106 + SPINAND_INFO("F50L1G41LB", 107 + SPINAND_ID(SPINAND_READID_METHOD_OPCODE_ADDR, 0x01), 108 + NAND_MEMORG(1, 2048, 64, 64, 1024, 20, 1, 1, 1), 109 + NAND_ECCREQ(1, 512), 110 + SPINAND_INFO_OP_VARIANTS(&read_cache_variants, 111 + &write_cache_variants, 112 + &update_cache_variants), 113 + 0, 114 + SPINAND_ECCINFO(&f50l1g41lb_ooblayout, NULL)), 115 + SPINAND_INFO("F50D1G41LB", 116 + SPINAND_ID(SPINAND_READID_METHOD_OPCODE_ADDR, 0x11), 117 + NAND_MEMORG(1, 2048, 64, 64, 1024, 20, 1, 1, 1), 118 + NAND_ECCREQ(1, 512), 119 + SPINAND_INFO_OP_VARIANTS(&read_cache_variants, 120 + &write_cache_variants, 121 + &update_cache_variants), 122 + 0, 123 + SPINAND_ECCINFO(&f50l1g41lb_ooblayout, NULL)), 124 + }; 125 + 126 + static const struct spinand_manufacturer_ops esmt_spinand_manuf_ops = { 127 + }; 128 + 129 + const struct spinand_manufacturer esmt_c8_spinand_manufacturer = { 130 + .id = SPINAND_MFR_ESMT_C8, 131 + .name = "ESMT", 132 + .chips = esmt_c8_spinand_table, 133 + .nchips = ARRAY_SIZE(esmt_c8_spinand_table), 134 + .ops = &esmt_spinand_manuf_ops, 135 + };
+1 -1
drivers/mtd/parsers/Kconfig
··· 149 149 150 150 config MTD_SHARPSL_PARTS 151 151 tristate "Sharp SL Series NAND flash partition parser" 152 - depends on MTD_NAND_SHARPSL || MTD_NAND_TMIO || COMPILE_TEST 152 + depends on MTD_NAND_SHARPSL || COMPILE_TEST 153 153 help 154 154 This provides the read-only FTL logic necessary to read the partition 155 155 table from the NAND flash of Sharp SL Series (Zaurus) and the MTD
-1
drivers/mtd/parsers/bcm63xxpart.c
··· 164 164 }; 165 165 module_mtd_part_parser(bcm63xx_cfe_parser); 166 166 167 - MODULE_LICENSE("GPL"); 168 167 MODULE_AUTHOR("Daniel Dickinson <openwrt@cshore.neomailbox.net>"); 169 168 MODULE_AUTHOR("Florian Fainelli <florian@openwrt.org>"); 170 169 MODULE_AUTHOR("Mike Albon <malbon@openwrt.org>");
+2 -2
drivers/mtd/spi-nor/controllers/nxp-spifi.c
··· 305 305 } 306 306 } 307 307 308 - if (of_find_property(np, "spi-cpha", NULL)) 308 + if (of_property_read_bool(np, "spi-cpha")) 309 309 mode |= SPI_CPHA; 310 310 311 - if (of_find_property(np, "spi-cpol", NULL)) 311 + if (of_property_read_bool(np, "spi-cpol")) 312 312 mode |= SPI_CPOL; 313 313 314 314 /* Setup control register defaults */
+469 -33
drivers/mtd/spi-nor/core.c
··· 508 508 } 509 509 510 510 /** 511 - * spi_nor_set_4byte_addr_mode() - Enter/Exit 4-byte address mode. 511 + * spi_nor_set_4byte_addr_mode_en4b_ex4b() - Enter/Exit 4-byte address mode 512 + * using SPINOR_OP_EN4B/SPINOR_OP_EX4B. Typically used by 513 + * Winbond and Macronix. 512 514 * @nor: pointer to 'struct spi_nor'. 513 515 * @enable: true to enter the 4-byte address mode, false to exit the 4-byte 514 516 * address mode. 515 517 * 516 518 * Return: 0 on success, -errno otherwise. 517 519 */ 518 - int spi_nor_set_4byte_addr_mode(struct spi_nor *nor, bool enable) 520 + int spi_nor_set_4byte_addr_mode_en4b_ex4b(struct spi_nor *nor, bool enable) 519 521 { 520 522 int ret; 521 523 ··· 541 539 } 542 540 543 541 /** 544 - * spansion_set_4byte_addr_mode() - Set 4-byte address mode for Spansion 545 - * flashes. 542 + * spi_nor_set_4byte_addr_mode_wren_en4b_ex4b() - Set 4-byte address mode using 543 + * SPINOR_OP_WREN followed by SPINOR_OP_EN4B or SPINOR_OP_EX4B. Typically used 544 + * by ST and Micron flashes. 546 545 * @nor: pointer to 'struct spi_nor'. 547 546 * @enable: true to enter the 4-byte address mode, false to exit the 4-byte 548 547 * address mode. 549 548 * 550 549 * Return: 0 on success, -errno otherwise. 551 550 */ 552 - static int spansion_set_4byte_addr_mode(struct spi_nor *nor, bool enable) 551 + int spi_nor_set_4byte_addr_mode_wren_en4b_ex4b(struct spi_nor *nor, bool enable) 552 + { 553 + int ret; 554 + 555 + ret = spi_nor_write_enable(nor); 556 + if (ret) 557 + return ret; 558 + 559 + ret = spi_nor_set_4byte_addr_mode_en4b_ex4b(nor, enable); 560 + if (ret) 561 + return ret; 562 + 563 + return spi_nor_write_disable(nor); 564 + } 565 + 566 + /** 567 + * spi_nor_set_4byte_addr_mode_brwr() - Set 4-byte address mode using 568 + * SPINOR_OP_BRWR. Typically used by Spansion flashes. 569 + * @nor: pointer to 'struct spi_nor'. 570 + * @enable: true to enter the 4-byte address mode, false to exit the 4-byte 571 + * address mode. 572 + * 573 + * 8-bit volatile bank register used to define A[30:A24] bits. MSB (bit[7]) is 574 + * used to enable/disable 4-byte address mode. When MSB is set to ‘1’, 4-byte 575 + * address mode is active and A[30:24] bits are don’t care. Write instruction is 576 + * SPINOR_OP_BRWR(17h) with 1 byte of data. 577 + * 578 + * Return: 0 on success, -errno otherwise. 579 + */ 580 + int spi_nor_set_4byte_addr_mode_brwr(struct spi_nor *nor, bool enable) 553 581 { 554 582 int ret; 555 583 ··· 621 589 } 622 590 623 591 /** 592 + * spi_nor_use_parallel_locking() - Checks if RWW locking scheme shall be used 593 + * @nor: pointer to 'struct spi_nor'. 594 + * 595 + * Return: true if parallel locking is enabled, false otherwise. 596 + */ 597 + static bool spi_nor_use_parallel_locking(struct spi_nor *nor) 598 + { 599 + return nor->flags & SNOR_F_RWW; 600 + } 601 + 602 + /* Locking helpers for status read operations */ 603 + static int spi_nor_rww_start_rdst(struct spi_nor *nor) 604 + { 605 + struct spi_nor_rww *rww = &nor->rww; 606 + int ret = -EAGAIN; 607 + 608 + mutex_lock(&nor->lock); 609 + 610 + if (rww->ongoing_io || rww->ongoing_rd) 611 + goto busy; 612 + 613 + rww->ongoing_io = true; 614 + rww->ongoing_rd = true; 615 + ret = 0; 616 + 617 + busy: 618 + mutex_unlock(&nor->lock); 619 + return ret; 620 + } 621 + 622 + static void spi_nor_rww_end_rdst(struct spi_nor *nor) 623 + { 624 + struct spi_nor_rww *rww = &nor->rww; 625 + 626 + mutex_lock(&nor->lock); 627 + 628 + rww->ongoing_io = false; 629 + rww->ongoing_rd = false; 630 + 631 + mutex_unlock(&nor->lock); 632 + } 633 + 634 + static int spi_nor_lock_rdst(struct spi_nor *nor) 635 + { 636 + if (spi_nor_use_parallel_locking(nor)) 637 + return spi_nor_rww_start_rdst(nor); 638 + 639 + return 0; 640 + } 641 + 642 + static void spi_nor_unlock_rdst(struct spi_nor *nor) 643 + { 644 + if (spi_nor_use_parallel_locking(nor)) { 645 + spi_nor_rww_end_rdst(nor); 646 + wake_up(&nor->rww.wait); 647 + } 648 + } 649 + 650 + /** 624 651 * spi_nor_ready() - Query the flash to see if it is ready for new commands. 625 652 * @nor: pointer to 'struct spi_nor'. 626 653 * ··· 687 596 */ 688 597 static int spi_nor_ready(struct spi_nor *nor) 689 598 { 599 + int ret; 600 + 601 + ret = spi_nor_lock_rdst(nor); 602 + if (ret) 603 + return 0; 604 + 690 605 /* Flashes might override the standard routine. */ 691 606 if (nor->params->ready) 692 - return nor->params->ready(nor); 607 + ret = nor->params->ready(nor); 608 + else 609 + ret = spi_nor_sr_ready(nor); 693 610 694 - return spi_nor_sr_ready(nor); 611 + spi_nor_unlock_rdst(nor); 612 + 613 + return ret; 695 614 } 696 615 697 616 /** ··· 1171 1070 } 1172 1071 } 1173 1072 1174 - int spi_nor_lock_and_prep(struct spi_nor *nor) 1073 + static int spi_nor_prep(struct spi_nor *nor) 1175 1074 { 1176 1075 int ret = 0; 1177 1076 1077 + if (nor->controller_ops && nor->controller_ops->prepare) 1078 + ret = nor->controller_ops->prepare(nor); 1079 + 1080 + return ret; 1081 + } 1082 + 1083 + static void spi_nor_unprep(struct spi_nor *nor) 1084 + { 1085 + if (nor->controller_ops && nor->controller_ops->unprepare) 1086 + nor->controller_ops->unprepare(nor); 1087 + } 1088 + 1089 + static void spi_nor_offset_to_banks(u64 bank_size, loff_t start, size_t len, 1090 + u8 *first, u8 *last) 1091 + { 1092 + /* This is currently safe, the number of banks being very small */ 1093 + *first = DIV_ROUND_DOWN_ULL(start, bank_size); 1094 + *last = DIV_ROUND_DOWN_ULL(start + len - 1, bank_size); 1095 + } 1096 + 1097 + /* Generic helpers for internal locking and serialization */ 1098 + static bool spi_nor_rww_start_io(struct spi_nor *nor) 1099 + { 1100 + struct spi_nor_rww *rww = &nor->rww; 1101 + bool start = false; 1102 + 1178 1103 mutex_lock(&nor->lock); 1179 1104 1180 - if (nor->controller_ops && nor->controller_ops->prepare) { 1181 - ret = nor->controller_ops->prepare(nor); 1182 - if (ret) { 1183 - mutex_unlock(&nor->lock); 1184 - return ret; 1185 - } 1105 + if (rww->ongoing_io) 1106 + goto busy; 1107 + 1108 + rww->ongoing_io = true; 1109 + start = true; 1110 + 1111 + busy: 1112 + mutex_unlock(&nor->lock); 1113 + return start; 1114 + } 1115 + 1116 + static void spi_nor_rww_end_io(struct spi_nor *nor) 1117 + { 1118 + mutex_lock(&nor->lock); 1119 + nor->rww.ongoing_io = false; 1120 + mutex_unlock(&nor->lock); 1121 + } 1122 + 1123 + static int spi_nor_lock_device(struct spi_nor *nor) 1124 + { 1125 + if (!spi_nor_use_parallel_locking(nor)) 1126 + return 0; 1127 + 1128 + return wait_event_killable(nor->rww.wait, spi_nor_rww_start_io(nor)); 1129 + } 1130 + 1131 + static void spi_nor_unlock_device(struct spi_nor *nor) 1132 + { 1133 + if (spi_nor_use_parallel_locking(nor)) { 1134 + spi_nor_rww_end_io(nor); 1135 + wake_up(&nor->rww.wait); 1186 1136 } 1137 + } 1138 + 1139 + /* Generic helpers for internal locking and serialization */ 1140 + static bool spi_nor_rww_start_exclusive(struct spi_nor *nor) 1141 + { 1142 + struct spi_nor_rww *rww = &nor->rww; 1143 + bool start = false; 1144 + 1145 + mutex_lock(&nor->lock); 1146 + 1147 + if (rww->ongoing_io || rww->ongoing_rd || rww->ongoing_pe) 1148 + goto busy; 1149 + 1150 + rww->ongoing_io = true; 1151 + rww->ongoing_rd = true; 1152 + rww->ongoing_pe = true; 1153 + start = true; 1154 + 1155 + busy: 1156 + mutex_unlock(&nor->lock); 1157 + return start; 1158 + } 1159 + 1160 + static void spi_nor_rww_end_exclusive(struct spi_nor *nor) 1161 + { 1162 + struct spi_nor_rww *rww = &nor->rww; 1163 + 1164 + mutex_lock(&nor->lock); 1165 + rww->ongoing_io = false; 1166 + rww->ongoing_rd = false; 1167 + rww->ongoing_pe = false; 1168 + mutex_unlock(&nor->lock); 1169 + } 1170 + 1171 + int spi_nor_prep_and_lock(struct spi_nor *nor) 1172 + { 1173 + int ret; 1174 + 1175 + ret = spi_nor_prep(nor); 1176 + if (ret) 1177 + return ret; 1178 + 1179 + if (!spi_nor_use_parallel_locking(nor)) 1180 + mutex_lock(&nor->lock); 1181 + else 1182 + ret = wait_event_killable(nor->rww.wait, 1183 + spi_nor_rww_start_exclusive(nor)); 1184 + 1187 1185 return ret; 1188 1186 } 1189 1187 1190 1188 void spi_nor_unlock_and_unprep(struct spi_nor *nor) 1191 1189 { 1192 - if (nor->controller_ops && nor->controller_ops->unprepare) 1193 - nor->controller_ops->unprepare(nor); 1190 + if (!spi_nor_use_parallel_locking(nor)) { 1191 + mutex_unlock(&nor->lock); 1192 + } else { 1193 + spi_nor_rww_end_exclusive(nor); 1194 + wake_up(&nor->rww.wait); 1195 + } 1196 + 1197 + spi_nor_unprep(nor); 1198 + } 1199 + 1200 + /* Internal locking helpers for program and erase operations */ 1201 + static bool spi_nor_rww_start_pe(struct spi_nor *nor, loff_t start, size_t len) 1202 + { 1203 + struct spi_nor_rww *rww = &nor->rww; 1204 + unsigned int used_banks = 0; 1205 + bool started = false; 1206 + u8 first, last; 1207 + int bank; 1208 + 1209 + mutex_lock(&nor->lock); 1210 + 1211 + if (rww->ongoing_io || rww->ongoing_rd || rww->ongoing_pe) 1212 + goto busy; 1213 + 1214 + spi_nor_offset_to_banks(nor->params->bank_size, start, len, &first, &last); 1215 + for (bank = first; bank <= last; bank++) { 1216 + if (rww->used_banks & BIT(bank)) 1217 + goto busy; 1218 + 1219 + used_banks |= BIT(bank); 1220 + } 1221 + 1222 + rww->used_banks |= used_banks; 1223 + rww->ongoing_pe = true; 1224 + started = true; 1225 + 1226 + busy: 1194 1227 mutex_unlock(&nor->lock); 1228 + return started; 1229 + } 1230 + 1231 + static void spi_nor_rww_end_pe(struct spi_nor *nor, loff_t start, size_t len) 1232 + { 1233 + struct spi_nor_rww *rww = &nor->rww; 1234 + u8 first, last; 1235 + int bank; 1236 + 1237 + mutex_lock(&nor->lock); 1238 + 1239 + spi_nor_offset_to_banks(nor->params->bank_size, start, len, &first, &last); 1240 + for (bank = first; bank <= last; bank++) 1241 + rww->used_banks &= ~BIT(bank); 1242 + 1243 + rww->ongoing_pe = false; 1244 + 1245 + mutex_unlock(&nor->lock); 1246 + } 1247 + 1248 + static int spi_nor_prep_and_lock_pe(struct spi_nor *nor, loff_t start, size_t len) 1249 + { 1250 + int ret; 1251 + 1252 + ret = spi_nor_prep(nor); 1253 + if (ret) 1254 + return ret; 1255 + 1256 + if (!spi_nor_use_parallel_locking(nor)) 1257 + mutex_lock(&nor->lock); 1258 + else 1259 + ret = wait_event_killable(nor->rww.wait, 1260 + spi_nor_rww_start_pe(nor, start, len)); 1261 + 1262 + return ret; 1263 + } 1264 + 1265 + static void spi_nor_unlock_and_unprep_pe(struct spi_nor *nor, loff_t start, size_t len) 1266 + { 1267 + if (!spi_nor_use_parallel_locking(nor)) { 1268 + mutex_unlock(&nor->lock); 1269 + } else { 1270 + spi_nor_rww_end_pe(nor, start, len); 1271 + wake_up(&nor->rww.wait); 1272 + } 1273 + 1274 + spi_nor_unprep(nor); 1275 + } 1276 + 1277 + /* Internal locking helpers for read operations */ 1278 + static bool spi_nor_rww_start_rd(struct spi_nor *nor, loff_t start, size_t len) 1279 + { 1280 + struct spi_nor_rww *rww = &nor->rww; 1281 + unsigned int used_banks = 0; 1282 + bool started = false; 1283 + u8 first, last; 1284 + int bank; 1285 + 1286 + mutex_lock(&nor->lock); 1287 + 1288 + if (rww->ongoing_io || rww->ongoing_rd) 1289 + goto busy; 1290 + 1291 + spi_nor_offset_to_banks(nor->params->bank_size, start, len, &first, &last); 1292 + for (bank = first; bank <= last; bank++) { 1293 + if (rww->used_banks & BIT(bank)) 1294 + goto busy; 1295 + 1296 + used_banks |= BIT(bank); 1297 + } 1298 + 1299 + rww->used_banks |= used_banks; 1300 + rww->ongoing_io = true; 1301 + rww->ongoing_rd = true; 1302 + started = true; 1303 + 1304 + busy: 1305 + mutex_unlock(&nor->lock); 1306 + return started; 1307 + } 1308 + 1309 + static void spi_nor_rww_end_rd(struct spi_nor *nor, loff_t start, size_t len) 1310 + { 1311 + struct spi_nor_rww *rww = &nor->rww; 1312 + u8 first, last; 1313 + int bank; 1314 + 1315 + mutex_lock(&nor->lock); 1316 + 1317 + spi_nor_offset_to_banks(nor->params->bank_size, start, len, &first, &last); 1318 + for (bank = first; bank <= last; bank++) 1319 + nor->rww.used_banks &= ~BIT(bank); 1320 + 1321 + rww->ongoing_io = false; 1322 + rww->ongoing_rd = false; 1323 + 1324 + mutex_unlock(&nor->lock); 1325 + } 1326 + 1327 + static int spi_nor_prep_and_lock_rd(struct spi_nor *nor, loff_t start, size_t len) 1328 + { 1329 + int ret; 1330 + 1331 + ret = spi_nor_prep(nor); 1332 + if (ret) 1333 + return ret; 1334 + 1335 + if (!spi_nor_use_parallel_locking(nor)) 1336 + mutex_lock(&nor->lock); 1337 + else 1338 + ret = wait_event_killable(nor->rww.wait, 1339 + spi_nor_rww_start_rd(nor, start, len)); 1340 + 1341 + return ret; 1342 + } 1343 + 1344 + static void spi_nor_unlock_and_unprep_rd(struct spi_nor *nor, loff_t start, size_t len) 1345 + { 1346 + if (!spi_nor_use_parallel_locking(nor)) { 1347 + mutex_unlock(&nor->lock); 1348 + } else { 1349 + spi_nor_rww_end_rd(nor, start, len); 1350 + wake_up(&nor->rww.wait); 1351 + } 1352 + 1353 + spi_nor_unprep(nor); 1195 1354 } 1196 1355 1197 1356 static u32 spi_nor_convert_addr(struct spi_nor *nor, loff_t addr) ··· 1758 1397 dev_vdbg(nor->dev, "erase_cmd->size = 0x%08x, erase_cmd->opcode = 0x%02x, erase_cmd->count = %u\n", 1759 1398 cmd->size, cmd->opcode, cmd->count); 1760 1399 1761 - ret = spi_nor_write_enable(nor); 1400 + ret = spi_nor_lock_device(nor); 1762 1401 if (ret) 1763 1402 goto destroy_erase_cmd_list; 1764 1403 1404 + ret = spi_nor_write_enable(nor); 1405 + if (ret) { 1406 + spi_nor_unlock_device(nor); 1407 + goto destroy_erase_cmd_list; 1408 + } 1409 + 1765 1410 ret = spi_nor_erase_sector(nor, addr); 1411 + spi_nor_unlock_device(nor); 1766 1412 if (ret) 1767 1413 goto destroy_erase_cmd_list; 1768 1414 ··· 1814 1446 addr = instr->addr; 1815 1447 len = instr->len; 1816 1448 1817 - ret = spi_nor_lock_and_prep(nor); 1449 + ret = spi_nor_prep_and_lock_pe(nor, instr->addr, instr->len); 1818 1450 if (ret) 1819 1451 return ret; 1820 1452 ··· 1822 1454 if (len == mtd->size && !(nor->flags & SNOR_F_NO_OP_CHIP_ERASE)) { 1823 1455 unsigned long timeout; 1824 1456 1825 - ret = spi_nor_write_enable(nor); 1457 + ret = spi_nor_lock_device(nor); 1826 1458 if (ret) 1827 1459 goto erase_err; 1828 1460 1461 + ret = spi_nor_write_enable(nor); 1462 + if (ret) { 1463 + spi_nor_unlock_device(nor); 1464 + goto erase_err; 1465 + } 1466 + 1829 1467 ret = spi_nor_erase_chip(nor); 1468 + spi_nor_unlock_device(nor); 1830 1469 if (ret) 1831 1470 goto erase_err; 1832 1471 ··· 1858 1483 /* "sector"-at-a-time erase */ 1859 1484 } else if (spi_nor_has_uniform_erase(nor)) { 1860 1485 while (len) { 1861 - ret = spi_nor_write_enable(nor); 1486 + ret = spi_nor_lock_device(nor); 1862 1487 if (ret) 1863 1488 goto erase_err; 1864 1489 1490 + ret = spi_nor_write_enable(nor); 1491 + if (ret) { 1492 + spi_nor_unlock_device(nor); 1493 + goto erase_err; 1494 + } 1495 + 1865 1496 ret = spi_nor_erase_sector(nor, addr); 1497 + spi_nor_unlock_device(nor); 1866 1498 if (ret) 1867 1499 goto erase_err; 1868 1500 ··· 1891 1509 ret = spi_nor_write_disable(nor); 1892 1510 1893 1511 erase_err: 1894 - spi_nor_unlock_and_unprep(nor); 1512 + spi_nor_unlock_and_unprep_pe(nor, instr->addr, instr->len); 1895 1513 1896 1514 return ret; 1897 1515 } ··· 2084 1702 size_t *retlen, u_char *buf) 2085 1703 { 2086 1704 struct spi_nor *nor = mtd_to_spi_nor(mtd); 1705 + loff_t from_lock = from; 1706 + size_t len_lock = len; 2087 1707 ssize_t ret; 2088 1708 2089 1709 dev_dbg(nor->dev, "from 0x%08x, len %zd\n", (u32)from, len); 2090 1710 2091 - ret = spi_nor_lock_and_prep(nor); 1711 + ret = spi_nor_prep_and_lock_rd(nor, from_lock, len_lock); 2092 1712 if (ret) 2093 1713 return ret; 2094 1714 ··· 2117 1733 ret = 0; 2118 1734 2119 1735 read_err: 2120 - spi_nor_unlock_and_unprep(nor); 1736 + spi_nor_unlock_and_unprep_rd(nor, from_lock, len_lock); 1737 + 2121 1738 return ret; 2122 1739 } 2123 1740 ··· 2137 1752 2138 1753 dev_dbg(nor->dev, "to 0x%08x, len %zd\n", (u32)to, len); 2139 1754 2140 - ret = spi_nor_lock_and_prep(nor); 1755 + ret = spi_nor_prep_and_lock_pe(nor, to, len); 2141 1756 if (ret) 2142 1757 return ret; 2143 1758 ··· 2162 1777 2163 1778 addr = spi_nor_convert_addr(nor, addr); 2164 1779 2165 - ret = spi_nor_write_enable(nor); 1780 + ret = spi_nor_lock_device(nor); 2166 1781 if (ret) 2167 1782 goto write_err; 2168 1783 1784 + ret = spi_nor_write_enable(nor); 1785 + if (ret) { 1786 + spi_nor_unlock_device(nor); 1787 + goto write_err; 1788 + } 1789 + 2169 1790 ret = spi_nor_write_data(nor, addr, page_remain, buf + i); 1791 + spi_nor_unlock_device(nor); 2170 1792 if (ret < 0) 2171 1793 goto write_err; 2172 1794 written = ret; ··· 2186 1794 } 2187 1795 2188 1796 write_err: 2189 - spi_nor_unlock_and_unprep(nor); 1797 + spi_nor_unlock_and_unprep_pe(nor, to, len); 1798 + 2190 1799 return ret; 2191 1800 } 2192 1801 ··· 2863 2470 2864 2471 if (flags & NO_CHIP_ERASE) 2865 2472 nor->flags |= SNOR_F_NO_OP_CHIP_ERASE; 2473 + 2474 + if (flags & SPI_NOR_RWW && nor->info->n_banks > 1 && 2475 + !nor->controller_ops) 2476 + nor->flags |= SNOR_F_RWW; 2866 2477 } 2867 2478 2868 2479 /** ··· 2898 2501 */ 2899 2502 static void spi_nor_late_init_params(struct spi_nor *nor) 2900 2503 { 2504 + struct spi_nor_flash_parameter *params = nor->params; 2505 + 2901 2506 if (nor->manufacturer && nor->manufacturer->fixups && 2902 2507 nor->manufacturer->fixups->late_init) 2903 2508 nor->manufacturer->fixups->late_init(nor); 2904 2509 2905 2510 if (nor->info->fixups && nor->info->fixups->late_init) 2906 2511 nor->info->fixups->late_init(nor); 2512 + 2513 + /* Default method kept for backward compatibility. */ 2514 + if (!params->set_4byte_addr_mode) 2515 + params->set_4byte_addr_mode = spi_nor_set_4byte_addr_mode_brwr; 2907 2516 2908 2517 spi_nor_init_flags(nor); 2909 2518 spi_nor_init_fixup_flags(nor); ··· 2920 2517 */ 2921 2518 if (nor->flags & SNOR_F_HAS_LOCK && !nor->params->locking_ops) 2922 2519 spi_nor_init_default_locking_ops(nor); 2520 + 2521 + nor->params->bank_size = div64_u64(nor->params->size, nor->info->n_banks); 2923 2522 } 2924 2523 2925 2524 /** ··· 2979 2574 struct device_node *np = spi_nor_get_flash_node(nor); 2980 2575 2981 2576 params->quad_enable = spi_nor_sr2_bit1_quad_enable; 2982 - params->set_4byte_addr_mode = spansion_set_4byte_addr_mode; 2983 2577 params->otp.org = &info->otp_org; 2984 2578 2985 2579 /* Default to 16-bit Write Status (01h) Command */ ··· 3134 2730 return nor->params->quad_enable(nor); 3135 2731 } 3136 2732 2733 + /** 2734 + * spi_nor_set_4byte_addr_mode() - Set address mode. 2735 + * @nor: pointer to a 'struct spi_nor'. 2736 + * @enable: enable/disable 4 byte address mode. 2737 + * 2738 + * Return: 0 on success, -errno otherwise. 2739 + */ 2740 + int spi_nor_set_4byte_addr_mode(struct spi_nor *nor, bool enable) 2741 + { 2742 + struct spi_nor_flash_parameter *params = nor->params; 2743 + int ret; 2744 + 2745 + ret = params->set_4byte_addr_mode(nor, enable); 2746 + if (ret && ret != -ENOTSUPP) 2747 + return ret; 2748 + 2749 + if (enable) { 2750 + params->addr_nbytes = 4; 2751 + params->addr_mode_nbytes = 4; 2752 + } else { 2753 + params->addr_nbytes = 3; 2754 + params->addr_mode_nbytes = 3; 2755 + } 2756 + 2757 + return 0; 2758 + } 2759 + 3137 2760 static int spi_nor_init(struct spi_nor *nor) 3138 2761 { 3139 2762 int err; ··· 3204 2773 */ 3205 2774 WARN_ONCE(nor->flags & SNOR_F_BROKEN_RESET, 3206 2775 "enabling reset hack; may not recover from unexpected reboots\n"); 3207 - err = nor->params->set_4byte_addr_mode(nor, true); 3208 - if (err && err != -ENOTSUPP) 2776 + err = spi_nor_set_4byte_addr_mode(nor, true); 2777 + if (err) 3209 2778 return err; 3210 2779 } 3211 2780 ··· 3318 2887 module_put(dev->driver->owner); 3319 2888 } 3320 2889 3321 - void spi_nor_restore(struct spi_nor *nor) 2890 + static void spi_nor_restore(struct spi_nor *nor) 3322 2891 { 3323 2892 int ret; 3324 2893 3325 2894 /* restore the addressing mode */ 3326 2895 if (nor->addr_nbytes == 4 && !(nor->flags & SNOR_F_4B_OPCODES) && 3327 2896 nor->flags & SNOR_F_BROKEN_RESET) { 3328 - ret = nor->params->set_4byte_addr_mode(nor, false); 2897 + ret = spi_nor_set_4byte_addr_mode(nor, false); 3329 2898 if (ret) 3330 2899 /* 3331 2900 * Do not stop the execution in the hope that the flash ··· 3338 2907 if (nor->flags & SNOR_F_SOFT_RESET) 3339 2908 spi_nor_soft_reset(nor); 3340 2909 } 3341 - EXPORT_SYMBOL_GPL(spi_nor_restore); 3342 2910 3343 2911 static const struct flash_info *spi_nor_match_name(struct spi_nor *nor, 3344 2912 const char *name) ··· 3382 2952 * JEDEC knows better, so overwrite platform ID. We 3383 2953 * can't trust partitions any longer, but we'll let 3384 2954 * mtd apply them anyway, since some partitions may be 3385 - * marked read-only, and we don't want to lose that 2955 + * marked read-only, and we don't want to loose that 3386 2956 * information, even if it's not 100% accurate. 3387 2957 */ 3388 2958 dev_warn(nor->dev, "found %s, expected %s\n", ··· 3407 2977 mtd->name = dev_name(dev); 3408 2978 mtd->type = MTD_NORFLASH; 3409 2979 mtd->flags = MTD_CAP_NORFLASH; 2980 + /* Unset BIT_WRITEABLE to enable JFFS2 write buffer for ECC'd NOR */ 2981 + if (nor->flags & SNOR_F_ECC) 2982 + mtd->flags &= ~MTD_BIT_WRITEABLE; 3410 2983 if (nor->info->flags & SPI_NOR_NO_ERASE) 3411 2984 mtd->flags |= MTD_NO_ERASE; 3412 2985 else ··· 3496 3063 ret = spi_nor_init_params(nor); 3497 3064 if (ret) 3498 3065 return ret; 3066 + 3067 + if (spi_nor_use_parallel_locking(nor)) 3068 + init_waitqueue_head(&nor->rww.wait); 3499 3069 3500 3070 /* 3501 3071 * Configure the SPI memory:
+29 -7
drivers/mtd/spi-nor/core.h
··· 130 130 SNOR_F_IO_MODE_EN_VOLATILE = BIT(11), 131 131 SNOR_F_SOFT_RESET = BIT(12), 132 132 SNOR_F_SWP_IS_VOLATILE = BIT(13), 133 + SNOR_F_RWW = BIT(14), 134 + SNOR_F_ECC = BIT(15), 133 135 }; 134 136 135 137 struct spi_nor_read_command { ··· 338 336 * by the spi_nor_fixups hooks, or dynamically when parsing the JESD216 339 337 * Serial Flash Discoverable Parameters (SFDP) tables. 340 338 * 341 - * @size: the flash memory density in bytes. 339 + * @bank_size: the flash memory bank density in bytes. 340 + * @size: the total flash memory density in bytes. 342 341 * @writesize Minimal writable flash unit size. Defaults to 1. Set to 343 342 * ECC unit size for ECC-ed flashes. 344 343 * @page_size: the page size of the SPI NOR flash memory. ··· 352 349 * in octal DTR mode. 353 350 * @rdsr_addr_nbytes: dummy address bytes needed for Read Status Register 354 351 * command in octal DTR mode. 352 + * @n_dice: number of dice in the flash memory. 353 + * @vreg_offset: volatile register offset for each die. 355 354 * @hwcaps: describes the read and page program hardware 356 355 * capabilities. 357 356 * @reads: read capabilities ordered by priority: the higher index ··· 379 374 * @locking_ops: SPI NOR locking methods. 380 375 */ 381 376 struct spi_nor_flash_parameter { 377 + u64 bank_size; 382 378 u64 size; 383 379 u32 writesize; 384 380 u32 page_size; ··· 387 381 u8 addr_mode_nbytes; 388 382 u8 rdsr_dummy; 389 383 u8 rdsr_addr_nbytes; 384 + u8 n_dice; 385 + u32 *vreg_offset; 390 386 391 387 struct spi_nor_hwcaps hwcaps; 392 388 struct spi_nor_read_command reads[SNOR_CMD_READ_MAX]; ··· 430 422 int (*post_bfpt)(struct spi_nor *nor, 431 423 const struct sfdp_parameter_header *bfpt_header, 432 424 const struct sfdp_bfpt *bfpt); 433 - void (*post_sfdp)(struct spi_nor *nor); 425 + int (*post_sfdp)(struct spi_nor *nor); 434 426 void (*late_init)(struct spi_nor *nor); 435 427 }; 436 428 ··· 443 435 * @sector_size: the size listed here is what works with SPINOR_OP_SE, which 444 436 * isn't necessarily called a "sector" by the vendor. 445 437 * @n_sectors: the number of sectors. 438 + * @n_banks: the number of banks. 446 439 * @page_size: the flash's page size. 447 440 * @addr_nbytes: number of address bytes to send. 448 441 * ··· 468 459 * NO_CHIP_ERASE: chip does not support chip erase. 469 460 * SPI_NOR_NO_FR: can't do fastread. 470 461 * SPI_NOR_QUAD_PP: flash supports Quad Input Page Program. 462 + * SPI_NOR_RWW: flash supports reads while write. 471 463 * 472 464 * @no_sfdp_flags: flags that indicate support that can be discovered via SFDP. 473 465 * Used when SFDP tables are not defined in the flash. These ··· 505 495 unsigned sector_size; 506 496 u16 n_sectors; 507 497 u16 page_size; 498 + u8 n_banks; 508 499 u8 addr_nbytes; 509 500 510 501 bool parse_sfdp; ··· 520 509 #define NO_CHIP_ERASE BIT(7) 521 510 #define SPI_NOR_NO_FR BIT(8) 522 511 #define SPI_NOR_QUAD_PP BIT(9) 512 + #define SPI_NOR_RWW BIT(10) 523 513 524 514 u8 no_sfdp_flags; 525 515 #define SPI_NOR_SKIP_SFDP BIT(0) ··· 552 540 .id = { SPI_NOR_ID_3ITEMS(_jedec_id), SPI_NOR_ID_3ITEMS(_ext_id) }, \ 553 541 .id_len = 6 554 542 555 - #define SPI_NOR_GEOMETRY(_sector_size, _n_sectors) \ 543 + #define SPI_NOR_GEOMETRY(_sector_size, _n_sectors, _n_banks) \ 556 544 .sector_size = (_sector_size), \ 557 545 .n_sectors = (_n_sectors), \ 558 - .page_size = 256 546 + .page_size = 256, \ 547 + .n_banks = (_n_banks) 559 548 560 549 /* Used when the "_ext_id" is two bytes at most */ 561 550 #define INFO(_jedec_id, _ext_id, _sector_size, _n_sectors) \ 562 551 SPI_NOR_ID((_jedec_id), (_ext_id)), \ 563 - SPI_NOR_GEOMETRY((_sector_size), (_n_sectors)), 552 + SPI_NOR_GEOMETRY((_sector_size), (_n_sectors), 1), 553 + 554 + #define INFOB(_jedec_id, _ext_id, _sector_size, _n_sectors, _n_banks) \ 555 + SPI_NOR_ID((_jedec_id), (_ext_id)), \ 556 + SPI_NOR_GEOMETRY((_sector_size), (_n_sectors), (_n_banks)), 564 557 565 558 #define INFO6(_jedec_id, _ext_id, _sector_size, _n_sectors) \ 566 559 SPI_NOR_ID6((_jedec_id), (_ext_id)), \ 567 - SPI_NOR_GEOMETRY((_sector_size), (_n_sectors)), 560 + SPI_NOR_GEOMETRY((_sector_size), (_n_sectors), 1), 568 561 569 562 #define CAT25_INFO(_sector_size, _n_sectors, _page_size, _addr_nbytes) \ 570 563 .sector_size = (_sector_size), \ 571 564 .n_sectors = (_n_sectors), \ 572 565 .page_size = (_page_size), \ 566 + .n_banks = 1, \ 573 567 .addr_nbytes = (_addr_nbytes), \ 574 568 .flags = SPI_NOR_NO_ERASE | SPI_NOR_NO_FR, \ 575 569 ··· 652 634 const enum spi_nor_protocol proto); 653 635 int spi_nor_write_enable(struct spi_nor *nor); 654 636 int spi_nor_write_disable(struct spi_nor *nor); 637 + int spi_nor_set_4byte_addr_mode_en4b_ex4b(struct spi_nor *nor, bool enable); 638 + int spi_nor_set_4byte_addr_mode_wren_en4b_ex4b(struct spi_nor *nor, 639 + bool enable); 640 + int spi_nor_set_4byte_addr_mode_brwr(struct spi_nor *nor, bool enable); 655 641 int spi_nor_set_4byte_addr_mode(struct spi_nor *nor, bool enable); 656 642 int spi_nor_wait_till_ready(struct spi_nor *nor); 657 643 int spi_nor_global_block_unlock(struct spi_nor *nor); 658 - int spi_nor_lock_and_prep(struct spi_nor *nor); 644 + int spi_nor_prep_and_lock(struct spi_nor *nor); 659 645 void spi_nor_unlock_and_unprep(struct spi_nor *nor); 660 646 int spi_nor_sr1_bit6_quad_enable(struct spi_nor *nor); 661 647 int spi_nor_sr2_bit1_quad_enable(struct spi_nor *nor);
+2
drivers/mtd/spi-nor/debugfs.c
··· 25 25 SNOR_F_NAME(IO_MODE_EN_VOLATILE), 26 26 SNOR_F_NAME(SOFT_RESET), 27 27 SNOR_F_NAME(SWP_IS_VOLATILE), 28 + SNOR_F_NAME(RWW), 29 + SNOR_F_NAME(ECC), 28 30 }; 29 31 #undef SNOR_F_NAME 30 32
+10 -1
drivers/mtd/spi-nor/macronix.c
··· 82 82 { "mx25u51245g", INFO(0xc2253a, 0, 64 * 1024, 1024) 83 83 NO_SFDP_FLAGS(SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) 84 84 FIXUP_FLAGS(SPI_NOR_4B_OPCODES) }, 85 + { "mx25uw51245g", INFOB(0xc2813a, 0, 0, 0, 4) 86 + PARSE_SFDP 87 + FLAGS(SPI_NOR_RWW) }, 85 88 { "mx25v8035f", INFO(0xc22314, 0, 64 * 1024, 16) 86 89 NO_SFDP_FLAGS(SECT_4K | SPI_NOR_DUAL_READ | 87 90 SPI_NOR_QUAD_READ) }, ··· 108 105 static void macronix_nor_default_init(struct spi_nor *nor) 109 106 { 110 107 nor->params->quad_enable = spi_nor_sr1_bit6_quad_enable; 111 - nor->params->set_4byte_addr_mode = spi_nor_set_4byte_addr_mode; 108 + } 109 + 110 + static void macronix_nor_late_init(struct spi_nor *nor) 111 + { 112 + if (!nor->params->set_4byte_addr_mode) 113 + nor->params->set_4byte_addr_mode = spi_nor_set_4byte_addr_mode_en4b_ex4b; 112 114 } 113 115 114 116 static const struct spi_nor_fixups macronix_nor_fixups = { 115 117 .default_init = macronix_nor_default_init, 118 + .late_init = macronix_nor_late_init, 116 119 }; 117 120 118 121 const struct spi_nor_manufacturer spi_nor_macronix = {
+9 -27
drivers/mtd/spi-nor/micron-st.c
··· 131 131 nor->params->octal_dtr_enable = micron_st_nor_octal_dtr_enable; 132 132 } 133 133 134 - static void mt35xu512aba_post_sfdp_fixup(struct spi_nor *nor) 134 + static int mt35xu512aba_post_sfdp_fixup(struct spi_nor *nor) 135 135 { 136 136 /* Set the Fast Read settings. */ 137 137 nor->params->hwcaps.mask |= SNOR_HWCAPS_READ_8_8_8_DTR; ··· 149 149 * disable it. 150 150 */ 151 151 nor->params->quad_enable = NULL; 152 + 153 + return 0; 152 154 } 153 155 154 156 static const struct spi_nor_fixups mt35xu512aba_fixups = { ··· 304 302 }; 305 303 306 304 /** 307 - * micron_st_nor_set_4byte_addr_mode() - Set 4-byte address mode for ST and 308 - * Micron flashes. 309 - * @nor: pointer to 'struct spi_nor'. 310 - * @enable: true to enter the 4-byte address mode, false to exit the 4-byte 311 - * address mode. 312 - * 313 - * Return: 0 on success, -errno otherwise. 314 - */ 315 - static int micron_st_nor_set_4byte_addr_mode(struct spi_nor *nor, bool enable) 316 - { 317 - int ret; 318 - 319 - ret = spi_nor_write_enable(nor); 320 - if (ret) 321 - return ret; 322 - 323 - ret = spi_nor_set_4byte_addr_mode(nor, enable); 324 - if (ret) 325 - return ret; 326 - 327 - return spi_nor_write_disable(nor); 328 - } 329 - 330 - /** 331 305 * micron_st_nor_read_fsr() - Read the Flag Status Register. 332 306 * @nor: pointer to 'struct spi_nor' 333 307 * @fsr: pointer to a DMA-able buffer where the value of the ··· 427 449 nor->flags |= SNOR_F_HAS_LOCK; 428 450 nor->flags &= ~SNOR_F_HAS_16BIT_SR; 429 451 nor->params->quad_enable = NULL; 430 - nor->params->set_4byte_addr_mode = micron_st_nor_set_4byte_addr_mode; 431 452 } 432 453 433 454 static void micron_st_nor_late_init(struct spi_nor *nor) 434 455 { 456 + struct spi_nor_flash_parameter *params = nor->params; 457 + 435 458 if (nor->info->mfr_flags & USE_FSR) 436 - nor->params->ready = micron_st_nor_ready; 459 + params->ready = micron_st_nor_ready; 460 + 461 + if (!params->set_4byte_addr_mode) 462 + params->set_4byte_addr_mode = spi_nor_set_4byte_addr_mode_wren_en4b_ex4b; 437 463 } 438 464 439 465 static const struct spi_nor_fixups micron_st_nor_fixups = {
+4 -4
drivers/mtd/spi-nor/otp.c
··· 255 255 if (len < n_regions * sizeof(*buf)) 256 256 return -ENOSPC; 257 257 258 - ret = spi_nor_lock_and_prep(nor); 258 + ret = spi_nor_prep_and_lock(nor); 259 259 if (ret) 260 260 return ret; 261 261 ··· 325 325 if (!total_len) 326 326 return 0; 327 327 328 - ret = spi_nor_lock_and_prep(nor); 328 + ret = spi_nor_prep_and_lock(nor); 329 329 if (ret) 330 330 return ret; 331 331 ··· 415 415 if (!IS_ALIGNED(len, rlen) || !IS_ALIGNED(from, rlen)) 416 416 return -EINVAL; 417 417 418 - ret = spi_nor_lock_and_prep(nor); 418 + ret = spi_nor_prep_and_lock(nor); 419 419 if (ret) 420 420 return ret; 421 421 ··· 460 460 if (!IS_ALIGNED(len, rlen) || !IS_ALIGNED(from, rlen)) 461 461 return -EINVAL; 462 462 463 - ret = spi_nor_lock_and_prep(nor); 463 + ret = spi_nor_prep_and_lock(nor); 464 464 if (ret) 465 465 return ret; 466 466
+102 -5
drivers/mtd/spi-nor/sfdp.c
··· 26 26 * Status, Control and Configuration 27 27 * Register Map. 28 28 */ 29 + #define SFDP_SCCR_MAP_MC_ID 0xff88 /* 30 + * Status, Control and Configuration 31 + * Register Map Offsets for Multi-Chip 32 + * SPI Memory Devices. 33 + */ 29 34 30 35 #define SFDP_SIGNATURE 0x50444653U 31 36 ··· 443 438 size_t len; 444 439 int i, cmd, err; 445 440 u32 addr, val; 441 + u32 dword; 446 442 u16 half; 447 443 u8 erase_mask; 448 444 ··· 612 606 dev_dbg(nor->dev, "BFPT QER reserved value used\n"); 613 607 break; 614 608 } 609 + 610 + dword = bfpt.dwords[SFDP_DWORD(16)] & BFPT_DWORD16_4B_ADDR_MODE_MASK; 611 + if (SFDP_MASK_CHECK(dword, BFPT_DWORD16_4B_ADDR_MODE_BRWR)) 612 + params->set_4byte_addr_mode = spi_nor_set_4byte_addr_mode_brwr; 613 + else if (SFDP_MASK_CHECK(dword, BFPT_DWORD16_4B_ADDR_MODE_WREN_EN4B_EX4B)) 614 + params->set_4byte_addr_mode = spi_nor_set_4byte_addr_mode_wren_en4b_ex4b; 615 + else if (SFDP_MASK_CHECK(dword, BFPT_DWORD16_4B_ADDR_MODE_EN4B_EX4B)) 616 + params->set_4byte_addr_mode = spi_nor_set_4byte_addr_mode_en4b_ex4b; 617 + else 618 + dev_dbg(nor->dev, "BFPT: 4-Byte Address Mode method is not recognized or not implemented\n"); 615 619 616 620 /* Soft Reset support. */ 617 621 if (bfpt.dwords[SFDP_DWORD(16)] & BFPT_DWORD16_SWRST_EN_RST) ··· 1231 1215 static int spi_nor_parse_sccr(struct spi_nor *nor, 1232 1216 const struct sfdp_parameter_header *sccr_header) 1233 1217 { 1218 + struct spi_nor_flash_parameter *params = nor->params; 1234 1219 u32 *dwords, addr; 1235 1220 size_t len; 1236 1221 int ret; ··· 1248 1231 1249 1232 le32_to_cpu_array(dwords, sccr_header->length); 1250 1233 1234 + /* Address offset for volatile registers (die 0) */ 1235 + if (!params->vreg_offset) { 1236 + params->vreg_offset = devm_kmalloc(nor->dev, sizeof(*dwords), 1237 + GFP_KERNEL); 1238 + if (!params->vreg_offset) { 1239 + ret = -ENOMEM; 1240 + goto out; 1241 + } 1242 + } 1243 + params->vreg_offset[0] = dwords[SFDP_DWORD(1)]; 1244 + params->n_dice = 1; 1245 + 1251 1246 if (FIELD_GET(SCCR_DWORD22_OCTAL_DTR_EN_VOLATILE, 1252 1247 dwords[SFDP_DWORD(22)])) 1253 1248 nor->flags |= SNOR_F_IO_MODE_EN_VOLATILE; 1249 + 1250 + out: 1251 + kfree(dwords); 1252 + return ret; 1253 + } 1254 + 1255 + /** 1256 + * spi_nor_parse_sccr_mc() - Parse the Status, Control and Configuration 1257 + * Register Map Offsets for Multi-Chip SPI Memory 1258 + * Devices. 1259 + * @nor: pointer to a 'struct spi_nor' 1260 + * @sccr_mc_header: pointer to the 'struct sfdp_parameter_header' describing 1261 + * the SCCR Map offsets table length and version. 1262 + * 1263 + * Return: 0 on success, -errno otherwise. 1264 + */ 1265 + static int spi_nor_parse_sccr_mc(struct spi_nor *nor, 1266 + const struct sfdp_parameter_header *sccr_mc_header) 1267 + { 1268 + struct spi_nor_flash_parameter *params = nor->params; 1269 + u32 *dwords, addr; 1270 + u8 i, n_dice; 1271 + size_t len; 1272 + int ret; 1273 + 1274 + len = sccr_mc_header->length * sizeof(*dwords); 1275 + dwords = kmalloc(len, GFP_KERNEL); 1276 + if (!dwords) 1277 + return -ENOMEM; 1278 + 1279 + addr = SFDP_PARAM_HEADER_PTP(sccr_mc_header); 1280 + ret = spi_nor_read_sfdp(nor, addr, len, dwords); 1281 + if (ret) 1282 + goto out; 1283 + 1284 + le32_to_cpu_array(dwords, sccr_mc_header->length); 1285 + 1286 + /* 1287 + * Pair of DOWRDs (volatile and non-volatile register offsets) per 1288 + * additional die. Hence, length = 2 * (number of additional dice). 1289 + */ 1290 + n_dice = 1 + sccr_mc_header->length / 2; 1291 + 1292 + /* Address offset for volatile registers of additional dice */ 1293 + params->vreg_offset = 1294 + devm_krealloc(nor->dev, params->vreg_offset, 1295 + n_dice * sizeof(*dwords), 1296 + GFP_KERNEL); 1297 + if (!params->vreg_offset) { 1298 + ret = -ENOMEM; 1299 + goto out; 1300 + } 1301 + 1302 + for (i = 1; i < n_dice; i++) 1303 + params->vreg_offset[i] = dwords[SFDP_DWORD(i) * 2]; 1304 + 1305 + params->n_dice = n_dice; 1254 1306 1255 1307 out: 1256 1308 kfree(dwords); ··· 1335 1249 * Used to tweak various flash parameters when information provided by the SFDP 1336 1250 * tables are wrong. 1337 1251 */ 1338 - static void spi_nor_post_sfdp_fixups(struct spi_nor *nor) 1252 + static int spi_nor_post_sfdp_fixups(struct spi_nor *nor) 1339 1253 { 1254 + int ret; 1255 + 1340 1256 if (nor->manufacturer && nor->manufacturer->fixups && 1341 - nor->manufacturer->fixups->post_sfdp) 1342 - nor->manufacturer->fixups->post_sfdp(nor); 1257 + nor->manufacturer->fixups->post_sfdp) { 1258 + ret = nor->manufacturer->fixups->post_sfdp(nor); 1259 + if (ret) 1260 + return ret; 1261 + } 1343 1262 1344 1263 if (nor->info->fixups && nor->info->fixups->post_sfdp) 1345 - nor->info->fixups->post_sfdp(nor); 1264 + return nor->info->fixups->post_sfdp(nor); 1265 + 1266 + return 0; 1346 1267 } 1347 1268 1348 1269 /** ··· 1542 1449 err = spi_nor_parse_sccr(nor, param_header); 1543 1450 break; 1544 1451 1452 + case SFDP_SCCR_MAP_MC_ID: 1453 + err = spi_nor_parse_sccr_mc(nor, param_header); 1454 + break; 1455 + 1545 1456 default: 1546 1457 break; 1547 1458 } ··· 1563 1466 } 1564 1467 } 1565 1468 1566 - spi_nor_post_sfdp_fixups(nor); 1469 + err = spi_nor_post_sfdp_fixups(nor); 1567 1470 exit: 1568 1471 kfree(param_headers); 1569 1472 return err;
+27
drivers/mtd/spi-nor/sfdp.h
··· 15 15 16 16 /* SFDP DWORDS are indexed from 1 but C arrays are indexed from 0. */ 17 17 #define SFDP_DWORD(i) ((i) - 1) 18 + #define SFDP_MASK_CHECK(dword, mask) (((dword) & (mask)) == (mask)) 18 19 19 20 /* Basic Flash Parameter Table */ 20 21 ··· 90 89 #define BFPT_DWORD15_QER_SR2_BIT1_NO_RD (0x4UL << 20) 91 90 #define BFPT_DWORD15_QER_SR2_BIT1 (0x5UL << 20) /* Spansion */ 92 91 92 + #define BFPT_DWORD16_EN4B_MASK GENMASK(31, 24) 93 + #define BFPT_DWORD16_EN4B_ALWAYS_4B BIT(30) 94 + #define BFPT_DWORD16_EN4B_4B_OPCODES BIT(29) 95 + #define BFPT_DWORD16_EN4B_16BIT_NV_CR BIT(28) 96 + #define BFPT_DWORD16_EN4B_BRWR BIT(27) 97 + #define BFPT_DWORD16_EN4B_WREAR BIT(26) 98 + #define BFPT_DWORD16_EN4B_WREN_EN4B BIT(25) 99 + #define BFPT_DWORD16_EN4B_EN4B BIT(24) 100 + #define BFPT_DWORD16_EX4B_MASK GENMASK(18, 14) 101 + #define BFPT_DWORD16_EX4B_16BIT_NV_CR BIT(18) 102 + #define BFPT_DWORD16_EX4B_BRWR BIT(17) 103 + #define BFPT_DWORD16_EX4B_WREAR BIT(16) 104 + #define BFPT_DWORD16_EX4B_WREN_EX4B BIT(15) 105 + #define BFPT_DWORD16_EX4B_EX4B BIT(14) 106 + #define BFPT_DWORD16_4B_ADDR_MODE_MASK \ 107 + (BFPT_DWORD16_EN4B_MASK | BFPT_DWORD16_EX4B_MASK) 108 + #define BFPT_DWORD16_4B_ADDR_MODE_16BIT_NV_CR \ 109 + (BFPT_DWORD16_EN4B_16BIT_NV_CR | BFPT_DWORD16_EX4B_16BIT_NV_CR) 110 + #define BFPT_DWORD16_4B_ADDR_MODE_BRWR \ 111 + (BFPT_DWORD16_EN4B_BRWR | BFPT_DWORD16_EX4B_BRWR) 112 + #define BFPT_DWORD16_4B_ADDR_MODE_WREAR \ 113 + (BFPT_DWORD16_EN4B_WREAR | BFPT_DWORD16_EX4B_WREAR) 114 + #define BFPT_DWORD16_4B_ADDR_MODE_WREN_EN4B_EX4B \ 115 + (BFPT_DWORD16_EN4B_WREN_EN4B | BFPT_DWORD16_EX4B_WREN_EX4B) 116 + #define BFPT_DWORD16_4B_ADDR_MODE_EN4B_EX4B \ 117 + (BFPT_DWORD16_EN4B_EN4B | BFPT_DWORD16_EX4B_EX4B) 93 118 #define BFPT_DWORD16_SWRST_EN_RST BIT(12) 94 119 95 120 #define BFPT_DWORD18_CMD_EXT_MASK GENMASK(30, 29)
+414 -82
drivers/mtd/spi-nor/spansion.c
··· 14 14 #define SPINOR_OP_CLSR 0x30 /* Clear status register 1 */ 15 15 #define SPINOR_OP_RD_ANY_REG 0x65 /* Read any register */ 16 16 #define SPINOR_OP_WR_ANY_REG 0x71 /* Write any register */ 17 - #define SPINOR_REG_CYPRESS_CFR1V 0x00800002 17 + #define SPINOR_REG_CYPRESS_VREG 0x00800000 18 + #define SPINOR_REG_CYPRESS_STR1 0x0 19 + #define SPINOR_REG_CYPRESS_STR1V \ 20 + (SPINOR_REG_CYPRESS_VREG + SPINOR_REG_CYPRESS_STR1) 21 + #define SPINOR_REG_CYPRESS_CFR1 0x2 22 + #define SPINOR_REG_CYPRESS_CFR1V \ 23 + (SPINOR_REG_CYPRESS_VREG + SPINOR_REG_CYPRESS_CFR1) 18 24 #define SPINOR_REG_CYPRESS_CFR1_QUAD_EN BIT(1) /* Quad Enable */ 19 - #define SPINOR_REG_CYPRESS_CFR2V 0x00800003 25 + #define SPINOR_REG_CYPRESS_CFR2 0x3 26 + #define SPINOR_REG_CYPRESS_CFR2V \ 27 + (SPINOR_REG_CYPRESS_VREG + SPINOR_REG_CYPRESS_CFR2) 20 28 #define SPINOR_REG_CYPRESS_CFR2_MEMLAT_11_24 0xb 21 - #define SPINOR_REG_CYPRESS_CFR3V 0x00800004 29 + #define SPINOR_REG_CYPRESS_CFR2_ADRBYT BIT(7) 30 + #define SPINOR_REG_CYPRESS_CFR3 0x4 31 + #define SPINOR_REG_CYPRESS_CFR3V \ 32 + (SPINOR_REG_CYPRESS_VREG + SPINOR_REG_CYPRESS_CFR3) 22 33 #define SPINOR_REG_CYPRESS_CFR3_PGSZ BIT(4) /* Page size. */ 23 - #define SPINOR_REG_CYPRESS_CFR5V 0x00800006 34 + #define SPINOR_REG_CYPRESS_CFR5 0x6 35 + #define SPINOR_REG_CYPRESS_CFR5V \ 36 + (SPINOR_REG_CYPRESS_VREG + SPINOR_REG_CYPRESS_CFR5) 24 37 #define SPINOR_REG_CYPRESS_CFR5_BIT6 BIT(6) 25 38 #define SPINOR_REG_CYPRESS_CFR5_DDR BIT(1) 26 39 #define SPINOR_REG_CYPRESS_CFR5_OPI BIT(0) ··· 42 29 SPINOR_REG_CYPRESS_CFR5_OPI) 43 30 #define SPINOR_REG_CYPRESS_CFR5_OCT_DTR_DS SPINOR_REG_CYPRESS_CFR5_BIT6 44 31 #define SPINOR_OP_CYPRESS_RD_FAST 0xee 32 + #define SPINOR_REG_CYPRESS_ARCFN 0x00000006 45 33 46 34 /* Cypress SPI NOR flash operations. */ 47 35 #define CYPRESS_NOR_WR_ANY_REG_OP(naddr, addr, ndata, buf) \ ··· 51 37 SPI_MEM_OP_NO_DUMMY, \ 52 38 SPI_MEM_OP_DATA_OUT(ndata, buf, 0)) 53 39 54 - #define CYPRESS_NOR_RD_ANY_REG_OP(naddr, addr, buf) \ 40 + #define CYPRESS_NOR_RD_ANY_REG_OP(naddr, addr, ndummy, buf) \ 55 41 SPI_MEM_OP(SPI_MEM_OP_CMD(SPINOR_OP_RD_ANY_REG, 0), \ 56 42 SPI_MEM_OP_ADDR(naddr, addr, 0), \ 57 - SPI_MEM_OP_NO_DUMMY, \ 43 + SPI_MEM_OP_DUMMY(ndummy, 0), \ 58 44 SPI_MEM_OP_DATA_IN(1, buf, 0)) 59 45 60 46 #define SPANSION_CLSR_OP \ ··· 62 48 SPI_MEM_OP_NO_ADDR, \ 63 49 SPI_MEM_OP_NO_DUMMY, \ 64 50 SPI_MEM_OP_NO_DATA) 51 + 52 + /** 53 + * spansion_nor_clear_sr() - Clear the Status Register. 54 + * @nor: pointer to 'struct spi_nor'. 55 + */ 56 + static void spansion_nor_clear_sr(struct spi_nor *nor) 57 + { 58 + int ret; 59 + 60 + if (nor->spimem) { 61 + struct spi_mem_op op = SPANSION_CLSR_OP; 62 + 63 + spi_nor_spimem_setup_op(nor, &op, nor->reg_proto); 64 + 65 + ret = spi_mem_exec_op(nor->spimem, &op); 66 + } else { 67 + ret = spi_nor_controller_ops_write_reg(nor, SPINOR_OP_CLSR, 68 + NULL, 0); 69 + } 70 + 71 + if (ret) 72 + dev_dbg(nor->dev, "error %d clearing SR\n", ret); 73 + } 74 + 75 + static int cypress_nor_sr_ready_and_clear_reg(struct spi_nor *nor, u64 addr) 76 + { 77 + struct spi_mem_op op = 78 + CYPRESS_NOR_RD_ANY_REG_OP(nor->params->addr_mode_nbytes, addr, 79 + 0, nor->bouncebuf); 80 + int ret; 81 + 82 + ret = spi_nor_read_any_reg(nor, &op, nor->reg_proto); 83 + if (ret) 84 + return ret; 85 + 86 + if (nor->bouncebuf[0] & (SR_E_ERR | SR_P_ERR)) { 87 + if (nor->bouncebuf[0] & SR_E_ERR) 88 + dev_err(nor->dev, "Erase Error occurred\n"); 89 + else 90 + dev_err(nor->dev, "Programming Error occurred\n"); 91 + 92 + spansion_nor_clear_sr(nor); 93 + 94 + ret = spi_nor_write_disable(nor); 95 + if (ret) 96 + return ret; 97 + 98 + return -EIO; 99 + } 100 + 101 + return !(nor->bouncebuf[0] & SR_WIP); 102 + } 103 + /** 104 + * cypress_nor_sr_ready_and_clear() - Query the Status Register of each die by 105 + * using Read Any Register command to see if the whole flash is ready for new 106 + * commands and clear it if there are any errors. 107 + * @nor: pointer to 'struct spi_nor'. 108 + * 109 + * Return: 1 if ready, 0 if not ready, -errno on errors. 110 + */ 111 + static int cypress_nor_sr_ready_and_clear(struct spi_nor *nor) 112 + { 113 + struct spi_nor_flash_parameter *params = nor->params; 114 + u64 addr; 115 + int ret; 116 + u8 i; 117 + 118 + for (i = 0; i < params->n_dice; i++) { 119 + addr = params->vreg_offset[i] + SPINOR_REG_CYPRESS_STR1; 120 + ret = cypress_nor_sr_ready_and_clear_reg(nor, addr); 121 + if (ret < 0) 122 + return ret; 123 + else if (ret == 0) 124 + return 0; 125 + } 126 + 127 + return 1; 128 + } 65 129 66 130 static int cypress_nor_octal_dtr_en(struct spi_nor *nor) 67 131 { ··· 217 125 return 0; 218 126 } 219 127 128 + static int cypress_nor_quad_enable_volatile_reg(struct spi_nor *nor, u64 addr) 129 + { 130 + struct spi_mem_op op; 131 + u8 addr_mode_nbytes = nor->params->addr_mode_nbytes; 132 + u8 cfr1v_written; 133 + int ret; 134 + 135 + op = (struct spi_mem_op) 136 + CYPRESS_NOR_RD_ANY_REG_OP(addr_mode_nbytes, addr, 0, 137 + nor->bouncebuf); 138 + 139 + ret = spi_nor_read_any_reg(nor, &op, nor->reg_proto); 140 + if (ret) 141 + return ret; 142 + 143 + if (nor->bouncebuf[0] & SPINOR_REG_CYPRESS_CFR1_QUAD_EN) 144 + return 0; 145 + 146 + /* Update the Quad Enable bit. */ 147 + nor->bouncebuf[0] |= SPINOR_REG_CYPRESS_CFR1_QUAD_EN; 148 + op = (struct spi_mem_op) 149 + CYPRESS_NOR_WR_ANY_REG_OP(addr_mode_nbytes, addr, 1, 150 + nor->bouncebuf); 151 + ret = spi_nor_write_any_volatile_reg(nor, &op, nor->reg_proto); 152 + if (ret) 153 + return ret; 154 + 155 + cfr1v_written = nor->bouncebuf[0]; 156 + 157 + /* Read back and check it. */ 158 + op = (struct spi_mem_op) 159 + CYPRESS_NOR_RD_ANY_REG_OP(addr_mode_nbytes, addr, 0, 160 + nor->bouncebuf); 161 + ret = spi_nor_read_any_reg(nor, &op, nor->reg_proto); 162 + if (ret) 163 + return ret; 164 + 165 + if (nor->bouncebuf[0] != cfr1v_written) { 166 + dev_err(nor->dev, "CFR1: Read back test failed\n"); 167 + return -EIO; 168 + } 169 + 170 + return 0; 171 + } 172 + 220 173 /** 221 174 * cypress_nor_quad_enable_volatile() - enable Quad I/O mode in volatile 222 175 * register. ··· 278 141 */ 279 142 static int cypress_nor_quad_enable_volatile(struct spi_nor *nor) 280 143 { 281 - struct spi_mem_op op; 282 - u8 addr_mode_nbytes = nor->params->addr_mode_nbytes; 283 - u8 cfr1v_written; 144 + struct spi_nor_flash_parameter *params = nor->params; 145 + u64 addr; 146 + u8 i; 284 147 int ret; 285 148 286 - op = (struct spi_mem_op) 287 - CYPRESS_NOR_RD_ANY_REG_OP(addr_mode_nbytes, 288 - SPINOR_REG_CYPRESS_CFR1V, 289 - nor->bouncebuf); 149 + if (!params->n_dice) 150 + return cypress_nor_quad_enable_volatile_reg(nor, 151 + SPINOR_REG_CYPRESS_CFR1V); 290 152 291 - ret = spi_nor_read_any_reg(nor, &op, nor->reg_proto); 292 - if (ret) 293 - return ret; 294 - 295 - if (nor->bouncebuf[0] & SPINOR_REG_CYPRESS_CFR1_QUAD_EN) 296 - return 0; 297 - 298 - /* Update the Quad Enable bit. */ 299 - nor->bouncebuf[0] |= SPINOR_REG_CYPRESS_CFR1_QUAD_EN; 300 - op = (struct spi_mem_op) 301 - CYPRESS_NOR_WR_ANY_REG_OP(addr_mode_nbytes, 302 - SPINOR_REG_CYPRESS_CFR1V, 1, 303 - nor->bouncebuf); 304 - ret = spi_nor_write_any_volatile_reg(nor, &op, nor->reg_proto); 305 - if (ret) 306 - return ret; 307 - 308 - cfr1v_written = nor->bouncebuf[0]; 309 - 310 - /* Read back and check it. */ 311 - op = (struct spi_mem_op) 312 - CYPRESS_NOR_RD_ANY_REG_OP(addr_mode_nbytes, 313 - SPINOR_REG_CYPRESS_CFR1V, 314 - nor->bouncebuf); 315 - ret = spi_nor_read_any_reg(nor, &op, nor->reg_proto); 316 - if (ret) 317 - return ret; 318 - 319 - if (nor->bouncebuf[0] != cfr1v_written) { 320 - dev_err(nor->dev, "CFR1: Read back test failed\n"); 321 - return -EIO; 153 + for (i = 0; i < params->n_dice; i++) { 154 + addr = params->vreg_offset[i] + SPINOR_REG_CYPRESS_CFR1; 155 + ret = cypress_nor_quad_enable_volatile_reg(nor, addr); 156 + if (ret) 157 + return ret; 322 158 } 323 159 324 160 return 0; 325 161 } 326 162 327 163 /** 328 - * cypress_nor_set_page_size() - Set page size which corresponds to the flash 329 - * configuration. 330 - * @nor: pointer to a 'struct spi_nor' 164 + * cypress_nor_determine_addr_mode_by_sr1() - Determine current address mode 165 + * (3 or 4-byte) by querying status 166 + * register 1 (SR1). 167 + * @nor: pointer to a 'struct spi_nor' 168 + * @addr_mode: ponter to a buffer where we return the determined 169 + * address mode. 331 170 * 332 - * The BFPT table advertises a 512B or 256B page size depending on part but the 333 - * page size is actually configurable (with the default being 256B). Read from 334 - * CFR3V[4] and set the correct size. 171 + * This function tries to determine current address mode by comparing SR1 value 172 + * from RDSR1(no address), RDAR(3-byte address), and RDAR(4-byte address). 335 173 * 336 174 * Return: 0 on success, -errno otherwise. 337 175 */ 338 - static int cypress_nor_set_page_size(struct spi_nor *nor) 176 + static int cypress_nor_determine_addr_mode_by_sr1(struct spi_nor *nor, 177 + u8 *addr_mode) 178 + { 179 + struct spi_mem_op op = 180 + CYPRESS_NOR_RD_ANY_REG_OP(3, SPINOR_REG_CYPRESS_STR1V, 0, 181 + nor->bouncebuf); 182 + bool is3byte, is4byte; 183 + int ret; 184 + 185 + ret = spi_nor_read_sr(nor, &nor->bouncebuf[1]); 186 + if (ret) 187 + return ret; 188 + 189 + ret = spi_nor_read_any_reg(nor, &op, nor->reg_proto); 190 + if (ret) 191 + return ret; 192 + 193 + is3byte = (nor->bouncebuf[0] == nor->bouncebuf[1]); 194 + 195 + op = (struct spi_mem_op) 196 + CYPRESS_NOR_RD_ANY_REG_OP(4, SPINOR_REG_CYPRESS_STR1V, 0, 197 + nor->bouncebuf); 198 + ret = spi_nor_read_any_reg(nor, &op, nor->reg_proto); 199 + if (ret) 200 + return ret; 201 + 202 + is4byte = (nor->bouncebuf[0] == nor->bouncebuf[1]); 203 + 204 + if (is3byte == is4byte) 205 + return -EIO; 206 + if (is3byte) 207 + *addr_mode = 3; 208 + else 209 + *addr_mode = 4; 210 + 211 + return 0; 212 + } 213 + 214 + /** 215 + * cypress_nor_set_addr_mode_nbytes() - Set the number of address bytes mode of 216 + * current address mode. 217 + * @nor: pointer to a 'struct spi_nor' 218 + * 219 + * Determine current address mode by reading SR1 with different methods, then 220 + * query CFR2V[7] to confirm. If determination is failed, force enter to 4-byte 221 + * address mode. 222 + * 223 + * Return: 0 on success, -errno otherwise. 224 + */ 225 + static int cypress_nor_set_addr_mode_nbytes(struct spi_nor *nor) 226 + { 227 + struct spi_mem_op op; 228 + u8 addr_mode; 229 + int ret; 230 + 231 + /* 232 + * Read SR1 by RDSR1 and RDAR(3- AND 4-byte addr). Use write enable 233 + * that sets bit-1 in SR1. 234 + */ 235 + ret = spi_nor_write_enable(nor); 236 + if (ret) 237 + return ret; 238 + ret = cypress_nor_determine_addr_mode_by_sr1(nor, &addr_mode); 239 + if (ret) { 240 + ret = spi_nor_set_4byte_addr_mode(nor, true); 241 + if (ret) 242 + return ret; 243 + return spi_nor_write_disable(nor); 244 + } 245 + ret = spi_nor_write_disable(nor); 246 + if (ret) 247 + return ret; 248 + 249 + /* 250 + * Query CFR2V and make sure no contradiction between determined address 251 + * mode and CFR2V[7]. 252 + */ 253 + op = (struct spi_mem_op) 254 + CYPRESS_NOR_RD_ANY_REG_OP(addr_mode, SPINOR_REG_CYPRESS_CFR2V, 255 + 0, nor->bouncebuf); 256 + ret = spi_nor_read_any_reg(nor, &op, nor->reg_proto); 257 + if (ret) 258 + return ret; 259 + 260 + if (nor->bouncebuf[0] & SPINOR_REG_CYPRESS_CFR2_ADRBYT) { 261 + if (addr_mode != 4) 262 + return spi_nor_set_4byte_addr_mode(nor, true); 263 + } else { 264 + if (addr_mode != 3) 265 + return spi_nor_set_4byte_addr_mode(nor, true); 266 + } 267 + 268 + nor->params->addr_nbytes = addr_mode; 269 + nor->params->addr_mode_nbytes = addr_mode; 270 + 271 + return 0; 272 + } 273 + 274 + static int cypress_nor_get_page_size_single_chip(struct spi_nor *nor) 339 275 { 340 276 struct spi_mem_op op = 341 277 CYPRESS_NOR_RD_ANY_REG_OP(nor->params->addr_mode_nbytes, 342 - SPINOR_REG_CYPRESS_CFR3V, 278 + SPINOR_REG_CYPRESS_CFR3V, 0, 343 279 nor->bouncebuf); 344 280 int ret; 345 281 ··· 428 218 return 0; 429 219 } 430 220 221 + 222 + static int cypress_nor_get_page_size_mcp(struct spi_nor *nor) 223 + { 224 + struct spi_mem_op op = 225 + CYPRESS_NOR_RD_ANY_REG_OP(nor->params->addr_mode_nbytes, 226 + 0, 0, nor->bouncebuf); 227 + struct spi_nor_flash_parameter *params = nor->params; 228 + int ret; 229 + u8 i; 230 + 231 + /* 232 + * Use the minimum common page size configuration. Programming 256-byte 233 + * under 512-byte page size configuration is safe. 234 + */ 235 + params->page_size = 256; 236 + for (i = 0; i < params->n_dice; i++) { 237 + op.addr.val = params->vreg_offset[i] + SPINOR_REG_CYPRESS_CFR3; 238 + 239 + ret = spi_nor_read_any_reg(nor, &op, nor->reg_proto); 240 + if (ret) 241 + return ret; 242 + 243 + if (!(nor->bouncebuf[0] & SPINOR_REG_CYPRESS_CFR3_PGSZ)) 244 + return 0; 245 + } 246 + 247 + params->page_size = 512; 248 + 249 + return 0; 250 + } 251 + 252 + /** 253 + * cypress_nor_get_page_size() - Get flash page size configuration. 254 + * @nor: pointer to a 'struct spi_nor' 255 + * 256 + * The BFPT table advertises a 512B or 256B page size depending on part but the 257 + * page size is actually configurable (with the default being 256B). Read from 258 + * CFR3V[4] and set the correct size. 259 + * 260 + * Return: 0 on success, -errno otherwise. 261 + */ 262 + static int cypress_nor_get_page_size(struct spi_nor *nor) 263 + { 264 + if (nor->params->n_dice) 265 + return cypress_nor_get_page_size_mcp(nor); 266 + return cypress_nor_get_page_size_single_chip(nor); 267 + } 268 + 269 + static void cypress_nor_ecc_init(struct spi_nor *nor) 270 + { 271 + /* 272 + * Programming is supported only in 16-byte ECC data unit granularity. 273 + * Byte-programming, bit-walking, or multiple program operations to the 274 + * same ECC data unit without an erase are not allowed. 275 + */ 276 + nor->params->writesize = 16; 277 + nor->flags |= SNOR_F_ECC; 278 + } 279 + 280 + static int 281 + s25fs256t_post_bfpt_fixup(struct spi_nor *nor, 282 + const struct sfdp_parameter_header *bfpt_header, 283 + const struct sfdp_bfpt *bfpt) 284 + { 285 + struct spi_mem_op op; 286 + int ret; 287 + 288 + ret = cypress_nor_set_addr_mode_nbytes(nor); 289 + if (ret) 290 + return ret; 291 + 292 + /* Read Architecture Configuration Register (ARCFN) */ 293 + op = (struct spi_mem_op) 294 + CYPRESS_NOR_RD_ANY_REG_OP(nor->params->addr_mode_nbytes, 295 + SPINOR_REG_CYPRESS_ARCFN, 1, 296 + nor->bouncebuf); 297 + ret = spi_nor_read_any_reg(nor, &op, nor->reg_proto); 298 + if (ret) 299 + return ret; 300 + 301 + /* ARCFN value must be 0 if uniform sector is selected */ 302 + if (nor->bouncebuf[0]) 303 + return -ENODEV; 304 + 305 + return cypress_nor_get_page_size(nor); 306 + } 307 + 308 + static int s25fs256t_post_sfdp_fixup(struct spi_nor *nor) 309 + { 310 + struct spi_nor_flash_parameter *params = nor->params; 311 + 312 + /* PP_1_1_4_4B is supported but missing in 4BAIT. */ 313 + params->hwcaps.mask |= SNOR_HWCAPS_PP_1_1_4; 314 + spi_nor_set_pp_settings(&params->page_programs[SNOR_CMD_PP_1_1_4], 315 + SPINOR_OP_PP_1_1_4_4B, 316 + SNOR_PROTO_1_1_4); 317 + 318 + return 0; 319 + } 320 + 321 + static void s25fs256t_late_init(struct spi_nor *nor) 322 + { 323 + cypress_nor_ecc_init(nor); 324 + } 325 + 326 + static struct spi_nor_fixups s25fs256t_fixups = { 327 + .post_bfpt = s25fs256t_post_bfpt_fixup, 328 + .post_sfdp = s25fs256t_post_sfdp_fixup, 329 + .late_init = s25fs256t_late_init, 330 + }; 331 + 431 332 static int 432 333 s25hx_t_post_bfpt_fixup(struct spi_nor *nor, 433 334 const struct sfdp_parameter_header *bfpt_header, 434 335 const struct sfdp_bfpt *bfpt) 435 336 { 337 + int ret; 338 + 339 + ret = cypress_nor_set_addr_mode_nbytes(nor); 340 + if (ret) 341 + return ret; 342 + 436 343 /* Replace Quad Enable with volatile version */ 437 344 nor->params->quad_enable = cypress_nor_quad_enable_volatile; 438 345 439 - return cypress_nor_set_page_size(nor); 346 + return 0; 440 347 } 441 348 442 - static void s25hx_t_post_sfdp_fixup(struct spi_nor *nor) 349 + static int s25hx_t_post_sfdp_fixup(struct spi_nor *nor) 443 350 { 444 351 struct spi_nor_erase_type *erase_type = 445 352 nor->params->erase_map.erase_type; ··· 578 251 break; 579 252 } 580 253 } 254 + 255 + /* The 2 Gb parts duplicate info and advertise 4 dice instead of 2. */ 256 + if (nor->params->size == SZ_256M) 257 + nor->params->n_dice = 2; 258 + 259 + return cypress_nor_get_page_size(nor); 581 260 } 582 261 583 262 static void s25hx_t_late_init(struct spi_nor *nor) ··· 593 260 /* Fast Read 4B requires mode cycles */ 594 261 params->reads[SNOR_CMD_READ_FAST].num_mode_clocks = 8; 595 262 596 - /* The writesize should be ECC data unit size */ 597 - params->writesize = 16; 263 + cypress_nor_ecc_init(nor); 264 + 265 + /* Replace ready() with multi die version */ 266 + if (params->n_dice) 267 + params->ready = cypress_nor_sr_ready_and_clear; 598 268 } 599 269 600 270 static struct spi_nor_fixups s25hx_t_fixups = { ··· 622 286 cypress_nor_octal_dtr_dis(nor); 623 287 } 624 288 625 - static void s28hx_t_post_sfdp_fixup(struct spi_nor *nor) 289 + static int s28hx_t_post_sfdp_fixup(struct spi_nor *nor) 626 290 { 627 291 /* 628 292 * On older versions of the flash the xSPI Profile 1.0 table has the ··· 648 312 * actual value for that is 4. 649 313 */ 650 314 nor->params->rdsr_addr_nbytes = 4; 315 + 316 + return cypress_nor_get_page_size(nor); 651 317 } 652 318 653 319 static int s28hx_t_post_bfpt_fixup(struct spi_nor *nor, 654 320 const struct sfdp_parameter_header *bfpt_header, 655 321 const struct sfdp_bfpt *bfpt) 656 322 { 657 - return cypress_nor_set_page_size(nor); 323 + int ret; 324 + 325 + ret = cypress_nor_set_addr_mode_nbytes(nor); 326 + if (ret) 327 + return ret; 328 + 329 + return 0; 658 330 } 659 331 660 332 static void s28hx_t_late_init(struct spi_nor *nor) 661 333 { 662 334 nor->params->octal_dtr_enable = cypress_nor_octal_dtr_enable; 663 - nor->params->writesize = 16; 335 + cypress_nor_ecc_init(nor); 664 336 } 665 337 666 338 static const struct spi_nor_fixups s28hx_t_fixups = { ··· 790 446 { "s25fl256l", INFO(0x016019, 0, 64 * 1024, 512) 791 447 NO_SFDP_FLAGS(SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) 792 448 FIXUP_FLAGS(SPI_NOR_4B_OPCODES) }, 449 + { "s25fs256t", INFO6(0x342b19, 0x0f0890, 0, 0) 450 + PARSE_SFDP 451 + .fixups = &s25fs256t_fixups }, 793 452 { "s25hl512t", INFO6(0x342a1a, 0x0f0390, 256 * 1024, 256) 794 453 PARSE_SFDP 795 454 MFR_FLAGS(USE_CLSR) ··· 801 454 PARSE_SFDP 802 455 MFR_FLAGS(USE_CLSR) 803 456 .fixups = &s25hx_t_fixups }, 457 + { "s25hl02gt", INFO6(0x342a1c, 0x0f0090, 0, 0) 458 + PARSE_SFDP 459 + FLAGS(NO_CHIP_ERASE) 460 + .fixups = &s25hx_t_fixups }, 804 461 { "s25hs512t", INFO6(0x342b1a, 0x0f0390, 256 * 1024, 256) 805 462 PARSE_SFDP 806 463 MFR_FLAGS(USE_CLSR) ··· 812 461 { "s25hs01gt", INFO6(0x342b1b, 0x0f0390, 256 * 1024, 512) 813 462 PARSE_SFDP 814 463 MFR_FLAGS(USE_CLSR) 464 + .fixups = &s25hx_t_fixups }, 465 + { "s25hs02gt", INFO6(0x342b1c, 0x0f0090, 0, 0) 466 + PARSE_SFDP 467 + FLAGS(NO_CHIP_ERASE) 815 468 .fixups = &s25hx_t_fixups }, 816 469 { "cy15x104q", INFO6(0x042cc2, 0x7f7f7f, 512 * 1024, 1) 817 470 FLAGS(SPI_NOR_NO_ERASE) }, ··· 836 481 .fixups = &s28hx_t_fixups, 837 482 }, 838 483 }; 839 - 840 - /** 841 - * spansion_nor_clear_sr() - Clear the Status Register. 842 - * @nor: pointer to 'struct spi_nor'. 843 - */ 844 - static void spansion_nor_clear_sr(struct spi_nor *nor) 845 - { 846 - int ret; 847 - 848 - if (nor->spimem) { 849 - struct spi_mem_op op = SPANSION_CLSR_OP; 850 - 851 - spi_nor_spimem_setup_op(nor, &op, nor->reg_proto); 852 - 853 - ret = spi_mem_exec_op(nor->spimem, &op); 854 - } else { 855 - ret = spi_nor_controller_ops_write_reg(nor, SPINOR_OP_CLSR, 856 - NULL, 0); 857 - } 858 - 859 - if (ret) 860 - dev_dbg(nor->dev, "error %d clearing SR\n", ret); 861 - } 862 484 863 485 /** 864 486 * spansion_nor_sr_ready_and_clear() - Query the Status Register to see if the
+1 -1
drivers/mtd/spi-nor/sst.c
··· 126 126 127 127 dev_dbg(nor->dev, "to 0x%08x, len %zd\n", (u32)to, len); 128 128 129 - ret = spi_nor_lock_and_prep(nor); 129 + ret = spi_nor_prep_and_lock(nor); 130 130 if (ret) 131 131 return ret; 132 132
+3 -3
drivers/mtd/spi-nor/swp.c
··· 348 348 struct spi_nor *nor = mtd_to_spi_nor(mtd); 349 349 int ret; 350 350 351 - ret = spi_nor_lock_and_prep(nor); 351 + ret = spi_nor_prep_and_lock(nor); 352 352 if (ret) 353 353 return ret; 354 354 ··· 363 363 struct spi_nor *nor = mtd_to_spi_nor(mtd); 364 364 int ret; 365 365 366 - ret = spi_nor_lock_and_prep(nor); 366 + ret = spi_nor_prep_and_lock(nor); 367 367 if (ret) 368 368 return ret; 369 369 ··· 378 378 struct spi_nor *nor = mtd_to_spi_nor(mtd); 379 379 int ret; 380 380 381 - ret = spi_nor_lock_and_prep(nor); 381 + ret = spi_nor_prep_and_lock(nor); 382 382 if (ret) 383 383 return ret; 384 384
+15 -9
drivers/mtd/spi-nor/winbond.c
··· 188 188 { 189 189 int ret; 190 190 191 - ret = spi_nor_set_4byte_addr_mode(nor, enable); 191 + ret = spi_nor_set_4byte_addr_mode_en4b_ex4b(nor, enable); 192 192 if (ret || enable) 193 193 return ret; 194 194 ··· 216 216 .is_locked = spi_nor_otp_is_locked_sr2, 217 217 }; 218 218 219 - static void winbond_nor_default_init(struct spi_nor *nor) 220 - { 221 - nor->params->set_4byte_addr_mode = winbond_nor_set_4byte_addr_mode; 222 - } 223 - 224 219 static void winbond_nor_late_init(struct spi_nor *nor) 225 220 { 226 - if (nor->params->otp.org->n_regions) 227 - nor->params->otp.ops = &winbond_nor_otp_ops; 221 + struct spi_nor_flash_parameter *params = nor->params; 222 + 223 + if (params->otp.org->n_regions) 224 + params->otp.ops = &winbond_nor_otp_ops; 225 + 226 + /* 227 + * Winbond seems to require that the Extended Address Register to be set 228 + * to zero when exiting the 4-Byte Address Mode, at least for W25Q256FV. 229 + * This requirement is not described in the JESD216 SFDP standard, thus 230 + * it is Winbond specific. Since we do not know if other Winbond flashes 231 + * have the same requirement, play safe and overwrite the method parsed 232 + * from BFPT, if any. 233 + */ 234 + params->set_4byte_addr_mode = winbond_nor_set_4byte_addr_mode; 228 235 } 229 236 230 237 static const struct spi_nor_fixups winbond_nor_fixups = { 231 - .default_init = winbond_nor_default_init, 232 238 .late_init = winbond_nor_late_init, 233 239 }; 234 240
+1
drivers/mtd/spi-nor/xilinx.c
··· 31 31 .sector_size = (8 * (_page_size)), \ 32 32 .n_sectors = (_n_sectors), \ 33 33 .page_size = (_page_size), \ 34 + .n_banks = 1, \ 34 35 .addr_nbytes = 3, \ 35 36 .flags = SPI_NOR_NO_FR 36 37
+1 -1
include/linux/mtd/rawnand.h
··· 1075 1075 * @exec_op: controller specific method to execute NAND operations. 1076 1076 * This method replaces chip->legacy.cmdfunc(), 1077 1077 * chip->legacy.{read,write}_{buf,byte,word}(), 1078 - * chip->legacy.dev_ready() and chip->legacy.waifunc(). 1078 + * chip->legacy.dev_ready() and chip->legacy.waitfunc(). 1079 1079 * @setup_interface: setup the data interface and timing. If chipnr is set to 1080 1080 * %NAND_DATA_IFACE_CHECK_ONLY this means the configuration 1081 1081 * should not be applied but only checked.
+13 -6
include/linux/mtd/spi-nor.h
··· 343 343 * struct spi_nor - Structure for defining the SPI NOR layer 344 344 * @mtd: an mtd_info structure 345 345 * @lock: the lock for the read/write/erase/lock/unlock operations 346 + * @rww: Read-While-Write (RWW) sync lock 347 + * @rww.wait: wait queue for the RWW sync 348 + * @rww.ongoing_io: the bus is busy 349 + * @rww.ongoing_rd: a read is ongoing on the chip 350 + * @rww.ongoing_pe: a program/erase is ongoing on the chip 351 + * @rww.used_banks: bitmap of the banks in use 346 352 * @dev: pointer to an SPI device or an SPI NOR controller device 347 353 * @spimem: pointer to the SPI memory device 348 354 * @bouncebuf: bounce buffer used when the buffer passed by the MTD ··· 382 376 struct spi_nor { 383 377 struct mtd_info mtd; 384 378 struct mutex lock; 379 + struct spi_nor_rww { 380 + wait_queue_head_t wait; 381 + bool ongoing_io; 382 + bool ongoing_rd; 383 + bool ongoing_pe; 384 + unsigned int used_banks; 385 + } rww; 385 386 struct device *dev; 386 387 struct spi_mem *spimem; 387 388 u8 *bouncebuf; ··· 449 436 */ 450 437 int spi_nor_scan(struct spi_nor *nor, const char *name, 451 438 const struct spi_nor_hwcaps *hwcaps); 452 - 453 - /** 454 - * spi_nor_restore_addr_mode() - restore the status of SPI NOR 455 - * @nor: the spi_nor structure 456 - */ 457 - void spi_nor_restore(struct spi_nor *nor); 458 439 459 440 #endif
+1
include/linux/mtd/spinand.h
··· 262 262 /* SPI NAND manufacturers */ 263 263 extern const struct spinand_manufacturer alliancememory_spinand_manufacturer; 264 264 extern const struct spinand_manufacturer ato_spinand_manufacturer; 265 + extern const struct spinand_manufacturer esmt_c8_spinand_manufacturer; 265 266 extern const struct spinand_manufacturer gigadevice_spinand_manufacturer; 266 267 extern const struct spinand_manufacturer macronix_spinand_manufacturer; 267 268 extern const struct spinand_manufacturer micron_spinand_manufacturer;