--- a/drivers/mtd/ar7part.c
+++ b/drivers/mtd/ar7part.c
@@ -29,11 +29,14 @@
 #include <linux/magic.h>
 #include <linux/module.h>
 
+#include <asm/mach-ar7/prom.h>
+
 #define AR7_PARTS	4
 #define ROOT_OFFSET	0xe0000
 
 #define LOADER_MAGIC1	le32_to_cpu(0xfeedfa42)
 #define LOADER_MAGIC2	le32_to_cpu(0xfeed1281)
+#define LOADER_MAGIC3	le32_to_cpu(0x434d4d4c)
 
 #ifndef SQUASHFS_MAGIC
 #define SQUASHFS_MAGIC	0x73717368
@@ -45,6 +48,10 @@ struct ar7_bin_rec {
 	unsigned int address;
 };
 
+int create_titan_partitions(struct mtd_info *master,
+        struct mtd_partition **pparts,
+        struct mtd_part_parser_data *data);
+
 static int create_mtd_partitions(struct mtd_info *master,
 				 struct mtd_partition **pparts,
 				 struct mtd_part_parser_data *data)
@@ -58,6 +65,16 @@ static int create_mtd_partitions(struct
 	int retries = 10;
 	struct mtd_partition *ar7_parts;
 
+	const char *prod_id ;
+	prod_id = prom_getenv("ProductID");
+	if(prod_id &&
+		(strcmp(prod_id, "CYWL")==0 ||
+		strcmp(prod_id, "CYWM")==0 ||
+		strcmp(prod_id, "CYLM")==0 ||
+		strcmp(prod_id, "CYLL")==0)){
+		return create_titan_partitions(master, pparts, data);
+	}
+
 	ar7_parts = kzalloc(sizeof(*ar7_parts) * AR7_PARTS, GFP_KERNEL);
 	if (!ar7_parts)
 		return -ENOMEM;
--- a/drivers/mtd/titanpart.c
+++ b/drivers/mtd/titanpart.c
@@ -149,7 +149,7 @@ static void titan_add_partition(char * e
 }
 int create_titan_partitions(struct mtd_info *master,
 	struct mtd_partition **pparts,
-	unsigned long origin)
+	struct mtd_part_parser_data *data)
 {
 	struct nsp_img_hdr_head		hdr;
 	struct nsp_img_hdr_section_info	sect_info;
