From patchwork Tue Nov 10 08:22:35 2009 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mika Korhonen X-Patchwork-Id: 38043 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id DFEA6B7088 for ; Tue, 10 Nov 2009 19:26:41 +1100 (EST) Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.69 #1 (Red Hat Linux)) id 1N7m25-0004KQ-0d; Tue, 10 Nov 2009 08:24:57 +0000 Received: from smtp.nokia.com ([192.100.122.233] helo=mgw-mx06.nokia.com) by bombadil.infradead.org with esmtps (Exim 4.69 #1 (Red Hat Linux)) id 1N7m1x-0004J2-Pt for linux-mtd@lists.infradead.org; Tue, 10 Nov 2009 08:24:54 +0000 Received: from esebh106.NOE.Nokia.com (esebh106.ntc.nokia.com [172.21.138.213]) by mgw-mx06.nokia.com (Switch-3.3.3/Switch-3.3.3) with ESMTP id nAA8OeBJ019288; Tue, 10 Nov 2009 10:24:46 +0200 Received: from esebh102.NOE.Nokia.com ([172.21.138.183]) by esebh106.NOE.Nokia.com with Microsoft SMTPSVC(6.0.3790.3959); Tue, 10 Nov 2009 10:24:31 +0200 Received: from mgw-da02.ext.nokia.com ([147.243.128.26]) by esebh102.NOE.Nokia.com over TLS secured channel with Microsoft SMTPSVC(6.0.3790.3959); Tue, 10 Nov 2009 10:24:30 +0200 Received: from localhost.localdomain (ouped11842.nmp.nokia.com [172.23.118.42]) by mgw-da02.ext.nokia.com (Switch-3.3.3/Switch-3.3.3) with ESMTP id nAA8OODj009623; Tue, 10 Nov 2009 10:24:26 +0200 From: Mika Korhonen To: linux-mtd@lists.infradead.org Subject: [PATCH v2 1/1] MTD OneNAND OMAP2/3: allow giving partition layout as module parameter Date: Tue, 10 Nov 2009 10:22:35 +0200 Message-Id: <1257841355-5773-2-git-send-email-ext-mika.2.korhonen@nokia.com> X-Mailer: git-send-email 1.6.0.4 In-Reply-To: <1257841355-5773-1-git-send-email-ext-mika.2.korhonen@nokia.com> References: <1257841355-5773-1-git-send-email-ext-mika.2.korhonen@nokia.com> X-OriginalArrivalTime: 10 Nov 2009 08:24:30.0386 (UTC) FILETIME=[39815920:01CA61DF] X-Nokia-AV: Clean X-CRM114-Version: 20090807-BlameThorstenAndJenny ( TRE 0.7.6 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20091110_032450_343532_B79326B9 X-CRM114-Status: GOOD ( 28.00 ) X-Spam-Score: -3.6 (---) X-Spam-Report: SpamAssassin version 3.2.5 on bombadil.infradead.org summary: Content analysis details: (-3.6 points) pts rule name description ---- ---------------------- -------------------------------------------------- -4.0 RCVD_IN_DNSWL_MED RBL: Sender listed at http://www.dnswl.org/, medium trust [192.100.122.233 listed in list.dnswl.org] 0.4 SUBJECT_FUZZY_TION Attempt to obfuscate words in Subject: Cc: Mika Korhonen , adrian.hunter@nokia.com, vimal.newwork@gmail.com, dedekind1@gmail.com X-BeenThere: linux-mtd@lists.infradead.org X-Mailman-Version: 2.1.12 Precedence: list List-Id: Linux MTD discussion mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Sender: linux-mtd-bounces@lists.infradead.org Errors-To: linux-mtd-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org Add module parameter "parts" to omap2-onenand driver. Parameter format is the same as for cmdlinepart except mtd-id must not be specified - it gets prepended by the driver, i.e.: parts=[,]* This allows one to repartition the OneNAND chip and is useful for flashing applications that do the partitioning from scratch or want to backup and update the partitioning. Signed-off-by: Mika Korhonen --- drivers/mtd/Kconfig | 15 ++++++--------- drivers/mtd/cmdlinepart.c | 34 ++++++++++++++++++++++++++++------ drivers/mtd/onenand/Kconfig | 2 ++ drivers/mtd/onenand/omap2.c | 32 +++++++++++++++++++++++++------- include/linux/mtd/partitions.h | 1 + 5 files changed, 62 insertions(+), 22 deletions(-) diff --git a/drivers/mtd/Kconfig b/drivers/mtd/Kconfig index e4ec365..bf92153 100644 --- a/drivers/mtd/Kconfig +++ b/drivers/mtd/Kconfig @@ -112,23 +112,20 @@ config MTD_CMDLINE_PARTS different kinds of flash memory are available. You will still need the parsing functions to be called by the driver - for your particular device. It won't happen automatically. The - SA1100 map driver (CONFIG_MTD_SA1100) has an option for this, for - example. + for your particular device. It won't happen automatically. The SA1100 + map driver (CONFIG_MTD_SA1100) has an option for this, for example. The format for the command line is as follows: - mtdparts=[;[;] := :[,] := [@offset][][ro] := unique id used in mapping driver/device - := standard linux memsize OR "-" to denote all - remaining space + := standard linux memsize OR "-" for all remaining space := (NAME) - Due to the way Linux handles the command line, no spaces are - allowed in the partition definition, including mtd id's and partition - names. + Due to the way Linux handles the command line, no spaces are allowed + in the partition definition, including mtd id's and partition names. Examples: diff --git a/drivers/mtd/cmdlinepart.c b/drivers/mtd/cmdlinepart.c index 1479da6..ea4ddd5 100644 --- a/drivers/mtd/cmdlinepart.c +++ b/drivers/mtd/cmdlinepart.c @@ -5,7 +5,7 @@ * * The format for the command line is as follows: * - * mtdparts=[;[;] * := :[,] * where is the name from the "cat /proc/mtd" command * := [@offset][][ro][lk] @@ -54,7 +54,7 @@ struct cmdline_mtd_partition { /* mtdpart_setup() parses into here */ static struct cmdline_mtd_partition *partitions; -/* the command line passed to mtdpart_setupd() */ +/* the command line passed to mtdpart_setup() */ static char *cmdline; static int cmdline_parsed = 0; @@ -219,9 +219,8 @@ static int mtdpart_setup_real(char *s) { cmdline_parsed = 1; - for( ; s != NULL; ) - { - struct cmdline_mtd_partition *this_mtd; + for ( ; s != NULL; ) { + struct cmdline_mtd_partition *this_mtd, *mtd, *mtd_prev; struct mtd_partition *parts; int mtd_id_len; int num_parts; @@ -270,6 +269,27 @@ static int mtdpart_setup_real(char *s) this_mtd->mtd_id = (char*)(this_mtd + 1); strlcpy(this_mtd->mtd_id, mtd_id, mtd_id_len + 1); + /* remove existing ones with the same id */ + mtd_prev = NULL; + for (mtd = partitions; mtd;) { + if (strcmp(this_mtd->mtd_id, mtd->mtd_id) == 0) { + printk(KERN_INFO "old entry for mtd id %s " + "exists, removing\n", mtd->mtd_id); + if (mtd_prev) { + mtd_prev->next = mtd->next; + kfree(mtd); + mtd = mtd_prev->next; + } else { + partitions = mtd->next; + kfree(mtd); + mtd = partitions; + } + } else { + mtd_prev = mtd; + mtd = mtd->next; + } + } + /* link into chain */ this_mtd->next = partitions; partitions = this_mtd; @@ -354,11 +374,13 @@ static int parse_cmdline_partitions(struct mtd_info *master, * * This function needs to be visible for bootloaders. */ -static int mtdpart_setup(char *s) +int mtdpart_setup(char *s) { cmdline = s; + cmdline_parsed = 0; return 1; } +EXPORT_SYMBOL(mtdpart_setup); __setup("mtdparts=", mtdpart_setup); diff --git a/drivers/mtd/onenand/Kconfig b/drivers/mtd/onenand/Kconfig index a38f580..402958c 100644 --- a/drivers/mtd/onenand/Kconfig +++ b/drivers/mtd/onenand/Kconfig @@ -30,6 +30,8 @@ config MTD_ONENAND_GENERIC config MTD_ONENAND_OMAP2 tristate "OneNAND on OMAP2/OMAP3 support" depends on MTD_ONENAND && (ARCH_OMAP2 || ARCH_OMAP3) + select MTD_PARTITIONS + select MTD_CMDLINE_PARTS help Support for a OneNAND flash device connected to an OMAP2/OMAP3 CPU via the GPMC memory controller. diff --git a/drivers/mtd/onenand/omap2.c b/drivers/mtd/onenand/omap2.c index 0108ed4..27c986e 100644 --- a/drivers/mtd/onenand/omap2.c +++ b/drivers/mtd/onenand/omap2.c @@ -64,6 +64,14 @@ struct omap2_onenand { int (*setup)(void __iomem *base, int freq); }; + +static const char *part_probes[] = { "cmdlinepart", NULL }; +static char parts[256] = DRIVER_NAME ":"; + +module_param_string(parts, parts + sizeof(DRIVER_NAME), + 256 - sizeof(DRIVER_NAME), 0); + + static void omap2_onenand_dma_cb(int lch, u16 ch_status, void *data) { struct omap2_onenand *c = data; @@ -708,13 +716,27 @@ static int __devinit omap2_onenand_probe(struct platform_device *pdev) break; } -#ifdef CONFIG_MTD_PARTITIONS - if (pdata->parts != NULL) + printk(KERN_INFO "parts=%s\n", parts); + /* check module parameter */ + if (parts[sizeof(DRIVER_NAME)] != '\0') { + /* check parts string */ + if (strchr(parts, ';') || + strchr(parts + sizeof(DRIVER_NAME), ':')) + printk(KERN_ERR "%s: invalid partition parameter\n", + __func__); + else + mtdpart_setup(parts); + } + r = parse_mtd_partitions(&c->mtd, part_probes, &c->parts, 0); + if (r > 0) + /* module param or kernel command line arg */ + r = add_mtd_partitions(&c->mtd, c->parts, r); + else if (pdata->parts != NULL) r = add_mtd_partitions(&c->mtd, pdata->parts, pdata->nr_parts); else -#endif r = add_mtd_device(&c->mtd); + if (r < 0) goto err_release_onenand; @@ -750,14 +772,10 @@ static int __devexit omap2_onenand_remove(struct platform_device *pdev) BUG_ON(c == NULL); -#ifdef CONFIG_MTD_PARTITIONS if (c->parts) del_mtd_partitions(&c->mtd); else del_mtd_device(&c->mtd); -#else - del_mtd_device(&c->mtd); -#endif onenand_release(&c->mtd); if (c->dma_channel != -1) diff --git a/include/linux/mtd/partitions.h b/include/linux/mtd/partitions.h index 274b619..038ee25 100644 --- a/include/linux/mtd/partitions.h +++ b/include/linux/mtd/partitions.h @@ -84,6 +84,7 @@ static inline int mtd_has_partitions(void) { return 0; } #endif #ifdef CONFIG_MTD_CMDLINE_PARTS +extern int mtdpart_setup(char *); static inline int mtd_has_cmdlinepart(void) { return 1; } #else static inline int mtd_has_cmdlinepart(void) { return 0; }