* [PATCH v3 0/8] Add RZ/G3E SDHI support
@ 2025-02-06 13:40 Biju Das
2025-02-06 13:40 ` [PATCH v3 1/8] dt-bindings: mmc: renesas,sdhi: Document RZ/G3E support Biju Das
` (3 more replies)
0 siblings, 4 replies; 15+ messages in thread
From: Biju Das @ 2025-02-06 13:40 UTC (permalink / raw)
To: Ulf Hansson, Rob Herring, Krzysztof Kozlowski, Conor Dooley
Cc: Biju Das, Geert Uytterhoeven, Magnus Damm, Wolfram Sang,
linux-mmc, devicetree, linux-renesas-soc, Prabhakar Mahadev Lad,
Biju Das
The SD/MMC block on the RZ/G3E ("R9A09G047") SoC is similar to that
of the RZ/V2H, but the SD0 channel has only dedicated pins, so we must
use SD_STATUS register to control voltage and power enable (internal
regulator).
For SD1 and SD2 channel we can either use gpio regulator or internal
regulator (using SD_STATUS register) for voltage switching.
For SD0, fixed voltage(eMMC) uses fixed regulator and non-fixed voltage
(SD) uses internal regulator.
v2->v3:
* Collected tags
* Renamed internal regulator labels vqmmc_sdhi{0..2}->sdhi{0..2}_vqmmc.
* Updated regulator phandles on SoM/Board dts.
* Dropped renaming the gpio regulator label vqmmc_sdhi1->vqmmc_sdhi1_gpio.
* Renamed node sd0emmc->sd0-emmc
* Renamed sd0-emmc-{ctrl,data,rst}->sd0-{ctrl,data,rst}
* Moved header file gpio.h from patch#6 to patch#8.
* Dropped overriding internal regulator name.
* Dropped #if guard in pinctrl node for SDHI0
* Renamed the label/node sdhi0_pins: sd0->sdhi0_usd_pins: sd0-usd.
v1->v2:
* Collected tags.
* Documented internal regulator as optional property for both RZ/G3E and
RZ/V2H SoCs.
* Updated commit description for regulator used in SD0 fixed and
non-fixed voltage case in patch#3.
* As the node enabling of internal regulator is controlled through status,
added a check for device availability.
* Status of internal regulator is disabled in the SoC .dtsi. Override
the status in the board DTS when needed.
* Added support for enabling SDHI internal regulator in RZ/V2H
* Added missing header file gpio.h
* Used fixed regulator for eMMC on SD0 and dropped sd0-iovs pins for
eMMC.
* Sorted pinctrl nodes for sd2
* Enabled internal regulator for SD2.
* Added support for enabling SD on SDHI0
* Replaced the regulator usd_vdd_3p3v->reg_3p3v.
* Renamed the gpio-hog node sd1-pwr-en->sd1-pwr-en-hog.
* Sorted sd1 pin ctrl nodes.
Biju Das (8):
dt-bindings: mmc: renesas,sdhi: Document RZ/G3E support
mmc: renesas_sdhi: Arrange local variables in reverse xmas tree order
mmc: renesas_sdhi: Add support for RZ/G3E SoC
arm64: dts: renesas: r9a09g047: Add SDHI0-SDHI2 nodes
arm64: dts: renesas: r9a09g057: Add support for enabling SDHI internal
regulator
arm64: dts: renesas: rzg3e-smarc-som: Enable SDHI{0,2}
arm64: dts: renesas: rzg3e-smarc-som: Add support for enable SD on
SDHI0
arm64: dts: renesas: r9a09g047e57-smarc: Enable SDHI1
.../devicetree/bindings/mmc/renesas,sdhi.yaml | 16 ++
arch/arm64/boot/dts/renesas/r9a09g047.dtsi | 60 +++++++
.../boot/dts/renesas/r9a09g047e57-smarc.dts | 49 ++++++
arch/arm64/boot/dts/renesas/r9a09g057.dtsi | 21 +++
.../boot/dts/renesas/renesas-smarc2.dtsi | 18 ++
.../boot/dts/renesas/rzg3e-smarc-som.dtsi | 154 ++++++++++++++++++
drivers/mmc/host/renesas_sdhi.h | 1 +
drivers/mmc/host/renesas_sdhi_core.c | 136 +++++++++++++++-
drivers/mmc/host/tmio_mmc.h | 5 +
9 files changed, 459 insertions(+), 1 deletion(-)
--
2.43.0
^ permalink raw reply [flat|nested] 15+ messages in thread* [PATCH v3 1/8] dt-bindings: mmc: renesas,sdhi: Document RZ/G3E support 2025-02-06 13:40 [PATCH v3 0/8] Add RZ/G3E SDHI support Biju Das @ 2025-02-06 13:40 ` Biju Das 2025-02-06 13:40 ` [PATCH v3 2/8] mmc: renesas_sdhi: Arrange local variables in reverse xmas tree order Biju Das ` (2 subsequent siblings) 3 siblings, 0 replies; 15+ messages in thread From: Biju Das @ 2025-02-06 13:40 UTC (permalink / raw) To: Ulf Hansson, Rob Herring, Krzysztof Kozlowski, Conor Dooley Cc: Biju Das, Geert Uytterhoeven, Magnus Damm, Wolfram Sang, linux-mmc, devicetree, linux-renesas-soc, Prabhakar Mahadev Lad, Biju Das, Conor Dooley The SD/MMC block on the RZ/G3E ("R9A09G047") SoC is similar to that of the RZ/V2H, but the SD0 channel has only dedicated pins, so we must use SD_STATUS register to control voltage and power enable (internal regulator), for non-fixed voltage (SD) MMC interface. However, it is optional for fixed voltage MMC interface (eMMC). For SD1 and SD2 channels, we can either use gpio regulator or internal regulator (using SD_STATUS register) for voltage switching. Document RZ/G3E SDHI IP support with optional internal regulator for both RZ/G3E and RZ/V2H SoC. Signed-off-by: Biju Das <biju.das.jz@bp.renesas.com> Acked-by: Conor Dooley <conor.dooley@microchip.com> Reviewed-by: Geert Uytterhoeven <geert+renesas@glider.be> --- v2->v3: * Collected tags. v1->v2: * Dropped tags. * Documented internal regulator as optional property for both RZ/G3E and RZ/V2H SoCs. --- .../devicetree/bindings/mmc/renesas,sdhi.yaml | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/Documentation/devicetree/bindings/mmc/renesas,sdhi.yaml b/Documentation/devicetree/bindings/mmc/renesas,sdhi.yaml index af378b9ff3f4..773baa6c2656 100644 --- a/Documentation/devicetree/bindings/mmc/renesas,sdhi.yaml +++ b/Documentation/devicetree/bindings/mmc/renesas,sdhi.yaml @@ -68,6 +68,9 @@ properties: - renesas,sdhi-r9a08g045 # RZ/G3S - renesas,sdhi-r9a09g011 # RZ/V2M - const: renesas,rzg2l-sdhi + - items: + - const: renesas,sdhi-r9a09g047 # RZ/G3E + - const: renesas,sdhi-r9a09g057 # RZ/V2H(P) reg: maxItems: 1 @@ -211,6 +214,19 @@ allOf: sectioned off to be run by a separate second clock source to allow the main core clock to be turned off to save power. + - if: + properties: + compatible: + contains: + const: renesas,sdhi-r9a09g057 + then: + properties: + vqmmc-regulator: + type: object + description: VQMMC SD regulator + $ref: /schemas/regulator/regulator.yaml# + unevaluatedProperties: false + required: - compatible - reg -- 2.43.0 ^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH v3 2/8] mmc: renesas_sdhi: Arrange local variables in reverse xmas tree order 2025-02-06 13:40 [PATCH v3 0/8] Add RZ/G3E SDHI support Biju Das 2025-02-06 13:40 ` [PATCH v3 1/8] dt-bindings: mmc: renesas,sdhi: Document RZ/G3E support Biju Das @ 2025-02-06 13:40 ` Biju Das 2025-02-28 9:36 ` Wolfram Sang 2025-02-06 13:40 ` [PATCH v3 3/8] mmc: renesas_sdhi: Add support for RZ/G3E SoC Biju Das 2025-02-20 7:11 ` [PATCH v3 0/8] Add RZ/G3E SDHI support Biju Das 3 siblings, 1 reply; 15+ messages in thread From: Biju Das @ 2025-02-06 13:40 UTC (permalink / raw) To: Ulf Hansson Cc: Biju Das, Wolfram Sang, linux-mmc, linux-renesas-soc, Geert Uytterhoeven, Prabhakar Mahadev Lad, Biju Das, Tommaso Merciai Arrange local variables in reverse xmas tree for probe(). Reviewed-by: Tommaso Merciai <tommaso.merciai.xr@bp.renesas.com> Reviewed-by: Geert Uytterhoeven <geert+renesas@glider.be> Signed-off-by: Biju Das <biju.das.jz@bp.renesas.com> --- v2->v3: * No change. v1->v2: * Collected tags. --- drivers/mmc/host/renesas_sdhi_core.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/mmc/host/renesas_sdhi_core.c b/drivers/mmc/host/renesas_sdhi_core.c index f73b84bae0c4..6ea651409774 100644 --- a/drivers/mmc/host/renesas_sdhi_core.c +++ b/drivers/mmc/host/renesas_sdhi_core.c @@ -910,8 +910,8 @@ int renesas_sdhi_probe(struct platform_device *pdev, const struct renesas_sdhi_quirks *quirks) { struct tmio_mmc_data *mmd = pdev->dev.platform_data; - struct tmio_mmc_data *mmc_data; struct renesas_sdhi_dma *dma_priv; + struct tmio_mmc_data *mmc_data; struct tmio_mmc_host *host; struct renesas_sdhi *priv; int num_irqs, irq, ret, i; -- 2.43.0 ^ permalink raw reply related [flat|nested] 15+ messages in thread
* Re: [PATCH v3 2/8] mmc: renesas_sdhi: Arrange local variables in reverse xmas tree order 2025-02-06 13:40 ` [PATCH v3 2/8] mmc: renesas_sdhi: Arrange local variables in reverse xmas tree order Biju Das @ 2025-02-28 9:36 ` Wolfram Sang 2025-02-28 10:51 ` Biju Das 0 siblings, 1 reply; 15+ messages in thread From: Wolfram Sang @ 2025-02-28 9:36 UTC (permalink / raw) To: Biju Das Cc: Ulf Hansson, linux-mmc, linux-renesas-soc, Geert Uytterhoeven, Prabhakar Mahadev Lad, Biju Das, Tommaso Merciai [-- Attachment #1: Type: text/plain, Size: 226 bytes --] > struct tmio_mmc_data *mmd = pdev->dev.platform_data; > - struct tmio_mmc_data *mmc_data; > struct renesas_sdhi_dma *dma_priv; > + struct tmio_mmc_data *mmc_data; I'd prefer to have the same types close to each other. [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 833 bytes --] ^ permalink raw reply [flat|nested] 15+ messages in thread
* RE: [PATCH v3 2/8] mmc: renesas_sdhi: Arrange local variables in reverse xmas tree order 2025-02-28 9:36 ` Wolfram Sang @ 2025-02-28 10:51 ` Biju Das 0 siblings, 0 replies; 15+ messages in thread From: Biju Das @ 2025-02-28 10:51 UTC (permalink / raw) To: Wolfram Sang Cc: Ulf Hansson, linux-mmc@vger.kernel.org, linux-renesas-soc@vger.kernel.org, Geert Uytterhoeven, Prabhakar Mahadev Lad, biju.das.au, Tommaso Merciai Hi Wolfram, Thanks for the feedback. > -----Original Message----- > From: Wolfram Sang <wsa+renesas@sang-engineering.com> > Sent: 28 February 2025 09:36 > Subject: Re: [PATCH v3 2/8] mmc: renesas_sdhi: Arrange local variables in reverse xmas tree order > > > > struct tmio_mmc_data *mmd = pdev->dev.platform_data; > > - struct tmio_mmc_data *mmc_data; > > struct renesas_sdhi_dma *dma_priv; > > + struct tmio_mmc_data *mmc_data; > > I'd prefer to have the same types close to each other. OK, will drop this patch. Cheers, Biju ^ permalink raw reply [flat|nested] 15+ messages in thread
* [PATCH v3 3/8] mmc: renesas_sdhi: Add support for RZ/G3E SoC 2025-02-06 13:40 [PATCH v3 0/8] Add RZ/G3E SDHI support Biju Das 2025-02-06 13:40 ` [PATCH v3 1/8] dt-bindings: mmc: renesas,sdhi: Document RZ/G3E support Biju Das 2025-02-06 13:40 ` [PATCH v3 2/8] mmc: renesas_sdhi: Arrange local variables in reverse xmas tree order Biju Das @ 2025-02-06 13:40 ` Biju Das 2025-02-27 15:16 ` Wolfram Sang 2025-02-28 9:42 ` Wolfram Sang 2025-02-20 7:11 ` [PATCH v3 0/8] Add RZ/G3E SDHI support Biju Das 3 siblings, 2 replies; 15+ messages in thread From: Biju Das @ 2025-02-06 13:40 UTC (permalink / raw) To: Ulf Hansson Cc: Biju Das, Wolfram Sang, linux-mmc, linux-renesas-soc, Geert Uytterhoeven, Prabhakar Mahadev Lad, Biju Das The SDHI/eMMC IPs in the RZ/G3E SoC are similar to those in R-Car Gen3. However, the RZ/G3E SD0 channel has Voltage level control and PWEN pin support via SD_STATUS register. internal regulator support is added to control the voltage levels of the SD pins via sd_iovs/sd_pwen bits in SD_STATUS register by populating vqmmc-regulator child node. SD1 and SD2 channels have gpio regulator support and internal regulator support. Selection of the regulator is based on the regulator phandle. Similar case for SD0 fixed voltage (eMMC) that uses fixed regulator and SD0 non-fixed voltage (SD0) that uses internal regulator. Signed-off-by: Biju Das <biju.das.jz@bp.renesas.com> --- v2->v3: * No change. v1->v2: * Updated commit description for regulator used in SD0 fixed and non-fixed voltage case. * As the node enabling of internal regulator is controlled through status, added a check for device availability. --- drivers/mmc/host/renesas_sdhi.h | 1 + drivers/mmc/host/renesas_sdhi_core.c | 134 +++++++++++++++++++++++++++ drivers/mmc/host/tmio_mmc.h | 5 + 3 files changed, 140 insertions(+) diff --git a/drivers/mmc/host/renesas_sdhi.h b/drivers/mmc/host/renesas_sdhi.h index f12a87442338..291ddb4ad9be 100644 --- a/drivers/mmc/host/renesas_sdhi.h +++ b/drivers/mmc/host/renesas_sdhi.h @@ -95,6 +95,7 @@ struct renesas_sdhi { struct reset_control *rstc; struct tmio_mmc_host *host; + struct regulator_dev *rdev; }; #define host_to_priv(host) \ diff --git a/drivers/mmc/host/renesas_sdhi_core.c b/drivers/mmc/host/renesas_sdhi_core.c index 6ea651409774..99700d89aa8c 100644 --- a/drivers/mmc/host/renesas_sdhi_core.c +++ b/drivers/mmc/host/renesas_sdhi_core.c @@ -32,6 +32,8 @@ #include <linux/platform_device.h> #include <linux/pm_domain.h> #include <linux/regulator/consumer.h> +#include <linux/regulator/driver.h> +#include <linux/regulator/of_regulator.h> #include <linux/reset.h> #include <linux/sh_dma.h> #include <linux/slab.h> @@ -581,12 +583,24 @@ static void renesas_sdhi_reset(struct tmio_mmc_host *host, bool preserve) if (!preserve) { if (priv->rstc) { + u32 sd_status; + /* + * HW reset might have toggled the regulator state in + * HW which regulator core might be unaware of so save + * and restore the regulator state during HW reset. + */ + if (priv->rdev) + sd_ctrl_read32_rep(host, CTL_SD_STATUS, &sd_status, 1); + reset_control_reset(priv->rstc); /* Unknown why but without polling reset status, it will hang */ read_poll_timeout(reset_control_status, ret, ret == 0, 1, 100, false, priv->rstc); /* At least SDHI_VER_GEN2_SDR50 needs manual release of reset */ sd_ctrl_write16(host, CTL_RESET_SD, 0x0001); + if (priv->rdev) + sd_ctrl_write32(host, CTL_SD_STATUS, sd_status); + priv->needs_adjust_hs400 = false; renesas_sdhi_set_clock(host, host->clk_cache); @@ -904,15 +918,113 @@ static void renesas_sdhi_enable_dma(struct tmio_mmc_host *host, bool enable) renesas_sdhi_sdbuf_width(host, enable ? width : 16); } +static const unsigned int renesas_sdhi_vqmmc_voltages[] = { + 3300000, 1800000 +}; + +static int renesas_sdhi_regulator_disable(struct regulator_dev *rdev) +{ + struct tmio_mmc_host *host = rdev_get_drvdata(rdev); + u32 sd_status; + + sd_ctrl_read32_rep(host, CTL_SD_STATUS, &sd_status, 1); + sd_status &= ~SD_STATUS_PWEN; + sd_ctrl_write32(host, CTL_SD_STATUS, sd_status); + + return 0; +} + +static int renesas_sdhi_regulator_enable(struct regulator_dev *rdev) +{ + struct tmio_mmc_host *host = rdev_get_drvdata(rdev); + u32 sd_status; + + sd_ctrl_read32_rep(host, CTL_SD_STATUS, &sd_status, 1); + sd_status |= SD_STATUS_PWEN; + sd_ctrl_write32(host, CTL_SD_STATUS, sd_status); + + return 0; +} + +static int renesas_sdhi_regulator_is_enabled(struct regulator_dev *rdev) +{ + struct tmio_mmc_host *host = rdev_get_drvdata(rdev); + u32 sd_status; + + sd_ctrl_read32_rep(host, CTL_SD_STATUS, &sd_status, 1); + + return (sd_status & SD_STATUS_PWEN) ? 1 : 0; +} + +static int renesas_sdhi_regulator_get_voltage(struct regulator_dev *rdev) +{ + struct tmio_mmc_host *host = rdev_get_drvdata(rdev); + u32 sd_status; + + sd_ctrl_read32_rep(host, CTL_SD_STATUS, &sd_status, 1); + + return (sd_status & SD_STATUS_IOVS) ? 1800000 : 3300000; +} + +static int renesas_sdhi_regulator_set_voltage(struct regulator_dev *rdev, + int min_uV, int max_uV, + unsigned int *selector) +{ + struct tmio_mmc_host *host = rdev_get_drvdata(rdev); + u32 sd_status; + + sd_ctrl_read32_rep(host, CTL_SD_STATUS, &sd_status, 1); + if (min_uV >= 1700000 && max_uV <= 1950000) { + sd_status |= SD_STATUS_IOVS; + *selector = 1; + } else { + sd_status &= ~SD_STATUS_IOVS; + *selector = 0; + } + sd_ctrl_write32(host, CTL_SD_STATUS, sd_status); + + return 0; +} + +static int renesas_sdhi_regulator_list_voltage(struct regulator_dev *rdev, + unsigned int selector) +{ + if (selector >= ARRAY_SIZE(renesas_sdhi_vqmmc_voltages)) + return -EINVAL; + + return renesas_sdhi_vqmmc_voltages[selector]; +} + +static const struct regulator_ops renesas_sdhi_regulator_voltage_ops = { + .enable = renesas_sdhi_regulator_enable, + .disable = renesas_sdhi_regulator_disable, + .is_enabled = renesas_sdhi_regulator_is_enabled, + .list_voltage = renesas_sdhi_regulator_list_voltage, + .get_voltage = renesas_sdhi_regulator_get_voltage, + .set_voltage = renesas_sdhi_regulator_set_voltage, +}; + +static struct regulator_desc renesas_sdhi_vqmmc_regulator = { + .of_match = of_match_ptr("vqmmc-regulator"), + .owner = THIS_MODULE, + .type = REGULATOR_VOLTAGE, + .ops = &renesas_sdhi_regulator_voltage_ops, + .volt_table = renesas_sdhi_vqmmc_voltages, + .n_voltages = ARRAY_SIZE(renesas_sdhi_vqmmc_voltages), +}; + int renesas_sdhi_probe(struct platform_device *pdev, const struct tmio_mmc_dma_ops *dma_ops, const struct renesas_sdhi_of_data *of_data, const struct renesas_sdhi_quirks *quirks) { + struct regulator_config rcfg = { .dev = &pdev->dev, }; struct tmio_mmc_data *mmd = pdev->dev.platform_data; struct renesas_sdhi_dma *dma_priv; + struct device *dev = &pdev->dev; struct tmio_mmc_data *mmc_data; struct tmio_mmc_host *host; + struct regulator_dev *rdev; struct renesas_sdhi *priv; int num_irqs, irq, ret, i; struct resource *res; @@ -1053,6 +1165,28 @@ int renesas_sdhi_probe(struct platform_device *pdev, if (ret) goto efree; + rcfg.of_node = of_get_child_by_name(dev->of_node, "vqmmc-regulator"); + if (!of_device_is_available(rcfg.of_node)) { + of_node_put(rcfg.of_node); + rcfg.of_node = NULL; + } + + if (rcfg.of_node) { + rcfg.driver_data = priv->host; + + renesas_sdhi_vqmmc_regulator.name = "sdhi-vqmmc-regulator"; + renesas_sdhi_vqmmc_regulator.of_match = of_match_ptr("vqmmc-regulator"); + renesas_sdhi_vqmmc_regulator.type = REGULATOR_VOLTAGE; + renesas_sdhi_vqmmc_regulator.owner = THIS_MODULE; + rdev = devm_regulator_register(dev, &renesas_sdhi_vqmmc_regulator, &rcfg); + of_node_put(rcfg.of_node); + if (IS_ERR(rdev)) { + dev_err(dev, "regulator register failed err=%ld", PTR_ERR(rdev)); + goto efree; + } + priv->rdev = rdev; + } + ver = sd_ctrl_read16(host, CTL_VERSION); /* GEN2_SDR104 is first known SDHI to use 32bit block count */ if (ver < SDHI_VER_GEN2_SDR104 && mmc_data->max_blk_count > U16_MAX) diff --git a/drivers/mmc/host/tmio_mmc.h b/drivers/mmc/host/tmio_mmc.h index a75755f31d31..5970ca598850 100644 --- a/drivers/mmc/host/tmio_mmc.h +++ b/drivers/mmc/host/tmio_mmc.h @@ -44,6 +44,7 @@ #define CTL_RESET_SD 0xe0 #define CTL_VERSION 0xe2 #define CTL_SDIF_MODE 0xe6 /* only known on R-Car 2+ */ +#define CTL_SD_STATUS 0xf2 /* only known on RZ/{G2L,G3E,V2H} */ /* Definitions for values the CTL_STOP_INTERNAL_ACTION register can take */ #define TMIO_STOP_STP BIT(0) @@ -103,6 +104,10 @@ /* Definitions for values the CTL_SDIF_MODE register can take */ #define SDIF_MODE_HS400 BIT(0) /* only known on R-Car 2+ */ +/* Definitions for values the CTL_SD_STATUS register can take */ +#define SD_STATUS_PWEN BIT(0) /* only known on RZ/{G3E,V2H} */ +#define SD_STATUS_IOVS BIT(16) /* only known on RZ/{G3E,V2H} */ + /* Define some IRQ masks */ /* This is the mask used at reset by the chip */ #define TMIO_MASK_ALL 0x837f031d -- 2.43.0 ^ permalink raw reply related [flat|nested] 15+ messages in thread
* Re: [PATCH v3 3/8] mmc: renesas_sdhi: Add support for RZ/G3E SoC 2025-02-06 13:40 ` [PATCH v3 3/8] mmc: renesas_sdhi: Add support for RZ/G3E SoC Biju Das @ 2025-02-27 15:16 ` Wolfram Sang 2025-02-27 15:29 ` Biju Das 2025-02-28 7:23 ` Biju Das 2025-02-28 9:42 ` Wolfram Sang 1 sibling, 2 replies; 15+ messages in thread From: Wolfram Sang @ 2025-02-27 15:16 UTC (permalink / raw) To: Biju Das Cc: Ulf Hansson, linux-mmc, linux-renesas-soc, Geert Uytterhoeven, Prabhakar Mahadev Lad, Biju Das [-- Attachment #1: Type: text/plain, Size: 369 bytes --] > + /* > + * HW reset might have toggled the regulator state in > + * HW which regulator core might be unaware of so save > + * and restore the regulator state during HW reset. > + */ Since this is a hard reset, can't we just reset the regulator to an initial state? It seems strange to preserve a value when the 'preserve' flag is explicitly not set. [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 833 bytes --] ^ permalink raw reply [flat|nested] 15+ messages in thread
* RE: [PATCH v3 3/8] mmc: renesas_sdhi: Add support for RZ/G3E SoC 2025-02-27 15:16 ` Wolfram Sang @ 2025-02-27 15:29 ` Biju Das 2025-02-27 16:27 ` Biju Das 2025-02-28 7:23 ` Biju Das 1 sibling, 1 reply; 15+ messages in thread From: Biju Das @ 2025-02-27 15:29 UTC (permalink / raw) To: Wolfram Sang Cc: Ulf Hansson, linux-mmc@vger.kernel.org, linux-renesas-soc@vger.kernel.org, Geert Uytterhoeven, Prabhakar Mahadev Lad, biju.das.au Hi Wolfram, Thanks for the feedback. > -----Original Message----- > From: Wolfram Sang <wsa+renesas@sang-engineering.com> > Sent: 27 February 2025 15:16 > Subject: Re: [PATCH v3 3/8] mmc: renesas_sdhi: Add support for RZ/G3E SoC > > > > + /* > > + * HW reset might have toggled the regulator state in > > + * HW which regulator core might be unaware of so save > > + * and restore the regulator state during HW reset. > > + */ > > Since this is a hard reset, can't we just reset the regulator to an initial state? It seems strange to > preserve a value when the 'preserve' flag is explicitly not set. Assume, this happens after the card is switched to UHS state and then the command won't work in UHS state if we bring the regulator initial state of 3.3V , In external regulator case, we don't toggle the regulator to initial state of 3.3V. That is the reason it is still working even when hard reset is applied in UHS state. Am I missing anything please let me know? I can debug further. Cheers, Biju ^ permalink raw reply [flat|nested] 15+ messages in thread
* RE: [PATCH v3 3/8] mmc: renesas_sdhi: Add support for RZ/G3E SoC 2025-02-27 15:29 ` Biju Das @ 2025-02-27 16:27 ` Biju Das 2025-02-27 19:02 ` Biju Das 0 siblings, 1 reply; 15+ messages in thread From: Biju Das @ 2025-02-27 16:27 UTC (permalink / raw) To: Biju Das, Wolfram Sang Cc: Ulf Hansson, linux-mmc@vger.kernel.org, linux-renesas-soc@vger.kernel.org, Geert Uytterhoeven, Prabhakar Mahadev Lad, biju.das.au Hi Wolfram, > -----Original Message----- > From: Biju Das <biju.das.jz@bp.renesas.com> > Sent: 27 February 2025 15:30 > Subject: RE: [PATCH v3 3/8] mmc: renesas_sdhi: Add support for RZ/G3E SoC > > Hi Wolfram, > > Thanks for the feedback. > > > -----Original Message----- > > From: Wolfram Sang <wsa+renesas@sang-engineering.com> > > Sent: 27 February 2025 15:16 > > Subject: Re: [PATCH v3 3/8] mmc: renesas_sdhi: Add support for RZ/G3E > > SoC > > > > > > > + /* > > > + * HW reset might have toggled the regulator state in > > > + * HW which regulator core might be unaware of so save > > > + * and restore the regulator state during HW reset. > > > + */ > > > > Since this is a hard reset, can't we just reset the regulator to an > > initial state? It seems strange to preserve a value when the 'preserve' flag is explicitly not set. > > Assume, this happens after the card is switched to UHS state and then the command won't work in UHS > state if we bring the regulator initial state of 3.3V , > > In external regulator case, we don't toggle the regulator to initial state of 3.3V. > That is the reason it is still working even when hard reset is applied in UHS state. > > Am I missing anything please let me know? I can debug further. Previously I got an issue, where the card was unable to detect after hot removal and plug. Now it is working without this change. Not sure the previous issue related to delay associated with hard reset. I am doing more testing without this change. Cheers, Biju ^ permalink raw reply [flat|nested] 15+ messages in thread
* RE: [PATCH v3 3/8] mmc: renesas_sdhi: Add support for RZ/G3E SoC 2025-02-27 16:27 ` Biju Das @ 2025-02-27 19:02 ` Biju Das 0 siblings, 0 replies; 15+ messages in thread From: Biju Das @ 2025-02-27 19:02 UTC (permalink / raw) To: Wolfram Sang Cc: Ulf Hansson, linux-mmc@vger.kernel.org, linux-renesas-soc@vger.kernel.org, Geert Uytterhoeven, Prabhakar Mahadev Lad, biju.das.au Hi Wolfram, > -----Original Message----- > From: Biju Das > Sent: 27 February 2025 16:27 > Subject: RE: [PATCH v3 3/8] mmc: renesas_sdhi: Add support for RZ/G3E SoC > > Hi Wolfram, > > > -----Original Message----- > > From: Biju Das <biju.das.jz@bp.renesas.com> > > Sent: 27 February 2025 15:30 > > Subject: RE: [PATCH v3 3/8] mmc: renesas_sdhi: Add support for RZ/G3E > > SoC > > > > Hi Wolfram, > > > > Thanks for the feedback. > > > > > -----Original Message----- > > > From: Wolfram Sang <wsa+renesas@sang-engineering.com> > > > Sent: 27 February 2025 15:16 > > > Subject: Re: [PATCH v3 3/8] mmc: renesas_sdhi: Add support for > > > RZ/G3E SoC > > > > > > > > > > + /* > > > > + * HW reset might have toggled the regulator state in > > > > + * HW which regulator core might be unaware of so save > > > > + * and restore the regulator state during HW reset. > > > > + */ > > > > > > Since this is a hard reset, can't we just reset the regulator to an > > > initial state? It seems strange to preserve a value when the 'preserve' flag is explicitly not > set. > > > > Assume, this happens after the card is switched to UHS state and then > > the command won't work in UHS state if we bring the regulator initial > > state of 3.3V , > > > > In external regulator case, we don't toggle the regulator to initial state of 3.3V. > > That is the reason it is still working even when hard reset is applied in UHS state. > > > > Am I missing anything please let me know? I can debug further. > > Previously I got an issue, where the card was unable to detect after hot removal and plug. > Now it is working without this change. > > Not sure the previous issue related to delay associated with hard reset. > I am doing more testing without this change. I have added some debug code[1], with SDHI1 using internal regulator as it is easy to do insert/removal of SD cards: Without the regulator register restore code hot removal/plug: ------------------------------------------------------------- root@smarc-rzg3e:~# [ 31.400277] mmc1: card aaaa removed [ 31.450751] renesas_sdhi_internal_dmac 15c10000.mmc: #####renesas_sdhi_reset 595 sd_status before reset=10000 [ 31.460812] renesas_sdhi_internal_dmac 15c10000.mmc: #####renesas_sdhi_reset 607 sd_status after reset=1 [ 35.811808] SDHI1-VQMMC: disabling [ 36.526838] renesas_sdhi_internal_dmac 15c10000.mmc: #####renesas_sdhi_reset 595 sd_status before reset=0 [ 36.536642] renesas_sdhi_internal_dmac 15c10000.mmc: #####renesas_sdhi_reset 607 sd_status after reset=1 [ 39.322682] renesas_sdhi_internal_dmac 15c10000.mmc: #####renesas_sdhi_reset 607 sd_status after reset=1 [ 39.361826] mmc1: Skipping voltage switch [ 39.610915] mmc1: new high speed SDHC card at address aaaa [ 39.618237] mmcblk1: mmc1:aaaa SE32G 29.7 GiB [ 39.629668] mmcblk1: p1 With the regulator register restore code hot removal/plug: -------------------------------------------------------- root@smarc-rzg3e:~# [ 23.886933] mmc1: card aaaa removed [ 23.937416] renesas_sdhi_internal_dmac 15c10000.mmc: #####renesas_sdhi_reset 595 sd_status before reset=10000 [ 25.581984] mmc1: new UHS-I speed SDR104 SDHC card at address aaaa [ 25.589989] mmcblk1: mmc1:aaaa SE32G 29.7 GiB [ 25.600507] mmcblk1: p1 root@smarc-rzg3e:~# Please share your thoughts. [1] + dev_err(&host->pdev->dev,"#####%s %d sd_status before reset=%x",__func__,__LINE__, sd_status); reset_control_reset(priv->rstc); /* Unknown why but without polling reset status, it will hang */ read_poll_timeout(reset_control_status, ret, ret == 0, 1, 100, @@ -599,8 +602,13 @@ static void renesas_sdhi_reset(struct tmio_mmc_host *host, bool preserve) /* At least SDHI_VER_GEN2_SDR50 needs manual release of reset */ sd_ctrl_write16(host, CTL_RESET_SD, 0x0001); if (priv->rdev) - sd_ctrl_write32(host, CTL_SD_STATUS, sd_status); + sd_ctrl_read32_rep(host, CTL_SD_STATUS, &sd_status, 1); + + dev_err(&host->pdev->dev,"#####%s %d sd_status after reset=%x",__func__,__LINE__, sd_status); Cheers, Biju ^ permalink raw reply [flat|nested] 15+ messages in thread
* RE: [PATCH v3 3/8] mmc: renesas_sdhi: Add support for RZ/G3E SoC 2025-02-27 15:16 ` Wolfram Sang 2025-02-27 15:29 ` Biju Das @ 2025-02-28 7:23 ` Biju Das 2025-02-28 9:15 ` Wolfram Sang 1 sibling, 1 reply; 15+ messages in thread From: Biju Das @ 2025-02-28 7:23 UTC (permalink / raw) To: Wolfram Sang Cc: Ulf Hansson, linux-mmc@vger.kernel.org, linux-renesas-soc@vger.kernel.org, Geert Uytterhoeven, Prabhakar Mahadev Lad, biju.das.au Hi Wolfram, > -----Original Message----- > From: Wolfram Sang <wsa+renesas@sang-engineering.com> > Sent: 27 February 2025 15:16 > Subject: Re: [PATCH v3 3/8] mmc: renesas_sdhi: Add support for RZ/G3E SoC > > > > + /* > > + * HW reset might have toggled the regulator state in > > + * HW which regulator core might be unaware of so save > > + * and restore the regulator state during HW reset. > > + */ > > Since this is a hard reset, can't we just reset the regulator to an initial state? It seems strange to > preserve a value when the 'preserve' flag is explicitly not set. For internal regulator case this also works OK. In this case, we don't need to preserve the value. This avoids changing internal vqmmc regulator from 1.8V to 3.3V during UHS state. Currently hardware reset causes vqmmc regulator to change from 1.8V to 3.3V. - if (!preserve) { + if (!preserve && !priv->rdev) { Please share your thoughts. Cheers, Biju ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH v3 3/8] mmc: renesas_sdhi: Add support for RZ/G3E SoC 2025-02-28 7:23 ` Biju Das @ 2025-02-28 9:15 ` Wolfram Sang 0 siblings, 0 replies; 15+ messages in thread From: Wolfram Sang @ 2025-02-28 9:15 UTC (permalink / raw) To: Biju Das Cc: Ulf Hansson, linux-mmc@vger.kernel.org, linux-renesas-soc@vger.kernel.org, Geert Uytterhoeven, Prabhakar Mahadev Lad, biju.das.au [-- Attachment #1: Type: text/plain, Size: 249 bytes --] > - if (!preserve) { > + if (!preserve && !priv->rdev) { '!preserve' basically means a hard reset is requested. We should then try hard to actually do a hard reset and not only a soft reset. So, this approach is the wrong path IMHO. [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 833 bytes --] ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH v3 3/8] mmc: renesas_sdhi: Add support for RZ/G3E SoC 2025-02-06 13:40 ` [PATCH v3 3/8] mmc: renesas_sdhi: Add support for RZ/G3E SoC Biju Das 2025-02-27 15:16 ` Wolfram Sang @ 2025-02-28 9:42 ` Wolfram Sang 2025-02-28 10:50 ` Biju Das 1 sibling, 1 reply; 15+ messages in thread From: Wolfram Sang @ 2025-02-28 9:42 UTC (permalink / raw) To: Biju Das Cc: Ulf Hansson, linux-mmc, linux-renesas-soc, Geert Uytterhoeven, Prabhakar Mahadev Lad, Biju Das [-- Attachment #1: Type: text/plain, Size: 1041 bytes --] On Thu, Feb 06, 2025 at 01:40:27PM +0000, Biju Das wrote: > The SDHI/eMMC IPs in the RZ/G3E SoC are similar to those in R-Car Gen3. > However, the RZ/G3E SD0 channel has Voltage level control and PWEN pin > support via SD_STATUS register. > > internal regulator support is added to control the voltage levels of > the SD pins via sd_iovs/sd_pwen bits in SD_STATUS register by populating > vqmmc-regulator child node. > > SD1 and SD2 channels have gpio regulator support and internal regulator > support. Selection of the regulator is based on the regulator phandle. > Similar case for SD0 fixed voltage (eMMC) that uses fixed regulator and > SD0 non-fixed voltage (SD0) that uses internal regulator. Okay, since I don't see a constant state of the regulator, let's just restore the original value as you do here. I mean it works. > + if (priv->rdev) > + sd_ctrl_read32_rep(host, CTL_SD_STATUS, &sd_status, 1); What about introducing sd_ctrl_read32? Or ask the engineers to move SD_STATUS_IOVS to bit 15 ;) [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 833 bytes --] ^ permalink raw reply [flat|nested] 15+ messages in thread
* RE: [PATCH v3 3/8] mmc: renesas_sdhi: Add support for RZ/G3E SoC 2025-02-28 9:42 ` Wolfram Sang @ 2025-02-28 10:50 ` Biju Das 0 siblings, 0 replies; 15+ messages in thread From: Biju Das @ 2025-02-28 10:50 UTC (permalink / raw) To: Wolfram Sang Cc: Ulf Hansson, linux-mmc@vger.kernel.org, linux-renesas-soc@vger.kernel.org, Geert Uytterhoeven, Prabhakar Mahadev Lad, biju.das.au Hi Wolfram Sang, Thanks for the feedback. > -----Original Message----- > From: Wolfram Sang <wsa+renesas@sang-engineering.com> > Sent: 28 February 2025 09:42 > Subject: Re: [PATCH v3 3/8] mmc: renesas_sdhi: Add support for RZ/G3E SoC > > On Thu, Feb 06, 2025 at 01:40:27PM +0000, Biju Das wrote: > > The SDHI/eMMC IPs in the RZ/G3E SoC are similar to those in R-Car Gen3. > > However, the RZ/G3E SD0 channel has Voltage level control and PWEN pin > > support via SD_STATUS register. > > > > internal regulator support is added to control the voltage levels of > > the SD pins via sd_iovs/sd_pwen bits in SD_STATUS register by > > populating vqmmc-regulator child node. > > > > SD1 and SD2 channels have gpio regulator support and internal > > regulator support. Selection of the regulator is based on the regulator phandle. > > Similar case for SD0 fixed voltage (eMMC) that uses fixed regulator > > and > > SD0 non-fixed voltage (SD0) that uses internal regulator. > > Okay, since I don't see a constant state of the regulator, let's just restore the original value as > you do here. I mean it works. OK. > > > + if (priv->rdev) > > + sd_ctrl_read32_rep(host, CTL_SD_STATUS, &sd_status, 1); > > What about introducing sd_ctrl_read32? Agreed, will introduce sd_ctrl_read32(). Cheers, Biju ^ permalink raw reply [flat|nested] 15+ messages in thread
* RE: [PATCH v3 0/8] Add RZ/G3E SDHI support 2025-02-06 13:40 [PATCH v3 0/8] Add RZ/G3E SDHI support Biju Das ` (2 preceding siblings ...) 2025-02-06 13:40 ` [PATCH v3 3/8] mmc: renesas_sdhi: Add support for RZ/G3E SoC Biju Das @ 2025-02-20 7:11 ` Biju Das 3 siblings, 0 replies; 15+ messages in thread From: Biju Das @ 2025-02-20 7:11 UTC (permalink / raw) To: Ulf Hansson, Wolfram Sang Cc: Geert Uytterhoeven, Magnus Damm, linux-mmc@vger.kernel.org, devicetree@vger.kernel.org, linux-renesas-soc@vger.kernel.org, Prabhakar Mahadev Lad, biju.das.au, Rob Herring, Krzysztof Kozlowski, Conor Dooley Hi Ulf, Wolfram, > -----Original Message----- > From: Biju Das <biju.das.jz@bp.renesas.com> > Sent: 06 February 2025 13:40 > Subject: [PATCH v3 0/8] Add RZ/G3E SDHI support > > The SD/MMC block on the RZ/G3E ("R9A09G047") SoC is similar to that of the RZ/V2H, but the SD0 channel > has only dedicated pins, so we must use SD_STATUS register to control voltage and power enable > (internal regulator). > > For SD1 and SD2 channel we can either use gpio regulator or internal regulator (using SD_STATUS > register) for voltage switching. > > For SD0, fixed voltage(eMMC) uses fixed regulator and non-fixed voltage > (SD) uses internal regulator. > > v2->v3: > * Collected tags > * Renamed internal regulator labels vqmmc_sdhi{0..2}->sdhi{0..2}_vqmmc. > * Updated regulator phandles on SoM/Board dts. > * Dropped renaming the gpio regulator label vqmmc_sdhi1->vqmmc_sdhi1_gpio. > * Renamed node sd0emmc->sd0-emmc > * Renamed sd0-emmc-{ctrl,data,rst}->sd0-{ctrl,data,rst} > * Moved header file gpio.h from patch#6 to patch#8. > * Dropped overriding internal regulator name. > * Dropped #if guard in pinctrl node for SDHI0 > * Renamed the label/node sdhi0_pins: sd0->sdhi0_usd_pins: sd0-usd. > v1->v2: > * Collected tags. > * Documented internal regulator as optional property for both RZ/G3E and > RZ/V2H SoCs. > * Updated commit description for regulator used in SD0 fixed and > non-fixed voltage case in patch#3. > * As the node enabling of internal regulator is controlled through status, > added a check for device availability. > * Status of internal regulator is disabled in the SoC .dtsi. Override > the status in the board DTS when needed. > * Added support for enabling SDHI internal regulator in RZ/V2H > * Added missing header file gpio.h > * Used fixed regulator for eMMC on SD0 and dropped sd0-iovs pins for > eMMC. > * Sorted pinctrl nodes for sd2 > * Enabled internal regulator for SD2. > * Added support for enabling SD on SDHI0 > * Replaced the regulator usd_vdd_3p3v->reg_3p3v. > * Renamed the gpio-hog node sd1-pwr-en->sd1-pwr-en-hog. > * Sorted sd1 pin ctrl nodes. > > Biju Das (8): > dt-bindings: mmc: renesas,sdhi: Document RZ/G3E support > mmc: renesas_sdhi: Arrange local variables in reverse xmas tree order > mmc: renesas_sdhi: Add support for RZ/G3E SoC > arm64: dts: renesas: r9a09g047: Add SDHI0-SDHI2 nodes > arm64: dts: renesas: r9a09g057: Add support for enabling SDHI internal > regulator > arm64: dts: renesas: rzg3e-smarc-som: Enable SDHI{0,2} > arm64: dts: renesas: rzg3e-smarc-som: Add support for enable SD on > SDHI0 > arm64: dts: renesas: r9a09g047e57-smarc: Enable SDHI1 > > .../devicetree/bindings/mmc/renesas,sdhi.yaml | 16 ++ > arch/arm64/boot/dts/renesas/r9a09g047.dtsi | 60 +++++++ > .../boot/dts/renesas/r9a09g047e57-smarc.dts | 49 ++++++ > arch/arm64/boot/dts/renesas/r9a09g057.dtsi | 21 +++ > .../boot/dts/renesas/renesas-smarc2.dtsi | 18 ++ > .../boot/dts/renesas/rzg3e-smarc-som.dtsi | 154 ++++++++++++++++++ > drivers/mmc/host/renesas_sdhi.h | 1 + > drivers/mmc/host/renesas_sdhi_core.c | 136 +++++++++++++++- > drivers/mmc/host/tmio_mmc.h | 5 + > 9 files changed, 459 insertions(+), 1 deletion(-) Gentle ping. Cheers, Biju ^ permalink raw reply [flat|nested] 15+ messages in thread
end of thread, other threads:[~2025-02-28 10:51 UTC | newest] Thread overview: 15+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2025-02-06 13:40 [PATCH v3 0/8] Add RZ/G3E SDHI support Biju Das 2025-02-06 13:40 ` [PATCH v3 1/8] dt-bindings: mmc: renesas,sdhi: Document RZ/G3E support Biju Das 2025-02-06 13:40 ` [PATCH v3 2/8] mmc: renesas_sdhi: Arrange local variables in reverse xmas tree order Biju Das 2025-02-28 9:36 ` Wolfram Sang 2025-02-28 10:51 ` Biju Das 2025-02-06 13:40 ` [PATCH v3 3/8] mmc: renesas_sdhi: Add support for RZ/G3E SoC Biju Das 2025-02-27 15:16 ` Wolfram Sang 2025-02-27 15:29 ` Biju Das 2025-02-27 16:27 ` Biju Das 2025-02-27 19:02 ` Biju Das 2025-02-28 7:23 ` Biju Das 2025-02-28 9:15 ` Wolfram Sang 2025-02-28 9:42 ` Wolfram Sang 2025-02-28 10:50 ` Biju Das 2025-02-20 7:11 ` [PATCH v3 0/8] Add RZ/G3E SDHI support Biju Das
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox