* [PATCH v4 1/2] dt-bindings: mtd: renesas: Fix the NAND controller description
2022-05-13 10:49 [PATCH v4 0/2] mtd: rawnand: renesas: Runtime PM use Miquel Raynal
@ 2022-05-13 10:49 ` Miquel Raynal
2022-05-13 10:49 ` [PATCH v4 2/2] mtd: rawnand: renesas: Use runtime PM instead of the raw clock API Miquel Raynal
2022-05-16 16:43 ` [PATCH v4 0/2] mtd: rawnand: renesas: Runtime PM use Miquel Raynal
2 siblings, 0 replies; 5+ messages in thread
From: Miquel Raynal @ 2022-05-13 10:49 UTC (permalink / raw)
To: linux-renesas-soc, Magnus Damm, Gareth Williams, Phil Edworthy,
Geert Uytterhoeven, Richard Weinberger, Vignesh Raghavendra,
Tudor Ambarus, Pratyush Yadav, Michael Walle, linux-mtd
Cc: Rob Herring, Krzysztof Kozlowski, devicetree, Milan Stevanovic,
Jimmy Lalande, Pascal Eberhard, Thomas Petazzoni, Herve Codina,
Clement Leger, Miquel Raynal, Geert Uytterhoeven, Rob Herring
Add the missing power-domain property which is needed on all the
RZ/N1 SoC IPs.
Suggested-by: Geert Uytterhoeven <geert+renesas@glider.be>
Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
Reviewed-by: Geert Uytterhoeven <geert+renesas@glider.be>
Acked-by: Rob Herring <robh@kernel.org>
---
Documentation/devicetree/bindings/mtd/renesas-nandc.yaml | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/Documentation/devicetree/bindings/mtd/renesas-nandc.yaml b/Documentation/devicetree/bindings/mtd/renesas-nandc.yaml
index 2870d36361c4..7b18bc5cc8b3 100644
--- a/Documentation/devicetree/bindings/mtd/renesas-nandc.yaml
+++ b/Documentation/devicetree/bindings/mtd/renesas-nandc.yaml
@@ -36,11 +36,15 @@ properties:
- const: hclk
- const: eclk
+ power-domains:
+ maxItems: 1
+
required:
- compatible
- reg
- clocks
- clock-names
+ - power-domains
- interrupts
unevaluatedProperties: false
@@ -56,6 +60,7 @@ examples:
interrupts = <GIC_SPI 58 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&sysctrl R9A06G032_HCLK_NAND>, <&sysctrl R9A06G032_CLK_NAND>;
clock-names = "hclk", "eclk";
+ power-domains = <&sysctrl>;
#address-cells = <1>;
#size-cells = <0>;
};
--
2.27.0
______________________________________________________
Linux MTD discussion mailing list
http://lists.infradead.org/mailman/listinfo/linux-mtd/
^ permalink raw reply related [flat|nested] 5+ messages in thread* [PATCH v4 2/2] mtd: rawnand: renesas: Use runtime PM instead of the raw clock API
2022-05-13 10:49 [PATCH v4 0/2] mtd: rawnand: renesas: Runtime PM use Miquel Raynal
2022-05-13 10:49 ` [PATCH v4 1/2] dt-bindings: mtd: renesas: Fix the NAND controller description Miquel Raynal
@ 2022-05-13 10:49 ` Miquel Raynal
2022-05-13 17:16 ` Geert Uytterhoeven
2022-05-16 16:43 ` [PATCH v4 0/2] mtd: rawnand: renesas: Runtime PM use Miquel Raynal
2 siblings, 1 reply; 5+ messages in thread
From: Miquel Raynal @ 2022-05-13 10:49 UTC (permalink / raw)
To: linux-renesas-soc, Magnus Damm, Gareth Williams, Phil Edworthy,
Geert Uytterhoeven, Richard Weinberger, Vignesh Raghavendra,
Tudor Ambarus, Pratyush Yadav, Michael Walle, linux-mtd
Cc: Rob Herring, Krzysztof Kozlowski, devicetree, Milan Stevanovic,
Jimmy Lalande, Pascal Eberhard, Thomas Petazzoni, Herve Codina,
Clement Leger, Miquel Raynal
This NAND controller is part of a well defined power domain handled by
the runtime PM core. Let's keep the harmony with the other RZ/N1 drivers
and exclusively use the runtime PM API to enable/disable the clocks.
We still need to retrieve the external clock rate in order to derive the
NAND timings, but that is not a big deal, we can still do that in the
probe and just save this value to reuse it later.
Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
---
.../mtd/nand/raw/renesas-nand-controller.c | 51 +++++++++----------
1 file changed, 23 insertions(+), 28 deletions(-)
diff --git a/drivers/mtd/nand/raw/renesas-nand-controller.c b/drivers/mtd/nand/raw/renesas-nand-controller.c
index 6db063b230a9..1620e25a1147 100644
--- a/drivers/mtd/nand/raw/renesas-nand-controller.c
+++ b/drivers/mtd/nand/raw/renesas-nand-controller.c
@@ -16,6 +16,7 @@
#include <linux/mtd/rawnand.h>
#include <linux/of.h>
#include <linux/platform_device.h>
+#include <linux/pm_runtime.h>
#include <linux/slab.h>
#define COMMAND_REG 0x00
@@ -216,8 +217,7 @@ struct rnandc {
struct nand_controller controller;
struct device *dev;
void __iomem *regs;
- struct clk *hclk;
- struct clk *eclk;
+ unsigned long ext_clk_rate;
unsigned long assigned_cs;
struct list_head chips;
struct nand_chip *selected_chip;
@@ -891,7 +891,7 @@ static int rnandc_setup_interface(struct nand_chip *chip, int chipnr,
{
struct rnand_chip *rnand = to_rnand(chip);
struct rnandc *rnandc = to_rnandc(chip->controller);
- unsigned int period_ns = 1000000000 / clk_get_rate(rnandc->eclk);
+ unsigned int period_ns = 1000000000 / rnandc->ext_clk_rate;
const struct nand_sdr_timings *sdr;
unsigned int cyc, cle, ale, bef_dly, ca_to_data;
@@ -1319,6 +1319,7 @@ static int rnandc_chips_init(struct rnandc *rnandc)
static int rnandc_probe(struct platform_device *pdev)
{
struct rnandc *rnandc;
+ struct clk *eclk;
int irq, ret;
rnandc = devm_kzalloc(&pdev->dev, sizeof(*rnandc), GFP_KERNEL);
@@ -1335,29 +1336,26 @@ static int rnandc_probe(struct platform_device *pdev)
if (IS_ERR(rnandc->regs))
return PTR_ERR(rnandc->regs);
- /* APB clock */
- rnandc->hclk = devm_clk_get(&pdev->dev, "hclk");
- if (IS_ERR(rnandc->hclk))
- return PTR_ERR(rnandc->hclk);
-
- /* External NAND bus clock */
- rnandc->eclk = devm_clk_get(&pdev->dev, "eclk");
- if (IS_ERR(rnandc->eclk))
- return PTR_ERR(rnandc->eclk);
-
- ret = clk_prepare_enable(rnandc->hclk);
- if (ret)
+ devm_pm_runtime_enable(&pdev->dev);
+ ret = pm_runtime_resume_and_get(&pdev->dev);
+ if (ret < 0)
return ret;
- ret = clk_prepare_enable(rnandc->eclk);
- if (ret)
- goto disable_hclk;
+ /* The external NAND bus clock rate is needed for computing timings */
+ eclk = clk_get(&pdev->dev, "eclk");
+ if (IS_ERR(eclk)) {
+ ret = PTR_ERR(eclk);
+ goto dis_runtime_pm;
+ }
+
+ rnandc->ext_clk_rate = clk_get_rate(eclk);
+ clk_put(eclk);
rnandc_dis_interrupts(rnandc);
irq = platform_get_irq_optional(pdev, 0);
if (irq == -EPROBE_DEFER) {
ret = irq;
- goto disable_eclk;
+ goto dis_runtime_pm;
} else if (irq < 0) {
dev_info(&pdev->dev, "No IRQ found, fallback to polling\n");
rnandc->use_polling = true;
@@ -1365,12 +1363,12 @@ static int rnandc_probe(struct platform_device *pdev)
ret = devm_request_irq(&pdev->dev, irq, rnandc_irq_handler, 0,
"renesas-nand-controller", rnandc);
if (ret < 0)
- goto disable_eclk;
+ goto dis_runtime_pm;
}
ret = dma_set_mask(&pdev->dev, DMA_BIT_MASK(32));
if (ret)
- goto disable_eclk;
+ goto dis_runtime_pm;
rnandc_clear_fifo(rnandc);
@@ -1378,14 +1376,12 @@ static int rnandc_probe(struct platform_device *pdev)
ret = rnandc_chips_init(rnandc);
if (ret)
- goto disable_eclk;
+ goto dis_runtime_pm;
return 0;
-disable_eclk:
- clk_disable_unprepare(rnandc->eclk);
-disable_hclk:
- clk_disable_unprepare(rnandc->hclk);
+dis_runtime_pm:
+ pm_runtime_put(&pdev->dev);
return ret;
}
@@ -1396,8 +1392,7 @@ static int rnandc_remove(struct platform_device *pdev)
rnandc_chips_cleanup(rnandc);
- clk_disable_unprepare(rnandc->eclk);
- clk_disable_unprepare(rnandc->hclk);
+ pm_runtime_put(&pdev->dev);
return 0;
}
--
2.27.0
______________________________________________________
Linux MTD discussion mailing list
http://lists.infradead.org/mailman/listinfo/linux-mtd/
^ permalink raw reply related [flat|nested] 5+ messages in thread* Re: [PATCH v4 0/2] mtd: rawnand: renesas: Runtime PM use
2022-05-13 10:49 [PATCH v4 0/2] mtd: rawnand: renesas: Runtime PM use Miquel Raynal
2022-05-13 10:49 ` [PATCH v4 1/2] dt-bindings: mtd: renesas: Fix the NAND controller description Miquel Raynal
2022-05-13 10:49 ` [PATCH v4 2/2] mtd: rawnand: renesas: Use runtime PM instead of the raw clock API Miquel Raynal
@ 2022-05-16 16:43 ` Miquel Raynal
2 siblings, 0 replies; 5+ messages in thread
From: Miquel Raynal @ 2022-05-16 16:43 UTC (permalink / raw)
To: linux-renesas-soc, Magnus Damm, Gareth Williams, Phil Edworthy,
Geert Uytterhoeven, Richard Weinberger, Vignesh Raghavendra,
Tudor Ambarus, Pratyush Yadav, Michael Walle, linux-mtd
Cc: Rob Herring, Krzysztof Kozlowski, devicetree, Milan Stevanovic,
Jimmy Lalande, Pascal Eberhard, Thomas Petazzoni, Herve Codina,
Clement Leger
Hi,
miquel.raynal@bootlin.com wrote on Fri, 13 May 2022 12:49:55 +0200:
> There was a small mistake when first introducing this controller driver:
> the power-domain property was missing in the device tree because there
> was only one controller supported at this time (UART) and this is a
> Synopsis IP which did not support power domains. The idea is to always
> use these power domains when available, so let's add it to the bindings,
> the DT and use it from the driver through the runtimpe PM API instead of
> doing raw clk API calls.
>
> Changes in v4:
> * Use pm_runtime_resume_and_get() instead of pm_runtime_get_sync().
>
> Changes in v3:
> * Moved the pm_runtime calls earlier in the probe to avoid possible
> register accesses while the clocks have not yet been enabled.
>
> Changes in v2:
> * Dropped the DT patch merged by Geert.
> * Used devm_pm_runtime_enable() instead of pm_runtime_enable() and
> dropped the pm_runtime_disable() calls.
> * Used pm_runtime_resume_and_get() instead of pm_runtime_get_sync().
> * Collected the tags on the bindings.
>
> Miquel Raynal (2):
> dt-bindings: mtd: renesas: Fix the NAND controller description
> mtd: rawnand: renesas: Use runtime PM instead of the raw clock API
>
> .../bindings/mtd/renesas-nandc.yaml | 5 ++
> .../mtd/nand/raw/renesas-nand-controller.c | 51 +++++++++----------
> 2 files changed, 28 insertions(+), 28 deletions(-)
>
Series applied on nand/next.
Thanks,
Miquèl
______________________________________________________
Linux MTD discussion mailing list
http://lists.infradead.org/mailman/listinfo/linux-mtd/
^ permalink raw reply [flat|nested] 5+ messages in thread