Merge ../linux-2.6-watchdog-mm
[pandora-kernel.git] / drivers / mtd / cmdlinepart.c
index ef24837..23fab14 100644 (file)
@@ -1,24 +1,24 @@
 /*
- * $Id: cmdlinepart.c,v 1.18 2005/06/07 15:04:26 joern Exp $
+ * $Id: cmdlinepart.c,v 1.19 2005/11/07 11:14:19 gleixner Exp $
  *
  * Read flash partition table from command line
  *
  * Copyright 2002 SYSGO Real-Time Solutions GmbH
  *
  * The format for the command line is as follows:
- * 
+ *
  * mtdparts=<mtddef>[;<mtddef]
  * <mtddef>  := <mtd-id>:<partdef>[,<partdef>]
  * <partdef> := <size>[@offset][<name>][ro]
  * <mtd-id>  := unique name used in mapping driver/device (mtd->name)
  * <size>    := standard linux memsize OR "-" to denote all remaining space
  * <name>    := '(' NAME ')'
- * 
+ *
  * Examples:
- * 
+ *
  * 1 NOR Flash, with 1 single writable partition:
  * edb7312-nor:-
- * 
+ *
  * 1 NOR Flash with 2 partitions, 1 NAND with one
  * edb7312-nor:256k(ARMboot)ro,-(root);edb7312-nand:-(home)
  */
@@ -42,7 +42,8 @@
 
 
 /* special size referring to all the remaining space in a partition */
