From patchwork Thu May 24 08:05:08 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Josh Wu X-Patchwork-Id: 161074 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from merlin.infradead.org (merlin.infradead.org [IPv6:2001:4978:20e::2]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id B0650B6FC8 for ; Thu, 24 May 2012 18:07:00 +1000 (EST) Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.76 #1 (Red Hat Linux)) id 1SXT37-0008I1-TQ; Thu, 24 May 2012 08:05:33 +0000 Received: from bombadil.infradead.org ([2001:4830:2446:ff00:4687:fcff:fea6:5117]) by merlin.infradead.org with esmtps (Exim 4.76 #1 (Red Hat Linux)) id 1SXT2w-0008Hc-U9; Thu, 24 May 2012 08:05:23 +0000 Received: from newsmtp5.atmel.com ([204.2.163.5] helo=sjogate2.atmel.com) by bombadil.infradead.org with esmtp (Exim 4.76 #1 (Red Hat Linux)) id 1SXT2u-000629-IT; Thu, 24 May 2012 08:05:21 +0000 Received: from [10.217.3.59] ([10.217.3.59]) by sjogate2.atmel.com (8.13.6/8.13.6) with ESMTP id q4O80fH7005187; Thu, 24 May 2012 01:00:42 -0700 (PDT) Message-ID: <4FBDEBB4.1040806@atmel.com> Date: Thu, 24 May 2012 16:05:08 +0800 From: Josh Wu User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:12.0) Gecko/20120428 Thunderbird/12.0.1 MIME-Version: 1.0 To: Jean-Christophe PLAGNIOL-VILLARD Subject: Re: [PATCH v8 1/3] MTD: at91: extract hw ecc initialization to one function References: <1337759274-9921-1-git-send-email-josh.wu@atmel.com> <1337759274-9921-2-git-send-email-josh.wu@atmel.com> <20120523095141.GE3377@game.jcrosoft.org> In-Reply-To: <20120523095141.GE3377@game.jcrosoft.org> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20120524_040520_992014_B5037814 X-CRM114-Status: GOOD ( 17.28 ) X-Spam-Score: -1.9 (-) X-Spam-Report: SpamAssassin version 3.3.2 on bombadil.infradead.org summary: Content analysis details: (-1.9 points) pts rule name description ---- ---------------------- -------------------------------------------------- -0.0 T_RP_MATCHES_RCVD Envelope sender domain matches handover relay domain -0.0 SPF_PASS SPF: sender matches SPF record -1.9 BAYES_00 BODY: Bayes spam probability is 0 to 1% [score: 0.0000] Cc: hongxu.cn@gmail.com, dedekind1@gmail.com, nicolas.ferre@atmel.com, linux-mtd@lists.infradead.org, ivan.djelic@parrot.com, linux-arm-kernel@lists.infradead.org X-BeenThere: linux-mtd@lists.infradead.org X-Mailman-Version: 2.1.14 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 5/23/2012 5:51 PM, Jean-Christophe PLAGNIOL-VILLARD wrote: > On 15:47 Wed 23 May , Josh Wu wrote: >> Signed-off-by: Hong Xu >> Signed-off-by: Josh Wu >> --- >> drivers/mtd/nand/atmel_nand.c | 147 ++++++++++++++++++++----------------- >> drivers/mtd/nand/atmel_nand_ecc.h | 8 +- >> 2 files changed, 85 insertions(+), 70 deletions(-) >> >> diff --git a/drivers/mtd/nand/atmel_nand.c b/drivers/mtd/nand/atmel_nand.c >> index 2165576..9723702 100644 >> --- a/drivers/mtd/nand/atmel_nand.c >> +++ b/drivers/mtd/nand/atmel_nand.c >> @@ -42,20 +42,15 @@ >> >> #include >> >> +/* Hardware ECC registers */ >> +#include "atmel_nand_ecc.h" >> + >> static int use_dma = 1; >> module_param(use_dma, int, 0); >> >> static int on_flash_bbt = 0; >> module_param(on_flash_bbt, int, 0); >> >> -/* Register access macros */ >> -#define ecc_readl(add, reg) \ >> - __raw_readl(add + ATMEL_ECC_##reg) >> -#define ecc_writel(add, reg, value) \ >> - __raw_writel((value), add + ATMEL_ECC_##reg) >> - >> -#include "atmel_nand_ecc.h" /* Hardware ECC registers */ >> - >> /* oob layout for large page size >> * bad block info is on bytes 0 and 1 >> * the bytes have to be consecutives to avoid >> @@ -523,6 +518,75 @@ static int __devinit atmel_of_init_port(struct atmel_nand_host *host, >> } >> #endif >> >> +static int __init atmel_hw_nand_init_params(struct platform_device *pdev, >> + struct atmel_nand_host *host) >> +{ >> + struct resource *regs; >> + struct mtd_info *mtd; >> + struct nand_chip *nand_chip; >> + >> + nand_chip =&host->nand_chip; >> + mtd =&host->mtd; >> + >> + nand_chip->ecc.mode = NAND_ECC_SOFT; >> + regs = platform_get_resource(pdev, IORESOURCE_MEM, 1); >> + if (!regs) { >> + dev_err(host->dev, >> + "Can't get I/O resource regs, use software ECC\n"); > just return 0 and avoid the if else sure. I'll fix it. > > Best Regards, > J. And I have same question about the relaxed version of read/write device. this source code file still use __raw_readl/writel(), I think I can convert it all to relaxed version, except that the ECC control reset should use NO relaxed version. so the patch to convert it will look like following: + case 512: + nand_chip->ecc.layout = &atmel_oobinfo_small; + ecc_writel_relaxed(host->ecc, MR, ATMEL_ECC_PAGESIZE_528); + break; + case 1024: + nand_chip->ecc.layout = &atmel_oobinfo_large; + ecc_writel_relaxed(host->ecc, MR, ATMEL_ECC_PAGESIZE_1056); + break; + case 2048: + nand_chip->ecc.layout = &atmel_oobinfo_large; + ecc_writel_relaxed(host->ecc, MR, ATMEL_ECC_PAGESIZE_2112); + break; + case 4096: + nand_chip->ecc.layout = &atmel_oobinfo_large; + ecc_writel_relaxed(host->ecc, MR, ATMEL_ECC_PAGESIZE_4224); + break; ... Best Regards, Josh Wu diff --git a/drivers/mtd/nand/atmel_nand_ecc.h b/drivers/mtd/nand/atmel_nand_ecc.h index b437567..dc49dc9 100644 --- a/drivers/mtd/nand/atmel_nand_ecc.h +++ b/drivers/mtd/nand/atmel_nand_ecc.h @@ -37,9 +37,11 @@ #define ATMEL_ECC_NPARITY (0xffff << 0) /* NParity */ /* Register Access Macros */ -#define ecc_readl(add, reg) \ - __raw_readl(add + ATMEL_ECC_##reg) -#define ecc_writel(add, reg, value) \ - __raw_writel((value), add + ATMEL_ECC_##reg) +#define ecc_readl_relaxed(add, reg) \ + readl_relaxed(add + ATMEL_ECC_##reg) +#define ecc_writel_relaxed(add, reg, value) \ + writel_relaxed((value), add + ATMEL_ECC_##reg) +#define ecc_writel(add, reg, value) \ + writel((value), add + ATMEL_ECC_##reg) diff --git a/drivers/mtd/nand/atmel_nand.c b/drivers/mtd/nand/atmel_nand.c index 9723702..ba61153 100644 --- a/drivers/mtd/nand/atmel_nand.c +++ b/drivers/mtd/nand/atmel_nand.c @@ -299,13 +299,13 @@ static int atmel_nand_calculate(struct mtd_info *mtd, unsigned int ecc_value; /* get the first 2 ECC bytes */ - ecc_value = ecc_readl(host->ecc, PR); + ecc_value = ecc_readl_relaxed(host->ecc, PR); ecc_code[0] = ecc_value & 0xFF; ecc_code[1] = (ecc_value >> 8) & 0xFF; /* get the last 2 ECC bytes */ - ecc_value = ecc_readl(host->ecc, NPR) & ATMEL_ECC_NPARITY; + ecc_value = ecc_readl_relaxed(host->ecc, NPR) & ATMEL_ECC_NPARITY; ecc_code[2] = ecc_value & 0xFF; ecc_code[3] = (ecc_value >> 8) & 0xFF; @@ -401,16 +401,16 @@ static int atmel_nand_correct(struct mtd_info *mtd, u_char *dat, unsigned int ecc_word, ecc_bit; /* get the status from the Status Register */ - ecc_status = ecc_readl(host->ecc, SR); + ecc_status = ecc_readl_relaxed(host->ecc, SR); /* if there's no error */ if (likely(!(ecc_status & ATMEL_ECC_RECERR))) return 0; /* get error bit offset (4 bits) */ - ecc_bit = ecc_readl(host->ecc, PR) & ATMEL_ECC_BITADDR; + ecc_bit = ecc_readl_relaxed(host->ecc, PR) & ATMEL_ECC_BITADDR; /* get word address (12 bits) */ - ecc_word = ecc_readl(host->ecc, PR) & ATMEL_ECC_WORDADDR; + ecc_word = ecc_readl_relaxed(host->ecc, PR) & ATMEL_ECC_WORDADDR; ecc_word >>= 4; ....