101-03-spi-mtk_spim-get-spi-clk-rate-only-once.patch 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. From 0d6d8a408f80358dd47984320ea9c65e555ac4c9 Mon Sep 17 00:00:00 2001
  2. From: Weijie Gao <[email protected]>
  3. Date: Wed, 19 Jul 2023 17:15:54 +0800
  4. Subject: [PATCH 03/29] spi: mtk_spim: get spi clk rate only once
  5. We don't really need to switch clk rate during operating SPIM controller.
  6. Get clk rate only once at driver probing.
  7. Signed-off-by: SkyLake.Huang <[email protected]>
  8. Signed-off-by: Weijie Gao <[email protected]>
  9. Reviewed-by: Jagan Teki <[email protected]>
  10. ---
  11. drivers/spi/mtk_spim.c | 21 +++++++++++++--------
  12. 1 file changed, 13 insertions(+), 8 deletions(-)
  13. --- a/drivers/spi/mtk_spim.c
  14. +++ b/drivers/spi/mtk_spim.c
  15. @@ -137,6 +137,8 @@ struct mtk_spim_capability {
  16. * @state: Controller state
  17. * @sel_clk: Pad clock
  18. * @spi_clk: Core clock
  19. + * @pll_clk_rate: Controller's PLL source clock rate, which is different
  20. + * from SPI bus clock rate
  21. * @xfer_len: Current length of data for transfer
  22. * @hw_cap: Controller capabilities
  23. * @tick_dly: Used to postpone SPI sampling time
  24. @@ -149,6 +151,7 @@ struct mtk_spim_priv {
  25. void __iomem *base;
  26. u32 state;
  27. struct clk sel_clk, spi_clk;
  28. + u32 pll_clk_rate;
  29. u32 xfer_len;
  30. struct mtk_spim_capability hw_cap;
  31. u32 tick_dly;
  32. @@ -253,11 +256,10 @@ static int mtk_spim_hw_init(struct spi_s
  33. static void mtk_spim_prepare_transfer(struct mtk_spim_priv *priv,
  34. u32 speed_hz)
  35. {
  36. - u32 spi_clk_hz, div, sck_time, cs_time, reg_val;
  37. + u32 div, sck_time, cs_time, reg_val;
  38. - spi_clk_hz = clk_get_rate(&priv->spi_clk);
  39. - if (speed_hz <= spi_clk_hz / 4)
  40. - div = DIV_ROUND_UP(spi_clk_hz, speed_hz);
  41. + if (speed_hz <= priv->pll_clk_rate / 4)
  42. + div = DIV_ROUND_UP(priv->pll_clk_rate, speed_hz);
  43. else
  44. div = 4;
  45. @@ -404,7 +406,7 @@ static int mtk_spim_transfer_wait(struct
  46. {
  47. struct udevice *bus = dev_get_parent(slave->dev);
  48. struct mtk_spim_priv *priv = dev_get_priv(bus);
  49. - u32 sck_l, sck_h, spi_bus_clk, clk_count, reg;
  50. + u32 sck_l, sck_h, clk_count, reg;
  51. ulong us = 1;
  52. int ret = 0;
  53. @@ -413,12 +415,11 @@ static int mtk_spim_transfer_wait(struct
  54. else
  55. clk_count = op->data.nbytes;
  56. - spi_bus_clk = clk_get_rate(&priv->spi_clk);
  57. sck_l = readl(priv->base + SPI_CFG2_REG) >> SPI_CFG2_SCK_LOW_OFFSET;
  58. sck_h = readl(priv->base + SPI_CFG2_REG) & SPI_CFG2_SCK_HIGH_MASK;
  59. - do_div(spi_bus_clk, sck_l + sck_h + 2);
  60. + do_div(priv->pll_clk_rate, sck_l + sck_h + 2);
  61. - us = CLK_TO_US(spi_bus_clk, clk_count * 8);
  62. + us = CLK_TO_US(priv->pll_clk_rate, clk_count * 8);
  63. us += 1000 * 1000; /* 1s tolerance */
  64. if (us > UINT_MAX)
  65. @@ -662,6 +663,10 @@ static int mtk_spim_probe(struct udevice
  66. clk_enable(&priv->sel_clk);
  67. clk_enable(&priv->spi_clk);
  68. + priv->pll_clk_rate = clk_get_rate(&priv->spi_clk);
  69. + if (priv->pll_clk_rate == 0)
  70. + return -EINVAL;
  71. +
  72. return 0;
  73. }