Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

spi: sh-msiof: Limit minimum divider on R-Car Gen3

On R-Car Gen3 SoCs (excluding R-Car H3 ES1.x, which cannot be used for
SPI due to a hardware erratum), BRPS x BRDV = 1/1 is an invalid divider
setting.
Implement this limitation using an SoC/family-specific minimum divider.

Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
Signed-off-by: Mark Brown <broonie@kernel.org>

authored by

Geert Uytterhoeven and committed by
Mark Brown
61a8dec5 3d108f1e

+23 -9
+23 -9
drivers/spi/spi-sh-msiof.c
··· 38 38 u16 tx_fifo_size; 39 39 u16 rx_fifo_size; 40 40 u16 master_flags; 41 + u16 min_div; 41 42 }; 42 43 43 44 struct sh_msiof_spi_priv { ··· 50 49 struct completion done; 51 50 unsigned int tx_fifo_size; 52 51 unsigned int rx_fifo_size; 52 + unsigned int min_div; 53 53 void *tx_dma_page; 54 54 void *rx_dma_page; 55 55 dma_addr_t tx_dma_addr; ··· 262 260 263 261 if (!WARN_ON(!spi_hz || !parent_rate)) 264 262 div = DIV_ROUND_UP(parent_rate, spi_hz); 263 + 264 + div = max_t(unsigned long, div, p->min_div); 265 265 266 266 for (k = 0; k < ARRAY_SIZE(sh_msiof_spi_div_table); k++) { 267 267 brps = DIV_ROUND_UP(div, sh_msiof_spi_div_table[k].div); ··· 1002 998 .tx_fifo_size = 64, 1003 999 .rx_fifo_size = 64, 1004 1000 .master_flags = 0, 1001 + .min_div = 1, 1005 1002 }; 1006 1003 1007 - static const struct sh_msiof_chipdata r8a779x_data = { 1004 + static const struct sh_msiof_chipdata rcar_gen2_data = { 1008 1005 .tx_fifo_size = 64, 1009 1006 .rx_fifo_size = 64, 1010 1007 .master_flags = SPI_MASTER_MUST_TX, 1008 + .min_div = 1, 1009 + }; 1010 + 1011 + static const struct sh_msiof_chipdata rcar_gen3_data = { 1012 + .tx_fifo_size = 64, 1013 + .rx_fifo_size = 64, 1014 + .master_flags = SPI_MASTER_MUST_TX, 1015 + .min_div = 2, 1011 1016 }; 1012 1017 1013 1018 static const struct of_device_id sh_msiof_match[] = { 1014 1019 { .compatible = "renesas,sh-mobile-msiof", .data = &sh_data }, 1015 - { .compatible = "renesas,msiof-r8a7790", .data = &r8a779x_data }, 1016 - { .compatible = "renesas,msiof-r8a7791", .data = &r8a779x_data }, 1017 - { .compatible = "renesas,msiof-r8a7792", .data = &r8a779x_data }, 1018 - { .compatible = "renesas,msiof-r8a7793", .data = &r8a779x_data }, 1019 - { .compatible = "renesas,msiof-r8a7794", .data = &r8a779x_data }, 1020 - { .compatible = "renesas,rcar-gen2-msiof", .data = &r8a779x_data }, 1021 - { .compatible = "renesas,msiof-r8a7796", .data = &r8a779x_data }, 1022 - { .compatible = "renesas,rcar-gen3-msiof", .data = &r8a779x_data }, 1020 + { .compatible = "renesas,msiof-r8a7790", .data = &rcar_gen2_data }, 1021 + { .compatible = "renesas,msiof-r8a7791", .data = &rcar_gen2_data }, 1022 + { .compatible = "renesas,msiof-r8a7792", .data = &rcar_gen2_data }, 1023 + { .compatible = "renesas,msiof-r8a7793", .data = &rcar_gen2_data }, 1024 + { .compatible = "renesas,msiof-r8a7794", .data = &rcar_gen2_data }, 1025 + { .compatible = "renesas,rcar-gen2-msiof", .data = &rcar_gen2_data }, 1026 + { .compatible = "renesas,msiof-r8a7796", .data = &rcar_gen3_data }, 1027 + { .compatible = "renesas,rcar-gen3-msiof", .data = &rcar_gen3_data }, 1023 1028 { .compatible = "renesas,sh-msiof", .data = &sh_data }, /* Deprecated */ 1024 1029 {}, 1025 1030 }; ··· 1243 1230 platform_set_drvdata(pdev, p); 1244 1231 p->master = master; 1245 1232 p->info = info; 1233 + p->min_div = chipdata->min_div; 1246 1234 1247 1235 init_completion(&p->done); 1248 1236