mirror of
https://xff.cz/git/u-boot/
synced 2025-09-01 16:52:14 +02:00
mtd: mtdpart: implement proper partition handling
Instead of collecting partitions in a flat list, create a hierarchy within the mtd_info structure: use a partitions list to keep track of the partitions of an MTD device (which might be itself a partition of another MTD device), a pointer to the parent device (NULL when the MTD device is the root one, not a partition). By also saving directly in mtd_info the offset of the partition, we can get rid of the mtd_part structure. Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com> Reviewed-by: Stefan Roese <sr@denx.de> Reviewed-by: Boris Brezillon <boris.brezillon@bootlin.com>
This commit is contained in:
committed by
Jagan Teki
parent
ff4afa8a98
commit
2a74930da5
@@ -20,6 +20,7 @@
|
||||
#include <linux/compat.h>
|
||||
#include <mtd/mtd-abi.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/list.h>
|
||||
#include <div64.h>
|
||||
#if IS_ENABLED(CONFIG_DM)
|
||||
#include <dm/device.h>
|
||||
@@ -307,6 +308,27 @@ struct mtd_info {
|
||||
struct udevice *dev;
|
||||
#endif
|
||||
int usecount;
|
||||
|
||||
/* MTD devices do not have any parent. MTD partitions do. */
|
||||
struct mtd_info *parent;
|
||||
|
||||
/*
|
||||
* Offset of the partition relatively to the parent offset.
|
||||
* Is 0 for real MTD devices (ie. not partitions).
|
||||
*/
|
||||
u64 offset;
|
||||
|
||||
/*
|
||||
* List node used to add an MTD partition to the parent
|
||||
* partition list.
|
||||
*/
|
||||
struct list_head node;
|
||||
|
||||
/*
|
||||
* List of partitions attached to this MTD device (the parent
|
||||
* MTD device can itself be a partition).
|
||||
*/
|
||||
struct list_head partitions;
|
||||
};
|
||||
|
||||
#if IS_ENABLED(CONFIG_DM)
|
||||
@@ -334,6 +356,16 @@ static inline const struct device_node *mtd_get_of_node(struct mtd_info *mtd)
|
||||
}
|
||||
#endif
|
||||
|
||||
static inline bool mtd_is_partition(const struct mtd_info *mtd)
|
||||
{
|
||||
return mtd->parent;
|
||||
}
|
||||
|
||||
static inline bool mtd_has_partitions(const struct mtd_info *mtd)
|
||||
{
|
||||
return !list_empty(&mtd->partitions);
|
||||
}
|
||||
|
||||
int mtd_ooblayout_ecc(struct mtd_info *mtd, int section,
|
||||
struct mtd_oob_region *oobecc);
|
||||
int mtd_ooblayout_find_eccregion(struct mtd_info *mtd, int eccbyte,
|
||||
|
@@ -81,7 +81,6 @@ extern void register_mtd_parser(struct mtd_part_parser *parser);
|
||||
extern void deregister_mtd_parser(struct mtd_part_parser *parser);
|
||||
#endif
|
||||
|
||||
int mtd_is_partition(const struct mtd_info *mtd);
|
||||
int mtd_add_partition(struct mtd_info *master, const char *name,
|
||||
long long offset, long long length);
|
||||
int mtd_del_partition(struct mtd_info *master, int partno);
|
||||
|
Reference in New Issue
Block a user