11
11
12
12
#include <drm/drm_atomic.h>
13
13
#include <drm/drm_atomic_helper.h>
14
- #include <drm/drm_atomic_uapi.h>
15
14
#include <drm/drm_blend.h>
16
- #include <drm/drm_crtc.h>
17
15
#include <drm/drm_device.h>
18
16
#include <drm/drm_fb_dma_helper.h>
19
17
#include <drm/drm_fourcc.h>
20
18
#include <drm/drm_framebuffer.h>
21
19
#include <drm/drm_managed.h>
22
20
#include <drm/drm_plane.h>
23
- #include <drm/drm_vblank.h>
24
21
25
22
#include <linux/clk.h>
26
- #include <linux/delay.h>
27
23
#include <linux/dma/xilinx_dpdma.h>
28
24
#include <linux/dma-mapping.h>
29
25
#include <linux/dmaengine.h>
30
26
#include <linux/module.h>
31
27
#include <linux/of.h>
32
28
#include <linux/platform_device.h>
33
- #include <linux/pm_runtime.h>
34
- #include <linux/spinlock.h>
35
29
36
30
#include "zynqmp_disp.h"
37
31
#include "zynqmp_disp_regs.h"
@@ -88,16 +82,6 @@ struct zynqmp_disp_format {
88
82
const u32 * sf ;
89
83
};
90
84
91
- /**
92
- * enum zynqmp_disp_layer_id - Layer identifier
93
- * @ZYNQMP_DISP_LAYER_VID: Video layer
94
- * @ZYNQMP_DISP_LAYER_GFX: Graphics layer
95
- */
96
- enum zynqmp_disp_layer_id {
97
- ZYNQMP_DISP_LAYER_VID ,
98
- ZYNQMP_DISP_LAYER_GFX
99
- };
100
-
101
85
/**
102
86
* enum zynqmp_disp_layer_mode - Layer mode
103
87
* @ZYNQMP_DISP_LAYER_NONLIVE: non-live (memory) mode
@@ -143,7 +127,7 @@ struct zynqmp_disp_layer_info {
143
127
* @mode: Current operation mode
144
128
*/
145
129
struct zynqmp_disp_layer {
146
- enum zynqmp_disp_layer_id id ;
130
+ enum zynqmp_dpsub_layer_id id ;
147
131
struct zynqmp_disp * disp ;
148
132
const struct zynqmp_disp_layer_info * info ;
149
133
@@ -398,12 +382,12 @@ static void zynqmp_disp_avbuf_write(struct zynqmp_disp *disp, int reg, u32 val)
398
382
399
383
static bool zynqmp_disp_layer_is_gfx (const struct zynqmp_disp_layer * layer )
400
384
{
401
- return layer -> id == ZYNQMP_DISP_LAYER_GFX ;
385
+ return layer -> id == ZYNQMP_DPSUB_LAYER_GFX ;
402
386
}
403
387
404
388
static bool zynqmp_disp_layer_is_video (const struct zynqmp_disp_layer * layer )
405
389
{
406
- return layer -> id == ZYNQMP_DISP_LAYER_VID ;
390
+ return layer -> id == ZYNQMP_DPSUB_LAYER_VID ;
407
391
}
408
392
409
393
/**
@@ -882,35 +866,6 @@ static void zynqmp_disp_audio_disable(struct zynqmp_disp *disp)
882
866
ZYNQMP_DISP_AUD_SOFT_RESET_AUD_SRST );
883
867
}
884
868
885
- /* -----------------------------------------------------------------------------
886
- * ZynqMP Display external functions for zynqmp_dp
887
- */
888
-
889
- /**
890
- * zynqmp_disp_handle_vblank - Handle the vblank event
891
- * @disp: Display controller
892
- *
893
- * This function handles the vblank interrupt, and sends an event to
894
- * CRTC object. This will be called by the DP vblank interrupt handler.
895
- */
896
- void zynqmp_disp_handle_vblank (struct zynqmp_disp * disp )
897
- {
898
- struct drm_crtc * crtc = & disp -> dpsub -> crtc ;
899
-
900
- drm_crtc_handle_vblank (crtc );
901
- }
902
-
903
- /**
904
- * zynqmp_disp_get_crtc_mask - Return the CRTC bit mask
905
- * @disp: Display controller
906
- *
907
- * Return: the crtc mask of the zyqnmp_disp CRTC.
908
- */
909
- uint32_t zynqmp_disp_get_crtc_mask (struct zynqmp_disp * disp )
910
- {
911
- return drm_crtc_mask (& disp -> dpsub -> crtc );
912
- }
913
-
914
869
/* -----------------------------------------------------------------------------
915
870
* ZynqMP Display Layer & DRM Plane
916
871
*/
@@ -1110,7 +1065,7 @@ zynqmp_disp_plane_atomic_check(struct drm_plane *plane,
1110
1065
false, false);
1111
1066
}
1112
1067
1113
- static void
1068
+ void
1114
1069
zynqmp_disp_plane_atomic_disable (struct drm_plane * plane ,
1115
1070
struct drm_atomic_state * state )
1116
1071
{
@@ -1300,12 +1255,12 @@ static int zynqmp_disp_layer_request_dma(struct zynqmp_disp *disp,
1300
1255
static int zynqmp_disp_create_layers (struct zynqmp_disp * disp )
1301
1256
{
1302
1257
static const struct zynqmp_disp_layer_info layer_info [] = {
1303
- [ZYNQMP_DISP_LAYER_VID ] = {
1258
+ [ZYNQMP_DPSUB_LAYER_VID ] = {
1304
1259
.formats = avbuf_vid_fmts ,
1305
1260
.num_formats = ARRAY_SIZE (avbuf_vid_fmts ),
1306
1261
.num_channels = 3 ,
1307
1262
},
1308
- [ZYNQMP_DISP_LAYER_GFX ] = {
1263
+ [ZYNQMP_DPSUB_LAYER_GFX ] = {
1309
1264
.formats = avbuf_gfx_fmts ,
1310
1265
.num_formats = ARRAY_SIZE (avbuf_gfx_fmts ),
1311
1266
.num_channels = 1 ,
@@ -1335,14 +1290,14 @@ static int zynqmp_disp_create_layers(struct zynqmp_disp *disp)
1335
1290
}
1336
1291
1337
1292
/* -----------------------------------------------------------------------------
1338
- * ZynqMP Display & DRM CRTC
1293
+ * ZynqMP Display
1339
1294
*/
1340
1295
1341
1296
/**
1342
1297
* zynqmp_disp_enable - Enable the display controller
1343
1298
* @disp: Display controller
1344
1299
*/
1345
- static void zynqmp_disp_enable (struct zynqmp_disp * disp )
1300
+ void zynqmp_disp_enable (struct zynqmp_disp * disp )
1346
1301
{
1347
1302
zynqmp_disp_blend_set_output_format (disp , ZYNQMP_DPSUB_FORMAT_RGB );
1348
1303
zynqmp_disp_blend_set_bg_color (disp , 0 , 0 , 0 );
@@ -1362,7 +1317,7 @@ static void zynqmp_disp_enable(struct zynqmp_disp *disp)
1362
1317
* zynqmp_disp_disable - Disable the display controller
1363
1318
* @disp: Display controller
1364
1319
*/
1365
- static void zynqmp_disp_disable (struct zynqmp_disp * disp )
1320
+ void zynqmp_disp_disable (struct zynqmp_disp * disp )
1366
1321
{
1367
1322
zynqmp_disp_audio_disable (disp );
1368
1323
@@ -1371,8 +1326,15 @@ static void zynqmp_disp_disable(struct zynqmp_disp *disp)
1371
1326
zynqmp_disp_avbuf_disable (disp );
1372
1327
}
1373
1328
1374
- static int zynqmp_disp_setup_clock (struct zynqmp_disp * disp ,
1375
- unsigned long mode_clock )
1329
+ /**
1330
+ * zynqmp_disp_setup_clock - Configure the display controller pixel clock rate
1331
+ * @disp: Display controller
1332
+ * @mode_clock: The pixel clock rate, in Hz
1333
+ *
1334
+ * Return: 0 on success, or a negative error clock otherwise
1335
+ */
1336
+ int zynqmp_disp_setup_clock (struct zynqmp_disp * disp ,
1337
+ unsigned long mode_clock )
1376
1338
{
1377
1339
unsigned long rate ;
1378
1340
long diff ;
@@ -1398,186 +1360,13 @@ static int zynqmp_disp_setup_clock(struct zynqmp_disp *disp,
1398
1360
return 0 ;
1399
1361
}
1400
1362
1401
- static inline struct zynqmp_disp * crtc_to_disp (struct drm_crtc * crtc )
1402
- {
1403
- return container_of (crtc , struct zynqmp_dpsub , crtc )-> disp ;
1404
- }
1405
-
1406
- static void
1407
- zynqmp_disp_crtc_atomic_enable (struct drm_crtc * crtc ,
1408
- struct drm_atomic_state * state )
1409
- {
1410
- struct zynqmp_disp * disp = crtc_to_disp (crtc );
1411
- struct drm_display_mode * adjusted_mode = & crtc -> state -> adjusted_mode ;
1412
- int ret , vrefresh ;
1413
-
1414
- pm_runtime_get_sync (disp -> dev );
1415
-
1416
- zynqmp_disp_setup_clock (disp , adjusted_mode -> clock * 1000 );
1417
-
1418
- ret = clk_prepare_enable (disp -> dpsub -> vid_clk );
1419
- if (ret ) {
1420
- dev_err (disp -> dev , "failed to enable the video clock\n" );
1421
- pm_runtime_put_sync (disp -> dev );
1422
- return ;
1423
- }
1424
-
1425
- zynqmp_disp_enable (disp );
1426
-
1427
- /* Delay of 3 vblank intervals for timing gen to be stable */
1428
- vrefresh = (adjusted_mode -> clock * 1000 ) /
1429
- (adjusted_mode -> vtotal * adjusted_mode -> htotal );
1430
- msleep (3 * 1000 / vrefresh );
1431
- }
1432
-
1433
- static void
1434
- zynqmp_disp_crtc_atomic_disable (struct drm_crtc * crtc ,
1435
- struct drm_atomic_state * state )
1436
- {
1437
- struct zynqmp_disp * disp = crtc_to_disp (crtc );
1438
- struct drm_plane_state * old_plane_state ;
1439
-
1440
- /*
1441
- * Disable the plane if active. The old plane state can be NULL in the
1442
- * .shutdown() path if the plane is already disabled, skip
1443
- * zynqmp_disp_plane_atomic_disable() in that case.
1444
- */
1445
- old_plane_state = drm_atomic_get_old_plane_state (state , crtc -> primary );
1446
- if (old_plane_state )
1447
- zynqmp_disp_plane_atomic_disable (crtc -> primary , state );
1448
-
1449
- zynqmp_disp_disable (disp );
1450
-
1451
- drm_crtc_vblank_off (crtc );
1452
-
1453
- spin_lock_irq (& crtc -> dev -> event_lock );
1454
- if (crtc -> state -> event ) {
1455
- drm_crtc_send_vblank_event (crtc , crtc -> state -> event );
1456
- crtc -> state -> event = NULL ;
1457
- }
1458
- spin_unlock_irq (& crtc -> dev -> event_lock );
1459
-
1460
- clk_disable_unprepare (disp -> dpsub -> vid_clk );
1461
- pm_runtime_put_sync (disp -> dev );
1462
- }
1463
-
1464
- static int zynqmp_disp_crtc_atomic_check (struct drm_crtc * crtc ,
1465
- struct drm_atomic_state * state )
1466
- {
1467
- return drm_atomic_add_affected_planes (state , crtc );
1468
- }
1469
-
1470
- static void
1471
- zynqmp_disp_crtc_atomic_begin (struct drm_crtc * crtc ,
1472
- struct drm_atomic_state * state )
1473
- {
1474
- drm_crtc_vblank_on (crtc );
1475
- }
1476
-
1477
- static void
1478
- zynqmp_disp_crtc_atomic_flush (struct drm_crtc * crtc ,
1479
- struct drm_atomic_state * state )
1480
- {
1481
- if (crtc -> state -> event ) {
1482
- struct drm_pending_vblank_event * event ;
1483
-
1484
- /* Consume the flip_done event from atomic helper. */
1485
- event = crtc -> state -> event ;
1486
- crtc -> state -> event = NULL ;
1487
-
1488
- event -> pipe = drm_crtc_index (crtc );
1489
-
1490
- WARN_ON (drm_crtc_vblank_get (crtc ) != 0 );
1491
-
1492
- spin_lock_irq (& crtc -> dev -> event_lock );
1493
- drm_crtc_arm_vblank_event (crtc , event );
1494
- spin_unlock_irq (& crtc -> dev -> event_lock );
1495
- }
1496
- }
1497
-
1498
- static const struct drm_crtc_helper_funcs zynqmp_disp_crtc_helper_funcs = {
1499
- .atomic_enable = zynqmp_disp_crtc_atomic_enable ,
1500
- .atomic_disable = zynqmp_disp_crtc_atomic_disable ,
1501
- .atomic_check = zynqmp_disp_crtc_atomic_check ,
1502
- .atomic_begin = zynqmp_disp_crtc_atomic_begin ,
1503
- .atomic_flush = zynqmp_disp_crtc_atomic_flush ,
1504
- };
1505
-
1506
- static int zynqmp_disp_crtc_enable_vblank (struct drm_crtc * crtc )
1507
- {
1508
- struct zynqmp_disp * disp = crtc_to_disp (crtc );
1509
-
1510
- zynqmp_dp_enable_vblank (disp -> dpsub -> dp );
1511
-
1512
- return 0 ;
1513
- }
1514
-
1515
- static void zynqmp_disp_crtc_disable_vblank (struct drm_crtc * crtc )
1516
- {
1517
- struct zynqmp_disp * disp = crtc_to_disp (crtc );
1518
-
1519
- zynqmp_dp_disable_vblank (disp -> dpsub -> dp );
1520
- }
1521
-
1522
- static const struct drm_crtc_funcs zynqmp_disp_crtc_funcs = {
1523
- .destroy = drm_crtc_cleanup ,
1524
- .set_config = drm_atomic_helper_set_config ,
1525
- .page_flip = drm_atomic_helper_page_flip ,
1526
- .reset = drm_atomic_helper_crtc_reset ,
1527
- .atomic_duplicate_state = drm_atomic_helper_crtc_duplicate_state ,
1528
- .atomic_destroy_state = drm_atomic_helper_crtc_destroy_state ,
1529
- .enable_vblank = zynqmp_disp_crtc_enable_vblank ,
1530
- .disable_vblank = zynqmp_disp_crtc_disable_vblank ,
1531
- };
1532
-
1533
- static int zynqmp_disp_create_crtc (struct zynqmp_disp * disp )
1534
- {
1535
- struct drm_plane * plane = & disp -> dpsub -> planes [ZYNQMP_DISP_LAYER_GFX ];
1536
- struct drm_crtc * crtc = & disp -> dpsub -> crtc ;
1537
- int ret ;
1538
-
1539
- ret = drm_crtc_init_with_planes (disp -> drm , crtc , plane ,
1540
- NULL , & zynqmp_disp_crtc_funcs , NULL );
1541
- if (ret < 0 )
1542
- return ret ;
1543
-
1544
- drm_crtc_helper_add (crtc , & zynqmp_disp_crtc_helper_funcs );
1545
-
1546
- /* Start with vertical blanking interrupt reporting disabled. */
1547
- drm_crtc_vblank_off (crtc );
1548
-
1549
- return 0 ;
1550
- }
1551
-
1552
- static void zynqmp_disp_map_crtc_to_plane (struct zynqmp_disp * disp )
1553
- {
1554
- u32 possible_crtcs = drm_crtc_mask (& disp -> dpsub -> crtc );
1555
- unsigned int i ;
1556
-
1557
- for (i = 0 ; i < ARRAY_SIZE (disp -> layers ); i ++ )
1558
- disp -> dpsub -> planes [i ].possible_crtcs = possible_crtcs ;
1559
- }
1560
-
1561
1363
/* -----------------------------------------------------------------------------
1562
1364
* Initialization & Cleanup
1563
1365
*/
1564
1366
1565
1367
int zynqmp_disp_drm_init (struct zynqmp_dpsub * dpsub )
1566
1368
{
1567
- struct zynqmp_disp * disp = dpsub -> disp ;
1568
- int ret ;
1569
-
1570
- ret = zynqmp_disp_create_planes (disp );
1571
- if (ret )
1572
- return ret ;
1573
-
1574
- ret = zynqmp_disp_create_crtc (disp );
1575
- if (ret < 0 )
1576
- return ret ;
1577
-
1578
- zynqmp_disp_map_crtc_to_plane (disp );
1579
-
1580
- return 0 ;
1369
+ return zynqmp_disp_create_planes (dpsub -> disp );
1581
1370
}
1582
1371
1583
1372
int zynqmp_disp_probe (struct zynqmp_dpsub * dpsub , struct drm_device * drm )
@@ -1617,7 +1406,7 @@ int zynqmp_disp_probe(struct zynqmp_dpsub *dpsub, struct drm_device *drm)
1617
1406
if (ret )
1618
1407
return ret ;
1619
1408
1620
- layer = & disp -> layers [ZYNQMP_DISP_LAYER_VID ];
1409
+ layer = & disp -> layers [ZYNQMP_DPSUB_LAYER_VID ];
1621
1410
dpsub -> dma_align = 1 << layer -> dmas [0 ].chan -> device -> copy_align ;
1622
1411
1623
1412
return 0 ;
0 commit comments