From patchwork Mon Feb 9 22:55:20 2009 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Hartley Sweeten X-Patchwork-Id: 22825 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@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 BE66EDDDB3 for ; Tue, 10 Feb 2009 09:57:44 +1100 (EST) Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.69 #1 (Red Hat Linux)) id 1LWf2Q-0005iY-Aa; Mon, 09 Feb 2009 22:55:38 +0000 Received: from exprod6og105.obsmtp.com ([64.18.1.189]) by bombadil.infradead.org with smtp (Exim 4.69 #1 (Red Hat Linux)) id 1LWf2L-0005iO-Ol for linux-mtd@lists.infradead.org; Mon, 09 Feb 2009 22:55:36 +0000 Received: from source ([63.240.6.3]) (using TLSv1) by exprod6ob105.postini.com ([64.18.5.12]) with SMTP ID DSNKSZC0ZIhZEkkZH5NvtbGq3BQI5XG0OTWs@postini.com; Mon, 09 Feb 2009 14:55:33 PST Received: from d01smtp07.Mi8.com ([172.16.1.114]) by Outbound02.Mi8.com with Microsoft SMTPSVC(6.0.3790.3959); Mon, 9 Feb 2009 17:55:31 -0500 Received: from mi8nycmail19.Mi8.com ([172.16.7.219]) by d01smtp07.Mi8.com with Microsoft SMTPSVC(6.0.3790.3959); Mon, 9 Feb 2009 17:55:31 -0500 X-MimeOLE: Produced By Microsoft Exchange V6.5 Content-class: urn:content-classes:message MIME-Version: 1.0 Subject: RE: [PATCH] mtd: add setup/teardown callbacks to plat_nand Date: Mon, 9 Feb 2009 17:55:20 -0500 Message-ID: In-Reply-To: <8bd0f97a0902091428u5e629485ke7762cbffe8b97dc@mail.gmail.com> X-MS-Has-Attach: X-MS-TNEF-Correlator: Thread-Topic: [PATCH] mtd: add setup/teardown callbacks to plat_nand Thread-Index: AcmLBayKvWspQNSjRSyM389hRE8GuAAAR0pg References: <8bd0f97a0902091428u5e629485ke7762cbffe8b97dc@mail.gmail.com> From: "hartleys" To: "Mike Frysinger" X-OriginalArrivalTime: 09 Feb 2009 22:55:31.0037 (UTC) FILETIME=[821858D0:01C98B09] X-Spam-Score: -4.0 (----) X-Spam-Report: SpamAssassin version 3.2.5 on bombadil.infradead.org summary: Content analysis details: (-4.0 points) pts rule name description ---- ---------------------- -------------------------------------------------- -4.0 RCVD_IN_DNSWL_MED RBL: Sender listed at http://www.dnswl.org/, medium trust [64.18.1.189 listed in list.dnswl.org] Cc: linux-mtd@lists.infradead.org X-BeenThere: linux-mtd@lists.infradead.org X-Mailman-Version: 2.1.9 Precedence: list List-Id: Linux MTD discussion mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: linux-mtd-bounces@lists.infradead.org Errors-To: linux-mtd-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org On Monday, February 09, 2009 3:28 PM, Mike Frysinger wrote: > On Mon, Feb 9, 2009 at 16:37, hartleys wrote: >> Add optional setup and teardown callbacks to the plat_nand driver. >> >> Some platforms may require additional setup, such as configuring >> the memory controller, before the nand device can be accessed. >> This patch provides an optional callback to handle this setup as >> well as a callback to teardown the setup. > > on our platforms, we've been putting the setup into the board init > code. but it would certainly be much saner to have explicit steps > for it in the plat_nand code as you suggest. > > i think having the naming convention follow existing practices > would be better. then we dont have to keep our index of synonyms > around. i.e. change "setup" to "probe" and "teardown" to "remove" > -mike I've seen both naming conventions used in various drivers. I'm not sure which is the best option. The "setup", or "probe", callback doesn't/shouldn't to any actual probing for the nand device, that's handled by the driver. It's only purpose should be to correctly configure the hardware to allow the probe to work. But, here is the patch again with the changes as suggested. I also noticed that a header was missing in linux/mtd/nand.h due to the callbacks. I wasn't sure what various platforms might need so I just coded this to pass the struct platform_device. I guess they could both just be a void parameter. Any suggestions... Thanks, Hartley Signed-off-by: H Hartley Sweeten --- * @dev_ready: platform specific function to read ready/busy pin * @select_chip: platform specific chip select function @@ -589,6 +592,8 @@ struct platform_nand_chip { * All fields are optional and depend on the hardware driver requirements */ struct platform_nand_ctrl { + int (*probe)(struct platform_device *pdev); + void (*remove)(struct platform_device *pdev); void (*hwcontrol)(struct mtd_info *mtd, int cmd); int (*dev_ready)(struct mtd_info *mtd); void (*select_chip)(struct mtd_info *mtd, int chip); diff --git a/drivers/mtd/nand/plat_nand.c b/drivers/mtd/nand/plat_nand.c index 75f9f48..600fbe9 100644 --- a/drivers/mtd/nand/plat_nand.c +++ b/drivers/mtd/nand/plat_nand.c @@ -70,6 +70,13 @@ static int __init plat_nand_probe(struct platform_device *pdev) platform_set_drvdata(pdev, data); + /* Handle any platform specific setup */ + if (pdata->ctrl.probe) { + res = pdata->ctrl.probe(pdev); + if (res) + goto out; + } + /* Scan to find existance of the device */ if (nand_scan(&data->mtd, 1)) { res = -ENXIO; @@ -99,6 +106,8 @@ static int __init plat_nand_probe(struct platform_device *pdev) nand_release(&data->mtd); out: + if (pdata->ctrl.remove) + pdata->ctrl.remove(pdev); platform_set_drvdata(pdev, NULL); iounmap(data->io_base); kfree(data); @@ -111,15 +120,15 @@ out: static int __devexit plat_nand_remove(struct platform_device *pdev) { struct plat_nand_data *data = platform_get_drvdata(pdev); -#ifdef CONFIG_MTD_PARTITIONS struct platform_nand_data *pdata = pdev->dev.platform_data; -#endif nand_release(&data->mtd); #ifdef CONFIG_MTD_PARTITIONS if (data->parts && data->parts != pdata->chip.partitions) kfree(data->parts); #endif + if (pdata->ctrl.remove) + pdata->ctrl.remove(pdev); iounmap(data->io_base); kfree(data); diff --git a/include/linux/mtd/nand.h b/include/linux/mtd/nand.h index db5b63d..8534924 100644 --- a/include/linux/mtd/nand.h +++ b/include/linux/mtd/nand.h @@ -18,6 +18,7 @@ #ifndef __LINUX_MTD_NAND_H #define __LINUX_MTD_NAND_H +#include #include #include #include @@ -579,6 +580,8 @@ struct platform_nand_chip { /** * struct platform_nand_ctrl - controller level device structure + * @probe: platform specific function to probe/setup hardware + * @remove: platform specific function to remove/teardown hardware * @hwcontrol: platform specific hardware control structure