* [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
* 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
* [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
* 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 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-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 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
* 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
* [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
* 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
* [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 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 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
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.