Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge tag 'drm-rcar-next-20230325' of git://git.kernel.org/pub/scm/linux/kernel/git/pinchartl/linux into drm-next

Miscellaneous fixes and improvements for rcar-du

Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
From: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20230325204922.GD19335@pendragon.ideasonboard.com

+163 -111
+26 -12
drivers/gpu/drm/rcar-du/rcar_du_crtc.c
··· 298 298 escr = params.escr; 299 299 } 300 300 301 - if (rcdu->info->gen < 4) { 301 + /* 302 + * The ESCR register only exists in DU channels that can output to an 303 + * LVDS or DPAT, and the OTAR register in DU channels that can output 304 + * to a DPAD. 305 + */ 306 + if ((rcdu->info->routes[RCAR_DU_OUTPUT_DPAD0].possible_crtcs | 307 + rcdu->info->routes[RCAR_DU_OUTPUT_DPAD1].possible_crtcs | 308 + rcdu->info->routes[RCAR_DU_OUTPUT_LVDS0].possible_crtcs | 309 + rcdu->info->routes[RCAR_DU_OUTPUT_LVDS1].possible_crtcs) & 310 + BIT(rcrtc->index)) { 302 311 dev_dbg(rcrtc->dev->dev, "%s: ESCR 0x%08x\n", __func__, escr); 303 312 304 313 rcar_du_crtc_write(rcrtc, rcrtc->index % 2 ? ESCR13 : ESCR02, escr); 305 - rcar_du_crtc_write(rcrtc, rcrtc->index % 2 ? OTAR13 : OTAR02, 0); 306 314 } 315 + 316 + if ((rcdu->info->routes[RCAR_DU_OUTPUT_DPAD0].possible_crtcs | 317 + rcdu->info->routes[RCAR_DU_OUTPUT_DPAD1].possible_crtcs) & 318 + BIT(rcrtc->index)) 319 + rcar_du_crtc_write(rcrtc, rcrtc->index % 2 ? OTAR13 : OTAR02, 0); 307 320 308 321 /* Signal polarities */ 309 322 dsmr = ((mode->flags & DRM_MODE_FLAG_PVSYNC) ? DSMR_VSL : 0) ··· 762 749 763 750 /* 764 751 * On D3/E3 the dot clock is provided by the LVDS encoder attached to 765 - * the DU channel. We need to enable its clock output explicitly if 766 - * the LVDS output is disabled. 752 + * the DU channel. We need to enable its clock output explicitly before 753 + * starting the CRTC, as the bridge hasn't been enabled by the atomic 754 + * helpers yet. 767 755 */ 768 - if (rcdu->info->lvds_clk_mask & BIT(rcrtc->index) && 769 - rstate->outputs == BIT(RCAR_DU_OUTPUT_DPAD0)) { 756 + if (rcdu->info->lvds_clk_mask & BIT(rcrtc->index)) { 757 + bool dot_clk_only = rstate->outputs == BIT(RCAR_DU_OUTPUT_DPAD0); 770 758 struct drm_bridge *bridge = rcdu->lvds[rcrtc->index]; 771 759 const struct drm_display_mode *mode = 772 760 &crtc->state->adjusted_mode; 773 761 774 - rcar_lvds_pclk_enable(bridge, mode->clock * 1000); 762 + rcar_lvds_pclk_enable(bridge, mode->clock * 1000, dot_clk_only); 775 763 } 776 764 777 765 /* ··· 809 795 rcar_du_crtc_stop(rcrtc); 810 796 rcar_du_crtc_put(rcrtc); 811 797 812 - if (rcdu->info->lvds_clk_mask & BIT(rcrtc->index) && 813 - rstate->outputs == BIT(RCAR_DU_OUTPUT_DPAD0)) { 798 + if (rcdu->info->lvds_clk_mask & BIT(rcrtc->index)) { 799 + bool dot_clk_only = rstate->outputs == BIT(RCAR_DU_OUTPUT_DPAD0); 814 800 struct drm_bridge *bridge = rcdu->lvds[rcrtc->index]; 815 801 816 802 /* 817 803 * Disable the LVDS clock output, see 818 - * rcar_du_crtc_atomic_enable(). 804 + * rcar_du_crtc_atomic_enable(). When the LVDS output is used, 805 + * this also disables the LVDS encoder. 819 806 */ 820 - rcar_lvds_pclk_disable(bridge); 807 + rcar_lvds_pclk_disable(bridge, dot_clk_only); 821 808 } 822 809 823 810 if ((rcdu->info->dsi_clk_mask & BIT(rcrtc->index)) && ··· 830 815 * Disable the DSI clock output, see 831 816 * rcar_du_crtc_atomic_enable(). 832 817 */ 833 - 834 818 rcar_mipi_dsi_pclk_disable(bridge); 835 819 } 836 820
+2 -2
drivers/gpu/drm/rcar-du/rcar_du_encoder.c
··· 109 109 renc = drmm_encoder_alloc(&rcdu->ddev, struct rcar_du_encoder, base, 110 110 &rcar_du_encoder_funcs, DRM_MODE_ENCODER_NONE, 111 111 NULL); 112 - if (!renc) 113 - return -ENOMEM; 112 + if (IS_ERR(renc)) 113 + return PTR_ERR(renc); 114 114 115 115 renc->output = output; 116 116
+12 -4
drivers/gpu/drm/rcar-du/rcar_du_group.c
··· 138 138 { 139 139 struct rcar_du_device *rcdu = rgrp->dev; 140 140 u32 defr7 = DEFR7_CODE; 141 + u32 dorcr; 141 142 142 143 /* Enable extended features */ 143 144 rcar_du_group_write(rgrp, DEFR, DEFR_CODE | DEFR_DEFE); ··· 175 174 /* 176 175 * Use DS1PR and DS2PR to configure planes priorities and connects the 177 176 * superposition 0 to DU0 pins. DU1 pins will be configured dynamically. 177 + * 178 + * Groups that have a single channel have a hardcoded configuration. On 179 + * Gen3 and newer, the documentation requires PG1T, DK1S and PG1D_DS1 to 180 + * always be set in this case. 178 181 */ 179 - rcar_du_group_write(rgrp, DORCR, DORCR_PG1D_DS1 | DORCR_DPRS); 182 + dorcr = DORCR_PG0D_DS0 | DORCR_DPRS; 183 + if (rcdu->info->gen >= 3 && rgrp->num_crtcs == 1) 184 + dorcr |= DORCR_PG1T | DORCR_DK1S | DORCR_PG1D_DS1; 185 + rcar_du_group_write(rgrp, DORCR, dorcr); 180 186 181 187 /* Apply planes to CRTCs association. */ 182 188 mutex_lock(&rgrp->lock); ··· 357 349 struct rcar_du_device *rcdu = rgrp->dev; 358 350 u32 dorcr = rcar_du_group_read(rgrp, DORCR); 359 351 360 - dorcr &= ~(DORCR_PG2T | DORCR_DK2S | DORCR_PG2D_MASK); 352 + dorcr &= ~(DORCR_PG1T | DORCR_DK1S | DORCR_PG1D_MASK); 361 353 362 354 /* 363 355 * Set the DPAD1 pins sources. Select CRTC 0 if explicitly requested and ··· 365 357 * by default. 366 358 */ 367 359 if (rcdu->dpad1_source == rgrp->index * 2) 368 - dorcr |= DORCR_PG2D_DS1; 360 + dorcr |= DORCR_PG1D_DS0; 369 361 else 370 - dorcr |= DORCR_PG2T | DORCR_DK2S | DORCR_PG2D_DS2; 362 + dorcr |= DORCR_PG1T | DORCR_DK1S | DORCR_PG1D_DS1; 371 363 372 364 rcar_du_group_write(rgrp, DORCR, dorcr); 373 365
+13 -13
drivers/gpu/drm/rcar-du/rcar_du_regs.h
··· 511 511 */ 512 512 513 513 #define DORCR 0x11000 514 - #define DORCR_PG2T (1 << 30) 515 - #define DORCR_DK2S (1 << 28) 516 - #define DORCR_PG2D_DS1 (0 << 24) 517 - #define DORCR_PG2D_DS2 (1 << 24) 518 - #define DORCR_PG2D_FIX0 (2 << 24) 519 - #define DORCR_PG2D_DOOR (3 << 24) 520 - #define DORCR_PG2D_MASK (3 << 24) 521 - #define DORCR_DR1D (1 << 21) 522 - #define DORCR_PG1D_DS1 (0 << 16) 523 - #define DORCR_PG1D_DS2 (1 << 16) 524 - #define DORCR_PG1D_FIX0 (2 << 16) 525 - #define DORCR_PG1D_DOOR (3 << 16) 526 - #define DORCR_PG1D_MASK (3 << 16) 514 + #define DORCR_PG1T (1 << 30) 515 + #define DORCR_DK1S (1 << 28) 516 + #define DORCR_PG1D_DS0 (0 << 24) 517 + #define DORCR_PG1D_DS1 (1 << 24) 518 + #define DORCR_PG1D_FIX0 (2 << 24) 519 + #define DORCR_PG1D_DOOR (3 << 24) 520 + #define DORCR_PG1D_MASK (3 << 24) 521 + #define DORCR_DR0D (1 << 21) 522 + #define DORCR_PG0D_DS0 (0 << 16) 523 + #define DORCR_PG0D_DS1 (1 << 16) 524 + #define DORCR_PG0D_FIX0 (2 << 16) 525 + #define DORCR_PG0D_DOOR (3 << 16) 526 + #define DORCR_PG0D_MASK (3 << 16) 527 527 #define DORCR_RGPV (1 << 4) 528 528 #define DORCR_DPRS (1 << 0) 529 529
+1 -1
drivers/gpu/drm/rcar-du/rcar_du_vsp.c
··· 73 73 .src.y2 = mode->vdisplay << 16, 74 74 .zpos = 0, 75 75 }, 76 - .format = rcar_du_format_info(DRM_FORMAT_ARGB8888), 76 + .format = rcar_du_format_info(DRM_FORMAT_XRGB8888), 77 77 .source = RCAR_DU_PLANE_VSPD1, 78 78 .colorkey = 0, 79 79 };
+101 -75
drivers/gpu/drm/rcar-du/rcar_lvds.c
··· 269 269 pll->pll_m, pll->pll_n, pll->pll_e, pll->div); 270 270 } 271 271 272 - static void __rcar_lvds_pll_setup_d3_e3(struct rcar_lvds *lvds, 273 - unsigned int freq, bool dot_clock_only) 272 + static void rcar_lvds_pll_setup_d3_e3(struct rcar_lvds *lvds, 273 + unsigned int freq, bool dot_clock_only) 274 274 { 275 275 struct pll_info pll = { .diff = (unsigned long)-1 }; 276 276 u32 lvdpllcr; ··· 305 305 rcar_lvds_write(lvds, LVDDIV, 0); 306 306 } 307 307 308 - static void rcar_lvds_pll_setup_d3_e3(struct rcar_lvds *lvds, unsigned int freq) 309 - { 310 - __rcar_lvds_pll_setup_d3_e3(lvds, freq, false); 311 - } 312 - 313 308 /* ----------------------------------------------------------------------------- 314 - * Clock - D3/E3 only 315 - */ 316 - 317 - int rcar_lvds_pclk_enable(struct drm_bridge *bridge, unsigned long freq) 318 - { 319 - struct rcar_lvds *lvds = bridge_to_rcar_lvds(bridge); 320 - int ret; 321 - 322 - if (WARN_ON(!(lvds->info->quirks & RCAR_LVDS_QUIRK_EXT_PLL))) 323 - return -ENODEV; 324 - 325 - dev_dbg(lvds->dev, "enabling LVDS PLL, freq=%luHz\n", freq); 326 - 327 - ret = pm_runtime_resume_and_get(lvds->dev); 328 - if (ret) 329 - return ret; 330 - 331 - __rcar_lvds_pll_setup_d3_e3(lvds, freq, true); 332 - 333 - return 0; 334 - } 335 - EXPORT_SYMBOL_GPL(rcar_lvds_pclk_enable); 336 - 337 - void rcar_lvds_pclk_disable(struct drm_bridge *bridge) 338 - { 339 - struct rcar_lvds *lvds = bridge_to_rcar_lvds(bridge); 340 - 341 - if (WARN_ON(!(lvds->info->quirks & RCAR_LVDS_QUIRK_EXT_PLL))) 342 - return; 343 - 344 - dev_dbg(lvds->dev, "disabling LVDS PLL\n"); 345 - 346 - rcar_lvds_write(lvds, LVDPLLCR, 0); 347 - 348 - pm_runtime_put_sync(lvds->dev); 349 - } 350 - EXPORT_SYMBOL_GPL(rcar_lvds_pclk_disable); 351 - 352 - /* ----------------------------------------------------------------------------- 353 - * Bridge 309 + * Enable/disable 354 310 */ 355 311 356 312 static enum rcar_lvds_mode rcar_lvds_get_lvds_mode(struct rcar_lvds *lvds, ··· 350 394 return mode; 351 395 } 352 396 353 - static void __rcar_lvds_atomic_enable(struct drm_bridge *bridge, 354 - struct drm_atomic_state *state, 355 - struct drm_crtc *crtc, 356 - struct drm_connector *connector) 397 + static void rcar_lvds_enable(struct drm_bridge *bridge, 398 + struct drm_atomic_state *state, 399 + struct drm_crtc *crtc, 400 + struct drm_connector *connector) 357 401 { 358 402 struct rcar_lvds *lvds = bridge_to_rcar_lvds(bridge); 359 403 u32 lvdhcr; ··· 366 410 367 411 /* Enable the companion LVDS encoder in dual-link mode. */ 368 412 if (lvds->link_type != RCAR_LVDS_SINGLE_LINK && lvds->companion) 369 - __rcar_lvds_atomic_enable(lvds->companion, state, crtc, 370 - connector); 413 + rcar_lvds_enable(lvds->companion, state, crtc, connector); 371 414 372 415 /* 373 416 * Hardcode the channels and control signals routing for now. ··· 420 465 /* 421 466 * PLL clock configuration on all instances but the companion in 422 467 * dual-link mode. 468 + * 469 + * The extended PLL has been turned on by an explicit call to 470 + * rcar_lvds_pclk_enable() from the DU driver. 423 471 */ 424 - if (lvds->link_type == RCAR_LVDS_SINGLE_LINK || lvds->companion) { 472 + if ((lvds->link_type == RCAR_LVDS_SINGLE_LINK || lvds->companion) && 473 + !(lvds->info->quirks & RCAR_LVDS_QUIRK_EXT_PLL)) { 425 474 const struct drm_crtc_state *crtc_state = 426 475 drm_atomic_get_new_crtc_state(state, crtc); 427 476 const struct drm_display_mode *mode = ··· 490 531 rcar_lvds_write(lvds, LVDCR0, lvdcr0); 491 532 } 492 533 493 - static void rcar_lvds_atomic_enable(struct drm_bridge *bridge, 494 - struct drm_bridge_state *old_bridge_state) 495 - { 496 - struct drm_atomic_state *state = old_bridge_state->base.state; 497 - struct drm_connector *connector; 498 - struct drm_crtc *crtc; 499 - 500 - connector = drm_atomic_get_new_connector_for_encoder(state, 501 - bridge->encoder); 502 - crtc = drm_atomic_get_new_connector_state(state, connector)->crtc; 503 - 504 - __rcar_lvds_atomic_enable(bridge, state, crtc, connector); 505 - } 506 - 507 - static void rcar_lvds_atomic_disable(struct drm_bridge *bridge, 508 - struct drm_bridge_state *old_bridge_state) 534 + static void rcar_lvds_disable(struct drm_bridge *bridge) 509 535 { 510 536 struct rcar_lvds *lvds = bridge_to_rcar_lvds(bridge); 511 537 u32 lvdcr0; ··· 522 578 523 579 rcar_lvds_write(lvds, LVDCR0, 0); 524 580 rcar_lvds_write(lvds, LVDCR1, 0); 525 - rcar_lvds_write(lvds, LVDPLLCR, 0); 581 + 582 + /* The extended PLL is turned off in rcar_lvds_pclk_disable(). */ 583 + if (!(lvds->info->quirks & RCAR_LVDS_QUIRK_EXT_PLL)) 584 + rcar_lvds_write(lvds, LVDPLLCR, 0); 526 585 527 586 /* Disable the companion LVDS encoder in dual-link mode. */ 528 587 if (lvds->link_type != RCAR_LVDS_SINGLE_LINK && lvds->companion) 529 - lvds->companion->funcs->atomic_disable(lvds->companion, 530 - old_bridge_state); 588 + rcar_lvds_disable(lvds->companion); 531 589 532 590 pm_runtime_put_sync(lvds->dev); 591 + } 592 + 593 + /* ----------------------------------------------------------------------------- 594 + * Clock - D3/E3 only 595 + */ 596 + 597 + int rcar_lvds_pclk_enable(struct drm_bridge *bridge, unsigned long freq, 598 + bool dot_clk_only) 599 + { 600 + struct rcar_lvds *lvds = bridge_to_rcar_lvds(bridge); 601 + int ret; 602 + 603 + if (WARN_ON(!(lvds->info->quirks & RCAR_LVDS_QUIRK_EXT_PLL))) 604 + return -ENODEV; 605 + 606 + dev_dbg(lvds->dev, "enabling LVDS PLL, freq=%luHz\n", freq); 607 + 608 + ret = pm_runtime_resume_and_get(lvds->dev); 609 + if (ret) 610 + return ret; 611 + 612 + rcar_lvds_pll_setup_d3_e3(lvds, freq, dot_clk_only); 613 + 614 + return 0; 615 + } 616 + EXPORT_SYMBOL_GPL(rcar_lvds_pclk_enable); 617 + 618 + void rcar_lvds_pclk_disable(struct drm_bridge *bridge, bool dot_clk_only) 619 + { 620 + struct rcar_lvds *lvds = bridge_to_rcar_lvds(bridge); 621 + 622 + if (WARN_ON(!(lvds->info->quirks & RCAR_LVDS_QUIRK_EXT_PLL))) 623 + return; 624 + 625 + dev_dbg(lvds->dev, "disabling LVDS PLL\n"); 626 + 627 + if (!dot_clk_only) 628 + rcar_lvds_disable(bridge); 629 + 630 + rcar_lvds_write(lvds, LVDPLLCR, 0); 631 + 632 + pm_runtime_put_sync(lvds->dev); 633 + } 634 + EXPORT_SYMBOL_GPL(rcar_lvds_pclk_disable); 635 + 636 + /* ----------------------------------------------------------------------------- 637 + * Bridge 638 + */ 639 + 640 + static void rcar_lvds_atomic_enable(struct drm_bridge *bridge, 641 + struct drm_bridge_state *old_bridge_state) 642 + { 643 + struct drm_atomic_state *state = old_bridge_state->base.state; 644 + struct drm_connector *connector; 645 + struct drm_crtc *crtc; 646 + 647 + connector = drm_atomic_get_new_connector_for_encoder(state, 648 + bridge->encoder); 649 + crtc = drm_atomic_get_new_connector_state(state, connector)->crtc; 650 + 651 + rcar_lvds_enable(bridge, state, crtc, connector); 652 + } 653 + 654 + static void rcar_lvds_atomic_disable(struct drm_bridge *bridge, 655 + struct drm_bridge_state *old_bridge_state) 656 + { 657 + struct rcar_lvds *lvds = bridge_to_rcar_lvds(bridge); 658 + 659 + /* 660 + * For D3 and E3, disabling the LVDS encoder before the DU would stall 661 + * the DU, causing a vblank wait timeout when stopping the DU. This has 662 + * been traced to clearing the LVEN bit, but the exact reason is 663 + * unknown. Keep the encoder enabled, it will be disabled by an explicit 664 + * call to rcar_lvds_pclk_disable() from the DU driver. 665 + * 666 + * We could clear the LVRES bit already to disable the LVDS output, but 667 + * that's likely pointless. 668 + */ 669 + if (lvds->info->quirks & RCAR_LVDS_QUIRK_EXT_PLL) 670 + return; 671 + 672 + rcar_lvds_disable(bridge); 533 673 } 534 674 535 675 static bool rcar_lvds_mode_fixup(struct drm_bridge *bridge, ··· 950 922 .gen = 3, 951 923 .quirks = RCAR_LVDS_QUIRK_GEN3_LVEN | RCAR_LVDS_QUIRK_EXT_PLL 952 924 | RCAR_LVDS_QUIRK_DUAL_LINK, 953 - .pll_setup = rcar_lvds_pll_setup_d3_e3, 954 925 }; 955 926 956 927 static const struct rcar_lvds_device_info rcar_lvds_r8a77995_info = { 957 928 .gen = 3, 958 929 .quirks = RCAR_LVDS_QUIRK_GEN3_LVEN | RCAR_LVDS_QUIRK_PWD 959 930 | RCAR_LVDS_QUIRK_EXT_PLL | RCAR_LVDS_QUIRK_DUAL_LINK, 960 - .pll_setup = rcar_lvds_pll_setup_d3_e3, 961 931 }; 962 932 963 933 static const struct of_device_id rcar_lvds_of_table[] = {
+8 -4
drivers/gpu/drm/rcar-du/rcar_lvds.h
··· 13 13 struct drm_bridge; 14 14 15 15 #if IS_ENABLED(CONFIG_DRM_RCAR_LVDS) 16 - int rcar_lvds_pclk_enable(struct drm_bridge *bridge, unsigned long freq); 17 - void rcar_lvds_pclk_disable(struct drm_bridge *bridge); 16 + int rcar_lvds_pclk_enable(struct drm_bridge *bridge, unsigned long freq, 17 + bool dot_clk_only); 18 + void rcar_lvds_pclk_disable(struct drm_bridge *bridge, bool dot_clk_only); 18 19 bool rcar_lvds_dual_link(struct drm_bridge *bridge); 19 20 bool rcar_lvds_is_connected(struct drm_bridge *bridge); 20 21 #else 21 22 static inline int rcar_lvds_pclk_enable(struct drm_bridge *bridge, 22 - unsigned long freq) 23 + unsigned long freq, bool dot_clk_only) 23 24 { 24 25 return -ENOSYS; 25 26 } 26 - static inline void rcar_lvds_pclk_disable(struct drm_bridge *bridge) { } 27 + static inline void rcar_lvds_pclk_disable(struct drm_bridge *bridge, 28 + bool dot_clock_only) 29 + { 30 + } 27 31 static inline bool rcar_lvds_dual_link(struct drm_bridge *bridge) 28 32 { 29 33 return false;