Simon Glass wanted to support binman's output properties in order to
 check their validity using the binding checks and proposed changes with
 the missing properties as well as a binman compatible.
 
 Krzysztof Kozlowski on his side shared a new yaml for describing
 Samsung's OneNAND interface.
 
 The interface with NVMEM has also been slightly improved/fixed,
 especially now that OTP are also supported in the NAND subsystem.
 
 Along with these changes, small cleanups have also been contributed
 around ID tables, structure sizes, arithmetic checks and comments.
 
 * Raw NAND subsystem
 
 Two small fixes, one in the Hynix vendor code for properly returning an
 error which might have been ignored and another in the Davinci driver to
 properly synchronize the controller with the gpio domain.
 
 * SPI NOR subsystem
 
 SPI NOR now uses div_u64() instead of div64_u64() in places where the
 divisor is 32 bits. Many 32 bit architectures can optimize this variant
 better than a full 64 bit divide.
 -----BEGIN PGP SIGNATURE-----
 
 iQEzBAABCgAdFiEE9HuaYnbmDhq/XIDIJWrqGEe9VoQFAmZFzEwACgkQJWrqGEe9
 VoRNZwf/dTvWM2r/tLPkXJ4lDdZUMJO2Z5YebSwcUWTJ8P4yhoGfxDwgEiWaaauF
 Z++MdSBEK3C9us19ro+YCFidq7T+m1PcekHLa1Zckcy2NOLFyRT7O5j16CEQKHlj
 a/9WfZ37TIaWelZDXnm6nWyTxsDFp5h9IOsG32/SckBFm/TU0+G2MCKz7HvJ6DRg
 /K6Yu+3KpxhO0D3PhTm5+Fi7UhBPABKfvBYrLFiYnuMi3d0L6/75wxj8dje7iW+Q
 9WusrjKvhf3ffp9715RxjDQdMA1MIa/ok7tIlTQXyBfDM1xZkr6MDNeDJfd2FU7J
 2hk/ga7A/zigKJ37ftw/34YZJK6xmw==
 =AtHp
 -----END PGP SIGNATURE-----

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

Pull MTD updates from Miquel Raynal:
 "MTD:

   - Simon Glass wanted to support binman's output properties in order
     to check their validity using the binding checks and proposed
     changes with the missing properties as well as a binman compatible.

   - Krzysztof Kozlowski on his side shared a new yaml for describing
     Samsung's OneNAND interface.

   - The interface with NVMEM has also been slightly improved/fixed,
     especially now that OTP are also supported in the NAND subsystem.

   - Along with these changes, small cleanups have also been contributed
     around ID tables, structure sizes, arithmetic checks and comments.

  Raw NAND subsystem:

   - Two small fixes, one in the Hynix vendor code for properly
     returning an error which might have been ignored and another in the
     Davinci driver to properly synchronize the controller with the gpio
     domain.

  SPI NOR subsystem:

   - SPI NOR now uses div_u64() instead of div64_u64() in places where
     the divisor is 32 bits. Many 32 bit architectures can optimize this
     variant better than a full 64 bit divide"

* tag 'mtd/for-6.10' of git://git.kernel.org/pub/scm/linux/kernel/git/mtd/linux:
  mtd: spi-nor: replace unnecessary div64_u64() with div_u64()
  mtd: mchp23k256: drop unneeded MODULE_ALIAS
  dt-bindings: mtd: fixed-partition: Add binman compatibles
  dt-bindings: mtd: fixed-partitions: Add alignment properties
  mtd: maps: sa1100-flash: Prefer struct_size over open coded arithmetic
  mtd: core: Align comment with an action in mtd_otp_nvmem_add()
  mtd: rawnand: hynix: fixed typo
  mtd: rawnand: davinci: Add dummy read after sending command
  mtd: partitions: redboot: Added conversion of operands to a larger type
  dt-bindings: mtd: Add Samsung S5Pv210 OneNAND
  mtd: core: Don't fail mtd_otp_nvmem_add() if OTP is unsupported
  mtd: core: Report error if first mtd_otp_size() call fails in mtd_otp_nvmem_add()
This commit is contained in:
Linus Torvalds 2024-05-16 09:04:52 -07:00
commit b426433c03
11 changed files with 212 additions and 12 deletions

View File

@ -0,0 +1,53 @@
# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause
%YAML 1.2
---
$id: http://devicetree.org/schemas/mtd/partitions/binman.yaml#
$schema: http://devicetree.org/meta-schemas/core.yaml#
title: Binman entries
description: |
This corresponds to a binman 'entry'. It is a single partition which holds
data of a defined type.
Binman uses the type to indicate what data file / type to place in the
partition. There are quite a number of binman-specific entry types, such as
section, fill and files, to be added later.
maintainers:
- Simon Glass <sjg@chromium.org>
allOf:
- $ref: /schemas/mtd/partitions/partition.yaml#
properties:
compatible:
enum:
- u-boot # u-boot.bin from U-Boot project
- tfa-bl31 # bl31.bin or bl31.elf from TF-A project
required:
- compatible
unevaluatedProperties: false
examples:
- |
partitions {
compatible = "fixed-partitions";
#address-cells = <1>;
#size-cells = <1>;
partition@100000 {
compatible = "u-boot";
reg = <0x100000 0xf00000>;
align-size = <0x1000>;
align-end = <0x10000>;
};
partition@200000 {
compatible = "tfa-bl31";
reg = <0x200000 0x100000>;
align = <0x4000>;
};
};

