0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011 #include <linux/clk.h>
0012 #include <linux/component.h>
0013 #include <linux/delay.h>
0014 #include <linux/interrupt.h>
0015 #include <linux/media-bus-format.h>
0016 #include <linux/module.h>
0017 #include <linux/of_address.h>
0018 #include <linux/of_graph.h>
0019 #include <linux/pinctrl/consumer.h>
0020 #include <linux/platform_device.h>
0021 #include <linux/pm_runtime.h>
0022 #include <linux/regmap.h>
0023 #include <linux/reset.h>
0024
0025 #include <drm/drm_atomic.h>
0026 #include <drm/drm_atomic_helper.h>
0027 #include <drm/drm_blend.h>
0028 #include <drm/drm_bridge.h>
0029 #include <drm/drm_device.h>
0030 #include <drm/drm_edid.h>
0031 #include <drm/drm_fb_cma_helper.h>
0032 #include <drm/drm_fourcc.h>
0033 #include <drm/drm_framebuffer.h>
0034 #include <drm/drm_gem_atomic_helper.h>
0035 #include <drm/drm_gem_cma_helper.h>
0036 #include <drm/drm_of.h>
0037 #include <drm/drm_plane_helper.h>
0038 #include <drm/drm_probe_helper.h>
0039 #include <drm/drm_simple_kms_helper.h>
0040 #include <drm/drm_vblank.h>
0041
0042 #include <video/videomode.h>
0043
0044 #include "ltdc.h"
0045
0046 #define NB_CRTC 1
0047 #define CRTC_MASK GENMASK(NB_CRTC - 1, 0)
0048
0049 #define MAX_IRQ 4
0050
0051 #define HWVER_10200 0x010200
0052 #define HWVER_10300 0x010300
0053 #define HWVER_20101 0x020101
0054 #define HWVER_40100 0x040100
0055
0056
0057
0058
0059
0060 #define LAY_OFS_0 0x80
0061 #define LAY_OFS_1 0x100
0062 #define LAY_OFS (ldev->caps.layer_ofs)
0063
0064
0065 #define LTDC_IDR 0x0000
0066 #define LTDC_LCR 0x0004
0067 #define LTDC_SSCR 0x0008
0068 #define LTDC_BPCR 0x000C
0069 #define LTDC_AWCR 0x0010
0070 #define LTDC_TWCR 0x0014
0071 #define LTDC_GCR 0x0018
0072 #define LTDC_GC1R 0x001C
0073 #define LTDC_GC2R 0x0020
0074 #define LTDC_SRCR 0x0024
0075 #define LTDC_GACR 0x0028
0076 #define LTDC_BCCR 0x002C
0077 #define LTDC_IER 0x0034
0078 #define LTDC_ISR 0x0038
0079 #define LTDC_ICR 0x003C
0080 #define LTDC_LIPCR 0x0040
0081 #define LTDC_CPSR 0x0044
0082 #define LTDC_CDSR 0x0048
0083 #define LTDC_EDCR 0x0060
0084 #define LTDC_CCRCR 0x007C
0085 #define LTDC_FUT 0x0090
0086
0087
0088 #define LTDC_L1C0R (ldev->caps.layer_regs[0])
0089 #define LTDC_L1C1R (ldev->caps.layer_regs[1])
0090 #define LTDC_L1RCR (ldev->caps.layer_regs[2])
0091 #define LTDC_L1CR (ldev->caps.layer_regs[3])
0092 #define LTDC_L1WHPCR (ldev->caps.layer_regs[4])
0093 #define LTDC_L1WVPCR (ldev->caps.layer_regs[5])
0094 #define LTDC_L1CKCR (ldev->caps.layer_regs[6])
0095 #define LTDC_L1PFCR (ldev->caps.layer_regs[7])
0096 #define LTDC_L1CACR (ldev->caps.layer_regs[8])
0097 #define LTDC_L1DCCR (ldev->caps.layer_regs[9])
0098 #define LTDC_L1BFCR (ldev->caps.layer_regs[10])
0099 #define LTDC_L1BLCR (ldev->caps.layer_regs[11])
0100 #define LTDC_L1PCR (ldev->caps.layer_regs[12])
0101 #define LTDC_L1CFBAR (ldev->caps.layer_regs[13])
0102 #define LTDC_L1CFBLR (ldev->caps.layer_regs[14])
0103 #define LTDC_L1CFBLNR (ldev->caps.layer_regs[15])
0104 #define LTDC_L1AFBA0R (ldev->caps.layer_regs[16])
0105 #define LTDC_L1AFBA1R (ldev->caps.layer_regs[17])
0106 #define LTDC_L1AFBLR (ldev->caps.layer_regs[18])
0107 #define LTDC_L1AFBLNR (ldev->caps.layer_regs[19])
0108 #define LTDC_L1CLUTWR (ldev->caps.layer_regs[20])
0109 #define LTDC_L1CYR0R (ldev->caps.layer_regs[21])
0110 #define LTDC_L1CYR1R (ldev->caps.layer_regs[22])
0111 #define LTDC_L1FPF0R (ldev->caps.layer_regs[23])
0112 #define LTDC_L1FPF1R (ldev->caps.layer_regs[24])
0113
0114
0115 #define SSCR_VSH GENMASK(10, 0)
0116 #define SSCR_HSW GENMASK(27, 16)
0117
0118 #define BPCR_AVBP GENMASK(10, 0)
0119 #define BPCR_AHBP GENMASK(27, 16)
0120
0121 #define AWCR_AAH GENMASK(10, 0)
0122 #define AWCR_AAW GENMASK(27, 16)
0123
0124 #define TWCR_TOTALH GENMASK(10, 0)
0125 #define TWCR_TOTALW GENMASK(27, 16)
0126
0127 #define GCR_LTDCEN BIT(0)
0128 #define GCR_DEN BIT(16)
0129 #define GCR_CRCEN BIT(19)
0130 #define GCR_PCPOL BIT(28)
0131 #define GCR_DEPOL BIT(29)
0132 #define GCR_VSPOL BIT(30)
0133 #define GCR_HSPOL BIT(31)
0134
0135 #define GC1R_WBCH GENMASK(3, 0)
0136 #define GC1R_WGCH GENMASK(7, 4)
0137 #define GC1R_WRCH GENMASK(11, 8)
0138 #define GC1R_PBEN BIT(12)
0139 #define GC1R_DT GENMASK(15, 14)
0140 #define GC1R_GCT GENMASK(19, 17)
0141 #define GC1R_SHREN BIT(21)
0142 #define GC1R_BCP BIT(22)
0143 #define GC1R_BBEN BIT(23)
0144 #define GC1R_LNIP BIT(24)
0145 #define GC1R_TP BIT(25)
0146 #define GC1R_IPP BIT(26)
0147 #define GC1R_SPP BIT(27)
0148 #define GC1R_DWP BIT(28)
0149 #define GC1R_STREN BIT(29)
0150 #define GC1R_BMEN BIT(31)
0151
0152 #define GC2R_EDCA BIT(0)
0153 #define GC2R_STSAEN BIT(1)
0154 #define GC2R_DVAEN BIT(2)
0155 #define GC2R_DPAEN BIT(3)
0156 #define GC2R_BW GENMASK(6, 4)
0157 #define GC2R_EDCEN BIT(7)
0158
0159 #define SRCR_IMR BIT(0)
0160 #define SRCR_VBR BIT(1)
0161
0162 #define BCCR_BCBLACK 0x00
0163 #define BCCR_BCBLUE GENMASK(7, 0)
0164 #define BCCR_BCGREEN GENMASK(15, 8)
0165 #define BCCR_BCRED GENMASK(23, 16)
0166 #define BCCR_BCWHITE GENMASK(23, 0)
0167
0168 #define IER_LIE BIT(0)
0169 #define IER_FUWIE BIT(1)
0170 #define IER_TERRIE BIT(2)
0171 #define IER_RRIE BIT(3)
0172 #define IER_FUEIE BIT(6)
0173 #define IER_CRCIE BIT(7)
0174
0175 #define CPSR_CYPOS GENMASK(15, 0)
0176
0177 #define ISR_LIF BIT(0)
0178 #define ISR_FUWIF BIT(1)
0179 #define ISR_TERRIF BIT(2)
0180 #define ISR_RRIF BIT(3)
0181 #define ISR_FUEIF BIT(6)
0182 #define ISR_CRCIF BIT(7)
0183
0184 #define EDCR_OCYEN BIT(25)
0185 #define EDCR_OCYSEL BIT(26)
0186 #define EDCR_OCYCO BIT(27)
0187
0188 #define LXCR_LEN BIT(0)
0189 #define LXCR_COLKEN BIT(1)
0190 #define LXCR_CLUTEN BIT(4)
0191 #define LXCR_HMEN BIT(8)
0192
0193 #define LXWHPCR_WHSTPOS GENMASK(11, 0)
0194 #define LXWHPCR_WHSPPOS GENMASK(27, 16)
0195
0196 #define LXWVPCR_WVSTPOS GENMASK(10, 0)
0197 #define LXWVPCR_WVSPPOS GENMASK(26, 16)
0198
0199 #define LXPFCR_PF GENMASK(2, 0)
0200 #define PF_FLEXIBLE 0x7
0201
0202 #define LXCACR_CONSTA GENMASK(7, 0)
0203
0204 #define LXBFCR_BF2 GENMASK(2, 0)
0205 #define LXBFCR_BF1 GENMASK(10, 8)
0206 #define LXBFCR_BOR GENMASK(18, 16)
0207
0208 #define LXCFBLR_CFBLL GENMASK(12, 0)
0209 #define LXCFBLR_CFBP GENMASK(31, 16)
0210
0211 #define LXCFBLNR_CFBLN GENMASK(10, 0)
0212
0213 #define LXCR_C1R_YIA BIT(0)
0214 #define LXCR_C1R_YSPA BIT(1)
0215 #define LXCR_C1R_YFPA BIT(2)
0216 #define LXCR_C1R_SCA BIT(31)
0217
0218 #define LxPCR_YREN BIT(9)
0219 #define LxPCR_OF BIT(8)
0220 #define LxPCR_CBF BIT(7)
0221 #define LxPCR_YF BIT(6)
0222 #define LxPCR_YCM GENMASK(5, 4)
0223 #define YCM_I 0x0
0224 #define YCM_SP 0x1
0225 #define YCM_FP 0x2
0226 #define LxPCR_YCEN BIT(3)
0227
0228 #define LXRCR_IMR BIT(0)
0229 #define LXRCR_VBR BIT(1)
0230 #define LXRCR_GRMSK BIT(2)
0231
0232 #define CLUT_SIZE 256
0233
0234 #define CONSTA_MAX 0xFF
0235 #define BF1_PAXCA 0x600
0236 #define BF1_CA 0x400
0237 #define BF2_1PAXCA 0x007
0238 #define BF2_1CA 0x005
0239
0240 #define NB_PF 8
0241
0242 #define FUT_DFT 128
0243
0244
0245
0246
0247
0248
0249 #define CRC_SKIP_FRAMES 2
0250
0251 enum ltdc_pix_fmt {
0252 PF_NONE,
0253
0254 PF_ARGB8888,
0255 PF_RGBA8888,
0256 PF_ABGR8888,
0257 PF_BGRA8888,
0258 PF_RGB888,
0259 PF_BGR888,
0260 PF_RGB565,
0261 PF_BGR565,
0262 PF_ARGB1555,
0263 PF_ARGB4444,
0264
0265 PF_L8,
0266 PF_AL44,
0267 PF_AL88
0268 };
0269
0270
0271 static const enum ltdc_pix_fmt ltdc_pix_fmt_a0[NB_PF] = {
0272 PF_ARGB8888,
0273 PF_RGB888,
0274 PF_RGB565,
0275 PF_ARGB1555,
0276 PF_ARGB4444,
0277 PF_L8,
0278 PF_AL44,
0279 PF_AL88
0280 };
0281
0282 static const enum ltdc_pix_fmt ltdc_pix_fmt_a1[NB_PF] = {
0283 PF_ARGB8888,
0284 PF_RGB888,
0285 PF_RGB565,
0286 PF_RGBA8888,
0287 PF_AL44,
0288 PF_L8,
0289 PF_ARGB1555,
0290 PF_ARGB4444
0291 };
0292
0293 static const enum ltdc_pix_fmt ltdc_pix_fmt_a2[NB_PF] = {
0294 PF_ARGB8888,
0295 PF_ABGR8888,
0296 PF_RGBA8888,
0297 PF_BGRA8888,
0298 PF_RGB565,
0299 PF_BGR565,
0300 PF_RGB888,
0301 PF_NONE
0302 };
0303
0304 static const u32 ltdc_drm_fmt_a0[] = {
0305 DRM_FORMAT_ARGB8888,
0306 DRM_FORMAT_XRGB8888,
0307 DRM_FORMAT_RGB888,
0308 DRM_FORMAT_RGB565,
0309 DRM_FORMAT_ARGB1555,
0310 DRM_FORMAT_XRGB1555,
0311 DRM_FORMAT_ARGB4444,
0312 DRM_FORMAT_XRGB4444,
0313 DRM_FORMAT_C8
0314 };
0315
0316 static const u32 ltdc_drm_fmt_a1[] = {
0317 DRM_FORMAT_ARGB8888,
0318 DRM_FORMAT_XRGB8888,
0319 DRM_FORMAT_RGB888,
0320 DRM_FORMAT_RGB565,
0321 DRM_FORMAT_RGBA8888,
0322 DRM_FORMAT_RGBX8888,
0323 DRM_FORMAT_ARGB1555,
0324 DRM_FORMAT_XRGB1555,
0325 DRM_FORMAT_ARGB4444,
0326 DRM_FORMAT_XRGB4444,
0327 DRM_FORMAT_C8
0328 };
0329
0330 static const u32 ltdc_drm_fmt_a2[] = {
0331 DRM_FORMAT_ARGB8888,
0332 DRM_FORMAT_XRGB8888,
0333 DRM_FORMAT_ABGR8888,
0334 DRM_FORMAT_XBGR8888,
0335 DRM_FORMAT_RGBA8888,
0336 DRM_FORMAT_RGBX8888,
0337 DRM_FORMAT_BGRA8888,
0338 DRM_FORMAT_BGRX8888,
0339 DRM_FORMAT_RGB565,
0340 DRM_FORMAT_BGR565,
0341 DRM_FORMAT_RGB888,
0342 DRM_FORMAT_BGR888,
0343 DRM_FORMAT_ARGB1555,
0344 DRM_FORMAT_XRGB1555,
0345 DRM_FORMAT_ARGB4444,
0346 DRM_FORMAT_XRGB4444,
0347 DRM_FORMAT_C8
0348 };
0349
0350 static const u32 ltdc_drm_fmt_ycbcr_cp[] = {
0351 DRM_FORMAT_YUYV,
0352 DRM_FORMAT_YVYU,
0353 DRM_FORMAT_UYVY,
0354 DRM_FORMAT_VYUY
0355 };
0356
0357 static const u32 ltdc_drm_fmt_ycbcr_sp[] = {
0358 DRM_FORMAT_NV12,
0359 DRM_FORMAT_NV21
0360 };
0361
0362 static const u32 ltdc_drm_fmt_ycbcr_fp[] = {
0363 DRM_FORMAT_YUV420,
0364 DRM_FORMAT_YVU420
0365 };
0366
0367
0368 static const u32 ltdc_layer_regs_a0[] = {
0369 0x80,
0370 0x00,
0371 0x00,
0372 0x84,
0373 0x88,
0374 0x8c,
0375 0x90,
0376 0x94,
0377 0x98,
0378 0x9c,
0379 0xa0,
0380 0x00,
0381 0x00,
0382 0xac,
0383 0xb0,
0384 0xb4,
0385 0x00,
0386 0x00,
0387 0x00,
0388 0x00,
0389 0xc4,
0390 0x00,
0391 0x00,
0392 0x00,
0393 0x00
0394 };
0395
0396 static const u32 ltdc_layer_regs_a1[] = {
0397 0x80,
0398 0x84,
0399 0x00,
0400 0x88,
0401 0x8c,
0402 0x90,
0403 0x94,
0404 0x98,
0405 0x9c,
0406 0xa0,
0407 0xa4,
0408 0xa8,
0409 0x00,
0410 0xac,
0411 0xb0,
0412 0xb4,
0413 0xb8,
0414 0xbc,
0415 0xc0,
0416 0xc4,
0417 0xc8,
0418 0x00,
0419 0x00,
0420 0x00,
0421 0x00
0422 };
0423
0424 static const u32 ltdc_layer_regs_a2[] = {
0425 0x100,
0426 0x104,
0427 0x108,
0428 0x10c,
0429 0x110,
0430 0x114,
0431 0x118,
0432 0x11c,
0433 0x120,
0434 0x124,
0435 0x128,
0436 0x12c,
0437 0x130,
0438 0x134,
0439 0x138,
0440 0x13c,
0441 0x140,
0442 0x144,
0443 0x148,
0444 0x14c,
0445 0x150,
0446 0x16c,
0447 0x170,
0448 0x174,
0449 0x178
0450 };
0451
0452 static const u64 ltdc_format_modifiers[] = {
0453 DRM_FORMAT_MOD_LINEAR,
0454 DRM_FORMAT_MOD_INVALID
0455 };
0456
0457 static const struct regmap_config stm32_ltdc_regmap_cfg = {
0458 .reg_bits = 32,
0459 .val_bits = 32,
0460 .reg_stride = sizeof(u32),
0461 .max_register = 0x400,
0462 .use_relaxed_mmio = true,
0463 .cache_type = REGCACHE_NONE,
0464 };
0465
0466 static const u32 ltdc_ycbcr2rgb_coeffs[DRM_COLOR_ENCODING_MAX][DRM_COLOR_RANGE_MAX][2] = {
0467 [DRM_COLOR_YCBCR_BT601][DRM_COLOR_YCBCR_LIMITED_RANGE] = {
0468 0x02040199,
0469 0x006400D0
0470 },
0471 [DRM_COLOR_YCBCR_BT601][DRM_COLOR_YCBCR_FULL_RANGE] = {
0472 0x01C60167,
0473 0x005800B7
0474 },
0475 [DRM_COLOR_YCBCR_BT709][DRM_COLOR_YCBCR_LIMITED_RANGE] = {
0476 0x021D01CB,
0477 0x00370089
0478 },
0479 [DRM_COLOR_YCBCR_BT709][DRM_COLOR_YCBCR_FULL_RANGE] = {
0480 0x01DB0193,
0481 0x00300078
0482 }
0483
0484 };
0485
0486 static inline struct ltdc_device *crtc_to_ltdc(struct drm_crtc *crtc)
0487 {
0488 return (struct ltdc_device *)crtc->dev->dev_private;
0489 }
0490
0491 static inline struct ltdc_device *plane_to_ltdc(struct drm_plane *plane)
0492 {
0493 return (struct ltdc_device *)plane->dev->dev_private;
0494 }
0495
0496 static inline struct ltdc_device *encoder_to_ltdc(struct drm_encoder *enc)
0497 {
0498 return (struct ltdc_device *)enc->dev->dev_private;
0499 }
0500
0501 static inline enum ltdc_pix_fmt to_ltdc_pixelformat(u32 drm_fmt)
0502 {
0503 enum ltdc_pix_fmt pf;
0504
0505 switch (drm_fmt) {
0506 case DRM_FORMAT_ARGB8888:
0507 case DRM_FORMAT_XRGB8888:
0508 pf = PF_ARGB8888;
0509 break;
0510 case DRM_FORMAT_ABGR8888:
0511 case DRM_FORMAT_XBGR8888:
0512 pf = PF_ABGR8888;
0513 break;
0514 case DRM_FORMAT_RGBA8888:
0515 case DRM_FORMAT_RGBX8888:
0516 pf = PF_RGBA8888;
0517 break;
0518 case DRM_FORMAT_BGRA8888:
0519 case DRM_FORMAT_BGRX8888:
0520 pf = PF_BGRA8888;
0521 break;
0522 case DRM_FORMAT_RGB888:
0523 pf = PF_RGB888;
0524 break;
0525 case DRM_FORMAT_BGR888:
0526 pf = PF_BGR888;
0527 break;
0528 case DRM_FORMAT_RGB565:
0529 pf = PF_RGB565;
0530 break;
0531 case DRM_FORMAT_BGR565:
0532 pf = PF_BGR565;
0533 break;
0534 case DRM_FORMAT_ARGB1555:
0535 case DRM_FORMAT_XRGB1555:
0536 pf = PF_ARGB1555;
0537 break;
0538 case DRM_FORMAT_ARGB4444:
0539 case DRM_FORMAT_XRGB4444:
0540 pf = PF_ARGB4444;
0541 break;
0542 case DRM_FORMAT_C8:
0543 pf = PF_L8;
0544 break;
0545 default:
0546 pf = PF_NONE;
0547 break;
0548
0549 }
0550
0551 return pf;
0552 }
0553
0554 static inline u32 ltdc_set_flexible_pixel_format(struct drm_plane *plane, enum ltdc_pix_fmt pix_fmt)
0555 {
0556 struct ltdc_device *ldev = plane_to_ltdc(plane);
0557 u32 lofs = plane->index * LAY_OFS, ret = PF_FLEXIBLE;
0558 int psize, alen, apos, rlen, rpos, glen, gpos, blen, bpos;
0559
0560 switch (pix_fmt) {
0561 case PF_BGR888:
0562 psize = 3;
0563 alen = 0; apos = 0; rlen = 8; rpos = 0;
0564 glen = 8; gpos = 8; blen = 8; bpos = 16;
0565 break;
0566 case PF_ARGB1555:
0567 psize = 2;
0568 alen = 1; apos = 15; rlen = 5; rpos = 10;
0569 glen = 5; gpos = 5; blen = 5; bpos = 0;
0570 break;
0571 case PF_ARGB4444:
0572 psize = 2;
0573 alen = 4; apos = 12; rlen = 4; rpos = 8;
0574 glen = 4; gpos = 4; blen = 4; bpos = 0;
0575 break;
0576 case PF_L8:
0577 psize = 1;
0578 alen = 0; apos = 0; rlen = 8; rpos = 0;
0579 glen = 8; gpos = 0; blen = 8; bpos = 0;
0580 break;
0581 case PF_AL44:
0582 psize = 1;
0583 alen = 4; apos = 4; rlen = 4; rpos = 0;
0584 glen = 4; gpos = 0; blen = 4; bpos = 0;
0585 break;
0586 case PF_AL88:
0587 psize = 2;
0588 alen = 8; apos = 8; rlen = 8; rpos = 0;
0589 glen = 8; gpos = 0; blen = 8; bpos = 0;
0590 break;
0591 default:
0592 ret = NB_PF;
0593 break;
0594 }
0595
0596 if (ret == PF_FLEXIBLE) {
0597 regmap_write(ldev->regmap, LTDC_L1FPF0R + lofs,
0598 (rlen << 14) + (rpos << 9) + (alen << 5) + apos);
0599
0600 regmap_write(ldev->regmap, LTDC_L1FPF1R + lofs,
0601 (psize << 18) + (blen << 14) + (bpos << 9) + (glen << 5) + gpos);
0602 }
0603
0604 return ret;
0605 }
0606
0607
0608
0609
0610
0611 static inline u32 is_xrgb(u32 drm)
0612 {
0613 return ((drm & 0xFF) == 'X' || ((drm >> 8) & 0xFF) == 'X');
0614 }
0615
0616 static inline void ltdc_set_ycbcr_config(struct drm_plane *plane, u32 drm_pix_fmt)
0617 {
0618 struct ltdc_device *ldev = plane_to_ltdc(plane);
0619 struct drm_plane_state *state = plane->state;
0620 u32 lofs = plane->index * LAY_OFS;
0621 u32 val;
0622
0623 switch (drm_pix_fmt) {
0624 case DRM_FORMAT_YUYV:
0625 val = (YCM_I << 4) | LxPCR_YF | LxPCR_CBF;
0626 break;
0627 case DRM_FORMAT_YVYU:
0628 val = (YCM_I << 4) | LxPCR_YF;
0629 break;
0630 case DRM_FORMAT_UYVY:
0631 val = (YCM_I << 4) | LxPCR_CBF;
0632 break;
0633 case DRM_FORMAT_VYUY:
0634 val = (YCM_I << 4);
0635 break;
0636 case DRM_FORMAT_NV12:
0637 val = (YCM_SP << 4) | LxPCR_CBF;
0638 break;
0639 case DRM_FORMAT_NV21:
0640 val = (YCM_SP << 4);
0641 break;
0642 case DRM_FORMAT_YUV420:
0643 case DRM_FORMAT_YVU420:
0644 val = (YCM_FP << 4);
0645 break;
0646 default:
0647
0648 DRM_ERROR("Unsupported pixel format: %u\n", drm_pix_fmt);
0649 return;
0650 }
0651
0652
0653 if (state->color_range == DRM_COLOR_YCBCR_LIMITED_RANGE)
0654 val |= LxPCR_YREN;
0655
0656
0657 val |= LxPCR_YCEN;
0658
0659 regmap_write(ldev->regmap, LTDC_L1PCR + lofs, val);
0660 }
0661
0662 static inline void ltdc_set_ycbcr_coeffs(struct drm_plane *plane)
0663 {
0664 struct ltdc_device *ldev = plane_to_ltdc(plane);
0665 struct drm_plane_state *state = plane->state;
0666 enum drm_color_encoding enc = state->color_encoding;
0667 enum drm_color_range ran = state->color_range;
0668 u32 lofs = plane->index * LAY_OFS;
0669
0670 if (enc != DRM_COLOR_YCBCR_BT601 && enc != DRM_COLOR_YCBCR_BT709) {
0671 DRM_ERROR("color encoding %d not supported, use bt601 by default\n", enc);
0672
0673 enc = DRM_COLOR_YCBCR_BT601;
0674 }
0675
0676 if (ran != DRM_COLOR_YCBCR_LIMITED_RANGE && ran != DRM_COLOR_YCBCR_FULL_RANGE) {
0677 DRM_ERROR("color range %d not supported, use limited range by default\n", ran);
0678
0679 ran = DRM_COLOR_YCBCR_LIMITED_RANGE;
0680 }
0681
0682 DRM_DEBUG_DRIVER("Color encoding=%d, range=%d\n", enc, ran);
0683 regmap_write(ldev->regmap, LTDC_L1CYR0R + lofs,
0684 ltdc_ycbcr2rgb_coeffs[enc][ran][0]);
0685 regmap_write(ldev->regmap, LTDC_L1CYR1R + lofs,
0686 ltdc_ycbcr2rgb_coeffs[enc][ran][1]);
0687 }
0688
0689 static inline void ltdc_irq_crc_handle(struct ltdc_device *ldev,
0690 struct drm_crtc *crtc)
0691 {
0692 u32 crc;
0693 int ret;
0694
0695 if (ldev->crc_skip_count < CRC_SKIP_FRAMES) {
0696 ldev->crc_skip_count++;
0697 return;
0698 }
0699
0700
0701 ret = regmap_read(ldev->regmap, LTDC_CCRCR, &crc);
0702 if (ret)
0703 return;
0704
0705
0706 drm_crtc_add_crc_entry(crtc, true, drm_crtc_accurate_vblank_count(crtc), &crc);
0707 }
0708
0709 static irqreturn_t ltdc_irq_thread(int irq, void *arg)
0710 {
0711 struct drm_device *ddev = arg;
0712 struct ltdc_device *ldev = ddev->dev_private;
0713 struct drm_crtc *crtc = drm_crtc_from_index(ddev, 0);
0714
0715
0716 if (ldev->irq_status & ISR_LIF) {
0717 drm_crtc_handle_vblank(crtc);
0718
0719
0720 if (ldev->crc_active)
0721 ltdc_irq_crc_handle(ldev, crtc);
0722 }
0723
0724 mutex_lock(&ldev->err_lock);
0725 if (ldev->irq_status & ISR_TERRIF)
0726 ldev->transfer_err++;
0727 if (ldev->irq_status & ISR_FUEIF)
0728 ldev->fifo_err++;
0729 if (ldev->irq_status & ISR_FUWIF)
0730 ldev->fifo_warn++;
0731 mutex_unlock(&ldev->err_lock);
0732
0733 return IRQ_HANDLED;
0734 }
0735
0736 static irqreturn_t ltdc_irq(int irq, void *arg)
0737 {
0738 struct drm_device *ddev = arg;
0739 struct ltdc_device *ldev = ddev->dev_private;
0740
0741
0742
0743
0744
0745
0746 ldev->irq_status = readl_relaxed(ldev->regs + LTDC_ISR);
0747 writel_relaxed(ldev->irq_status, ldev->regs + LTDC_ICR);
0748
0749 return IRQ_WAKE_THREAD;
0750 }
0751
0752
0753
0754
0755
0756 static void ltdc_crtc_update_clut(struct drm_crtc *crtc)
0757 {
0758 struct ltdc_device *ldev = crtc_to_ltdc(crtc);
0759 struct drm_color_lut *lut;
0760 u32 val;
0761 int i;
0762
0763 if (!crtc->state->color_mgmt_changed || !crtc->state->gamma_lut)
0764 return;
0765
0766 lut = (struct drm_color_lut *)crtc->state->gamma_lut->data;
0767
0768 for (i = 0; i < CLUT_SIZE; i++, lut++) {
0769 val = ((lut->red << 8) & 0xff0000) | (lut->green & 0xff00) |
0770 (lut->blue >> 8) | (i << 24);
0771 regmap_write(ldev->regmap, LTDC_L1CLUTWR, val);
0772 }
0773 }
0774
0775 static void ltdc_crtc_atomic_enable(struct drm_crtc *crtc,
0776 struct drm_atomic_state *state)
0777 {
0778 struct ltdc_device *ldev = crtc_to_ltdc(crtc);
0779 struct drm_device *ddev = crtc->dev;
0780
0781 DRM_DEBUG_DRIVER("\n");
0782
0783 pm_runtime_get_sync(ddev->dev);
0784
0785
0786 regmap_write(ldev->regmap, LTDC_BCCR, BCCR_BCBLACK);
0787
0788
0789 regmap_set_bits(ldev->regmap, LTDC_IER, IER_FUWIE | IER_FUEIE | IER_RRIE | IER_TERRIE);
0790
0791
0792 if (!ldev->caps.plane_reg_shadow)
0793 regmap_set_bits(ldev->regmap, LTDC_SRCR, SRCR_VBR);
0794
0795 drm_crtc_vblank_on(crtc);
0796 }
0797
0798 static void ltdc_crtc_atomic_disable(struct drm_crtc *crtc,
0799 struct drm_atomic_state *state)
0800 {
0801 struct ltdc_device *ldev = crtc_to_ltdc(crtc);
0802 struct drm_device *ddev = crtc->dev;
0803 int layer_index = 0;
0804
0805 DRM_DEBUG_DRIVER("\n");
0806
0807 drm_crtc_vblank_off(crtc);
0808
0809
0810 for (layer_index = 0; layer_index < ldev->caps.nb_layers; layer_index++)
0811 regmap_write_bits(ldev->regmap, LTDC_L1CR + layer_index * LAY_OFS,
0812 LXCR_CLUTEN | LXCR_LEN, 0);
0813
0814
0815 regmap_clear_bits(ldev->regmap, LTDC_IER, IER_FUWIE | IER_FUEIE | IER_RRIE | IER_TERRIE);
0816
0817
0818 if (!ldev->caps.plane_reg_shadow)
0819 regmap_set_bits(ldev->regmap, LTDC_SRCR, SRCR_IMR);
0820
0821 pm_runtime_put_sync(ddev->dev);
0822
0823
0824 mutex_lock(&ldev->err_lock);
0825 ldev->transfer_err = 0;
0826 ldev->fifo_err = 0;
0827 ldev->fifo_warn = 0;
0828 mutex_unlock(&ldev->err_lock);
0829 }
0830
0831 #define CLK_TOLERANCE_HZ 50
0832
0833 static enum drm_mode_status
0834 ltdc_crtc_mode_valid(struct drm_crtc *crtc,
0835 const struct drm_display_mode *mode)
0836 {
0837 struct ltdc_device *ldev = crtc_to_ltdc(crtc);
0838 int target = mode->clock * 1000;
0839 int target_min = target - CLK_TOLERANCE_HZ;
0840 int target_max = target + CLK_TOLERANCE_HZ;
0841 int result;
0842
0843 result = clk_round_rate(ldev->pixel_clk, target);
0844
0845 DRM_DEBUG_DRIVER("clk rate target %d, available %d\n", target, result);
0846
0847
0848 if (result > ldev->caps.pad_max_freq_hz)
0849 return MODE_CLOCK_HIGH;
0850
0851
0852
0853
0854
0855
0856
0857
0858
0859 if (mode->type & DRM_MODE_TYPE_PREFERRED)
0860 return MODE_OK;
0861
0862
0863
0864
0865
0866 if (result < target_min || result > target_max)
0867 return MODE_CLOCK_RANGE;
0868
0869 return MODE_OK;
0870 }
0871
0872 static bool ltdc_crtc_mode_fixup(struct drm_crtc *crtc,
0873 const struct drm_display_mode *mode,
0874 struct drm_display_mode *adjusted_mode)
0875 {
0876 struct ltdc_device *ldev = crtc_to_ltdc(crtc);
0877 int rate = mode->clock * 1000;
0878
0879 if (clk_set_rate(ldev->pixel_clk, rate) < 0) {
0880 DRM_ERROR("Cannot set rate (%dHz) for pixel clk\n", rate);
0881 return false;
0882 }
0883
0884 adjusted_mode->clock = clk_get_rate(ldev->pixel_clk) / 1000;
0885
0886 DRM_DEBUG_DRIVER("requested clock %dkHz, adjusted clock %dkHz\n",
0887 mode->clock, adjusted_mode->clock);
0888
0889 return true;
0890 }
0891
0892 static void ltdc_crtc_mode_set_nofb(struct drm_crtc *crtc)
0893 {
0894 struct ltdc_device *ldev = crtc_to_ltdc(crtc);
0895 struct drm_device *ddev = crtc->dev;
0896 struct drm_connector_list_iter iter;
0897 struct drm_connector *connector = NULL;
0898 struct drm_encoder *encoder = NULL, *en_iter;
0899 struct drm_bridge *bridge = NULL, *br_iter;
0900 struct drm_display_mode *mode = &crtc->state->adjusted_mode;
0901 u32 hsync, vsync, accum_hbp, accum_vbp, accum_act_w, accum_act_h;
0902 u32 total_width, total_height;
0903 u32 bus_formats = MEDIA_BUS_FMT_RGB888_1X24;
0904 u32 bus_flags = 0;
0905 u32 val;
0906 int ret;
0907
0908
0909 drm_for_each_encoder(en_iter, ddev)
0910 if (en_iter->crtc == crtc) {
0911 encoder = en_iter;
0912 break;
0913 }
0914
0915 if (encoder) {
0916
0917 list_for_each_entry(br_iter, &encoder->bridge_chain, chain_node)
0918 if (br_iter->encoder == encoder) {
0919 bridge = br_iter;
0920 break;
0921 }
0922
0923
0924 drm_connector_list_iter_begin(ddev, &iter);
0925 drm_for_each_connector_iter(connector, &iter)
0926 if (connector->encoder == encoder)
0927 break;
0928 drm_connector_list_iter_end(&iter);
0929 }
0930
0931 if (bridge && bridge->timings) {
0932 bus_flags = bridge->timings->input_bus_flags;
0933 } else if (connector) {
0934 bus_flags = connector->display_info.bus_flags;
0935 if (connector->display_info.num_bus_formats)
0936 bus_formats = connector->display_info.bus_formats[0];
0937 }
0938
0939 if (!pm_runtime_active(ddev->dev)) {
0940 ret = pm_runtime_get_sync(ddev->dev);
0941 if (ret) {
0942 DRM_ERROR("Failed to set mode, cannot get sync\n");
0943 return;
0944 }
0945 }
0946
0947 DRM_DEBUG_DRIVER("CRTC:%d mode:%s\n", crtc->base.id, mode->name);
0948 DRM_DEBUG_DRIVER("Video mode: %dx%d", mode->hdisplay, mode->vdisplay);
0949 DRM_DEBUG_DRIVER(" hfp %d hbp %d hsl %d vfp %d vbp %d vsl %d\n",
0950 mode->hsync_start - mode->hdisplay,
0951 mode->htotal - mode->hsync_end,
0952 mode->hsync_end - mode->hsync_start,
0953 mode->vsync_start - mode->vdisplay,
0954 mode->vtotal - mode->vsync_end,
0955 mode->vsync_end - mode->vsync_start);
0956
0957
0958 hsync = mode->hsync_end - mode->hsync_start - 1;
0959 vsync = mode->vsync_end - mode->vsync_start - 1;
0960 accum_hbp = mode->htotal - mode->hsync_start - 1;
0961 accum_vbp = mode->vtotal - mode->vsync_start - 1;
0962 accum_act_w = accum_hbp + mode->hdisplay;
0963 accum_act_h = accum_vbp + mode->vdisplay;
0964 total_width = mode->htotal - 1;
0965 total_height = mode->vtotal - 1;
0966
0967
0968 val = 0;
0969
0970 if (mode->flags & DRM_MODE_FLAG_PHSYNC)
0971 val |= GCR_HSPOL;
0972
0973 if (mode->flags & DRM_MODE_FLAG_PVSYNC)
0974 val |= GCR_VSPOL;
0975
0976 if (bus_flags & DRM_BUS_FLAG_DE_LOW)
0977 val |= GCR_DEPOL;
0978
0979 if (bus_flags & DRM_BUS_FLAG_PIXDATA_DRIVE_NEGEDGE)
0980 val |= GCR_PCPOL;
0981
0982 regmap_update_bits(ldev->regmap, LTDC_GCR,
0983 GCR_HSPOL | GCR_VSPOL | GCR_DEPOL | GCR_PCPOL, val);
0984
0985
0986 val = (hsync << 16) | vsync;
0987 regmap_update_bits(ldev->regmap, LTDC_SSCR, SSCR_VSH | SSCR_HSW, val);
0988
0989
0990 val = (accum_hbp << 16) | accum_vbp;
0991 regmap_update_bits(ldev->regmap, LTDC_BPCR, BPCR_AVBP | BPCR_AHBP, val);
0992
0993
0994 val = (accum_act_w << 16) | accum_act_h;
0995 regmap_update_bits(ldev->regmap, LTDC_AWCR, AWCR_AAW | AWCR_AAH, val);
0996
0997
0998 val = (total_width << 16) | total_height;
0999 regmap_update_bits(ldev->regmap, LTDC_TWCR, TWCR_TOTALH | TWCR_TOTALW, val);
1000
1001 regmap_write(ldev->regmap, LTDC_LIPCR, (accum_act_h + 1));
1002
1003
1004 if (ldev->caps.ycbcr_output) {
1005
1006 int vic = drm_match_cea_mode(mode);
1007 u32 val;
1008
1009 if (vic == 6 || vic == 7 || vic == 21 || vic == 22 ||
1010 vic == 2 || vic == 3 || vic == 17 || vic == 18)
1011
1012 val = 0;
1013 else
1014
1015 val = EDCR_OCYSEL;
1016
1017 switch (bus_formats) {
1018 case MEDIA_BUS_FMT_YUYV8_1X16:
1019
1020 regmap_write(ldev->regmap, LTDC_EDCR, EDCR_OCYEN | val);
1021 break;
1022 case MEDIA_BUS_FMT_YVYU8_1X16:
1023
1024 regmap_write(ldev->regmap, LTDC_EDCR, EDCR_OCYEN | EDCR_OCYCO | val);
1025 break;
1026 default:
1027
1028 regmap_write(ldev->regmap, LTDC_EDCR, 0);
1029 break;
1030 }
1031 }
1032 }
1033
1034 static void ltdc_crtc_atomic_flush(struct drm_crtc *crtc,
1035 struct drm_atomic_state *state)
1036 {
1037 struct ltdc_device *ldev = crtc_to_ltdc(crtc);
1038 struct drm_device *ddev = crtc->dev;
1039 struct drm_pending_vblank_event *event = crtc->state->event;
1040
1041 DRM_DEBUG_ATOMIC("\n");
1042
1043 ltdc_crtc_update_clut(crtc);
1044
1045
1046 if (!ldev->caps.plane_reg_shadow)
1047 regmap_set_bits(ldev->regmap, LTDC_SRCR, SRCR_VBR);
1048
1049 if (event) {
1050 crtc->state->event = NULL;
1051
1052 spin_lock_irq(&ddev->event_lock);
1053 if (drm_crtc_vblank_get(crtc) == 0)
1054 drm_crtc_arm_vblank_event(crtc, event);
1055 else
1056 drm_crtc_send_vblank_event(crtc, event);
1057 spin_unlock_irq(&ddev->event_lock);
1058 }
1059 }
1060
1061 static bool ltdc_crtc_get_scanout_position(struct drm_crtc *crtc,
1062 bool in_vblank_irq,
1063 int *vpos, int *hpos,
1064 ktime_t *stime, ktime_t *etime,
1065 const struct drm_display_mode *mode)
1066 {
1067 struct drm_device *ddev = crtc->dev;
1068 struct ltdc_device *ldev = ddev->dev_private;
1069 int line, vactive_start, vactive_end, vtotal;
1070
1071 if (stime)
1072 *stime = ktime_get();
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088 if (pm_runtime_active(ddev->dev)) {
1089 regmap_read(ldev->regmap, LTDC_CPSR, &line);
1090 line &= CPSR_CYPOS;
1091 regmap_read(ldev->regmap, LTDC_BPCR, &vactive_start);
1092 vactive_start &= BPCR_AVBP;
1093 regmap_read(ldev->regmap, LTDC_AWCR, &vactive_end);
1094 vactive_end &= AWCR_AAH;
1095 regmap_read(ldev->regmap, LTDC_TWCR, &vtotal);
1096 vtotal &= TWCR_TOTALH;
1097
1098 if (line > vactive_end)
1099 *vpos = line - vtotal - vactive_start;
1100 else
1101 *vpos = line - vactive_start;
1102 } else {
1103 *vpos = 0;
1104 }
1105
1106 *hpos = 0;
1107
1108 if (etime)
1109 *etime = ktime_get();
1110
1111 return true;
1112 }
1113
1114 static const struct drm_crtc_helper_funcs ltdc_crtc_helper_funcs = {
1115 .mode_valid = ltdc_crtc_mode_valid,
1116 .mode_fixup = ltdc_crtc_mode_fixup,
1117 .mode_set_nofb = ltdc_crtc_mode_set_nofb,
1118 .atomic_flush = ltdc_crtc_atomic_flush,
1119 .atomic_enable = ltdc_crtc_atomic_enable,
1120 .atomic_disable = ltdc_crtc_atomic_disable,
1121 .get_scanout_position = ltdc_crtc_get_scanout_position,
1122 };
1123
1124 static int ltdc_crtc_enable_vblank(struct drm_crtc *crtc)
1125 {
1126 struct ltdc_device *ldev = crtc_to_ltdc(crtc);
1127 struct drm_crtc_state *state = crtc->state;
1128
1129 DRM_DEBUG_DRIVER("\n");
1130
1131 if (state->enable)
1132 regmap_set_bits(ldev->regmap, LTDC_IER, IER_LIE);
1133 else
1134 return -EPERM;
1135
1136 return 0;
1137 }
1138
1139 static void ltdc_crtc_disable_vblank(struct drm_crtc *crtc)
1140 {
1141 struct ltdc_device *ldev = crtc_to_ltdc(crtc);
1142
1143 DRM_DEBUG_DRIVER("\n");
1144 regmap_clear_bits(ldev->regmap, LTDC_IER, IER_LIE);
1145 }
1146
1147 static int ltdc_crtc_set_crc_source(struct drm_crtc *crtc, const char *source)
1148 {
1149 struct ltdc_device *ldev = crtc_to_ltdc(crtc);
1150 int ret;
1151
1152 DRM_DEBUG_DRIVER("\n");
1153
1154 if (!crtc)
1155 return -ENODEV;
1156
1157 if (source && strcmp(source, "auto") == 0) {
1158 ldev->crc_active = true;
1159 ret = regmap_set_bits(ldev->regmap, LTDC_GCR, GCR_CRCEN);
1160 } else if (!source) {
1161 ldev->crc_active = false;
1162 ret = regmap_clear_bits(ldev->regmap, LTDC_GCR, GCR_CRCEN);
1163 } else {
1164 ret = -EINVAL;
1165 }
1166
1167 ldev->crc_skip_count = 0;
1168 return ret;
1169 }
1170
1171 static int ltdc_crtc_verify_crc_source(struct drm_crtc *crtc,
1172 const char *source, size_t *values_cnt)
1173 {
1174 DRM_DEBUG_DRIVER("\n");
1175
1176 if (!crtc)
1177 return -ENODEV;
1178
1179 if (source && strcmp(source, "auto") != 0) {
1180 DRM_DEBUG_DRIVER("Unknown CRC source %s for %s\n",
1181 source, crtc->name);
1182 return -EINVAL;
1183 }
1184
1185 *values_cnt = 1;
1186 return 0;
1187 }
1188
1189 static void ltdc_crtc_atomic_print_state(struct drm_printer *p,
1190 const struct drm_crtc_state *state)
1191 {
1192 struct drm_crtc *crtc = state->crtc;
1193 struct ltdc_device *ldev = crtc_to_ltdc(crtc);
1194
1195 drm_printf(p, "\ttransfer_error=%d\n", ldev->transfer_err);
1196 drm_printf(p, "\tfifo_underrun_error=%d\n", ldev->fifo_err);
1197 drm_printf(p, "\tfifo_underrun_warning=%d\n", ldev->fifo_warn);
1198 drm_printf(p, "\tfifo_underrun_threshold=%d\n", ldev->fifo_threshold);
1199 }
1200
1201 static const struct drm_crtc_funcs ltdc_crtc_funcs = {
1202 .destroy = drm_crtc_cleanup,
1203 .set_config = drm_atomic_helper_set_config,
1204 .page_flip = drm_atomic_helper_page_flip,
1205 .reset = drm_atomic_helper_crtc_reset,
1206 .atomic_duplicate_state = drm_atomic_helper_crtc_duplicate_state,
1207 .atomic_destroy_state = drm_atomic_helper_crtc_destroy_state,
1208 .enable_vblank = ltdc_crtc_enable_vblank,
1209 .disable_vblank = ltdc_crtc_disable_vblank,
1210 .get_vblank_timestamp = drm_crtc_vblank_helper_get_vblank_timestamp,
1211 .atomic_print_state = ltdc_crtc_atomic_print_state,
1212 };
1213
1214 static const struct drm_crtc_funcs ltdc_crtc_with_crc_support_funcs = {
1215 .destroy = drm_crtc_cleanup,
1216 .set_config = drm_atomic_helper_set_config,
1217 .page_flip = drm_atomic_helper_page_flip,
1218 .reset = drm_atomic_helper_crtc_reset,
1219 .atomic_duplicate_state = drm_atomic_helper_crtc_duplicate_state,
1220 .atomic_destroy_state = drm_atomic_helper_crtc_destroy_state,
1221 .enable_vblank = ltdc_crtc_enable_vblank,
1222 .disable_vblank = ltdc_crtc_disable_vblank,
1223 .get_vblank_timestamp = drm_crtc_vblank_helper_get_vblank_timestamp,
1224 .set_crc_source = ltdc_crtc_set_crc_source,
1225 .verify_crc_source = ltdc_crtc_verify_crc_source,
1226 .atomic_print_state = ltdc_crtc_atomic_print_state,
1227 };
1228
1229
1230
1231
1232
1233 static int ltdc_plane_atomic_check(struct drm_plane *plane,
1234 struct drm_atomic_state *state)
1235 {
1236 struct drm_plane_state *new_plane_state = drm_atomic_get_new_plane_state(state,
1237 plane);
1238 struct drm_framebuffer *fb = new_plane_state->fb;
1239 u32 src_w, src_h;
1240
1241 DRM_DEBUG_DRIVER("\n");
1242
1243 if (!fb)
1244 return 0;
1245
1246
1247 src_w = new_plane_state->src_w >> 16;
1248 src_h = new_plane_state->src_h >> 16;
1249
1250
1251 if (src_w != new_plane_state->crtc_w || src_h != new_plane_state->crtc_h) {
1252 DRM_DEBUG_DRIVER("Scaling is not supported");
1253
1254 return -EINVAL;
1255 }
1256
1257 return 0;
1258 }
1259
1260 static void ltdc_plane_atomic_update(struct drm_plane *plane,
1261 struct drm_atomic_state *state)
1262 {
1263 struct ltdc_device *ldev = plane_to_ltdc(plane);
1264 struct drm_plane_state *newstate = drm_atomic_get_new_plane_state(state,
1265 plane);
1266 struct drm_framebuffer *fb = newstate->fb;
1267 u32 lofs = plane->index * LAY_OFS;
1268 u32 x0 = newstate->crtc_x;
1269 u32 x1 = newstate->crtc_x + newstate->crtc_w - 1;
1270 u32 y0 = newstate->crtc_y;
1271 u32 y1 = newstate->crtc_y + newstate->crtc_h - 1;
1272 u32 src_x, src_y, src_w, src_h;
1273 u32 val, pitch_in_bytes, line_length, line_number, ahbp, avbp, bpcr;
1274 u32 paddr, paddr1, paddr2;
1275 enum ltdc_pix_fmt pf;
1276
1277 if (!newstate->crtc || !fb) {
1278 DRM_DEBUG_DRIVER("fb or crtc NULL");
1279 return;
1280 }
1281
1282
1283 src_x = newstate->src_x >> 16;
1284 src_y = newstate->src_y >> 16;
1285 src_w = newstate->src_w >> 16;
1286 src_h = newstate->src_h >> 16;
1287
1288 DRM_DEBUG_DRIVER("plane:%d fb:%d (%dx%d)@(%d,%d) -> (%dx%d)@(%d,%d)\n",
1289 plane->base.id, fb->base.id,
1290 src_w, src_h, src_x, src_y,
1291 newstate->crtc_w, newstate->crtc_h,
1292 newstate->crtc_x, newstate->crtc_y);
1293
1294 regmap_read(ldev->regmap, LTDC_BPCR, &bpcr);
1295
1296 ahbp = (bpcr & BPCR_AHBP) >> 16;
1297 avbp = bpcr & BPCR_AVBP;
1298
1299
1300 val = ((x1 + 1 + ahbp) << 16) + (x0 + 1 + ahbp);
1301 regmap_write_bits(ldev->regmap, LTDC_L1WHPCR + lofs,
1302 LXWHPCR_WHSTPOS | LXWHPCR_WHSPPOS, val);
1303
1304
1305 val = ((y1 + 1 + avbp) << 16) + (y0 + 1 + avbp);
1306 regmap_write_bits(ldev->regmap, LTDC_L1WVPCR + lofs,
1307 LXWVPCR_WVSTPOS | LXWVPCR_WVSPPOS, val);
1308
1309
1310 pf = to_ltdc_pixelformat(fb->format->format);
1311 for (val = 0; val < NB_PF; val++)
1312 if (ldev->caps.pix_fmt_hw[val] == pf)
1313 break;
1314
1315
1316 if (ldev->caps.pix_fmt_flex && val == NB_PF)
1317 val = ltdc_set_flexible_pixel_format(plane, pf);
1318
1319 if (val == NB_PF) {
1320 DRM_ERROR("Pixel format %.4s not supported\n",
1321 (char *)&fb->format->format);
1322 val = 0;
1323 }
1324 regmap_write_bits(ldev->regmap, LTDC_L1PFCR + lofs, LXPFCR_PF, val);
1325
1326
1327 val = newstate->alpha >> 8;
1328 regmap_write_bits(ldev->regmap, LTDC_L1CACR + lofs, LXCACR_CONSTA, val);
1329
1330
1331 val = BF1_PAXCA | BF2_1PAXCA;
1332 if (!fb->format->has_alpha)
1333 val = BF1_CA | BF2_1CA;
1334
1335
1336 if (ldev->caps.non_alpha_only_l1 &&
1337 plane->type != DRM_PLANE_TYPE_PRIMARY)
1338 val = BF1_PAXCA | BF2_1PAXCA;
1339
1340 if (ldev->caps.dynamic_zorder) {
1341 val |= (newstate->normalized_zpos << 16);
1342 regmap_write_bits(ldev->regmap, LTDC_L1BFCR + lofs,
1343 LXBFCR_BF2 | LXBFCR_BF1 | LXBFCR_BOR, val);
1344 } else {
1345 regmap_write_bits(ldev->regmap, LTDC_L1BFCR + lofs,
1346 LXBFCR_BF2 | LXBFCR_BF1, val);
1347 }
1348
1349
1350 paddr = (u32)drm_fb_cma_get_gem_addr(fb, newstate, 0);
1351
1352 if (newstate->rotation & DRM_MODE_REFLECT_X)
1353 paddr += (fb->format->cpp[0] * (x1 - x0 + 1)) - 1;
1354
1355 if (newstate->rotation & DRM_MODE_REFLECT_Y)
1356 paddr += (fb->pitches[0] * (y1 - y0));
1357
1358 DRM_DEBUG_DRIVER("fb: phys 0x%08x", paddr);
1359 regmap_write(ldev->regmap, LTDC_L1CFBAR + lofs, paddr);
1360
1361
1362 line_length = fb->format->cpp[0] *
1363 (x1 - x0 + 1) + (ldev->caps.bus_width >> 3) - 1;
1364
1365 if (newstate->rotation & DRM_MODE_REFLECT_Y)
1366
1367 pitch_in_bytes = 0x10000 - fb->pitches[0];
1368 else
1369 pitch_in_bytes = fb->pitches[0];
1370
1371 val = (pitch_in_bytes << 16) | line_length;
1372 regmap_write_bits(ldev->regmap, LTDC_L1CFBLR + lofs, LXCFBLR_CFBLL | LXCFBLR_CFBP, val);
1373
1374
1375 line_number = y1 - y0 + 1;
1376 regmap_write_bits(ldev->regmap, LTDC_L1CFBLNR + lofs, LXCFBLNR_CFBLN, line_number);
1377
1378 if (ldev->caps.ycbcr_input) {
1379 if (fb->format->is_yuv) {
1380 switch (fb->format->format) {
1381 case DRM_FORMAT_NV12:
1382 case DRM_FORMAT_NV21:
1383
1384 paddr1 = (u32)drm_fb_cma_get_gem_addr(fb, newstate, 1);
1385
1386 if (newstate->rotation & DRM_MODE_REFLECT_X)
1387 paddr1 += ((fb->format->cpp[1] * (x1 - x0 + 1)) >> 1) - 1;
1388
1389 if (newstate->rotation & DRM_MODE_REFLECT_Y)
1390 paddr1 += (fb->pitches[1] * (y1 - y0 - 1)) >> 1;
1391
1392 regmap_write(ldev->regmap, LTDC_L1AFBA0R + lofs, paddr1);
1393 break;
1394 case DRM_FORMAT_YUV420:
1395
1396 paddr1 = (u32)drm_fb_cma_get_gem_addr(fb, newstate, 1);
1397 paddr2 = (u32)drm_fb_cma_get_gem_addr(fb, newstate, 2);
1398
1399 if (newstate->rotation & DRM_MODE_REFLECT_X) {
1400 paddr1 += ((fb->format->cpp[1] * (x1 - x0 + 1)) >> 1) - 1;
1401 paddr2 += ((fb->format->cpp[2] * (x1 - x0 + 1)) >> 1) - 1;
1402 }
1403
1404 if (newstate->rotation & DRM_MODE_REFLECT_Y) {
1405 paddr1 += (fb->pitches[1] * (y1 - y0 - 1)) >> 1;
1406 paddr2 += (fb->pitches[2] * (y1 - y0 - 1)) >> 1;
1407 }
1408
1409 regmap_write(ldev->regmap, LTDC_L1AFBA0R + lofs, paddr1);
1410 regmap_write(ldev->regmap, LTDC_L1AFBA1R + lofs, paddr2);
1411 break;
1412 case DRM_FORMAT_YVU420:
1413
1414 paddr1 = (u32)drm_fb_cma_get_gem_addr(fb, newstate, 2);
1415 paddr2 = (u32)drm_fb_cma_get_gem_addr(fb, newstate, 1);
1416
1417 if (newstate->rotation & DRM_MODE_REFLECT_X) {
1418 paddr1 += ((fb->format->cpp[1] * (x1 - x0 + 1)) >> 1) - 1;
1419 paddr2 += ((fb->format->cpp[2] * (x1 - x0 + 1)) >> 1) - 1;
1420 }
1421
1422 if (newstate->rotation & DRM_MODE_REFLECT_Y) {
1423 paddr1 += (fb->pitches[1] * (y1 - y0 - 1)) >> 1;
1424 paddr2 += (fb->pitches[2] * (y1 - y0 - 1)) >> 1;
1425 }
1426
1427 regmap_write(ldev->regmap, LTDC_L1AFBA0R + lofs, paddr1);
1428 regmap_write(ldev->regmap, LTDC_L1AFBA1R + lofs, paddr2);
1429 break;
1430 }
1431
1432
1433
1434
1435
1436 if (fb->format->num_planes > 1) {
1437 if (newstate->rotation & DRM_MODE_REFLECT_Y)
1438
1439
1440
1441
1442 pitch_in_bytes = 0x10000 - fb->pitches[1];
1443 else
1444 pitch_in_bytes = fb->pitches[1];
1445
1446 line_length = ((fb->format->cpp[1] * (x1 - x0 + 1)) >> 1) +
1447 (ldev->caps.bus_width >> 3) - 1;
1448
1449
1450 val = (pitch_in_bytes << 16) | line_length;
1451 regmap_write(ldev->regmap, LTDC_L1AFBLR + lofs, val);
1452
1453
1454 val = line_number >> 1;
1455 regmap_write(ldev->regmap, LTDC_L1AFBLNR + lofs, val);
1456 }
1457
1458
1459 ltdc_set_ycbcr_coeffs(plane);
1460
1461
1462 ltdc_set_ycbcr_config(plane, fb->format->format);
1463 } else {
1464
1465 regmap_write(ldev->regmap, LTDC_L1PCR + lofs, 0);
1466 }
1467 }
1468
1469
1470 val = fb->format->format == DRM_FORMAT_C8 ? LXCR_CLUTEN : 0;
1471 val |= LXCR_LEN;
1472
1473
1474 if (newstate->rotation & DRM_MODE_REFLECT_X)
1475 val |= LXCR_HMEN;
1476
1477 regmap_write_bits(ldev->regmap, LTDC_L1CR + lofs, LXCR_LEN | LXCR_CLUTEN | LXCR_HMEN, val);
1478
1479
1480 if (ldev->caps.plane_reg_shadow)
1481 regmap_write_bits(ldev->regmap, LTDC_L1RCR + lofs,
1482 LXRCR_IMR | LXRCR_VBR | LXRCR_GRMSK, LXRCR_VBR);
1483
1484 ldev->plane_fpsi[plane->index].counter++;
1485
1486 mutex_lock(&ldev->err_lock);
1487 if (ldev->transfer_err) {
1488 DRM_WARN("ltdc transfer error: %d\n", ldev->transfer_err);
1489 ldev->transfer_err = 0;
1490 }
1491
1492 if (ldev->caps.fifo_threshold) {
1493 if (ldev->fifo_err) {
1494 DRM_WARN("ltdc fifo underrun: please verify display mode\n");
1495 ldev->fifo_err = 0;
1496 }
1497 } else {
1498 if (ldev->fifo_warn >= ldev->fifo_threshold) {
1499 DRM_WARN("ltdc fifo underrun: please verify display mode\n");
1500 ldev->fifo_warn = 0;
1501 }
1502 }
1503 mutex_unlock(&ldev->err_lock);
1504 }
1505
1506 static void ltdc_plane_atomic_disable(struct drm_plane *plane,
1507 struct drm_atomic_state *state)
1508 {
1509 struct drm_plane_state *oldstate = drm_atomic_get_old_plane_state(state,
1510 plane);
1511 struct ltdc_device *ldev = plane_to_ltdc(plane);
1512 u32 lofs = plane->index * LAY_OFS;
1513
1514
1515 regmap_write_bits(ldev->regmap, LTDC_L1CR + lofs, LXCR_LEN | LXCR_CLUTEN | LXCR_HMEN, 0);
1516
1517
1518 if (ldev->caps.plane_reg_shadow)
1519 regmap_write_bits(ldev->regmap, LTDC_L1RCR + lofs,
1520 LXRCR_IMR | LXRCR_VBR | LXRCR_GRMSK, LXRCR_VBR);
1521
1522 DRM_DEBUG_DRIVER("CRTC:%d plane:%d\n",
1523 oldstate->crtc->base.id, plane->base.id);
1524 }
1525
1526 static void ltdc_plane_atomic_print_state(struct drm_printer *p,
1527 const struct drm_plane_state *state)
1528 {
1529 struct drm_plane *plane = state->plane;
1530 struct ltdc_device *ldev = plane_to_ltdc(plane);
1531 struct fps_info *fpsi = &ldev->plane_fpsi[plane->index];
1532 int ms_since_last;
1533 ktime_t now;
1534
1535 now = ktime_get();
1536 ms_since_last = ktime_to_ms(ktime_sub(now, fpsi->last_timestamp));
1537
1538 drm_printf(p, "\tuser_updates=%dfps\n",
1539 DIV_ROUND_CLOSEST(fpsi->counter * 1000, ms_since_last));
1540
1541 fpsi->last_timestamp = now;
1542 fpsi->counter = 0;
1543 }
1544
1545 static const struct drm_plane_funcs ltdc_plane_funcs = {
1546 .update_plane = drm_atomic_helper_update_plane,
1547 .disable_plane = drm_atomic_helper_disable_plane,
1548 .destroy = drm_plane_cleanup,
1549 .reset = drm_atomic_helper_plane_reset,
1550 .atomic_duplicate_state = drm_atomic_helper_plane_duplicate_state,
1551 .atomic_destroy_state = drm_atomic_helper_plane_destroy_state,
1552 .atomic_print_state = ltdc_plane_atomic_print_state,
1553 };
1554
1555 static const struct drm_plane_helper_funcs ltdc_plane_helper_funcs = {
1556 .atomic_check = ltdc_plane_atomic_check,
1557 .atomic_update = ltdc_plane_atomic_update,
1558 .atomic_disable = ltdc_plane_atomic_disable,
1559 };
1560
1561 static struct drm_plane *ltdc_plane_create(struct drm_device *ddev,
1562 enum drm_plane_type type,
1563 int index)
1564 {
1565 unsigned long possible_crtcs = CRTC_MASK;
1566 struct ltdc_device *ldev = ddev->dev_private;
1567 struct device *dev = ddev->dev;
1568 struct drm_plane *plane;
1569 unsigned int i, nb_fmt = 0;
1570 u32 *formats;
1571 u32 drm_fmt;
1572 const u64 *modifiers = ltdc_format_modifiers;
1573 u32 lofs = index * LAY_OFS;
1574 u32 val;
1575 int ret;
1576
1577
1578 formats = devm_kzalloc(dev, (ldev->caps.pix_fmt_nb +
1579 ARRAY_SIZE(ltdc_drm_fmt_ycbcr_cp) +
1580 ARRAY_SIZE(ltdc_drm_fmt_ycbcr_sp) +
1581 ARRAY_SIZE(ltdc_drm_fmt_ycbcr_fp)) *
1582 sizeof(*formats), GFP_KERNEL);
1583
1584 for (i = 0; i < ldev->caps.pix_fmt_nb; i++) {
1585 drm_fmt = ldev->caps.pix_fmt_drm[i];
1586
1587
1588 if (ldev->caps.non_alpha_only_l1)
1589
1590 if (type != DRM_PLANE_TYPE_PRIMARY && is_xrgb(drm_fmt))
1591 continue;
1592
1593 formats[nb_fmt++] = drm_fmt;
1594 }
1595
1596
1597 if (ldev->caps.ycbcr_input) {
1598 regmap_read(ldev->regmap, LTDC_L1C1R + lofs, &val);
1599 if (val & LXCR_C1R_YIA) {
1600 memcpy(&formats[nb_fmt], ltdc_drm_fmt_ycbcr_cp,
1601 ARRAY_SIZE(ltdc_drm_fmt_ycbcr_cp) * sizeof(*formats));
1602 nb_fmt += ARRAY_SIZE(ltdc_drm_fmt_ycbcr_cp);
1603 }
1604 if (val & LXCR_C1R_YSPA) {
1605 memcpy(&formats[nb_fmt], ltdc_drm_fmt_ycbcr_sp,
1606 ARRAY_SIZE(ltdc_drm_fmt_ycbcr_sp) * sizeof(*formats));
1607 nb_fmt += ARRAY_SIZE(ltdc_drm_fmt_ycbcr_sp);
1608 }
1609 if (val & LXCR_C1R_YFPA) {
1610 memcpy(&formats[nb_fmt], ltdc_drm_fmt_ycbcr_fp,
1611 ARRAY_SIZE(ltdc_drm_fmt_ycbcr_fp) * sizeof(*formats));
1612 nb_fmt += ARRAY_SIZE(ltdc_drm_fmt_ycbcr_fp);
1613 }
1614 }
1615
1616 plane = devm_kzalloc(dev, sizeof(*plane), GFP_KERNEL);
1617 if (!plane)
1618 return NULL;
1619
1620 ret = drm_universal_plane_init(ddev, plane, possible_crtcs,
1621 <dc_plane_funcs, formats, nb_fmt,
1622 modifiers, type, NULL);
1623 if (ret < 0)
1624 return NULL;
1625
1626 if (ldev->caps.ycbcr_input) {
1627 if (val & (LXCR_C1R_YIA | LXCR_C1R_YSPA | LXCR_C1R_YFPA))
1628 drm_plane_create_color_properties(plane,
1629 BIT(DRM_COLOR_YCBCR_BT601) |
1630 BIT(DRM_COLOR_YCBCR_BT709),
1631 BIT(DRM_COLOR_YCBCR_LIMITED_RANGE) |
1632 BIT(DRM_COLOR_YCBCR_FULL_RANGE),
1633 DRM_COLOR_YCBCR_BT601,
1634 DRM_COLOR_YCBCR_LIMITED_RANGE);
1635 }
1636
1637 drm_plane_helper_add(plane, <dc_plane_helper_funcs);
1638
1639 drm_plane_create_alpha_property(plane);
1640
1641 DRM_DEBUG_DRIVER("plane:%d created\n", plane->base.id);
1642
1643 return plane;
1644 }
1645
1646 static void ltdc_plane_destroy_all(struct drm_device *ddev)
1647 {
1648 struct drm_plane *plane, *plane_temp;
1649
1650 list_for_each_entry_safe(plane, plane_temp,
1651 &ddev->mode_config.plane_list, head)
1652 drm_plane_cleanup(plane);
1653 }
1654
1655 static int ltdc_crtc_init(struct drm_device *ddev, struct drm_crtc *crtc)
1656 {
1657 struct ltdc_device *ldev = ddev->dev_private;
1658 struct drm_plane *primary, *overlay;
1659 int supported_rotations = DRM_MODE_ROTATE_0 | DRM_MODE_REFLECT_X | DRM_MODE_REFLECT_Y;
1660 unsigned int i;
1661 int ret;
1662
1663 primary = ltdc_plane_create(ddev, DRM_PLANE_TYPE_PRIMARY, 0);
1664 if (!primary) {
1665 DRM_ERROR("Can not create primary plane\n");
1666 return -EINVAL;
1667 }
1668
1669 if (ldev->caps.dynamic_zorder)
1670 drm_plane_create_zpos_property(primary, 0, 0, ldev->caps.nb_layers - 1);
1671 else
1672 drm_plane_create_zpos_immutable_property(primary, 0);
1673
1674 if (ldev->caps.plane_rotation)
1675 drm_plane_create_rotation_property(primary, DRM_MODE_ROTATE_0,
1676 supported_rotations);
1677
1678
1679 if (ldev->caps.crc)
1680 ret = drm_crtc_init_with_planes(ddev, crtc, primary, NULL,
1681 <dc_crtc_with_crc_support_funcs, NULL);
1682 else
1683 ret = drm_crtc_init_with_planes(ddev, crtc, primary, NULL,
1684 <dc_crtc_funcs, NULL);
1685 if (ret) {
1686 DRM_ERROR("Can not initialize CRTC\n");
1687 goto cleanup;
1688 }
1689
1690 drm_crtc_helper_add(crtc, <dc_crtc_helper_funcs);
1691
1692 drm_mode_crtc_set_gamma_size(crtc, CLUT_SIZE);
1693 drm_crtc_enable_color_mgmt(crtc, 0, false, CLUT_SIZE);
1694
1695 DRM_DEBUG_DRIVER("CRTC:%d created\n", crtc->base.id);
1696
1697
1698 for (i = 1; i < ldev->caps.nb_layers; i++) {
1699 overlay = ltdc_plane_create(ddev, DRM_PLANE_TYPE_OVERLAY, i);
1700 if (!overlay) {
1701 ret = -ENOMEM;
1702 DRM_ERROR("Can not create overlay plane %d\n", i);
1703 goto cleanup;
1704 }
1705 if (ldev->caps.dynamic_zorder)
1706 drm_plane_create_zpos_property(overlay, i, 0, ldev->caps.nb_layers - 1);
1707 else
1708 drm_plane_create_zpos_immutable_property(overlay, i);
1709
1710 if (ldev->caps.plane_rotation)
1711 drm_plane_create_rotation_property(overlay, DRM_MODE_ROTATE_0,
1712 supported_rotations);
1713 }
1714
1715 return 0;
1716
1717 cleanup:
1718 ltdc_plane_destroy_all(ddev);
1719 return ret;
1720 }
1721
1722 static void ltdc_encoder_disable(struct drm_encoder *encoder)
1723 {
1724 struct drm_device *ddev = encoder->dev;
1725 struct ltdc_device *ldev = ddev->dev_private;
1726
1727 DRM_DEBUG_DRIVER("\n");
1728
1729
1730 regmap_clear_bits(ldev->regmap, LTDC_GCR, GCR_LTDCEN);
1731
1732
1733 pinctrl_pm_select_sleep_state(ddev->dev);
1734 }
1735
1736 static void ltdc_encoder_enable(struct drm_encoder *encoder)
1737 {
1738 struct drm_device *ddev = encoder->dev;
1739 struct ltdc_device *ldev = ddev->dev_private;
1740
1741 DRM_DEBUG_DRIVER("\n");
1742
1743
1744 if (ldev->caps.fifo_threshold)
1745 regmap_write(ldev->regmap, LTDC_FUT, ldev->fifo_threshold);
1746
1747
1748 regmap_set_bits(ldev->regmap, LTDC_GCR, GCR_LTDCEN);
1749 }
1750
1751 static void ltdc_encoder_mode_set(struct drm_encoder *encoder,
1752 struct drm_display_mode *mode,
1753 struct drm_display_mode *adjusted_mode)
1754 {
1755 struct drm_device *ddev = encoder->dev;
1756
1757 DRM_DEBUG_DRIVER("\n");
1758
1759
1760
1761
1762
1763
1764 if (encoder->encoder_type == DRM_MODE_ENCODER_DPI)
1765 pinctrl_pm_select_default_state(ddev->dev);
1766 }
1767
1768 static const struct drm_encoder_helper_funcs ltdc_encoder_helper_funcs = {
1769 .disable = ltdc_encoder_disable,
1770 .enable = ltdc_encoder_enable,
1771 .mode_set = ltdc_encoder_mode_set,
1772 };
1773
1774 static int ltdc_encoder_init(struct drm_device *ddev, struct drm_bridge *bridge)
1775 {
1776 struct drm_encoder *encoder;
1777 int ret;
1778
1779 encoder = devm_kzalloc(ddev->dev, sizeof(*encoder), GFP_KERNEL);
1780 if (!encoder)
1781 return -ENOMEM;
1782
1783 encoder->possible_crtcs = CRTC_MASK;
1784 encoder->possible_clones = 0;
1785
1786 drm_simple_encoder_init(ddev, encoder, DRM_MODE_ENCODER_DPI);
1787
1788 drm_encoder_helper_add(encoder, <dc_encoder_helper_funcs);
1789
1790 ret = drm_bridge_attach(encoder, bridge, NULL, 0);
1791 if (ret) {
1792 if (ret != -EPROBE_DEFER)
1793 drm_encoder_cleanup(encoder);
1794 return ret;
1795 }
1796
1797 DRM_DEBUG_DRIVER("Bridge encoder:%d created\n", encoder->base.id);
1798
1799 return 0;
1800 }
1801
1802 static int ltdc_get_caps(struct drm_device *ddev)
1803 {
1804 struct ltdc_device *ldev = ddev->dev_private;
1805 u32 bus_width_log2, lcr, gc2r;
1806
1807
1808
1809
1810
1811 regmap_read(ldev->regmap, LTDC_LCR, &lcr);
1812
1813 ldev->caps.nb_layers = clamp((int)lcr, 1, LTDC_MAX_LAYER);
1814
1815
1816 regmap_read(ldev->regmap, LTDC_GC2R, &gc2r);
1817 bus_width_log2 = (gc2r & GC2R_BW) >> 4;
1818 ldev->caps.bus_width = 8 << bus_width_log2;
1819 regmap_read(ldev->regmap, LTDC_IDR, &ldev->caps.hw_version);
1820
1821 switch (ldev->caps.hw_version) {
1822 case HWVER_10200:
1823 case HWVER_10300:
1824 ldev->caps.layer_ofs = LAY_OFS_0;
1825 ldev->caps.layer_regs = ltdc_layer_regs_a0;
1826 ldev->caps.pix_fmt_hw = ltdc_pix_fmt_a0;
1827 ldev->caps.pix_fmt_drm = ltdc_drm_fmt_a0;
1828 ldev->caps.pix_fmt_nb = ARRAY_SIZE(ltdc_drm_fmt_a0);
1829 ldev->caps.pix_fmt_flex = false;
1830
1831
1832
1833
1834
1835
1836
1837 ldev->caps.non_alpha_only_l1 = true;
1838 ldev->caps.pad_max_freq_hz = 90000000;
1839 if (ldev->caps.hw_version == HWVER_10200)
1840 ldev->caps.pad_max_freq_hz = 65000000;
1841 ldev->caps.nb_irq = 2;
1842 ldev->caps.ycbcr_input = false;
1843 ldev->caps.ycbcr_output = false;
1844 ldev->caps.plane_reg_shadow = false;
1845 ldev->caps.crc = false;
1846 ldev->caps.dynamic_zorder = false;
1847 ldev->caps.plane_rotation = false;
1848 ldev->caps.fifo_threshold = false;
1849 break;
1850 case HWVER_20101:
1851 ldev->caps.layer_ofs = LAY_OFS_0;
1852 ldev->caps.layer_regs = ltdc_layer_regs_a1;
1853 ldev->caps.pix_fmt_hw = ltdc_pix_fmt_a1;
1854 ldev->caps.pix_fmt_drm = ltdc_drm_fmt_a1;
1855 ldev->caps.pix_fmt_nb = ARRAY_SIZE(ltdc_drm_fmt_a1);
1856 ldev->caps.pix_fmt_flex = false;
1857 ldev->caps.non_alpha_only_l1 = false;
1858 ldev->caps.pad_max_freq_hz = 150000000;
1859 ldev->caps.nb_irq = 4;
1860 ldev->caps.ycbcr_input = false;
1861 ldev->caps.ycbcr_output = false;
1862 ldev->caps.plane_reg_shadow = false;
1863 ldev->caps.crc = false;
1864 ldev->caps.dynamic_zorder = false;
1865 ldev->caps.plane_rotation = false;
1866 ldev->caps.fifo_threshold = false;
1867 break;
1868 case HWVER_40100:
1869 ldev->caps.layer_ofs = LAY_OFS_1;
1870 ldev->caps.layer_regs = ltdc_layer_regs_a2;
1871 ldev->caps.pix_fmt_hw = ltdc_pix_fmt_a2;
1872 ldev->caps.pix_fmt_drm = ltdc_drm_fmt_a2;
1873 ldev->caps.pix_fmt_nb = ARRAY_SIZE(ltdc_drm_fmt_a2);
1874 ldev->caps.pix_fmt_flex = true;
1875 ldev->caps.non_alpha_only_l1 = false;
1876 ldev->caps.pad_max_freq_hz = 90000000;
1877 ldev->caps.nb_irq = 2;
1878 ldev->caps.ycbcr_input = true;
1879 ldev->caps.ycbcr_output = true;
1880 ldev->caps.plane_reg_shadow = true;
1881 ldev->caps.crc = true;
1882 ldev->caps.dynamic_zorder = true;
1883 ldev->caps.plane_rotation = true;
1884 ldev->caps.fifo_threshold = true;
1885 break;
1886 default:
1887 return -ENODEV;
1888 }
1889
1890 return 0;
1891 }
1892
1893 void ltdc_suspend(struct drm_device *ddev)
1894 {
1895 struct ltdc_device *ldev = ddev->dev_private;
1896
1897 DRM_DEBUG_DRIVER("\n");
1898 clk_disable_unprepare(ldev->pixel_clk);
1899 }
1900
1901 int ltdc_resume(struct drm_device *ddev)
1902 {
1903 struct ltdc_device *ldev = ddev->dev_private;
1904 int ret;
1905
1906 DRM_DEBUG_DRIVER("\n");
1907
1908 ret = clk_prepare_enable(ldev->pixel_clk);
1909 if (ret) {
1910 DRM_ERROR("failed to enable pixel clock (%d)\n", ret);
1911 return ret;
1912 }
1913
1914 return 0;
1915 }
1916
1917 int ltdc_load(struct drm_device *ddev)
1918 {
1919 struct platform_device *pdev = to_platform_device(ddev->dev);
1920 struct ltdc_device *ldev = ddev->dev_private;
1921 struct device *dev = ddev->dev;
1922 struct device_node *np = dev->of_node;
1923 struct drm_bridge *bridge;
1924 struct drm_panel *panel;
1925 struct drm_crtc *crtc;
1926 struct reset_control *rstc;
1927 struct resource *res;
1928 int irq, i, nb_endpoints;
1929 int ret = -ENODEV;
1930
1931 DRM_DEBUG_DRIVER("\n");
1932
1933
1934 nb_endpoints = of_graph_get_endpoint_count(np);
1935 if (!nb_endpoints)
1936 return -ENODEV;
1937
1938 ldev->pixel_clk = devm_clk_get(dev, "lcd");
1939 if (IS_ERR(ldev->pixel_clk)) {
1940 if (PTR_ERR(ldev->pixel_clk) != -EPROBE_DEFER)
1941 DRM_ERROR("Unable to get lcd clock\n");
1942 return PTR_ERR(ldev->pixel_clk);
1943 }
1944
1945 if (clk_prepare_enable(ldev->pixel_clk)) {
1946 DRM_ERROR("Unable to prepare pixel clock\n");
1947 return -ENODEV;
1948 }
1949
1950
1951 for (i = 0; i < nb_endpoints; i++) {
1952 ret = drm_of_find_panel_or_bridge(np, 0, i, &panel, &bridge);
1953
1954
1955
1956
1957
1958
1959 if (ret == -ENODEV)
1960 continue;
1961 else if (ret)
1962 goto err;
1963
1964 if (panel) {
1965 bridge = drm_panel_bridge_add_typed(panel,
1966 DRM_MODE_CONNECTOR_DPI);
1967 if (IS_ERR(bridge)) {
1968 DRM_ERROR("panel-bridge endpoint %d\n", i);
1969 ret = PTR_ERR(bridge);
1970 goto err;
1971 }
1972 }
1973
1974 if (bridge) {
1975 ret = ltdc_encoder_init(ddev, bridge);
1976 if (ret) {
1977 if (ret != -EPROBE_DEFER)
1978 DRM_ERROR("init encoder endpoint %d\n", i);
1979 goto err;
1980 }
1981 }
1982 }
1983
1984 rstc = devm_reset_control_get_exclusive(dev, NULL);
1985
1986 mutex_init(&ldev->err_lock);
1987
1988 if (!IS_ERR(rstc)) {
1989 reset_control_assert(rstc);
1990 usleep_range(10, 20);
1991 reset_control_deassert(rstc);
1992 }
1993
1994 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
1995 ldev->regs = devm_ioremap_resource(dev, res);
1996 if (IS_ERR(ldev->regs)) {
1997 DRM_ERROR("Unable to get ltdc registers\n");
1998 ret = PTR_ERR(ldev->regs);
1999 goto err;
2000 }
2001
2002 ldev->regmap = devm_regmap_init_mmio(&pdev->dev, ldev->regs, &stm32_ltdc_regmap_cfg);
2003 if (IS_ERR(ldev->regmap)) {
2004 DRM_ERROR("Unable to regmap ltdc registers\n");
2005 ret = PTR_ERR(ldev->regmap);
2006 goto err;
2007 }
2008
2009 ret = ltdc_get_caps(ddev);
2010 if (ret) {
2011 DRM_ERROR("hardware identifier (0x%08x) not supported!\n",
2012 ldev->caps.hw_version);
2013 goto err;
2014 }
2015
2016
2017 if (ldev->caps.fifo_threshold)
2018 regmap_clear_bits(ldev->regmap, LTDC_IER, IER_LIE | IER_RRIE | IER_FUWIE |
2019 IER_TERRIE);
2020 else
2021 regmap_clear_bits(ldev->regmap, LTDC_IER, IER_LIE | IER_RRIE | IER_FUWIE |
2022 IER_TERRIE | IER_FUEIE);
2023
2024 DRM_DEBUG_DRIVER("ltdc hw version 0x%08x\n", ldev->caps.hw_version);
2025
2026
2027 ldev->transfer_err = 0;
2028 ldev->fifo_err = 0;
2029 ldev->fifo_warn = 0;
2030 ldev->fifo_threshold = FUT_DFT;
2031
2032 for (i = 0; i < ldev->caps.nb_irq; i++) {
2033 irq = platform_get_irq(pdev, i);
2034 if (irq < 0) {
2035 ret = irq;
2036 goto err;
2037 }
2038
2039 ret = devm_request_threaded_irq(dev, irq, ltdc_irq,
2040 ltdc_irq_thread, IRQF_ONESHOT,
2041 dev_name(dev), ddev);
2042 if (ret) {
2043 DRM_ERROR("Failed to register LTDC interrupt\n");
2044 goto err;
2045 }
2046 }
2047
2048 crtc = devm_kzalloc(dev, sizeof(*crtc), GFP_KERNEL);
2049 if (!crtc) {
2050 DRM_ERROR("Failed to allocate crtc\n");
2051 ret = -ENOMEM;
2052 goto err;
2053 }
2054
2055 ret = ltdc_crtc_init(ddev, crtc);
2056 if (ret) {
2057 DRM_ERROR("Failed to init crtc\n");
2058 goto err;
2059 }
2060
2061 ret = drm_vblank_init(ddev, NB_CRTC);
2062 if (ret) {
2063 DRM_ERROR("Failed calling drm_vblank_init()\n");
2064 goto err;
2065 }
2066
2067 clk_disable_unprepare(ldev->pixel_clk);
2068
2069 pinctrl_pm_select_sleep_state(ddev->dev);
2070
2071 pm_runtime_enable(ddev->dev);
2072
2073 return 0;
2074 err:
2075 for (i = 0; i < nb_endpoints; i++)
2076 drm_of_panel_bridge_remove(ddev->dev->of_node, 0, i);
2077
2078 clk_disable_unprepare(ldev->pixel_clk);
2079
2080 return ret;
2081 }
2082
2083 void ltdc_unload(struct drm_device *ddev)
2084 {
2085 struct device *dev = ddev->dev;
2086 int nb_endpoints, i;
2087
2088 DRM_DEBUG_DRIVER("\n");
2089
2090 nb_endpoints = of_graph_get_endpoint_count(dev->of_node);
2091
2092 for (i = 0; i < nb_endpoints; i++)
2093 drm_of_panel_bridge_remove(ddev->dev->of_node, 0, i);
2094
2095 pm_runtime_disable(ddev->dev);
2096 }
2097
2098 MODULE_AUTHOR("Philippe Cornu <philippe.cornu@st.com>");
2099 MODULE_AUTHOR("Yannick Fertre <yannick.fertre@st.com>");
2100 MODULE_AUTHOR("Fabien Dessenne <fabien.dessenne@st.com>");
2101 MODULE_AUTHOR("Mickael Reulier <mickael.reulier@st.com>");
2102 MODULE_DESCRIPTION("STMicroelectronics ST DRM LTDC driver");
2103 MODULE_LICENSE("GPL v2");