From mboxrd@z Thu Jan 1 00:00:00 1970 From: Florian Fainelli Subject: Re: [PATCH linux-next (v2) 2/3] mtd: brcmnand: Request and enable the clock if present Date: Wed, 9 Dec 2015 13:02:15 -0800 Message-ID: <566896D7.7060706@gmail.com> References: <566891DA.1050208@simon.arlott.org.uk> <56689231.5060907@simon.arlott.org.uk> Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: QUOTED-PRINTABLE Return-path: In-Reply-To: <56689231.5060907-qdVf85lJwsCyrPCCpiK2c/XRex20P6io@public.gmane.org> Sender: devicetree-owner-u79uwXL29TY76Z2rM5mHXA@public.gmane.org To: Simon Arlott , "devicetree-u79uwXL29TY76Z2rM5mHXA@public.gmane.org" , Brian Norris , Linux Kernel Mailing List , David Woodhouse , linux-mtd-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org Cc: Rob Herring , Pawel Moll , Mark Rutland , Ian Campbell , Kumar Gala , bcm-kernel-feedback-list-dY08KVG/lbpWk0Htik3J/w@public.gmane.org, Kamal Dasu , Jonas Gorski List-Id: devicetree@vger.kernel.org Le 09/12/2015 12:42, Simon Arlott a =C3=A9crit : > Attempt to enable a clock named "nand" as some SoCs have a clock for = the > controller that needs to be enabled. >=20 > Signed-off-by: Simon Arlott Reviewed-by: Florian Fainelli > --- > Resend, no changes. >=20 > drivers/mtd/nand/brcmnand/brcmnand.c | 64 ++++++++++++++++++++++++++= ++-------- > 1 file changed, 50 insertions(+), 14 deletions(-) >=20 > 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. > */ > =20 > +#include > #include > #include > #include > @@ -122,6 +123,9 @@ struct brcmnand_controller { > /* Some SoCs provide custom interrupt status register(s) */ > struct brcmnand_soc *soc; > =20 > + /* 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 *pd= ev, struct brcmnand_soc *soc) > if (IS_ERR(ctrl->nand_base)) > return PTR_ERR(ctrl->nand_base); > =20 > + /* Enable clock before using NAND registers */ > + ctrl->clk =3D devm_clk_get(dev, "nand"); > + if (!IS_ERR(ctrl->clk)) { > + ret =3D clk_prepare_enable(ctrl->clk); > + if (ret) > + return ret; > + } else { > + ret =3D PTR_ERR(ctrl->clk); > + if (ret =3D=3D -EPROBE_DEFER) > + return ret; > + > + ctrl->clk =3D NULL; > + } > + > /* Initialize NAND revision */ > ret =3D brcmnand_revision_init(ctrl); > if (ret) > - return ret; > + goto err; > =20 > /* > * Most chips have this cache at a fixed offset within 'nand' block= =2E > @@ -2139,8 +2157,10 @@ int brcmnand_probe(struct platform_device *pde= v, struct brcmnand_soc *soc) > res =3D platform_get_resource_byname(pdev, IORESOURCE_MEM, "nand-ca= che"); > if (res) { > ctrl->nand_fc =3D devm_ioremap_resource(dev, res); > - if (IS_ERR(ctrl->nand_fc)) > - return PTR_ERR(ctrl->nand_fc); > + if (IS_ERR(ctrl->nand_fc)) { > + ret =3D PTR_ERR(ctrl->nand_fc); > + goto err; > + } > } else { > ctrl->nand_fc =3D ctrl->nand_base + > ctrl->reg_offsets[BRCMNAND_FC_BASE]; > @@ -2150,8 +2170,10 @@ int brcmnand_probe(struct platform_device *pde= v, struct brcmnand_soc *soc) > res =3D platform_get_resource_byname(pdev, IORESOURCE_MEM, "flash-d= ma"); > if (res) { > ctrl->flash_dma_base =3D 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 =3D PTR_ERR(ctrl->flash_dma_base); > + goto err; > + } > =20 > 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 *pd= ev, struct brcmnand_soc *soc) > ctrl->dma_desc =3D dmam_alloc_coherent(dev, > sizeof(*ctrl->dma_desc), > &ctrl->dma_pa, GFP_KERNEL); > - if (!ctrl->dma_desc) > - return -ENOMEM; > + if (!ctrl->dma_desc) { > + ret =3D -ENOMEM; > + goto err; > + } > =20 > ctrl->dma_irq =3D platform_get_irq(pdev, 1); > if ((int)ctrl->dma_irq < 0) { > dev_err(dev, "missing FLASH_DMA IRQ\n"); > - return -ENODEV; > + ret =3D -ENODEV; > + goto err; > } > =20 > ret =3D 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; > } > =20 > dev_info(dev, "enabling FLASH_DMA\n"); > @@ -2199,7 +2224,8 @@ int brcmnand_probe(struct platform_device *pdev= , struct brcmnand_soc *soc) > ctrl->irq =3D platform_get_irq(pdev, 0); > if ((int)ctrl->irq < 0) { > dev_err(dev, "no IRQ defined\n"); > - return -ENODEV; > + ret =3D -ENODEV; > + goto err; > } > =20 > /* > @@ -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; > } > =20 > for_each_available_child_of_node(dn, child) { > @@ -2233,7 +2259,8 @@ int brcmnand_probe(struct platform_device *pdev= , struct brcmnand_soc *soc) > host =3D devm_kzalloc(dev, sizeof(*host), GFP_KERNEL); > if (!host) { > of_node_put(child); > - return -ENOMEM; > + ret =3D -ENOMEM; > + goto err; > } > host->pdev =3D pdev; > host->ctrl =3D ctrl; > @@ -2249,10 +2276,17 @@ int brcmnand_probe(struct platform_device *pd= ev, struct brcmnand_soc *soc) > } > =20 > /* No chip-selects could initialize properly */ > - if (list_empty(&ctrl->host_list)) > - return -ENODEV; > + if (list_empty(&ctrl->host_list)) { > + ret =3D -ENODEV; > + goto err; > + } > =20 > return 0; > + > +err: > + clk_disable_unprepare(ctrl->clk); > + return ret; > + > } > EXPORT_SYMBOL_GPL(brcmnand_probe); > =20 > @@ -2264,6 +2298,8 @@ int brcmnand_remove(struct platform_device *pde= v) > list_for_each_entry(host, &ctrl->host_list, node) > nand_release(&host->mtd); > =20 > + clk_disable_unprepare(ctrl->clk); > + > dev_set_drvdata(&pdev->dev, NULL); > =20 > return 0; >=20 --=20 =46lorian -- To unsubscribe from this list: send the line "unsubscribe devicetree" i= n the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org More majordomo info at http://vger.kernel.org/majordomo-info.html