@@ -144,6 +144,7 @@ struct qcom_qspi {
144
144
struct icc_path * icc_path_cpu_to_qspi ;
145
145
struct opp_table * opp_table ;
146
146
bool has_opp_table ;
147
+ unsigned long last_speed ;
147
148
/* Lock to protect data accessed by IRQs */
148
149
spinlock_t lock ;
149
150
};
@@ -226,19 +227,13 @@ static void qcom_qspi_handle_err(struct spi_master *master,
226
227
spin_unlock_irqrestore (& ctrl -> lock , flags );
227
228
}
228
229
229
- static int qcom_qspi_transfer_one (struct spi_master * master ,
230
- struct spi_device * slv ,
231
- struct spi_transfer * xfer )
230
+ static int qcom_qspi_set_speed (struct qcom_qspi * ctrl , unsigned long speed_hz )
232
231
{
233
- struct qcom_qspi * ctrl = spi_master_get_devdata (master );
234
232
int ret ;
235
- unsigned long speed_hz ;
236
- unsigned long flags ;
237
233
unsigned int avg_bw_cpu ;
238
234
239
- speed_hz = slv -> max_speed_hz ;
240
- if (xfer -> speed_hz )
241
- speed_hz = xfer -> speed_hz ;
235
+ if (speed_hz == ctrl -> last_speed )
236
+ return 0 ;
242
237
243
238
/* In regular operation (SBL_EN=1) core must be 4x transfer clock */
244
239
ret = dev_pm_opp_set_rate (ctrl -> dev , speed_hz * 4 );
@@ -259,6 +254,28 @@ static int qcom_qspi_transfer_one(struct spi_master *master,
259
254
return ret ;
260
255
}
261
256
257
+ ctrl -> last_speed = speed_hz ;
258
+
259
+ return 0 ;
260
+ }
261
+
262
+ static int qcom_qspi_transfer_one (struct spi_master * master ,
263
+ struct spi_device * slv ,
264
+ struct spi_transfer * xfer )
265
+ {
266
+ struct qcom_qspi * ctrl = spi_master_get_devdata (master );
267
+ int ret ;
268
+ unsigned long speed_hz ;
269
+ unsigned long flags ;
270
+
271
+ speed_hz = slv -> max_speed_hz ;
272
+ if (xfer -> speed_hz )
273
+ speed_hz = xfer -> speed_hz ;
274
+
275
+ ret = qcom_qspi_set_speed (ctrl , speed_hz );
276
+ if (ret )
277
+ return ret ;
278
+
262
279
spin_lock_irqsave (& ctrl -> lock , flags );
263
280
264
281
/* We are half duplex, so either rx or tx will be set */
@@ -602,7 +619,11 @@ static int __maybe_unused qcom_qspi_runtime_resume(struct device *dev)
602
619
return ret ;
603
620
}
604
621
605
- return clk_bulk_prepare_enable (QSPI_NUM_CLKS , ctrl -> clks );
622
+ ret = clk_bulk_prepare_enable (QSPI_NUM_CLKS , ctrl -> clks );
623
+ if (ret )
624
+ return ret ;
625
+
626
+ return dev_pm_opp_set_rate (dev , ctrl -> last_speed * 4 );
606
627
}
607
628
608
629
static int __maybe_unused qcom_qspi_suspend (struct device * dev )
0 commit comments