37
37
38
38
#define WINDOWS_NR 2
39
39
40
+ struct decon_data {
41
+ unsigned int vidw_buf_start_base ;
42
+ unsigned int shadowcon_win_protect_shift ;
43
+ unsigned int wincon_burstlen_shift ;
44
+ };
45
+
46
+ static struct decon_data exynos7_decon_data = {
47
+ .vidw_buf_start_base = 0x80 ,
48
+ .shadowcon_win_protect_shift = 10 ,
49
+ .wincon_burstlen_shift = 11 ,
50
+ };
51
+
52
+ static struct decon_data exynos7870_decon_data = {
53
+ .vidw_buf_start_base = 0x880 ,
54
+ .shadowcon_win_protect_shift = 8 ,
55
+ .wincon_burstlen_shift = 10 ,
56
+ };
57
+
40
58
struct decon_context {
41
59
struct device * dev ;
42
60
struct drm_device * drm_dev ;
@@ -55,11 +73,19 @@ struct decon_context {
55
73
wait_queue_head_t wait_vsync_queue ;
56
74
atomic_t wait_vsync_event ;
57
75
76
+ const struct decon_data * data ;
58
77
struct drm_encoder * encoder ;
59
78
};
60
79
61
80
static const struct of_device_id decon_driver_dt_match [] = {
62
- {.compatible = "samsung,exynos7-decon" },
81
+ {
82
+ .compatible = "samsung,exynos7-decon" ,
83
+ .data = & exynos7_decon_data ,
84
+ },
85
+ {
86
+ .compatible = "samsung,exynos7870-decon" ,
87
+ .data = & exynos7870_decon_data ,
88
+ },
63
89
{},
64
90
};
65
91
MODULE_DEVICE_TABLE (of , decon_driver_dt_match );
@@ -92,8 +118,9 @@ static void decon_shadow_protect_win(struct decon_context *ctx,
92
118
unsigned int win , bool protect )
93
119
{
94
120
u32 bits , val ;
121
+ unsigned int shift = ctx -> data -> shadowcon_win_protect_shift ;
95
122
96
- bits = SHADOWCON_WINx_PROTECT (win );
123
+ bits = SHADOWCON_WINx_PROTECT (shift , win );
97
124
98
125
val = readl (ctx -> regs + SHADOWCON );
99
126
if (protect )
@@ -291,51 +318,52 @@ static void decon_win_set_pixfmt(struct decon_context *ctx, unsigned int win,
291
318
{
292
319
unsigned long val ;
293
320
int padding ;
321
+ unsigned int shift = ctx -> data -> wincon_burstlen_shift ;
294
322
295
323
val = readl (ctx -> regs + WINCON (win ));
296
324
val &= ~WINCONx_BPPMODE_MASK ;
297
325
298
326
switch (fb -> format -> format ) {
299
327
case DRM_FORMAT_RGB565 :
300
328
val |= WINCONx_BPPMODE_16BPP_565 ;
301
- val |= WINCONx_BURSTLEN_16WORD ;
329
+ val |= WINCONx_BURSTLEN_16WORD ( shift ) ;
302
330
break ;
303
331
case DRM_FORMAT_XRGB8888 :
304
332
val |= WINCONx_BPPMODE_24BPP_xRGB ;
305
- val |= WINCONx_BURSTLEN_16WORD ;
333
+ val |= WINCONx_BURSTLEN_16WORD ( shift ) ;
306
334
break ;
307
335
case DRM_FORMAT_XBGR8888 :
308
336
val |= WINCONx_BPPMODE_24BPP_xBGR ;
309
- val |= WINCONx_BURSTLEN_16WORD ;
337
+ val |= WINCONx_BURSTLEN_16WORD ( shift ) ;
310
338
break ;
311
339
case DRM_FORMAT_RGBX8888 :
312
340
val |= WINCONx_BPPMODE_24BPP_RGBx ;
313
- val |= WINCONx_BURSTLEN_16WORD ;
341
+ val |= WINCONx_BURSTLEN_16WORD ( shift ) ;
314
342
break ;
315
343
case DRM_FORMAT_BGRX8888 :
316
344
val |= WINCONx_BPPMODE_24BPP_BGRx ;
317
- val |= WINCONx_BURSTLEN_16WORD ;
345
+ val |= WINCONx_BURSTLEN_16WORD ( shift ) ;
318
346
break ;
319
347
case DRM_FORMAT_ARGB8888 :
320
348
val |= WINCONx_BPPMODE_32BPP_ARGB | WINCONx_BLD_PIX |
321
349
WINCONx_ALPHA_SEL ;
322
- val |= WINCONx_BURSTLEN_16WORD ;
350
+ val |= WINCONx_BURSTLEN_16WORD ( shift ) ;
323
351
break ;
324
352
case DRM_FORMAT_ABGR8888 :
325
353
val |= WINCONx_BPPMODE_32BPP_ABGR | WINCONx_BLD_PIX |
326
354
WINCONx_ALPHA_SEL ;
327
- val |= WINCONx_BURSTLEN_16WORD ;
355
+ val |= WINCONx_BURSTLEN_16WORD ( shift ) ;
328
356
break ;
329
357
case DRM_FORMAT_RGBA8888 :
330
358
val |= WINCONx_BPPMODE_32BPP_RGBA | WINCONx_BLD_PIX |
331
359
WINCONx_ALPHA_SEL ;
332
- val |= WINCONx_BURSTLEN_16WORD ;
360
+ val |= WINCONx_BURSTLEN_16WORD ( shift ) ;
333
361
break ;
334
362
case DRM_FORMAT_BGRA8888 :
335
363
default :
336
364
val |= WINCONx_BPPMODE_32BPP_BGRA | WINCONx_BLD_PIX |
337
365
WINCONx_ALPHA_SEL ;
338
- val |= WINCONx_BURSTLEN_16WORD ;
366
+ val |= WINCONx_BURSTLEN_16WORD ( shift ) ;
339
367
break ;
340
368
}
341
369
@@ -351,8 +379,8 @@ static void decon_win_set_pixfmt(struct decon_context *ctx, unsigned int win,
351
379
352
380
padding = (fb -> pitches [0 ] / fb -> format -> cpp [0 ]) - fb -> width ;
353
381
if (fb -> width + padding < MIN_FB_WIDTH_FOR_16WORD_BURST ) {
354
- val &= ~WINCONx_BURSTLEN_MASK ;
355
- val |= WINCONx_BURSTLEN_8WORD ;
382
+ val &= ~WINCONx_BURSTLEN_MASK ( shift ) ;
383
+ val |= WINCONx_BURSTLEN_8WORD ( shift ) ;
356
384
}
357
385
358
386
writel (val , ctx -> regs + WINCON (win ));
@@ -397,6 +425,7 @@ static void decon_update_plane(struct exynos_drm_crtc *crtc,
397
425
unsigned int win = plane -> index ;
398
426
unsigned int cpp = fb -> format -> cpp [0 ];
399
427
unsigned int pitch = fb -> pitches [0 ];
428
+ unsigned int vidw_addr0_base = ctx -> data -> vidw_buf_start_base ;
400
429
401
430
if (ctx -> suspended )
402
431
return ;
@@ -413,7 +442,7 @@ static void decon_update_plane(struct exynos_drm_crtc *crtc,
413
442
414
443
/* buffer start address */
415
444
val = (unsigned long )exynos_drm_fb_dma_addr (fb , 0 );
416
- writel (val , ctx -> regs + VIDW_BUF_START (win ));
445
+ writel (val , ctx -> regs + VIDW_BUF_START (vidw_addr0_base , win ));
417
446
418
447
padding = (pitch / cpp ) - fb -> width ;
419
448
@@ -695,6 +724,7 @@ static int decon_probe(struct platform_device *pdev)
695
724
696
725
ctx -> dev = dev ;
697
726
ctx -> suspended = true;
727
+ ctx -> data = of_device_get_match_data (dev );
698
728
699
729
i80_if_timings = of_get_child_by_name (dev -> of_node , "i80-if-timings" );
700
730
if (i80_if_timings )
0 commit comments