From patchwork Wed Jan 13 16:34:14 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Romain Izard X-Patchwork-Id: 567051 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from bombadil.infradead.org (bombadil.infradead.org [IPv6:2001:1868:205::9]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 6CC68140BA4 for ; Thu, 14 Jan 2016 03:38:22 +1100 (AEDT) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b=CmT8aaoO; dkim-atps=neutral Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.80.1 #2 (Red Hat Linux)) id 1aJOOQ-0001Yv-MK; Wed, 13 Jan 2016 16:35:30 +0000 Received: from mail-wm0-x241.google.com ([2a00:1450:400c:c09::241]) by bombadil.infradead.org with esmtps (Exim 4.80.1 #2 (Red Hat Linux)) id 1aJOO8-0000Ia-Sl for linux-mtd@lists.infradead.org; Wed, 13 Jan 2016 16:35:16 +0000 Received: by mail-wm0-x241.google.com with SMTP id u188so37725836wmu.0 for ; Wed, 13 Jan 2016 08:34:53 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=HmPP0zhpASCINizzCOPPAX95eR5Q+PzVtM2EbrbRYp0=; b=CmT8aaoOAcF9/sUHpoezU7gKNexH4dEstryIVlnF3gI3IKwQn57MCKAMRvBDIJdaGL 19RZok3ElIeQztDSVN65H2n+RPbpoi0Xjz23cZrkrHvzxOajCFeXFo4sfM9AApq/NTsx QqflTFEWTMEeNlfLM2DUw7IdDw+IE2AjQAbfZV7+d0I7ZwGTUAN/B9Sa7rtzttoBn3ey +3V4pFPtoktEvsyucADn5dVoXzL/kXqXU61Ij1RokXdeIwss1S25UVWmvoRwXdqEv9Gh 5f4lfTgWIvPC2SjXhEkv8+OJTCgjLNaeMcca2YetSE2HbYGTy8jG98D1b0DzftwSPEMh GcpA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=HmPP0zhpASCINizzCOPPAX95eR5Q+PzVtM2EbrbRYp0=; b=fBhHElmG8WusvfLnJQYSfR5KiWI2svoreeobUy8hRqPNzrSXKQlXFkQe5n2S6xYIhh KSArKvKXhO75Q69bovhHD/fS0kOLRzrV2sZE3dmbobfDl3csbSvIb+6o4PIqwZ9UxND2 LR+6yVupPAJYYsLq11LIzFxZuF72wVO8YSr9PSnB0OyVijACzzCEFuhyZg/3rhKhRaon bPg2zHgAZ9392L9ZwSzLdR7u8zLr9p2d8nZdSyqGKPjvr4/gd0eH//LnVEuZRHkDs5NK Apxsk/Ku6cYqGG/fki3xenBgXFg6/DYadIJ+sQtfuyfIZ1pN4agQK3I18eaNc7BmDYIk hr8w== X-Gm-Message-State: ALoCoQl7xxKO4ajCaXY3rlO9DwMnHIvomuR4YFw0PVsP3FCQipFUFYJ1Qjjy9mvoWaxg83+lNaPZ49aQwafvV3XCHh2QzTNVEQ== X-Received: by 10.28.107.81 with SMTP id g78mr25841466wmc.16.1452702892750; Wed, 13 Jan 2016 08:34:52 -0800 (PST) Received: from localhost.localdomain (ram94-11-88-187-113-157.fbx.proxad.net. [88.187.113.157]) by smtp.gmail.com with ESMTPSA id t195sm18058065wme.13.2016.01.13.08.34.51 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 13 Jan 2016 08:34:51 -0800 (PST) From: Romain Izard To: linux-mtd@lists.infradead.org, devicetree@vger.kernel.org Subject: [PATCH v1 2/5] mtd: atmel_nand: Support variable RB_EDGE interrupts Date: Wed, 13 Jan 2016 17:34:14 +0100 Message-Id: <1452702857-2240-3-git-send-email-romain.izard.pro@gmail.com> X-Mailer: git-send-email 2.5.0 In-Reply-To: <1452702857-2240-1-git-send-email-romain.izard.pro@gmail.com> References: <1452702857-2240-1-git-send-email-romain.izard.pro@gmail.com> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20160113_083513_245464_A7B15F94 X-CRM114-Status: GOOD ( 18.08 ) X-Spam-Score: -2.7 (--) X-Spam-Report: SpamAssassin version 3.4.0 on bombadil.infradead.org summary: Content analysis details: (-2.7 points) pts rule name description ---- ---------------------- -------------------------------------------------- -0.7 RCVD_IN_DNSWL_LOW RBL: Sender listed at http://www.dnswl.org/, low trust [2a00:1450:400c:c09:0:0:0:241 listed in] [list.dnswl.org] 0.0 FREEMAIL_FROM Sender email is commonly abused enduser mail provider (romain.izard.pro[at]gmail.com) -0.0 SPF_PASS SPF: sender matches SPF record -1.9 BAYES_00 BODY: Bayes spam probability is 0 to 1% [score: 0.0000] -0.1 DKIM_VALID_AU Message has a valid DKIM or DK signature from author's domain 0.1 DKIM_SIGNED Message has a DKIM or DK signature, not necessarily valid -0.1 DKIM_VALID Message has at least one valid DKIM or DK signature X-BeenThere: linux-mtd@lists.infradead.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: Linux MTD discussion mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Josh Wu , Romain Izard , Nicolas Ferre , Yang Wenyou MIME-Version: 1.0 Sender: "linux-mtd" Errors-To: linux-mtd-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org The NFC controller used to accelerate the NAND transfers on SAMA5 chips can use either RB_EDGE0 or RB_EDGE3 as its ready/busy interrupt bit. Use the controller's compatible string to select the correct bit. Signed-off-by: Romain Izard Reviewed-by: Wenyou Yang Acked-by: Rob Herring --- .../devicetree/bindings/mtd/atmel-nand.txt | 2 +- drivers/mtd/nand/atmel_nand.c | 39 +++++++++++++++++----- drivers/mtd/nand/atmel_nand_nfc.h | 5 ++- 3 files changed, 36 insertions(+), 10 deletions(-) diff --git a/Documentation/devicetree/bindings/mtd/atmel-nand.txt b/Documentation/devicetree/bindings/mtd/atmel-nand.txt index 7d4c8eb775a5..89b0db9801b0 100644 --- a/Documentation/devicetree/bindings/mtd/atmel-nand.txt +++ b/Documentation/devicetree/bindings/mtd/atmel-nand.txt @@ -34,7 +34,7 @@ Optional properties: - nand-on-flash-bbt: boolean to enable on flash bbt option if not present false - Nand Flash Controller(NFC) is a slave driver under Atmel nand flash - Required properties: - - compatible : "atmel,sama5d3-nfc". + - compatible : "atmel,sama5d3-nfc" or "atmel,sama5d4-nfc". - reg : should specify the address and size used for NFC command registers, NFC registers and NFC Sram. NFC Sram address and size can be absent if don't want to use it. diff --git a/drivers/mtd/nand/atmel_nand.c b/drivers/mtd/nand/atmel_nand.c index 9d71f9e6a8de..e5d7e7e63f49 100644 --- a/drivers/mtd/nand/atmel_nand.c +++ b/drivers/mtd/nand/atmel_nand.c @@ -67,6 +67,10 @@ struct atmel_nand_caps { bool pmecc_correct_erase_page; }; +struct atmel_nand_nfc_priv { + uint32_t rb_edge; +}; + /* oob layout for large page size * bad block info is on bytes 0 and 1 * the bytes have to be consecutives to avoid @@ -111,6 +115,7 @@ struct atmel_nfc { /* Point to the sram bank which include readed data via NFC */ void *data_in_sram; bool will_write_sram; + uint32_t rb_edge; }; static struct atmel_nfc nand_nfc; @@ -1675,9 +1680,9 @@ static irqreturn_t hsmc_interrupt(int irq, void *dev_id) nfc_writel(host->nfc->hsmc_regs, IDR, NFC_SR_XFR_DONE); ret = IRQ_HANDLED; } - if (pending & NFC_SR_RB_EDGE) { + if (pending & host->nfc->rb_edge) { complete(&host->nfc->comp_ready); - nfc_writel(host->nfc->hsmc_regs, IDR, NFC_SR_RB_EDGE); + nfc_writel(host->nfc->hsmc_regs, IDR, host->nfc->rb_edge); ret = IRQ_HANDLED; } if (pending & NFC_SR_CMD_DONE) { @@ -1695,7 +1700,7 @@ static void nfc_prepare_interrupt(struct atmel_nand_host *host, u32 flag) if (flag & NFC_SR_XFR_DONE) init_completion(&host->nfc->comp_xfer_done); - if (flag & NFC_SR_RB_EDGE) + if (flag & host->nfc->rb_edge) init_completion(&host->nfc->comp_ready); if (flag & NFC_SR_CMD_DONE) @@ -1713,7 +1718,7 @@ static int nfc_wait_interrupt(struct atmel_nand_host *host, u32 flag) if (flag & NFC_SR_XFR_DONE) comp[index++] = &host->nfc->comp_xfer_done; - if (flag & NFC_SR_RB_EDGE) + if (flag & host->nfc->rb_edge) comp[index++] = &host->nfc->comp_ready; if (flag & NFC_SR_CMD_DONE) @@ -1781,7 +1786,7 @@ static int nfc_device_ready(struct mtd_info *mtd) dev_err(host->dev, "Lost the interrupt flags: 0x%08x\n", mask & status); - return status & NFC_SR_RB_EDGE; + return status & host->nfc->rb_edge; } static void nfc_select_chip(struct mtd_info *mtd, int chip) @@ -1954,8 +1959,8 @@ static void nfc_nand_command(struct mtd_info *mtd, unsigned int command, } /* fall through */ default: - nfc_prepare_interrupt(host, NFC_SR_RB_EDGE); - nfc_wait_interrupt(host, NFC_SR_RB_EDGE); + nfc_prepare_interrupt(host, host->nfc->rb_edge); + nfc_wait_interrupt(host, host->nfc->rb_edge); } } @@ -2318,9 +2323,12 @@ static const struct of_device_id atmel_nand_dt_ids[] = { MODULE_DEVICE_TABLE(of, atmel_nand_dt_ids); +static const struct of_device_id atmel_nand_nfc_match[]; + static int atmel_nand_nfc_probe(struct platform_device *pdev) { struct atmel_nfc *nfc = &nand_nfc; + const struct atmel_nand_nfc_priv *priv; struct resource *nfc_cmd_regs, *nfc_hsmc_regs, *nfc_sram; int ret; @@ -2352,6 +2360,12 @@ static int atmel_nand_nfc_probe(struct platform_device *pdev) } } + priv = of_match_device(atmel_nand_nfc_match, &pdev->dev)->data; + if (NULL == priv) + return -ENODEV; + + nfc->rb_edge = priv->rb_edge; + nfc_writel(nfc->hsmc_regs, IDR, 0xffffffff); nfc_readl(nfc->hsmc_regs, SR); /* clear the NFC_SR */ @@ -2380,8 +2394,17 @@ static int atmel_nand_nfc_remove(struct platform_device *pdev) return 0; } +static struct atmel_nand_nfc_priv sama5d3_nfc_priv = { + .rb_edge = NFC_SR_RB_EDGE0, +}; + +static struct atmel_nand_nfc_priv sama5d4_nfc_priv = { + .rb_edge = NFC_SR_RB_EDGE3, +}; + static const struct of_device_id atmel_nand_nfc_match[] = { - { .compatible = "atmel,sama5d3-nfc" }, + { .compatible = "atmel,sama5d3-nfc", .data = &sama5d3_nfc_priv }, + { .compatible = "atmel,sama5d4-nfc", .data = &sama5d4_nfc_priv }, { /* sentinel */ } }; MODULE_DEVICE_TABLE(of, atmel_nand_nfc_match); diff --git a/drivers/mtd/nand/atmel_nand_nfc.h b/drivers/mtd/nand/atmel_nand_nfc.h index 4d5d26221a7e..2cd9c57b1e53 100644 --- a/drivers/mtd/nand/atmel_nand_nfc.h +++ b/drivers/mtd/nand/atmel_nand_nfc.h @@ -42,7 +42,10 @@ #define NFC_SR_UNDEF (1 << 21) #define NFC_SR_AWB (1 << 22) #define NFC_SR_ASE (1 << 23) -#define NFC_SR_RB_EDGE (1 << 24) +#define NFC_SR_RB_EDGE0 (1 << 24) +#define NFC_SR_RB_EDGE1 (1 << 25) +#define NFC_SR_RB_EDGE2 (1 << 26) +#define NFC_SR_RB_EDGE3 (1 << 27) #define ATMEL_HSMC_NFC_IER 0x0c #define ATMEL_HSMC_NFC_IDR 0x10