* [PATCH v4 0/5] Cleanup DRM bridge attach/detach
@ 2016-12-14 9:59 Laurent Pinchart
2016-12-14 9:59 ` [PATCH v4 1/5] drm: Don't include <drm/drm_encoder.h> in <drm/drm_crtc.h> Laurent Pinchart
` (5 more replies)
0 siblings, 6 replies; 17+ messages in thread
From: Laurent Pinchart @ 2016-12-14 9:59 UTC (permalink / raw)
To: dri-devel
Hello,
This patch series is a respin of the DRM bridge attach/detach cleanup patches
that were previously part of "[PATCH v3 00/13] R-Car DU: Use drm bridge API".
As patches 1/5 and 3/5 touch a large number of drivers and are thus painful to
rebase, I'd like to get them merged soon without waiting for the whole R-Car
DU series to be ready.
Laurent Pinchart (5):
drm: Don't include <drm/drm_encoder.h> in <drm/drm_crtc.h>
drm: Fix compilation warning caused by static inline forward
declaration
drm: bridge: Link encoder and bridge in core code
drm: bridge: Detach bridge from encoder at encoder cleanup time
drm: bridge: Detach all bridges in a chain at encoder cleanup time
drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h | 1 +
drivers/gpu/drm/arc/arcpgu_hdmi.c | 5 +-
drivers/gpu/drm/ast/ast_drv.h | 1 +
drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_output.c | 4 +-
drivers/gpu/drm/bochs/bochs.h | 1 +
drivers/gpu/drm/bridge/analogix/analogix_dp_core.c | 4 +-
drivers/gpu/drm/bridge/dw-hdmi.c | 3 +-
drivers/gpu/drm/cirrus/cirrus_drv.h | 1 +
drivers/gpu/drm/drm_bridge.c | 59 +++++++++++++---------
drivers/gpu/drm/drm_connector.c | 1 +
drivers/gpu/drm/drm_crtc_helper.c | 1 +
drivers/gpu/drm/drm_crtc_internal.h | 3 ++
drivers/gpu/drm/drm_edid.c | 1 +
drivers/gpu/drm/drm_encoder.c | 11 ++++
drivers/gpu/drm/drm_mode_config.c | 1 +
drivers/gpu/drm/drm_of.c | 1 +
drivers/gpu/drm/drm_plane_helper.c | 1 +
drivers/gpu/drm/drm_simple_kms_helper.c | 21 +-------
drivers/gpu/drm/exynos/exynos_dp.c | 5 +-
drivers/gpu/drm/exynos/exynos_drm_dsi.c | 6 +--
drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_drv.h | 2 +
drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_rgb.c | 5 +-
drivers/gpu/drm/gma500/psb_intel_drv.h | 1 +
drivers/gpu/drm/hisilicon/kirin/dw_drm_dsi.c | 5 +-
drivers/gpu/drm/i915/intel_drv.h | 1 +
drivers/gpu/drm/imx/imx-ldb.c | 8 +--
drivers/gpu/drm/imx/parallel-display.c | 6 +--
drivers/gpu/drm/mediatek/mtk_dpi.c | 8 +--
drivers/gpu/drm/mediatek/mtk_dsi.c | 24 ++-------
drivers/gpu/drm/mediatek/mtk_hdmi.c | 11 ++--
drivers/gpu/drm/mgag200/mgag200_drv.h | 1 +
drivers/gpu/drm/msm/dsi/dsi_manager.c | 17 ++++---
drivers/gpu/drm/msm/edp/edp_bridge.c | 2 +-
drivers/gpu/drm/msm/hdmi/hdmi_bridge.c | 2 +-
drivers/gpu/drm/nouveau/nouveau_connector.h | 1 +
drivers/gpu/drm/qxl/qxl_drv.h | 1 +
drivers/gpu/drm/radeon/radeon_mode.h | 1 +
drivers/gpu/drm/rcar-du/rcar_du_encoder.h | 1 +
drivers/gpu/drm/rcar-du/rcar_du_hdmienc.c | 5 +-
drivers/gpu/drm/shmobile/shmob_drm_crtc.h | 1 +
drivers/gpu/drm/sti/sti_dvo.c | 3 +-
drivers/gpu/drm/sti/sti_hda.c | 3 +-
drivers/gpu/drm/sti/sti_hdmi.c | 3 +-
drivers/gpu/drm/sun4i/sun4i_rgb.c | 13 ++---
drivers/gpu/drm/tegra/drm.h | 1 +
drivers/gpu/drm/tilcdc/tilcdc_external.c | 4 +-
drivers/gpu/drm/vc4/vc4_drv.h | 2 +
drivers/gpu/drm/virtio/virtgpu_drv.h | 1 +
drivers/gpu/drm/vmwgfx/vmwgfx_kms.h | 1 +
include/drm/drm_bridge.h | 4 +-
include/drm/drm_crtc.h | 3 --
include/drm/drm_encoder.h | 7 +--
include/drm/drm_encoder_slave.h | 1 +
include/drm/drm_modeset_helper_vtables.h | 1 +
include/drm/drm_simple_kms_helper.h | 2 -
55 files changed, 132 insertions(+), 151 deletions(-)
--
Regards,
Laurent Pinchart
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply [flat|nested] 17+ messages in thread
* [PATCH v4 1/5] drm: Don't include <drm/drm_encoder.h> in <drm/drm_crtc.h>
2016-12-14 9:59 [PATCH v4 0/5] Cleanup DRM bridge attach/detach Laurent Pinchart
@ 2016-12-14 9:59 ` Laurent Pinchart
2016-12-14 16:46 ` Alex Deucher
2016-12-14 9:59 ` [PATCH v4 2/5] drm: Fix compilation warning caused by static inline forward declaration Laurent Pinchart
` (4 subsequent siblings)
5 siblings, 1 reply; 17+ messages in thread
From: Laurent Pinchart @ 2016-12-14 9:59 UTC (permalink / raw)
To: dri-devel
Cc: Alison Wang, Gerd Hoffmann, Alex Deucher, Dave Airlie,
Christian König, Ben Skeggs
<drm/drm_crtc.h> used to define most of the in-kernel KMS API. It has
now been split into separate files for each object type, but still
includes most other KMS headers to avoid breaking driver compilation.
As a step towards fixing that problem, remove the inclusion of
<drm/drm_encoder.h> from <drm/drm_crtc.h> and include it instead where
appropriate. Also remove the forward declarations of the drm_encoder and
drm_encoder_helper_funcs structures from <drm/drm_crtc.h> as they're not
needed in the header.
<drm/drm_encoder.h> now has to include <drm/drm_mode.h> and contain a
forward declaration of struct drm_encoder in order to allow including it
as the first header in a compilation unit.
Signed-off-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Reviewed-by: Sinclair Yeh <syeh@vmware.com> # For vmwgfx
---
drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h | 1 +
drivers/gpu/drm/ast/ast_drv.h | 1 +
drivers/gpu/drm/bochs/bochs.h | 1 +
drivers/gpu/drm/cirrus/cirrus_drv.h | 1 +
drivers/gpu/drm/drm_connector.c | 1 +
drivers/gpu/drm/drm_crtc_helper.c | 1 +
drivers/gpu/drm/drm_edid.c | 1 +
drivers/gpu/drm/drm_mode_config.c | 1 +
drivers/gpu/drm/drm_of.c | 1 +
drivers/gpu/drm/drm_plane_helper.c | 1 +
drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_drv.h | 2 ++
drivers/gpu/drm/gma500/psb_intel_drv.h | 1 +
drivers/gpu/drm/i915/intel_drv.h | 1 +
drivers/gpu/drm/mgag200/mgag200_drv.h | 1 +
drivers/gpu/drm/nouveau/nouveau_connector.h | 1 +
drivers/gpu/drm/qxl/qxl_drv.h | 1 +
drivers/gpu/drm/radeon/radeon_mode.h | 1 +
drivers/gpu/drm/rcar-du/rcar_du_encoder.h | 1 +
drivers/gpu/drm/shmobile/shmob_drm_crtc.h | 1 +
drivers/gpu/drm/tegra/drm.h | 1 +
drivers/gpu/drm/vc4/vc4_drv.h | 2 ++
drivers/gpu/drm/virtio/virtgpu_drv.h | 1 +
drivers/gpu/drm/vmwgfx/vmwgfx_kms.h | 1 +
include/drm/drm_crtc.h | 3 ---
include/drm/drm_encoder.h | 3 +++
include/drm/drm_encoder_slave.h | 1 +
include/drm/drm_modeset_helper_vtables.h | 1 +
27 files changed, 30 insertions(+), 3 deletions(-)
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h
index 202b4176b74e..b60346792bf8 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h
@@ -32,6 +32,7 @@
#include <drm/drm_crtc.h>
#include <drm/drm_edid.h>
+#include <drm/drm_encoder.h>
#include <drm/drm_dp_helper.h>
#include <drm/drm_fixed.h>
#include <drm/drm_crtc_helper.h>
diff --git a/drivers/gpu/drm/ast/ast_drv.h b/drivers/gpu/drm/ast/ast_drv.h
index 908011d2c8f5..6f3b6f50cf52 100644
--- a/drivers/gpu/drm/ast/ast_drv.h
+++ b/drivers/gpu/drm/ast/ast_drv.h
@@ -28,6 +28,7 @@
#ifndef __AST_DRV_H__
#define __AST_DRV_H__
+#include <drm/drm_encoder.h>
#include <drm/drm_fb_helper.h>
#include <drm/ttm/ttm_bo_api.h>
diff --git a/drivers/gpu/drm/bochs/bochs.h b/drivers/gpu/drm/bochs/bochs.h
index 32dfe418cc98..f626bab7f5e3 100644
--- a/drivers/gpu/drm/bochs/bochs.h
+++ b/drivers/gpu/drm/bochs/bochs.h
@@ -4,6 +4,7 @@
#include <drm/drmP.h>
#include <drm/drm_crtc.h>
#include <drm/drm_crtc_helper.h>
+#include <drm/drm_encoder.h>
#include <drm/drm_fb_helper.h>
#include <drm/drm_gem.h>
diff --git a/drivers/gpu/drm/cirrus/cirrus_drv.h b/drivers/gpu/drm/cirrus/cirrus_drv.h
index 2188d6b61b3e..b59aeef4635a 100644
--- a/drivers/gpu/drm/cirrus/cirrus_drv.h
+++ b/drivers/gpu/drm/cirrus/cirrus_drv.h
@@ -13,6 +13,7 @@
#include <video/vga.h>
+#include <drm/drm_encoder.h>
#include <drm/drm_fb_helper.h>
#include <drm/ttm/ttm_bo_api.h>
diff --git a/drivers/gpu/drm/drm_connector.c b/drivers/gpu/drm/drm_connector.c
index 5a4526289392..40f8126a9738 100644
--- a/drivers/gpu/drm/drm_connector.c
+++ b/drivers/gpu/drm/drm_connector.c
@@ -23,6 +23,7 @@
#include <drm/drmP.h>
#include <drm/drm_connector.h>
#include <drm/drm_edid.h>
+#include <drm/drm_encoder.h>
#include "drm_crtc_internal.h"
#include "drm_internal.h"
diff --git a/drivers/gpu/drm/drm_crtc_helper.c b/drivers/gpu/drm/drm_crtc_helper.c
index 5d2cb138eba6..b3fc23313cc3 100644
--- a/drivers/gpu/drm/drm_crtc_helper.c
+++ b/drivers/gpu/drm/drm_crtc_helper.c
@@ -36,6 +36,7 @@
#include <drm/drmP.h>
#include <drm/drm_atomic.h>
#include <drm/drm_crtc.h>
+#include <drm/drm_encoder.h>
#include <drm/drm_fourcc.h>
#include <drm/drm_crtc_helper.h>
#include <drm/drm_fb_helper.h>
diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
index 336be31ff3de..67d6a73731d8 100644
--- a/drivers/gpu/drm/drm_edid.c
+++ b/drivers/gpu/drm/drm_edid.c
@@ -35,6 +35,7 @@
#include <linux/vga_switcheroo.h>
#include <drm/drmP.h>
#include <drm/drm_edid.h>
+#include <drm/drm_encoder.h>
#include <drm/drm_displayid.h>
#define version_greater(edid, maj, min) \
diff --git a/drivers/gpu/drm/drm_mode_config.c b/drivers/gpu/drm/drm_mode_config.c
index 2735a5847ffa..09b1d8f267a6 100644
--- a/drivers/gpu/drm/drm_mode_config.c
+++ b/drivers/gpu/drm/drm_mode_config.c
@@ -20,6 +20,7 @@
* OF THIS SOFTWARE.
*/
+#include <drm/drm_encoder.h>
#include <drm/drm_mode_config.h>
#include <drm/drmP.h>
diff --git a/drivers/gpu/drm/drm_of.c b/drivers/gpu/drm/drm_of.c
index 47848ed8ca48..b5f2f0fece99 100644
--- a/drivers/gpu/drm/drm_of.c
+++ b/drivers/gpu/drm/drm_of.c
@@ -4,6 +4,7 @@
#include <linux/of_graph.h>
#include <drm/drmP.h>
#include <drm/drm_crtc.h>
+#include <drm/drm_encoder.h>
#include <drm/drm_of.h>
static void drm_release_of(struct device *dev, void *data)
diff --git a/drivers/gpu/drm/drm_plane_helper.c b/drivers/gpu/drm/drm_plane_helper.c
index 7a7dddf604d7..191a5f095cf9 100644
--- a/drivers/gpu/drm/drm_plane_helper.c
+++ b/drivers/gpu/drm/drm_plane_helper.c
@@ -29,6 +29,7 @@
#include <drm/drm_rect.h>
#include <drm/drm_atomic.h>
#include <drm/drm_crtc_helper.h>
+#include <drm/drm_encoder.h>
#include <drm/drm_atomic_helper.h>
#define SUBPIXEL_MASK 0xffff
diff --git a/drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_drv.h b/drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_drv.h
index e9e9aeecf2eb..da9bfd432ca6 100644
--- a/drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_drv.h
+++ b/drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_drv.h
@@ -12,6 +12,8 @@
#ifndef __FSL_DCU_DRM_DRV_H__
#define __FSL_DCU_DRM_DRV_H__
+#include <drm/drm_encoder.h>
+
#include "fsl_dcu_drm_crtc.h"
#include "fsl_dcu_drm_output.h"
#include "fsl_dcu_drm_plane.h"
diff --git a/drivers/gpu/drm/gma500/psb_intel_drv.h b/drivers/gpu/drm/gma500/psb_intel_drv.h
index 2a3b7c684db2..6a10215fc42d 100644
--- a/drivers/gpu/drm/gma500/psb_intel_drv.h
+++ b/drivers/gpu/drm/gma500/psb_intel_drv.h
@@ -23,6 +23,7 @@
#include <linux/i2c-algo-bit.h>
#include <drm/drm_crtc.h>
#include <drm/drm_crtc_helper.h>
+#include <drm/drm_encoder.h>
#include <linux/gpio.h>
#include "gma_display.h"
diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h
index cd132c216a67..79dce55d4622 100644
--- a/drivers/gpu/drm/i915/intel_drv.h
+++ b/drivers/gpu/drm/i915/intel_drv.h
@@ -32,6 +32,7 @@
#include "i915_drv.h"
#include <drm/drm_crtc.h>
#include <drm/drm_crtc_helper.h>
+#include <drm/drm_encoder.h>
#include <drm/drm_fb_helper.h>
#include <drm/drm_dp_dual_mode_helper.h>
#include <drm/drm_dp_mst_helper.h>
diff --git a/drivers/gpu/drm/mgag200/mgag200_drv.h b/drivers/gpu/drm/mgag200/mgag200_drv.h
index 3e02ac20777c..87e0934773de 100644
--- a/drivers/gpu/drm/mgag200/mgag200_drv.h
+++ b/drivers/gpu/drm/mgag200/mgag200_drv.h
@@ -15,6 +15,7 @@
#include <video/vga.h>
+#include <drm/drm_encoder.h>
#include <drm/drm_fb_helper.h>
#include <drm/ttm/ttm_bo_api.h>
#include <drm/ttm/ttm_bo_driver.h>
diff --git a/drivers/gpu/drm/nouveau/nouveau_connector.h b/drivers/gpu/drm/nouveau/nouveau_connector.h
index 096983c42a1f..a4d1a059bd3d 100644
--- a/drivers/gpu/drm/nouveau/nouveau_connector.h
+++ b/drivers/gpu/drm/nouveau/nouveau_connector.h
@@ -30,6 +30,7 @@
#include <nvif/notify.h>
#include <drm/drm_edid.h>
+#include <drm/drm_encoder.h>
#include <drm/drm_dp_helper.h>
#include "nouveau_crtc.h"
diff --git a/drivers/gpu/drm/qxl/qxl_drv.h b/drivers/gpu/drm/qxl/qxl_drv.h
index 785aad42e9bb..f15ddd0eb85b 100644
--- a/drivers/gpu/drm/qxl/qxl_drv.h
+++ b/drivers/gpu/drm/qxl/qxl_drv.h
@@ -43,6 +43,7 @@
#include <ttm/ttm_placement.h>
#include <ttm/ttm_module.h>
+#include <drm/drm_encoder.h>
#include <drm/drm_gem.h>
/* just for ttm_validate_buffer */
diff --git a/drivers/gpu/drm/radeon/radeon_mode.h b/drivers/gpu/drm/radeon/radeon_mode.h
index f1da484864a9..ad282648fc8b 100644
--- a/drivers/gpu/drm/radeon/radeon_mode.h
+++ b/drivers/gpu/drm/radeon/radeon_mode.h
@@ -32,6 +32,7 @@
#include <drm/drm_crtc.h>
#include <drm/drm_edid.h>
+#include <drm/drm_encoder.h>
#include <drm/drm_dp_helper.h>
#include <drm/drm_dp_mst_helper.h>
#include <drm/drm_fixed.h>
diff --git a/drivers/gpu/drm/rcar-du/rcar_du_encoder.h b/drivers/gpu/drm/rcar-du/rcar_du_encoder.h
index 269fbab15907..b79b2f075a74 100644
--- a/drivers/gpu/drm/rcar-du/rcar_du_encoder.h
+++ b/drivers/gpu/drm/rcar-du/rcar_du_encoder.h
@@ -15,6 +15,7 @@
#define __RCAR_DU_ENCODER_H__
#include <drm/drm_crtc.h>
+#include <drm/drm_encoder.h>
struct drm_panel;
struct rcar_du_device;
diff --git a/drivers/gpu/drm/shmobile/shmob_drm_crtc.h b/drivers/gpu/drm/shmobile/shmob_drm_crtc.h
index 38ed4ff8aaf2..818b31549ddc 100644
--- a/drivers/gpu/drm/shmobile/shmob_drm_crtc.h
+++ b/drivers/gpu/drm/shmobile/shmob_drm_crtc.h
@@ -16,6 +16,7 @@
#include <drm/drmP.h>
#include <drm/drm_crtc.h>
+#include <drm/drm_encoder.h>
struct backlight_device;
struct shmob_drm_device;
diff --git a/drivers/gpu/drm/tegra/drm.h b/drivers/gpu/drm/tegra/drm.h
index 0ddcce1b420d..5205790dd679 100644
--- a/drivers/gpu/drm/tegra/drm.h
+++ b/drivers/gpu/drm/tegra/drm.h
@@ -17,6 +17,7 @@
#include <drm/drmP.h>
#include <drm/drm_crtc_helper.h>
#include <drm/drm_edid.h>
+#include <drm/drm_encoder.h>
#include <drm/drm_fb_helper.h>
#include <drm/drm_fixed.h>
diff --git a/drivers/gpu/drm/vc4/vc4_drv.h b/drivers/gpu/drm/vc4/vc4_drv.h
index b5c4bb14d0d1..489956efbff8 100644
--- a/drivers/gpu/drm/vc4/vc4_drv.h
+++ b/drivers/gpu/drm/vc4/vc4_drv.h
@@ -9,6 +9,8 @@
#include "drmP.h"
#include "drm_gem_cma_helper.h"
+#include <drm/drm_encoder.h>
+
struct vc4_dev {
struct drm_device *dev;
diff --git a/drivers/gpu/drm/virtio/virtgpu_drv.h b/drivers/gpu/drm/virtio/virtgpu_drv.h
index 08906c8ce3fa..025f2e3d483f 100644
--- a/drivers/gpu/drm/virtio/virtgpu_drv.h
+++ b/drivers/gpu/drm/virtio/virtgpu_drv.h
@@ -35,6 +35,7 @@
#include <drm/drm_gem.h>
#include <drm/drm_atomic.h>
#include <drm/drm_crtc_helper.h>
+#include <drm/drm_encoder.h>
#include <ttm/ttm_bo_api.h>
#include <ttm/ttm_bo_driver.h>
#include <ttm/ttm_placement.h>
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_kms.h b/drivers/gpu/drm/vmwgfx/vmwgfx_kms.h
index f42ce9a1c3ac..cb36e1d70133 100644
--- a/drivers/gpu/drm/vmwgfx/vmwgfx_kms.h
+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_kms.h
@@ -30,6 +30,7 @@
#include <drm/drmP.h>
#include <drm/drm_crtc_helper.h>
+#include <drm/drm_encoder.h>
#include "vmwgfx_drv.h"
/**
diff --git a/include/drm/drm_crtc.h b/include/drm/drm_crtc.h
index 946672f97e1e..9ef0ac0ce69f 100644
--- a/include/drm/drm_crtc.h
+++ b/include/drm/drm_crtc.h
@@ -39,7 +39,6 @@
#include <drm/drm_framebuffer.h>
#include <drm/drm_modes.h>
#include <drm/drm_connector.h>
-#include <drm/drm_encoder.h>
#include <drm/drm_property.h>
#include <drm/drm_bridge.h>
#include <drm/drm_edid.h>
@@ -68,14 +67,12 @@ static inline uint64_t I642U64(int64_t val)
}
struct drm_crtc;
-struct drm_encoder;
struct drm_pending_vblank_event;
struct drm_plane;
struct drm_bridge;
struct drm_atomic_state;
struct drm_crtc_helper_funcs;
-struct drm_encoder_helper_funcs;
struct drm_plane_helper_funcs;
/**
diff --git a/include/drm/drm_encoder.h b/include/drm/drm_encoder.h
index c7438ff0d609..cec6ac45c6cc 100644
--- a/include/drm/drm_encoder.h
+++ b/include/drm/drm_encoder.h
@@ -25,8 +25,11 @@
#include <linux/list.h>
#include <linux/ctype.h>
+#include <drm/drm_mode.h>
#include <drm/drm_mode_object.h>
+struct drm_encoder;
+
/**
* struct drm_encoder_funcs - encoder controls
*
diff --git a/include/drm/drm_encoder_slave.h b/include/drm/drm_encoder_slave.h
index 82cdf611393d..1107b4b1c599 100644
--- a/include/drm/drm_encoder_slave.h
+++ b/include/drm/drm_encoder_slave.h
@@ -29,6 +29,7 @@
#include <drm/drmP.h>
#include <drm/drm_crtc.h>
+#include <drm/drm_encoder.h>
/**
* struct drm_encoder_slave_funcs - Entry points exposed by a slave encoder driver
diff --git a/include/drm/drm_modeset_helper_vtables.h b/include/drm/drm_modeset_helper_vtables.h
index 69c3974bf133..625c7475c5df 100644
--- a/include/drm/drm_modeset_helper_vtables.h
+++ b/include/drm/drm_modeset_helper_vtables.h
@@ -30,6 +30,7 @@
#define __DRM_MODESET_HELPER_VTABLES_H__
#include <drm/drm_crtc.h>
+#include <drm/drm_encoder.h>
/**
* DOC: overview
--
Regards,
Laurent Pinchart
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [PATCH v4 2/5] drm: Fix compilation warning caused by static inline forward declaration
2016-12-14 9:59 [PATCH v4 0/5] Cleanup DRM bridge attach/detach Laurent Pinchart
2016-12-14 9:59 ` [PATCH v4 1/5] drm: Don't include <drm/drm_encoder.h> in <drm/drm_crtc.h> Laurent Pinchart
@ 2016-12-14 9:59 ` Laurent Pinchart
2016-12-14 9:59 ` [PATCH v4 3/5] drm: bridge: Link encoder and bridge in core code Laurent Pinchart
` (3 subsequent siblings)
5 siblings, 0 replies; 17+ messages in thread
From: Laurent Pinchart @ 2016-12-14 9:59 UTC (permalink / raw)
To: dri-devel
The drm_crtc_mask() function used in <drm/drm_encoder.h> is a static
inline defined in <drm/drm_crtc.h>. If the first header is included in a
compilation unit without the second one, the following compilation
warning will be issued.
In file included from <linux>/drivers/gpu/drm/drm_bridge.c:29:0:
<linux>/include/drm/drm_encoder.h:192:95: warning: ‘drm_crtc_mask’ used but never defined
static inline uint32_t drm_crtc_mask(const struct drm_crtc *crtc);
Fix this by including the header defining the function instead of using
a forward declaration.
Signed-off-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch>
---
include/drm/drm_encoder.h | 4 +---
1 file changed, 1 insertion(+), 3 deletions(-)
diff --git a/include/drm/drm_encoder.h b/include/drm/drm_encoder.h
index cec6ac45c6cc..5f58f65344e0 100644
--- a/include/drm/drm_encoder.h
+++ b/include/drm/drm_encoder.h
@@ -25,6 +25,7 @@
#include <linux/list.h>
#include <linux/ctype.h>
+#include <drm/drm_crtc.h>
#include <drm/drm_mode.h>
#include <drm/drm_mode_object.h>
@@ -191,9 +192,6 @@ static inline unsigned int drm_encoder_index(struct drm_encoder *encoder)
return encoder->index;
}
-/* FIXME: We have an include file mess still, drm_crtc.h needs untangling. */
-static inline uint32_t drm_crtc_mask(const struct drm_crtc *crtc);
-
/**
* drm_encoder_crtc_ok - can a given crtc drive a given encoder?
* @encoder: encoder to test
--
Regards,
Laurent Pinchart
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [PATCH v4 3/5] drm: bridge: Link encoder and bridge in core code
2016-12-14 9:59 [PATCH v4 0/5] Cleanup DRM bridge attach/detach Laurent Pinchart
2016-12-14 9:59 ` [PATCH v4 1/5] drm: Don't include <drm/drm_encoder.h> in <drm/drm_crtc.h> Laurent Pinchart
2016-12-14 9:59 ` [PATCH v4 2/5] drm: Fix compilation warning caused by static inline forward declaration Laurent Pinchart
@ 2016-12-14 9:59 ` Laurent Pinchart
2016-12-14 10:30 ` Maxime Ripard
` (3 more replies)
2016-12-14 9:59 ` [PATCH v4 4/5] drm: bridge: Detach bridge from encoder at encoder cleanup time Laurent Pinchart
` (2 subsequent siblings)
5 siblings, 4 replies; 17+ messages in thread
From: Laurent Pinchart @ 2016-12-14 9:59 UTC (permalink / raw)
To: dri-devel
Cc: Xinliang Liu, Alexey Brodkin, Seung-Woo Kim, Xinwei Kong,
Jyri Sarha, Kyungmin Park, Tomi Valkeinen, Chen Feng,
Rongrong Zou, Maxime Ripard, Chen-Yu Tsai
Instead of linking encoders and bridges in every driver (and getting it
wrong half of the time, as many drivers forget to set the drm_bridge
encoder pointer), do so in core code. The drm_bridge_attach() function
needs the encoder and optional previous bridge to perform that task,
update all the callers.
Signed-off-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
Acked-by: Stefan Agner <stefan@agner.ch> # For DCU
Acked-by: Boris Brezillon <boris.brezillon@free-electrons.com> # For atmel-hlcdc
Acked-by: Vincent Abriou <vincent.abriou@st.com> # For STI
---
drivers/gpu/drm/arc/arcpgu_hdmi.c | 5 +--
drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_output.c | 4 +-
drivers/gpu/drm/bridge/analogix/analogix_dp_core.c | 4 +-
drivers/gpu/drm/bridge/dw-hdmi.c | 3 +-
drivers/gpu/drm/drm_bridge.c | 46 ++++++++++++++++------
drivers/gpu/drm/drm_simple_kms_helper.c | 4 +-
drivers/gpu/drm/exynos/exynos_dp.c | 5 +--
drivers/gpu/drm/exynos/exynos_drm_dsi.c | 6 +--
drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_rgb.c | 5 +--
drivers/gpu/drm/hisilicon/kirin/dw_drm_dsi.c | 5 +--
drivers/gpu/drm/imx/imx-ldb.c | 6 +--
drivers/gpu/drm/imx/parallel-display.c | 4 +-
drivers/gpu/drm/mediatek/mtk_dpi.c | 8 ++--
drivers/gpu/drm/mediatek/mtk_dsi.c | 24 ++---------
drivers/gpu/drm/mediatek/mtk_hdmi.c | 11 +++---
drivers/gpu/drm/msm/dsi/dsi_manager.c | 17 +++++---
drivers/gpu/drm/msm/edp/edp_bridge.c | 2 +-
drivers/gpu/drm/msm/hdmi/hdmi_bridge.c | 2 +-
drivers/gpu/drm/rcar-du/rcar_du_hdmienc.c | 5 +--
drivers/gpu/drm/sti/sti_dvo.c | 3 +-
drivers/gpu/drm/sti/sti_hda.c | 3 +-
drivers/gpu/drm/sti/sti_hdmi.c | 3 +-
drivers/gpu/drm/sun4i/sun4i_rgb.c | 13 +++---
drivers/gpu/drm/tilcdc/tilcdc_external.c | 4 +-
include/drm/drm_bridge.h | 3 +-
25 files changed, 85 insertions(+), 110 deletions(-)
diff --git a/drivers/gpu/drm/arc/arcpgu_hdmi.c b/drivers/gpu/drm/arc/arcpgu_hdmi.c
index b69c66b4897e..0ce7f398bcff 100644
--- a/drivers/gpu/drm/arc/arcpgu_hdmi.c
+++ b/drivers/gpu/drm/arc/arcpgu_hdmi.c
@@ -47,10 +47,7 @@ int arcpgu_drm_hdmi_init(struct drm_device *drm, struct device_node *np)
return ret;
/* Link drm_bridge to encoder */
- bridge->encoder = encoder;
- encoder->bridge = bridge;
-
- ret = drm_bridge_attach(drm, bridge);
+ ret = drm_bridge_attach(encoder, bridge, NULL);
if (ret)
drm_encoder_cleanup(encoder);
diff --git a/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_output.c b/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_output.c
index 6119b5085501..e7799b6ee829 100644
--- a/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_output.c
+++ b/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_output.c
@@ -230,9 +230,7 @@ static int atmel_hlcdc_attach_endpoint(struct drm_device *dev,
of_node_put(np);
if (bridge) {
- output->encoder.bridge = bridge;
- bridge->encoder = &output->encoder;
- ret = drm_bridge_attach(dev, bridge);
+ ret = drm_bridge_attach(&output->encoder, bridge, NULL);
if (!ret)
return 0;
}
diff --git a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c
index eb9bf8786c24..b7494c8d43fe 100644
--- a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c
+++ b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c
@@ -1227,12 +1227,10 @@ static int analogix_dp_create_bridge(struct drm_device *drm_dev,
dp->bridge = bridge;
- dp->encoder->bridge = bridge;
bridge->driver_private = dp;
- bridge->encoder = dp->encoder;
bridge->funcs = &analogix_dp_bridge_funcs;
- ret = drm_bridge_attach(drm_dev, bridge);
+ ret = drm_bridge_attach(dp->encoder, bridge, NULL);
if (ret) {
DRM_ERROR("failed to attach drm bridge\n");
return -EINVAL;
diff --git a/drivers/gpu/drm/bridge/dw-hdmi.c b/drivers/gpu/drm/bridge/dw-hdmi.c
index 235ce7d1583d..f5009ae39b89 100644
--- a/drivers/gpu/drm/bridge/dw-hdmi.c
+++ b/drivers/gpu/drm/bridge/dw-hdmi.c
@@ -1841,13 +1841,12 @@ static int dw_hdmi_register(struct drm_device *drm, struct dw_hdmi *hdmi)
hdmi->bridge = bridge;
bridge->driver_private = hdmi;
bridge->funcs = &dw_hdmi_bridge_funcs;
- ret = drm_bridge_attach(drm, bridge);
+ ret = drm_bridge_attach(encoder, bridge, NULL);
if (ret) {
DRM_ERROR("Failed to initialize bridge with drm\n");
return -EINVAL;
}
- encoder->bridge = bridge;
hdmi->connector.polled = DRM_CONNECTOR_POLL_HPD;
drm_connector_helper_add(&hdmi->connector,
diff --git a/drivers/gpu/drm/drm_bridge.c b/drivers/gpu/drm/drm_bridge.c
index 0ee052b7c21a..850bd6509ef1 100644
--- a/drivers/gpu/drm/drm_bridge.c
+++ b/drivers/gpu/drm/drm_bridge.c
@@ -26,6 +26,7 @@
#include <linux/mutex.h>
#include <drm/drm_bridge.h>
+#include <drm/drm_encoder.h>
/**
* DOC: overview
@@ -92,32 +93,53 @@ void drm_bridge_remove(struct drm_bridge *bridge)
EXPORT_SYMBOL(drm_bridge_remove);
/**
- * drm_bridge_attach - associate given bridge to our DRM device
+ * drm_bridge_attach - attach the bridge to an encoder's chain
*
- * @dev: DRM device
- * @bridge: bridge control structure
+ * @encoder: DRM encoder
+ * @bridge: bridge to attach
+ * @previous: previous bridge in the chain (optional)
*
- * Called by a kms driver to link one of our encoder/bridge to the given
- * bridge.
+ * Called by a kms driver to link the bridge to an encoder's chain. The previous
+ * argument specifies the previous bridge in the chain. If NULL, the bridge is
+ * linked directly at the encoder's output. Otherwise it is linked at the
+ * previous bridge's output.
*
- * Note that setting up links between the bridge and our encoder/bridge
- * objects needs to be handled by the kms driver itself.
+ * If non-NULL the previous bridge must be already attached by a call to this
+ * function.
*
* RETURNS:
* Zero on success, error code on failure
*/
-int drm_bridge_attach(struct drm_device *dev, struct drm_bridge *bridge)
+int drm_bridge_attach(struct drm_encoder *encoder, struct drm_bridge *bridge,
+ struct drm_bridge *previous)
{
- if (!dev || !bridge)
+ int ret;
+
+ if (!encoder || !bridge)
+ return -EINVAL;
+
+ if (previous && (!previous->dev || previous->encoder != encoder))
return -EINVAL;
if (bridge->dev)
return -EBUSY;
- bridge->dev = dev;
+ bridge->dev = encoder->dev;
+ bridge->encoder = encoder;
+
+ if (bridge->funcs->attach) {
+ ret = bridge->funcs->attach(bridge);
+ if (ret < 0) {
+ bridge->dev = NULL;
+ bridge->encoder = NULL;
+ return ret;
+ }
+ }
- if (bridge->funcs->attach)
- return bridge->funcs->attach(bridge);
+ if (previous)
+ previous->next = bridge;
+ else
+ encoder->bridge = bridge;
return 0;
}
diff --git a/drivers/gpu/drm/drm_simple_kms_helper.c b/drivers/gpu/drm/drm_simple_kms_helper.c
index 7bae08c2bf0a..ba7be6169339 100644
--- a/drivers/gpu/drm/drm_simple_kms_helper.c
+++ b/drivers/gpu/drm/drm_simple_kms_helper.c
@@ -182,9 +182,7 @@ static const struct drm_plane_funcs drm_simple_kms_plane_funcs = {
int drm_simple_display_pipe_attach_bridge(struct drm_simple_display_pipe *pipe,
struct drm_bridge *bridge)
{
- bridge->encoder = &pipe->encoder;
- pipe->encoder.bridge = bridge;
- return drm_bridge_attach(pipe->encoder.dev, bridge);
+ return drm_bridge_attach(&pipe->encoder, bridge, NULL);
}
EXPORT_SYMBOL(drm_simple_display_pipe_attach_bridge);
diff --git a/drivers/gpu/drm/exynos/exynos_dp.c b/drivers/gpu/drm/exynos/exynos_dp.c
index 528229faffe4..1ef0be338b85 100644
--- a/drivers/gpu/drm/exynos/exynos_dp.c
+++ b/drivers/gpu/drm/exynos/exynos_dp.c
@@ -99,7 +99,6 @@ static int exynos_dp_bridge_attach(struct analogix_dp_plat_data *plat_data,
struct drm_connector *connector)
{
struct exynos_dp_device *dp = to_dp(plat_data);
- struct drm_encoder *encoder = &dp->encoder;
int ret;
drm_connector_register(connector);
@@ -107,9 +106,7 @@ static int exynos_dp_bridge_attach(struct analogix_dp_plat_data *plat_data,
/* Pre-empt DP connector creation if there's a bridge */
if (dp->ptn_bridge) {
- bridge->next = dp->ptn_bridge;
- dp->ptn_bridge->encoder = encoder;
- ret = drm_bridge_attach(encoder->dev, dp->ptn_bridge);
+ ret = drm_bridge_attach(&dp->encoder, dp->ptn_bridge, bridge);
if (ret) {
DRM_ERROR("Failed to attach bridge to drm\n");
bridge->next = NULL;
diff --git a/drivers/gpu/drm/exynos/exynos_drm_dsi.c b/drivers/gpu/drm/exynos/exynos_drm_dsi.c
index e07cb1fe4860..812e2ec0761d 100644
--- a/drivers/gpu/drm/exynos/exynos_drm_dsi.c
+++ b/drivers/gpu/drm/exynos/exynos_drm_dsi.c
@@ -1718,10 +1718,8 @@ static int exynos_dsi_bind(struct device *dev, struct device *master,
}
bridge = of_drm_find_bridge(dsi->bridge_node);
- if (bridge) {
- encoder->bridge = bridge;
- drm_bridge_attach(drm_dev, bridge);
- }
+ if (bridge)
+ drm_bridge_attach(encoder, bridge, NULL);
return mipi_dsi_host_register(&dsi->dsi_host);
}
diff --git a/drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_rgb.c b/drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_rgb.c
index 05a8ee106879..c3651456c963 100644
--- a/drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_rgb.c
+++ b/drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_rgb.c
@@ -160,10 +160,7 @@ static int fsl_dcu_attach_endpoint(struct fsl_dcu_drm_device *fsl_dev,
if (!bridge)
return -ENODEV;
- fsl_dev->encoder.bridge = bridge;
- bridge->encoder = &fsl_dev->encoder;
-
- return drm_bridge_attach(fsl_dev->drm, bridge);
+ return drm_bridge_attach(&fsl_dev->encoder, bridge, NULL);
}
int fsl_dcu_create_outputs(struct fsl_dcu_drm_device *fsl_dev)
diff --git a/drivers/gpu/drm/hisilicon/kirin/dw_drm_dsi.c b/drivers/gpu/drm/hisilicon/kirin/dw_drm_dsi.c
index 998452ad0fcb..1737e98bc10a 100644
--- a/drivers/gpu/drm/hisilicon/kirin/dw_drm_dsi.c
+++ b/drivers/gpu/drm/hisilicon/kirin/dw_drm_dsi.c
@@ -709,10 +709,7 @@ static int dsi_bridge_init(struct drm_device *dev, struct dw_dsi *dsi)
int ret;
/* associate the bridge to dsi encoder */
- encoder->bridge = bridge;
- bridge->encoder = encoder;
-
- ret = drm_bridge_attach(dev, bridge);
+ ret = drm_bridge_attach(encoder, bridge, NULL);
if (ret) {
DRM_ERROR("failed to attach external bridge\n");
return ret;
diff --git a/drivers/gpu/drm/imx/imx-ldb.c b/drivers/gpu/drm/imx/imx-ldb.c
index 516d06490465..ec49ea3d8e40 100644
--- a/drivers/gpu/drm/imx/imx-ldb.c
+++ b/drivers/gpu/drm/imx/imx-ldb.c
@@ -454,10 +454,8 @@ static int imx_ldb_register(struct drm_device *drm,
DRM_MODE_ENCODER_LVDS, NULL);
if (imx_ldb_ch->bridge) {
- imx_ldb_ch->bridge->encoder = encoder;
-
- imx_ldb_ch->encoder.bridge = imx_ldb_ch->bridge;
- ret = drm_bridge_attach(drm, imx_ldb_ch->bridge);
+ ret = drm_bridge_attach(&imx_ldb_ch->encoder,
+ imx_ldb_ch->bridge, NULL);
if (ret) {
DRM_ERROR("Failed to initialize bridge with drm\n");
return ret;
diff --git a/drivers/gpu/drm/imx/parallel-display.c b/drivers/gpu/drm/imx/parallel-display.c
index 8582a83c0d9b..51d9f735c358 100644
--- a/drivers/gpu/drm/imx/parallel-display.c
+++ b/drivers/gpu/drm/imx/parallel-display.c
@@ -191,9 +191,7 @@ static int imx_pd_register(struct drm_device *drm,
drm_panel_attach(imxpd->panel, &imxpd->connector);
if (imxpd->bridge) {
- imxpd->bridge->encoder = encoder;
- encoder->bridge = imxpd->bridge;
- ret = drm_bridge_attach(drm, imxpd->bridge);
+ ret = drm_bridge_attach(encoder, imxpd->bridge, NULL);
if (ret < 0) {
dev_err(imxpd->dev, "failed to attach bridge: %d\n",
ret);
diff --git a/drivers/gpu/drm/mediatek/mtk_dpi.c b/drivers/gpu/drm/mediatek/mtk_dpi.c
index 90fb831ef031..3bd3bd688d1a 100644
--- a/drivers/gpu/drm/mediatek/mtk_dpi.c
+++ b/drivers/gpu/drm/mediatek/mtk_dpi.c
@@ -63,6 +63,7 @@ enum mtk_dpi_out_color_format {
struct mtk_dpi {
struct mtk_ddp_comp ddp_comp;
struct drm_encoder encoder;
+ struct drm_bridge *bridge;
void __iomem *regs;
struct device *dev;
struct clk *engine_clk;
@@ -620,8 +621,7 @@ static int mtk_dpi_bind(struct device *dev, struct device *master, void *data)
/* Currently DPI0 is fixed to be driven by OVL1 */
dpi->encoder.possible_crtcs = BIT(1);
- dpi->encoder.bridge->encoder = &dpi->encoder;
- ret = drm_bridge_attach(dpi->encoder.dev, dpi->encoder.bridge);
+ ret = drm_bridge_attach(&dpi->encoder, dpi->bridge, NULL);
if (ret) {
dev_err(dev, "Failed to attach bridge: %d\n", ret);
goto err_cleanup;
@@ -718,9 +718,9 @@ static int mtk_dpi_probe(struct platform_device *pdev)
dev_info(dev, "Found bridge node: %s\n", bridge_node->full_name);
- dpi->encoder.bridge = of_drm_find_bridge(bridge_node);
+ dpi->bridge = of_drm_find_bridge(bridge_node);
of_node_put(bridge_node);
- if (!dpi->encoder.bridge)
+ if (!dpi->bridge)
return -EPROBE_DEFER;
comp_id = mtk_ddp_comp_get_id(dev->of_node, MTK_DPI);
diff --git a/drivers/gpu/drm/mediatek/mtk_dsi.c b/drivers/gpu/drm/mediatek/mtk_dsi.c
index 2c42f90809d8..dd71cbb1a622 100644
--- a/drivers/gpu/drm/mediatek/mtk_dsi.c
+++ b/drivers/gpu/drm/mediatek/mtk_dsi.c
@@ -622,26 +622,6 @@ static const struct drm_connector_helper_funcs
.get_modes = mtk_dsi_connector_get_modes,
};
-static int mtk_drm_attach_bridge(struct drm_bridge *bridge,
- struct drm_encoder *encoder)
-{
- int ret;
-
- if (!bridge)
- return -ENOENT;
-
- encoder->bridge = bridge;
- bridge->encoder = encoder;
- ret = drm_bridge_attach(encoder->dev, bridge);
- if (ret) {
- DRM_ERROR("Failed to attach bridge to drm\n");
- encoder->bridge = NULL;
- bridge->encoder = NULL;
- }
-
- return ret;
-}
-
static int mtk_dsi_create_connector(struct drm_device *drm, struct mtk_dsi *dsi)
{
int ret;
@@ -692,8 +672,10 @@ static int mtk_dsi_create_conn_enc(struct drm_device *drm, struct mtk_dsi *dsi)
dsi->encoder.possible_crtcs = 1;
/* If there's a bridge, attach to it and let it create the connector */
- ret = mtk_drm_attach_bridge(dsi->bridge, &dsi->encoder);
+ ret = drm_bridge_attach(&dsi->encoder, dsi->bridge, NULL);
if (ret) {
+ DRM_ERROR("Failed to attach bridge to drm\n");
+
/* Otherwise create our own connector and attach to a panel */
ret = mtk_dsi_create_connector(drm, dsi);
if (ret)
diff --git a/drivers/gpu/drm/mediatek/mtk_hdmi.c b/drivers/gpu/drm/mediatek/mtk_hdmi.c
index 0e8c4d9af340..c26251260b83 100644
--- a/drivers/gpu/drm/mediatek/mtk_hdmi.c
+++ b/drivers/gpu/drm/mediatek/mtk_hdmi.c
@@ -149,6 +149,7 @@ struct hdmi_audio_param {
struct mtk_hdmi {
struct drm_bridge bridge;
+ struct drm_bridge *next_bridge;
struct drm_connector conn;
struct device *dev;
struct phy *phy;
@@ -1314,9 +1315,9 @@ static int mtk_hdmi_bridge_attach(struct drm_bridge *bridge)
return ret;
}
- if (bridge->next) {
- bridge->next->encoder = bridge->encoder;
- ret = drm_bridge_attach(bridge->encoder->dev, bridge->next);
+ if (hdmi->next_bridge) {
+ ret = drm_bridge_attach(bridge->encoder, hdmi->next_bridge,
+ bridge);
if (ret) {
dev_err(hdmi->dev,
"Failed to attach external bridge: %d\n", ret);
@@ -1510,8 +1511,8 @@ static int mtk_hdmi_dt_parse_pdata(struct mtk_hdmi *hdmi,
of_node_put(ep);
if (!of_device_is_compatible(remote, "hdmi-connector")) {
- hdmi->bridge.next = of_drm_find_bridge(remote);
- if (!hdmi->bridge.next) {
+ hdmi->next_bridge = of_drm_find_bridge(remote);
+ if (!hdmi->next_bridge) {
dev_err(dev, "Waiting for external bridge\n");
of_node_put(remote);
return -EPROBE_DEFER;
diff --git a/drivers/gpu/drm/msm/dsi/dsi_manager.c b/drivers/gpu/drm/msm/dsi/dsi_manager.c
index c8d1f19c9a6d..2bd8dad76105 100644
--- a/drivers/gpu/drm/msm/dsi/dsi_manager.c
+++ b/drivers/gpu/drm/msm/dsi/dsi_manager.c
@@ -579,6 +579,7 @@ struct drm_bridge *msm_dsi_manager_bridge_init(u8 id)
struct msm_dsi *msm_dsi = dsi_mgr_get_dsi(id);
struct drm_bridge *bridge = NULL;
struct dsi_bridge *dsi_bridge;
+ struct drm_encoder *encoder;
int ret;
dsi_bridge = devm_kzalloc(msm_dsi->dev->dev,
@@ -590,10 +591,18 @@ struct drm_bridge *msm_dsi_manager_bridge_init(u8 id)
dsi_bridge->id = id;
+ /*
+ * HACK: we may not know the external DSI bridge device's mode
+ * flags here. We'll get to know them only when the device
+ * attaches to the dsi host. For now, assume the bridge supports
+ * DSI video mode
+ */
+ encoder = msm_dsi->encoders[MSM_DSI_VIDEO_ENCODER_ID];
+
bridge = &dsi_bridge->base;
bridge->funcs = &dsi_mgr_bridge_funcs;
- ret = drm_bridge_attach(msm_dsi->dev, bridge);
+ ret = drm_bridge_attach(encoder, bridge, NULL);
if (ret)
goto fail;
@@ -628,11 +637,7 @@ struct drm_connector *msm_dsi_manager_ext_bridge_init(u8 id)
encoder = msm_dsi->encoders[MSM_DSI_VIDEO_ENCODER_ID];
/* link the internal dsi bridge to the external bridge */
- int_bridge->next = ext_bridge;
- /* set the external bridge's encoder as dsi's encoder */
- ext_bridge->encoder = encoder;
-
- drm_bridge_attach(dev, ext_bridge);
+ drm_bridge_attach(encoder, ext_bridge, int_bridge);
/*
* we need the drm_connector created by the external bridge
diff --git a/drivers/gpu/drm/msm/edp/edp_bridge.c b/drivers/gpu/drm/msm/edp/edp_bridge.c
index 2bc73f82f3f5..931a5c97cccf 100644
--- a/drivers/gpu/drm/msm/edp/edp_bridge.c
+++ b/drivers/gpu/drm/msm/edp/edp_bridge.c
@@ -106,7 +106,7 @@ struct drm_bridge *msm_edp_bridge_init(struct msm_edp *edp)
bridge = &edp_bridge->base;
bridge->funcs = &edp_bridge_funcs;
- ret = drm_bridge_attach(edp->dev, bridge);
+ ret = drm_bridge_attach(edp->encoder, bridge, NULL);
if (ret)
goto fail;
diff --git a/drivers/gpu/drm/msm/hdmi/hdmi_bridge.c b/drivers/gpu/drm/msm/hdmi/hdmi_bridge.c
index bacbd5d8df0e..4e6d1bf27474 100644
--- a/drivers/gpu/drm/msm/hdmi/hdmi_bridge.c
+++ b/drivers/gpu/drm/msm/hdmi/hdmi_bridge.c
@@ -227,7 +227,7 @@ struct drm_bridge *msm_hdmi_bridge_init(struct hdmi *hdmi)
bridge = &hdmi_bridge->base;
bridge->funcs = &msm_hdmi_bridge_funcs;
- ret = drm_bridge_attach(hdmi->dev, bridge);
+ ret = drm_bridge_attach(hdmi->encoder, bridge, NULL);
if (ret)
goto fail;
diff --git a/drivers/gpu/drm/rcar-du/rcar_du_hdmienc.c b/drivers/gpu/drm/rcar-du/rcar_du_hdmienc.c
index a1a2c5e7822c..933a2547798e 100644
--- a/drivers/gpu/drm/rcar-du/rcar_du_hdmienc.c
+++ b/drivers/gpu/drm/rcar-du/rcar_du_hdmienc.c
@@ -124,10 +124,7 @@ int rcar_du_hdmienc_init(struct rcar_du_device *rcdu,
hdmienc->renc = renc;
/* Link the bridge to the encoder. */
- bridge->encoder = encoder;
- encoder->bridge = bridge;
-
- ret = drm_bridge_attach(rcdu->ddev, bridge);
+ ret = drm_bridge_attach(encoder, bridge, NULL);
if (ret) {
drm_encoder_cleanup(encoder);
return ret;
diff --git a/drivers/gpu/drm/sti/sti_dvo.c b/drivers/gpu/drm/sti/sti_dvo.c
index e8c1ed08a9f7..411dc6ec976e 100644
--- a/drivers/gpu/drm/sti/sti_dvo.c
+++ b/drivers/gpu/drm/sti/sti_dvo.c
@@ -478,14 +478,13 @@ static int sti_dvo_bind(struct device *dev, struct device *master, void *data)
return err;
}
- err = drm_bridge_attach(drm_dev, bridge);
+ err = drm_bridge_attach(encoder, bridge, NULL);
if (err) {
DRM_ERROR("Failed to attach bridge\n");
return err;
}
dvo->bridge = bridge;
- encoder->bridge = bridge;
connector->encoder = encoder;
dvo->encoder = encoder;
diff --git a/drivers/gpu/drm/sti/sti_hda.c b/drivers/gpu/drm/sti/sti_hda.c
index 96f336dd0e29..66d37d78152a 100644
--- a/drivers/gpu/drm/sti/sti_hda.c
+++ b/drivers/gpu/drm/sti/sti_hda.c
@@ -707,9 +707,8 @@ static int sti_hda_bind(struct device *dev, struct device *master, void *data)
bridge->driver_private = hda;
bridge->funcs = &sti_hda_bridge_funcs;
- drm_bridge_attach(drm_dev, bridge);
+ drm_bridge_attach(encoder, bridge, NULL);
- encoder->bridge = bridge;
connector->encoder = encoder;
drm_connector = (struct drm_connector *)connector;
diff --git a/drivers/gpu/drm/sti/sti_hdmi.c b/drivers/gpu/drm/sti/sti_hdmi.c
index 376b0763c874..f0af1ae82ee9 100644
--- a/drivers/gpu/drm/sti/sti_hdmi.c
+++ b/drivers/gpu/drm/sti/sti_hdmi.c
@@ -1308,9 +1308,8 @@ static int sti_hdmi_bind(struct device *dev, struct device *master, void *data)
bridge->driver_private = hdmi;
bridge->funcs = &sti_hdmi_bridge_funcs;
- drm_bridge_attach(drm_dev, bridge);
+ drm_bridge_attach(encoder, bridge, NULL);
- encoder->bridge = bridge;
connector->encoder = encoder;
drm_connector = (struct drm_connector *)connector;
diff --git a/drivers/gpu/drm/sun4i/sun4i_rgb.c b/drivers/gpu/drm/sun4i/sun4i_rgb.c
index f5e86fe7750e..757208f51731 100644
--- a/drivers/gpu/drm/sun4i/sun4i_rgb.c
+++ b/drivers/gpu/drm/sun4i/sun4i_rgb.c
@@ -208,6 +208,7 @@ int sun4i_rgb_init(struct drm_device *drm)
struct sun4i_drv *drv = drm->dev_private;
struct sun4i_tcon *tcon = drv->tcon;
struct drm_encoder *encoder;
+ struct drm_bridge *bridge;
struct sun4i_rgb *rgb;
int ret;
@@ -218,8 +219,8 @@ int sun4i_rgb_init(struct drm_device *drm)
encoder = &rgb->encoder;
tcon->panel = sun4i_tcon_find_panel(tcon->dev->of_node);
- encoder->bridge = sun4i_tcon_find_bridge(tcon->dev->of_node);
- if (IS_ERR(tcon->panel) && IS_ERR(encoder->bridge)) {
+ bridge = sun4i_tcon_find_bridge(tcon->dev->of_node);
+ if (IS_ERR(tcon->panel) && IS_ERR(bridge)) {
dev_info(drm->dev, "No panel or bridge found... RGB output disabled\n");
return 0;
}
@@ -260,16 +261,12 @@ int sun4i_rgb_init(struct drm_device *drm)
}
}
- if (!IS_ERR(encoder->bridge)) {
- encoder->bridge->encoder = &rgb->encoder;
-
- ret = drm_bridge_attach(drm, encoder->bridge);
+ if (!IS_ERR(bridge)) {
+ ret = drm_bridge_attach(encoder, bridge, NULL);
if (ret) {
dev_err(drm->dev, "Couldn't attach our bridge\n");
goto err_cleanup_connector;
}
- } else {
- encoder->bridge = NULL;
}
return 0;
diff --git a/drivers/gpu/drm/tilcdc/tilcdc_external.c b/drivers/gpu/drm/tilcdc/tilcdc_external.c
index c67d7cd7d57e..b0dd5e8634ae 100644
--- a/drivers/gpu/drm/tilcdc/tilcdc_external.c
+++ b/drivers/gpu/drm/tilcdc/tilcdc_external.c
@@ -167,10 +167,8 @@ int tilcdc_attach_bridge(struct drm_device *ddev, struct drm_bridge *bridge)
int ret;
priv->external_encoder->possible_crtcs = BIT(0);
- priv->external_encoder->bridge = bridge;
- bridge->encoder = priv->external_encoder;
- ret = drm_bridge_attach(ddev, bridge);
+ ret = drm_bridge_attach(priv->external_encoder, bridge, NULL);
if (ret) {
dev_err(ddev->dev, "drm_bridge_attach() failed %d\n", ret);
return ret;
diff --git a/include/drm/drm_bridge.h b/include/drm/drm_bridge.h
index 530a1d6e8cde..94e5ee96b3b5 100644
--- a/include/drm/drm_bridge.h
+++ b/include/drm/drm_bridge.h
@@ -201,7 +201,8 @@ struct drm_bridge {
int drm_bridge_add(struct drm_bridge *bridge);
void drm_bridge_remove(struct drm_bridge *bridge);
struct drm_bridge *of_drm_find_bridge(struct device_node *np);
-int drm_bridge_attach(struct drm_device *dev, struct drm_bridge *bridge);
+int drm_bridge_attach(struct drm_encoder *encoder, struct drm_bridge *bridge,
+ struct drm_bridge *previous);
void drm_bridge_detach(struct drm_bridge *bridge);
bool drm_bridge_mode_fixup(struct drm_bridge *bridge,
--
Regards,
Laurent Pinchart
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [PATCH v4 4/5] drm: bridge: Detach bridge from encoder at encoder cleanup time
2016-12-14 9:59 [PATCH v4 0/5] Cleanup DRM bridge attach/detach Laurent Pinchart
` (2 preceding siblings ...)
2016-12-14 9:59 ` [PATCH v4 3/5] drm: bridge: Link encoder and bridge in core code Laurent Pinchart
@ 2016-12-14 9:59 ` Laurent Pinchart
2016-12-14 10:19 ` Daniel Vetter
2016-12-14 9:59 ` [PATCH v4 5/5] drm: bridge: Detach all bridges in a chain " Laurent Pinchart
2016-12-18 11:18 ` [PATCH v4 0/5] Cleanup DRM bridge attach/detach Archit Taneja
5 siblings, 1 reply; 17+ messages in thread
From: Laurent Pinchart @ 2016-12-14 9:59 UTC (permalink / raw)
To: dri-devel
Most drivers that use bridges forgot to detach them at cleanup time.
Instead of fixing them one by one, detach the bridge in the core
drm_encoder_cleanup() function.
Signed-off-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
---
drivers/gpu/drm/drm_bridge.c | 13 ++-----------
drivers/gpu/drm/drm_crtc_internal.h | 3 +++
drivers/gpu/drm/drm_encoder.c | 3 +++
drivers/gpu/drm/drm_simple_kms_helper.c | 17 -----------------
drivers/gpu/drm/imx/imx-ldb.c | 2 --
drivers/gpu/drm/imx/parallel-display.c | 2 --
include/drm/drm_bridge.h | 1 -
include/drm/drm_simple_kms_helper.h | 2 --
8 files changed, 8 insertions(+), 35 deletions(-)
diff --git a/drivers/gpu/drm/drm_bridge.c b/drivers/gpu/drm/drm_bridge.c
index 850bd6509ef1..cd10095e8d00 100644
--- a/drivers/gpu/drm/drm_bridge.c
+++ b/drivers/gpu/drm/drm_bridge.c
@@ -28,6 +28,8 @@
#include <drm/drm_bridge.h>
#include <drm/drm_encoder.h>
+#include "drm_crtc_internal.h"
+
/**
* DOC: overview
*
@@ -145,16 +147,6 @@ int drm_bridge_attach(struct drm_encoder *encoder, struct drm_bridge *bridge,
}
EXPORT_SYMBOL(drm_bridge_attach);
-/**
- * drm_bridge_detach - deassociate given bridge from its DRM device
- *
- * @bridge: bridge control structure
- *
- * Called by a kms driver to unlink the given bridge from its DRM device.
- *
- * Note that tearing down links between the bridge and our encoder/bridge
- * objects needs to be handled by the kms driver itself.
- */
void drm_bridge_detach(struct drm_bridge *bridge)
{
if (WARN_ON(!bridge))
@@ -168,7 +160,6 @@ void drm_bridge_detach(struct drm_bridge *bridge)
bridge->dev = NULL;
}
-EXPORT_SYMBOL(drm_bridge_detach);
/**
* DOC: bridge callbacks
diff --git a/drivers/gpu/drm/drm_crtc_internal.h b/drivers/gpu/drm/drm_crtc_internal.h
index cdf6860c9d22..42471dfc7405 100644
--- a/drivers/gpu/drm/drm_crtc_internal.h
+++ b/drivers/gpu/drm/drm_crtc_internal.h
@@ -186,6 +186,9 @@ void drm_plane_unregister_all(struct drm_device *dev);
int drm_plane_check_pixel_format(const struct drm_plane *plane,
u32 format);
+/* drm_bridge.c */
+void drm_bridge_detach(struct drm_bridge *bridge);
+
/* IOCTL */
int drm_mode_getplane_res(struct drm_device *dev, void *data,
struct drm_file *file_priv);
diff --git a/drivers/gpu/drm/drm_encoder.c b/drivers/gpu/drm/drm_encoder.c
index 992879f15f23..0944f08abf58 100644
--- a/drivers/gpu/drm/drm_encoder.c
+++ b/drivers/gpu/drm/drm_encoder.c
@@ -159,6 +159,9 @@ void drm_encoder_cleanup(struct drm_encoder *encoder)
* the indices on the drm_encoder after us in the encoder_list.
*/
+ if (encoder->bridge)
+ drm_bridge_detach(encoder->bridge);
+
drm_mode_object_unregister(dev, &encoder->base);
kfree(encoder->name);
list_del(&encoder->head);
diff --git a/drivers/gpu/drm/drm_simple_kms_helper.c b/drivers/gpu/drm/drm_simple_kms_helper.c
index ba7be6169339..3cc42f5dfba1 100644
--- a/drivers/gpu/drm/drm_simple_kms_helper.c
+++ b/drivers/gpu/drm/drm_simple_kms_helper.c
@@ -187,23 +187,6 @@ int drm_simple_display_pipe_attach_bridge(struct drm_simple_display_pipe *pipe,
EXPORT_SYMBOL(drm_simple_display_pipe_attach_bridge);
/**
- * drm_simple_display_pipe_detach_bridge - Detach the bridge from the display pipe
- * @pipe: simple display pipe object
- *
- * Detaches the drm bridge previously attached with
- * drm_simple_display_pipe_attach_bridge()
- */
-void drm_simple_display_pipe_detach_bridge(struct drm_simple_display_pipe *pipe)
-{
- if (WARN_ON(!pipe->encoder.bridge))
- return;
-
- drm_bridge_detach(pipe->encoder.bridge);
- pipe->encoder.bridge = NULL;
-}
-EXPORT_SYMBOL(drm_simple_display_pipe_detach_bridge);
-
-/**
* drm_simple_display_pipe_init - Initialize a simple display pipeline
* @dev: DRM device
* @pipe: simple display pipe object to initialize
diff --git a/drivers/gpu/drm/imx/imx-ldb.c b/drivers/gpu/drm/imx/imx-ldb.c
index ec49ea3d8e40..88cd11d30134 100644
--- a/drivers/gpu/drm/imx/imx-ldb.c
+++ b/drivers/gpu/drm/imx/imx-ldb.c
@@ -736,8 +736,6 @@ static void imx_ldb_unbind(struct device *dev, struct device *master,
for (i = 0; i < 2; i++) {
struct imx_ldb_channel *channel = &imx_ldb->channel[i];
- if (channel->bridge)
- drm_bridge_detach(channel->bridge);
if (channel->panel)
drm_panel_detach(channel->panel);
diff --git a/drivers/gpu/drm/imx/parallel-display.c b/drivers/gpu/drm/imx/parallel-display.c
index 51d9f735c358..d5c06fd89f90 100644
--- a/drivers/gpu/drm/imx/parallel-display.c
+++ b/drivers/gpu/drm/imx/parallel-display.c
@@ -284,8 +284,6 @@ static void imx_pd_unbind(struct device *dev, struct device *master,
{
struct imx_parallel_display *imxpd = dev_get_drvdata(dev);
- if (imxpd->bridge)
- drm_bridge_detach(imxpd->bridge);
if (imxpd->panel)
drm_panel_detach(imxpd->panel);
diff --git a/include/drm/drm_bridge.h b/include/drm/drm_bridge.h
index 94e5ee96b3b5..435be20029f7 100644
--- a/include/drm/drm_bridge.h
+++ b/include/drm/drm_bridge.h
@@ -203,7 +203,6 @@ void drm_bridge_remove(struct drm_bridge *bridge);
struct drm_bridge *of_drm_find_bridge(struct device_node *np);
int drm_bridge_attach(struct drm_encoder *encoder, struct drm_bridge *bridge,
struct drm_bridge *previous);
-void drm_bridge_detach(struct drm_bridge *bridge);
bool drm_bridge_mode_fixup(struct drm_bridge *bridge,
const struct drm_display_mode *mode,
diff --git a/include/drm/drm_simple_kms_helper.h b/include/drm/drm_simple_kms_helper.h
index 01a8436ccb0a..2bbc610ec3a2 100644
--- a/include/drm/drm_simple_kms_helper.h
+++ b/include/drm/drm_simple_kms_helper.h
@@ -114,8 +114,6 @@ struct drm_simple_display_pipe {
int drm_simple_display_pipe_attach_bridge(struct drm_simple_display_pipe *pipe,
struct drm_bridge *bridge);
-void drm_simple_display_pipe_detach_bridge(struct drm_simple_display_pipe *pipe);
-
int drm_simple_display_pipe_init(struct drm_device *dev,
struct drm_simple_display_pipe *pipe,
const struct drm_simple_display_pipe_funcs *funcs,
--
Regards,
Laurent Pinchart
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [PATCH v4 5/5] drm: bridge: Detach all bridges in a chain at encoder cleanup time
2016-12-14 9:59 [PATCH v4 0/5] Cleanup DRM bridge attach/detach Laurent Pinchart
` (3 preceding siblings ...)
2016-12-14 9:59 ` [PATCH v4 4/5] drm: bridge: Detach bridge from encoder at encoder cleanup time Laurent Pinchart
@ 2016-12-14 9:59 ` Laurent Pinchart
2016-12-14 10:21 ` Daniel Vetter
2016-12-18 11:18 ` [PATCH v4 0/5] Cleanup DRM bridge attach/detach Archit Taneja
5 siblings, 1 reply; 17+ messages in thread
From: Laurent Pinchart @ 2016-12-14 9:59 UTC (permalink / raw)
To: dri-devel
Instead of detaching only the bridge directly connected to the encoder,
detach all bridges in the chain.
Signed-off-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
---
drivers/gpu/drm/drm_encoder.c | 12 ++++++++++--
1 file changed, 10 insertions(+), 2 deletions(-)
diff --git a/drivers/gpu/drm/drm_encoder.c b/drivers/gpu/drm/drm_encoder.c
index 0944f08abf58..5dde3c6b1467 100644
--- a/drivers/gpu/drm/drm_encoder.c
+++ b/drivers/gpu/drm/drm_encoder.c
@@ -159,8 +159,16 @@ void drm_encoder_cleanup(struct drm_encoder *encoder)
* the indices on the drm_encoder after us in the encoder_list.
*/
- if (encoder->bridge)
- drm_bridge_detach(encoder->bridge);
+ if (encoder->bridge) {
+ struct drm_bridge *bridge = encoder->bridge;
+ struct drm_bridge *next;
+
+ while (bridge) {
+ next = bridge->next;
+ drm_bridge_detach(bridge);
+ bridge = next;
+ }
+ }
drm_mode_object_unregister(dev, &encoder->base);
kfree(encoder->name);
--
Regards,
Laurent Pinchart
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply related [flat|nested] 17+ messages in thread
* Re: [PATCH v4 4/5] drm: bridge: Detach bridge from encoder at encoder cleanup time
2016-12-14 9:59 ` [PATCH v4 4/5] drm: bridge: Detach bridge from encoder at encoder cleanup time Laurent Pinchart
@ 2016-12-14 10:19 ` Daniel Vetter
0 siblings, 0 replies; 17+ messages in thread
From: Daniel Vetter @ 2016-12-14 10:19 UTC (permalink / raw)
To: Laurent Pinchart; +Cc: dri-devel
On Wed, Dec 14, 2016 at 11:59:09AM +0200, Laurent Pinchart wrote:
> Most drivers that use bridges forgot to detach them at cleanup time.
> Instead of fixing them one by one, detach the bridge in the core
> drm_encoder_cleanup() function.
>
> Signed-off-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch>
> ---
> drivers/gpu/drm/drm_bridge.c | 13 ++-----------
> drivers/gpu/drm/drm_crtc_internal.h | 3 +++
> drivers/gpu/drm/drm_encoder.c | 3 +++
> drivers/gpu/drm/drm_simple_kms_helper.c | 17 -----------------
> drivers/gpu/drm/imx/imx-ldb.c | 2 --
> drivers/gpu/drm/imx/parallel-display.c | 2 --
> include/drm/drm_bridge.h | 1 -
> include/drm/drm_simple_kms_helper.h | 2 --
> 8 files changed, 8 insertions(+), 35 deletions(-)
>
> diff --git a/drivers/gpu/drm/drm_bridge.c b/drivers/gpu/drm/drm_bridge.c
> index 850bd6509ef1..cd10095e8d00 100644
> --- a/drivers/gpu/drm/drm_bridge.c
> +++ b/drivers/gpu/drm/drm_bridge.c
> @@ -28,6 +28,8 @@
> #include <drm/drm_bridge.h>
> #include <drm/drm_encoder.h>
>
> +#include "drm_crtc_internal.h"
> +
> /**
> * DOC: overview
> *
> @@ -145,16 +147,6 @@ int drm_bridge_attach(struct drm_encoder *encoder, struct drm_bridge *bridge,
> }
> EXPORT_SYMBOL(drm_bridge_attach);
>
> -/**
> - * drm_bridge_detach - deassociate given bridge from its DRM device
> - *
> - * @bridge: bridge control structure
> - *
> - * Called by a kms driver to unlink the given bridge from its DRM device.
> - *
> - * Note that tearing down links between the bridge and our encoder/bridge
> - * objects needs to be handled by the kms driver itself.
> - */
> void drm_bridge_detach(struct drm_bridge *bridge)
> {
> if (WARN_ON(!bridge))
> @@ -168,7 +160,6 @@ void drm_bridge_detach(struct drm_bridge *bridge)
>
> bridge->dev = NULL;
> }
> -EXPORT_SYMBOL(drm_bridge_detach);
>
> /**
> * DOC: bridge callbacks
> diff --git a/drivers/gpu/drm/drm_crtc_internal.h b/drivers/gpu/drm/drm_crtc_internal.h
> index cdf6860c9d22..42471dfc7405 100644
> --- a/drivers/gpu/drm/drm_crtc_internal.h
> +++ b/drivers/gpu/drm/drm_crtc_internal.h
> @@ -186,6 +186,9 @@ void drm_plane_unregister_all(struct drm_device *dev);
> int drm_plane_check_pixel_format(const struct drm_plane *plane,
> u32 format);
>
> +/* drm_bridge.c */
> +void drm_bridge_detach(struct drm_bridge *bridge);
> +
> /* IOCTL */
> int drm_mode_getplane_res(struct drm_device *dev, void *data,
> struct drm_file *file_priv);
> diff --git a/drivers/gpu/drm/drm_encoder.c b/drivers/gpu/drm/drm_encoder.c
> index 992879f15f23..0944f08abf58 100644
> --- a/drivers/gpu/drm/drm_encoder.c
> +++ b/drivers/gpu/drm/drm_encoder.c
> @@ -159,6 +159,9 @@ void drm_encoder_cleanup(struct drm_encoder *encoder)
> * the indices on the drm_encoder after us in the encoder_list.
> */
>
> + if (encoder->bridge)
> + drm_bridge_detach(encoder->bridge);
> +
> drm_mode_object_unregister(dev, &encoder->base);
> kfree(encoder->name);
> list_del(&encoder->head);
> diff --git a/drivers/gpu/drm/drm_simple_kms_helper.c b/drivers/gpu/drm/drm_simple_kms_helper.c
> index ba7be6169339..3cc42f5dfba1 100644
> --- a/drivers/gpu/drm/drm_simple_kms_helper.c
> +++ b/drivers/gpu/drm/drm_simple_kms_helper.c
> @@ -187,23 +187,6 @@ int drm_simple_display_pipe_attach_bridge(struct drm_simple_display_pipe *pipe,
> EXPORT_SYMBOL(drm_simple_display_pipe_attach_bridge);
>
> /**
> - * drm_simple_display_pipe_detach_bridge - Detach the bridge from the display pipe
> - * @pipe: simple display pipe object
> - *
> - * Detaches the drm bridge previously attached with
> - * drm_simple_display_pipe_attach_bridge()
> - */
> -void drm_simple_display_pipe_detach_bridge(struct drm_simple_display_pipe *pipe)
> -{
> - if (WARN_ON(!pipe->encoder.bridge))
> - return;
> -
> - drm_bridge_detach(pipe->encoder.bridge);
> - pipe->encoder.bridge = NULL;
> -}
> -EXPORT_SYMBOL(drm_simple_display_pipe_detach_bridge);
> -
> -/**
> * drm_simple_display_pipe_init - Initialize a simple display pipeline
> * @dev: DRM device
> * @pipe: simple display pipe object to initialize
> diff --git a/drivers/gpu/drm/imx/imx-ldb.c b/drivers/gpu/drm/imx/imx-ldb.c
> index ec49ea3d8e40..88cd11d30134 100644
> --- a/drivers/gpu/drm/imx/imx-ldb.c
> +++ b/drivers/gpu/drm/imx/imx-ldb.c
> @@ -736,8 +736,6 @@ static void imx_ldb_unbind(struct device *dev, struct device *master,
> for (i = 0; i < 2; i++) {
> struct imx_ldb_channel *channel = &imx_ldb->channel[i];
>
> - if (channel->bridge)
> - drm_bridge_detach(channel->bridge);
> if (channel->panel)
> drm_panel_detach(channel->panel);
>
> diff --git a/drivers/gpu/drm/imx/parallel-display.c b/drivers/gpu/drm/imx/parallel-display.c
> index 51d9f735c358..d5c06fd89f90 100644
> --- a/drivers/gpu/drm/imx/parallel-display.c
> +++ b/drivers/gpu/drm/imx/parallel-display.c
> @@ -284,8 +284,6 @@ static void imx_pd_unbind(struct device *dev, struct device *master,
> {
> struct imx_parallel_display *imxpd = dev_get_drvdata(dev);
>
> - if (imxpd->bridge)
> - drm_bridge_detach(imxpd->bridge);
> if (imxpd->panel)
> drm_panel_detach(imxpd->panel);
>
> diff --git a/include/drm/drm_bridge.h b/include/drm/drm_bridge.h
> index 94e5ee96b3b5..435be20029f7 100644
> --- a/include/drm/drm_bridge.h
> +++ b/include/drm/drm_bridge.h
> @@ -203,7 +203,6 @@ void drm_bridge_remove(struct drm_bridge *bridge);
> struct drm_bridge *of_drm_find_bridge(struct device_node *np);
> int drm_bridge_attach(struct drm_encoder *encoder, struct drm_bridge *bridge,
> struct drm_bridge *previous);
> -void drm_bridge_detach(struct drm_bridge *bridge);
>
> bool drm_bridge_mode_fixup(struct drm_bridge *bridge,
> const struct drm_display_mode *mode,
> diff --git a/include/drm/drm_simple_kms_helper.h b/include/drm/drm_simple_kms_helper.h
> index 01a8436ccb0a..2bbc610ec3a2 100644
> --- a/include/drm/drm_simple_kms_helper.h
> +++ b/include/drm/drm_simple_kms_helper.h
> @@ -114,8 +114,6 @@ struct drm_simple_display_pipe {
> int drm_simple_display_pipe_attach_bridge(struct drm_simple_display_pipe *pipe,
> struct drm_bridge *bridge);
>
> -void drm_simple_display_pipe_detach_bridge(struct drm_simple_display_pipe *pipe);
> -
> int drm_simple_display_pipe_init(struct drm_device *dev,
> struct drm_simple_display_pipe *pipe,
> const struct drm_simple_display_pipe_funcs *funcs,
> --
> Regards,
>
> Laurent Pinchart
>
> _______________________________________________
> dri-devel mailing list
> dri-devel@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/dri-devel
--
Daniel Vetter
Software Engineer, Intel Corporation
http://blog.ffwll.ch
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH v4 5/5] drm: bridge: Detach all bridges in a chain at encoder cleanup time
2016-12-14 9:59 ` [PATCH v4 5/5] drm: bridge: Detach all bridges in a chain " Laurent Pinchart
@ 2016-12-14 10:21 ` Daniel Vetter
0 siblings, 0 replies; 17+ messages in thread
From: Daniel Vetter @ 2016-12-14 10:21 UTC (permalink / raw)
To: Laurent Pinchart; +Cc: dri-devel
On Wed, Dec 14, 2016 at 11:59:10AM +0200, Laurent Pinchart wrote:
> Instead of detaching only the bridge directly connected to the encoder,
> detach all bridges in the chain.
>
> Signed-off-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
> ---
> drivers/gpu/drm/drm_encoder.c | 12 ++++++++++--
> 1 file changed, 10 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/gpu/drm/drm_encoder.c b/drivers/gpu/drm/drm_encoder.c
> index 0944f08abf58..5dde3c6b1467 100644
> --- a/drivers/gpu/drm/drm_encoder.c
> +++ b/drivers/gpu/drm/drm_encoder.c
> @@ -159,8 +159,16 @@ void drm_encoder_cleanup(struct drm_encoder *encoder)
> * the indices on the drm_encoder after us in the encoder_list.
> */
>
> - if (encoder->bridge)
> - drm_bridge_detach(encoder->bridge);
> + if (encoder->bridge) {
> + struct drm_bridge *bridge = encoder->bridge;
> + struct drm_bridge *next;
> +
> + while (bridge) {
> + next = bridge->next;
> + drm_bridge_detach(bridge);
> + bridge = next;
> + }
> + }
I wonder whether we should detach inside-out here. But I guess that can be
fixed once someone stumbles over this ;-)
Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Please push to drm-misc yourself, you haz commit rights and all that ;-)
-Daniel
>
> drm_mode_object_unregister(dev, &encoder->base);
> kfree(encoder->name);
> --
> Regards,
>
> Laurent Pinchart
>
> _______________________________________________
> dri-devel mailing list
> dri-devel@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/dri-devel
--
Daniel Vetter
Software Engineer, Intel Corporation
http://blog.ffwll.ch
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH v4 3/5] drm: bridge: Link encoder and bridge in core code
2016-12-14 9:59 ` [PATCH v4 3/5] drm: bridge: Link encoder and bridge in core code Laurent Pinchart
@ 2016-12-14 10:30 ` Maxime Ripard
2016-12-16 1:12 ` liuxinliang
` (2 subsequent siblings)
3 siblings, 0 replies; 17+ messages in thread
From: Maxime Ripard @ 2016-12-14 10:30 UTC (permalink / raw)
To: Laurent Pinchart
Cc: Xinliang Liu, Alexey Brodkin, Seung-Woo Kim, Xinwei Kong,
dri-devel, Kyungmin Park, Tomi Valkeinen, Jyri Sarha, Chen Feng,
Rongrong Zou, Chen-Yu Tsai
[-- Attachment #1.1: Type: text/plain, Size: 867 bytes --]
On Wed, Dec 14, 2016 at 11:59:08AM +0200, Laurent Pinchart wrote:
> Instead of linking encoders and bridges in every driver (and getting it
> wrong half of the time, as many drivers forget to set the drm_bridge
> encoder pointer), do so in core code. The drm_bridge_attach() function
> needs the encoder and optional previous bridge to perform that task,
> update all the callers.
>
> Signed-off-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
> Acked-by: Stefan Agner <stefan@agner.ch> # For DCU
> Acked-by: Boris Brezillon <boris.brezillon@free-electrons.com> # For atmel-hlcdc
> Acked-by: Vincent Abriou <vincent.abriou@st.com> # For STI
For sun4i,
Acked-by: Maxime Ripard <maxime.ripard@free-electrons.com>
Thanks,
Maxime
--
Maxime Ripard, Free Electrons
Embedded Linux and Kernel engineering
http://free-electrons.com
[-- Attachment #1.2: signature.asc --]
[-- Type: application/pgp-signature, Size: 801 bytes --]
[-- Attachment #2: Type: text/plain, Size: 160 bytes --]
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH v4 1/5] drm: Don't include <drm/drm_encoder.h> in <drm/drm_crtc.h>
2016-12-14 9:59 ` [PATCH v4 1/5] drm: Don't include <drm/drm_encoder.h> in <drm/drm_crtc.h> Laurent Pinchart
@ 2016-12-14 16:46 ` Alex Deucher
0 siblings, 0 replies; 17+ messages in thread
From: Alex Deucher @ 2016-12-14 16:46 UTC (permalink / raw)
To: Laurent Pinchart
Cc: Alison Wang, Maling list - DRI developers, Gerd Hoffmann,
Alex Deucher, Dave Airlie, Christian König, Ben Skeggs
On Wed, Dec 14, 2016 at 4:59 AM, Laurent Pinchart
<laurent.pinchart+renesas@ideasonboard.com> wrote:
> <drm/drm_crtc.h> used to define most of the in-kernel KMS API. It has
> now been split into separate files for each object type, but still
> includes most other KMS headers to avoid breaking driver compilation.
>
> As a step towards fixing that problem, remove the inclusion of
> <drm/drm_encoder.h> from <drm/drm_crtc.h> and include it instead where
> appropriate. Also remove the forward declarations of the drm_encoder and
> drm_encoder_helper_funcs structures from <drm/drm_crtc.h> as they're not
> needed in the header.
>
> <drm/drm_encoder.h> now has to include <drm/drm_mode.h> and contain a
> forward declaration of struct drm_encoder in order to allow including it
> as the first header in a compilation unit.
>
> Signed-off-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
> Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch>
> Reviewed-by: Sinclair Yeh <syeh@vmware.com> # For vmwgfx
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
> ---
> drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h | 1 +
> drivers/gpu/drm/ast/ast_drv.h | 1 +
> drivers/gpu/drm/bochs/bochs.h | 1 +
> drivers/gpu/drm/cirrus/cirrus_drv.h | 1 +
> drivers/gpu/drm/drm_connector.c | 1 +
> drivers/gpu/drm/drm_crtc_helper.c | 1 +
> drivers/gpu/drm/drm_edid.c | 1 +
> drivers/gpu/drm/drm_mode_config.c | 1 +
> drivers/gpu/drm/drm_of.c | 1 +
> drivers/gpu/drm/drm_plane_helper.c | 1 +
> drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_drv.h | 2 ++
> drivers/gpu/drm/gma500/psb_intel_drv.h | 1 +
> drivers/gpu/drm/i915/intel_drv.h | 1 +
> drivers/gpu/drm/mgag200/mgag200_drv.h | 1 +
> drivers/gpu/drm/nouveau/nouveau_connector.h | 1 +
> drivers/gpu/drm/qxl/qxl_drv.h | 1 +
> drivers/gpu/drm/radeon/radeon_mode.h | 1 +
> drivers/gpu/drm/rcar-du/rcar_du_encoder.h | 1 +
> drivers/gpu/drm/shmobile/shmob_drm_crtc.h | 1 +
> drivers/gpu/drm/tegra/drm.h | 1 +
> drivers/gpu/drm/vc4/vc4_drv.h | 2 ++
> drivers/gpu/drm/virtio/virtgpu_drv.h | 1 +
> drivers/gpu/drm/vmwgfx/vmwgfx_kms.h | 1 +
> include/drm/drm_crtc.h | 3 ---
> include/drm/drm_encoder.h | 3 +++
> include/drm/drm_encoder_slave.h | 1 +
> include/drm/drm_modeset_helper_vtables.h | 1 +
> 27 files changed, 30 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h
> index 202b4176b74e..b60346792bf8 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h
> @@ -32,6 +32,7 @@
>
> #include <drm/drm_crtc.h>
> #include <drm/drm_edid.h>
> +#include <drm/drm_encoder.h>
> #include <drm/drm_dp_helper.h>
> #include <drm/drm_fixed.h>
> #include <drm/drm_crtc_helper.h>
> diff --git a/drivers/gpu/drm/ast/ast_drv.h b/drivers/gpu/drm/ast/ast_drv.h
> index 908011d2c8f5..6f3b6f50cf52 100644
> --- a/drivers/gpu/drm/ast/ast_drv.h
> +++ b/drivers/gpu/drm/ast/ast_drv.h
> @@ -28,6 +28,7 @@
> #ifndef __AST_DRV_H__
> #define __AST_DRV_H__
>
> +#include <drm/drm_encoder.h>
> #include <drm/drm_fb_helper.h>
>
> #include <drm/ttm/ttm_bo_api.h>
> diff --git a/drivers/gpu/drm/bochs/bochs.h b/drivers/gpu/drm/bochs/bochs.h
> index 32dfe418cc98..f626bab7f5e3 100644
> --- a/drivers/gpu/drm/bochs/bochs.h
> +++ b/drivers/gpu/drm/bochs/bochs.h
> @@ -4,6 +4,7 @@
> #include <drm/drmP.h>
> #include <drm/drm_crtc.h>
> #include <drm/drm_crtc_helper.h>
> +#include <drm/drm_encoder.h>
> #include <drm/drm_fb_helper.h>
>
> #include <drm/drm_gem.h>
> diff --git a/drivers/gpu/drm/cirrus/cirrus_drv.h b/drivers/gpu/drm/cirrus/cirrus_drv.h
> index 2188d6b61b3e..b59aeef4635a 100644
> --- a/drivers/gpu/drm/cirrus/cirrus_drv.h
> +++ b/drivers/gpu/drm/cirrus/cirrus_drv.h
> @@ -13,6 +13,7 @@
>
> #include <video/vga.h>
>
> +#include <drm/drm_encoder.h>
> #include <drm/drm_fb_helper.h>
>
> #include <drm/ttm/ttm_bo_api.h>
> diff --git a/drivers/gpu/drm/drm_connector.c b/drivers/gpu/drm/drm_connector.c
> index 5a4526289392..40f8126a9738 100644
> --- a/drivers/gpu/drm/drm_connector.c
> +++ b/drivers/gpu/drm/drm_connector.c
> @@ -23,6 +23,7 @@
> #include <drm/drmP.h>
> #include <drm/drm_connector.h>
> #include <drm/drm_edid.h>
> +#include <drm/drm_encoder.h>
>
> #include "drm_crtc_internal.h"
> #include "drm_internal.h"
> diff --git a/drivers/gpu/drm/drm_crtc_helper.c b/drivers/gpu/drm/drm_crtc_helper.c
> index 5d2cb138eba6..b3fc23313cc3 100644
> --- a/drivers/gpu/drm/drm_crtc_helper.c
> +++ b/drivers/gpu/drm/drm_crtc_helper.c
> @@ -36,6 +36,7 @@
> #include <drm/drmP.h>
> #include <drm/drm_atomic.h>
> #include <drm/drm_crtc.h>
> +#include <drm/drm_encoder.h>
> #include <drm/drm_fourcc.h>
> #include <drm/drm_crtc_helper.h>
> #include <drm/drm_fb_helper.h>
> diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
> index 336be31ff3de..67d6a73731d8 100644
> --- a/drivers/gpu/drm/drm_edid.c
> +++ b/drivers/gpu/drm/drm_edid.c
> @@ -35,6 +35,7 @@
> #include <linux/vga_switcheroo.h>
> #include <drm/drmP.h>
> #include <drm/drm_edid.h>
> +#include <drm/drm_encoder.h>
> #include <drm/drm_displayid.h>
>
> #define version_greater(edid, maj, min) \
> diff --git a/drivers/gpu/drm/drm_mode_config.c b/drivers/gpu/drm/drm_mode_config.c
> index 2735a5847ffa..09b1d8f267a6 100644
> --- a/drivers/gpu/drm/drm_mode_config.c
> +++ b/drivers/gpu/drm/drm_mode_config.c
> @@ -20,6 +20,7 @@
> * OF THIS SOFTWARE.
> */
>
> +#include <drm/drm_encoder.h>
> #include <drm/drm_mode_config.h>
> #include <drm/drmP.h>
>
> diff --git a/drivers/gpu/drm/drm_of.c b/drivers/gpu/drm/drm_of.c
> index 47848ed8ca48..b5f2f0fece99 100644
> --- a/drivers/gpu/drm/drm_of.c
> +++ b/drivers/gpu/drm/drm_of.c
> @@ -4,6 +4,7 @@
> #include <linux/of_graph.h>
> #include <drm/drmP.h>
> #include <drm/drm_crtc.h>
> +#include <drm/drm_encoder.h>
> #include <drm/drm_of.h>
>
> static void drm_release_of(struct device *dev, void *data)
> diff --git a/drivers/gpu/drm/drm_plane_helper.c b/drivers/gpu/drm/drm_plane_helper.c
> index 7a7dddf604d7..191a5f095cf9 100644
> --- a/drivers/gpu/drm/drm_plane_helper.c
> +++ b/drivers/gpu/drm/drm_plane_helper.c
> @@ -29,6 +29,7 @@
> #include <drm/drm_rect.h>
> #include <drm/drm_atomic.h>
> #include <drm/drm_crtc_helper.h>
> +#include <drm/drm_encoder.h>
> #include <drm/drm_atomic_helper.h>
>
> #define SUBPIXEL_MASK 0xffff
> diff --git a/drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_drv.h b/drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_drv.h
> index e9e9aeecf2eb..da9bfd432ca6 100644
> --- a/drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_drv.h
> +++ b/drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_drv.h
> @@ -12,6 +12,8 @@
> #ifndef __FSL_DCU_DRM_DRV_H__
> #define __FSL_DCU_DRM_DRV_H__
>
> +#include <drm/drm_encoder.h>
> +
> #include "fsl_dcu_drm_crtc.h"
> #include "fsl_dcu_drm_output.h"
> #include "fsl_dcu_drm_plane.h"
> diff --git a/drivers/gpu/drm/gma500/psb_intel_drv.h b/drivers/gpu/drm/gma500/psb_intel_drv.h
> index 2a3b7c684db2..6a10215fc42d 100644
> --- a/drivers/gpu/drm/gma500/psb_intel_drv.h
> +++ b/drivers/gpu/drm/gma500/psb_intel_drv.h
> @@ -23,6 +23,7 @@
> #include <linux/i2c-algo-bit.h>
> #include <drm/drm_crtc.h>
> #include <drm/drm_crtc_helper.h>
> +#include <drm/drm_encoder.h>
> #include <linux/gpio.h>
> #include "gma_display.h"
>
> diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h
> index cd132c216a67..79dce55d4622 100644
> --- a/drivers/gpu/drm/i915/intel_drv.h
> +++ b/drivers/gpu/drm/i915/intel_drv.h
> @@ -32,6 +32,7 @@
> #include "i915_drv.h"
> #include <drm/drm_crtc.h>
> #include <drm/drm_crtc_helper.h>
> +#include <drm/drm_encoder.h>
> #include <drm/drm_fb_helper.h>
> #include <drm/drm_dp_dual_mode_helper.h>
> #include <drm/drm_dp_mst_helper.h>
> diff --git a/drivers/gpu/drm/mgag200/mgag200_drv.h b/drivers/gpu/drm/mgag200/mgag200_drv.h
> index 3e02ac20777c..87e0934773de 100644
> --- a/drivers/gpu/drm/mgag200/mgag200_drv.h
> +++ b/drivers/gpu/drm/mgag200/mgag200_drv.h
> @@ -15,6 +15,7 @@
>
> #include <video/vga.h>
>
> +#include <drm/drm_encoder.h>
> #include <drm/drm_fb_helper.h>
> #include <drm/ttm/ttm_bo_api.h>
> #include <drm/ttm/ttm_bo_driver.h>
> diff --git a/drivers/gpu/drm/nouveau/nouveau_connector.h b/drivers/gpu/drm/nouveau/nouveau_connector.h
> index 096983c42a1f..a4d1a059bd3d 100644
> --- a/drivers/gpu/drm/nouveau/nouveau_connector.h
> +++ b/drivers/gpu/drm/nouveau/nouveau_connector.h
> @@ -30,6 +30,7 @@
> #include <nvif/notify.h>
>
> #include <drm/drm_edid.h>
> +#include <drm/drm_encoder.h>
> #include <drm/drm_dp_helper.h>
> #include "nouveau_crtc.h"
>
> diff --git a/drivers/gpu/drm/qxl/qxl_drv.h b/drivers/gpu/drm/qxl/qxl_drv.h
> index 785aad42e9bb..f15ddd0eb85b 100644
> --- a/drivers/gpu/drm/qxl/qxl_drv.h
> +++ b/drivers/gpu/drm/qxl/qxl_drv.h
> @@ -43,6 +43,7 @@
> #include <ttm/ttm_placement.h>
> #include <ttm/ttm_module.h>
>
> +#include <drm/drm_encoder.h>
> #include <drm/drm_gem.h>
>
> /* just for ttm_validate_buffer */
> diff --git a/drivers/gpu/drm/radeon/radeon_mode.h b/drivers/gpu/drm/radeon/radeon_mode.h
> index f1da484864a9..ad282648fc8b 100644
> --- a/drivers/gpu/drm/radeon/radeon_mode.h
> +++ b/drivers/gpu/drm/radeon/radeon_mode.h
> @@ -32,6 +32,7 @@
>
> #include <drm/drm_crtc.h>
> #include <drm/drm_edid.h>
> +#include <drm/drm_encoder.h>
> #include <drm/drm_dp_helper.h>
> #include <drm/drm_dp_mst_helper.h>
> #include <drm/drm_fixed.h>
> diff --git a/drivers/gpu/drm/rcar-du/rcar_du_encoder.h b/drivers/gpu/drm/rcar-du/rcar_du_encoder.h
> index 269fbab15907..b79b2f075a74 100644
> --- a/drivers/gpu/drm/rcar-du/rcar_du_encoder.h
> +++ b/drivers/gpu/drm/rcar-du/rcar_du_encoder.h
> @@ -15,6 +15,7 @@
> #define __RCAR_DU_ENCODER_H__
>
> #include <drm/drm_crtc.h>
> +#include <drm/drm_encoder.h>
>
> struct drm_panel;
> struct rcar_du_device;
> diff --git a/drivers/gpu/drm/shmobile/shmob_drm_crtc.h b/drivers/gpu/drm/shmobile/shmob_drm_crtc.h
> index 38ed4ff8aaf2..818b31549ddc 100644
> --- a/drivers/gpu/drm/shmobile/shmob_drm_crtc.h
> +++ b/drivers/gpu/drm/shmobile/shmob_drm_crtc.h
> @@ -16,6 +16,7 @@
>
> #include <drm/drmP.h>
> #include <drm/drm_crtc.h>
> +#include <drm/drm_encoder.h>
>
> struct backlight_device;
> struct shmob_drm_device;
> diff --git a/drivers/gpu/drm/tegra/drm.h b/drivers/gpu/drm/tegra/drm.h
> index 0ddcce1b420d..5205790dd679 100644
> --- a/drivers/gpu/drm/tegra/drm.h
> +++ b/drivers/gpu/drm/tegra/drm.h
> @@ -17,6 +17,7 @@
> #include <drm/drmP.h>
> #include <drm/drm_crtc_helper.h>
> #include <drm/drm_edid.h>
> +#include <drm/drm_encoder.h>
> #include <drm/drm_fb_helper.h>
> #include <drm/drm_fixed.h>
>
> diff --git a/drivers/gpu/drm/vc4/vc4_drv.h b/drivers/gpu/drm/vc4/vc4_drv.h
> index b5c4bb14d0d1..489956efbff8 100644
> --- a/drivers/gpu/drm/vc4/vc4_drv.h
> +++ b/drivers/gpu/drm/vc4/vc4_drv.h
> @@ -9,6 +9,8 @@
> #include "drmP.h"
> #include "drm_gem_cma_helper.h"
>
> +#include <drm/drm_encoder.h>
> +
> struct vc4_dev {
> struct drm_device *dev;
>
> diff --git a/drivers/gpu/drm/virtio/virtgpu_drv.h b/drivers/gpu/drm/virtio/virtgpu_drv.h
> index 08906c8ce3fa..025f2e3d483f 100644
> --- a/drivers/gpu/drm/virtio/virtgpu_drv.h
> +++ b/drivers/gpu/drm/virtio/virtgpu_drv.h
> @@ -35,6 +35,7 @@
> #include <drm/drm_gem.h>
> #include <drm/drm_atomic.h>
> #include <drm/drm_crtc_helper.h>
> +#include <drm/drm_encoder.h>
> #include <ttm/ttm_bo_api.h>
> #include <ttm/ttm_bo_driver.h>
> #include <ttm/ttm_placement.h>
> diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_kms.h b/drivers/gpu/drm/vmwgfx/vmwgfx_kms.h
> index f42ce9a1c3ac..cb36e1d70133 100644
> --- a/drivers/gpu/drm/vmwgfx/vmwgfx_kms.h
> +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_kms.h
> @@ -30,6 +30,7 @@
>
> #include <drm/drmP.h>
> #include <drm/drm_crtc_helper.h>
> +#include <drm/drm_encoder.h>
> #include "vmwgfx_drv.h"
>
> /**
> diff --git a/include/drm/drm_crtc.h b/include/drm/drm_crtc.h
> index 946672f97e1e..9ef0ac0ce69f 100644
> --- a/include/drm/drm_crtc.h
> +++ b/include/drm/drm_crtc.h
> @@ -39,7 +39,6 @@
> #include <drm/drm_framebuffer.h>
> #include <drm/drm_modes.h>
> #include <drm/drm_connector.h>
> -#include <drm/drm_encoder.h>
> #include <drm/drm_property.h>
> #include <drm/drm_bridge.h>
> #include <drm/drm_edid.h>
> @@ -68,14 +67,12 @@ static inline uint64_t I642U64(int64_t val)
> }
>
> struct drm_crtc;
> -struct drm_encoder;
> struct drm_pending_vblank_event;
> struct drm_plane;
> struct drm_bridge;
> struct drm_atomic_state;
>
> struct drm_crtc_helper_funcs;
> -struct drm_encoder_helper_funcs;
> struct drm_plane_helper_funcs;
>
> /**
> diff --git a/include/drm/drm_encoder.h b/include/drm/drm_encoder.h
> index c7438ff0d609..cec6ac45c6cc 100644
> --- a/include/drm/drm_encoder.h
> +++ b/include/drm/drm_encoder.h
> @@ -25,8 +25,11 @@
>
> #include <linux/list.h>
> #include <linux/ctype.h>
> +#include <drm/drm_mode.h>
> #include <drm/drm_mode_object.h>
>
> +struct drm_encoder;
> +
> /**
> * struct drm_encoder_funcs - encoder controls
> *
> diff --git a/include/drm/drm_encoder_slave.h b/include/drm/drm_encoder_slave.h
> index 82cdf611393d..1107b4b1c599 100644
> --- a/include/drm/drm_encoder_slave.h
> +++ b/include/drm/drm_encoder_slave.h
> @@ -29,6 +29,7 @@
>
> #include <drm/drmP.h>
> #include <drm/drm_crtc.h>
> +#include <drm/drm_encoder.h>
>
> /**
> * struct drm_encoder_slave_funcs - Entry points exposed by a slave encoder driver
> diff --git a/include/drm/drm_modeset_helper_vtables.h b/include/drm/drm_modeset_helper_vtables.h
> index 69c3974bf133..625c7475c5df 100644
> --- a/include/drm/drm_modeset_helper_vtables.h
> +++ b/include/drm/drm_modeset_helper_vtables.h
> @@ -30,6 +30,7 @@
> #define __DRM_MODESET_HELPER_VTABLES_H__
>
> #include <drm/drm_crtc.h>
> +#include <drm/drm_encoder.h>
>
> /**
> * DOC: overview
> --
> Regards,
>
> Laurent Pinchart
>
> _______________________________________________
> dri-devel mailing list
> dri-devel@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/dri-devel
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH v4 3/5] drm: bridge: Link encoder and bridge in core code
2016-12-14 9:59 ` [PATCH v4 3/5] drm: bridge: Link encoder and bridge in core code Laurent Pinchart
2016-12-14 10:30 ` Maxime Ripard
@ 2016-12-16 1:12 ` liuxinliang
2016-12-16 8:35 ` Archit Taneja
2016-12-16 9:17 ` Jyri Sarha
3 siblings, 0 replies; 17+ messages in thread
From: liuxinliang @ 2016-12-16 1:12 UTC (permalink / raw)
To: Laurent Pinchart, dri-devel
Cc: Alexey Brodkin, Seung-Woo Kim, Xinwei Kong, Jyri Sarha,
Kyungmin Park, Tomi Valkeinen, Chen Feng, Rongrong Zou,
Maxime Ripard, Chen-Yu Tsai
On 2016/12/14 17:59, Laurent Pinchart wrote:
> int fsl_dcu_create_outputs(struct fsl_dcu_drm_device *fsl_dev)
> diff --git a/drivers/gpu/drm/hisilicon/kirin/dw_drm_dsi.c b/drivers/gpu/drm/hisilicon/kirin/dw_drm_dsi.c
> index 998452ad0fcb..1737e98bc10a 100644
> --- a/drivers/gpu/drm/hisilicon/kirin/dw_drm_dsi.c
> +++ b/drivers/gpu/drm/hisilicon/kirin/dw_drm_dsi.c
> @@ -709,10 +709,7 @@ static int dsi_bridge_init(struct drm_device *dev, struct dw_dsi *dsi)
> int ret;
>
> /* associate the bridge to dsi encoder */
> - encoder->bridge = bridge;
> - bridge->encoder = encoder;
> -
> - ret = drm_bridge_attach(dev, bridge);
> + ret = drm_bridge_attach(encoder, bridge, NULL);
> if (ret) {
> DRM_ERROR("failed to attach external bridge\n");
> return ret;
For hisilicon,
Acked-by: Xinliang Liu <z.liuxinliang@hisilicon.com>
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH v4 3/5] drm: bridge: Link encoder and bridge in core code
2016-12-14 9:59 ` [PATCH v4 3/5] drm: bridge: Link encoder and bridge in core code Laurent Pinchart
2016-12-14 10:30 ` Maxime Ripard
2016-12-16 1:12 ` liuxinliang
@ 2016-12-16 8:35 ` Archit Taneja
2016-12-16 13:29 ` Daniel Vetter
2016-12-23 11:10 ` Philipp Zabel
2016-12-16 9:17 ` Jyri Sarha
3 siblings, 2 replies; 17+ messages in thread
From: Archit Taneja @ 2016-12-16 8:35 UTC (permalink / raw)
To: Laurent Pinchart, dri-devel
Cc: Xinliang Liu, Alexey Brodkin, Seung-Woo Kim, Xinwei Kong,
Jyri Sarha, Kyungmin Park, Tomi Valkeinen, Chen Feng,
Rongrong Zou, Maxime Ripard, Chen-Yu Tsai
Hi,
On 12/14/2016 03:29 PM, Laurent Pinchart wrote:
> Instead of linking encoders and bridges in every driver (and getting it
> wrong half of the time, as many drivers forget to set the drm_bridge
> encoder pointer), do so in core code. The drm_bridge_attach() function
> needs the encoder and optional previous bridge to perform that task,
> update all the callers.
>
> Signed-off-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
> Acked-by: Stefan Agner <stefan@agner.ch> # For DCU
> Acked-by: Boris Brezillon <boris.brezillon@free-electrons.com> # For atmel-hlcdc
> Acked-by: Vincent Abriou <vincent.abriou@st.com> # For STI
This one needs acks for arcgpu, tilcdc, mediatek and imx. The changes in
those drivers look good to me, though. Will push it in a day or so unless anyone
has any comments on it.
Thanks,
Archit
> ---
> drivers/gpu/drm/arc/arcpgu_hdmi.c | 5 +--
> drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_output.c | 4 +-
> drivers/gpu/drm/bridge/analogix/analogix_dp_core.c | 4 +-
> drivers/gpu/drm/bridge/dw-hdmi.c | 3 +-
> drivers/gpu/drm/drm_bridge.c | 46 ++++++++++++++++------
> drivers/gpu/drm/drm_simple_kms_helper.c | 4 +-
> drivers/gpu/drm/exynos/exynos_dp.c | 5 +--
> drivers/gpu/drm/exynos/exynos_drm_dsi.c | 6 +--
> drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_rgb.c | 5 +--
> drivers/gpu/drm/hisilicon/kirin/dw_drm_dsi.c | 5 +--
> drivers/gpu/drm/imx/imx-ldb.c | 6 +--
> drivers/gpu/drm/imx/parallel-display.c | 4 +-
> drivers/gpu/drm/mediatek/mtk_dpi.c | 8 ++--
> drivers/gpu/drm/mediatek/mtk_dsi.c | 24 ++---------
> drivers/gpu/drm/mediatek/mtk_hdmi.c | 11 +++---
> drivers/gpu/drm/msm/dsi/dsi_manager.c | 17 +++++---
> drivers/gpu/drm/msm/edp/edp_bridge.c | 2 +-
> drivers/gpu/drm/msm/hdmi/hdmi_bridge.c | 2 +-
> drivers/gpu/drm/rcar-du/rcar_du_hdmienc.c | 5 +--
> drivers/gpu/drm/sti/sti_dvo.c | 3 +-
> drivers/gpu/drm/sti/sti_hda.c | 3 +-
> drivers/gpu/drm/sti/sti_hdmi.c | 3 +-
> drivers/gpu/drm/sun4i/sun4i_rgb.c | 13 +++---
> drivers/gpu/drm/tilcdc/tilcdc_external.c | 4 +-
> include/drm/drm_bridge.h | 3 +-
> 25 files changed, 85 insertions(+), 110 deletions(-)
>
> diff --git a/drivers/gpu/drm/arc/arcpgu_hdmi.c b/drivers/gpu/drm/arc/arcpgu_hdmi.c
> index b69c66b4897e..0ce7f398bcff 100644
> --- a/drivers/gpu/drm/arc/arcpgu_hdmi.c
> +++ b/drivers/gpu/drm/arc/arcpgu_hdmi.c
> @@ -47,10 +47,7 @@ int arcpgu_drm_hdmi_init(struct drm_device *drm, struct device_node *np)
> return ret;
>
> /* Link drm_bridge to encoder */
> - bridge->encoder = encoder;
> - encoder->bridge = bridge;
> -
> - ret = drm_bridge_attach(drm, bridge);
> + ret = drm_bridge_attach(encoder, bridge, NULL);
> if (ret)
> drm_encoder_cleanup(encoder);
>
> diff --git a/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_output.c b/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_output.c
> index 6119b5085501..e7799b6ee829 100644
> --- a/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_output.c
> +++ b/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_output.c
> @@ -230,9 +230,7 @@ static int atmel_hlcdc_attach_endpoint(struct drm_device *dev,
> of_node_put(np);
>
> if (bridge) {
> - output->encoder.bridge = bridge;
> - bridge->encoder = &output->encoder;
> - ret = drm_bridge_attach(dev, bridge);
> + ret = drm_bridge_attach(&output->encoder, bridge, NULL);
> if (!ret)
> return 0;
> }
> diff --git a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c
> index eb9bf8786c24..b7494c8d43fe 100644
> --- a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c
> +++ b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c
> @@ -1227,12 +1227,10 @@ static int analogix_dp_create_bridge(struct drm_device *drm_dev,
>
> dp->bridge = bridge;
>
> - dp->encoder->bridge = bridge;
> bridge->driver_private = dp;
> - bridge->encoder = dp->encoder;
> bridge->funcs = &analogix_dp_bridge_funcs;
>
> - ret = drm_bridge_attach(drm_dev, bridge);
> + ret = drm_bridge_attach(dp->encoder, bridge, NULL);
> if (ret) {
> DRM_ERROR("failed to attach drm bridge\n");
> return -EINVAL;
> diff --git a/drivers/gpu/drm/bridge/dw-hdmi.c b/drivers/gpu/drm/bridge/dw-hdmi.c
> index 235ce7d1583d..f5009ae39b89 100644
> --- a/drivers/gpu/drm/bridge/dw-hdmi.c
> +++ b/drivers/gpu/drm/bridge/dw-hdmi.c
> @@ -1841,13 +1841,12 @@ static int dw_hdmi_register(struct drm_device *drm, struct dw_hdmi *hdmi)
> hdmi->bridge = bridge;
> bridge->driver_private = hdmi;
> bridge->funcs = &dw_hdmi_bridge_funcs;
> - ret = drm_bridge_attach(drm, bridge);
> + ret = drm_bridge_attach(encoder, bridge, NULL);
> if (ret) {
> DRM_ERROR("Failed to initialize bridge with drm\n");
> return -EINVAL;
> }
>
> - encoder->bridge = bridge;
> hdmi->connector.polled = DRM_CONNECTOR_POLL_HPD;
>
> drm_connector_helper_add(&hdmi->connector,
> diff --git a/drivers/gpu/drm/drm_bridge.c b/drivers/gpu/drm/drm_bridge.c
> index 0ee052b7c21a..850bd6509ef1 100644
> --- a/drivers/gpu/drm/drm_bridge.c
> +++ b/drivers/gpu/drm/drm_bridge.c
> @@ -26,6 +26,7 @@
> #include <linux/mutex.h>
>
> #include <drm/drm_bridge.h>
> +#include <drm/drm_encoder.h>
>
> /**
> * DOC: overview
> @@ -92,32 +93,53 @@ void drm_bridge_remove(struct drm_bridge *bridge)
> EXPORT_SYMBOL(drm_bridge_remove);
>
> /**
> - * drm_bridge_attach - associate given bridge to our DRM device
> + * drm_bridge_attach - attach the bridge to an encoder's chain
> *
> - * @dev: DRM device
> - * @bridge: bridge control structure
> + * @encoder: DRM encoder
> + * @bridge: bridge to attach
> + * @previous: previous bridge in the chain (optional)
> *
> - * Called by a kms driver to link one of our encoder/bridge to the given
> - * bridge.
> + * Called by a kms driver to link the bridge to an encoder's chain. The previous
> + * argument specifies the previous bridge in the chain. If NULL, the bridge is
> + * linked directly at the encoder's output. Otherwise it is linked at the
> + * previous bridge's output.
> *
> - * Note that setting up links between the bridge and our encoder/bridge
> - * objects needs to be handled by the kms driver itself.
> + * If non-NULL the previous bridge must be already attached by a call to this
> + * function.
> *
> * RETURNS:
> * Zero on success, error code on failure
> */
> -int drm_bridge_attach(struct drm_device *dev, struct drm_bridge *bridge)
> +int drm_bridge_attach(struct drm_encoder *encoder, struct drm_bridge *bridge,
> + struct drm_bridge *previous)
> {
> - if (!dev || !bridge)
> + int ret;
> +
> + if (!encoder || !bridge)
> + return -EINVAL;
> +
> + if (previous && (!previous->dev || previous->encoder != encoder))
> return -EINVAL;
>
> if (bridge->dev)
> return -EBUSY;
>
> - bridge->dev = dev;
> + bridge->dev = encoder->dev;
> + bridge->encoder = encoder;
> +
> + if (bridge->funcs->attach) {
> + ret = bridge->funcs->attach(bridge);
> + if (ret < 0) {
> + bridge->dev = NULL;
> + bridge->encoder = NULL;
> + return ret;
> + }
> + }
>
> - if (bridge->funcs->attach)
> - return bridge->funcs->attach(bridge);
> + if (previous)
> + previous->next = bridge;
> + else
> + encoder->bridge = bridge;
>
> return 0;
> }
> diff --git a/drivers/gpu/drm/drm_simple_kms_helper.c b/drivers/gpu/drm/drm_simple_kms_helper.c
> index 7bae08c2bf0a..ba7be6169339 100644
> --- a/drivers/gpu/drm/drm_simple_kms_helper.c
> +++ b/drivers/gpu/drm/drm_simple_kms_helper.c
> @@ -182,9 +182,7 @@ static const struct drm_plane_funcs drm_simple_kms_plane_funcs = {
> int drm_simple_display_pipe_attach_bridge(struct drm_simple_display_pipe *pipe,
> struct drm_bridge *bridge)
> {
> - bridge->encoder = &pipe->encoder;
> - pipe->encoder.bridge = bridge;
> - return drm_bridge_attach(pipe->encoder.dev, bridge);
> + return drm_bridge_attach(&pipe->encoder, bridge, NULL);
> }
> EXPORT_SYMBOL(drm_simple_display_pipe_attach_bridge);
>
> diff --git a/drivers/gpu/drm/exynos/exynos_dp.c b/drivers/gpu/drm/exynos/exynos_dp.c
> index 528229faffe4..1ef0be338b85 100644
> --- a/drivers/gpu/drm/exynos/exynos_dp.c
> +++ b/drivers/gpu/drm/exynos/exynos_dp.c
> @@ -99,7 +99,6 @@ static int exynos_dp_bridge_attach(struct analogix_dp_plat_data *plat_data,
> struct drm_connector *connector)
> {
> struct exynos_dp_device *dp = to_dp(plat_data);
> - struct drm_encoder *encoder = &dp->encoder;
> int ret;
>
> drm_connector_register(connector);
> @@ -107,9 +106,7 @@ static int exynos_dp_bridge_attach(struct analogix_dp_plat_data *plat_data,
>
> /* Pre-empt DP connector creation if there's a bridge */
> if (dp->ptn_bridge) {
> - bridge->next = dp->ptn_bridge;
> - dp->ptn_bridge->encoder = encoder;
> - ret = drm_bridge_attach(encoder->dev, dp->ptn_bridge);
> + ret = drm_bridge_attach(&dp->encoder, dp->ptn_bridge, bridge);
> if (ret) {
> DRM_ERROR("Failed to attach bridge to drm\n");
> bridge->next = NULL;
> diff --git a/drivers/gpu/drm/exynos/exynos_drm_dsi.c b/drivers/gpu/drm/exynos/exynos_drm_dsi.c
> index e07cb1fe4860..812e2ec0761d 100644
> --- a/drivers/gpu/drm/exynos/exynos_drm_dsi.c
> +++ b/drivers/gpu/drm/exynos/exynos_drm_dsi.c
> @@ -1718,10 +1718,8 @@ static int exynos_dsi_bind(struct device *dev, struct device *master,
> }
>
> bridge = of_drm_find_bridge(dsi->bridge_node);
> - if (bridge) {
> - encoder->bridge = bridge;
> - drm_bridge_attach(drm_dev, bridge);
> - }
> + if (bridge)
> + drm_bridge_attach(encoder, bridge, NULL);
>
> return mipi_dsi_host_register(&dsi->dsi_host);
> }
> diff --git a/drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_rgb.c b/drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_rgb.c
> index 05a8ee106879..c3651456c963 100644
> --- a/drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_rgb.c
> +++ b/drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_rgb.c
> @@ -160,10 +160,7 @@ static int fsl_dcu_attach_endpoint(struct fsl_dcu_drm_device *fsl_dev,
> if (!bridge)
> return -ENODEV;
>
> - fsl_dev->encoder.bridge = bridge;
> - bridge->encoder = &fsl_dev->encoder;
> -
> - return drm_bridge_attach(fsl_dev->drm, bridge);
> + return drm_bridge_attach(&fsl_dev->encoder, bridge, NULL);
> }
>
> int fsl_dcu_create_outputs(struct fsl_dcu_drm_device *fsl_dev)
> diff --git a/drivers/gpu/drm/hisilicon/kirin/dw_drm_dsi.c b/drivers/gpu/drm/hisilicon/kirin/dw_drm_dsi.c
> index 998452ad0fcb..1737e98bc10a 100644
> --- a/drivers/gpu/drm/hisilicon/kirin/dw_drm_dsi.c
> +++ b/drivers/gpu/drm/hisilicon/kirin/dw_drm_dsi.c
> @@ -709,10 +709,7 @@ static int dsi_bridge_init(struct drm_device *dev, struct dw_dsi *dsi)
> int ret;
>
> /* associate the bridge to dsi encoder */
> - encoder->bridge = bridge;
> - bridge->encoder = encoder;
> -
> - ret = drm_bridge_attach(dev, bridge);
> + ret = drm_bridge_attach(encoder, bridge, NULL);
> if (ret) {
> DRM_ERROR("failed to attach external bridge\n");
> return ret;
> diff --git a/drivers/gpu/drm/imx/imx-ldb.c b/drivers/gpu/drm/imx/imx-ldb.c
> index 516d06490465..ec49ea3d8e40 100644
> --- a/drivers/gpu/drm/imx/imx-ldb.c
> +++ b/drivers/gpu/drm/imx/imx-ldb.c
> @@ -454,10 +454,8 @@ static int imx_ldb_register(struct drm_device *drm,
> DRM_MODE_ENCODER_LVDS, NULL);
>
> if (imx_ldb_ch->bridge) {
> - imx_ldb_ch->bridge->encoder = encoder;
> -
> - imx_ldb_ch->encoder.bridge = imx_ldb_ch->bridge;
> - ret = drm_bridge_attach(drm, imx_ldb_ch->bridge);
> + ret = drm_bridge_attach(&imx_ldb_ch->encoder,
> + imx_ldb_ch->bridge, NULL);
> if (ret) {
> DRM_ERROR("Failed to initialize bridge with drm\n");
> return ret;
> diff --git a/drivers/gpu/drm/imx/parallel-display.c b/drivers/gpu/drm/imx/parallel-display.c
> index 8582a83c0d9b..51d9f735c358 100644
> --- a/drivers/gpu/drm/imx/parallel-display.c
> +++ b/drivers/gpu/drm/imx/parallel-display.c
> @@ -191,9 +191,7 @@ static int imx_pd_register(struct drm_device *drm,
> drm_panel_attach(imxpd->panel, &imxpd->connector);
>
> if (imxpd->bridge) {
> - imxpd->bridge->encoder = encoder;
> - encoder->bridge = imxpd->bridge;
> - ret = drm_bridge_attach(drm, imxpd->bridge);
> + ret = drm_bridge_attach(encoder, imxpd->bridge, NULL);
> if (ret < 0) {
> dev_err(imxpd->dev, "failed to attach bridge: %d\n",
> ret);
> diff --git a/drivers/gpu/drm/mediatek/mtk_dpi.c b/drivers/gpu/drm/mediatek/mtk_dpi.c
> index 90fb831ef031..3bd3bd688d1a 100644
> --- a/drivers/gpu/drm/mediatek/mtk_dpi.c
> +++ b/drivers/gpu/drm/mediatek/mtk_dpi.c
> @@ -63,6 +63,7 @@ enum mtk_dpi_out_color_format {
> struct mtk_dpi {
> struct mtk_ddp_comp ddp_comp;
> struct drm_encoder encoder;
> + struct drm_bridge *bridge;
> void __iomem *regs;
> struct device *dev;
> struct clk *engine_clk;
> @@ -620,8 +621,7 @@ static int mtk_dpi_bind(struct device *dev, struct device *master, void *data)
> /* Currently DPI0 is fixed to be driven by OVL1 */
> dpi->encoder.possible_crtcs = BIT(1);
>
> - dpi->encoder.bridge->encoder = &dpi->encoder;
> - ret = drm_bridge_attach(dpi->encoder.dev, dpi->encoder.bridge);
> + ret = drm_bridge_attach(&dpi->encoder, dpi->bridge, NULL);
> if (ret) {
> dev_err(dev, "Failed to attach bridge: %d\n", ret);
> goto err_cleanup;
> @@ -718,9 +718,9 @@ static int mtk_dpi_probe(struct platform_device *pdev)
>
> dev_info(dev, "Found bridge node: %s\n", bridge_node->full_name);
>
> - dpi->encoder.bridge = of_drm_find_bridge(bridge_node);
> + dpi->bridge = of_drm_find_bridge(bridge_node);
> of_node_put(bridge_node);
> - if (!dpi->encoder.bridge)
> + if (!dpi->bridge)
> return -EPROBE_DEFER;
>
> comp_id = mtk_ddp_comp_get_id(dev->of_node, MTK_DPI);
> diff --git a/drivers/gpu/drm/mediatek/mtk_dsi.c b/drivers/gpu/drm/mediatek/mtk_dsi.c
> index 2c42f90809d8..dd71cbb1a622 100644
> --- a/drivers/gpu/drm/mediatek/mtk_dsi.c
> +++ b/drivers/gpu/drm/mediatek/mtk_dsi.c
> @@ -622,26 +622,6 @@ static const struct drm_connector_helper_funcs
> .get_modes = mtk_dsi_connector_get_modes,
> };
>
> -static int mtk_drm_attach_bridge(struct drm_bridge *bridge,
> - struct drm_encoder *encoder)
> -{
> - int ret;
> -
> - if (!bridge)
> - return -ENOENT;
> -
> - encoder->bridge = bridge;
> - bridge->encoder = encoder;
> - ret = drm_bridge_attach(encoder->dev, bridge);
> - if (ret) {
> - DRM_ERROR("Failed to attach bridge to drm\n");
> - encoder->bridge = NULL;
> - bridge->encoder = NULL;
> - }
> -
> - return ret;
> -}
> -
> static int mtk_dsi_create_connector(struct drm_device *drm, struct mtk_dsi *dsi)
> {
> int ret;
> @@ -692,8 +672,10 @@ static int mtk_dsi_create_conn_enc(struct drm_device *drm, struct mtk_dsi *dsi)
> dsi->encoder.possible_crtcs = 1;
>
> /* If there's a bridge, attach to it and let it create the connector */
> - ret = mtk_drm_attach_bridge(dsi->bridge, &dsi->encoder);
> + ret = drm_bridge_attach(&dsi->encoder, dsi->bridge, NULL);
> if (ret) {
> + DRM_ERROR("Failed to attach bridge to drm\n");
> +
> /* Otherwise create our own connector and attach to a panel */
> ret = mtk_dsi_create_connector(drm, dsi);
> if (ret)
> diff --git a/drivers/gpu/drm/mediatek/mtk_hdmi.c b/drivers/gpu/drm/mediatek/mtk_hdmi.c
> index 0e8c4d9af340..c26251260b83 100644
> --- a/drivers/gpu/drm/mediatek/mtk_hdmi.c
> +++ b/drivers/gpu/drm/mediatek/mtk_hdmi.c
> @@ -149,6 +149,7 @@ struct hdmi_audio_param {
>
> struct mtk_hdmi {
> struct drm_bridge bridge;
> + struct drm_bridge *next_bridge;
> struct drm_connector conn;
> struct device *dev;
> struct phy *phy;
> @@ -1314,9 +1315,9 @@ static int mtk_hdmi_bridge_attach(struct drm_bridge *bridge)
> return ret;
> }
>
> - if (bridge->next) {
> - bridge->next->encoder = bridge->encoder;
> - ret = drm_bridge_attach(bridge->encoder->dev, bridge->next);
> + if (hdmi->next_bridge) {
> + ret = drm_bridge_attach(bridge->encoder, hdmi->next_bridge,
> + bridge);
> if (ret) {
> dev_err(hdmi->dev,
> "Failed to attach external bridge: %d\n", ret);
> @@ -1510,8 +1511,8 @@ static int mtk_hdmi_dt_parse_pdata(struct mtk_hdmi *hdmi,
> of_node_put(ep);
>
> if (!of_device_is_compatible(remote, "hdmi-connector")) {
> - hdmi->bridge.next = of_drm_find_bridge(remote);
> - if (!hdmi->bridge.next) {
> + hdmi->next_bridge = of_drm_find_bridge(remote);
> + if (!hdmi->next_bridge) {
> dev_err(dev, "Waiting for external bridge\n");
> of_node_put(remote);
> return -EPROBE_DEFER;
> diff --git a/drivers/gpu/drm/msm/dsi/dsi_manager.c b/drivers/gpu/drm/msm/dsi/dsi_manager.c
> index c8d1f19c9a6d..2bd8dad76105 100644
> --- a/drivers/gpu/drm/msm/dsi/dsi_manager.c
> +++ b/drivers/gpu/drm/msm/dsi/dsi_manager.c
> @@ -579,6 +579,7 @@ struct drm_bridge *msm_dsi_manager_bridge_init(u8 id)
> struct msm_dsi *msm_dsi = dsi_mgr_get_dsi(id);
> struct drm_bridge *bridge = NULL;
> struct dsi_bridge *dsi_bridge;
> + struct drm_encoder *encoder;
> int ret;
>
> dsi_bridge = devm_kzalloc(msm_dsi->dev->dev,
> @@ -590,10 +591,18 @@ struct drm_bridge *msm_dsi_manager_bridge_init(u8 id)
>
> dsi_bridge->id = id;
>
> + /*
> + * HACK: we may not know the external DSI bridge device's mode
> + * flags here. We'll get to know them only when the device
> + * attaches to the dsi host. For now, assume the bridge supports
> + * DSI video mode
> + */
> + encoder = msm_dsi->encoders[MSM_DSI_VIDEO_ENCODER_ID];
> +
> bridge = &dsi_bridge->base;
> bridge->funcs = &dsi_mgr_bridge_funcs;
>
> - ret = drm_bridge_attach(msm_dsi->dev, bridge);
> + ret = drm_bridge_attach(encoder, bridge, NULL);
> if (ret)
> goto fail;
>
> @@ -628,11 +637,7 @@ struct drm_connector *msm_dsi_manager_ext_bridge_init(u8 id)
> encoder = msm_dsi->encoders[MSM_DSI_VIDEO_ENCODER_ID];
>
> /* link the internal dsi bridge to the external bridge */
> - int_bridge->next = ext_bridge;
> - /* set the external bridge's encoder as dsi's encoder */
> - ext_bridge->encoder = encoder;
> -
> - drm_bridge_attach(dev, ext_bridge);
> + drm_bridge_attach(encoder, ext_bridge, int_bridge);
>
> /*
> * we need the drm_connector created by the external bridge
> diff --git a/drivers/gpu/drm/msm/edp/edp_bridge.c b/drivers/gpu/drm/msm/edp/edp_bridge.c
> index 2bc73f82f3f5..931a5c97cccf 100644
> --- a/drivers/gpu/drm/msm/edp/edp_bridge.c
> +++ b/drivers/gpu/drm/msm/edp/edp_bridge.c
> @@ -106,7 +106,7 @@ struct drm_bridge *msm_edp_bridge_init(struct msm_edp *edp)
> bridge = &edp_bridge->base;
> bridge->funcs = &edp_bridge_funcs;
>
> - ret = drm_bridge_attach(edp->dev, bridge);
> + ret = drm_bridge_attach(edp->encoder, bridge, NULL);
> if (ret)
> goto fail;
>
> diff --git a/drivers/gpu/drm/msm/hdmi/hdmi_bridge.c b/drivers/gpu/drm/msm/hdmi/hdmi_bridge.c
> index bacbd5d8df0e..4e6d1bf27474 100644
> --- a/drivers/gpu/drm/msm/hdmi/hdmi_bridge.c
> +++ b/drivers/gpu/drm/msm/hdmi/hdmi_bridge.c
> @@ -227,7 +227,7 @@ struct drm_bridge *msm_hdmi_bridge_init(struct hdmi *hdmi)
> bridge = &hdmi_bridge->base;
> bridge->funcs = &msm_hdmi_bridge_funcs;
>
> - ret = drm_bridge_attach(hdmi->dev, bridge);
> + ret = drm_bridge_attach(hdmi->encoder, bridge, NULL);
> if (ret)
> goto fail;
>
> diff --git a/drivers/gpu/drm/rcar-du/rcar_du_hdmienc.c b/drivers/gpu/drm/rcar-du/rcar_du_hdmienc.c
> index a1a2c5e7822c..933a2547798e 100644
> --- a/drivers/gpu/drm/rcar-du/rcar_du_hdmienc.c
> +++ b/drivers/gpu/drm/rcar-du/rcar_du_hdmienc.c
> @@ -124,10 +124,7 @@ int rcar_du_hdmienc_init(struct rcar_du_device *rcdu,
> hdmienc->renc = renc;
>
> /* Link the bridge to the encoder. */
> - bridge->encoder = encoder;
> - encoder->bridge = bridge;
> -
> - ret = drm_bridge_attach(rcdu->ddev, bridge);
> + ret = drm_bridge_attach(encoder, bridge, NULL);
> if (ret) {
> drm_encoder_cleanup(encoder);
> return ret;
> diff --git a/drivers/gpu/drm/sti/sti_dvo.c b/drivers/gpu/drm/sti/sti_dvo.c
> index e8c1ed08a9f7..411dc6ec976e 100644
> --- a/drivers/gpu/drm/sti/sti_dvo.c
> +++ b/drivers/gpu/drm/sti/sti_dvo.c
> @@ -478,14 +478,13 @@ static int sti_dvo_bind(struct device *dev, struct device *master, void *data)
> return err;
> }
>
> - err = drm_bridge_attach(drm_dev, bridge);
> + err = drm_bridge_attach(encoder, bridge, NULL);
> if (err) {
> DRM_ERROR("Failed to attach bridge\n");
> return err;
> }
>
> dvo->bridge = bridge;
> - encoder->bridge = bridge;
> connector->encoder = encoder;
> dvo->encoder = encoder;
>
> diff --git a/drivers/gpu/drm/sti/sti_hda.c b/drivers/gpu/drm/sti/sti_hda.c
> index 96f336dd0e29..66d37d78152a 100644
> --- a/drivers/gpu/drm/sti/sti_hda.c
> +++ b/drivers/gpu/drm/sti/sti_hda.c
> @@ -707,9 +707,8 @@ static int sti_hda_bind(struct device *dev, struct device *master, void *data)
>
> bridge->driver_private = hda;
> bridge->funcs = &sti_hda_bridge_funcs;
> - drm_bridge_attach(drm_dev, bridge);
> + drm_bridge_attach(encoder, bridge, NULL);
>
> - encoder->bridge = bridge;
> connector->encoder = encoder;
>
> drm_connector = (struct drm_connector *)connector;
> diff --git a/drivers/gpu/drm/sti/sti_hdmi.c b/drivers/gpu/drm/sti/sti_hdmi.c
> index 376b0763c874..f0af1ae82ee9 100644
> --- a/drivers/gpu/drm/sti/sti_hdmi.c
> +++ b/drivers/gpu/drm/sti/sti_hdmi.c
> @@ -1308,9 +1308,8 @@ static int sti_hdmi_bind(struct device *dev, struct device *master, void *data)
>
> bridge->driver_private = hdmi;
> bridge->funcs = &sti_hdmi_bridge_funcs;
> - drm_bridge_attach(drm_dev, bridge);
> + drm_bridge_attach(encoder, bridge, NULL);
>
> - encoder->bridge = bridge;
> connector->encoder = encoder;
>
> drm_connector = (struct drm_connector *)connector;
> diff --git a/drivers/gpu/drm/sun4i/sun4i_rgb.c b/drivers/gpu/drm/sun4i/sun4i_rgb.c
> index f5e86fe7750e..757208f51731 100644
> --- a/drivers/gpu/drm/sun4i/sun4i_rgb.c
> +++ b/drivers/gpu/drm/sun4i/sun4i_rgb.c
> @@ -208,6 +208,7 @@ int sun4i_rgb_init(struct drm_device *drm)
> struct sun4i_drv *drv = drm->dev_private;
> struct sun4i_tcon *tcon = drv->tcon;
> struct drm_encoder *encoder;
> + struct drm_bridge *bridge;
> struct sun4i_rgb *rgb;
> int ret;
>
> @@ -218,8 +219,8 @@ int sun4i_rgb_init(struct drm_device *drm)
> encoder = &rgb->encoder;
>
> tcon->panel = sun4i_tcon_find_panel(tcon->dev->of_node);
> - encoder->bridge = sun4i_tcon_find_bridge(tcon->dev->of_node);
> - if (IS_ERR(tcon->panel) && IS_ERR(encoder->bridge)) {
> + bridge = sun4i_tcon_find_bridge(tcon->dev->of_node);
> + if (IS_ERR(tcon->panel) && IS_ERR(bridge)) {
> dev_info(drm->dev, "No panel or bridge found... RGB output disabled\n");
> return 0;
> }
> @@ -260,16 +261,12 @@ int sun4i_rgb_init(struct drm_device *drm)
> }
> }
>
> - if (!IS_ERR(encoder->bridge)) {
> - encoder->bridge->encoder = &rgb->encoder;
> -
> - ret = drm_bridge_attach(drm, encoder->bridge);
> + if (!IS_ERR(bridge)) {
> + ret = drm_bridge_attach(encoder, bridge, NULL);
> if (ret) {
> dev_err(drm->dev, "Couldn't attach our bridge\n");
> goto err_cleanup_connector;
> }
> - } else {
> - encoder->bridge = NULL;
> }
>
> return 0;
> diff --git a/drivers/gpu/drm/tilcdc/tilcdc_external.c b/drivers/gpu/drm/tilcdc/tilcdc_external.c
> index c67d7cd7d57e..b0dd5e8634ae 100644
> --- a/drivers/gpu/drm/tilcdc/tilcdc_external.c
> +++ b/drivers/gpu/drm/tilcdc/tilcdc_external.c
> @@ -167,10 +167,8 @@ int tilcdc_attach_bridge(struct drm_device *ddev, struct drm_bridge *bridge)
> int ret;
>
> priv->external_encoder->possible_crtcs = BIT(0);
> - priv->external_encoder->bridge = bridge;
> - bridge->encoder = priv->external_encoder;
>
> - ret = drm_bridge_attach(ddev, bridge);
> + ret = drm_bridge_attach(priv->external_encoder, bridge, NULL);
> if (ret) {
> dev_err(ddev->dev, "drm_bridge_attach() failed %d\n", ret);
> return ret;
> diff --git a/include/drm/drm_bridge.h b/include/drm/drm_bridge.h
> index 530a1d6e8cde..94e5ee96b3b5 100644
> --- a/include/drm/drm_bridge.h
> +++ b/include/drm/drm_bridge.h
> @@ -201,7 +201,8 @@ struct drm_bridge {
> int drm_bridge_add(struct drm_bridge *bridge);
> void drm_bridge_remove(struct drm_bridge *bridge);
> struct drm_bridge *of_drm_find_bridge(struct device_node *np);
> -int drm_bridge_attach(struct drm_device *dev, struct drm_bridge *bridge);
> +int drm_bridge_attach(struct drm_encoder *encoder, struct drm_bridge *bridge,
> + struct drm_bridge *previous);
> void drm_bridge_detach(struct drm_bridge *bridge);
>
> bool drm_bridge_mode_fixup(struct drm_bridge *bridge,
>
--
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum,
a Linux Foundation Collaborative Project
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH v4 3/5] drm: bridge: Link encoder and bridge in core code
2016-12-14 9:59 ` [PATCH v4 3/5] drm: bridge: Link encoder and bridge in core code Laurent Pinchart
` (2 preceding siblings ...)
2016-12-16 8:35 ` Archit Taneja
@ 2016-12-16 9:17 ` Jyri Sarha
3 siblings, 0 replies; 17+ messages in thread
From: Jyri Sarha @ 2016-12-16 9:17 UTC (permalink / raw)
To: Laurent Pinchart, dri-devel
Cc: Xinliang Liu, Alexey Brodkin, Seung-Woo Kim, Xinwei Kong,
Kyungmin Park, Tomi Valkeinen, Chen Feng, Rongrong Zou,
Maxime Ripard, Chen-Yu Tsai
On 12/14/16 11:59, Laurent Pinchart wrote:
> Instead of linking encoders and bridges in every driver (and getting it
> wrong half of the time, as many drivers forget to set the drm_bridge
> encoder pointer), do so in core code. The drm_bridge_attach() function
> needs the encoder and optional previous bridge to perform that task,
> update all the callers.
>
> Signed-off-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
> Acked-by: Stefan Agner <stefan@agner.ch> # For DCU
> Acked-by: Boris Brezillon <boris.brezillon@free-electrons.com> # For atmel-hlcdc
> Acked-by: Vincent Abriou <vincent.abriou@st.com> # For STI
Acked-by: Jyri Sarha <jsarha@ti.com> # For tilcdc
> ---
> drivers/gpu/drm/arc/arcpgu_hdmi.c | 5 +--
> drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_output.c | 4 +-
> drivers/gpu/drm/bridge/analogix/analogix_dp_core.c | 4 +-
> drivers/gpu/drm/bridge/dw-hdmi.c | 3 +-
> drivers/gpu/drm/drm_bridge.c | 46 ++++++++++++++++------
> drivers/gpu/drm/drm_simple_kms_helper.c | 4 +-
> drivers/gpu/drm/exynos/exynos_dp.c | 5 +--
> drivers/gpu/drm/exynos/exynos_drm_dsi.c | 6 +--
> drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_rgb.c | 5 +--
> drivers/gpu/drm/hisilicon/kirin/dw_drm_dsi.c | 5 +--
> drivers/gpu/drm/imx/imx-ldb.c | 6 +--
> drivers/gpu/drm/imx/parallel-display.c | 4 +-
> drivers/gpu/drm/mediatek/mtk_dpi.c | 8 ++--
> drivers/gpu/drm/mediatek/mtk_dsi.c | 24 ++---------
> drivers/gpu/drm/mediatek/mtk_hdmi.c | 11 +++---
> drivers/gpu/drm/msm/dsi/dsi_manager.c | 17 +++++---
> drivers/gpu/drm/msm/edp/edp_bridge.c | 2 +-
> drivers/gpu/drm/msm/hdmi/hdmi_bridge.c | 2 +-
> drivers/gpu/drm/rcar-du/rcar_du_hdmienc.c | 5 +--
> drivers/gpu/drm/sti/sti_dvo.c | 3 +-
> drivers/gpu/drm/sti/sti_hda.c | 3 +-
> drivers/gpu/drm/sti/sti_hdmi.c | 3 +-
> drivers/gpu/drm/sun4i/sun4i_rgb.c | 13 +++---
> drivers/gpu/drm/tilcdc/tilcdc_external.c | 4 +-
...
> diff --git a/drivers/gpu/drm/tilcdc/tilcdc_external.c b/drivers/gpu/drm/tilcdc/tilcdc_external.c
> index c67d7cd7d57e..b0dd5e8634ae 100644
> --- a/drivers/gpu/drm/tilcdc/tilcdc_external.c
> +++ b/drivers/gpu/drm/tilcdc/tilcdc_external.c
> @@ -167,10 +167,8 @@ int tilcdc_attach_bridge(struct drm_device *ddev, struct drm_bridge *bridge)
> int ret;
>
> priv->external_encoder->possible_crtcs = BIT(0);
> - priv->external_encoder->bridge = bridge;
> - bridge->encoder = priv->external_encoder;
>
> - ret = drm_bridge_attach(ddev, bridge);
> + ret = drm_bridge_attach(priv->external_encoder, bridge, NULL);
> if (ret) {
> dev_err(ddev->dev, "drm_bridge_attach() failed %d\n", ret);
> return ret;
> diff --git a/include/drm/drm_bridge.h b/include/drm/drm_bridge.h
> index 530a1d6e8cde..94e5ee96b3b5 100644
> --- a/include/drm/drm_bridge.h
> +++ b/include/drm/drm_bridge.h
> @@ -201,7 +201,8 @@ struct drm_bridge {
> int drm_bridge_add(struct drm_bridge *bridge);
> void drm_bridge_remove(struct drm_bridge *bridge);
> struct drm_bridge *of_drm_find_bridge(struct device_node *np);
> -int drm_bridge_attach(struct drm_device *dev, struct drm_bridge *bridge);
> +int drm_bridge_attach(struct drm_encoder *encoder, struct drm_bridge *bridge,
> + struct drm_bridge *previous);
> void drm_bridge_detach(struct drm_bridge *bridge);
>
> bool drm_bridge_mode_fixup(struct drm_bridge *bridge,
>
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH v4 3/5] drm: bridge: Link encoder and bridge in core code
2016-12-16 8:35 ` Archit Taneja
@ 2016-12-16 13:29 ` Daniel Vetter
2016-12-16 13:29 ` Daniel Vetter
2016-12-23 11:10 ` Philipp Zabel
1 sibling, 1 reply; 17+ messages in thread
From: Daniel Vetter @ 2016-12-16 13:29 UTC (permalink / raw)
To: Archit Taneja
Cc: Laurent Pinchart, Alexey Brodkin, Seung-Woo Kim, Kyungmin Park,
dri-devel, Xinliang Liu, Xinwei Kong, Tomi Valkeinen, Jyri Sarha,
Chen Feng, Rongrong Zou, Maxime Ripard, Chen-Yu Tsai
On Fri, Dec 16, 2016 at 02:05:48PM +0530, Archit Taneja wrote:
> Hi,
>
> On 12/14/2016 03:29 PM, Laurent Pinchart wrote:
> > Instead of linking encoders and bridges in every driver (and getting it
> > wrong half of the time, as many drivers forget to set the drm_bridge
> > encoder pointer), do so in core code. The drm_bridge_attach() function
> > needs the encoder and optional previous bridge to perform that task,
> > update all the callers.
> >
> > Signed-off-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
> > Acked-by: Stefan Agner <stefan@agner.ch> # For DCU
> > Acked-by: Boris Brezillon <boris.brezillon@free-electrons.com> # For atmel-hlcdc
> > Acked-by: Vincent Abriou <vincent.abriou@st.com> # For STI
>
> This one needs acks for arcgpu, tilcdc, mediatek and imx. The changes in
> those drivers look good to me, though. Will push it in a day or so unless anyone
> has any comments on it.
Imo big refactorings don't need ack from every driver maintainer, since
some fail to do their jobs timely. Overall review + a few acks should be
good enough. Anyway I double-checked things and looks all good.
Signed-off-by: Daniel Vetter <daniel.vetter@intel.com>
>
> Thanks,
> Archit
>
> > ---
> > drivers/gpu/drm/arc/arcpgu_hdmi.c | 5 +--
> > drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_output.c | 4 +-
> > drivers/gpu/drm/bridge/analogix/analogix_dp_core.c | 4 +-
> > drivers/gpu/drm/bridge/dw-hdmi.c | 3 +-
> > drivers/gpu/drm/drm_bridge.c | 46 ++++++++++++++++------
> > drivers/gpu/drm/drm_simple_kms_helper.c | 4 +-
> > drivers/gpu/drm/exynos/exynos_dp.c | 5 +--
> > drivers/gpu/drm/exynos/exynos_drm_dsi.c | 6 +--
> > drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_rgb.c | 5 +--
> > drivers/gpu/drm/hisilicon/kirin/dw_drm_dsi.c | 5 +--
> > drivers/gpu/drm/imx/imx-ldb.c | 6 +--
> > drivers/gpu/drm/imx/parallel-display.c | 4 +-
> > drivers/gpu/drm/mediatek/mtk_dpi.c | 8 ++--
> > drivers/gpu/drm/mediatek/mtk_dsi.c | 24 ++---------
> > drivers/gpu/drm/mediatek/mtk_hdmi.c | 11 +++---
> > drivers/gpu/drm/msm/dsi/dsi_manager.c | 17 +++++---
> > drivers/gpu/drm/msm/edp/edp_bridge.c | 2 +-
> > drivers/gpu/drm/msm/hdmi/hdmi_bridge.c | 2 +-
> > drivers/gpu/drm/rcar-du/rcar_du_hdmienc.c | 5 +--
> > drivers/gpu/drm/sti/sti_dvo.c | 3 +-
> > drivers/gpu/drm/sti/sti_hda.c | 3 +-
> > drivers/gpu/drm/sti/sti_hdmi.c | 3 +-
> > drivers/gpu/drm/sun4i/sun4i_rgb.c | 13 +++---
> > drivers/gpu/drm/tilcdc/tilcdc_external.c | 4 +-
> > include/drm/drm_bridge.h | 3 +-
> > 25 files changed, 85 insertions(+), 110 deletions(-)
> >
> > diff --git a/drivers/gpu/drm/arc/arcpgu_hdmi.c b/drivers/gpu/drm/arc/arcpgu_hdmi.c
> > index b69c66b4897e..0ce7f398bcff 100644
> > --- a/drivers/gpu/drm/arc/arcpgu_hdmi.c
> > +++ b/drivers/gpu/drm/arc/arcpgu_hdmi.c
> > @@ -47,10 +47,7 @@ int arcpgu_drm_hdmi_init(struct drm_device *drm, struct device_node *np)
> > return ret;
> >
> > /* Link drm_bridge to encoder */
> > - bridge->encoder = encoder;
> > - encoder->bridge = bridge;
> > -
> > - ret = drm_bridge_attach(drm, bridge);
> > + ret = drm_bridge_attach(encoder, bridge, NULL);
> > if (ret)
> > drm_encoder_cleanup(encoder);
> >
> > diff --git a/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_output.c b/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_output.c
> > index 6119b5085501..e7799b6ee829 100644
> > --- a/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_output.c
> > +++ b/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_output.c
> > @@ -230,9 +230,7 @@ static int atmel_hlcdc_attach_endpoint(struct drm_device *dev,
> > of_node_put(np);
> >
> > if (bridge) {
> > - output->encoder.bridge = bridge;
> > - bridge->encoder = &output->encoder;
> > - ret = drm_bridge_attach(dev, bridge);
> > + ret = drm_bridge_attach(&output->encoder, bridge, NULL);
> > if (!ret)
> > return 0;
> > }
> > diff --git a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c
> > index eb9bf8786c24..b7494c8d43fe 100644
> > --- a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c
> > +++ b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c
> > @@ -1227,12 +1227,10 @@ static int analogix_dp_create_bridge(struct drm_device *drm_dev,
> >
> > dp->bridge = bridge;
> >
> > - dp->encoder->bridge = bridge;
> > bridge->driver_private = dp;
> > - bridge->encoder = dp->encoder;
> > bridge->funcs = &analogix_dp_bridge_funcs;
> >
> > - ret = drm_bridge_attach(drm_dev, bridge);
> > + ret = drm_bridge_attach(dp->encoder, bridge, NULL);
> > if (ret) {
> > DRM_ERROR("failed to attach drm bridge\n");
> > return -EINVAL;
> > diff --git a/drivers/gpu/drm/bridge/dw-hdmi.c b/drivers/gpu/drm/bridge/dw-hdmi.c
> > index 235ce7d1583d..f5009ae39b89 100644
> > --- a/drivers/gpu/drm/bridge/dw-hdmi.c
> > +++ b/drivers/gpu/drm/bridge/dw-hdmi.c
> > @@ -1841,13 +1841,12 @@ static int dw_hdmi_register(struct drm_device *drm, struct dw_hdmi *hdmi)
> > hdmi->bridge = bridge;
> > bridge->driver_private = hdmi;
> > bridge->funcs = &dw_hdmi_bridge_funcs;
> > - ret = drm_bridge_attach(drm, bridge);
> > + ret = drm_bridge_attach(encoder, bridge, NULL);
> > if (ret) {
> > DRM_ERROR("Failed to initialize bridge with drm\n");
> > return -EINVAL;
> > }
> >
> > - encoder->bridge = bridge;
> > hdmi->connector.polled = DRM_CONNECTOR_POLL_HPD;
> >
> > drm_connector_helper_add(&hdmi->connector,
> > diff --git a/drivers/gpu/drm/drm_bridge.c b/drivers/gpu/drm/drm_bridge.c
> > index 0ee052b7c21a..850bd6509ef1 100644
> > --- a/drivers/gpu/drm/drm_bridge.c
> > +++ b/drivers/gpu/drm/drm_bridge.c
> > @@ -26,6 +26,7 @@
> > #include <linux/mutex.h>
> >
> > #include <drm/drm_bridge.h>
> > +#include <drm/drm_encoder.h>
> >
> > /**
> > * DOC: overview
> > @@ -92,32 +93,53 @@ void drm_bridge_remove(struct drm_bridge *bridge)
> > EXPORT_SYMBOL(drm_bridge_remove);
> >
> > /**
> > - * drm_bridge_attach - associate given bridge to our DRM device
> > + * drm_bridge_attach - attach the bridge to an encoder's chain
> > *
> > - * @dev: DRM device
> > - * @bridge: bridge control structure
> > + * @encoder: DRM encoder
> > + * @bridge: bridge to attach
> > + * @previous: previous bridge in the chain (optional)
> > *
> > - * Called by a kms driver to link one of our encoder/bridge to the given
> > - * bridge.
> > + * Called by a kms driver to link the bridge to an encoder's chain. The previous
> > + * argument specifies the previous bridge in the chain. If NULL, the bridge is
> > + * linked directly at the encoder's output. Otherwise it is linked at the
> > + * previous bridge's output.
> > *
> > - * Note that setting up links between the bridge and our encoder/bridge
> > - * objects needs to be handled by the kms driver itself.
> > + * If non-NULL the previous bridge must be already attached by a call to this
> > + * function.
> > *
> > * RETURNS:
> > * Zero on success, error code on failure
> > */
> > -int drm_bridge_attach(struct drm_device *dev, struct drm_bridge *bridge)
> > +int drm_bridge_attach(struct drm_encoder *encoder, struct drm_bridge *bridge,
> > + struct drm_bridge *previous)
> > {
> > - if (!dev || !bridge)
> > + int ret;
> > +
> > + if (!encoder || !bridge)
> > + return -EINVAL;
> > +
> > + if (previous && (!previous->dev || previous->encoder != encoder))
> > return -EINVAL;
> >
> > if (bridge->dev)
> > return -EBUSY;
> >
> > - bridge->dev = dev;
> > + bridge->dev = encoder->dev;
> > + bridge->encoder = encoder;
> > +
> > + if (bridge->funcs->attach) {
> > + ret = bridge->funcs->attach(bridge);
> > + if (ret < 0) {
> > + bridge->dev = NULL;
> > + bridge->encoder = NULL;
> > + return ret;
> > + }
> > + }
> >
> > - if (bridge->funcs->attach)
> > - return bridge->funcs->attach(bridge);
> > + if (previous)
> > + previous->next = bridge;
> > + else
> > + encoder->bridge = bridge;
> >
> > return 0;
> > }
> > diff --git a/drivers/gpu/drm/drm_simple_kms_helper.c b/drivers/gpu/drm/drm_simple_kms_helper.c
> > index 7bae08c2bf0a..ba7be6169339 100644
> > --- a/drivers/gpu/drm/drm_simple_kms_helper.c
> > +++ b/drivers/gpu/drm/drm_simple_kms_helper.c
> > @@ -182,9 +182,7 @@ static const struct drm_plane_funcs drm_simple_kms_plane_funcs = {
> > int drm_simple_display_pipe_attach_bridge(struct drm_simple_display_pipe *pipe,
> > struct drm_bridge *bridge)
> > {
> > - bridge->encoder = &pipe->encoder;
> > - pipe->encoder.bridge = bridge;
> > - return drm_bridge_attach(pipe->encoder.dev, bridge);
> > + return drm_bridge_attach(&pipe->encoder, bridge, NULL);
> > }
> > EXPORT_SYMBOL(drm_simple_display_pipe_attach_bridge);
> >
> > diff --git a/drivers/gpu/drm/exynos/exynos_dp.c b/drivers/gpu/drm/exynos/exynos_dp.c
> > index 528229faffe4..1ef0be338b85 100644
> > --- a/drivers/gpu/drm/exynos/exynos_dp.c
> > +++ b/drivers/gpu/drm/exynos/exynos_dp.c
> > @@ -99,7 +99,6 @@ static int exynos_dp_bridge_attach(struct analogix_dp_plat_data *plat_data,
> > struct drm_connector *connector)
> > {
> > struct exynos_dp_device *dp = to_dp(plat_data);
> > - struct drm_encoder *encoder = &dp->encoder;
> > int ret;
> >
> > drm_connector_register(connector);
> > @@ -107,9 +106,7 @@ static int exynos_dp_bridge_attach(struct analogix_dp_plat_data *plat_data,
> >
> > /* Pre-empt DP connector creation if there's a bridge */
> > if (dp->ptn_bridge) {
> > - bridge->next = dp->ptn_bridge;
> > - dp->ptn_bridge->encoder = encoder;
> > - ret = drm_bridge_attach(encoder->dev, dp->ptn_bridge);
> > + ret = drm_bridge_attach(&dp->encoder, dp->ptn_bridge, bridge);
> > if (ret) {
> > DRM_ERROR("Failed to attach bridge to drm\n");
> > bridge->next = NULL;
> > diff --git a/drivers/gpu/drm/exynos/exynos_drm_dsi.c b/drivers/gpu/drm/exynos/exynos_drm_dsi.c
> > index e07cb1fe4860..812e2ec0761d 100644
> > --- a/drivers/gpu/drm/exynos/exynos_drm_dsi.c
> > +++ b/drivers/gpu/drm/exynos/exynos_drm_dsi.c
> > @@ -1718,10 +1718,8 @@ static int exynos_dsi_bind(struct device *dev, struct device *master,
> > }
> >
> > bridge = of_drm_find_bridge(dsi->bridge_node);
> > - if (bridge) {
> > - encoder->bridge = bridge;
> > - drm_bridge_attach(drm_dev, bridge);
> > - }
> > + if (bridge)
> > + drm_bridge_attach(encoder, bridge, NULL);
> >
> > return mipi_dsi_host_register(&dsi->dsi_host);
> > }
> > diff --git a/drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_rgb.c b/drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_rgb.c
> > index 05a8ee106879..c3651456c963 100644
> > --- a/drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_rgb.c
> > +++ b/drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_rgb.c
> > @@ -160,10 +160,7 @@ static int fsl_dcu_attach_endpoint(struct fsl_dcu_drm_device *fsl_dev,
> > if (!bridge)
> > return -ENODEV;
> >
> > - fsl_dev->encoder.bridge = bridge;
> > - bridge->encoder = &fsl_dev->encoder;
> > -
> > - return drm_bridge_attach(fsl_dev->drm, bridge);
> > + return drm_bridge_attach(&fsl_dev->encoder, bridge, NULL);
> > }
> >
> > int fsl_dcu_create_outputs(struct fsl_dcu_drm_device *fsl_dev)
> > diff --git a/drivers/gpu/drm/hisilicon/kirin/dw_drm_dsi.c b/drivers/gpu/drm/hisilicon/kirin/dw_drm_dsi.c
> > index 998452ad0fcb..1737e98bc10a 100644
> > --- a/drivers/gpu/drm/hisilicon/kirin/dw_drm_dsi.c
> > +++ b/drivers/gpu/drm/hisilicon/kirin/dw_drm_dsi.c
> > @@ -709,10 +709,7 @@ static int dsi_bridge_init(struct drm_device *dev, struct dw_dsi *dsi)
> > int ret;
> >
> > /* associate the bridge to dsi encoder */
> > - encoder->bridge = bridge;
> > - bridge->encoder = encoder;
> > -
> > - ret = drm_bridge_attach(dev, bridge);
> > + ret = drm_bridge_attach(encoder, bridge, NULL);
> > if (ret) {
> > DRM_ERROR("failed to attach external bridge\n");
> > return ret;
> > diff --git a/drivers/gpu/drm/imx/imx-ldb.c b/drivers/gpu/drm/imx/imx-ldb.c
> > index 516d06490465..ec49ea3d8e40 100644
> > --- a/drivers/gpu/drm/imx/imx-ldb.c
> > +++ b/drivers/gpu/drm/imx/imx-ldb.c
> > @@ -454,10 +454,8 @@ static int imx_ldb_register(struct drm_device *drm,
> > DRM_MODE_ENCODER_LVDS, NULL);
> >
> > if (imx_ldb_ch->bridge) {
> > - imx_ldb_ch->bridge->encoder = encoder;
> > -
> > - imx_ldb_ch->encoder.bridge = imx_ldb_ch->bridge;
> > - ret = drm_bridge_attach(drm, imx_ldb_ch->bridge);
> > + ret = drm_bridge_attach(&imx_ldb_ch->encoder,
> > + imx_ldb_ch->bridge, NULL);
> > if (ret) {
> > DRM_ERROR("Failed to initialize bridge with drm\n");
> > return ret;
> > diff --git a/drivers/gpu/drm/imx/parallel-display.c b/drivers/gpu/drm/imx/parallel-display.c
> > index 8582a83c0d9b..51d9f735c358 100644
> > --- a/drivers/gpu/drm/imx/parallel-display.c
> > +++ b/drivers/gpu/drm/imx/parallel-display.c
> > @@ -191,9 +191,7 @@ static int imx_pd_register(struct drm_device *drm,
> > drm_panel_attach(imxpd->panel, &imxpd->connector);
> >
> > if (imxpd->bridge) {
> > - imxpd->bridge->encoder = encoder;
> > - encoder->bridge = imxpd->bridge;
> > - ret = drm_bridge_attach(drm, imxpd->bridge);
> > + ret = drm_bridge_attach(encoder, imxpd->bridge, NULL);
> > if (ret < 0) {
> > dev_err(imxpd->dev, "failed to attach bridge: %d\n",
> > ret);
> > diff --git a/drivers/gpu/drm/mediatek/mtk_dpi.c b/drivers/gpu/drm/mediatek/mtk_dpi.c
> > index 90fb831ef031..3bd3bd688d1a 100644
> > --- a/drivers/gpu/drm/mediatek/mtk_dpi.c
> > +++ b/drivers/gpu/drm/mediatek/mtk_dpi.c
> > @@ -63,6 +63,7 @@ enum mtk_dpi_out_color_format {
> > struct mtk_dpi {
> > struct mtk_ddp_comp ddp_comp;
> > struct drm_encoder encoder;
> > + struct drm_bridge *bridge;
> > void __iomem *regs;
> > struct device *dev;
> > struct clk *engine_clk;
> > @@ -620,8 +621,7 @@ static int mtk_dpi_bind(struct device *dev, struct device *master, void *data)
> > /* Currently DPI0 is fixed to be driven by OVL1 */
> > dpi->encoder.possible_crtcs = BIT(1);
> >
> > - dpi->encoder.bridge->encoder = &dpi->encoder;
> > - ret = drm_bridge_attach(dpi->encoder.dev, dpi->encoder.bridge);
> > + ret = drm_bridge_attach(&dpi->encoder, dpi->bridge, NULL);
> > if (ret) {
> > dev_err(dev, "Failed to attach bridge: %d\n", ret);
> > goto err_cleanup;
> > @@ -718,9 +718,9 @@ static int mtk_dpi_probe(struct platform_device *pdev)
> >
> > dev_info(dev, "Found bridge node: %s\n", bridge_node->full_name);
> >
> > - dpi->encoder.bridge = of_drm_find_bridge(bridge_node);
> > + dpi->bridge = of_drm_find_bridge(bridge_node);
> > of_node_put(bridge_node);
> > - if (!dpi->encoder.bridge)
> > + if (!dpi->bridge)
> > return -EPROBE_DEFER;
> >
> > comp_id = mtk_ddp_comp_get_id(dev->of_node, MTK_DPI);
> > diff --git a/drivers/gpu/drm/mediatek/mtk_dsi.c b/drivers/gpu/drm/mediatek/mtk_dsi.c
> > index 2c42f90809d8..dd71cbb1a622 100644
> > --- a/drivers/gpu/drm/mediatek/mtk_dsi.c
> > +++ b/drivers/gpu/drm/mediatek/mtk_dsi.c
> > @@ -622,26 +622,6 @@ static const struct drm_connector_helper_funcs
> > .get_modes = mtk_dsi_connector_get_modes,
> > };
> >
> > -static int mtk_drm_attach_bridge(struct drm_bridge *bridge,
> > - struct drm_encoder *encoder)
> > -{
> > - int ret;
> > -
> > - if (!bridge)
> > - return -ENOENT;
> > -
> > - encoder->bridge = bridge;
> > - bridge->encoder = encoder;
> > - ret = drm_bridge_attach(encoder->dev, bridge);
> > - if (ret) {
> > - DRM_ERROR("Failed to attach bridge to drm\n");
> > - encoder->bridge = NULL;
> > - bridge->encoder = NULL;
> > - }
> > -
> > - return ret;
> > -}
> > -
> > static int mtk_dsi_create_connector(struct drm_device *drm, struct mtk_dsi *dsi)
> > {
> > int ret;
> > @@ -692,8 +672,10 @@ static int mtk_dsi_create_conn_enc(struct drm_device *drm, struct mtk_dsi *dsi)
> > dsi->encoder.possible_crtcs = 1;
> >
> > /* If there's a bridge, attach to it and let it create the connector */
> > - ret = mtk_drm_attach_bridge(dsi->bridge, &dsi->encoder);
> > + ret = drm_bridge_attach(&dsi->encoder, dsi->bridge, NULL);
> > if (ret) {
> > + DRM_ERROR("Failed to attach bridge to drm\n");
> > +
> > /* Otherwise create our own connector and attach to a panel */
> > ret = mtk_dsi_create_connector(drm, dsi);
> > if (ret)
> > diff --git a/drivers/gpu/drm/mediatek/mtk_hdmi.c b/drivers/gpu/drm/mediatek/mtk_hdmi.c
> > index 0e8c4d9af340..c26251260b83 100644
> > --- a/drivers/gpu/drm/mediatek/mtk_hdmi.c
> > +++ b/drivers/gpu/drm/mediatek/mtk_hdmi.c
> > @@ -149,6 +149,7 @@ struct hdmi_audio_param {
> >
> > struct mtk_hdmi {
> > struct drm_bridge bridge;
> > + struct drm_bridge *next_bridge;
> > struct drm_connector conn;
> > struct device *dev;
> > struct phy *phy;
> > @@ -1314,9 +1315,9 @@ static int mtk_hdmi_bridge_attach(struct drm_bridge *bridge)
> > return ret;
> > }
> >
> > - if (bridge->next) {
> > - bridge->next->encoder = bridge->encoder;
> > - ret = drm_bridge_attach(bridge->encoder->dev, bridge->next);
> > + if (hdmi->next_bridge) {
> > + ret = drm_bridge_attach(bridge->encoder, hdmi->next_bridge,
> > + bridge);
> > if (ret) {
> > dev_err(hdmi->dev,
> > "Failed to attach external bridge: %d\n", ret);
> > @@ -1510,8 +1511,8 @@ static int mtk_hdmi_dt_parse_pdata(struct mtk_hdmi *hdmi,
> > of_node_put(ep);
> >
> > if (!of_device_is_compatible(remote, "hdmi-connector")) {
> > - hdmi->bridge.next = of_drm_find_bridge(remote);
> > - if (!hdmi->bridge.next) {
> > + hdmi->next_bridge = of_drm_find_bridge(remote);
> > + if (!hdmi->next_bridge) {
> > dev_err(dev, "Waiting for external bridge\n");
> > of_node_put(remote);
> > return -EPROBE_DEFER;
> > diff --git a/drivers/gpu/drm/msm/dsi/dsi_manager.c b/drivers/gpu/drm/msm/dsi/dsi_manager.c
> > index c8d1f19c9a6d..2bd8dad76105 100644
> > --- a/drivers/gpu/drm/msm/dsi/dsi_manager.c
> > +++ b/drivers/gpu/drm/msm/dsi/dsi_manager.c
> > @@ -579,6 +579,7 @@ struct drm_bridge *msm_dsi_manager_bridge_init(u8 id)
> > struct msm_dsi *msm_dsi = dsi_mgr_get_dsi(id);
> > struct drm_bridge *bridge = NULL;
> > struct dsi_bridge *dsi_bridge;
> > + struct drm_encoder *encoder;
> > int ret;
> >
> > dsi_bridge = devm_kzalloc(msm_dsi->dev->dev,
> > @@ -590,10 +591,18 @@ struct drm_bridge *msm_dsi_manager_bridge_init(u8 id)
> >
> > dsi_bridge->id = id;
> >
> > + /*
> > + * HACK: we may not know the external DSI bridge device's mode
> > + * flags here. We'll get to know them only when the device
> > + * attaches to the dsi host. For now, assume the bridge supports
> > + * DSI video mode
> > + */
> > + encoder = msm_dsi->encoders[MSM_DSI_VIDEO_ENCODER_ID];
> > +
> > bridge = &dsi_bridge->base;
> > bridge->funcs = &dsi_mgr_bridge_funcs;
> >
> > - ret = drm_bridge_attach(msm_dsi->dev, bridge);
> > + ret = drm_bridge_attach(encoder, bridge, NULL);
> > if (ret)
> > goto fail;
> >
> > @@ -628,11 +637,7 @@ struct drm_connector *msm_dsi_manager_ext_bridge_init(u8 id)
> > encoder = msm_dsi->encoders[MSM_DSI_VIDEO_ENCODER_ID];
> >
> > /* link the internal dsi bridge to the external bridge */
> > - int_bridge->next = ext_bridge;
> > - /* set the external bridge's encoder as dsi's encoder */
> > - ext_bridge->encoder = encoder;
> > -
> > - drm_bridge_attach(dev, ext_bridge);
> > + drm_bridge_attach(encoder, ext_bridge, int_bridge);
> >
> > /*
> > * we need the drm_connector created by the external bridge
> > diff --git a/drivers/gpu/drm/msm/edp/edp_bridge.c b/drivers/gpu/drm/msm/edp/edp_bridge.c
> > index 2bc73f82f3f5..931a5c97cccf 100644
> > --- a/drivers/gpu/drm/msm/edp/edp_bridge.c
> > +++ b/drivers/gpu/drm/msm/edp/edp_bridge.c
> > @@ -106,7 +106,7 @@ struct drm_bridge *msm_edp_bridge_init(struct msm_edp *edp)
> > bridge = &edp_bridge->base;
> > bridge->funcs = &edp_bridge_funcs;
> >
> > - ret = drm_bridge_attach(edp->dev, bridge);
> > + ret = drm_bridge_attach(edp->encoder, bridge, NULL);
> > if (ret)
> > goto fail;
> >
> > diff --git a/drivers/gpu/drm/msm/hdmi/hdmi_bridge.c b/drivers/gpu/drm/msm/hdmi/hdmi_bridge.c
> > index bacbd5d8df0e..4e6d1bf27474 100644
> > --- a/drivers/gpu/drm/msm/hdmi/hdmi_bridge.c
> > +++ b/drivers/gpu/drm/msm/hdmi/hdmi_bridge.c
> > @@ -227,7 +227,7 @@ struct drm_bridge *msm_hdmi_bridge_init(struct hdmi *hdmi)
> > bridge = &hdmi_bridge->base;
> > bridge->funcs = &msm_hdmi_bridge_funcs;
> >
> > - ret = drm_bridge_attach(hdmi->dev, bridge);
> > + ret = drm_bridge_attach(hdmi->encoder, bridge, NULL);
> > if (ret)
> > goto fail;
> >
> > diff --git a/drivers/gpu/drm/rcar-du/rcar_du_hdmienc.c b/drivers/gpu/drm/rcar-du/rcar_du_hdmienc.c
> > index a1a2c5e7822c..933a2547798e 100644
> > --- a/drivers/gpu/drm/rcar-du/rcar_du_hdmienc.c
> > +++ b/drivers/gpu/drm/rcar-du/rcar_du_hdmienc.c
> > @@ -124,10 +124,7 @@ int rcar_du_hdmienc_init(struct rcar_du_device *rcdu,
> > hdmienc->renc = renc;
> >
> > /* Link the bridge to the encoder. */
> > - bridge->encoder = encoder;
> > - encoder->bridge = bridge;
> > -
> > - ret = drm_bridge_attach(rcdu->ddev, bridge);
> > + ret = drm_bridge_attach(encoder, bridge, NULL);
> > if (ret) {
> > drm_encoder_cleanup(encoder);
> > return ret;
> > diff --git a/drivers/gpu/drm/sti/sti_dvo.c b/drivers/gpu/drm/sti/sti_dvo.c
> > index e8c1ed08a9f7..411dc6ec976e 100644
> > --- a/drivers/gpu/drm/sti/sti_dvo.c
> > +++ b/drivers/gpu/drm/sti/sti_dvo.c
> > @@ -478,14 +478,13 @@ static int sti_dvo_bind(struct device *dev, struct device *master, void *data)
> > return err;
> > }
> >
> > - err = drm_bridge_attach(drm_dev, bridge);
> > + err = drm_bridge_attach(encoder, bridge, NULL);
> > if (err) {
> > DRM_ERROR("Failed to attach bridge\n");
> > return err;
> > }
> >
> > dvo->bridge = bridge;
> > - encoder->bridge = bridge;
> > connector->encoder = encoder;
> > dvo->encoder = encoder;
> >
> > diff --git a/drivers/gpu/drm/sti/sti_hda.c b/drivers/gpu/drm/sti/sti_hda.c
> > index 96f336dd0e29..66d37d78152a 100644
> > --- a/drivers/gpu/drm/sti/sti_hda.c
> > +++ b/drivers/gpu/drm/sti/sti_hda.c
> > @@ -707,9 +707,8 @@ static int sti_hda_bind(struct device *dev, struct device *master, void *data)
> >
> > bridge->driver_private = hda;
> > bridge->funcs = &sti_hda_bridge_funcs;
> > - drm_bridge_attach(drm_dev, bridge);
> > + drm_bridge_attach(encoder, bridge, NULL);
> >
> > - encoder->bridge = bridge;
> > connector->encoder = encoder;
> >
> > drm_connector = (struct drm_connector *)connector;
> > diff --git a/drivers/gpu/drm/sti/sti_hdmi.c b/drivers/gpu/drm/sti/sti_hdmi.c
> > index 376b0763c874..f0af1ae82ee9 100644
> > --- a/drivers/gpu/drm/sti/sti_hdmi.c
> > +++ b/drivers/gpu/drm/sti/sti_hdmi.c
> > @@ -1308,9 +1308,8 @@ static int sti_hdmi_bind(struct device *dev, struct device *master, void *data)
> >
> > bridge->driver_private = hdmi;
> > bridge->funcs = &sti_hdmi_bridge_funcs;
> > - drm_bridge_attach(drm_dev, bridge);
> > + drm_bridge_attach(encoder, bridge, NULL);
> >
> > - encoder->bridge = bridge;
> > connector->encoder = encoder;
> >
> > drm_connector = (struct drm_connector *)connector;
> > diff --git a/drivers/gpu/drm/sun4i/sun4i_rgb.c b/drivers/gpu/drm/sun4i/sun4i_rgb.c
> > index f5e86fe7750e..757208f51731 100644
> > --- a/drivers/gpu/drm/sun4i/sun4i_rgb.c
> > +++ b/drivers/gpu/drm/sun4i/sun4i_rgb.c
> > @@ -208,6 +208,7 @@ int sun4i_rgb_init(struct drm_device *drm)
> > struct sun4i_drv *drv = drm->dev_private;
> > struct sun4i_tcon *tcon = drv->tcon;
> > struct drm_encoder *encoder;
> > + struct drm_bridge *bridge;
> > struct sun4i_rgb *rgb;
> > int ret;
> >
> > @@ -218,8 +219,8 @@ int sun4i_rgb_init(struct drm_device *drm)
> > encoder = &rgb->encoder;
> >
> > tcon->panel = sun4i_tcon_find_panel(tcon->dev->of_node);
> > - encoder->bridge = sun4i_tcon_find_bridge(tcon->dev->of_node);
> > - if (IS_ERR(tcon->panel) && IS_ERR(encoder->bridge)) {
> > + bridge = sun4i_tcon_find_bridge(tcon->dev->of_node);
> > + if (IS_ERR(tcon->panel) && IS_ERR(bridge)) {
> > dev_info(drm->dev, "No panel or bridge found... RGB output disabled\n");
> > return 0;
> > }
> > @@ -260,16 +261,12 @@ int sun4i_rgb_init(struct drm_device *drm)
> > }
> > }
> >
> > - if (!IS_ERR(encoder->bridge)) {
> > - encoder->bridge->encoder = &rgb->encoder;
> > -
> > - ret = drm_bridge_attach(drm, encoder->bridge);
> > + if (!IS_ERR(bridge)) {
> > + ret = drm_bridge_attach(encoder, bridge, NULL);
> > if (ret) {
> > dev_err(drm->dev, "Couldn't attach our bridge\n");
> > goto err_cleanup_connector;
> > }
> > - } else {
> > - encoder->bridge = NULL;
> > }
> >
> > return 0;
> > diff --git a/drivers/gpu/drm/tilcdc/tilcdc_external.c b/drivers/gpu/drm/tilcdc/tilcdc_external.c
> > index c67d7cd7d57e..b0dd5e8634ae 100644
> > --- a/drivers/gpu/drm/tilcdc/tilcdc_external.c
> > +++ b/drivers/gpu/drm/tilcdc/tilcdc_external.c
> > @@ -167,10 +167,8 @@ int tilcdc_attach_bridge(struct drm_device *ddev, struct drm_bridge *bridge)
> > int ret;
> >
> > priv->external_encoder->possible_crtcs = BIT(0);
> > - priv->external_encoder->bridge = bridge;
> > - bridge->encoder = priv->external_encoder;
> >
> > - ret = drm_bridge_attach(ddev, bridge);
> > + ret = drm_bridge_attach(priv->external_encoder, bridge, NULL);
> > if (ret) {
> > dev_err(ddev->dev, "drm_bridge_attach() failed %d\n", ret);
> > return ret;
> > diff --git a/include/drm/drm_bridge.h b/include/drm/drm_bridge.h
> > index 530a1d6e8cde..94e5ee96b3b5 100644
> > --- a/include/drm/drm_bridge.h
> > +++ b/include/drm/drm_bridge.h
> > @@ -201,7 +201,8 @@ struct drm_bridge {
> > int drm_bridge_add(struct drm_bridge *bridge);
> > void drm_bridge_remove(struct drm_bridge *bridge);
> > struct drm_bridge *of_drm_find_bridge(struct device_node *np);
> > -int drm_bridge_attach(struct drm_device *dev, struct drm_bridge *bridge);
> > +int drm_bridge_attach(struct drm_encoder *encoder, struct drm_bridge *bridge,
> > + struct drm_bridge *previous);
> > void drm_bridge_detach(struct drm_bridge *bridge);
> >
> > bool drm_bridge_mode_fixup(struct drm_bridge *bridge,
> >
>
> --
> Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum,
> a Linux Foundation Collaborative Project
> _______________________________________________
> dri-devel mailing list
> dri-devel@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/dri-devel
--
Daniel Vetter
Software Engineer, Intel Corporation
http://blog.ffwll.ch
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH v4 3/5] drm: bridge: Link encoder and bridge in core code
2016-12-16 13:29 ` Daniel Vetter
@ 2016-12-16 13:29 ` Daniel Vetter
0 siblings, 0 replies; 17+ messages in thread
From: Daniel Vetter @ 2016-12-16 13:29 UTC (permalink / raw)
To: Archit Taneja
Cc: Laurent Pinchart, Alexey Brodkin, Seung-Woo Kim, Kyungmin Park,
dri-devel, Xinliang Liu, Xinwei Kong, Tomi Valkeinen, Jyri Sarha,
Chen Feng, Rongrong Zou, Maxime Ripard, Chen-Yu Tsai
On Fri, Dec 16, 2016 at 02:29:00PM +0100, Daniel Vetter wrote:
> On Fri, Dec 16, 2016 at 02:05:48PM +0530, Archit Taneja wrote:
> > Hi,
> >
> > On 12/14/2016 03:29 PM, Laurent Pinchart wrote:
> > > Instead of linking encoders and bridges in every driver (and getting it
> > > wrong half of the time, as many drivers forget to set the drm_bridge
> > > encoder pointer), do so in core code. The drm_bridge_attach() function
> > > needs the encoder and optional previous bridge to perform that task,
> > > update all the callers.
> > >
> > > Signed-off-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
> > > Acked-by: Stefan Agner <stefan@agner.ch> # For DCU
> > > Acked-by: Boris Brezillon <boris.brezillon@free-electrons.com> # For atmel-hlcdc
> > > Acked-by: Vincent Abriou <vincent.abriou@st.com> # For STI
> >
> > This one needs acks for arcgpu, tilcdc, mediatek and imx. The changes in
> > those drivers look good to me, though. Will push it in a day or so unless anyone
> > has any comments on it.
>
> Imo big refactorings don't need ack from every driver maintainer, since
> some fail to do their jobs timely. Overall review + a few acks should be
> good enough. Anyway I double-checked things and looks all good.
>
> Signed-off-by: Daniel Vetter <daniel.vetter@intel.com>
Argh, wrong macro ;-)
Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch>
> >
> > Thanks,
> > Archit
> >
> > > ---
> > > drivers/gpu/drm/arc/arcpgu_hdmi.c | 5 +--
> > > drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_output.c | 4 +-
> > > drivers/gpu/drm/bridge/analogix/analogix_dp_core.c | 4 +-
> > > drivers/gpu/drm/bridge/dw-hdmi.c | 3 +-
> > > drivers/gpu/drm/drm_bridge.c | 46 ++++++++++++++++------
> > > drivers/gpu/drm/drm_simple_kms_helper.c | 4 +-
> > > drivers/gpu/drm/exynos/exynos_dp.c | 5 +--
> > > drivers/gpu/drm/exynos/exynos_drm_dsi.c | 6 +--
> > > drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_rgb.c | 5 +--
> > > drivers/gpu/drm/hisilicon/kirin/dw_drm_dsi.c | 5 +--
> > > drivers/gpu/drm/imx/imx-ldb.c | 6 +--
> > > drivers/gpu/drm/imx/parallel-display.c | 4 +-
> > > drivers/gpu/drm/mediatek/mtk_dpi.c | 8 ++--
> > > drivers/gpu/drm/mediatek/mtk_dsi.c | 24 ++---------
> > > drivers/gpu/drm/mediatek/mtk_hdmi.c | 11 +++---
> > > drivers/gpu/drm/msm/dsi/dsi_manager.c | 17 +++++---
> > > drivers/gpu/drm/msm/edp/edp_bridge.c | 2 +-
> > > drivers/gpu/drm/msm/hdmi/hdmi_bridge.c | 2 +-
> > > drivers/gpu/drm/rcar-du/rcar_du_hdmienc.c | 5 +--
> > > drivers/gpu/drm/sti/sti_dvo.c | 3 +-
> > > drivers/gpu/drm/sti/sti_hda.c | 3 +-
> > > drivers/gpu/drm/sti/sti_hdmi.c | 3 +-
> > > drivers/gpu/drm/sun4i/sun4i_rgb.c | 13 +++---
> > > drivers/gpu/drm/tilcdc/tilcdc_external.c | 4 +-
> > > include/drm/drm_bridge.h | 3 +-
> > > 25 files changed, 85 insertions(+), 110 deletions(-)
> > >
> > > diff --git a/drivers/gpu/drm/arc/arcpgu_hdmi.c b/drivers/gpu/drm/arc/arcpgu_hdmi.c
> > > index b69c66b4897e..0ce7f398bcff 100644
> > > --- a/drivers/gpu/drm/arc/arcpgu_hdmi.c
> > > +++ b/drivers/gpu/drm/arc/arcpgu_hdmi.c
> > > @@ -47,10 +47,7 @@ int arcpgu_drm_hdmi_init(struct drm_device *drm, struct device_node *np)
> > > return ret;
> > >
> > > /* Link drm_bridge to encoder */
> > > - bridge->encoder = encoder;
> > > - encoder->bridge = bridge;
> > > -
> > > - ret = drm_bridge_attach(drm, bridge);
> > > + ret = drm_bridge_attach(encoder, bridge, NULL);
> > > if (ret)
> > > drm_encoder_cleanup(encoder);
> > >
> > > diff --git a/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_output.c b/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_output.c
> > > index 6119b5085501..e7799b6ee829 100644
> > > --- a/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_output.c
> > > +++ b/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_output.c
> > > @@ -230,9 +230,7 @@ static int atmel_hlcdc_attach_endpoint(struct drm_device *dev,
> > > of_node_put(np);
> > >
> > > if (bridge) {
> > > - output->encoder.bridge = bridge;
> > > - bridge->encoder = &output->encoder;
> > > - ret = drm_bridge_attach(dev, bridge);
> > > + ret = drm_bridge_attach(&output->encoder, bridge, NULL);
> > > if (!ret)
> > > return 0;
> > > }
> > > diff --git a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c
> > > index eb9bf8786c24..b7494c8d43fe 100644
> > > --- a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c
> > > +++ b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c
> > > @@ -1227,12 +1227,10 @@ static int analogix_dp_create_bridge(struct drm_device *drm_dev,
> > >
> > > dp->bridge = bridge;
> > >
> > > - dp->encoder->bridge = bridge;
> > > bridge->driver_private = dp;
> > > - bridge->encoder = dp->encoder;
> > > bridge->funcs = &analogix_dp_bridge_funcs;
> > >
> > > - ret = drm_bridge_attach(drm_dev, bridge);
> > > + ret = drm_bridge_attach(dp->encoder, bridge, NULL);
> > > if (ret) {
> > > DRM_ERROR("failed to attach drm bridge\n");
> > > return -EINVAL;
> > > diff --git a/drivers/gpu/drm/bridge/dw-hdmi.c b/drivers/gpu/drm/bridge/dw-hdmi.c
> > > index 235ce7d1583d..f5009ae39b89 100644
> > > --- a/drivers/gpu/drm/bridge/dw-hdmi.c
> > > +++ b/drivers/gpu/drm/bridge/dw-hdmi.c
> > > @@ -1841,13 +1841,12 @@ static int dw_hdmi_register(struct drm_device *drm, struct dw_hdmi *hdmi)
> > > hdmi->bridge = bridge;
> > > bridge->driver_private = hdmi;
> > > bridge->funcs = &dw_hdmi_bridge_funcs;
> > > - ret = drm_bridge_attach(drm, bridge);
> > > + ret = drm_bridge_attach(encoder, bridge, NULL);
> > > if (ret) {
> > > DRM_ERROR("Failed to initialize bridge with drm\n");
> > > return -EINVAL;
> > > }
> > >
> > > - encoder->bridge = bridge;
> > > hdmi->connector.polled = DRM_CONNECTOR_POLL_HPD;
> > >
> > > drm_connector_helper_add(&hdmi->connector,
> > > diff --git a/drivers/gpu/drm/drm_bridge.c b/drivers/gpu/drm/drm_bridge.c
> > > index 0ee052b7c21a..850bd6509ef1 100644
> > > --- a/drivers/gpu/drm/drm_bridge.c
> > > +++ b/drivers/gpu/drm/drm_bridge.c
> > > @@ -26,6 +26,7 @@
> > > #include <linux/mutex.h>
> > >
> > > #include <drm/drm_bridge.h>
> > > +#include <drm/drm_encoder.h>
> > >
> > > /**
> > > * DOC: overview
> > > @@ -92,32 +93,53 @@ void drm_bridge_remove(struct drm_bridge *bridge)
> > > EXPORT_SYMBOL(drm_bridge_remove);
> > >
> > > /**
> > > - * drm_bridge_attach - associate given bridge to our DRM device
> > > + * drm_bridge_attach - attach the bridge to an encoder's chain
> > > *
> > > - * @dev: DRM device
> > > - * @bridge: bridge control structure
> > > + * @encoder: DRM encoder
> > > + * @bridge: bridge to attach
> > > + * @previous: previous bridge in the chain (optional)
> > > *
> > > - * Called by a kms driver to link one of our encoder/bridge to the given
> > > - * bridge.
> > > + * Called by a kms driver to link the bridge to an encoder's chain. The previous
> > > + * argument specifies the previous bridge in the chain. If NULL, the bridge is
> > > + * linked directly at the encoder's output. Otherwise it is linked at the
> > > + * previous bridge's output.
> > > *
> > > - * Note that setting up links between the bridge and our encoder/bridge
> > > - * objects needs to be handled by the kms driver itself.
> > > + * If non-NULL the previous bridge must be already attached by a call to this
> > > + * function.
> > > *
> > > * RETURNS:
> > > * Zero on success, error code on failure
> > > */
> > > -int drm_bridge_attach(struct drm_device *dev, struct drm_bridge *bridge)
> > > +int drm_bridge_attach(struct drm_encoder *encoder, struct drm_bridge *bridge,
> > > + struct drm_bridge *previous)
> > > {
> > > - if (!dev || !bridge)
> > > + int ret;
> > > +
> > > + if (!encoder || !bridge)
> > > + return -EINVAL;
> > > +
> > > + if (previous && (!previous->dev || previous->encoder != encoder))
> > > return -EINVAL;
> > >
> > > if (bridge->dev)
> > > return -EBUSY;
> > >
> > > - bridge->dev = dev;
> > > + bridge->dev = encoder->dev;
> > > + bridge->encoder = encoder;
> > > +
> > > + if (bridge->funcs->attach) {
> > > + ret = bridge->funcs->attach(bridge);
> > > + if (ret < 0) {
> > > + bridge->dev = NULL;
> > > + bridge->encoder = NULL;
> > > + return ret;
> > > + }
> > > + }
> > >
> > > - if (bridge->funcs->attach)
> > > - return bridge->funcs->attach(bridge);
> > > + if (previous)
> > > + previous->next = bridge;
> > > + else
> > > + encoder->bridge = bridge;
> > >
> > > return 0;
> > > }
> > > diff --git a/drivers/gpu/drm/drm_simple_kms_helper.c b/drivers/gpu/drm/drm_simple_kms_helper.c
> > > index 7bae08c2bf0a..ba7be6169339 100644
> > > --- a/drivers/gpu/drm/drm_simple_kms_helper.c
> > > +++ b/drivers/gpu/drm/drm_simple_kms_helper.c
> > > @@ -182,9 +182,7 @@ static const struct drm_plane_funcs drm_simple_kms_plane_funcs = {
> > > int drm_simple_display_pipe_attach_bridge(struct drm_simple_display_pipe *pipe,
> > > struct drm_bridge *bridge)
> > > {
> > > - bridge->encoder = &pipe->encoder;
> > > - pipe->encoder.bridge = bridge;
> > > - return drm_bridge_attach(pipe->encoder.dev, bridge);
> > > + return drm_bridge_attach(&pipe->encoder, bridge, NULL);
> > > }
> > > EXPORT_SYMBOL(drm_simple_display_pipe_attach_bridge);
> > >
> > > diff --git a/drivers/gpu/drm/exynos/exynos_dp.c b/drivers/gpu/drm/exynos/exynos_dp.c
> > > index 528229faffe4..1ef0be338b85 100644
> > > --- a/drivers/gpu/drm/exynos/exynos_dp.c
> > > +++ b/drivers/gpu/drm/exynos/exynos_dp.c
> > > @@ -99,7 +99,6 @@ static int exynos_dp_bridge_attach(struct analogix_dp_plat_data *plat_data,
> > > struct drm_connector *connector)
> > > {
> > > struct exynos_dp_device *dp = to_dp(plat_data);
> > > - struct drm_encoder *encoder = &dp->encoder;
> > > int ret;
> > >
> > > drm_connector_register(connector);
> > > @@ -107,9 +106,7 @@ static int exynos_dp_bridge_attach(struct analogix_dp_plat_data *plat_data,
> > >
> > > /* Pre-empt DP connector creation if there's a bridge */
> > > if (dp->ptn_bridge) {
> > > - bridge->next = dp->ptn_bridge;
> > > - dp->ptn_bridge->encoder = encoder;
> > > - ret = drm_bridge_attach(encoder->dev, dp->ptn_bridge);
> > > + ret = drm_bridge_attach(&dp->encoder, dp->ptn_bridge, bridge);
> > > if (ret) {
> > > DRM_ERROR("Failed to attach bridge to drm\n");
> > > bridge->next = NULL;
> > > diff --git a/drivers/gpu/drm/exynos/exynos_drm_dsi.c b/drivers/gpu/drm/exynos/exynos_drm_dsi.c
> > > index e07cb1fe4860..812e2ec0761d 100644
> > > --- a/drivers/gpu/drm/exynos/exynos_drm_dsi.c
> > > +++ b/drivers/gpu/drm/exynos/exynos_drm_dsi.c
> > > @@ -1718,10 +1718,8 @@ static int exynos_dsi_bind(struct device *dev, struct device *master,
> > > }
> > >
> > > bridge = of_drm_find_bridge(dsi->bridge_node);
> > > - if (bridge) {
> > > - encoder->bridge = bridge;
> > > - drm_bridge_attach(drm_dev, bridge);
> > > - }
> > > + if (bridge)
> > > + drm_bridge_attach(encoder, bridge, NULL);
> > >
> > > return mipi_dsi_host_register(&dsi->dsi_host);
> > > }
> > > diff --git a/drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_rgb.c b/drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_rgb.c
> > > index 05a8ee106879..c3651456c963 100644
> > > --- a/drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_rgb.c
> > > +++ b/drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_rgb.c
> > > @@ -160,10 +160,7 @@ static int fsl_dcu_attach_endpoint(struct fsl_dcu_drm_device *fsl_dev,
> > > if (!bridge)
> > > return -ENODEV;
> > >
> > > - fsl_dev->encoder.bridge = bridge;
> > > - bridge->encoder = &fsl_dev->encoder;
> > > -
> > > - return drm_bridge_attach(fsl_dev->drm, bridge);
> > > + return drm_bridge_attach(&fsl_dev->encoder, bridge, NULL);
> > > }
> > >
> > > int fsl_dcu_create_outputs(struct fsl_dcu_drm_device *fsl_dev)
> > > diff --git a/drivers/gpu/drm/hisilicon/kirin/dw_drm_dsi.c b/drivers/gpu/drm/hisilicon/kirin/dw_drm_dsi.c
> > > index 998452ad0fcb..1737e98bc10a 100644
> > > --- a/drivers/gpu/drm/hisilicon/kirin/dw_drm_dsi.c
> > > +++ b/drivers/gpu/drm/hisilicon/kirin/dw_drm_dsi.c
> > > @@ -709,10 +709,7 @@ static int dsi_bridge_init(struct drm_device *dev, struct dw_dsi *dsi)
> > > int ret;
> > >
> > > /* associate the bridge to dsi encoder */
> > > - encoder->bridge = bridge;
> > > - bridge->encoder = encoder;
> > > -
> > > - ret = drm_bridge_attach(dev, bridge);
> > > + ret = drm_bridge_attach(encoder, bridge, NULL);
> > > if (ret) {
> > > DRM_ERROR("failed to attach external bridge\n");
> > > return ret;
> > > diff --git a/drivers/gpu/drm/imx/imx-ldb.c b/drivers/gpu/drm/imx/imx-ldb.c
> > > index 516d06490465..ec49ea3d8e40 100644
> > > --- a/drivers/gpu/drm/imx/imx-ldb.c
> > > +++ b/drivers/gpu/drm/imx/imx-ldb.c
> > > @@ -454,10 +454,8 @@ static int imx_ldb_register(struct drm_device *drm,
> > > DRM_MODE_ENCODER_LVDS, NULL);
> > >
> > > if (imx_ldb_ch->bridge) {
> > > - imx_ldb_ch->bridge->encoder = encoder;
> > > -
> > > - imx_ldb_ch->encoder.bridge = imx_ldb_ch->bridge;
> > > - ret = drm_bridge_attach(drm, imx_ldb_ch->bridge);
> > > + ret = drm_bridge_attach(&imx_ldb_ch->encoder,
> > > + imx_ldb_ch->bridge, NULL);
> > > if (ret) {
> > > DRM_ERROR("Failed to initialize bridge with drm\n");
> > > return ret;
> > > diff --git a/drivers/gpu/drm/imx/parallel-display.c b/drivers/gpu/drm/imx/parallel-display.c
> > > index 8582a83c0d9b..51d9f735c358 100644
> > > --- a/drivers/gpu/drm/imx/parallel-display.c
> > > +++ b/drivers/gpu/drm/imx/parallel-display.c
> > > @@ -191,9 +191,7 @@ static int imx_pd_register(struct drm_device *drm,
> > > drm_panel_attach(imxpd->panel, &imxpd->connector);
> > >
> > > if (imxpd->bridge) {
> > > - imxpd->bridge->encoder = encoder;
> > > - encoder->bridge = imxpd->bridge;
> > > - ret = drm_bridge_attach(drm, imxpd->bridge);
> > > + ret = drm_bridge_attach(encoder, imxpd->bridge, NULL);
> > > if (ret < 0) {
> > > dev_err(imxpd->dev, "failed to attach bridge: %d\n",
> > > ret);
> > > diff --git a/drivers/gpu/drm/mediatek/mtk_dpi.c b/drivers/gpu/drm/mediatek/mtk_dpi.c
> > > index 90fb831ef031..3bd3bd688d1a 100644
> > > --- a/drivers/gpu/drm/mediatek/mtk_dpi.c
> > > +++ b/drivers/gpu/drm/mediatek/mtk_dpi.c
> > > @@ -63,6 +63,7 @@ enum mtk_dpi_out_color_format {
> > > struct mtk_dpi {
> > > struct mtk_ddp_comp ddp_comp;
> > > struct drm_encoder encoder;
> > > + struct drm_bridge *bridge;
> > > void __iomem *regs;
> > > struct device *dev;
> > > struct clk *engine_clk;
> > > @@ -620,8 +621,7 @@ static int mtk_dpi_bind(struct device *dev, struct device *master, void *data)
> > > /* Currently DPI0 is fixed to be driven by OVL1 */
> > > dpi->encoder.possible_crtcs = BIT(1);
> > >
> > > - dpi->encoder.bridge->encoder = &dpi->encoder;
> > > - ret = drm_bridge_attach(dpi->encoder.dev, dpi->encoder.bridge);
> > > + ret = drm_bridge_attach(&dpi->encoder, dpi->bridge, NULL);
> > > if (ret) {
> > > dev_err(dev, "Failed to attach bridge: %d\n", ret);
> > > goto err_cleanup;
> > > @@ -718,9 +718,9 @@ static int mtk_dpi_probe(struct platform_device *pdev)
> > >
> > > dev_info(dev, "Found bridge node: %s\n", bridge_node->full_name);
> > >
> > > - dpi->encoder.bridge = of_drm_find_bridge(bridge_node);
> > > + dpi->bridge = of_drm_find_bridge(bridge_node);
> > > of_node_put(bridge_node);
> > > - if (!dpi->encoder.bridge)
> > > + if (!dpi->bridge)
> > > return -EPROBE_DEFER;
> > >
> > > comp_id = mtk_ddp_comp_get_id(dev->of_node, MTK_DPI);
> > > diff --git a/drivers/gpu/drm/mediatek/mtk_dsi.c b/drivers/gpu/drm/mediatek/mtk_dsi.c
> > > index 2c42f90809d8..dd71cbb1a622 100644
> > > --- a/drivers/gpu/drm/mediatek/mtk_dsi.c
> > > +++ b/drivers/gpu/drm/mediatek/mtk_dsi.c
> > > @@ -622,26 +622,6 @@ static const struct drm_connector_helper_funcs
> > > .get_modes = mtk_dsi_connector_get_modes,
> > > };
> > >
> > > -static int mtk_drm_attach_bridge(struct drm_bridge *bridge,
> > > - struct drm_encoder *encoder)
> > > -{
> > > - int ret;
> > > -
> > > - if (!bridge)
> > > - return -ENOENT;
> > > -
> > > - encoder->bridge = bridge;
> > > - bridge->encoder = encoder;
> > > - ret = drm_bridge_attach(encoder->dev, bridge);
> > > - if (ret) {
> > > - DRM_ERROR("Failed to attach bridge to drm\n");
> > > - encoder->bridge = NULL;
> > > - bridge->encoder = NULL;
> > > - }
> > > -
> > > - return ret;
> > > -}
> > > -
> > > static int mtk_dsi_create_connector(struct drm_device *drm, struct mtk_dsi *dsi)
> > > {
> > > int ret;
> > > @@ -692,8 +672,10 @@ static int mtk_dsi_create_conn_enc(struct drm_device *drm, struct mtk_dsi *dsi)
> > > dsi->encoder.possible_crtcs = 1;
> > >
> > > /* If there's a bridge, attach to it and let it create the connector */
> > > - ret = mtk_drm_attach_bridge(dsi->bridge, &dsi->encoder);
> > > + ret = drm_bridge_attach(&dsi->encoder, dsi->bridge, NULL);
> > > if (ret) {
> > > + DRM_ERROR("Failed to attach bridge to drm\n");
> > > +
> > > /* Otherwise create our own connector and attach to a panel */
> > > ret = mtk_dsi_create_connector(drm, dsi);
> > > if (ret)
> > > diff --git a/drivers/gpu/drm/mediatek/mtk_hdmi.c b/drivers/gpu/drm/mediatek/mtk_hdmi.c
> > > index 0e8c4d9af340..c26251260b83 100644
> > > --- a/drivers/gpu/drm/mediatek/mtk_hdmi.c
> > > +++ b/drivers/gpu/drm/mediatek/mtk_hdmi.c
> > > @@ -149,6 +149,7 @@ struct hdmi_audio_param {
> > >
> > > struct mtk_hdmi {
> > > struct drm_bridge bridge;
> > > + struct drm_bridge *next_bridge;
> > > struct drm_connector conn;
> > > struct device *dev;
> > > struct phy *phy;
> > > @@ -1314,9 +1315,9 @@ static int mtk_hdmi_bridge_attach(struct drm_bridge *bridge)
> > > return ret;
> > > }
> > >
> > > - if (bridge->next) {
> > > - bridge->next->encoder = bridge->encoder;
> > > - ret = drm_bridge_attach(bridge->encoder->dev, bridge->next);
> > > + if (hdmi->next_bridge) {
> > > + ret = drm_bridge_attach(bridge->encoder, hdmi->next_bridge,
> > > + bridge);
> > > if (ret) {
> > > dev_err(hdmi->dev,
> > > "Failed to attach external bridge: %d\n", ret);
> > > @@ -1510,8 +1511,8 @@ static int mtk_hdmi_dt_parse_pdata(struct mtk_hdmi *hdmi,
> > > of_node_put(ep);
> > >
> > > if (!of_device_is_compatible(remote, "hdmi-connector")) {
> > > - hdmi->bridge.next = of_drm_find_bridge(remote);
> > > - if (!hdmi->bridge.next) {
> > > + hdmi->next_bridge = of_drm_find_bridge(remote);
> > > + if (!hdmi->next_bridge) {
> > > dev_err(dev, "Waiting for external bridge\n");
> > > of_node_put(remote);
> > > return -EPROBE_DEFER;
> > > diff --git a/drivers/gpu/drm/msm/dsi/dsi_manager.c b/drivers/gpu/drm/msm/dsi/dsi_manager.c
> > > index c8d1f19c9a6d..2bd8dad76105 100644
> > > --- a/drivers/gpu/drm/msm/dsi/dsi_manager.c
> > > +++ b/drivers/gpu/drm/msm/dsi/dsi_manager.c
> > > @@ -579,6 +579,7 @@ struct drm_bridge *msm_dsi_manager_bridge_init(u8 id)
> > > struct msm_dsi *msm_dsi = dsi_mgr_get_dsi(id);
> > > struct drm_bridge *bridge = NULL;
> > > struct dsi_bridge *dsi_bridge;
> > > + struct drm_encoder *encoder;
> > > int ret;
> > >
> > > dsi_bridge = devm_kzalloc(msm_dsi->dev->dev,
> > > @@ -590,10 +591,18 @@ struct drm_bridge *msm_dsi_manager_bridge_init(u8 id)
> > >
> > > dsi_bridge->id = id;
> > >
> > > + /*
> > > + * HACK: we may not know the external DSI bridge device's mode
> > > + * flags here. We'll get to know them only when the device
> > > + * attaches to the dsi host. For now, assume the bridge supports
> > > + * DSI video mode
> > > + */
> > > + encoder = msm_dsi->encoders[MSM_DSI_VIDEO_ENCODER_ID];
> > > +
> > > bridge = &dsi_bridge->base;
> > > bridge->funcs = &dsi_mgr_bridge_funcs;
> > >
> > > - ret = drm_bridge_attach(msm_dsi->dev, bridge);
> > > + ret = drm_bridge_attach(encoder, bridge, NULL);
> > > if (ret)
> > > goto fail;
> > >
> > > @@ -628,11 +637,7 @@ struct drm_connector *msm_dsi_manager_ext_bridge_init(u8 id)
> > > encoder = msm_dsi->encoders[MSM_DSI_VIDEO_ENCODER_ID];
> > >
> > > /* link the internal dsi bridge to the external bridge */
> > > - int_bridge->next = ext_bridge;
> > > - /* set the external bridge's encoder as dsi's encoder */
> > > - ext_bridge->encoder = encoder;
> > > -
> > > - drm_bridge_attach(dev, ext_bridge);
> > > + drm_bridge_attach(encoder, ext_bridge, int_bridge);
> > >
> > > /*
> > > * we need the drm_connector created by the external bridge
> > > diff --git a/drivers/gpu/drm/msm/edp/edp_bridge.c b/drivers/gpu/drm/msm/edp/edp_bridge.c
> > > index 2bc73f82f3f5..931a5c97cccf 100644
> > > --- a/drivers/gpu/drm/msm/edp/edp_bridge.c
> > > +++ b/drivers/gpu/drm/msm/edp/edp_bridge.c
> > > @@ -106,7 +106,7 @@ struct drm_bridge *msm_edp_bridge_init(struct msm_edp *edp)
> > > bridge = &edp_bridge->base;
> > > bridge->funcs = &edp_bridge_funcs;
> > >
> > > - ret = drm_bridge_attach(edp->dev, bridge);
> > > + ret = drm_bridge_attach(edp->encoder, bridge, NULL);
> > > if (ret)
> > > goto fail;
> > >
> > > diff --git a/drivers/gpu/drm/msm/hdmi/hdmi_bridge.c b/drivers/gpu/drm/msm/hdmi/hdmi_bridge.c
> > > index bacbd5d8df0e..4e6d1bf27474 100644
> > > --- a/drivers/gpu/drm/msm/hdmi/hdmi_bridge.c
> > > +++ b/drivers/gpu/drm/msm/hdmi/hdmi_bridge.c
> > > @@ -227,7 +227,7 @@ struct drm_bridge *msm_hdmi_bridge_init(struct hdmi *hdmi)
> > > bridge = &hdmi_bridge->base;
> > > bridge->funcs = &msm_hdmi_bridge_funcs;
> > >
> > > - ret = drm_bridge_attach(hdmi->dev, bridge);
> > > + ret = drm_bridge_attach(hdmi->encoder, bridge, NULL);
> > > if (ret)
> > > goto fail;
> > >
> > > diff --git a/drivers/gpu/drm/rcar-du/rcar_du_hdmienc.c b/drivers/gpu/drm/rcar-du/rcar_du_hdmienc.c
> > > index a1a2c5e7822c..933a2547798e 100644
> > > --- a/drivers/gpu/drm/rcar-du/rcar_du_hdmienc.c
> > > +++ b/drivers/gpu/drm/rcar-du/rcar_du_hdmienc.c
> > > @@ -124,10 +124,7 @@ int rcar_du_hdmienc_init(struct rcar_du_device *rcdu,
> > > hdmienc->renc = renc;
> > >
> > > /* Link the bridge to the encoder. */
> > > - bridge->encoder = encoder;
> > > - encoder->bridge = bridge;
> > > -
> > > - ret = drm_bridge_attach(rcdu->ddev, bridge);
> > > + ret = drm_bridge_attach(encoder, bridge, NULL);
> > > if (ret) {
> > > drm_encoder_cleanup(encoder);
> > > return ret;
> > > diff --git a/drivers/gpu/drm/sti/sti_dvo.c b/drivers/gpu/drm/sti/sti_dvo.c
> > > index e8c1ed08a9f7..411dc6ec976e 100644
> > > --- a/drivers/gpu/drm/sti/sti_dvo.c
> > > +++ b/drivers/gpu/drm/sti/sti_dvo.c
> > > @@ -478,14 +478,13 @@ static int sti_dvo_bind(struct device *dev, struct device *master, void *data)
> > > return err;
> > > }
> > >
> > > - err = drm_bridge_attach(drm_dev, bridge);
> > > + err = drm_bridge_attach(encoder, bridge, NULL);
> > > if (err) {
> > > DRM_ERROR("Failed to attach bridge\n");
> > > return err;
> > > }
> > >
> > > dvo->bridge = bridge;
> > > - encoder->bridge = bridge;
> > > connector->encoder = encoder;
> > > dvo->encoder = encoder;
> > >
> > > diff --git a/drivers/gpu/drm/sti/sti_hda.c b/drivers/gpu/drm/sti/sti_hda.c
> > > index 96f336dd0e29..66d37d78152a 100644
> > > --- a/drivers/gpu/drm/sti/sti_hda.c
> > > +++ b/drivers/gpu/drm/sti/sti_hda.c
> > > @@ -707,9 +707,8 @@ static int sti_hda_bind(struct device *dev, struct device *master, void *data)
> > >
> > > bridge->driver_private = hda;
> > > bridge->funcs = &sti_hda_bridge_funcs;
> > > - drm_bridge_attach(drm_dev, bridge);
> > > + drm_bridge_attach(encoder, bridge, NULL);
> > >
> > > - encoder->bridge = bridge;
> > > connector->encoder = encoder;
> > >
> > > drm_connector = (struct drm_connector *)connector;
> > > diff --git a/drivers/gpu/drm/sti/sti_hdmi.c b/drivers/gpu/drm/sti/sti_hdmi.c
> > > index 376b0763c874..f0af1ae82ee9 100644
> > > --- a/drivers/gpu/drm/sti/sti_hdmi.c
> > > +++ b/drivers/gpu/drm/sti/sti_hdmi.c
> > > @@ -1308,9 +1308,8 @@ static int sti_hdmi_bind(struct device *dev, struct device *master, void *data)
> > >
> > > bridge->driver_private = hdmi;
> > > bridge->funcs = &sti_hdmi_bridge_funcs;
> > > - drm_bridge_attach(drm_dev, bridge);
> > > + drm_bridge_attach(encoder, bridge, NULL);
> > >
> > > - encoder->bridge = bridge;
> > > connector->encoder = encoder;
> > >
> > > drm_connector = (struct drm_connector *)connector;
> > > diff --git a/drivers/gpu/drm/sun4i/sun4i_rgb.c b/drivers/gpu/drm/sun4i/sun4i_rgb.c
> > > index f5e86fe7750e..757208f51731 100644
> > > --- a/drivers/gpu/drm/sun4i/sun4i_rgb.c
> > > +++ b/drivers/gpu/drm/sun4i/sun4i_rgb.c
> > > @@ -208,6 +208,7 @@ int sun4i_rgb_init(struct drm_device *drm)
> > > struct sun4i_drv *drv = drm->dev_private;
> > > struct sun4i_tcon *tcon = drv->tcon;
> > > struct drm_encoder *encoder;
> > > + struct drm_bridge *bridge;
> > > struct sun4i_rgb *rgb;
> > > int ret;
> > >
> > > @@ -218,8 +219,8 @@ int sun4i_rgb_init(struct drm_device *drm)
> > > encoder = &rgb->encoder;
> > >
> > > tcon->panel = sun4i_tcon_find_panel(tcon->dev->of_node);
> > > - encoder->bridge = sun4i_tcon_find_bridge(tcon->dev->of_node);
> > > - if (IS_ERR(tcon->panel) && IS_ERR(encoder->bridge)) {
> > > + bridge = sun4i_tcon_find_bridge(tcon->dev->of_node);
> > > + if (IS_ERR(tcon->panel) && IS_ERR(bridge)) {
> > > dev_info(drm->dev, "No panel or bridge found... RGB output disabled\n");
> > > return 0;
> > > }
> > > @@ -260,16 +261,12 @@ int sun4i_rgb_init(struct drm_device *drm)
> > > }
> > > }
> > >
> > > - if (!IS_ERR(encoder->bridge)) {
> > > - encoder->bridge->encoder = &rgb->encoder;
> > > -
> > > - ret = drm_bridge_attach(drm, encoder->bridge);
> > > + if (!IS_ERR(bridge)) {
> > > + ret = drm_bridge_attach(encoder, bridge, NULL);
> > > if (ret) {
> > > dev_err(drm->dev, "Couldn't attach our bridge\n");
> > > goto err_cleanup_connector;
> > > }
> > > - } else {
> > > - encoder->bridge = NULL;
> > > }
> > >
> > > return 0;
> > > diff --git a/drivers/gpu/drm/tilcdc/tilcdc_external.c b/drivers/gpu/drm/tilcdc/tilcdc_external.c
> > > index c67d7cd7d57e..b0dd5e8634ae 100644
> > > --- a/drivers/gpu/drm/tilcdc/tilcdc_external.c
> > > +++ b/drivers/gpu/drm/tilcdc/tilcdc_external.c
> > > @@ -167,10 +167,8 @@ int tilcdc_attach_bridge(struct drm_device *ddev, struct drm_bridge *bridge)
> > > int ret;
> > >
> > > priv->external_encoder->possible_crtcs = BIT(0);
> > > - priv->external_encoder->bridge = bridge;
> > > - bridge->encoder = priv->external_encoder;
> > >
> > > - ret = drm_bridge_attach(ddev, bridge);
> > > + ret = drm_bridge_attach(priv->external_encoder, bridge, NULL);
> > > if (ret) {
> > > dev_err(ddev->dev, "drm_bridge_attach() failed %d\n", ret);
> > > return ret;
> > > diff --git a/include/drm/drm_bridge.h b/include/drm/drm_bridge.h
> > > index 530a1d6e8cde..94e5ee96b3b5 100644
> > > --- a/include/drm/drm_bridge.h
> > > +++ b/include/drm/drm_bridge.h
> > > @@ -201,7 +201,8 @@ struct drm_bridge {
> > > int drm_bridge_add(struct drm_bridge *bridge);
> > > void drm_bridge_remove(struct drm_bridge *bridge);
> > > struct drm_bridge *of_drm_find_bridge(struct device_node *np);
> > > -int drm_bridge_attach(struct drm_device *dev, struct drm_bridge *bridge);
> > > +int drm_bridge_attach(struct drm_encoder *encoder, struct drm_bridge *bridge,
> > > + struct drm_bridge *previous);
> > > void drm_bridge_detach(struct drm_bridge *bridge);
> > >
> > > bool drm_bridge_mode_fixup(struct drm_bridge *bridge,
> > >
> >
> > --
> > Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum,
> > a Linux Foundation Collaborative Project
> > _______________________________________________
> > dri-devel mailing list
> > dri-devel@lists.freedesktop.org
> > https://lists.freedesktop.org/mailman/listinfo/dri-devel
>
> --
> Daniel Vetter
> Software Engineer, Intel Corporation
> http://blog.ffwll.ch
--
Daniel Vetter
Software Engineer, Intel Corporation
http://blog.ffwll.ch
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH v4 0/5] Cleanup DRM bridge attach/detach
2016-12-14 9:59 [PATCH v4 0/5] Cleanup DRM bridge attach/detach Laurent Pinchart
` (4 preceding siblings ...)
2016-12-14 9:59 ` [PATCH v4 5/5] drm: bridge: Detach all bridges in a chain " Laurent Pinchart
@ 2016-12-18 11:18 ` Archit Taneja
5 siblings, 0 replies; 17+ messages in thread
From: Archit Taneja @ 2016-12-18 11:18 UTC (permalink / raw)
To: Laurent Pinchart, dri-devel
On 12/14/2016 3:29 PM, Laurent Pinchart wrote:
> Hello,
>
> This patch series is a respin of the DRM bridge attach/detach cleanup patches
> that were previously part of "[PATCH v3 00/13] R-Car DU: Use drm bridge API".
> As patches 1/5 and 3/5 touch a large number of drivers and are thus painful to
> rebase, I'd like to get them merged soon without waiting for the whole R-Car
> DU series to be ready.
Queued to drm-misc-next.
Thanks,
Archit
>
> Laurent Pinchart (5):
> drm: Don't include <drm/drm_encoder.h> in <drm/drm_crtc.h>
> drm: Fix compilation warning caused by static inline forward
> declaration
> drm: bridge: Link encoder and bridge in core code
> drm: bridge: Detach bridge from encoder at encoder cleanup time
> drm: bridge: Detach all bridges in a chain at encoder cleanup time
>
> drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h | 1 +
> drivers/gpu/drm/arc/arcpgu_hdmi.c | 5 +-
> drivers/gpu/drm/ast/ast_drv.h | 1 +
> drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_output.c | 4 +-
> drivers/gpu/drm/bochs/bochs.h | 1 +
> drivers/gpu/drm/bridge/analogix/analogix_dp_core.c | 4 +-
> drivers/gpu/drm/bridge/dw-hdmi.c | 3 +-
> drivers/gpu/drm/cirrus/cirrus_drv.h | 1 +
> drivers/gpu/drm/drm_bridge.c | 59 +++++++++++++---------
> drivers/gpu/drm/drm_connector.c | 1 +
> drivers/gpu/drm/drm_crtc_helper.c | 1 +
> drivers/gpu/drm/drm_crtc_internal.h | 3 ++
> drivers/gpu/drm/drm_edid.c | 1 +
> drivers/gpu/drm/drm_encoder.c | 11 ++++
> drivers/gpu/drm/drm_mode_config.c | 1 +
> drivers/gpu/drm/drm_of.c | 1 +
> drivers/gpu/drm/drm_plane_helper.c | 1 +
> drivers/gpu/drm/drm_simple_kms_helper.c | 21 +-------
> drivers/gpu/drm/exynos/exynos_dp.c | 5 +-
> drivers/gpu/drm/exynos/exynos_drm_dsi.c | 6 +--
> drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_drv.h | 2 +
> drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_rgb.c | 5 +-
> drivers/gpu/drm/gma500/psb_intel_drv.h | 1 +
> drivers/gpu/drm/hisilicon/kirin/dw_drm_dsi.c | 5 +-
> drivers/gpu/drm/i915/intel_drv.h | 1 +
> drivers/gpu/drm/imx/imx-ldb.c | 8 +--
> drivers/gpu/drm/imx/parallel-display.c | 6 +--
> drivers/gpu/drm/mediatek/mtk_dpi.c | 8 +--
> drivers/gpu/drm/mediatek/mtk_dsi.c | 24 ++-------
> drivers/gpu/drm/mediatek/mtk_hdmi.c | 11 ++--
> drivers/gpu/drm/mgag200/mgag200_drv.h | 1 +
> drivers/gpu/drm/msm/dsi/dsi_manager.c | 17 ++++---
> drivers/gpu/drm/msm/edp/edp_bridge.c | 2 +-
> drivers/gpu/drm/msm/hdmi/hdmi_bridge.c | 2 +-
> drivers/gpu/drm/nouveau/nouveau_connector.h | 1 +
> drivers/gpu/drm/qxl/qxl_drv.h | 1 +
> drivers/gpu/drm/radeon/radeon_mode.h | 1 +
> drivers/gpu/drm/rcar-du/rcar_du_encoder.h | 1 +
> drivers/gpu/drm/rcar-du/rcar_du_hdmienc.c | 5 +-
> drivers/gpu/drm/shmobile/shmob_drm_crtc.h | 1 +
> drivers/gpu/drm/sti/sti_dvo.c | 3 +-
> drivers/gpu/drm/sti/sti_hda.c | 3 +-
> drivers/gpu/drm/sti/sti_hdmi.c | 3 +-
> drivers/gpu/drm/sun4i/sun4i_rgb.c | 13 ++---
> drivers/gpu/drm/tegra/drm.h | 1 +
> drivers/gpu/drm/tilcdc/tilcdc_external.c | 4 +-
> drivers/gpu/drm/vc4/vc4_drv.h | 2 +
> drivers/gpu/drm/virtio/virtgpu_drv.h | 1 +
> drivers/gpu/drm/vmwgfx/vmwgfx_kms.h | 1 +
> include/drm/drm_bridge.h | 4 +-
> include/drm/drm_crtc.h | 3 --
> include/drm/drm_encoder.h | 7 +--
> include/drm/drm_encoder_slave.h | 1 +
> include/drm/drm_modeset_helper_vtables.h | 1 +
> include/drm/drm_simple_kms_helper.h | 2 -
> 55 files changed, 132 insertions(+), 151 deletions(-)
>
--
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum,
a Linux Foundation Collaborative Project
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH v4 3/5] drm: bridge: Link encoder and bridge in core code
2016-12-16 8:35 ` Archit Taneja
2016-12-16 13:29 ` Daniel Vetter
@ 2016-12-23 11:10 ` Philipp Zabel
1 sibling, 0 replies; 17+ messages in thread
From: Philipp Zabel @ 2016-12-23 11:10 UTC (permalink / raw)
To: Archit Taneja
Cc: Xinliang Liu, Laurent Pinchart, Alexey Brodkin, Seung-Woo Kim,
Xinwei Kong, dri-devel, Kyungmin Park, Tomi Valkeinen,
Jyri Sarha, Chen Feng, Rongrong Zou, Maxime Ripard, Chen-Yu Tsai
Am Freitag, den 16.12.2016, 14:05 +0530 schrieb Archit Taneja:
> Hi,
>
> On 12/14/2016 03:29 PM, Laurent Pinchart wrote:
> > Instead of linking encoders and bridges in every driver (and getting it
> > wrong half of the time, as many drivers forget to set the drm_bridge
> > encoder pointer), do so in core code. The drm_bridge_attach() function
> > needs the encoder and optional previous bridge to perform that task,
> > update all the callers.
> >
> > Signed-off-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
> > Acked-by: Stefan Agner <stefan@agner.ch> # For DCU
> > Acked-by: Boris Brezillon <boris.brezillon@free-electrons.com> # For atmel-hlcdc
> > Acked-by: Vincent Abriou <vincent.abriou@st.com> # For STI
>
> This one needs acks for arcgpu, tilcdc, mediatek and imx. The changes in
> those drivers look good to me, though. Will push it in a day or so unless anyone
> has any comments on it.
for mediatek and imx
Acked-by: Philipp Zabel <p.zabel@pengutronix.de>
regards
Philipp
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply [flat|nested] 17+ messages in thread
end of thread, other threads:[~2016-12-23 11:10 UTC | newest]
Thread overview: 17+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-12-14 9:59 [PATCH v4 0/5] Cleanup DRM bridge attach/detach Laurent Pinchart
2016-12-14 9:59 ` [PATCH v4 1/5] drm: Don't include <drm/drm_encoder.h> in <drm/drm_crtc.h> Laurent Pinchart
2016-12-14 16:46 ` Alex Deucher
2016-12-14 9:59 ` [PATCH v4 2/5] drm: Fix compilation warning caused by static inline forward declaration Laurent Pinchart
2016-12-14 9:59 ` [PATCH v4 3/5] drm: bridge: Link encoder and bridge in core code Laurent Pinchart
2016-12-14 10:30 ` Maxime Ripard
2016-12-16 1:12 ` liuxinliang
2016-12-16 8:35 ` Archit Taneja
2016-12-16 13:29 ` Daniel Vetter
2016-12-16 13:29 ` Daniel Vetter
2016-12-23 11:10 ` Philipp Zabel
2016-12-16 9:17 ` Jyri Sarha
2016-12-14 9:59 ` [PATCH v4 4/5] drm: bridge: Detach bridge from encoder at encoder cleanup time Laurent Pinchart
2016-12-14 10:19 ` Daniel Vetter
2016-12-14 9:59 ` [PATCH v4 5/5] drm: bridge: Detach all bridges in a chain " Laurent Pinchart
2016-12-14 10:21 ` Daniel Vetter
2016-12-18 11:18 ` [PATCH v4 0/5] Cleanup DRM bridge attach/detach Archit Taneja
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.