View File

@ -57,6 +57,57 @@ properties:
user space from user space from
type: boolean type: boolean
align:
$ref: /schemas/types.yaml#/definitions/uint32
minimum: 2
maximum: 0x80000000
multipleOf: 2
description:
This sets the alignment of the entry in bytes.
The entry offset is adjusted so that the entry starts on an aligned
boundary within the containing section or image. For example align =
<16> means that the entry will start on a 16-byte boundary. This may
mean that padding is added before the entry. The padding is part of
the containing section but is not included in the entry, meaning that
an empty space may be created before the entry starts. Alignment
must be a power of 2. If align is not provided, no alignment is
performed.
align-size:
$ref: /schemas/types.yaml#/definitions/uint32
minimum: 2
maximum: 0x80000000
multipleOf: 2
description:
This sets the alignment of the entry size in bytes. It must be a power
of 2.
For example, to ensure that the size of an entry is a multiple of 64
bytes, set this to 64. While this does not affect the content of the
entry itself (the padding is performed only when its parent section is
assembled), the end result is that the entry ends with the padding
bytes, so may grow. If align-size is not provided, no alignment is
performed.
align-end:
$ref: /schemas/types.yaml#/definitions/uint32
minimum: 2
maximum: 0x80000000
multipleOf: 2
description:
This sets the alignment (in bytes) of the end of an entry with respect
to the containing section. It must be a power of 2.
Some entries require that they end on an alignment boundary,
regardless of where they start. This does not move the start of the
entry, so the content of the entry will still start at the beginning.
But there may be padding at the end. While this does not affect the
content of the entry itself (the padding is performed only when its
parent section is assembled), the end result is that the entry ends
with the padding bytes, so may grow. If align-end is not provided,
no alignment is performed.
if: if:
not: not:
required: [ reg ] required: [ reg ]
@ -67,3 +118,24 @@ then:
# This is a generic file other binding inherit from and extend # This is a generic file other binding inherit from and extend
additionalProperties: true additionalProperties: true
examples:
- |
partitions {
compatible = "fixed-partitions";
#address-cells = <1>;
#size-cells = <1>;
partition@100000 {
compatible = "u-boot";
reg = <0x100000 0xf00000>;
align-size = <0x1000>;
align-end = <0x10000>;
};
partition@200000 {
compatible = "tfa-bl31";
reg = <0x200000 0x100000>;
align = <0x4000>;
};
};

View File

@ -0,0 +1,65 @@
# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause
%YAML 1.2
---
$id: http://devicetree.org/schemas/mtd/samsung,s5pv210-onenand.yaml#
$schema: http://devicetree.org/meta-schemas/core.yaml#
title: Samsung S5Pv210 SoC OneNAND Controller
maintainers:
- Krzysztof Kozlowski <krzk@kernel.org>
properties:
compatible:
enum:
- samsung,s5pv210-onenand
reg:
items:
- description: Control registers
- description: OneNAND interface nCE[0]
- description: OneNAND interface nCE[1]
clocks:
maxItems: 2
clock-names:
items:
- const: bus
- const: onenand
interrupts:
maxItems: 1
required:
- compatible
- reg
- clocks
- clock-names
- interrupts
allOf:
- $ref: nand-controller.yaml
unevaluatedProperties: false
examples:
- |
#include <dt-bindings/clock/s5pv210.h>
nand-controller@b0600000 {
compatible = "samsung,s5pv210-onenand";
reg = <0xb0600000 0x2000>,
<0xb0000000 0x20000>,
<0xb0040000 0x20000>;
clocks = <&clocks CLK_NANDXL>, <&clocks DOUT_FLASH>;
clock-names = "bus", "onenand";
interrupt-parent = <&vic1>;
interrupts = <31>;
#address-cells = <1>;
#size-cells = <0>;
nand@0 {
reg = <0>;
};
};

View File

@ -3671,6 +3671,11 @@ F: Documentation/filesystems/bfs.rst
F: fs/bfs/ F: fs/bfs/
F: include/uapi/linux/bfs_fs.h F: include/uapi/linux/bfs_fs.h
BINMAN
M: Simon Glass <sjg@chromium.org>
S: Supported
F: Documentation/devicetree/bindings/mtd/partitions/binman*
BITMAP API BITMAP API
M: Yury Norov <yury.norov@gmail.com> M: Yury Norov <yury.norov@gmail.com>
R: Rasmus Villemoes <linux@rasmusvillemoes.dk> R: Rasmus Villemoes <linux@rasmusvillemoes.dk>

