From patchwork Tue Jul 7 15:27:21 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Antoine Tenart X-Patchwork-Id: 6734471 Return-Path: X-Original-To: patchwork-linux-arm@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork1.web.kernel.org (Postfix) with ESMTP id 570999F380 for ; Tue, 7 Jul 2015 15:30:13 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 687262077A for ; Tue, 7 Jul 2015 15:30:12 +0000 (UTC) Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) (using TLSv1.2 with cipher AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 66B2920776 for ; Tue, 7 Jul 2015 15:30:11 +0000 (UTC) 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 1ZCUnB-0003Rc-P6; Tue, 07 Jul 2015 15:28:17 +0000 Received: from down.free-electrons.com ([37.187.137.238] helo=mail.free-electrons.com) by bombadil.infradead.org with esmtp (Exim 4.80.1 #2 (Red Hat Linux)) id 1ZCUmj-0003C5-55; Tue, 07 Jul 2015 15:27:50 +0000 Received: by mail.free-electrons.com (Postfix, from userid 106) id 3DC422718; Tue, 7 Jul 2015 17:27:31 +0200 (CEST) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Spam-Level: X-Spam-Status: No, score=-5.0 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_MED, RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 Received: from localhost (vpn.foo.tf [195.154.43.236]) by mail.free-electrons.com (Postfix) with ESMTPSA id 0263D868; Tue, 7 Jul 2015 17:27:30 +0200 (CEST) From: Antoine Tenart To: sebastian.hesselbarth@gmail.com, ezequiel.garcia@free-electrons.com, dwmw2@infradead.org, computersforpeace@gmail.com Subject: [PATCH v2 1/7] mtd: pxa3xx_nand: add a non mandatory ECC clock Date: Tue, 7 Jul 2015 17:27:21 +0200 Message-Id: <1436282847-21137-2-git-send-email-antoine.tenart@free-electrons.com> X-Mailer: git-send-email 2.4.5 In-Reply-To: <1436282847-21137-1-git-send-email-antoine.tenart@free-electrons.com> References: <1436282847-21137-1-git-send-email-antoine.tenart@free-electrons.com> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20150707_082749_521063_D9BD8147 X-CRM114-Status: GOOD ( 15.77 ) X-Spam-Score: -2.7 (--) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: zmxu@marvell.com, boris.brezillon@free-electrons.com, Antoine Tenart , linux-kernel@vger.kernel.org, linux-mtd@lists.infradead.org, jszhang@marvell.com, linux-arm-kernel@lists.infradead.org MIME-Version: 1.0 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+patchwork-linux-arm=patchwork.kernel.org@lists.infradead.org X-Virus-Scanned: ClamAV using ClamSMTP Some controllers (as the coming Berlin nand controller) need to enable an ECC clock. Add support for this clock in the pxa3xx nand driver, and leave it as non mandatory. Signed-off-by: Antoine Tenart --- drivers/mtd/nand/pxa3xx_nand.c | 32 +++++++++++++++++++++++--------- 1 file changed, 23 insertions(+), 9 deletions(-) diff --git a/drivers/mtd/nand/pxa3xx_nand.c b/drivers/mtd/nand/pxa3xx_nand.c index 0e1db91b386c..665e6cf06c9b 100644 --- a/drivers/mtd/nand/pxa3xx_nand.c +++ b/drivers/mtd/nand/pxa3xx_nand.c @@ -181,7 +181,7 @@ struct pxa3xx_nand_info { struct nand_hw_control controller; struct platform_device *pdev; - struct clk *clk; + struct clk *clk, *ecc_clk; void __iomem *mmio_base; unsigned long mmio_phys; struct completion cmd_complete, dev_ready; @@ -1682,15 +1682,26 @@ static int alloc_nand_resource(struct platform_device *pdev) spin_lock_init(&chip->controller->lock); init_waitqueue_head(&chip->controller->wq); - info->clk = devm_clk_get(&pdev->dev, NULL); + info->clk = devm_clk_get(&pdev->dev, "nfc"); if (IS_ERR(info->clk)) { - dev_err(&pdev->dev, "failed to get nand clock\n"); - return PTR_ERR(info->clk); + info->clk = devm_clk_get(&pdev->dev, NULL); + + if (IS_ERR(info->clk)) { + dev_err(&pdev->dev, "failed to get nand clock\n"); + return PTR_ERR(info->clk); + } } ret = clk_prepare_enable(info->clk); if (ret < 0) return ret; + info->ecc_clk = devm_clk_get(&pdev->dev, "ecc"); + if (!IS_ERR(info->ecc_clk)) { + ret = clk_prepare_enable(info->ecc_clk); + if (ret < 0) + goto fail_disable_clk; + } + if (use_dma) { /* * This is a dirty hack to make this driver work from @@ -1707,7 +1718,7 @@ static int alloc_nand_resource(struct platform_device *pdev) dev_err(&pdev->dev, "no resource defined for data DMA\n"); ret = -ENXIO; - goto fail_disable_clk; + goto fail_disable_ecc_clk; } info->drcmr_dat = r->start; @@ -1716,7 +1727,7 @@ static int alloc_nand_resource(struct platform_device *pdev) dev_err(&pdev->dev, "no resource defined for cmd DMA\n"); ret = -ENXIO; - goto fail_disable_clk; + goto fail_disable_ecc_clk; } info->drcmr_cmd = r->start; } @@ -1726,14 +1737,14 @@ static int alloc_nand_resource(struct platform_device *pdev) if (irq < 0) { dev_err(&pdev->dev, "no IRQ resource defined\n"); ret = -ENXIO; - goto fail_disable_clk; + goto fail_disable_ecc_clk; } r = platform_get_resource(pdev, IORESOURCE_MEM, 0); info->mmio_base = devm_ioremap_resource(&pdev->dev, r); if (IS_ERR(info->mmio_base)) { ret = PTR_ERR(info->mmio_base); - goto fail_disable_clk; + goto fail_disable_ecc_clk; } info->mmio_phys = r->start; @@ -1742,7 +1753,7 @@ static int alloc_nand_resource(struct platform_device *pdev) info->data_buff = kmalloc(info->buf_size, GFP_KERNEL); if (info->data_buff == NULL) { ret = -ENOMEM; - goto fail_disable_clk; + goto fail_disable_ecc_clk; } /* initialize all interrupts to be disabled */ @@ -1763,6 +1774,8 @@ static int alloc_nand_resource(struct platform_device *pdev) fail_free_buf: free_irq(irq, info); kfree(info->data_buff); +fail_disable_ecc_clk: + clk_disable_unprepare(info->ecc_clk); fail_disable_clk: clk_disable_unprepare(info->clk); return ret; @@ -1785,6 +1798,7 @@ static int pxa3xx_nand_remove(struct platform_device *pdev) pxa3xx_nand_free_buff(info); clk_disable_unprepare(info->clk); + clk_disable_unprepare(info->ecc_clk); for (cs = 0; cs < pdata->num_cs; cs++) nand_release(info->host[cs]->mtd);