.../bindings/mtd/partitions/partition.yaml | 20 ++ drivers/mtd/Kconfig | 9 + drivers/mtd/Makefile | 1 + drivers/mtd/mtd_virt_concat.c | 363 +++++++++++++++++++++ drivers/mtd/mtdconcat.c | 12 - drivers/mtd/mtdcore.c | 19 ++ drivers/mtd/mtdpart.c | 6 + include/linux/mtd/concat.h | 63 +++- 8 files changed, 480 insertions(+), 13 deletions(-)
[TL;DR for v15: as agreed with Amit I'm sending a new iteration of his
patches to fix the build-time failure due to a module dependency
loop. Original cover follows.]
This patch series adds stacked support by enhancing the existing mtd-concat
driver to be more generic.
As background, a few years ago, Bernhard Frauendienst initiated an effort
[2] to achieve the same, which was later adapted by Miquel [1] to introduce
stacked mode support. In this approach, partitions to be concatenated were
specified using a DT property "part-concat" within the partitions
definition, allowing two MTD devices to function as a single larger one in
order to be able to define partitions across chip boundaries. However, the
bindings were not accepted. As a result, the mtd-concat approach was
dropped, and alternative DT bindings were introduced [3][4][5], describing
the two flash devices as one. Corresponding SPI core changes to support
these bindings were later added [6].
While integrating stacked mode support into SPI-NOR, Tudor provided
additional feedback, leading to discussions about updating the existing
DT bindings. To address this, I sent an RFC [7] to initiate discussions on
adapting the DT bindings as suggested by Miquel in [1]. Following that,
I am now submitting this patch series that updates the virtual concat DT
bindings and the driver referenced in [1], along with some minor mtdcore
changes.
Since I have taken ownership of this effort, I have included Bernhard and
Miquel under the "Suggested-by" tag.
[1] https://lore.kernel.org/linux-mtd/20191127105522.31445-1-miquel.raynal@bootlin.com/
[2] https://lwn.net/ml/linux-kernel/20180907173515.19990-1-kernel@nospam.obeliks.de/
[3] https://github.com/torvalds/linux/commit/f89504300e94524d5d5846ff8b728592ac72cec4
[4] https://github.com/torvalds/linux/commit/eba5368503b4291db7819512600fa014ea17c5a8
[5] https://github.com/torvalds/linux/commit/e2edd1b64f1c79e8abda365149ed62a2a9a494b4
[6]https://github.com/torvalds/linux/commit/4d8ff6b0991d5e86b17b235fc46ec62e9195cb9b
[7] https://lore.kernel.org/all/20241026075347.580858-1-amit.kumar-mahapatra@amd.com/
Signed-off-by: Luca Ceresoli <luca.ceresoli@bootlin.com>
---
BRANCH: spi-nor/next
Changes in v15:
- Make mtd_virt_concat built into the mtd module, not a separate
module. This fixes the build failure [8] caused by the interdependency
of virt_concat and mtdcore. Keep VIRT_CONCAT an optional feature though.
[8] https://lore.kernel.org/all/874it99f9i.fsf@bootlin.com/
- Remove 'default n' line from Kconfig
- Link to v14: https://lore.kernel.org/linux-mtd/20250623105445.2394825-1-amit.kumar-mahapatra@amd.com/
Changes in v14:
- Updated 1/3 to address review comments.
- Updated 3/3 to add mtd_virt_concat_destroy() API that would remove a concat
incase one of the mtd device, which is part of the concat, is removed.
Changes in v13:
- Updated 1/3 to modify the Device Tree binding to support multiple concatenated devices.
- Added Rob's "Suggested-by" tag in 1/3.
- Updated 3/3 to define CONFIG_MTD_VIRT_CONCAT as a boolean and depended on CONFIG_MTD_PARTITIONED_MASTER.
- Updated 3/3 to remove late_initcall and invoke the API directly from mtdcore instead.
- Updated 3/3 to add support for concatenating more than two MTD partitions.
- Updated 3/3 to add support for multiple sets of concatenated devices.
Changes in v12:
- Add stacked mode support throught mtd-concat driver.
Changes in v11:
- Rebased patch series on top of latest for-next branch.
- Added a new patch(1/10) to replace spi->chip_select with
spi_get_chipselect() call in tps6594-spi.c.
- Added a new patch(2/10) to replace spi->chip_select with
spi_get_chipseletc() call in cs35l56_hda_spi.c.
- In spi.c initialized unused CS[] to 0xff and spi->cs_index_mask
to 0x01 in all flows.
- Updated spi_dev_check() to compare the CS of old spi device with
the new spi device CS.
- Updated cover letter description to add information regarding GPIO CS
testing and added Stefen's Tested-by tag in 3/10 patch.
Changes in v10:
- Rebased patch series on top of latest for-next branch and fixed
merge conflicts.
Changes in v9:
- Updated 1/8 patch description to add an high-level overview of
parallel(multi-cs) & stacked design.
- Initialized all unused CS to 0xFF.
- Moved CS check from spi_add_device() to __spi_add_device().
- Updated __spi_add_device() to check to make sure that multiple logical CS
don't map to the same physical CS and same physical CS doesn't map to
different logical CS.
- Updated 1/8, 5/8 & 7/8 to support arbitrary number of flash devices
connected in parallel or stacked mode.
- Updated documentation for chip_select.
- Added a new spi-nor structure member nor->num_flash to keep track of the
number of flashes connected.
- Added a new patch in the series 4/8 to move write_enable call just before
spi_mem ops call in SPI-NOR.
- Added comments in SPI core & SPI-NOR.
- Rebased the patch series on top of the latest for-next branch.
Changes in v8:
- Updated __spi_add_device() and spi_set_cs() to fix spi driver failure
with GPIO CS.
- Rebased the patch series on top of latest for-next branch and fixed
merge conflicts.
- Updated cover letter description to add information regarding GPIO CS
testing and request Stefan to provide his Tested-by tag for 1/7 patch.
- Updated 1/7 patch description.
Changes in v7:
- Updated spi_dev_check() to avoid failures for spi driver GPIO CS and
moved the error message from __spi_add_device() to spi_dev_check().
- Resolved code indentation issue in spi_set_cs().
- In spi_set_cs() call spi_delay_exec( ) once if the controller supports
multi cs with both the CS backed by GPIO.
- Updated __spi_validate()to add checks for both the GPIO CS.
- Replaced cs_index_mask bit mask with SPI_CS_CNT_MAX.
- Updated struct spi_controller to represent multi CS capability of the
spi controller through a flag bit SPI_CONTROLLER_MULTI_CS instead of
a boolen structure member "multi_cs_cap".
- Updated 1/7 patch description .
Changes in v6:
- Rebased on top of latest v6.3-rc1 and fixed merge conflicts in
spi-mpc512x-psc.c, sfdp.c, spansion.c files and removed spi-omap-100k.c.
- Updated spi_dev_check( ) to reject new devices if any one of the
chipselect is used by another device.
Changes in v5:
- Rebased the patches on top of v6.3-rc1 and fixed the merge conflicts.
- Fixed compilation warnings in spi-sh-msiof.c with shmobile_defconfig
Changes in v4:
- Fixed build error in spi-pl022.c file - reported by Mark.
- Fixed build error in spi-sn-f-ospi.c file.
- Added Reviewed-by: Serge Semin <fancer.lancer@gmail.com> tag.
- Added two more patches to replace spi->chip_select with API calls in
mpc832x_rdb.c & cs35l41_hda_spi.c files.
Changes in v3:
- Rebased the patches on top of
https://git.kernel.org/pub/scm/linux/kernel/git/broonie/spi.git for-next
- Added a patch to convert spi_nor_otp_region_len(nor) &
spi_nor_otp_n_regions(nor) macros into inline functions
- Added Reviewed-by & Acked-by tags
Changes in v2:
- Rebased the patches on top of v6.2-rc1
- Created separate patch to add get & set APIs for spi->chip_select &
spi->cs_gpiod, and replaced all spi->chip_select and spi->cs_gpiod
references with the API calls.
- Created separate patch to add get & set APIs for nor->params.
---
Amit Kumar Mahapatra (3):
dt-bindings: mtd: Describe MTD partitions concatenation
mtd: Move struct mtd_concat definition to header file
mtd: Add driver for concatenating devices
.../bindings/mtd/partitions/partition.yaml | 20 ++
drivers/mtd/Kconfig | 9 +
drivers/mtd/Makefile | 1 +
drivers/mtd/mtd_virt_concat.c | 363 +++++++++++++++++++++
drivers/mtd/mtdconcat.c | 12 -
drivers/mtd/mtdcore.c | 19 ++
drivers/mtd/mtdpart.c | 6 +
include/linux/mtd/concat.h | 63 +++-
8 files changed, 480 insertions(+), 13 deletions(-)
---
base-commit: 5a74a464797585e09561e8e367b62c8b4c289ba1
change-id: 20260129-mtd-virt-concat-2763c07115db
Best regards,
--
Luca Ceresoli <luca.ceresoli@bootlin.com>
On Thu, 29 Jan 2026 13:09:26 +0100, Luca Ceresoli wrote:
> [TL;DR for v15: as agreed with Amit I'm sending a new iteration of his
> patches to fix the build-time failure due to a module dependency
> loop. Original cover follows.]
>
> This patch series adds stacked support by enhancing the existing mtd-concat
> driver to be more generic.
>
> [...]
Thank you for finally re-sending the series after fixing the robot
warning, I will not wait for merging it because this needs to finally
get in, and it's been over the mailing list for 8 months with just a
Kconfig symbol to fix, so:
Applied to mtd/next, thanks!
[1/3] dt-bindings: mtd: Describe MTD partitions concatenation
commit: 143555defb058336a223ba434619724b4c6d82b0
[2/3] mtd: Move struct mtd_concat definition to header file
commit: c82100597f3ce5e366f2bc875e9332b7009f5212
[3/3] mtd: Add driver for concatenating devices
commit: 285871f1ff3c251cba288e7dd9e373c04149a509
Patche(s) should be available on mtd/linux.git and will be
part of the next PR (provided that no robot complains by then).
Kind regards,
Miquèl
Hello, On 29/01/2026 at 20:15:32 +01, Miquel Raynal <miquel.raynal@bootlin.com> wrote: > On Thu, 29 Jan 2026 13:09:26 +0100, Luca Ceresoli wrote: >> [TL;DR for v15: as agreed with Amit I'm sending a new iteration of his >> patches to fix the build-time failure due to a module dependency >> loop. Original cover follows.] >> >> This patch series adds stacked support by enhancing the existing mtd-concat >> driver to be more generic. >> >> [...] > > Thank you for finally re-sending the series after fixing the robot > warning, I will not wait for merging it because this needs to finally > get in, and it's been over the mailing list for 8 months with just a > Kconfig symbol to fix, so: Unfortunately, for the third time, this series breaks when robots go over it (see the oe-kbuild-all@lists.linux.dev ML), so I will drop it again :-/ Sorry, Miquèl
Hi Miquèl,
On Fri Jan 30, 2026 at 3:32 PM CET, Miquel Raynal wrote:
> Hello,
>
> On 29/01/2026 at 20:15:32 +01, Miquel Raynal <miquel.raynal@bootlin.com> wrote:
>
>> On Thu, 29 Jan 2026 13:09:26 +0100, Luca Ceresoli wrote:
>>> [TL;DR for v15: as agreed with Amit I'm sending a new iteration of his
>>> patches to fix the build-time failure due to a module dependency
>>> loop. Original cover follows.]
>>>
>>> This patch series adds stacked support by enhancing the existing mtd-concat
>>> driver to be more generic.
>>>
>>> [...]
>>
>> Thank you for finally re-sending the series after fixing the robot
>> warning, I will not wait for merging it because this needs to finally
>> get in, and it's been over the mailing list for 8 months with just a
>> Kconfig symbol to fix, so:
>
> Unfortunately, for the third time, this series breaks when robots go
> over it (see the oe-kbuild-all@lists.linux.dev ML), so I will drop it
> again :-/
Oh, no!
For the records, here are the reports:
https://lore.kernel.org/oe-kbuild-all/202601302048.TyA0Uh81-lkp@intel.com/T/#u
https://lore.kernel.org/oe-kbuild-all/202601302001.mGwPwhGE-lkp@intel.com/T/#u
My bad, I apparently haven't tested with CONFIG_MTD_PARTITIONED_MASTER
disabled on the final code. Sorry about that!
At a quick look I think this is the right fix:
diff --git a/drivers/mtd/mtdcore.c b/drivers/mtd/mtdcore.c
index 3760065c4e08..48de269f4514 100644
--- a/drivers/mtd/mtdcore.c
+++ b/drivers/mtd/mtdcore.c
@@ -2638,8 +2638,10 @@ static int __init init_mtd(void)
static void __exit cleanup_mtd(void)
{
+ if (IS_REACHABLE(CONFIG_MTD_VIRT_CONCAT)) {
mtd_virt_concat_destroy_joins();
mtd_virt_concat_destroy_items();
+ }
debugfs_remove_recursive(dfs_dir_mtd);
cleanup_mtdchar();
if (proc_mtd)
It passes my my quick build tests, but I'll wait until next week to double
check and test on hardware before resending.
Luca
--
Luca Ceresoli, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com
© 2016 - 2026 Red Hat, Inc.