View File

@ -257,4 +257,3 @@ module_spi_driver(mchp23k256_driver);
MODULE_DESCRIPTION("MTD SPI driver for MCHP23K256 RAM chips"); MODULE_DESCRIPTION("MTD SPI driver for MCHP23K256 RAM chips");
MODULE_AUTHOR("Andrew Lunn <andre@lunn.ch>"); MODULE_AUTHOR("Andrew Lunn <andre@lunn.ch>");
MODULE_LICENSE("GPL v2"); MODULE_LICENSE("GPL v2");
MODULE_ALIAS("spi:mchp23k256");

View File

@ -153,7 +153,7 @@ static struct sa_info *sa1100_setup_mtd(struct platform_device *pdev,
struct flash_platform_data *plat) struct flash_platform_data *plat)
{ {
struct sa_info *info; struct sa_info *info;
int nr, size, i, ret = 0; int nr, i, ret = 0;
/* /*
* Count number of devices. * Count number of devices.
@ -167,12 +167,10 @@ static struct sa_info *sa1100_setup_mtd(struct platform_device *pdev,
goto out; goto out;
} }
size = sizeof(struct sa_info) + sizeof(struct sa_subdev_info) * nr;
/* /*
* Allocate the map_info structs in one go. * Allocate the map_info structs in one go.
*/ */
info = kzalloc(size, GFP_KERNEL); info = kzalloc(struct_size(info, subdev, nr), GFP_KERNEL);
if (!info) { if (!info) {
ret = -ENOMEM; ret = -ENOMEM;
goto out; goto out;

View File

@ -956,8 +956,10 @@ static int mtd_otp_nvmem_add(struct mtd_info *mtd)
if (mtd->_get_user_prot_info && mtd->_read_user_prot_reg) { if (mtd->_get_user_prot_info && mtd->_read_user_prot_reg) {
size = mtd_otp_size(mtd, true); size = mtd_otp_size(mtd, true);
if (size < 0) if (size < 0) {
return size; err = size;
goto err;
}
if (size > 0) { if (size > 0) {
nvmem = mtd_otp_nvmem_register(mtd, "user-otp", size, nvmem = mtd_otp_nvmem_register(mtd, "user-otp", size,
@ -1012,6 +1014,9 @@ static int mtd_otp_nvmem_add(struct mtd_info *mtd)
err: err:
nvmem_unregister(mtd->otp_user_nvmem); nvmem_unregister(mtd->otp_user_nvmem);
/* Don't report error if OTP is not supported. */
if (err == -EOPNOTSUPP)
return 0;
return dev_err_probe(dev, err, "Failed to register OTP NVMEM device\n"); return dev_err_probe(dev, err, "Failed to register OTP NVMEM device\n");
} }

View File

@ -671,8 +671,11 @@ static int davinci_nand_exec_instr(struct davinci_nand_info *info,
break; break;
} }
if (instr->delay_ns) if (instr->delay_ns) {
/* Dummy read to be sure that command is sent before ndelay starts */
davinci_nand_readl(info, 0);
ndelay(instr->delay_ns); ndelay(instr->delay_ns);
}
return 0; return 0;
} }

View File

@ -401,7 +401,7 @@ static int hynix_nand_rr_init(struct nand_chip *chip)
if (ret) if (ret)
pr_warn("failed to initialize read-retry infrastructure"); pr_warn("failed to initialize read-retry infrastructure");
return 0; return ret;
} }
static void hynix_nand_extract_oobsize(struct nand_chip *chip, static void hynix_nand_extract_oobsize(struct nand_chip *chip,

View File

@ -102,7 +102,7 @@ static int parse_redboot_partitions(struct mtd_info *master,
offset -= master->erasesize; offset -= master->erasesize;
} }
} else { } else {
offset = directory * master->erasesize; offset = (unsigned long) directory * master->erasesize;
while (mtd_block_isbad(master, offset)) { while (mtd_block_isbad(master, offset)) {
offset += master->erasesize; offset += master->erasesize;
if (offset == master->size) if (offset == master->size)

View File

@ -2893,7 +2893,7 @@ static int spi_nor_late_init_params(struct spi_nor *nor)
spi_nor_init_default_locking_ops(nor); spi_nor_init_default_locking_ops(nor);
if (params->n_banks > 1) if (params->n_banks > 1)
params->bank_size = div64_u64(params->size, params->n_banks); params->bank_size = div_u64(params->size, params->n_banks);
return 0; return 0;
} }
@ -3406,7 +3406,7 @@ static int spi_nor_set_mtd_eraseregions(struct spi_nor *nor)
return -EINVAL; return -EINVAL;
mtd_region[i].erasesize = erasesize; mtd_region[i].erasesize = erasesize;
mtd_region[i].numblocks = div64_ul(region[i].size, erasesize); mtd_region[i].numblocks = div_u64(region[i].size, erasesize);
mtd_region[i].offset = region[i].offset; mtd_region[i].offset = region[i].offset;
} }