mtd->type = MTD_NORFLASH;
--- a/drivers/mtd/mtdcore.c
+++ b/drivers/mtd/mtdcore.c
-@@ -843,6 +843,17 @@ out_error:
+@@ -848,6 +848,17 @@ out_error:
*/
static void mtd_set_dev_defaults(struct mtd_info *mtd)
{
--- /dev/null
+From 26422ac78e9d8767bd4aabfbae616b15edbf6a1b Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
+Date: Sat, 22 Oct 2022 23:13:18 +0200
+Subject: [PATCH] mtd: core: set ROOT_DEV for partitions marked as rootfs in DT
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+This adds support for "linux,rootfs" binding that is used to mark flash
+partition containing rootfs. It's useful for devices using device tree
+that don't have bootloader passing root info in cmdline.
+
+Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
+Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
+Link: https://lore.kernel.org/linux-mtd/20221022211318.32009-2-zajec5@gmail.com
+---
+ drivers/mtd/mtdcore.c | 12 ++++++++++++
+ 1 file changed, 12 insertions(+)
+
+--- a/drivers/mtd/mtdcore.c
++++ b/drivers/mtd/mtdcore.c
+@@ -28,6 +28,7 @@
+ #include <linux/leds.h>
+ #include <linux/debugfs.h>
+ #include <linux/nvmem-provider.h>
++#include <linux/root_dev.h>
+
+ #include <linux/mtd/mtd.h>
+ #include <linux/mtd/partitions.h>
+@@ -743,6 +744,17 @@ int add_mtd_device(struct mtd_info *mtd)
+ not->add(mtd);
+
+ mutex_unlock(&mtd_table_mutex);
++
++ if (of_find_property(mtd_get_of_node(mtd), "linux,rootfs", NULL)) {
++ if (IS_BUILTIN(CONFIG_MTD)) {
++ pr_info("mtd: setting mtd%d (%s) as root device\n", mtd->index, mtd->name);
++ ROOT_DEV = MKDEV(MTD_BLOCK_MAJOR, mtd->index);
++ } else {
++ pr_warn("mtd: can't set mtd%d (%s) as root device - mtd must be builtin\n",
++ mtd->index, mtd->name);
++ }
++ }
++
+ /* We _know_ we aren't being removed, because
+ our caller is still holding us here. So none
+ of this try_ nonsense, and no bitching about it
unsigned long flags;
--- a/drivers/mtd/mtdcore.c
+++ b/drivers/mtd/mtdcore.c
-@@ -31,6 +31,7 @@
+@@ -32,6 +32,7 @@
#include <linux/mtd/mtd.h>
#include <linux/mtd/partitions.h>
#include "mtdcore.h"
-@@ -916,6 +917,8 @@ int mtd_device_parse_register(struct mtd
+@@ -928,6 +929,8 @@ int mtd_device_parse_register(struct mtd
register_reboot_notifier(&mtd->reboot_notifier);
}
+++ /dev/null
-From: Gabor Juhos <juhosg@openwrt.org>
-Subject: kernel/3.1[02]: move MTD root device setup code to mtdcore
-
-The current code only allows to automatically set
-root device on MTD partitions. Move the code to MTD
-core to allow to use it with all MTD devices.
-
-Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
----
- drivers/mtd/mtdcore.c | 10 ++++++++++
- 1 file changed, 10 insertions(+)
-
---- a/drivers/mtd/mtdcore.c
-+++ b/drivers/mtd/mtdcore.c
-@@ -27,6 +27,7 @@
- #include <linux/reboot.h>
- #include <linux/leds.h>
- #include <linux/debugfs.h>
-+#include <linux/root_dev.h>
- #include <linux/nvmem-provider.h>
-
- #include <linux/mtd/mtd.h>
-@@ -759,6 +760,16 @@ int add_mtd_device(struct mtd_info *mtd)
- of this try_ nonsense, and no bitching about it
- either. :) */
- __module_get(THIS_MODULE);
-+
-+ if (!strcmp(mtd->name, "rootfs") &&
-+ IS_ENABLED(CONFIG_MTD_ROOTFS_ROOT_DEV) &&
-+ ROOT_DEV == 0) {
-+ unsigned int index = mtd->index;
-+ pr_notice("mtd: device %d (%s) set to be root filesystem\n",
-+ mtd->index, mtd->name);
-+ ROOT_DEV = MKDEV(MTD_BLOCK_MAJOR, index);
-+ }
-+
- return 0;
-
- fail_nvmem_add:
--- /dev/null
+From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
+Date: Mon, 7 Nov 2022 23:48:24 +0100
+Subject: [PATCH] mtd: support OpenWrt's MTD_ROOTFS_ROOT_DEV
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+This allows setting ROOT_DEV to MTD partition named "rootfs".
+
+Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
+---
+
+--- a/drivers/mtd/mtdcore.c
++++ b/drivers/mtd/mtdcore.c
+@@ -756,7 +756,8 @@ int add_mtd_device(struct mtd_info *mtd)
+
+ mutex_unlock(&mtd_table_mutex);
+
+- if (of_find_property(mtd_get_of_node(mtd), "linux,rootfs", NULL)) {
++ if (of_find_property(mtd_get_of_node(mtd), "linux,rootfs", NULL) ||
++ (IS_ENABLED(CONFIG_MTD_ROOTFS_ROOT_DEV) && !strcmp(mtd->name, "rootfs") && ROOT_DEV == 0)) {
+ if (IS_BUILTIN(CONFIG_MTD)) {
+ pr_info("mtd: setting mtd%d (%s) as root device\n", mtd->index, mtd->name);
+ ROOT_DEV = MKDEV(MTD_BLOCK_MAJOR, mtd->index);
--- a/drivers/mtd/mtdcore.c
+++ b/drivers/mtd/mtdcore.c
-@@ -767,6 +767,9 @@ int add_mtd_device(struct mtd_info *mtd)
- unsigned int index = mtd->index;
- pr_notice("mtd: device %d (%s) set to be root filesystem\n",
- mtd->index, mtd->name);
+@@ -758,12 +758,18 @@ int add_mtd_device(struct mtd_info *mtd)
+
+ if (of_find_property(mtd_get_of_node(mtd), "linux,rootfs", NULL) ||
+ (IS_ENABLED(CONFIG_MTD_ROOTFS_ROOT_DEV) && !strcmp(mtd->name, "rootfs") && ROOT_DEV == 0)) {
++ unsigned int index = mtd->index;
++
+#ifdef CONFIG_FIT_PARTITION
+ index <<= 2;
+#endif
- ROOT_DEV = MKDEV(MTD_BLOCK_MAJOR, index);
++
+ if (IS_BUILTIN(CONFIG_MTD)) {
+- pr_info("mtd: setting mtd%d (%s) as root device\n", mtd->index, mtd->name);
+- ROOT_DEV = MKDEV(MTD_BLOCK_MAJOR, mtd->index);
++ pr_info("mtd: setting mtd%d (%s) as root device\n", index, mtd->name);
++ ROOT_DEV = MKDEV(MTD_BLOCK_MAJOR, index);
+ } else {
+ pr_warn("mtd: can't set mtd%d (%s) as root device - mtd must be builtin\n",
+- mtd->index, mtd->name);
++ index, mtd->name);
+ }
}
--- a/drivers/mtd/mtdcore.c
+++ b/drivers/mtd/mtdcore.c
-@@ -163,6 +163,15 @@ static ssize_t mtd_erasesize_show(struct
+@@ -164,6 +164,15 @@ static ssize_t mtd_erasesize_show(struct
}
static DEVICE_ATTR(erasesize, S_IRUGO, mtd_erasesize_show, NULL);
static ssize_t mtd_writesize_show(struct device *dev,
struct device_attribute *attr, char *buf)
{
-@@ -312,6 +321,7 @@ static struct attribute *mtd_attrs[] = {
+@@ -313,6 +322,7 @@ static struct attribute *mtd_attrs[] = {
&dev_attr_flags.attr,
&dev_attr_size.attr,
&dev_attr_erasesize.attr,
--- a/drivers/mtd/mtdcore.c
+++ b/drivers/mtd/mtdcore.c
-@@ -1139,6 +1139,44 @@ out_unlock:
+@@ -1151,6 +1151,44 @@ out_unlock:
}
EXPORT_SYMBOL_GPL(get_mtd_device_nm);
mtd->type = MTD_NORFLASH;
--- a/drivers/mtd/mtdcore.c
+++ b/drivers/mtd/mtdcore.c
-@@ -843,6 +843,17 @@ out_error:
+@@ -848,6 +848,17 @@ out_error:
*/
static void mtd_set_dev_defaults(struct mtd_info *mtd)
{