summaryrefslogtreecommitdiff
path: root/target/linux/adm5120/patches-3.3/a13-adm5120_flash-3.3-fixes.patch
diff options
context:
space:
mode:
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.patch166
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: