103
103
104
104
/* And some bitfield definitions */
105
105
106
+ #define DSI_PCKHDL_EOTP_TX_EN BIT(0)
107
+ #define DSI_PCKHDL_BTA_EN BIT(2)
108
+
109
+ #define DSI_VID_MODE_LP_CMD_EN BIT(15)
110
+ #define DSI_VID_MODE_FRAME_BTA_ACK_EN BIT(14)
111
+ #define DSI_VID_MODE_LP_HFP_EN BIT(13)
112
+ #define DSI_VID_MODE_LP_HBP_EN BIT(12)
113
+ #define DSI_VID_MODE_LP_VACT_EN BIT(11)
114
+ #define DSI_VID_MODE_LP_VFP_EN BIT(10)
115
+ #define DSI_VID_MODE_LP_VBP_EN BIT(9)
116
+ #define DSI_VID_MODE_LP_VSA_EN BIT(8)
117
+ #define DSI_VID_MODE_SYNC_PULSES 0
118
+ #define DSI_VID_MODE_SYNC_EVENTS 1
119
+ #define DSI_VID_MODE_BURST 2
120
+
121
+ #define DSI_CMD_MODE_ALL_LP 0x10f7f00
122
+ #define DSI_CMD_MODE_ACK_RQST_EN BIT(1)
123
+
106
124
#define DPHY_PWR_UP_SHUTDOWNZ_LSB 0
107
125
#define DPHY_PWR_UP_SHUTDOWNZ_BITS BIT(DPHY_PWR_UP_SHUTDOWNZ_LSB)
108
126
@@ -1252,8 +1270,8 @@ static u32 dphy_configure_pll(struct rp1_dsi *dsi, u32 refclk, u32 vco_freq)
1252
1270
vco_freq , actual_vco_freq , m , refclk , n ,
1253
1271
hsfreq_table [dsi -> hsfreq_index ].hsfreqrange );
1254
1272
} else {
1255
- drm_warn (dsi -> drm ,
1256
- "rp1dsi: Error configuring DPHY PLL %uHz\n" , vco_freq );
1273
+ drm_err (dsi -> drm ,
1274
+ "rp1dsi: Error configuring DPHY PLL %uHz\n" , vco_freq );
1257
1275
}
1258
1276
1259
1277
return actual_vco_freq ;
@@ -1321,7 +1339,7 @@ static void rp1dsi_dpiclk_start(struct rp1_dsi *dsi, u32 byte_clock,
1321
1339
clk_set_rate (dsi -> clocks [RP1DSI_CLOCK_DPI ], (4 * lanes * byte_clock ) / (bpp >> 1 ));
1322
1340
clk_prepare_enable (dsi -> clocks [RP1DSI_CLOCK_DPI ]);
1323
1341
drm_info (dsi -> drm ,
1324
- "rp1dsi: Nominal Byte clock %u DPI clock %lu (parent rate %lu)" ,
1342
+ "rp1dsi: Nominal Byte clock %u DPI clock %lu (parent rate %lu)\n " ,
1325
1343
byte_clock ,
1326
1344
clk_get_rate (dsi -> clocks [RP1DSI_CLOCK_DPI ]),
1327
1345
clk_get_rate (clk_get_parent (dsi -> clocks [RP1DSI_CLOCK_DPI ])));
@@ -1365,7 +1383,8 @@ static u32 get_colorcode(enum mipi_dsi_pixel_format fmt)
1365
1383
1366
1384
void rp1dsi_dsi_setup (struct rp1_dsi * dsi , struct drm_display_mode const * mode )
1367
1385
{
1368
- u32 timeout , mask , vid_mode_cfg ;
1386
+ int cmdtim ;
1387
+ u32 timeout , mask , clkdiv ;
1369
1388
unsigned int bpp = mipi_dsi_pixel_format_to_bpp (dsi -> display_format );
1370
1389
u32 byte_clock = clamp ((bpp * 125 * min (mode -> clock , RP1DSI_DPI_MAX_KHZ )) / dsi -> lanes ,
1371
1390
RP1DSI_BYTE_CLK_MIN , RP1DSI_BYTE_CLK_MAX );
@@ -1374,19 +1393,31 @@ void rp1dsi_dsi_setup(struct rp1_dsi *dsi, struct drm_display_mode const *mode)
1374
1393
DSI_WRITE (DSI_DPI_CFG_POL , 0 );
1375
1394
DSI_WRITE (DSI_GEN_VCID , dsi -> vc );
1376
1395
DSI_WRITE (DSI_DPI_COLOR_CODING , get_colorcode (dsi -> display_format ));
1377
- /* a conservative guess (LP escape is slow!) */
1378
- DSI_WRITE (DSI_DPI_LP_CMD_TIM , 0x00100000 );
1379
1396
1380
- /* Drop to LP where possible; use LP Escape for all commands */
1381
- vid_mode_cfg = 0xbf00 ;
1382
- if (!(dsi -> display_flags & MIPI_DSI_MODE_VIDEO_SYNC_PULSE ))
1383
- vid_mode_cfg |= 0x01 ;
1384
- else if (8 * dsi -> lanes > bpp )
1385
- vid_mode_cfg &= ~0x400 ; /* PULSE && inexact DPICLK => fix HBP time */
1397
+ /*
1398
+ * Flags to configure use of LP, EoTp, Burst Mode, Sync Events/Pulses.
1399
+ * Note that Burst Mode implies Sync Events; the two flags need not be
1400
+ * set concurrently, and in this RP1 variant *should not* both be set:
1401
+ * doing so would (counter-intuitively) enable Sync Pulses and may fail
1402
+ * if there is not sufficient time to return to LP11 state during HBP.
1403
+ */
1404
+ mask = DSI_VID_MODE_LP_HFP_EN | DSI_VID_MODE_LP_HBP_EN |
1405
+ DSI_VID_MODE_LP_VACT_EN | DSI_VID_MODE_LP_VFP_EN |
1406
+ DSI_VID_MODE_LP_VBP_EN | DSI_VID_MODE_LP_VSA_EN ;
1407
+ if (dsi -> display_flags & MIPI_DSI_MODE_LPM )
1408
+ mask |= DSI_VID_MODE_LP_CMD_EN ;
1386
1409
if (dsi -> display_flags & MIPI_DSI_MODE_VIDEO_BURST )
1387
- vid_mode_cfg |= 0x02 ;
1388
- DSI_WRITE (DSI_VID_MODE_CFG , vid_mode_cfg );
1389
- DSI_WRITE (DSI_CMD_MODE_CFG , 0x10F7F00 );
1410
+ mask |= DSI_VID_MODE_BURST ;
1411
+ else if (!(dsi -> display_flags & MIPI_DSI_MODE_VIDEO_SYNC_PULSE ))
1412
+ mask |= DSI_VID_MODE_SYNC_EVENTS ;
1413
+ else if (8 * dsi -> lanes > bpp )
1414
+ mask &= ~DSI_VID_MODE_LP_HBP_EN ; /* PULSE && inexact DPICLK => fix HBP time */
1415
+ DSI_WRITE (DSI_VID_MODE_CFG , mask );
1416
+ DSI_WRITE (DSI_CMD_MODE_CFG ,
1417
+ (dsi -> display_flags & MIPI_DSI_MODE_LPM ) ? DSI_CMD_MODE_ALL_LP : 0 );
1418
+ DSI_WRITE (DSI_PCKHDL_CFG ,
1419
+ DSI_PCKHDL_BTA_EN |
1420
+ ((dsi -> display_flags & MIPI_DSI_MODE_NO_EOT_PACKET ) ? 0 : DSI_PCKHDL_EOTP_TX_EN ));
1390
1421
1391
1422
/* Select Command Mode */
1392
1423
DSI_WRITE (DSI_MODE_CFG , 1 );
@@ -1397,9 +1428,9 @@ void rp1dsi_dsi_setup(struct rp1_dsi *dsi, struct drm_display_mode const *mode)
1397
1428
timeout = 0 ;
1398
1429
DSI_WRITE (DSI_TO_CNT_CFG , (timeout << 16 ) | RP1DSI_LPRX_TO_VAL );
1399
1430
DSI_WRITE (DSI_BTA_TO_CNT , RP1DSI_BTA_TO_VAL );
1431
+ clkdiv = max (2u , 1u + byte_clock / RP1DSI_ESC_CLK_MAX ); /* byte clocks per escape clock */
1400
1432
DSI_WRITE (DSI_CLKMGR_CFG ,
1401
- (RP1DSI_TO_CLK_DIV << 8 ) |
1402
- max (2u , 1u + byte_clock / RP1DSI_ESC_CLK_MAX ));
1433
+ (RP1DSI_TO_CLK_DIV << 8 ) | clkdiv );
1403
1434
1404
1435
/* Configure video timings */
1405
1436
DSI_WRITE (DSI_VID_PKT_SIZE , mode -> hdisplay );
@@ -1425,6 +1456,18 @@ void rp1dsi_dsi_setup(struct rp1_dsi *dsi, struct drm_display_mode const *mode)
1425
1456
(hsfreq_table [dsi -> hsfreq_index ].data_lp2hs << DSI_PHY_TMR_LP2HS_LSB ) |
1426
1457
(hsfreq_table [dsi -> hsfreq_index ].data_hs2lp << DSI_PHY_TMR_HS2LP_LSB ));
1427
1458
1459
+ /* Estimate how many LP bytes can be sent during vertical blanking (Databook 3.6.2.1) */
1460
+ cmdtim = mode -> htotal ;
1461
+ if (dsi -> display_flags & MIPI_DSI_MODE_VIDEO_SYNC_PULSE )
1462
+ cmdtim -= mode -> hsync_end - mode -> hsync_start ;
1463
+ cmdtim = (bpp * cmdtim - 64 ) / (8 * dsi -> lanes ); /* byte clocks after HSS and EoTp */
1464
+ cmdtim -= hsfreq_table [dsi -> hsfreq_index ].data_hs2lp ;
1465
+ cmdtim -= hsfreq_table [dsi -> hsfreq_index ].data_lp2hs ;
1466
+ cmdtim = (cmdtim / clkdiv ) - 24 ; /* escape clocks for commands */
1467
+ cmdtim = max (0 , cmdtim >> 4 ); /* bytes (at 2 clocks per bit) */
1468
+ drm_info (dsi -> drm , "rp1dsi: Command time (outvact): %d\n" , cmdtim );
1469
+ DSI_WRITE (DSI_DPI_LP_CMD_TIM , cmdtim << 16 );
1470
+
1428
1471
/* Wait for PLL lock */
1429
1472
for (timeout = (1 << 14 ); timeout != 0 ; -- timeout ) {
1430
1473
usleep_range (10 , 50 );
@@ -1434,9 +1477,9 @@ void rp1dsi_dsi_setup(struct rp1_dsi *dsi, struct drm_display_mode const *mode)
1434
1477
if (timeout == 0 )
1435
1478
drm_err (dsi -> drm , "RP1DSI: Time out waiting for PLL\n" );
1436
1479
1437
- DSI_WRITE (DSI_LPCLK_CTRL , 0x1 ); /* configure the requesthsclk */
1480
+ DSI_WRITE (DSI_LPCLK_CTRL ,
1481
+ (dsi -> display_flags & MIPI_DSI_CLOCK_NON_CONTINUOUS ) ? 0x3 : 0x1 );
1438
1482
DSI_WRITE (DSI_PHY_TST_CTRL0 , 0x2 );
1439
- DSI_WRITE (DSI_PCKHDL_CFG , 1 << 2 ); /* allow bus turnaround */
1440
1483
DSI_WRITE (DSI_PWR_UP , 0x1 ); /* power up */
1441
1484
1442
1485
/* Now it should be safe to start the external DPI clock divider */
@@ -1460,7 +1503,8 @@ void rp1dsi_dsi_setup(struct rp1_dsi *dsi, struct drm_display_mode const *mode)
1460
1503
mask , DSI_READ (DSI_PHY_STATUS ));
1461
1504
}
1462
1505
1463
- void rp1dsi_dsi_send (struct rp1_dsi * dsi , u32 hdr , int len , const u8 * buf )
1506
+ void rp1dsi_dsi_send (struct rp1_dsi * dsi , u32 hdr , int len , const u8 * buf ,
1507
+ bool use_lpm , bool req_ack )
1464
1508
{
1465
1509
u32 val ;
1466
1510
@@ -1471,6 +1515,24 @@ void rp1dsi_dsi_send(struct rp1_dsi *dsi, u32 hdr, int len, const u8 *buf)
1471
1515
usleep_range (100 , 150 );
1472
1516
}
1473
1517
1518
+ /*
1519
+ * Update global configuration flags for LP/HS and ACK options.
1520
+ * XXX It's not clear if having empty FIFOs (checked above and below) guarantees that
1521
+ * the last command has completed and been ACKed, or how closely these control registers
1522
+ * align with command/payload FIFO writes (as each is an independent clock-crossing)?
1523
+ */
1524
+ val = DSI_READ (DSI_VID_MODE_CFG );
1525
+ if (use_lpm )
1526
+ val |= DSI_VID_MODE_LP_CMD_EN ;
1527
+ else
1528
+ val &= ~DSI_VID_MODE_LP_CMD_EN ;
1529
+ DSI_WRITE (DSI_VID_MODE_CFG , val );
1530
+ val = (use_lpm ) ? DSI_CMD_MODE_ALL_LP : 0 ;
1531
+ if (req_ack )
1532
+ val |= DSI_CMD_MODE_ACK_RQST_EN ;
1533
+ DSI_WRITE (DSI_CMD_MODE_CFG , val );
1534
+ (void )DSI_READ (DSI_CMD_MODE_CFG );
1535
+
1474
1536
/* Write payload (in 32-bit words) and header */
1475
1537
for (; len > 0 ; len -= 4 ) {
1476
1538
val = * buf ++ ;
@@ -1504,8 +1566,10 @@ int rp1dsi_dsi_recv(struct rp1_dsi *dsi, int len, u8 *buf)
1504
1566
break ;
1505
1567
usleep_range (100 , 150 );
1506
1568
}
1507
- if (i == 0 )
1569
+ if (!i ) {
1570
+ drm_warn (dsi -> drm , "Receive failed\n" );
1508
1571
return - EIO ;
1572
+ }
1509
1573
1510
1574
for (i = 0 ; i < len ; i += 4 ) {
1511
1575
/* Read fifo must not be empty before all bytes are read */
0 commit comments