mirror of
https://github.com/AsahiLinux/u-boot
synced 2024-12-26 21:13:48 +00:00
83 lines
2 KiB
C
83 lines
2 KiB
C
|
// SPDX-License-Identifier: GPL-2.0+
|
||
|
/*
|
||
|
* Copyright (c) 2020 Linaro Limited
|
||
|
*/
|
||
|
|
||
|
#include <common.h>
|
||
|
#include <dm.h>
|
||
|
#include <mtd.h>
|
||
|
|
||
|
#include <linux/string.h>
|
||
|
|
||
|
#define MTDPARTS_LEN 256
|
||
|
#define MTDIDS_LEN 128
|
||
|
|
||
|
static void board_get_mtdparts(const char *dev, const char *partition,
|
||
|
char *mtdids, char *mtdparts)
|
||
|
{
|
||
|
/* mtdids: "<dev>=<dev>, ...." */
|
||
|
if (mtdids[0] != '\0')
|
||
|
strcat(mtdids, ",");
|
||
|
strcat(mtdids, dev);
|
||
|
strcat(mtdids, "=");
|
||
|
strcat(mtdids, dev);
|
||
|
|
||
|
/* mtdparts: "mtdparts=<dev>:<mtdparts_<dev>>;..." */
|
||
|
if (mtdparts[0] != '\0')
|
||
|
strncat(mtdparts, ";", MTDPARTS_LEN);
|
||
|
else
|
||
|
strcat(mtdparts, "mtdparts=");
|
||
|
|
||
|
strncat(mtdparts, dev, MTDPARTS_LEN);
|
||
|
strncat(mtdparts, ":", MTDPARTS_LEN);
|
||
|
strncat(mtdparts, partition, MTDPARTS_LEN);
|
||
|
}
|
||
|
|
||
|
void board_mtdparts_default(const char **mtdids, const char **mtdparts)
|
||
|
{
|
||
|
struct mtd_info *mtd;
|
||
|
struct udevice *dev;
|
||
|
const char *mtd_partition;
|
||
|
static char parts[3 * MTDPARTS_LEN + 1];
|
||
|
static char ids[MTDIDS_LEN + 1];
|
||
|
static bool mtd_initialized;
|
||
|
|
||
|
if (mtd_initialized) {
|
||
|
*mtdids = ids;
|
||
|
*mtdparts = parts;
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
memset(parts, 0, sizeof(parts));
|
||
|
memset(ids, 0, sizeof(ids));
|
||
|
|
||
|
/* Currently mtdparts is needed on Qemu ARM64 for capsule updates */
|
||
|
if (IS_ENABLED(CONFIG_EFI_CAPSULE_FIRMWARE_MANAGEMENT) &&
|
||
|
IS_ENABLED(CONFIG_TARGET_QEMU_ARM_64BIT)) {
|
||
|
/* probe all MTD devices */
|
||
|
for (uclass_first_device(UCLASS_MTD, &dev); dev;
|
||
|
uclass_next_device(&dev)) {
|
||
|
debug("mtd device = %s\n", dev->name);
|
||
|
}
|
||
|
|
||
|
mtd = get_mtd_device_nm("nor0");
|
||
|
if (!IS_ERR_OR_NULL(mtd)) {
|
||
|
mtd_partition = CONFIG_MTDPARTS_NOR0;
|
||
|
board_get_mtdparts("nor0", mtd_partition, ids, parts);
|
||
|
put_mtd_device(mtd);
|
||
|
}
|
||
|
|
||
|
mtd = get_mtd_device_nm("nor1");
|
||
|
if (!IS_ERR_OR_NULL(mtd)) {
|
||
|
mtd_partition = CONFIG_MTDPARTS_NOR1;
|
||
|
board_get_mtdparts("nor1", mtd_partition, ids, parts);
|
||
|
put_mtd_device(mtd);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
mtd_initialized = true;
|
||
|
*mtdids = ids;
|
||
|
*mtdparts = parts;
|
||
|
debug("%s:mtdids=%s & mtdparts=%s\n", __func__, ids, parts);
|
||
|
}
|