On Tuesday 09 February 2021 15:44:48 Marek Behún wrote:
> Add support for parsing partitions defined in device-trees via the
> `partitions` node with `fixed-partitions` compatible.
>
> The `mtdparts`/`mtdids` mechanism takes precedence. If some partitions
> are defined for a MTD device via this mechanism, the code won't register
> partitions for that MTD device from OF, even if they are defined.
>
> Signed-off-by: Marek Behún
> Cc: Simon Glass
> Cc: Heiko Schocher
> Cc: Jagan Teki
> ---
> drivers/mtd/mtd_uboot.c | 106 +++-
> drivers/mtd/mtdpart.c | 60 +++
> include/linux/mtd/mtd.h | 9
> 3 files changed, 131 insertions(+), 44 deletions(-)
>
> diff --git a/drivers/mtd/mtd_uboot.c b/drivers/mtd/mtd_uboot.c
> index 9360d4ed17..7fb72eb1f4 100644
> --- a/drivers/mtd/mtd_uboot.c
> +++ b/drivers/mtd/mtd_uboot.c
> @@ -197,53 +197,11 @@ static void mtd_del_all_parts(void)
> } while (ret > 0);
> }
>
> -int mtd_probe_devices(void)
> +static int parse_mtdparts(const char *mtdparts, const char *mtdids)
> {
> - static char *old_mtdparts;
> - static char *old_mtdids;
> - const char *mtdparts = get_mtdparts();
> - const char *mtdids = get_mtdids();
> - const char *mtdparts_next = mtdparts;
> + const char *mtdparts_next;
> struct mtd_info *mtd;
>
> - mtd_probe_uclass_mtd_devs();
> -
> - /*
> - * Check if mtdparts/mtdids changed, if the MTD dev list was updated
> - * or if our previous attempt to delete existing partititions failed.
> - * In any of these cases we want to update the partitions, otherwise,
> - * everything is up-to-date and we can return 0 directly.
> - */
> - if ((!mtdparts && !old_mtdparts && !mtdids && !old_mtdids) ||
> - (mtdparts && old_mtdparts && mtdids && old_mtdids &&
> - !mtd_dev_list_updated() && !mtd_del_all_parts_failed &&
> - !strcmp(mtdparts, old_mtdparts) &&
> - !strcmp(mtdids, old_mtdids)))
> - return 0;
> -
> - /* Update the local copy of mtdparts */
> - free(old_mtdparts);
> - free(old_mtdids);
> - old_mtdparts = strdup(mtdparts);
> - old_mtdids = strdup(mtdids);
> -
> - /*
> - * Remove all old parts. Note that partition removal can fail in case
> - * one of the partition is still being used by an MTD user, so this
> - * does not guarantee that all old partitions are gone.
> - */
> - mtd_del_all_parts();
> -
> - /*
> - * Call mtd_dev_list_updated() to clear updates generated by our own
> - * parts removal loop.
> - */
> - mtd_dev_list_updated();
> -
> - /* If either mtdparts or mtdids is empty, then exit */
> - if (!mtdparts || !mtdids)
> - return 0;
> -
> /* Start the parsing by ignoring the extra 'mtdparts=' prefix, if any */
> if (!strncmp(mtdparts, "mtdparts=", sizeof("mtdparts=") - 1))
> mtdparts += 9;
> @@ -342,6 +300,66 @@ int mtd_probe_devices(void)
> put_mtd_device(mtd);
> }
>
> + return 0;
> +}
> +
> +int mtd_probe_devices(void)
> +{
> + static char *old_mtdparts;
> + static char *old_mtdids;
> + const char *mtdparts = get_mtdparts();
> + const char *mtdids = get_mtdids();
> + struct mtd_info *mtd;
> +
> + mtd_probe_uclass_mtd_devs();
> +
> + /*
> + * Check if mtdparts/mtdids changed, if the MTD dev list was updated
> + * or if our previous attempt to delete existing partititions failed.
> + * In any of these cases we want to update the partitions, otherwise,
> + * everything is up-to-date and we can return 0 directly.
> + */
> + if ((!mtdparts && !old_mtdparts && !mtdids && !old_mtdids) ||
> + (mtdparts && old_mtdparts && mtdids && old_mtdids &&
> + !mtd_dev_list_updated() && !mtd_del_all_parts_failed &&
> + !strcmp(mtdparts, old_mtdparts) &&
> + !strcmp(mtdids, old_mtdids)))
> + return 0;
> +
> + /* Update the local copy of mtdparts */
> + free(old_mtdparts);
> + free(old_mtdids);
> + old_mtdparts = strdup(mtdparts);
> + old_mtdids = strdup(mtdids);
> +
> + /*
> + * Remove all old parts. Note that partition removal can fail in case
> + * one of the partition is still being used by an MTD user, so this
> + * does not guarantee that all old partitions are gone.
> + */
> + mtd_del_all_parts();
> +
> + /*
> + * Call mtd_dev_list_updated() to clear updates generated by our own
> + * parts removal loop.
> + */
> + mtd_dev_list_updated();
> +
> + /* If both mtdparts and mtdids are non-empty, parse */
> + if (mtdparts && mtdids) {
> + if (parse_mtdparts(mtdparts, mtdids) < 0)
> + printf("Failed parsing MTD partitions from
> mtdparts!\n");
> + }
> +
> + /* Fallback to OF partitions */
> + mtd_for_each_device(mtd) {
> +