Skip to content

Commit e68b662

Browse files
diandersandersson
authored andcommitted
spi: spi-geni-qcom: Combine the clock setting code
There is code for adjusting the clock both in setup_fifo_params() (called from prepare_message()) and in setup_fifo_xfer() (called from transfer_one()). The code is the same. Abstract it out to a shared function. This is a no-op cleanup patch. The only change is to the error string if we fail to set the clock. Since the two paths has marginally different error messages I picked the clean one. Acked-by: Mark Brown <[email protected]> Signed-off-by: Douglas Anderson <[email protected]> Signed-off-by: Akash Asthana <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Bjorn Andersson <[email protected]>
1 parent 7cf563b commit e68b662

File tree

1 file changed

+35
-35
lines changed

1 file changed

+35
-35
lines changed

drivers/spi/spi-geni-qcom.c

Lines changed: 35 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -194,14 +194,42 @@ static void spi_setup_word_len(struct spi_geni_master *mas, u16 mode,
194194
writel(word_len, se->base + SE_SPI_WORD_LEN);
195195
}
196196

197+
static int geni_spi_set_clock(struct spi_geni_master *mas, unsigned long clk_hz)
198+
{
199+
u32 clk_sel, m_clk_cfg, idx, div;
200+
struct geni_se *se = &mas->se;
201+
int ret;
202+
203+
ret = get_spi_clk_cfg(clk_hz, mas, &idx, &div);
204+
if (ret) {
205+
dev_err(mas->dev, "Err setting clk to %lu: %d\n", clk_hz, ret);
206+
return ret;
207+
}
208+
209+
/*
210+
* SPI core clock gets configured with the requested frequency
211+
* or the frequency closer to the requested frequency.
212+
* For that reason requested frequency is stored in the
213+
* cur_speed_hz and referred in the consecutive transfer instead
214+
* of calling clk_get_rate() API.
215+
*/
216+
mas->cur_speed_hz = clk_hz;
217+
218+
clk_sel = idx & CLK_SEL_MSK;
219+
m_clk_cfg = (div << CLK_DIV_SHFT) | SER_CLK_EN;
220+
writel(clk_sel, se->base + SE_GENI_CLK_SEL);
221+
writel(m_clk_cfg, se->base + GENI_SER_M_CLK_CFG);
222+
223+
return 0;
224+
}
225+
197226
static int setup_fifo_params(struct spi_device *spi_slv,
198227
struct spi_master *spi)
199228
{
200229
struct spi_geni_master *mas = spi_master_get_devdata(spi);
201230
struct geni_se *se = &mas->se;
202231
u32 loopback_cfg, cpol, cpha, demux_output_inv;
203-
u32 demux_sel, clk_sel, m_clk_cfg, idx, div;
204-
int ret;
232+
u32 demux_sel;
205233

206234
loopback_cfg = readl(se->base + SE_SPI_LOOPBACK);
207235
cpol = readl(se->base + SE_SPI_CPOL);
@@ -224,27 +252,16 @@ static int setup_fifo_params(struct spi_device *spi_slv,
224252
demux_output_inv = BIT(spi_slv->chip_select);
225253

226254
demux_sel = spi_slv->chip_select;
227-
mas->cur_speed_hz = spi_slv->max_speed_hz;
228255
mas->cur_bits_per_word = spi_slv->bits_per_word;
229256

230-
ret = get_spi_clk_cfg(mas->cur_speed_hz, mas, &idx, &div);
231-
if (ret) {
232-
dev_err(mas->dev, "Err setting clks ret(%d) for %ld\n",
233-
ret, mas->cur_speed_hz);
234-
return ret;
235-
}
236-
237-
clk_sel = idx & CLK_SEL_MSK;
238-
m_clk_cfg = (div << CLK_DIV_SHFT) | SER_CLK_EN;
239257
spi_setup_word_len(mas, spi_slv->mode, spi_slv->bits_per_word);
240258
writel(loopback_cfg, se->base + SE_SPI_LOOPBACK);
241259
writel(demux_sel, se->base + SE_SPI_DEMUX_SEL);
242260
writel(cpha, se->base + SE_SPI_CPHA);
243261
writel(cpol, se->base + SE_SPI_CPOL);
244262
writel(demux_output_inv, se->base + SE_SPI_DEMUX_OUTPUT_INV);
245-
writel(clk_sel, se->base + SE_GENI_CLK_SEL);
246-
writel(m_clk_cfg, se->base + GENI_SER_M_CLK_CFG);
247-
return 0;
263+
264+
return geni_spi_set_clock(mas, spi_slv->max_speed_hz);
248265
}
249266

250267
static int spi_geni_prepare_message(struct spi_master *spi,
@@ -306,6 +323,7 @@ static void setup_fifo_xfer(struct spi_transfer *xfer,
306323
u32 m_cmd = 0;
307324
u32 spi_tx_cfg, len;
308325
struct geni_se *se = &mas->se;
326+
int ret;
309327

310328
spi_tx_cfg = readl(se->base + SE_SPI_TRANS_CFG);
311329
if (xfer->bits_per_word != mas->cur_bits_per_word) {
@@ -315,27 +333,9 @@ static void setup_fifo_xfer(struct spi_transfer *xfer,
315333

316334
/* Speed and bits per word can be overridden per transfer */
317335
if (xfer->speed_hz != mas->cur_speed_hz) {
318-
int ret;
319-
u32 clk_sel, m_clk_cfg;
320-
unsigned int idx, div;
321-
322-
ret = get_spi_clk_cfg(xfer->speed_hz, mas, &idx, &div);
323-
if (ret) {
324-
dev_err(mas->dev, "Err setting clks:%d\n", ret);
336+
ret = geni_spi_set_clock(mas, xfer->speed_hz);
337+
if (ret)
325338
return;
326-
}
327-
/*
328-
* SPI core clock gets configured with the requested frequency
329-
* or the frequency closer to the requested frequency.
330-
* For that reason requested frequency is stored in the
331-
* cur_speed_hz and referred in the consecutive transfer instead
332-
* of calling clk_get_rate() API.
333-
*/
334-
mas->cur_speed_hz = xfer->speed_hz;
335-
clk_sel = idx & CLK_SEL_MSK;
336-
m_clk_cfg = (div << CLK_DIV_SHFT) | SER_CLK_EN;
337-
writel(clk_sel, se->base + SE_GENI_CLK_SEL);
338-
writel(m_clk_cfg, se->base + GENI_SER_M_CLK_CFG);
339339
}
340340

341341
mas->tx_rem_bytes = 0;

0 commit comments

Comments
 (0)