@@ -194,14 +194,42 @@ static void spi_setup_word_len(struct spi_geni_master *mas, u16 mode,
194
194
writel (word_len , se -> base + SE_SPI_WORD_LEN );
195
195
}
196
196
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
+
197
226
static int setup_fifo_params (struct spi_device * spi_slv ,
198
227
struct spi_master * spi )
199
228
{
200
229
struct spi_geni_master * mas = spi_master_get_devdata (spi );
201
230
struct geni_se * se = & mas -> se ;
202
231
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 ;
205
233
206
234
loopback_cfg = readl (se -> base + SE_SPI_LOOPBACK );
207
235
cpol = readl (se -> base + SE_SPI_CPOL );
@@ -224,27 +252,16 @@ static int setup_fifo_params(struct spi_device *spi_slv,
224
252
demux_output_inv = BIT (spi_slv -> chip_select );
225
253
226
254
demux_sel = spi_slv -> chip_select ;
227
- mas -> cur_speed_hz = spi_slv -> max_speed_hz ;
228
255
mas -> cur_bits_per_word = spi_slv -> bits_per_word ;
229
256
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 ;
239
257
spi_setup_word_len (mas , spi_slv -> mode , spi_slv -> bits_per_word );
240
258
writel (loopback_cfg , se -> base + SE_SPI_LOOPBACK );
241
259
writel (demux_sel , se -> base + SE_SPI_DEMUX_SEL );
242
260
writel (cpha , se -> base + SE_SPI_CPHA );
243
261
writel (cpol , se -> base + SE_SPI_CPOL );
244
262
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 );
248
265
}
249
266
250
267
static int spi_geni_prepare_message (struct spi_master * spi ,
@@ -306,6 +323,7 @@ static void setup_fifo_xfer(struct spi_transfer *xfer,
306
323
u32 m_cmd = 0 ;
307
324
u32 spi_tx_cfg , len ;
308
325
struct geni_se * se = & mas -> se ;
326
+ int ret ;
309
327
310
328
spi_tx_cfg = readl (se -> base + SE_SPI_TRANS_CFG );
311
329
if (xfer -> bits_per_word != mas -> cur_bits_per_word ) {
@@ -315,27 +333,9 @@ static void setup_fifo_xfer(struct spi_transfer *xfer,
315
333
316
334
/* Speed and bits per word can be overridden per transfer */
317
335
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 )
325
338
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 );
339
339
}
340
340
341
341
mas -> tx_rem_bytes = 0 ;
0 commit comments