X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=drivers%2Fmtd%2Fmtd_uboot.c;h=14ce726b10d8d2b41ab958cb6274ae139978cc49;hb=HEAD;hp=0a41ed477c1db4e0f09a16f8ea7234f754a3505a;hpb=54869e0811b341f95458c509fd565e3c4bab6a01;p=platform%2Fkernel%2Fu-boot.git diff --git a/drivers/mtd/mtd_uboot.c b/drivers/mtd/mtd_uboot.c index 0a41ed4..14ce726 100644 --- a/drivers/mtd/mtd_uboot.c +++ b/drivers/mtd/mtd_uboot.c @@ -4,11 +4,16 @@ * Heiko Schocher, DENX Software Engineering, hs@denx.de. */ #include +#include +#include +#include #include #include -#include /* LEGACY */ +#include +#include #include #include +#include #include #define MTD_NAME_MAX_LEN 20 @@ -25,8 +30,6 @@ static const char *get_mtdids(void) #if defined(CONFIG_SYS_MTDPARTS_RUNTIME) board_mtdparts_default(&mtdids, &mtdparts); -#elif defined(MTDIDS_DEFAULT) - mtdids = MTDIDS_DEFAULT; #elif defined(CONFIG_MTDIDS_DEFAULT) mtdids = CONFIG_MTDIDS_DEFAULT; #endif @@ -49,7 +52,7 @@ static const char *get_mtdids(void) * @altname: Alternate name to return * @max_len: Length of the alternate name buffer * - * @return 0 on success, an error otherwise. + * Return: 0 on success, an error otherwise. */ int mtd_search_alternate_name(const char *mtdname, char *altname, unsigned int max_len) @@ -98,22 +101,30 @@ int mtd_search_alternate_name(const char *mtdname, char *altname, return -EINVAL; } -#if IS_ENABLED(CONFIG_MTD) +#if IS_ENABLED(CONFIG_DM_MTD) static void mtd_probe_uclass_mtd_devs(void) { struct udevice *dev; - int idx = 0; - /* Probe devices with DM compliant drivers */ - while (!uclass_find_device(UCLASS_MTD, idx, &dev) && dev) { - mtd_probe(dev); - idx++; - } + uclass_foreach_dev_probe(UCLASS_MTD, dev) + ; } #else static void mtd_probe_uclass_mtd_devs(void) { } #endif +#if IS_ENABLED(CONFIG_DM_SPI_FLASH) && IS_ENABLED(CONFIG_SPI_FLASH_MTD) +static void mtd_probe_uclass_spi_nor_devs(void) +{ + struct udevice *dev; + + uclass_foreach_dev_probe(UCLASS_SPI_FLASH, dev) + ; +} +#else +static void mtd_probe_uclass_spi_nor_devs(void) { } +#endif + #if defined(CONFIG_MTD_PARTITIONS) #define MTDPARTS_MAXLEN 512 @@ -134,8 +145,6 @@ static const char *get_mtdparts(void) #if defined(CONFIG_SYS_MTDPARTS_RUNTIME) board_mtdparts_default(&mtdids, &mtdparts); -#elif defined(MTDPARTS_DEFAULT) - mtdparts = MTDPARTS_DEFAULT; #elif defined(CONFIG_MTDPARTS_DEFAULT) mtdparts = CONFIG_MTDPARTS_DEFAULT; #endif @@ -194,53 +203,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; @@ -339,112 +306,81 @@ int mtd_probe_devices(void) put_mtd_device(mtd); } - /* - * Call mtd_dev_list_updated() to clear updates generated by our own - * parts registration loop. - */ - mtd_dev_list_updated(); - return 0; } -#else + int mtd_probe_devices(void) { - mtd_probe_uclass_mtd_devs(); + static char *old_mtdparts; + static char *old_mtdids; + const char *mtdparts = get_mtdparts(); + const char *mtdids = get_mtdids(); + struct mtd_info *mtd; - return 0; -} -#endif /* defined(CONFIG_MTD_PARTITIONS) */ + mtd_probe_uclass_mtd_devs(); + mtd_probe_uclass_spi_nor_devs(); -/* Legacy */ + /* + * 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; -static int get_part(const char *partname, int *idx, loff_t *off, loff_t *size, - loff_t *maxsize, int devtype) -{ -#ifdef CONFIG_CMD_MTDPARTS - struct mtd_device *dev; - struct part_info *part; - u8 pnum; - int ret; + /* Update the local copy of mtdparts */ + free(old_mtdparts); + free(old_mtdids); + old_mtdparts = strdup(mtdparts); + old_mtdids = strdup(mtdids); - ret = mtdparts_init(); - if (ret) - return ret; + /* + * 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(); - ret = find_dev_and_part(partname, &dev, &pnum, &part); - if (ret) - return ret; + /* + * Call mtd_dev_list_updated() to clear updates generated by our own + * parts removal loop. + */ + mtd_dev_list_updated(); - if (dev->id->type != devtype) { - printf("not same typ %d != %d\n", dev->id->type, devtype); - return -1; + /* 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"); } - *off = part->offset; - *size = part->size; - *maxsize = part->size; - *idx = dev->id->num; - - return 0; -#else - puts("mtdparts support missing.\n"); - return -1; -#endif -} - -int mtd_arg_off(const char *arg, int *idx, loff_t *off, loff_t *size, - loff_t *maxsize, int devtype, uint64_t chipsize) -{ - if (!str2off(arg, off)) - return get_part(arg, idx, off, size, maxsize, devtype); - - if (*off >= chipsize) { - puts("Offset exceeds device limit\n"); - return -1; + /* Fallback to OF partitions */ + mtd_for_each_device(mtd) { + if (list_empty(&mtd->partitions)) { + if (add_mtd_partitions_of(mtd) < 0) + printf("Failed parsing MTD %s OF partitions!\n", + mtd->name); + } } - *maxsize = chipsize - *off; - *size = *maxsize; + /* + * Call mtd_dev_list_updated() to clear updates generated by our own + * parts registration loop. + */ + mtd_dev_list_updated(); + return 0; } - -int mtd_arg_off_size(int argc, char *const argv[], int *idx, loff_t *off, - loff_t *size, loff_t *maxsize, int devtype, - uint64_t chipsize) +#else +int mtd_probe_devices(void) { - int ret; - - if (argc == 0) { - *off = 0; - *size = chipsize; - *maxsize = *size; - goto print; - } - - ret = mtd_arg_off(argv[0], idx, off, size, maxsize, devtype, - chipsize); - if (ret) - return ret; - - if (argc == 1) - goto print; - - if (!str2off(argv[1], size)) { - printf("'%s' is not a number\n", argv[1]); - return -1; - } - - if (*size > *maxsize) { - puts("Size exceeds partition or device limit\n"); - return -1; - } + mtd_probe_uclass_mtd_devs(); + mtd_probe_uclass_spi_nor_devs(); -print: - printf("device %d ", *idx); - if (*size == chipsize) - puts("whole chip\n"); - else - printf("offset 0x%llx, size 0x%llx\n", - (unsigned long long)*off, (unsigned long long)*size); return 0; } +#endif /* defined(CONFIG_MTD_PARTITIONS) */