From patchwork Tue Mar 21 10:03:54 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Thomas Petazzoni X-Patchwork-Id: 741474 X-Patchwork-Delegate: boris.brezillon@free-electrons.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from bombadil.infradead.org (bombadil.infradead.org [65.50.211.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3vnT2r2P26z9s2x for ; Tue, 21 Mar 2017 21:05:24 +1100 (AEDT) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="NfzmkuJ6"; dkim-atps=neutral DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20170209; h=Sender: Content-Transfer-Encoding:Content-Type:MIME-Version:Cc:List-Subscribe: List-Help:List-Post:List-Archive:List-Unsubscribe:List-Id:References: In-Reply-To:Message-Id:Date:Subject:To:From:Reply-To:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:List-Owner; bh=AImIDVqEH5Oan/jY0c1Dhq89jC+7toTkEKTBpdkVye4=; b=NfzmkuJ6GQxrhVxGaD69/P+sGR O8iw6bhNJYbQERSAcWYgYVwvcKZAqDP/dCuSa1ICSAMuZX54KAMeDomsZ0PMVh8x2ZZE0koxzJDo0 615GnlmpqS8Tbzzv3xv7Qein9azx5v0ej8lMw+taXajQ6suJmc7DzVglV39doTRjRkNVumXQI5YA/ k1FWL/Or3OIhDKkmghZp7wSNB5gQBfjoVL9ZpC9P9c2zlDfkEKdBtkNG5O1RZwTPSLFvUXVEWJc29 F3Lu1Al5h9iUBlnf270UBbxg+ZB10W8SSlSmNcIu7FdkpTkuWr4tKSjhzRzpLuasPqLlu+QtsJ2W2 +5+2iYHg==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.87 #1 (Red Hat Linux)) id 1cqGfG-00026v-6b; Tue, 21 Mar 2017 10:05:18 +0000 Received: from mail.free-electrons.com ([62.4.15.54]) by bombadil.infradead.org with esmtp (Exim 4.87 #1 (Red Hat Linux)) id 1cqGej-0000NR-Ry for linux-mtd@lists.infradead.org; Tue, 21 Mar 2017 10:04:49 +0000 Received: by mail.free-electrons.com (Postfix, from userid 110) id B4BE3207FC; Tue, 21 Mar 2017 11:04:23 +0100 (CET) X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on mail.free-electrons.com X-Spam-Level: X-Spam-Status: No, score=-1.0 required=5.0 tests=ALL_TRUSTED,SHORTCIRCUIT, URIBL_BLOCKED shortcircuit=ham autolearn=disabled version=3.4.0 Received: from localhost (LStLambert-657-1-97-87.w90-63.abo.wanadoo.fr [90.63.216.87]) by mail.free-electrons.com (Postfix) with ESMTPSA id 8A238207ED; Tue, 21 Mar 2017 11:04:23 +0100 (CET) From: Thomas Petazzoni To: Boris Brezillon , Richard Weinberger , David Woodhouse , Brian Norris , Marek Vasut , Cyrille Pitchen Subject: [PATCH 02/13] mtd: nand: fsmc: rework fsmc_nand_setup() to use ->setup_data_interface() Date: Tue, 21 Mar 2017 11:03:54 +0100 Message-Id: <1490090645-8576-3-git-send-email-thomas.petazzoni@free-electrons.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1490090645-8576-1-git-send-email-thomas.petazzoni@free-electrons.com> References: <1490090645-8576-1-git-send-email-thomas.petazzoni@free-electrons.com> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20170321_030446_233945_4E995B33 X-CRM114-Status: GOOD ( 17.56 ) X-Spam-Score: -1.9 (-) X-Spam-Report: SpamAssassin version 3.4.1 on bombadil.infradead.org summary: Content analysis details: (-1.9 points) pts rule name description ---- ---------------------- -------------------------------------------------- -0.0 SPF_PASS SPF: sender matches SPF record -0.0 RP_MATCHES_RCVD Envelope sender domain matches handover relay domain -1.9 BAYES_00 BODY: Bayes spam probability is 0 to 1% [score: 0.0000] X-BeenThere: linux-mtd@lists.infradead.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: Linux MTD discussion mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Thomas Petazzoni , Linus Walleij , Stefan Roese , linux-mtd@lists.infradead.org MIME-Version: 1.0 Sender: "linux-mtd" Errors-To: linux-mtd-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org Since a few kernel versions, the NAND subsystem has introduced a callback called ->setup_data_interface(), which NAND controller drivers are supposed to use to perform all the NAND data interface. This commit therefore converts the fsmc_nand driver to use this callback instead of the home-grown fsmc_nand_setup() function. For now, the NAND timings are not used, and we simply use the timings provided from the Device Tree, or otherwise the default timings. Support for the NAND timings is added in a follow-up patch. The call to fsmc_nand_setup() in the ->resume() hook is simply replaced by a call to nand_reset(), which internally will call the ->setup_data_interface() callback. Signed-off-by: Thomas Petazzoni Acked-by: Linus Walleij --- drivers/mtd/nand/fsmc_nand.c | 31 +++++++++++++++++++------------ 1 file changed, 19 insertions(+), 12 deletions(-) diff --git a/drivers/mtd/nand/fsmc_nand.c b/drivers/mtd/nand/fsmc_nand.c index 66aece9..4a98433 100644 --- a/drivers/mtd/nand/fsmc_nand.c +++ b/drivers/mtd/nand/fsmc_nand.c @@ -370,9 +370,12 @@ static void fsmc_cmd_ctrl(struct mtd_info *mtd, int cmd, unsigned int ctrl) * This routine initializes timing parameters related to NAND memory access in * FSMC registers */ -static void fsmc_nand_setup(void __iomem *regs, uint32_t bank, - uint32_t busw, struct fsmc_nand_timings *timings) +static int fsmc_setup_data_interface(struct mtd_info *mtd, + const struct nand_data_interface *conf, + bool check_only) { + struct nand_chip *nand = mtd_to_nand(mtd); + struct fsmc_nand_data *host = nand_get_controller_data(nand); uint32_t value = FSMC_DEVTYPE_NAND | FSMC_ENABLE | FSMC_WAITON; uint32_t tclr, tar, thiz, thold, twait, tset; struct fsmc_nand_timings *tims; @@ -384,12 +387,18 @@ static void fsmc_nand_setup(void __iomem *regs, uint32_t bank, .twait = FSMC_TWAIT_6, .tset = FSMC_TSET_0, }; + unsigned int bank = host->bank; + void __iomem *regs = host->regs_va; + int ret; - if (timings) - tims = timings; + if (host->dev_timings) + tims = host->dev_timings; else tims = &default_timings; + if (check_only) + return 0; + tclr = (tims->tclr & FSMC_TCLR_MASK) << FSMC_TCLR_SHIFT; tar = (tims->tar & FSMC_TAR_MASK) << FSMC_TAR_SHIFT; thiz = (tims->thiz & FSMC_THIZ_MASK) << FSMC_THIZ_SHIFT; @@ -397,7 +406,7 @@ static void fsmc_nand_setup(void __iomem *regs, uint32_t bank, twait = (tims->twait & FSMC_TWAIT_MASK) << FSMC_TWAIT_SHIFT; tset = (tims->tset & FSMC_TSET_MASK) << FSMC_TSET_SHIFT; - if (busw) + if (nand->options & NAND_BUSWIDTH_16) writel_relaxed(value | FSMC_DEVWID_16, FSMC_NAND_REG(regs, bank, PC)); else @@ -410,6 +419,8 @@ static void fsmc_nand_setup(void __iomem *regs, uint32_t bank, FSMC_NAND_REG(regs, bank, COMM)); writel_relaxed(thiz | thold | twait | tset, FSMC_NAND_REG(regs, bank, ATTRIB)); + + return 0; } /* @@ -991,6 +1002,7 @@ static int __init fsmc_nand_probe(struct platform_device *pdev) nand->select_chip = fsmc_select_chip; nand->badblockbits = 7; nand_set_flash_node(nand, np); + nand->setup_data_interface = fsmc_setup_data_interface; switch (host->mode) { case USE_DMA_ACCESS: @@ -1019,10 +1031,6 @@ static int __init fsmc_nand_probe(struct platform_device *pdev) break; } - fsmc_nand_setup(host->regs_va, host->bank, - nand->options & NAND_BUSWIDTH_16, - host->dev_timings); - if (AMBA_REV_BITS(host->pid) >= 8) { nand->ecc.read_page = fsmc_read_page_hwecc; nand->ecc.calculate = fsmc_read_hwecc_ecc4; @@ -1121,6 +1129,7 @@ static int __init fsmc_nand_probe(struct platform_device *pdev) platform_set_drvdata(pdev, host); dev_info(&pdev->dev, "FSMC NAND driver registration successful\n"); + return 0; err_probe: @@ -1172,9 +1181,7 @@ static int fsmc_nand_resume(struct device *dev) struct fsmc_nand_data *host = dev_get_drvdata(dev); if (host) { clk_prepare_enable(host->clk); - fsmc_nand_setup(host->regs_va, host->bank, - host->nand.options & NAND_BUSWIDTH_16, - host->dev_timings); + nand_reset(&host->nand, 0); } return 0; }