From eaad5f2cb0e3bbbd62c08543fb93ebcfe87c1051 Mon Sep 17 00:00:00 2001 From: Marek Vasut Date: Mon, 4 May 2026 16:43:27 +0200 Subject: [PATCH 1/3] soc: renesas: Identify R-Car R8A779MD M3Le SoC Add support for identifying the R-Car M3Le (R8A779MD) SoC. The Renesas R-Car R8A779MD M3Le SoC is a variant of the already supported R-Car M3-N SoC with reduced peripherals. Enable support for the M3Le SoC through already existing ARCH_R8A77965 configuration symbol. PRR reads 0x67c05501. Reviewed-by: Geert Uytterhoeven Signed-off-by: Marek Vasut Link: https://patch.msgid.link/20260504144534.43745-6-marek.vasut+renesas@mailbox.org Signed-off-by: Geert Uytterhoeven --- drivers/soc/renesas/renesas-soc.c | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/soc/renesas/renesas-soc.c b/drivers/soc/renesas/renesas-soc.c index dedb2a0be586..18acca73064c 100644 --- a/drivers/soc/renesas/renesas-soc.c +++ b/drivers/soc/renesas/renesas-soc.c @@ -361,6 +361,7 @@ static const struct of_device_id renesas_socs[] __initconst __maybe_unused = { { .compatible = "renesas,r8a77965", .data = &soc_rcar_m3_n }, { .compatible = "renesas,r8a779m4", .data = &soc_rcar_m3_n }, { .compatible = "renesas,r8a779m5", .data = &soc_rcar_m3_n }, + { .compatible = "renesas,r8a779md", .data = &soc_rcar_m3_n }, #endif #ifdef CONFIG_ARCH_R8A77970 { .compatible = "renesas,r8a77970", .data = &soc_rcar_v3m }, From 2e9b940f07b518c8a4c69122c5857cae7d2bbae7 Mon Sep 17 00:00:00 2001 From: Wolfram Sang Date: Tue, 19 May 2026 09:56:18 +0200 Subject: [PATCH 2/3] dt-bindings: soc: renesas: mfis: Add R-Car V4H/V4M support The above SoCs have only 12 mailboxes and do not have an extra register space for mailboxes. Everything is contained in the common register set. In addition to adding these SoCs, the other entries get updated to enforce 2 register spaces and their specific number of interrupts. Signed-off-by: Wolfram Sang Reviewed-by: Geert Uytterhoeven Acked-by: Conor Dooley Link: https://patch.msgid.link/20260519075620.4128-2-wsa+renesas@sang-engineering.com Signed-off-by: Geert Uytterhoeven --- .../soc/renesas/renesas,r8a78000-mfis.yaml | 38 ++++++++++++++++++- 1 file changed, 36 insertions(+), 2 deletions(-) diff --git a/Documentation/devicetree/bindings/soc/renesas/renesas,r8a78000-mfis.yaml b/Documentation/devicetree/bindings/soc/renesas/renesas,r8a78000-mfis.yaml index eef8c0a59e9c..72b9fa67d1f7 100644 --- a/Documentation/devicetree/bindings/soc/renesas/renesas,r8a78000-mfis.yaml +++ b/Documentation/devicetree/bindings/soc/renesas/renesas,r8a78000-mfis.yaml @@ -19,25 +19,29 @@ description: properties: compatible: enum: + - renesas,r8a779g0-mfis # R-Car V4H + - renesas,r8a779h0-mfis # R-Car V4M - renesas,r8a78000-mfis # R-Car X5H (AP<->AP, with PRR) - renesas,r8a78000-mfis-scp # R-Car X5H (AP<->SCP, without PRR) reg: + minItems: 1 maxItems: 2 reg-names: + minItems: 1 items: - const: common - const: mboxes interrupts: - minItems: 32 + minItems: 12 maxItems: 128 description: The interrupts raised by the remote doorbells. interrupt-names: - minItems: 32 + minItems: 12 maxItems: 128 description: An interrupt name is constructed with the prefix 'ch'. Then, the @@ -56,6 +60,26 @@ properties: . allOf: + - if: + properties: + compatible: + contains: + enum: + - renesas,r8a779g0-mfis + - renesas,r8a779h0-mfis + then: + properties: + reg: + maxItems: 1 + reg-names: + maxItems: 1 + interrupts: + maxItems: 12 + interrupt-names: + maxItems: 12 + items: + pattern: "^ch[0-9]+e$" + - if: properties: compatible: @@ -63,6 +87,10 @@ allOf: const: renesas,r8a78000-mfis then: properties: + reg: + minItems: 2 + reg-names: + minItems: 2 interrupts: minItems: 128 interrupt-names: @@ -77,9 +105,15 @@ allOf: const: renesas,r8a78000-mfis-scp then: properties: + reg: + minItems: 2 + reg-names: + minItems: 2 interrupts: + minItems: 32 maxItems: 32 interrupt-names: + minItems: 32 maxItems: 32 items: pattern: "^ch[0-9]+i$" From b4d41ffa750fc3403a4076d17090589d000f13ff Mon Sep 17 00:00:00 2001 From: Wolfram Sang Date: Tue, 19 May 2026 09:56:19 +0200 Subject: [PATCH 3/3] soc: renesas: rcar-mfis: Add R-Car V4H/V4M support The above SoCs have a weird register layout for the mailbox registers. So, encapsulate register offset calculation in a per-SoC callback. Other than that, only a separate config struct and compatibles are needed. Signed-off-by: Wolfram Sang Reviewed-by: Geert Uytterhoeven Link: https://patch.msgid.link/20260519075620.4128-3-wsa+renesas@sang-engineering.com Signed-off-by: Geert Uytterhoeven --- drivers/soc/renesas/rcar-mfis.c | 44 +++++++++++++++++++++++++++++++-- 1 file changed, 42 insertions(+), 2 deletions(-) diff --git a/drivers/soc/renesas/rcar-mfis.c b/drivers/soc/renesas/rcar-mfis.c index b334b35306ae..3435c3e16198 100644 --- a/drivers/soc/renesas/rcar-mfis.c +++ b/drivers/soc/renesas/rcar-mfis.c @@ -41,6 +41,7 @@ struct mfis_info { unsigned int mb_reg_comes_from_dt:1; unsigned int mb_tx_uses_eicr:1; unsigned int mb_channels_are_unidir:1; + u32 (*mb_calc_reg)(u32 chan_num, bool tx_uses_eicr, bool is_only_rx); }; struct mfis_chan_priv { @@ -155,6 +156,35 @@ static const struct mbox_chan_ops mfis_iicr_ops = { .last_tx_done = mfis_mb_iicr_last_tx_done, }; +static u32 mfis_mb_r8a779g0_calc_reg(u32 chan_num, bool tx_uses_eicr, bool is_only_rx) +{ + unsigned int i, k; + u32 reg; + + i = chan_num & 3; + k = chan_num >> 2; + + if (is_only_rx) { + if (k < 2) + reg = 0x9404 + 0x1020 * k + 0x08 * i; + else + reg = 0xb504 + 0x08 * i; + } else { + if (k < 2) + reg = 0x1400 + 0x1008 * i + 0x20 * k; + else + reg = 0x1500 + 0x1008 * i; + } + + return reg; +} + +static u32 mfis_mb_r8a78000_calc_reg(u32 chan_num, bool tx_uses_eicr, bool is_only_rx) +{ + return (tx_uses_eicr ^ is_only_rx) ? MFIS_X5H_EICR(chan_num) : + MFIS_X5H_IICR(chan_num); +} + static struct mbox_chan *mfis_mb_of_xlate(struct mbox_controller *mbox, const struct of_phandle_args *sp) { @@ -191,8 +221,7 @@ static struct mbox_chan *mfis_mb_of_xlate(struct mbox_controller *mbox, } chan_priv = chan->con_priv; - chan_priv->reg = (tx_uses_eicr ^ is_only_rx) ? MFIS_X5H_EICR(chan_num) : - MFIS_X5H_IICR(chan_num); + chan_priv->reg = priv->info->mb_calc_reg(chan_num, tx_uses_eicr, is_only_rx); if (!priv->info->mb_channels_are_unidir || is_only_rx) { char irqname[8]; @@ -307,11 +336,19 @@ static int mfis_probe(struct platform_device *pdev) return mfis_mb_probe(priv); } +static const struct mfis_info mfis_info_r8a779g0 = { + .unprotect_mask = 0x0000ffff, + .mb_num_channels = 12, + .mb_channels_are_unidir = true, + .mb_calc_reg = mfis_mb_r8a779g0_calc_reg, +}; + static const struct mfis_info mfis_info_r8a78000 = { .unprotect_mask = 0x000fffff, .mb_num_channels = 64, .mb_reg_comes_from_dt = true, .mb_channels_are_unidir = true, + .mb_calc_reg = mfis_mb_r8a78000_calc_reg, }; static const struct mfis_info mfis_info_r8a78000_scp = { @@ -319,9 +356,12 @@ static const struct mfis_info mfis_info_r8a78000_scp = { .mb_num_channels = 32, .mb_tx_uses_eicr = true, .mb_channels_are_unidir = true, + .mb_calc_reg = mfis_mb_r8a78000_calc_reg, }; static const struct of_device_id mfis_mfd_of_match[] = { + { .compatible = "renesas,r8a779g0-mfis", .data = &mfis_info_r8a779g0, }, + { .compatible = "renesas,r8a779h0-mfis", .data = &mfis_info_r8a779g0, }, { .compatible = "renesas,r8a78000-mfis", .data = &mfis_info_r8a78000, }, { .compatible = "renesas,r8a78000-mfis-scp", .data = &mfis_info_r8a78000_scp, }, {}