From mboxrd@z Thu Jan 1 00:00:00 1970 From: Ajay Kumar Subject: [RFC V2 1/3] drm: implement chaining of drm bridges Date: Tue, 06 May 2014 01:22:26 +0530 Message-ID: <1399319548-16567-2-git-send-email-ajaykumar.rs@samsung.com> References: <1399319548-16567-1-git-send-email-ajaykumar.rs@samsung.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: Received: from mailout4.samsung.com (mailout4.samsung.com [203.254.224.34]) by gabe.freedesktop.org (Postfix) with ESMTP id 265AA6E1E8 for ; Mon, 5 May 2014 12:53:29 -0700 (PDT) Received: from epcpsbgr3.samsung.com (u143.gpu120.samsung.co.kr [203.254.230.143]) by mailout4.samsung.com (Oracle Communications Messaging Server 7u4-24.01 (7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTP id <0N54003UD9X3V370@mailout4.samsung.com> for dri-devel@lists.freedesktop.org; Tue, 06 May 2014 04:53:27 +0900 (KST) In-reply-to: <1399319548-16567-1-git-send-email-ajaykumar.rs@samsung.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: dri-devel@lists.freedesktop.org, linux-samsung-soc@vger.kernel.org Cc: joshi@samsung.com, ajaynumb@gmail.com, prashanth.g@samsung.com, Ajay Kumar List-Id: dri-devel@lists.freedesktop.org As of now, we can have only one bridge hanging off the encoder. With this patch, we allow multiple bridges to hang onto the same encoder with the use of a simple next_bridge ptr. The drm core calls bridge->funcs for the first bridge which is attached to it, and its upto the individual bridge drivers to call bridge->funcs for the next bridge in the chain. Signed-off-by: Ajay Kumar --- drivers/gpu/drm/drm_crtc.c | 13 ++++++++++++- include/drm/drm_crtc.h | 2 ++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/drm/drm_crtc.c b/drivers/gpu/drm/drm_crtc.c index d8b7099..fe9905f 100644 --- a/drivers/gpu/drm/drm_crtc.c +++ b/drivers/gpu/drm/drm_crtc.c @@ -918,8 +918,10 @@ EXPORT_SYMBOL(drm_connector_unplug_all); * Zero on success, error code on failure. */ int drm_bridge_init(struct drm_device *dev, struct drm_bridge *bridge, - const struct drm_bridge_funcs *funcs) + struct drm_encoder *encoder, + const struct drm_bridge_funcs *funcs) { + struct drm_bridge *temp; int ret; drm_modeset_lock_all(dev); @@ -931,6 +933,15 @@ int drm_bridge_init(struct drm_device *dev, struct drm_bridge *bridge, bridge->dev = dev; bridge->funcs = funcs; + if (encoder->bridge) { + temp = encoder->bridge; + while (temp->next_bridge) + temp = temp->next_bridge; + + temp->next_bridge = bridge; + } else + encoder->bridge = bridge; + list_add_tail(&bridge->head, &dev->mode_config.bridge_list); dev->mode_config.num_bridge++; diff --git a/include/drm/drm_crtc.h b/include/drm/drm_crtc.h index e55fccb..bb6ed88 100644 --- a/include/drm/drm_crtc.h +++ b/include/drm/drm_crtc.h @@ -619,6 +619,7 @@ struct drm_bridge_funcs { struct drm_bridge { struct drm_device *dev; struct list_head head; + struct drm_bridge *next_bridge; struct drm_mode_object base; @@ -862,6 +863,7 @@ extern void drm_connector_cleanup(struct drm_connector *connector); extern void drm_connector_unplug_all(struct drm_device *dev); extern int drm_bridge_init(struct drm_device *dev, struct drm_bridge *bridge, + struct drm_encoder *encoder, const struct drm_bridge_funcs *funcs); extern void drm_bridge_cleanup(struct drm_bridge *bridge); -- 1.8.1.2