-#define SIZE_REMAINING 0xffffffff
+#define SIZE_REMAINING UINT_MAX
+#define OFFSET_CONTINUOUS UINT_MAX
 
 struct cmdline_mtd_partition {
        struct cmdline_mtd_partition *next;
@@ -60,22 +61,22 @@ static int cmdline_parsed = 0;
 
 /*
  * Parse one partition definition for an MTD. Since there can be many
- * comma separated partition definitions, this function calls itself 
+ * comma separated partition definitions, this function calls itself
  * recursively until no more partition definitions are found. Nice side
  * effect: the memory to keep the mtd_partition structs and the names
  * is allocated upon the last definition being found. At that point the
  * syntax has been verified ok.
  */
-static struct mtd_partition * newpart(char *s, 
+static struct mtd_partition * newpart(char *s,
                                       char **retptr,
                                       int *num_parts,
-                                      int this_part, 
-                                      unsigned char **extra_mem_ptr, 
+                                      int this_part,
+                                      unsigned char **extra_mem_ptr,
                                       int extra_mem_size)
 {
        struct mtd_partition *parts;
        unsigned long size;
-       unsigned long offset = 0;
+       unsigned long offset = OFFSET_CONTINUOUS;
        char *name;
        int name_len;
        unsigned char *extra_mem;
@@ -102,7 +103,7 @@ static struct mtd_partition * newpart(char *s,
        mask_flags = 0; /* this is going to be a regular partition */
        delim = 0;
         /* check for offset */
-        if (*s == '@') 
+        if (*s == '@')
        {
                 s++;
                 offset = memparse(s, &s);
@@ -112,7 +113,7 @@ static struct mtd_partition * newpart(char *s,
        {
                delim = ')';
        }
-               
+
        if (delim)
        {
                char *p;
@@ -131,12 +132,12 @@ static struct mtd_partition * newpart(char *s,
                name = NULL;
                name_len = 13; /* Partition_000 */
        }
-   
+
        /* record name length for memory allocation later */
        extra_mem_size += name_len + 1;
 
         /* test for options */
-        if (strncmp(s, "ro", 2) == 0) 
+        if (strncmp(s, "ro", 2) == 0)
        {
                mask_flags |= MTD_WRITEABLE;
                s += 2;
@@ -151,7 +152,7 @@ static struct mtd_partition * newpart(char *s,
                        return NULL;
                }
                /* more partitions follow, parse them */
-               if ((parts = newpart(s + 1, &s, num_parts, 
+               if ((parts = newpart(s + 1, &s, num_parts,
                                     this_part + 1, &extra_mem, extra_mem_size)) == 0)
                  return NULL;
        }
@@ -162,13 +163,12 @@ static struct mtd_partition * newpart(char *s,
                *num_parts = this_part + 1;
                alloc_size = *num_parts * sizeof(struct mtd_partition) +
                             extra_mem_size;
-               parts = kmalloc(alloc_size, GFP_KERNEL);
+               parts = kzalloc(alloc_size, GFP_KERNEL);
                if (!parts)
                {
                        printk(KERN_ERR ERRP "out of memory\n");
                        return NULL;
                }
-               memset(parts, 0, alloc_size);
                extra_mem = (unsigned char *)(parts + *num_parts);
        }
        /* enter this partition (offset will be calculated later if it is zero at this point) */
@@ -187,7 +187,7 @@ static struct mtd_partition * newpart(char *s,
        extra_mem += name_len + 1;
 
        dbg(("partition %d: name <%s>, offset %x, size %x, mask flags %x\n",
-            this_part, 
+            this_part,
             parts[this_part].name,
             parts[this_part].offset,
             parts[this_part].size,
@@ -204,8 +204,8 @@ static struct mtd_partition * newpart(char *s,
        return parts;
 }
 
-/* 
- * Parse the command line. 
+/*
+ * Parse the command line.
  */
 static int mtdpart_setup_real(char *s)
 {
@@ -230,7 +230,7 @@ static int mtdpart_setup_real(char *s)
 
                dbg(("parsing <%s>\n", p+1));
 
-               /* 
+               /*
                 * parse one mtd. have it reserve memory for the
                 * struct cmdline_mtd_partition and the mtd-id string.
                 */
@@ -239,7 +239,7 @@ static int mtdpart_setup_real(char *s)
                                &num_parts,     /* out: number of parts */
                                0,              /* first partition */
                                (unsigned char**)&this_mtd, /* out: extra mem */
-                               mtd_id_len + 1 + sizeof(*this_mtd) + 
+                               mtd_id_len + 1 + sizeof(*this_mtd) +
                                sizeof(void*)-1 /*alignment*/);
                if(!parts)
                {
@@ -254,21 +254,21 @@ static int mtdpart_setup_real(char *s)
                 }
 
                /* align this_mtd */
-               this_mtd = (struct cmdline_mtd_partition *) 
+               this_mtd = (struct cmdline_mtd_partition *)
                        ALIGN((unsigned long)this_mtd, sizeof(void*));
-               /* enter results */         
+               /* enter results */
                this_mtd->parts = parts;
                this_mtd->num_parts = num_parts;
                this_mtd->mtd_id = (char*)(this_mtd + 1);
                strlcpy(this_mtd->mtd_id, mtd_id, mtd_id_len + 1);
 
                /* link into chain */
-               this_mtd->next = partitions;            
+               this_mtd->next = partitions;
                partitions = this_mtd;
 
-               dbg(("mtdid=<%s> num_parts=<%d>\n", 
+               dbg(("mtdid=<%s> num_parts=<%d>\n",
                     this_mtd->mtd_id, this_mtd->num_parts));
-               
+
 
                /* EOS - we're done */
                if (*s == 0)
@@ -292,7 +292,7 @@ static int mtdpart_setup_real(char *s)
  * information. It returns partitions for the requested mtd device, or
  * the first one in the chain if a NULL mtd_id is passed in.
  */
-static int parse_cmdline_partitions(struct mtd_info *master, 
+static int parse_cmdline_partitions(struct mtd_info *master,
                              struct mtd_partition **pparts,
                              unsigned long origin)
 {
@@ -314,7 +314,7 @@ static int parse_cmdline_partitions(struct mtd_info *master,
                {
                        for(i = 0, offset = 0; i < part->num_parts; i++)
                        {
-                               if (!part->parts[i].offset)
+                               if (part->parts[i].offset == OFFSET_CONTINUOUS)
                                  part->parts[i].offset = offset;
                                else
                                  offset = part->parts[i].offset;
@@ -322,7 +322,7 @@ static int parse_cmdline_partitions(struct mtd_info *master,
                                  part->parts[i].size = master->size - offset;
                                if (offset + part->parts[i].size > master->size)
                                {
-                                       printk(KERN_WARNING ERRP 
+                                       printk(KERN_WARNING ERRP
                                               "%s: partitioning exceeds flash size, truncating\n",
                                               part->mtd_id);
                                        part->parts[i].size = master->size - offset;
@@ -338,14 +338,14 @@ static int parse_cmdline_partitions(struct mtd_info *master,
 }
 
 
-/* 
- * This is the handler for our kernel parameter, called from 
+/*
+ * This is the handler for our kernel parameter, called from
  * main.c::checksetup(). Note that we can not yet kmalloc() anything,
  * so we only save the commandline for later processing.
  *
  * This function needs to be visible for bootloaders.
  */
-int mtdpart_setup(char *s)
+static int mtdpart_setup(char *s)
 {
        cmdline = s;
        return 1;