402-mtd-use-typed-mtd-parsers-for-rootfs-and-firmware-split.patch 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. --- a/drivers/mtd/mtdpart.c
  2. +++ b/drivers/mtd/mtdpart.c
  3. @@ -649,6 +649,36 @@ int mtd_del_partition(struct mtd_info *m
  4. }
  5. EXPORT_SYMBOL_GPL(mtd_del_partition);
  6. +static int
  7. +run_parsers_by_type(struct mtd_part *slave, enum mtd_parser_type type)
  8. +{
  9. + struct mtd_partition *parts;
  10. + int nr_parts;
  11. + int i;
  12. +
  13. + nr_parts = parse_mtd_partitions_by_type(&slave->mtd, type, &parts,
  14. + NULL);
  15. + if (nr_parts <= 0)
  16. + return nr_parts;
  17. +
  18. + if (WARN_ON(!parts))
  19. + return 0;
  20. +
  21. + for (i = 0; i < nr_parts; i++) {
  22. + /* adjust partition offsets */
  23. + parts[i].offset += slave->offset;
  24. +
  25. + mtd_add_partition(slave->master,
  26. + parts[i].name,
  27. + parts[i].offset,
  28. + parts[i].size);
  29. + }
  30. +
  31. + kfree(parts);
  32. +
  33. + return nr_parts;
  34. +}
  35. +
  36. #ifdef CONFIG_MTD_SPLIT_FIRMWARE_NAME
  37. #define SPLIT_FIRMWARE_NAME CONFIG_MTD_SPLIT_FIRMWARE_NAME
  38. #else
  39. @@ -657,6 +687,7 @@ EXPORT_SYMBOL_GPL(mtd_del_partition);
  40. static void split_firmware(struct mtd_info *master, struct mtd_part *part)
  41. {
  42. + run_parsers_by_type(part, MTD_PARSER_TYPE_FIRMWARE);
  43. }
  44. void __weak arch_split_mtd_part(struct mtd_info *master, const char *name,
  45. @@ -671,6 +702,12 @@ static void mtd_partition_split(struct m
  46. if (rootfs_found)
  47. return;
  48. + if (!strcmp(part->mtd.name, "rootfs")) {
  49. + run_parsers_by_type(part, MTD_PARSER_TYPE_ROOTFS);
  50. +
  51. + rootfs_found = 1;
  52. + }
  53. +
  54. if (!strcmp(part->mtd.name, SPLIT_FIRMWARE_NAME) &&
  55. config_enabled(CONFIG_MTD_SPLIT_FIRMWARE))
  56. split_firmware(master, part);
  57. --- a/include/linux/mtd/partitions.h
  58. +++ b/include/linux/mtd/partitions.h
  59. @@ -70,6 +70,8 @@ struct mtd_part_parser_data {
  60. enum mtd_parser_type {
  61. MTD_PARSER_TYPE_DEVICE = 0,
  62. + MTD_PARSER_TYPE_ROOTFS,
  63. + MTD_PARSER_TYPE_FIRMWARE,
  64. };
  65. struct mtd_part_parser {