mirror of
https://github.com/openwrt/openwrt.git
synced 2025-01-20 03:36:29 +00:00
kernel: mtd: backport extended dynamic partitions support
This gets rid of "nvmem-cells" limitation. Dynamic partitions can be
defined for any (sub)partitions layout.
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
(cherry picked from commit 4eda414b09
)
This commit is contained in:
parent
00d7702796
commit
18c77387c5
@ -34,7 +34,7 @@ Signed-off-by: Abhimanyu Vishwakarma <Abhimanyu.Vishwakarma@imgtec.com>
|
|||||||
mtd->type = MTD_NORFLASH;
|
mtd->type = MTD_NORFLASH;
|
||||||
--- a/drivers/mtd/mtdcore.c
|
--- a/drivers/mtd/mtdcore.c
|
||||||
+++ b/drivers/mtd/mtdcore.c
|
+++ b/drivers/mtd/mtdcore.c
|
||||||
@@ -851,6 +851,17 @@ out_error:
|
@@ -843,6 +843,17 @@ out_error:
|
||||||
*/
|
*/
|
||||||
static void mtd_set_dev_defaults(struct mtd_info *mtd)
|
static void mtd_set_dev_defaults(struct mtd_info *mtd)
|
||||||
{
|
{
|
||||||
|
@ -0,0 +1,65 @@
|
|||||||
|
From 63db0cb35e1cb3b3c134906d1062f65513fdda2d Mon Sep 17 00:00:00 2001
|
||||||
|
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
|
||||||
|
Date: Tue, 4 Oct 2022 10:37:09 +0200
|
||||||
|
Subject: [PATCH] mtd: core: simplify (a bit) code find partition-matching
|
||||||
|
dynamic OF node
|
||||||
|
MIME-Version: 1.0
|
||||||
|
Content-Type: text/plain; charset=UTF-8
|
||||||
|
Content-Transfer-Encoding: 8bit
|
||||||
|
|
||||||
|
1. Don't hardcode "partition-" string twice
|
||||||
|
2. Use simpler logic & use ->name to avoid of_property_read_string()
|
||||||
|
3. Use mtd_get_of_node() helper
|
||||||
|
|
||||||
|
Cc: Christian Marangi <ansuelsmth@gmail.com>
|
||||||
|
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/20221004083710.27704-1-zajec5@gmail.com
|
||||||
|
---
|
||||||
|
drivers/mtd/mtdcore.c | 16 +++++++---------
|
||||||
|
1 file changed, 7 insertions(+), 9 deletions(-)
|
||||||
|
|
||||||
|
--- a/drivers/mtd/mtdcore.c
|
||||||
|
+++ b/drivers/mtd/mtdcore.c
|
||||||
|
@@ -566,18 +566,16 @@ static void mtd_check_of_node(struct mtd
|
||||||
|
struct device_node *partitions, *parent_dn, *mtd_dn = NULL;
|
||||||
|
const char *pname, *prefix = "partition-";
|
||||||
|
int plen, mtd_name_len, offset, prefix_len;
|
||||||
|
- struct mtd_info *parent;
|
||||||
|
bool found = false;
|
||||||
|
|
||||||
|
/* Check if MTD already has a device node */
|
||||||
|
- if (dev_of_node(&mtd->dev))
|
||||||
|
+ if (mtd_get_of_node(mtd))
|
||||||
|
return;
|
||||||
|
|
||||||
|
/* Check if a partitions node exist */
|
||||||
|
if (!mtd_is_partition(mtd))
|
||||||
|
return;
|
||||||
|
- parent = mtd->parent;
|
||||||
|
- parent_dn = of_node_get(dev_of_node(&parent->dev));
|
||||||
|
+ parent_dn = of_node_get(mtd_get_of_node(mtd->parent));
|
||||||
|
if (!parent_dn)
|
||||||
|
return;
|
||||||
|
|
||||||
|
@@ -590,15 +588,15 @@ static void mtd_check_of_node(struct mtd
|
||||||
|
|
||||||
|
/* Search if a partition is defined with the same name */
|
||||||
|
for_each_child_of_node(partitions, mtd_dn) {
|
||||||
|
- offset = 0;
|
||||||
|
-
|
||||||
|
/* Skip partition with no/wrong prefix */
|
||||||
|
- if (!of_node_name_prefix(mtd_dn, "partition-"))
|
||||||
|
+ if (!of_node_name_prefix(mtd_dn, prefix))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
/* Label have priority. Check that first */
|
||||||
|
- if (of_property_read_string(mtd_dn, "label", &pname)) {
|
||||||
|
- of_property_read_string(mtd_dn, "name", &pname);
|
||||||
|
+ if (!of_property_read_string(mtd_dn, "label", &pname)) {
|
||||||
|
+ offset = 0;
|
||||||
|
+ } else {
|
||||||
|
+ pname = mtd_dn->name;
|
||||||
|
offset = prefix_len;
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,84 @@
|
|||||||
|
From ddb8cefb7af288950447ca6eeeafb09977dab56f Mon Sep 17 00:00:00 2001
|
||||||
|
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
|
||||||
|
Date: Tue, 4 Oct 2022 10:37:10 +0200
|
||||||
|
Subject: [PATCH] mtd: core: try to find OF node for every MTD partition
|
||||||
|
MIME-Version: 1.0
|
||||||
|
Content-Type: text/plain; charset=UTF-8
|
||||||
|
Content-Transfer-Encoding: 8bit
|
||||||
|
|
||||||
|
So far this feature was limited to the top-level "nvmem-cells" node.
|
||||||
|
There are multiple parsers creating partitions and subpartitions
|
||||||
|
dynamically. Extend that code to handle them too.
|
||||||
|
|
||||||
|
This allows finding partition-* node for every MTD (sub)partition.
|
||||||
|
|
||||||
|
Random example:
|
||||||
|
|
||||||
|
partitions {
|
||||||
|
compatible = "brcm,bcm947xx-cfe-partitions";
|
||||||
|
|
||||||
|
partition-firmware {
|
||||||
|
compatible = "brcm,trx";
|
||||||
|
|
||||||
|
partition-loader {
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
Cc: Christian Marangi <ansuelsmth@gmail.com>
|
||||||
|
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/20221004083710.27704-2-zajec5@gmail.com
|
||||||
|
---
|
||||||
|
drivers/mtd/mtdcore.c | 18 ++++++------------
|
||||||
|
1 file changed, 6 insertions(+), 12 deletions(-)
|
||||||
|
|
||||||
|
--- a/drivers/mtd/mtdcore.c
|
||||||
|
+++ b/drivers/mtd/mtdcore.c
|
||||||
|
@@ -566,20 +566,22 @@ static void mtd_check_of_node(struct mtd
|
||||||
|
struct device_node *partitions, *parent_dn, *mtd_dn = NULL;
|
||||||
|
const char *pname, *prefix = "partition-";
|
||||||
|
int plen, mtd_name_len, offset, prefix_len;
|
||||||
|
- bool found = false;
|
||||||
|
|
||||||
|
/* Check if MTD already has a device node */
|
||||||
|
if (mtd_get_of_node(mtd))
|
||||||
|
return;
|
||||||
|
|
||||||
|
- /* Check if a partitions node exist */
|
||||||
|
if (!mtd_is_partition(mtd))
|
||||||
|
return;
|
||||||
|
+
|
||||||
|
parent_dn = of_node_get(mtd_get_of_node(mtd->parent));
|
||||||
|
if (!parent_dn)
|
||||||
|
return;
|
||||||
|
|
||||||
|
- partitions = of_get_child_by_name(parent_dn, "partitions");
|
||||||
|
+ if (mtd_is_partition(mtd->parent))
|
||||||
|
+ partitions = of_node_get(parent_dn);
|
||||||
|
+ else
|
||||||
|
+ partitions = of_get_child_by_name(parent_dn, "partitions");
|
||||||
|
if (!partitions)
|
||||||
|
goto exit_parent;
|
||||||
|
|
||||||
|
@@ -603,19 +605,11 @@ static void mtd_check_of_node(struct mtd
|
||||||
|
plen = strlen(pname) - offset;
|
||||||
|
if (plen == mtd_name_len &&
|
||||||
|
!strncmp(mtd->name, pname + offset, plen)) {
|
||||||
|
- found = true;
|
||||||
|
+ mtd_set_of_node(mtd, mtd_dn);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
- if (!found)
|
||||||
|
- goto exit_partitions;
|
||||||
|
-
|
||||||
|
- /* Set of_node only for nvmem */
|
||||||
|
- if (of_device_is_compatible(mtd_dn, "nvmem-cells"))
|
||||||
|
- mtd_set_of_node(mtd, mtd_dn);
|
||||||
|
-
|
||||||
|
-exit_partitions:
|
||||||
|
of_node_put(partitions);
|
||||||
|
exit_parent:
|
||||||
|
of_node_put(parent_dn);
|
@ -77,7 +77,7 @@ Signed-off-by: Daniel Golle <daniel@makrotopia.org>
|
|||||||
|
|
||||||
#include "mtdcore.h"
|
#include "mtdcore.h"
|
||||||
|
|
||||||
@@ -924,6 +925,8 @@ int mtd_device_parse_register(struct mtd
|
@@ -916,6 +917,8 @@ int mtd_device_parse_register(struct mtd
|
||||||
register_reboot_notifier(&mtd->reboot_notifier);
|
register_reboot_notifier(&mtd->reboot_notifier);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -20,7 +20,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
|
|||||||
#include <linux/nvmem-provider.h>
|
#include <linux/nvmem-provider.h>
|
||||||
|
|
||||||
#include <linux/mtd/mtd.h>
|
#include <linux/mtd/mtd.h>
|
||||||
@@ -767,6 +768,19 @@ int add_mtd_device(struct mtd_info *mtd)
|
@@ -759,6 +760,19 @@ int add_mtd_device(struct mtd_info *mtd)
|
||||||
of this try_ nonsense, and no bitching about it
|
of this try_ nonsense, and no bitching about it
|
||||||
either. :) */
|
either. :) */
|
||||||
__module_get(THIS_MODULE);
|
__module_get(THIS_MODULE);
|
||||||
|
@ -17,7 +17,7 @@ Reviewed-by: Miquel Raynal <miquel.raynal@bootlin.com>
|
|||||||
|
|
||||||
--- a/drivers/mtd/mtdcore.c
|
--- a/drivers/mtd/mtdcore.c
|
||||||
+++ b/drivers/mtd/mtdcore.c
|
+++ b/drivers/mtd/mtdcore.c
|
||||||
@@ -1147,6 +1147,44 @@ out_unlock:
|
@@ -1139,6 +1139,44 @@ out_unlock:
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(get_mtd_device_nm);
|
EXPORT_SYMBOL_GPL(get_mtd_device_nm);
|
||||||
|
|
||||||
|
@ -34,7 +34,7 @@ Signed-off-by: Abhimanyu Vishwakarma <Abhimanyu.Vishwakarma@imgtec.com>
|
|||||||
mtd->type = MTD_NORFLASH;
|
mtd->type = MTD_NORFLASH;
|
||||||
--- a/drivers/mtd/mtdcore.c
|
--- a/drivers/mtd/mtdcore.c
|
||||||
+++ b/drivers/mtd/mtdcore.c
|
+++ b/drivers/mtd/mtdcore.c
|
||||||
@@ -851,6 +851,17 @@ out_error:
|
@@ -843,6 +843,17 @@ out_error:
|
||||||
*/
|
*/
|
||||||
static void mtd_set_dev_defaults(struct mtd_info *mtd)
|
static void mtd_set_dev_defaults(struct mtd_info *mtd)
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user