Skip to content

Commit 0e3b8a8

Browse files
Akash Asthanaandersson
authored andcommitted
spi: spi-geni-qcom: Add interconnect support
Get the interconnect paths for SPI based Serial Engine device and vote according to the current bus speed of the driver. Acked-by: Mark Brown <[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 e68b662 commit 0e3b8a8

File tree

1 file changed

+32
-4
lines changed

1 file changed

+32
-4
lines changed

drivers/spi/spi-geni-qcom.c

Lines changed: 32 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -194,7 +194,8 @@ 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)
197+
static int geni_spi_set_clock_and_bw(struct spi_geni_master *mas,
198+
unsigned long clk_hz)
198199
{
199200
u32 clk_sel, m_clk_cfg, idx, div;
200201
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)
220221
writel(clk_sel, se->base + SE_GENI_CLK_SEL);
221222
writel(m_clk_cfg, se->base + GENI_SER_M_CLK_CFG);
222223

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+
223230
return 0;
224231
}
225232

@@ -261,7 +268,7 @@ static int setup_fifo_params(struct spi_device *spi_slv,
261268
writel(cpol, se->base + SE_SPI_CPOL);
262269
writel(demux_output_inv, se->base + SE_SPI_DEMUX_OUTPUT_INV);
263270

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);
265272
}
266273

267274
static int spi_geni_prepare_message(struct spi_master *spi,
@@ -333,7 +340,7 @@ static void setup_fifo_xfer(struct spi_transfer *xfer,
333340

334341
/* Speed and bits per word can be overridden per transfer */
335342
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);
337344
if (ret)
338345
return;
339346
}
@@ -578,6 +585,17 @@ static int spi_geni_probe(struct platform_device *pdev)
578585
spin_lock_init(&mas->lock);
579586
pm_runtime_enable(dev);
580587

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+
581599
ret = spi_geni_init(mas);
582600
if (ret)
583601
goto spi_geni_probe_runtime_disable;
@@ -616,14 +634,24 @@ static int __maybe_unused spi_geni_runtime_suspend(struct device *dev)
616634
{
617635
struct spi_master *spi = dev_get_drvdata(dev);
618636
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;
619642

620-
return geni_se_resources_off(&mas->se);
643+
return geni_icc_disable(&mas->se);
621644
}
622645

623646
static int __maybe_unused spi_geni_runtime_resume(struct device *dev)
624647
{
625648
struct spi_master *spi = dev_get_drvdata(dev);
626649
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;
627655

628656
return geni_se_resources_on(&mas->se);
629657
}

0 commit comments

Comments
 (0)