@@ -194,7 +194,8 @@ 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 )
197
+ static int geni_spi_set_clock_and_bw (struct spi_geni_master * mas ,
198
+ unsigned long clk_hz )
198
199
{
199
200
u32 clk_sel , m_clk_cfg , idx , div ;
200
201
struct geni_se * se = & mas -> se ;
@@ -220,6 +221,12 @@ static int geni_spi_set_clock(struct spi_geni_master *mas, unsigned long clk_hz)
220
221
writel (clk_sel , se -> base + SE_GENI_CLK_SEL );
221
222
writel (m_clk_cfg , se -> base + GENI_SER_M_CLK_CFG );
222
223
224
+ /* Set BW quota for CPU as driver supports FIFO mode only. */
225
+ se -> icc_paths [CPU_TO_GENI ].avg_bw = Bps_to_icc (mas -> cur_speed_hz );
226
+ ret = geni_icc_set_bw (se );
227
+ if (ret )
228
+ return ret ;
229
+
223
230
return 0 ;
224
231
}
225
232
@@ -261,7 +268,7 @@ static int setup_fifo_params(struct spi_device *spi_slv,
261
268
writel (cpol , se -> base + SE_SPI_CPOL );
262
269
writel (demux_output_inv , se -> base + SE_SPI_DEMUX_OUTPUT_INV );
263
270
264
- return geni_spi_set_clock (mas , spi_slv -> max_speed_hz );
271
+ return geni_spi_set_clock_and_bw (mas , spi_slv -> max_speed_hz );
265
272
}
266
273
267
274
static int spi_geni_prepare_message (struct spi_master * spi ,
@@ -333,7 +340,7 @@ static void setup_fifo_xfer(struct spi_transfer *xfer,
333
340
334
341
/* Speed and bits per word can be overridden per transfer */
335
342
if (xfer -> speed_hz != mas -> cur_speed_hz ) {
336
- ret = geni_spi_set_clock (mas , xfer -> speed_hz );
343
+ ret = geni_spi_set_clock_and_bw (mas , xfer -> speed_hz );
337
344
if (ret )
338
345
return ;
339
346
}
@@ -578,6 +585,17 @@ static int spi_geni_probe(struct platform_device *pdev)
578
585
spin_lock_init (& mas -> lock );
579
586
pm_runtime_enable (dev );
580
587
588
+ ret = geni_icc_get (& mas -> se , NULL );
589
+ if (ret )
590
+ goto spi_geni_probe_runtime_disable ;
591
+ /* Set the bus quota to a reasonable value for register access */
592
+ mas -> se .icc_paths [GENI_TO_CORE ].avg_bw = Bps_to_icc (CORE_2X_50_MHZ );
593
+ mas -> se .icc_paths [CPU_TO_GENI ].avg_bw = GENI_DEFAULT_BW ;
594
+
595
+ ret = geni_icc_set_bw (& mas -> se );
596
+ if (ret )
597
+ goto spi_geni_probe_runtime_disable ;
598
+
581
599
ret = spi_geni_init (mas );
582
600
if (ret )
583
601
goto spi_geni_probe_runtime_disable ;
@@ -616,14 +634,24 @@ static int __maybe_unused spi_geni_runtime_suspend(struct device *dev)
616
634
{
617
635
struct spi_master * spi = dev_get_drvdata (dev );
618
636
struct spi_geni_master * mas = spi_master_get_devdata (spi );
637
+ int ret ;
638
+
639
+ ret = geni_se_resources_off (& mas -> se );
640
+ if (ret )
641
+ return ret ;
619
642
620
- return geni_se_resources_off (& mas -> se );
643
+ return geni_icc_disable (& mas -> se );
621
644
}
622
645
623
646
static int __maybe_unused spi_geni_runtime_resume (struct device * dev )
624
647
{
625
648
struct spi_master * spi = dev_get_drvdata (dev );
626
649
struct spi_geni_master * mas = spi_master_get_devdata (spi );
650
+ int ret ;
651
+
652
+ ret = geni_icc_enable (& mas -> se );
653
+ if (ret )
654
+ return ret ;
627
655
628
656
return geni_se_resources_on (& mas -> se );
629
657
}
0 commit comments