@@ -202,57 +202,6 @@ static u32 sdhci_cdns_get_emmc_mode(struct sdhci_cdns_priv *priv)
202
202
return FIELD_GET (SDHCI_CDNS_HRS06_MODE , tmp );
203
203
}
204
204
205
- static void sdhci_cdns_set_uhs_signaling (struct sdhci_host * host ,
206
- unsigned int timing )
207
- {
208
- struct sdhci_cdns_priv * priv = sdhci_cdns_priv (host );
209
- u32 mode ;
210
-
211
- switch (timing ) {
212
- case MMC_TIMING_MMC_HS :
213
- mode = SDHCI_CDNS_HRS06_MODE_MMC_SDR ;
214
- break ;
215
- case MMC_TIMING_MMC_DDR52 :
216
- mode = SDHCI_CDNS_HRS06_MODE_MMC_DDR ;
217
- break ;
218
- case MMC_TIMING_MMC_HS200 :
219
- mode = SDHCI_CDNS_HRS06_MODE_MMC_HS200 ;
220
- break ;
221
- case MMC_TIMING_MMC_HS400 :
222
- if (priv -> enhanced_strobe )
223
- mode = SDHCI_CDNS_HRS06_MODE_MMC_HS400ES ;
224
- else
225
- mode = SDHCI_CDNS_HRS06_MODE_MMC_HS400 ;
226
- break ;
227
- default :
228
- mode = SDHCI_CDNS_HRS06_MODE_SD ;
229
- break ;
230
- }
231
-
232
- sdhci_cdns_set_emmc_mode (priv , mode );
233
-
234
- /* For SD, fall back to the default handler */
235
- if (mode == SDHCI_CDNS_HRS06_MODE_SD )
236
- sdhci_set_uhs_signaling (host , timing );
237
- }
238
-
239
- static const struct sdhci_ops sdhci_cdns_ops = {
240
- .set_clock = sdhci_set_clock ,
241
- .get_timeout_clock = sdhci_cdns_get_timeout_clock ,
242
- .set_bus_width = sdhci_set_bus_width ,
243
- .reset = sdhci_reset ,
244
- .set_uhs_signaling = sdhci_cdns_set_uhs_signaling ,
245
- };
246
-
247
- static const struct sdhci_pltfm_data sdhci_cdns_uniphier_pltfm_data = {
248
- .ops = & sdhci_cdns_ops ,
249
- .quirks2 = SDHCI_QUIRK2_PRESET_VALUE_BROKEN ,
250
- };
251
-
252
- static const struct sdhci_pltfm_data sdhci_cdns_pltfm_data = {
253
- .ops = & sdhci_cdns_ops ,
254
- };
255
-
256
205
static int sdhci_cdns_set_tune_val (struct sdhci_host * host , unsigned int val )
257
206
{
258
207
struct sdhci_cdns_priv * priv = sdhci_cdns_priv (host );
@@ -286,23 +235,24 @@ static int sdhci_cdns_set_tune_val(struct sdhci_host *host, unsigned int val)
286
235
return 0 ;
287
236
}
288
237
289
- static int sdhci_cdns_execute_tuning (struct mmc_host * mmc , u32 opcode )
238
+ /*
239
+ * In SD mode, software must not use the hardware tuning and instead perform
240
+ * an almost identical procedure to eMMC.
241
+ */
242
+ static int sdhci_cdns_execute_tuning (struct sdhci_host * host , u32 opcode )
290
243
{
291
- struct sdhci_host * host = mmc_priv (mmc );
292
244
int cur_streak = 0 ;
293
245
int max_streak = 0 ;
294
246
int end_of_streak = 0 ;
295
247
int i ;
296
248
297
249
/*
298
- * This handler only implements the eMMC tuning that is specific to
299
- * this controller. Fall back to the standard method for SD timing .
250
+ * Do not execute tuning for UHS_SDR50 or UHS_DDR50.
251
+ * The delay is set by probe, based on the DT properties .
300
252
*/
301
- if (host -> timing != MMC_TIMING_MMC_HS200 )
302
- return sdhci_execute_tuning (mmc , opcode );
303
-
304
- if (WARN_ON (opcode != MMC_SEND_TUNING_BLOCK_HS200 ))
305
- return - EINVAL ;
253
+ if (host -> timing != MMC_TIMING_MMC_HS200 &&
254
+ host -> timing != MMC_TIMING_UHS_SDR104 )
255
+ return 0 ;
306
256
307
257
for (i = 0 ; i < SDHCI_CDNS_MAX_TUNING_LOOP ; i ++ ) {
308
258
if (sdhci_cdns_set_tune_val (host , i ) ||
@@ -325,6 +275,58 @@ static int sdhci_cdns_execute_tuning(struct mmc_host *mmc, u32 opcode)
325
275
return sdhci_cdns_set_tune_val (host , end_of_streak - max_streak / 2 );
326
276
}
327
277
278
+ static void sdhci_cdns_set_uhs_signaling (struct sdhci_host * host ,
279
+ unsigned int timing )
280
+ {
281
+ struct sdhci_cdns_priv * priv = sdhci_cdns_priv (host );
282
+ u32 mode ;
283
+
284
+ switch (timing ) {
285
+ case MMC_TIMING_MMC_HS :
286
+ mode = SDHCI_CDNS_HRS06_MODE_MMC_SDR ;
287
+ break ;
288
+ case MMC_TIMING_MMC_DDR52 :
289
+ mode = SDHCI_CDNS_HRS06_MODE_MMC_DDR ;
290
+ break ;
291
+ case MMC_TIMING_MMC_HS200 :
292
+ mode = SDHCI_CDNS_HRS06_MODE_MMC_HS200 ;
293
+ break ;
294
+ case MMC_TIMING_MMC_HS400 :
295
+ if (priv -> enhanced_strobe )
296
+ mode = SDHCI_CDNS_HRS06_MODE_MMC_HS400ES ;
297
+ else
298
+ mode = SDHCI_CDNS_HRS06_MODE_MMC_HS400 ;
299
+ break ;
300
+ default :
301
+ mode = SDHCI_CDNS_HRS06_MODE_SD ;
302
+ break ;
303
+ }
304
+
305
+ sdhci_cdns_set_emmc_mode (priv , mode );
306
+
307
+ /* For SD, fall back to the default handler */
308
+ if (mode == SDHCI_CDNS_HRS06_MODE_SD )
309
+ sdhci_set_uhs_signaling (host , timing );
310
+ }
311
+
312
+ static const struct sdhci_ops sdhci_cdns_ops = {
313
+ .set_clock = sdhci_set_clock ,
314
+ .get_timeout_clock = sdhci_cdns_get_timeout_clock ,
315
+ .set_bus_width = sdhci_set_bus_width ,
316
+ .reset = sdhci_reset ,
317
+ .platform_execute_tuning = sdhci_cdns_execute_tuning ,
318
+ .set_uhs_signaling = sdhci_cdns_set_uhs_signaling ,
319
+ };
320
+
321
+ static const struct sdhci_pltfm_data sdhci_cdns_uniphier_pltfm_data = {
322
+ .ops = & sdhci_cdns_ops ,
323
+ .quirks2 = SDHCI_QUIRK2_PRESET_VALUE_BROKEN ,
324
+ };
325
+
326
+ static const struct sdhci_pltfm_data sdhci_cdns_pltfm_data = {
327
+ .ops = & sdhci_cdns_ops ,
328
+ };
329
+
328
330
static void sdhci_cdns_hs400_enhanced_strobe (struct mmc_host * mmc ,
329
331
struct mmc_ios * ios )
330
332
{
@@ -385,7 +387,6 @@ static int sdhci_cdns_probe(struct platform_device *pdev)
385
387
priv -> hrs_addr = host -> ioaddr ;
386
388
priv -> enhanced_strobe = false;
387
389
host -> ioaddr += SDHCI_CDNS_SRS_BASE ;
388
- host -> mmc_host_ops .execute_tuning = sdhci_cdns_execute_tuning ;
389
390
host -> mmc_host_ops .hs400_enhanced_strobe =
390
391
sdhci_cdns_hs400_enhanced_strobe ;
391
392
sdhci_enable_v4_mode (host );
0 commit comments