diff options
Diffstat (limited to 'target/linux/adm5120/patches-3.3/a13-adm5120_flash-3.3-fixes.patch')
-rw-r--r-- | target/linux/adm5120/patches-3.3/a13-adm5120_flash-3.3-fixes.patch | 166 |
1 files changed, 166 insertions, 0 deletions
diff --git a/target/linux/adm5120/patches-3.3/a13-adm5120_flash-3.3-fixes.patch b/target/linux/adm5120/patches-3.3/a13-adm5120_flash-3.3-fixes.patch new file mode 100644 index 0000000000..ea2e19f2ca --- /dev/null +++ b/target/linux/adm5120/patches-3.3/a13-adm5120_flash-3.3-fixes.patch @@ -0,0 +1,166 @@ +--- a/drivers/mtd/maps/adm5120-flash.c ++++ b/drivers/mtd/maps/adm5120-flash.c +@@ -54,10 +54,6 @@ struct adm5120_flash_info { + struct resource *res; + struct platform_device *dev; + struct adm5120_map_info amap; +-#ifdef CONFIG_MTD_PARTITIONS +- int nr_parts; +- struct mtd_partition *parts[MAX_PARSED_PARTS]; +-#endif + }; + + struct flash_desc { +@@ -96,7 +92,6 @@ static const char const *probe_types[] = + NULL + }; + +-#ifdef CONFIG_MTD_PARTITIONS + static const char const *parse_types[] = { + "cmdlinepart", + #ifdef CONFIG_MTD_REDBOOT_PARTS +@@ -106,7 +101,6 @@ static const char const *parse_types[] = + "MyLoader", + #endif + }; +-#endif + + #define BANK_SIZE (2<<20) + #define BANK_SIZE_MAX (4<<20) +@@ -318,89 +312,6 @@ static void adm5120_flash_initbanks(stru + info->mtd->size = info->amap.window_size; + } + +-#ifdef CONFIG_MTD_PARTITIONS +-static int adm5120_flash_initparts(struct adm5120_flash_info *info) +-{ +- struct adm5120_flash_platform_data *pdata; +- struct map_info *map = &info->amap.map; +- int num_parsers; +- const char *parser[2]; +- int err = 0; +- int nr_parts; +- int i; +- +- info->nr_parts = 0; +- +- pdata = info->dev->dev.platform_data; +- if (pdata == NULL) +- goto out; +- +- if (pdata->nr_parts) { +- MAP_INFO(map, "adding static partitions\n"); +- err = add_mtd_partitions(info->mtd, pdata->parts, +- pdata->nr_parts); +- if (err == 0) { +- info->nr_parts += pdata->nr_parts; +- goto out; +- } +- } +- +- num_parsers = ARRAY_SIZE(parse_types); +- if (num_parsers > MAX_PARSED_PARTS) +- num_parsers = MAX_PARSED_PARTS; +- +- parser[1] = NULL; +- for (i = 0; i < num_parsers; i++) { +- parser[0] = parse_types[i]; +- +- MAP_INFO(map, "parsing \"%s\" partitions\n", +- parser[0]); +- nr_parts = parse_mtd_partitions(info->mtd, parser, +- &info->parts[i], 0); +- +- if (nr_parts <= 0) +- continue; +- +- MAP_INFO(map, "adding \"%s\" partitions\n", +- parser[0]); +- +- err = add_mtd_partitions(info->mtd, info->parts[i], nr_parts); +- if (err) +- break; +- +- info->nr_parts += nr_parts; +- } +-out: +- return err; +-} +-#else +-static int adm5120_flash_initparts(struct adm5120_flash_info *info) +-{ +- return 0; +-} +-#endif /* CONFIG_MTD_PARTITIONS */ +- +-#ifdef CONFIG_MTD_PARTITIONS +-static void adm5120_flash_remove_mtd(struct adm5120_flash_info *info) +-{ +- int i; +- +- if (info->nr_parts) { +- del_mtd_partitions(info->mtd); +- for (i = 0; i < MAX_PARSED_PARTS; i++) +- if (info->parts[i] != NULL) +- kfree(info->parts[i]); +- } else { +- del_mtd_device(info->mtd); +- } +-} +-#else +-static void adm5120_flash_remove_mtd(struct adm5120_flash_info *info) +-{ +- del_mtd_device(info->mtd); +-} +-#endif +- + static int adm5120_flash_remove(struct platform_device *dev) + { + struct adm5120_flash_info *info; +@@ -412,7 +323,7 @@ static int adm5120_flash_remove(struct p + platform_set_drvdata(dev, NULL); + + if (info->mtd != NULL) { +- adm5120_flash_remove_mtd(info); ++ mtd_device_unregister(info->mtd); + map_destroy(info->mtd); + } + +@@ -429,11 +340,18 @@ static int adm5120_flash_remove(struct p + + static int adm5120_flash_probe(struct platform_device *dev) + { ++ struct adm5120_flash_platform_data *pdata; + struct adm5120_flash_info *info; + struct map_info *map; + const char **probe_type; + int err; + ++ pdata = dev->dev.platform_data; ++ if (!pdata) { ++ dev_err(&dev->dev, "no platform data\n"); ++ return -EINVAL; ++ } ++ + info = kzalloc(sizeof(*info), GFP_KERNEL); + if (info == NULL) { + err = -ENOMEM; +@@ -484,16 +402,11 @@ static int adm5120_flash_probe(struct pl + + info->mtd->owner = THIS_MODULE; + +- err = adm5120_flash_initparts(info); ++ err = mtd_device_parse_register(info->mtd, parse_types, 0, ++ pdata->parts, pdata->nr_parts); + if (err) + goto err_out; + +- if (info->nr_parts == 0) { +- MAP_INFO(map, "no partitions available, registering " +- "whole flash\n"); +- add_mtd_device(info->mtd); +- } +- + return 0; + + err_out: |