76
76
#define MSDC_PATCH_BIT1 0xb4
77
77
#define MSDC_PAD_TUNE 0xec
78
78
#define PAD_DS_TUNE 0x188
79
+ #define PAD_CMD_TUNE 0x18c
79
80
#define EMMC50_CFG0 0x208
80
81
81
82
/*--------------------------------------------------------------------------*/
211
212
#define MSDC_PATCH_BIT_SPCPUSH (0x1 << 29) /* RW */
212
213
#define MSDC_PATCH_BIT_DECRCTMO (0x1 << 30) /* RW */
213
214
215
+ #define MSDC_PAD_TUNE_DATWRDLY (0x1f << 0) /* RW */
214
216
#define MSDC_PAD_TUNE_DATRRDLY (0x1f << 8) /* RW */
215
217
#define MSDC_PAD_TUNE_CMDRDLY (0x1f << 16) /* RW */
218
+ #define MSDC_PAD_TUNE_CMDRRDLY (0x1f << 22) /* RW */
219
+ #define MSDC_PAD_TUNE_CLKTDLY (0x1f << 27) /* RW */
216
220
217
221
#define PAD_DS_TUNE_DLY1 (0x1f << 2) /* RW */
218
222
#define PAD_DS_TUNE_DLY2 (0x1f << 7) /* RW */
219
223
#define PAD_DS_TUNE_DLY3 (0x1f << 12) /* RW */
220
224
225
+ #define PAD_CMD_TUNE_RX_DLY3 (0x1f << 1) /* RW */
226
+
221
227
#define EMMC50_CFG_PADCMD_LATCHCK (0x1 << 0) /* RW */
222
228
#define EMMC50_CFG_CRCSTS_EDGE (0x1 << 3) /* RW */
223
229
#define EMMC50_CFG_CFCSTS_SEL (0x1 << 4) /* RW */
@@ -285,12 +291,14 @@ struct msdc_save_para {
285
291
u32 patch_bit0 ;
286
292
u32 patch_bit1 ;
287
293
u32 pad_ds_tune ;
294
+ u32 pad_cmd_tune ;
288
295
u32 emmc50_cfg0 ;
289
296
};
290
297
291
298
struct msdc_tune_para {
292
299
u32 iocon ;
293
300
u32 pad_tune ;
301
+ u32 pad_cmd_tune ;
294
302
};
295
303
296
304
struct msdc_delay_phase {
@@ -332,6 +340,10 @@ struct msdc_host {
332
340
unsigned char timing ;
333
341
bool vqmmc_enabled ;
334
342
u32 hs400_ds_delay ;
343
+ u32 hs200_cmd_int_delay ; /* cmd internal delay for HS200/SDR104 */
344
+ u32 hs400_cmd_int_delay ; /* cmd internal delay for HS400 */
345
+ bool hs400_cmd_resp_sel_rising ;
346
+ /* cmd response sample selection for HS400 */
335
347
bool hs400_mode ; /* current eMMC will run at hs400 mode */
336
348
struct msdc_save_para save_para ; /* used when gate HCLK */
337
349
struct msdc_tune_para def_tune_para ; /* default tune setting */
@@ -601,8 +613,14 @@ static void msdc_set_mclk(struct msdc_host *host, unsigned char timing, u32 hz)
601
613
} else {
602
614
writel (host -> saved_tune_para .iocon , host -> base + MSDC_IOCON );
603
615
writel (host -> saved_tune_para .pad_tune , host -> base + MSDC_PAD_TUNE );
616
+ writel (host -> saved_tune_para .pad_cmd_tune ,
617
+ host -> base + PAD_CMD_TUNE );
604
618
}
605
619
620
+ if (timing == MMC_TIMING_MMC_HS400 )
621
+ sdr_set_field (host -> base + PAD_CMD_TUNE ,
622
+ MSDC_PAD_TUNE_CMDRRDLY ,
623
+ host -> hs400_cmd_int_delay );
606
624
dev_dbg (host -> dev , "sclk: %d, timing: %d\n" , host -> sclk , timing );
607
625
}
608
626
@@ -1303,7 +1321,7 @@ static struct msdc_delay_phase get_best_delay(struct msdc_host *host, u32 delay)
1303
1321
len_final = len ;
1304
1322
}
1305
1323
start += len ? len : 1 ;
1306
- if (len >= 8 && start_final < 4 )
1324
+ if (len >= 12 && start_final < 4 )
1307
1325
break ;
1308
1326
}
1309
1327
@@ -1326,36 +1344,67 @@ static int msdc_tune_response(struct mmc_host *mmc, u32 opcode)
1326
1344
struct msdc_host * host = mmc_priv (mmc );
1327
1345
u32 rise_delay = 0 , fall_delay = 0 ;
1328
1346
struct msdc_delay_phase final_rise_delay , final_fall_delay = { 0 ,};
1347
+ struct msdc_delay_phase internal_delay_phase ;
1329
1348
u8 final_delay , final_maxlen ;
1349
+ u32 internal_delay = 0 ;
1330
1350
int cmd_err ;
1331
- int i ;
1351
+ int i , j ;
1352
+
1353
+ if (mmc -> ios .timing == MMC_TIMING_MMC_HS200 ||
1354
+ mmc -> ios .timing == MMC_TIMING_UHS_SDR104 )
1355
+ sdr_set_field (host -> base + MSDC_PAD_TUNE ,
1356
+ MSDC_PAD_TUNE_CMDRRDLY ,
1357
+ host -> hs200_cmd_int_delay );
1332
1358
1333
1359
sdr_clr_bits (host -> base + MSDC_IOCON , MSDC_IOCON_RSPL );
1334
1360
for (i = 0 ; i < PAD_DELAY_MAX ; i ++ ) {
1335
1361
sdr_set_field (host -> base + MSDC_PAD_TUNE ,
1336
1362
MSDC_PAD_TUNE_CMDRDLY , i );
1337
- mmc_send_tuning (mmc , opcode , & cmd_err );
1338
- if (!cmd_err )
1339
- rise_delay |= (1 << i );
1363
+ /*
1364
+ * Using the same parameters, it may sometimes pass the test,
1365
+ * but sometimes it may fail. To make sure the parameters are
1366
+ * more stable, we test each set of parameters 3 times.
1367
+ */
1368
+ for (j = 0 ; j < 3 ; j ++ ) {
1369
+ mmc_send_tuning (mmc , opcode , & cmd_err );
1370
+ if (!cmd_err ) {
1371
+ rise_delay |= (1 << i );
1372
+ } else {
1373
+ rise_delay &= ~(1 << i );
1374
+ break ;
1375
+ }
1376
+ }
1340
1377
}
1341
1378
final_rise_delay = get_best_delay (host , rise_delay );
1342
1379
/* if rising edge has enough margin, then do not scan falling edge */
1343
- if (final_rise_delay .maxlen >= 10 ||
1344
- (final_rise_delay .start == 0 && final_rise_delay .maxlen >= 4 ))
1380
+ if (final_rise_delay .maxlen >= 12 && final_rise_delay .start < 4 )
1345
1381
goto skip_fall ;
1346
1382
1347
1383
sdr_set_bits (host -> base + MSDC_IOCON , MSDC_IOCON_RSPL );
1348
1384
for (i = 0 ; i < PAD_DELAY_MAX ; i ++ ) {
1349
1385
sdr_set_field (host -> base + MSDC_PAD_TUNE ,
1350
1386
MSDC_PAD_TUNE_CMDRDLY , i );
1351
- mmc_send_tuning (mmc , opcode , & cmd_err );
1352
- if (!cmd_err )
1353
- fall_delay |= (1 << i );
1387
+ /*
1388
+ * Using the same parameters, it may sometimes pass the test,
1389
+ * but sometimes it may fail. To make sure the parameters are
1390
+ * more stable, we test each set of parameters 3 times.
1391
+ */
1392
+ for (j = 0 ; j < 3 ; j ++ ) {
1393
+ mmc_send_tuning (mmc , opcode , & cmd_err );
1394
+ if (!cmd_err ) {
1395
+ fall_delay |= (1 << i );
1396
+ } else {
1397
+ fall_delay &= ~(1 << i );
1398
+ break ;
1399
+ }
1400
+ }
1354
1401
}
1355
1402
final_fall_delay = get_best_delay (host , fall_delay );
1356
1403
1357
1404
skip_fall :
1358
1405
final_maxlen = max (final_rise_delay .maxlen , final_fall_delay .maxlen );
1406
+ if (final_fall_delay .maxlen >= 12 && final_fall_delay .start < 4 )
1407
+ final_maxlen = final_fall_delay .maxlen ;
1359
1408
if (final_maxlen == final_rise_delay .maxlen ) {
1360
1409
sdr_clr_bits (host -> base + MSDC_IOCON , MSDC_IOCON_RSPL );
1361
1410
sdr_set_field (host -> base + MSDC_PAD_TUNE , MSDC_PAD_TUNE_CMDRDLY ,
@@ -1367,7 +1416,71 @@ static int msdc_tune_response(struct mmc_host *mmc, u32 opcode)
1367
1416
final_fall_delay .final_phase );
1368
1417
final_delay = final_fall_delay .final_phase ;
1369
1418
}
1419
+ if (host -> hs200_cmd_int_delay )
1420
+ goto skip_internal ;
1421
+
1422
+ for (i = 0 ; i < PAD_DELAY_MAX ; i ++ ) {
1423
+ sdr_set_field (host -> base + MSDC_PAD_TUNE ,
1424
+ MSDC_PAD_TUNE_CMDRRDLY , i );
1425
+ mmc_send_tuning (mmc , opcode , & cmd_err );
1426
+ if (!cmd_err )
1427
+ internal_delay |= (1 << i );
1428
+ }
1429
+ dev_dbg (host -> dev , "Final internal delay: 0x%x\n" , internal_delay );
1430
+ internal_delay_phase = get_best_delay (host , internal_delay );
1431
+ sdr_set_field (host -> base + MSDC_PAD_TUNE , MSDC_PAD_TUNE_CMDRRDLY ,
1432
+ internal_delay_phase .final_phase );
1433
+ skip_internal :
1434
+ dev_dbg (host -> dev , "Final cmd pad delay: %x\n" , final_delay );
1435
+ return final_delay == 0xff ? - EIO : 0 ;
1436
+ }
1437
+
1438
+ static int hs400_tune_response (struct mmc_host * mmc , u32 opcode )
1439
+ {
1440
+ struct msdc_host * host = mmc_priv (mmc );
1441
+ u32 cmd_delay = 0 ;
1442
+ struct msdc_delay_phase final_cmd_delay = { 0 ,};
1443
+ u8 final_delay ;
1444
+ int cmd_err ;
1445
+ int i , j ;
1446
+
1447
+ /* select EMMC50 PAD CMD tune */
1448
+ sdr_set_bits (host -> base + PAD_CMD_TUNE , BIT (0 ));
1449
+
1450
+ if (mmc -> ios .timing == MMC_TIMING_MMC_HS200 ||
1451
+ mmc -> ios .timing == MMC_TIMING_UHS_SDR104 )
1452
+ sdr_set_field (host -> base + MSDC_PAD_TUNE ,
1453
+ MSDC_PAD_TUNE_CMDRRDLY ,
1454
+ host -> hs200_cmd_int_delay );
1455
+
1456
+ if (host -> hs400_cmd_resp_sel_rising )
1457
+ sdr_clr_bits (host -> base + MSDC_IOCON , MSDC_IOCON_RSPL );
1458
+ else
1459
+ sdr_set_bits (host -> base + MSDC_IOCON , MSDC_IOCON_RSPL );
1460
+ for (i = 0 ; i < PAD_DELAY_MAX ; i ++ ) {
1461
+ sdr_set_field (host -> base + PAD_CMD_TUNE ,
1462
+ PAD_CMD_TUNE_RX_DLY3 , i );
1463
+ /*
1464
+ * Using the same parameters, it may sometimes pass the test,
1465
+ * but sometimes it may fail. To make sure the parameters are
1466
+ * more stable, we test each set of parameters 3 times.
1467
+ */
1468
+ for (j = 0 ; j < 3 ; j ++ ) {
1469
+ mmc_send_tuning (mmc , opcode , & cmd_err );
1470
+ if (!cmd_err ) {
1471
+ cmd_delay |= (1 << i );
1472
+ } else {
1473
+ cmd_delay &= ~(1 << i );
1474
+ break ;
1475
+ }
1476
+ }
1477
+ }
1478
+ final_cmd_delay = get_best_delay (host , cmd_delay );
1479
+ sdr_set_field (host -> base + PAD_CMD_TUNE , PAD_CMD_TUNE_RX_DLY3 ,
1480
+ final_cmd_delay .final_phase );
1481
+ final_delay = final_cmd_delay .final_phase ;
1370
1482
1483
+ dev_dbg (host -> dev , "Final cmd pad delay: %x\n" , final_delay );
1371
1484
return final_delay == 0xff ? - EIO : 0 ;
1372
1485
}
1373
1486
@@ -1390,7 +1503,7 @@ static int msdc_tune_data(struct mmc_host *mmc, u32 opcode)
1390
1503
}
1391
1504
final_rise_delay = get_best_delay (host , rise_delay );
1392
1505
/* if rising edge has enough margin, then do not scan falling edge */
1393
- if (final_rise_delay .maxlen >= 10 ||
1506
+ if (final_rise_delay .maxlen >= 12 ||
1394
1507
(final_rise_delay .start == 0 && final_rise_delay .maxlen >= 4 ))
1395
1508
goto skip_fall ;
1396
1509
@@ -1423,6 +1536,7 @@ static int msdc_tune_data(struct mmc_host *mmc, u32 opcode)
1423
1536
final_delay = final_fall_delay .final_phase ;
1424
1537
}
1425
1538
1539
+ dev_dbg (host -> dev , "Final data pad delay: %x\n" , final_delay );
1426
1540
return final_delay == 0xff ? - EIO : 0 ;
1427
1541
}
1428
1542
@@ -1431,7 +1545,10 @@ static int msdc_execute_tuning(struct mmc_host *mmc, u32 opcode)
1431
1545
struct msdc_host * host = mmc_priv (mmc );
1432
1546
int ret ;
1433
1547
1434
- ret = msdc_tune_response (mmc , opcode );
1548
+ if (host -> hs400_mode )
1549
+ ret = hs400_tune_response (mmc , opcode );
1550
+ else
1551
+ ret = msdc_tune_response (mmc , opcode );
1435
1552
if (ret == - EIO ) {
1436
1553
dev_err (host -> dev , "Tune response fail!\n" );
1437
1554
return ret ;
@@ -1444,6 +1561,7 @@ static int msdc_execute_tuning(struct mmc_host *mmc, u32 opcode)
1444
1561
1445
1562
host -> saved_tune_para .iocon = readl (host -> base + MSDC_IOCON );
1446
1563
host -> saved_tune_para .pad_tune = readl (host -> base + MSDC_PAD_TUNE );
1564
+ host -> saved_tune_para .pad_cmd_tune = readl (host -> base + PAD_CMD_TUNE );
1447
1565
return ret ;
1448
1566
}
1449
1567
@@ -1478,6 +1596,25 @@ static struct mmc_host_ops mt_msdc_ops = {
1478
1596
.hw_reset = msdc_hw_reset ,
1479
1597
};
1480
1598
1599
+ static void msdc_of_property_parse (struct platform_device * pdev ,
1600
+ struct msdc_host * host )
1601
+ {
1602
+ of_property_read_u32 (pdev -> dev .of_node , "hs400-ds-delay" ,
1603
+ & host -> hs400_ds_delay );
1604
+
1605
+ of_property_read_u32 (pdev -> dev .of_node , "mediatek,hs200-cmd-int-delay" ,
1606
+ & host -> hs200_cmd_int_delay );
1607
+
1608
+ of_property_read_u32 (pdev -> dev .of_node , "mediatek,hs400-cmd-int-delay" ,
1609
+ & host -> hs400_cmd_int_delay );
1610
+
1611
+ if (of_property_read_bool (pdev -> dev .of_node ,
1612
+ "mediatek,hs400-cmd-resp-sel-rising" ))
1613
+ host -> hs400_cmd_resp_sel_rising = true;
1614
+ else
1615
+ host -> hs400_cmd_resp_sel_rising = false;
1616
+ }
1617
+
1481
1618
static int msdc_drv_probe (struct platform_device * pdev )
1482
1619
{
1483
1620
struct mmc_host * mmc ;
@@ -1549,10 +1686,7 @@ static int msdc_drv_probe(struct platform_device *pdev)
1549
1686
goto host_free ;
1550
1687
}
1551
1688
1552
- if (!of_property_read_u32 (pdev -> dev .of_node , "hs400-ds-delay" ,
1553
- & host -> hs400_ds_delay ))
1554
- dev_dbg (& pdev -> dev , "hs400-ds-delay: %x\n" ,
1555
- host -> hs400_ds_delay );
1689
+ msdc_of_property_parse (pdev , host );
1556
1690
1557
1691
host -> dev = & pdev -> dev ;
1558
1692
host -> mmc = mmc ;
@@ -1664,6 +1798,7 @@ static void msdc_save_reg(struct msdc_host *host)
1664
1798
host -> save_para .patch_bit0 = readl (host -> base + MSDC_PATCH_BIT );
1665
1799
host -> save_para .patch_bit1 = readl (host -> base + MSDC_PATCH_BIT1 );
1666
1800
host -> save_para .pad_ds_tune = readl (host -> base + PAD_DS_TUNE );
1801
+ host -> save_para .pad_cmd_tune = readl (host -> base + PAD_CMD_TUNE );
1667
1802
host -> save_para .emmc50_cfg0 = readl (host -> base + EMMC50_CFG0 );
1668
1803
}
1669
1804
@@ -1676,6 +1811,7 @@ static void msdc_restore_reg(struct msdc_host *host)
1676
1811
writel (host -> save_para .patch_bit0 , host -> base + MSDC_PATCH_BIT );
1677
1812
writel (host -> save_para .patch_bit1 , host -> base + MSDC_PATCH_BIT1 );
1678
1813
writel (host -> save_para .pad_ds_tune , host -> base + PAD_DS_TUNE );
1814
+ writel (host -> save_para .pad_cmd_tune , host -> base + PAD_CMD_TUNE );
1679
1815
writel (host -> save_para .emmc50_cfg0 , host -> base + EMMC50_CFG0 );
1680
1816
}
1681
1817
0 commit comments