Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753196AbbLIVCU (ORCPT ); Wed, 9 Dec 2015 16:02:20 -0500 Received: from mail-ob0-f172.google.com ([209.85.214.172]:35331 "EHLO mail-ob0-f172.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751997AbbLIVCS (ORCPT ); Wed, 9 Dec 2015 16:02:18 -0500 Subject: Re: [PATCH linux-next (v2) 2/3] mtd: brcmnand: Request and enable the clock if present To: Simon Arlott , "devicetree@vger.kernel.org" , Brian Norris , Linux Kernel Mailing List , David Woodhouse , linux-mtd@lists.infradead.org References: <566891DA.1050208@simon.arlott.org.uk> <56689231.5060907@simon.arlott.org.uk> Cc: Rob Herring , Pawel Moll , Mark Rutland , Ian Campbell , Kumar Gala , bcm-kernel-feedback-list@broadcom.com, Kamal Dasu , Jonas Gorski From: Florian Fainelli Message-ID: <566896D7.7060706@gmail.com> Date: Wed, 9 Dec 2015 13:02:15 -0800 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.4.0 MIME-Version: 1.0 In-Reply-To: <56689231.5060907@simon.arlott.org.uk> Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 5684 Lines: 185 Le 09/12/2015 12:42, Simon Arlott a écrit : > Attempt to enable a clock named "nand" as some SoCs have a clock for the > controller that needs to be enabled. > > Signed-off-by: Simon Arlott Reviewed-by: Florian Fainelli > --- > Resend, no changes. > > drivers/mtd/nand/brcmnand/brcmnand.c | 64 ++++++++++++++++++++++++++++-------- > 1 file changed, 50 insertions(+), 14 deletions(-) > > diff --git a/drivers/mtd/nand/brcmnand/brcmnand.c b/drivers/mtd/nand/brcmnand/brcmnand.c > index 190a99a..dca8162 100644 > --- a/drivers/mtd/nand/brcmnand/brcmnand.c > +++ b/drivers/mtd/nand/brcmnand/brcmnand.c > @@ -11,6 +11,7 @@ > * GNU General Public License for more details. > */ > > +#include > #include > #include > #include > @@ -122,6 +123,9 @@ struct brcmnand_controller { > /* Some SoCs provide custom interrupt status register(s) */ > struct brcmnand_soc *soc; > > + /* Some SoCs have a gateable clock for the controller */ > + struct clk *clk; > + > int cmd_pending; > bool dma_pending; > struct completion done; > @@ -2127,10 +2131,24 @@ int brcmnand_probe(struct platform_device *pdev, struct brcmnand_soc *soc) > if (IS_ERR(ctrl->nand_base)) > return PTR_ERR(ctrl->nand_base); > > + /* Enable clock before using NAND registers */ > + ctrl->clk = devm_clk_get(dev, "nand"); > + if (!IS_ERR(ctrl->clk)) { > + ret = clk_prepare_enable(ctrl->clk); > + if (ret) > + return ret; > + } else { > + ret = PTR_ERR(ctrl->clk); > + if (ret == -EPROBE_DEFER) > + return ret; > + > + ctrl->clk = NULL; > + } > + > /* Initialize NAND revision */ > ret = brcmnand_revision_init(ctrl); > if (ret) > - return ret; > + goto err; > > /* > * Most chips have this cache at a fixed offset within 'nand' block. > @@ -2139,8 +2157,10 @@ int brcmnand_probe(struct platform_device *pdev, struct brcmnand_soc *soc) > res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "nand-cache"); > if (res) { > ctrl->nand_fc = devm_ioremap_resource(dev, res); > - if (IS_ERR(ctrl->nand_fc)) > - return PTR_ERR(ctrl->nand_fc); > + if (IS_ERR(ctrl->nand_fc)) { > + ret = PTR_ERR(ctrl->nand_fc); > + goto err; > + } > } else { > ctrl->nand_fc = ctrl->nand_base + > ctrl->reg_offsets[BRCMNAND_FC_BASE]; > @@ -2150,8 +2170,10 @@ int brcmnand_probe(struct platform_device *pdev, struct brcmnand_soc *soc) > res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "flash-dma"); > if (res) { > ctrl->flash_dma_base = devm_ioremap_resource(dev, res); > - if (IS_ERR(ctrl->flash_dma_base)) > - return PTR_ERR(ctrl->flash_dma_base); > + if (IS_ERR(ctrl->flash_dma_base)) { > + ret = PTR_ERR(ctrl->flash_dma_base); > + goto err; > + } > > flash_dma_writel(ctrl, FLASH_DMA_MODE, 1); /* linked-list */ > flash_dma_writel(ctrl, FLASH_DMA_ERROR_STATUS, 0); > @@ -2160,13 +2182,16 @@ int brcmnand_probe(struct platform_device *pdev, struct brcmnand_soc *soc) > ctrl->dma_desc = dmam_alloc_coherent(dev, > sizeof(*ctrl->dma_desc), > &ctrl->dma_pa, GFP_KERNEL); > - if (!ctrl->dma_desc) > - return -ENOMEM; > + if (!ctrl->dma_desc) { > + ret = -ENOMEM; > + goto err; > + } > > ctrl->dma_irq = platform_get_irq(pdev, 1); > if ((int)ctrl->dma_irq < 0) { > dev_err(dev, "missing FLASH_DMA IRQ\n"); > - return -ENODEV; > + ret = -ENODEV; > + goto err; > } > > ret = devm_request_irq(dev, ctrl->dma_irq, > @@ -2175,7 +2200,7 @@ int brcmnand_probe(struct platform_device *pdev, struct brcmnand_soc *soc) > if (ret < 0) { > dev_err(dev, "can't allocate IRQ %d: error %d\n", > ctrl->dma_irq, ret); > - return ret; > + goto err; > } > > dev_info(dev, "enabling FLASH_DMA\n"); > @@ -2199,7 +2224,8 @@ int brcmnand_probe(struct platform_device *pdev, struct brcmnand_soc *soc) > ctrl->irq = platform_get_irq(pdev, 0); > if ((int)ctrl->irq < 0) { > dev_err(dev, "no IRQ defined\n"); > - return -ENODEV; > + ret = -ENODEV; > + goto err; > } > > /* > @@ -2223,7 +2249,7 @@ int brcmnand_probe(struct platform_device *pdev, struct brcmnand_soc *soc) > if (ret < 0) { > dev_err(dev, "can't allocate IRQ %d: error %d\n", > ctrl->irq, ret); > - return ret; > + goto err; > } > > for_each_available_child_of_node(dn, child) { > @@ -2233,7 +2259,8 @@ int brcmnand_probe(struct platform_device *pdev, struct brcmnand_soc *soc) > host = devm_kzalloc(dev, sizeof(*host), GFP_KERNEL); > if (!host) { > of_node_put(child); > - return -ENOMEM; > + ret = -ENOMEM; > + goto err; > } > host->pdev = pdev; > host->ctrl = ctrl; > @@ -2249,10 +2276,17 @@ int brcmnand_probe(struct platform_device *pdev, struct brcmnand_soc *soc) > } > > /* No chip-selects could initialize properly */ > - if (list_empty(&ctrl->host_list)) > - return -ENODEV; > + if (list_empty(&ctrl->host_list)) { > + ret = -ENODEV; > + goto err; > + } > > return 0; > + > +err: > + clk_disable_unprepare(ctrl->clk); > + return ret; > + > } > EXPORT_SYMBOL_GPL(brcmnand_probe); > > @@ -2264,6 +2298,8 @@ int brcmnand_remove(struct platform_device *pdev) > list_for_each_entry(host, &ctrl->host_list, node) > nand_release(&host->mtd); > > + clk_disable_unprepare(ctrl->clk); > + > dev_set_drvdata(&pdev->dev, NULL); > > return 0; > -- Florian -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/