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

drm/mediatek: mtk_dpi: Convert to bridge driver

Convert mtk_dpi to a bridge driver with built-in encoder support for
compatibility with existing component drivers.

Signed-off-by: Enric Balletbo i Serra <enric.balletbo@collabora.com>
Signed-off-by: Chun-Kuang Hu <chunkuang.hu@kernel.org>

authored by

Enric Balletbo i Serra and committed by
Chun-Kuang Hu
f89c696e 8b465f01

+42 -29
+42 -29
drivers/gpu/drm/mediatek/mtk_dpi.c
··· 64 64 struct mtk_dpi { 65 65 struct mtk_ddp_comp ddp_comp; 66 66 struct drm_encoder encoder; 67 + struct drm_bridge bridge; 67 68 struct drm_bridge *next_bridge; 68 69 void __iomem *regs; 69 70 struct device *dev; ··· 84 83 int refcount; 85 84 }; 86 85 87 - static inline struct mtk_dpi *mtk_dpi_from_encoder(struct drm_encoder *e) 86 + static inline struct mtk_dpi *bridge_to_dpi(struct drm_bridge *b) 88 87 { 89 - return container_of(e, struct mtk_dpi, encoder); 88 + return container_of(b, struct mtk_dpi, bridge); 90 89 } 91 90 92 91 enum mtk_dpi_polarity { ··· 522 521 return 0; 523 522 } 524 523 525 - static bool mtk_dpi_encoder_mode_fixup(struct drm_encoder *encoder, 526 - const struct drm_display_mode *mode, 527 - struct drm_display_mode *adjusted_mode) 524 + static void mtk_dpi_encoder_destroy(struct drm_encoder *encoder) 528 525 { 529 - return true; 526 + drm_encoder_cleanup(encoder); 530 527 } 531 528 532 - static void mtk_dpi_encoder_mode_set(struct drm_encoder *encoder, 533 - struct drm_display_mode *mode, 534 - struct drm_display_mode *adjusted_mode) 529 + static const struct drm_encoder_funcs mtk_dpi_encoder_funcs = { 530 + .destroy = mtk_dpi_encoder_destroy, 531 + }; 532 + 533 + static int mtk_dpi_bridge_attach(struct drm_bridge *bridge, 534 + enum drm_bridge_attach_flags flags) 535 535 { 536 - struct mtk_dpi *dpi = mtk_dpi_from_encoder(encoder); 536 + struct mtk_dpi *dpi = bridge_to_dpi(bridge); 537 + 538 + return drm_bridge_attach(bridge->encoder, dpi->next_bridge, 539 + &dpi->bridge, flags); 540 + } 541 + 542 + static void mtk_dpi_bridge_mode_set(struct drm_bridge *bridge, 543 + const struct drm_display_mode *mode, 544 + const struct drm_display_mode *adjusted_mode) 545 + { 546 + struct mtk_dpi *dpi = bridge_to_dpi(bridge); 537 547 538 548 drm_mode_copy(&dpi->mode, adjusted_mode); 539 549 } 540 550 541 - static void mtk_dpi_encoder_disable(struct drm_encoder *encoder) 551 + static void mtk_dpi_bridge_disable(struct drm_bridge *bridge) 542 552 { 543 - struct mtk_dpi *dpi = mtk_dpi_from_encoder(encoder); 553 + struct mtk_dpi *dpi = bridge_to_dpi(bridge); 544 554 545 555 mtk_dpi_power_off(dpi); 546 556 } 547 557 548 - static void mtk_dpi_encoder_enable(struct drm_encoder *encoder) 558 + static void mtk_dpi_bridge_enable(struct drm_bridge *bridge) 549 559 { 550 - struct mtk_dpi *dpi = mtk_dpi_from_encoder(encoder); 560 + struct mtk_dpi *dpi = bridge_to_dpi(bridge); 551 561 552 562 mtk_dpi_power_on(dpi); 553 563 mtk_dpi_set_display_mode(dpi, &dpi->mode); 554 564 } 555 565 556 - static int mtk_dpi_atomic_check(struct drm_encoder *encoder, 557 - struct drm_crtc_state *crtc_state, 558 - struct drm_connector_state *conn_state) 559 - { 560 - return 0; 561 - } 562 - 563 - static const struct drm_encoder_helper_funcs mtk_dpi_encoder_helper_funcs = { 564 - .mode_fixup = mtk_dpi_encoder_mode_fixup, 565 - .mode_set = mtk_dpi_encoder_mode_set, 566 - .disable = mtk_dpi_encoder_disable, 567 - .enable = mtk_dpi_encoder_enable, 568 - .atomic_check = mtk_dpi_atomic_check, 566 + static const struct drm_bridge_funcs mtk_dpi_bridge_funcs = { 567 + .attach = mtk_dpi_bridge_attach, 568 + .mode_set = mtk_dpi_bridge_mode_set, 569 + .disable = mtk_dpi_bridge_disable, 570 + .enable = mtk_dpi_bridge_enable, 569 571 }; 570 572 571 573 static void mtk_dpi_start(struct mtk_ddp_comp *comp) ··· 609 605 dev_err(dev, "Failed to initialize decoder: %d\n", ret); 610 606 goto err_unregister; 611 607 } 612 - drm_encoder_helper_add(&dpi->encoder, &mtk_dpi_encoder_helper_funcs); 613 608 614 609 dpi->encoder.possible_crtcs = mtk_drm_find_possible_crtc_by_comp(drm_dev, dpi->ddp_comp); 615 610 616 - ret = drm_bridge_attach(&dpi->encoder, dpi->next_bridge, NULL, 0); 611 + ret = drm_bridge_attach(&dpi->encoder, &dpi->bridge, NULL, 0); 617 612 if (ret) { 618 613 dev_err(dev, "Failed to attach bridge: %d\n", ret); 619 614 goto err_cleanup; ··· 793 790 794 791 platform_set_drvdata(pdev, dpi); 795 792 793 + dpi->bridge.funcs = &mtk_dpi_bridge_funcs; 794 + dpi->bridge.of_node = dev->of_node; 795 + dpi->bridge.type = DRM_MODE_CONNECTOR_DPI; 796 + 797 + drm_bridge_add(&dpi->bridge); 798 + 796 799 ret = component_add(dev, &mtk_dpi_component_ops); 797 800 if (ret) { 801 + drm_bridge_remove(&dpi->bridge); 798 802 dev_err(dev, "Failed to add component: %d\n", ret); 799 803 return ret; 800 804 } ··· 811 801 812 802 static int mtk_dpi_remove(struct platform_device *pdev) 813 803 { 804 + struct mtk_dpi *dpi = platform_get_drvdata(pdev); 805 + 814 806 component_del(&pdev->dev, &mtk_dpi_component_ops); 807 + drm_bridge_remove(&dpi->bridge); 815 808 816 809 return 0; 817 810 }