mirror of
https://github.com/openwrt/openwrt.git
synced 2024-12-25 16:31:13 +00:00
119 lines
3.6 KiB
Diff
119 lines
3.6 KiB
Diff
|
From bd58cbe5c5155279ccd85c29ddef53094cf6dc81 Mon Sep 17 00:00:00 2001
|
||
|
From: Dave Stevenson <dave.stevenson@raspberrypi.com>
|
||
|
Date: Wed, 15 Dec 2021 17:44:49 +0000
|
||
|
Subject: [PATCH] drm/vc4: Remove splitting the bridge chain from the
|
||
|
driver.
|
||
|
|
||
|
Splitting the bridge chain fails for atomic bridges as the
|
||
|
framework can't add the relevant state in
|
||
|
drm_atomic_add_encoder_bridges.
|
||
|
The chain was split because we needed to power up before
|
||
|
calling pre_enable, but that is now done in mode_set, and will
|
||
|
move into the framework.
|
||
|
|
||
|
Signed-off-by: Dave Stevenson <dave.stevenson@raspberrypi.com>
|
||
|
---
|
||
|
drivers/gpu/drm/vc4/vc4_dsi.c | 47 -----------------------------------
|
||
|
1 file changed, 47 deletions(-)
|
||
|
|
||
|
--- a/drivers/gpu/drm/vc4/vc4_dsi.c
|
||
|
+++ b/drivers/gpu/drm/vc4/vc4_dsi.c
|
||
|
@@ -557,7 +557,6 @@ struct vc4_dsi {
|
||
|
struct platform_device *pdev;
|
||
|
|
||
|
struct drm_bridge *out_bridge;
|
||
|
- struct list_head bridge_chain;
|
||
|
|
||
|
void __iomem *regs;
|
||
|
|
||
|
@@ -794,23 +793,9 @@ static void vc4_dsi_encoder_disable(stru
|
||
|
{
|
||
|
struct vc4_dsi *dsi = to_vc4_dsi(encoder);
|
||
|
struct device *dev = &dsi->pdev->dev;
|
||
|
- struct drm_bridge *iter;
|
||
|
-
|
||
|
- list_for_each_entry_reverse(iter, &dsi->bridge_chain, chain_node) {
|
||
|
- if (iter->funcs->disable)
|
||
|
- iter->funcs->disable(iter);
|
||
|
-
|
||
|
- if (iter == dsi->out_bridge)
|
||
|
- break;
|
||
|
- }
|
||
|
|
||
|
vc4_dsi_ulps(dsi, true);
|
||
|
|
||
|
- list_for_each_entry_from(iter, &dsi->bridge_chain, chain_node) {
|
||
|
- if (iter->funcs->post_disable)
|
||
|
- iter->funcs->post_disable(iter);
|
||
|
- }
|
||
|
-
|
||
|
clk_disable_unprepare(dsi->pll_phy_clock);
|
||
|
clk_disable_unprepare(dsi->escape_clock);
|
||
|
clk_disable_unprepare(dsi->pixel_clock);
|
||
|
@@ -1112,12 +1097,6 @@ static void vc4_dsi_encoder_enable(struc
|
||
|
struct vc4_dsi_encoder *vc4_encoder = to_vc4_dsi_encoder(encoder);
|
||
|
struct vc4_dsi *dsi = vc4_encoder->dsi;
|
||
|
bool debug_dump_regs = false;
|
||
|
- struct drm_bridge *iter;
|
||
|
-
|
||
|
- list_for_each_entry_reverse(iter, &dsi->bridge_chain, chain_node) {
|
||
|
- if (iter->funcs->pre_enable)
|
||
|
- iter->funcs->pre_enable(iter);
|
||
|
- }
|
||
|
|
||
|
if (dsi->mode_flags & MIPI_DSI_MODE_VIDEO) {
|
||
|
DSI_PORT_WRITE(DISP0_CTRL,
|
||
|
@@ -1134,11 +1113,6 @@ static void vc4_dsi_encoder_enable(struc
|
||
|
DSI_DISP0_ENABLE);
|
||
|
}
|
||
|
|
||
|
- list_for_each_entry(iter, &dsi->bridge_chain, chain_node) {
|
||
|
- if (iter->funcs->enable)
|
||
|
- iter->funcs->enable(iter);
|
||
|
- }
|
||
|
-
|
||
|
if (debug_dump_regs) {
|
||
|
struct drm_printer p = drm_info_printer(&dsi->pdev->dev);
|
||
|
dev_info(&dsi->pdev->dev, "DSI regs after:\n");
|
||
|
@@ -1626,7 +1600,6 @@ static int vc4_dsi_bind(struct device *d
|
||
|
|
||
|
dsi->variant = of_device_get_match_data(dev);
|
||
|
|
||
|
- INIT_LIST_HEAD(&dsi->bridge_chain);
|
||
|
dsi->encoder.type = dsi->variant->port ?
|
||
|
VC4_ENCODER_TYPE_DSI1 : VC4_ENCODER_TYPE_DSI0;
|
||
|
|
||
|
@@ -1763,32 +1736,12 @@ static int vc4_dsi_bind(struct device *d
|
||
|
ret = drm_bridge_attach(encoder, dsi->out_bridge, NULL, 0);
|
||
|
if (ret)
|
||
|
return ret;
|
||
|
- /* Disable the atomic helper calls into the bridge. We
|
||
|
- * manually call the bridge pre_enable / enable / etc. calls
|
||
|
- * from our driver, since we need to sequence them within the
|
||
|
- * encoder's enable/disable paths.
|
||
|
- */
|
||
|
- list_splice_init(&encoder->bridge_chain, &dsi->bridge_chain);
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
-static void vc4_dsi_unbind(struct device *dev, struct device *master,
|
||
|
- void *data)
|
||
|
-{
|
||
|
- struct vc4_dsi *dsi = dev_get_drvdata(dev);
|
||
|
- struct drm_encoder *encoder = &dsi->encoder.base;
|
||
|
-
|
||
|
- /*
|
||
|
- * Restore the bridge_chain so the bridge detach procedure can happen
|
||
|
- * normally.
|
||
|
- */
|
||
|
- list_splice_init(&dsi->bridge_chain, &encoder->bridge_chain);
|
||
|
-}
|
||
|
-
|
||
|
static const struct component_ops vc4_dsi_ops = {
|
||
|
.bind = vc4_dsi_bind,
|
||
|
- .unbind = vc4_dsi_unbind,
|
||
|
};
|
||
|
|
||
|
static int vc4_dsi_dev_probe(struct platform_device *pdev)
|