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

spi: spi-ti-qspi: Support per-transfer and per-slave speed_hz settings

The spi-ti-qspi driver initializes its spi clock by the
spi-max-frequency property from the controller node, and ignores
per-transfer (and per-slave) speed_hz settings.

Isolate clock settings out from ti_qspi_setup() and call it from
ti_qspi_start_transfer_one() and ti_qspi_exec_mem_op(), using
per-transfer speed_hz and per-slave max_speed_hz settings.

Also drop spi_max_frequency from struct ti_qspi and use spi_master's
max_speed_hz.

Signed-off-by: Atsushi Nemoto <atsushi.nemoto@sord.co.jp>
Link: https://lore.kernel.org/r/20220519.084604.966119051165023533.atsushi.nemoto@sord.co.jp
Signed-off-by: Mark Brown <broonie@kernel.org>

authored by

Atsushi Nemoto and committed by
Mark Brown
8d0b5128 6598b91b

+39 -36
+39 -36
drivers/spi/spi-ti-qspi.c
··· 57 57 void *rx_bb_addr; 58 58 struct dma_chan *rx_chan; 59 59 60 - u32 spi_max_frequency; 61 60 u32 cmd; 62 61 u32 dc; 63 62 ··· 139 140 static int ti_qspi_setup(struct spi_device *spi) 140 141 { 141 142 struct ti_qspi *qspi = spi_master_get_devdata(spi->master); 142 - struct ti_qspi_regs *ctx_reg = &qspi->ctx_reg; 143 - int clk_div = 0, ret; 144 - u32 clk_ctrl_reg, clk_rate, clk_mask; 143 + int ret; 145 144 146 145 if (spi->master->busy) { 147 146 dev_dbg(qspi->dev, "master busy doing other transfers\n"); 148 147 return -EBUSY; 149 148 } 150 149 151 - if (!qspi->spi_max_frequency) { 150 + if (!qspi->master->max_speed_hz) { 152 151 dev_err(qspi->dev, "spi max frequency not defined\n"); 153 152 return -EINVAL; 154 153 } 155 154 156 - clk_rate = clk_get_rate(qspi->fclk); 157 - 158 - clk_div = DIV_ROUND_UP(clk_rate, qspi->spi_max_frequency) - 1; 159 - 160 - if (clk_div < 0) { 161 - dev_dbg(qspi->dev, "clock divider < 0, using /1 divider\n"); 162 - return -EINVAL; 163 - } 164 - 165 - if (clk_div > QSPI_CLK_DIV_MAX) { 166 - dev_dbg(qspi->dev, "clock divider >%d , using /%d divider\n", 167 - QSPI_CLK_DIV_MAX, QSPI_CLK_DIV_MAX + 1); 168 - return -EINVAL; 169 - } 170 - 171 - dev_dbg(qspi->dev, "hz: %d, clock divider %d\n", 172 - qspi->spi_max_frequency, clk_div); 155 + spi->max_speed_hz = min(spi->max_speed_hz, qspi->master->max_speed_hz); 173 156 174 157 ret = pm_runtime_resume_and_get(qspi->dev); 175 158 if (ret < 0) { 176 159 dev_err(qspi->dev, "pm_runtime_get_sync() failed\n"); 177 160 return ret; 178 161 } 179 - 180 - clk_ctrl_reg = ti_qspi_read(qspi, QSPI_SPI_CLOCK_CNTRL_REG); 181 - 182 - clk_ctrl_reg &= ~QSPI_CLK_EN; 183 - 184 - /* disable SCLK */ 185 - ti_qspi_write(qspi, clk_ctrl_reg, QSPI_SPI_CLOCK_CNTRL_REG); 186 - 187 - /* enable SCLK */ 188 - clk_mask = QSPI_CLK_EN | clk_div; 189 - ti_qspi_write(qspi, clk_mask, QSPI_SPI_CLOCK_CNTRL_REG); 190 - ctx_reg->clkctrl = clk_mask; 191 162 192 163 pm_runtime_mark_last_busy(qspi->dev); 193 164 ret = pm_runtime_put_autosuspend(qspi->dev); ··· 167 198 } 168 199 169 200 return 0; 201 + } 202 + 203 + static void ti_qspi_setup_clk(struct ti_qspi *qspi, u32 speed_hz) 204 + { 205 + struct ti_qspi_regs *ctx_reg = &qspi->ctx_reg; 206 + int clk_div; 207 + u32 clk_ctrl_reg, clk_rate, clk_ctrl_new; 208 + 209 + clk_rate = clk_get_rate(qspi->fclk); 210 + clk_div = DIV_ROUND_UP(clk_rate, speed_hz) - 1; 211 + clk_div = clamp(clk_div, 0, QSPI_CLK_DIV_MAX); 212 + dev_dbg(qspi->dev, "hz: %d, clock divider %d\n", speed_hz, clk_div); 213 + 214 + pm_runtime_resume_and_get(qspi->dev); 215 + 216 + clk_ctrl_new = QSPI_CLK_EN | clk_div; 217 + if (ctx_reg->clkctrl != clk_ctrl_new) { 218 + clk_ctrl_reg = ti_qspi_read(qspi, QSPI_SPI_CLOCK_CNTRL_REG); 219 + 220 + clk_ctrl_reg &= ~QSPI_CLK_EN; 221 + 222 + /* disable SCLK */ 223 + ti_qspi_write(qspi, clk_ctrl_reg, QSPI_SPI_CLOCK_CNTRL_REG); 224 + 225 + /* enable SCLK */ 226 + ti_qspi_write(qspi, clk_ctrl_new, QSPI_SPI_CLOCK_CNTRL_REG); 227 + ctx_reg->clkctrl = clk_ctrl_new; 228 + } 229 + 230 + pm_runtime_mark_last_busy(qspi->dev); 231 + pm_runtime_put_autosuspend(qspi->dev); 170 232 } 171 233 172 234 static void ti_qspi_restore_ctx(struct ti_qspi *qspi) ··· 623 623 624 624 mutex_lock(&qspi->list_lock); 625 625 626 - if (!qspi->mmap_enabled || qspi->current_cs != mem->spi->chip_select) 626 + if (!qspi->mmap_enabled || qspi->current_cs != mem->spi->chip_select) { 627 + ti_qspi_setup_clk(qspi, mem->spi->max_speed_hz); 627 628 ti_qspi_enable_memory_map(mem->spi); 629 + } 628 630 ti_qspi_setup_mmap_read(mem->spi, op->cmd.opcode, op->data.buswidth, 629 631 op->addr.nbytes, op->dummy.nbytes); 630 632 ··· 703 701 wlen = t->bits_per_word >> 3; 704 702 transfer_len_words = min(t->len / wlen, frame_len_words); 705 703 704 + ti_qspi_setup_clk(qspi, t->speed_hz); 706 705 ret = qspi_transfer_msg(qspi, t, transfer_len_words * wlen); 707 706 if (ret) { 708 707 dev_dbg(qspi->dev, "transfer message failed\n"); ··· 854 851 pm_runtime_enable(&pdev->dev); 855 852 856 853 if (!of_property_read_u32(np, "spi-max-frequency", &max_freq)) 857 - qspi->spi_max_frequency = max_freq; 854 + master->max_speed_hz = max_freq; 858 855 859 856 dma_cap_zero(mask); 860 857 dma_cap_set(DMA_MEMCPY, mask);