Skip to content

Commit 0335767

Browse files
prabhakarladbroonie
authored andcommitted
spi: rzv2h-rspi: Fix invalid SPR=0/BRDV=0 clock configuration
The combination of SPR=0 and BRDV=0 results in the minimum division ratio of 2, producing the maximum possible bit rate for a given clock source. This combination is not supported in two cases: - On RZ/G3E, RZ/G3L, RZ/V2H(P) and RZ/V2N, RSPI_n_TCLK is fixed at 200MHz, which would yield 100Mbps. The next hardware manual update will explicitly state that since the maximum frequency of the RSPICKn clock signal is 50MHz, settings with N=0 and n=0 resulting in 100Mbps are prohibited. - On RZ/T2H and RZ/N2H, when PCLK (125MHz) is used as the clock source, SPR=0 and BRDV=0 is explicitly listed as unsupported in the hardware manual (Table 36.7). Skip the SPR=0/BRDV=0 combination in rzv2h_rspi_find_rate_fixed() to prevent the driver from selecting an invalid clock configuration on the affected SoCs. Additionally, remove the now redundant RSPI_SPBR_SPR_PCLK_MIN define which was previously set to 1 to work around the PCLK restriction, but was overly broad as it incorrectly blocked valid combinations such as SPR=0/BRDV=1 (31.25Mbps on PCLK=125MHz). Fixes: 8b61c89 ("spi: Add driver for the RZ/V2H(P) RSPI IP") Fixes: 1ce3e8a ("spi: rzv2h-rspi: add support for using PCLK for transfer clock") Signed-off-by: Lad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com> Link: https://patch.msgid.link/20260410080517.2405700-3-prabhakar.mahadev-lad.rj@bp.renesas.com Signed-off-by: Mark Brown <broonie@kernel.org>
1 parent 4e292cb commit 0335767

1 file changed

Lines changed: 12 additions & 6 deletions

File tree

drivers/spi/spi-rzv2h-rspi.c

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,6 @@
5050

5151
/* Register SPBR */
5252
#define RSPI_SPBR_SPR_MIN 0
53-
#define RSPI_SPBR_SPR_PCLK_MIN 1
5453
#define RSPI_SPBR_SPR_MAX 255
5554

5655
/* Register SPCMD */
@@ -535,6 +534,17 @@ static void rzv2h_rspi_find_rate_fixed(struct clk *clk, u32 hz,
535534
for (brdv = RSPI_SPCMD_BRDV_MIN; brdv <= RSPI_SPCMD_BRDV_MAX; brdv++) {
536535
spr = DIV_ROUND_UP(clk_rate, hz * (1 << (brdv + 1)));
537536
spr--;
537+
/*
538+
* Skip SPR=0 and BRDV=0 as it is not a valid combination:
539+
* - On RZ/G3E, RZ/G3L, RZ/V2H(P) and RZ/V2N, RSPI_n_TCLK is
540+
* fixed at 200MHz and SPR=0 and BRDV=0 results in the maximum
541+
* bit rate of 100Mbps which is prohibited.
542+
* - On RZ/T2H and RZ/N2H, when PCLK (125MHz) is used as
543+
* the clock source, SPR=0 and BRDV=0 is explicitly listed
544+
* as unsupported in the hardware manual (Table 36.7).
545+
*/
546+
if (!spr && !brdv)
547+
continue;
538548
if (spr >= spr_min && spr <= spr_max)
539549
goto clock_found;
540550
}
@@ -568,12 +578,8 @@ static u32 rzv2h_rspi_setup_clock(struct rzv2h_rspi_priv *rspi, u32 hz)
568578
rspi->info->find_tclk_rate(rspi->tclk, hz, RSPI_SPBR_SPR_MIN,
569579
RSPI_SPBR_SPR_MAX, &best_clock);
570580

571-
/*
572-
* T2H and N2H can also use PCLK as a source, which is 125MHz, but not
573-
* when both SPR and BRDV are 0.
574-
*/
575581
if (best_clock.error && rspi->info->find_pclk_rate)
576-
rspi->info->find_pclk_rate(rspi->pclk, hz, RSPI_SPBR_SPR_PCLK_MIN,
582+
rspi->info->find_pclk_rate(rspi->pclk, hz, RSPI_SPBR_SPR_MIN,
577583
RSPI_SPBR_SPR_MAX, &best_clock);
578584

579585
if (!best_clock.clk_rate)

0 commit comments

Comments
 (0)