Received: by 10.223.164.221 with SMTP id h29csp643811wrb; Thu, 26 Oct 2017 04:49:52 -0700 (PDT) X-Google-Smtp-Source: ABhQp+R8gESjUtj2aGfYUhgPcoTq3ecvIqalC+173rdjPTtdozl8qdGOpxohe63pR3emAikvKkqN X-Received: by 10.99.175.80 with SMTP id s16mr4754447pgo.161.1509018592213; Thu, 26 Oct 2017 04:49:52 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1509018592; cv=none; d=google.com; s=arc-20160816; b=pOEOZZtZfgRsZPYdMXWOCxhgkQLxeCfirf61DBlLLP7ulnQ+jarXGqZ4nwPeq1epAR RISFGl13s1oGkmYeIF/EQMqb/wl/kUzf6FwOYWxQDnI/v2TndzCS/HslEOcY8XwSK1Tx NF9TjqJSJrzbgFhSC1rc1UBnMuWpUxHzIT8aFiZvEPrZ4hmr8ClW8s+6EN7tzDTJ/eqA GbSE4tk0SJeMAfL8qPnXCgCiCKu0rHa/AX34lqqHNgWsIgI2Yn8mioEhQ6Z5I7VlIJ1x Y/gGl0eDE6Y91i2wE7SwF1McO71CYexbMnuhIY+lva7jrjMAGrIADF5tM+f4dd+q+QuS hZ6g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:arc-authentication-results; bh=6tOoRfTJzVnWY2NU4+1WCkEnL17+BLKFZovh8bemq90=; b=tde++/WM1AfaI9o5o5MSrnZPmsFA7Kdp1YJ572Gc1SEnJ5jV+7/KVo7ZnrHNnkVtvF TFdzwWq07hl/9Qp34glns+j0WR2zyS0GaVX8TXADdSYS9OFBvr08h/XtJ1HZIZgvyCWS zjSd2gnphiXdN2eQrVWqE1t0lc9UFJsYMNX92GBOIrJU+4D/HB5m9Fm5vnirpyuQ5AFr o/9ZD1k94cah31aCg4Lzd7mUlgAxQfxAa1f7q8fd9MpVuVRh/sAvKJ8xEiJ0/MFcHUKz zYEq9CTKKnD9Nii9Pyqy9/xr9vxHXuunKXKT9CNDUJ6T7gn5bw9xgm6MBpg6jjLLisC/ zskA== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id j8si2789183plk.805.2017.10.26.04.49.37; Thu, 26 Oct 2017 04:49:52 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932231AbdJZLtL (ORCPT + 99 others); Thu, 26 Oct 2017 07:49:11 -0400 Received: from mx08-00178001.pphosted.com ([91.207.212.93]:59163 "EHLO mx07-00178001.pphosted.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1751533AbdJZLtG (ORCPT ); Thu, 26 Oct 2017 07:49:06 -0400 Received: from pps.filterd (m0046661.ppops.net [127.0.0.1]) by mx08-.pphosted.com (8.16.0.21/8.16.0.21) with SMTP id v9QBhbWU016326; Thu, 26 Oct 2017 13:48:18 +0200 Received: from beta.dmz-eu.st.com (beta.dmz-eu.st.com [164.129.1.35]) by mx08-00178001.pphosted.com with ESMTP id 2duapy1hky-1 (version=TLSv1 cipher=ECDHE-RSA-AES256-SHA bits=256 verify=NOT); Thu, 26 Oct 2017 13:48:18 +0200 Received: from zeta.dmz-eu.st.com (zeta.dmz-eu.st.com [164.129.230.9]) by beta.dmz-eu.st.com (STMicroelectronics) with ESMTP id 707CB31; Thu, 26 Oct 2017 11:48:17 +0000 (GMT) Received: from Webmail-eu.st.com (Safex1hubcas22.st.com [10.75.90.92]) by zeta.dmz-eu.st.com (STMicroelectronics) with ESMTP id 44BD52655; Thu, 26 Oct 2017 11:48:17 +0000 (GMT) Received: from SAFEX1HUBCAS21.st.com (10.75.90.44) by Safex1hubcas22.st.com (10.75.90.92) with Microsoft SMTP Server (TLS) id 14.3.352.0; Thu, 26 Oct 2017 13:48:17 +0200 Received: from localhost (10.201.23.32) by Webmail-ga.st.com (10.75.90.48) with Microsoft SMTP Server (TLS) id 14.3.352.0; Thu, 26 Oct 2017 13:48:16 +0200 From: Philippe Cornu To: Rob Herring , Arnd Bergmann , "Russell King" , Mark Rutland , "Yannick Fertre" , Philippe Cornu , Benjamin Gaignard , Vincent Abriou , David Airlie , , , , CC: Fabien Dessenne , Mickael Reulier , Gabriel Fernandez , Ludovic Barre , Alexandre Torgue , Maxime Coquelin Subject: [PATCH v1 2/2] drm/stm: ltdc: add a 2nd endpoint Date: Thu, 26 Oct 2017 13:48:09 +0200 Message-ID: <1509018489-19641-3-git-send-email-philippe.cornu@st.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1509018489-19641-1-git-send-email-philippe.cornu@st.com> References: <1509018489-19641-1-git-send-email-philippe.cornu@st.com> MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [10.201.23.32] X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10432:,, definitions=2017-10-26_03:,, signatures=0 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org ltdc can have up to 2 endpoints: - dpi external gpios: for rgb panels or external bridge ICs. - dpi internal ios: connected internally to dsi. Note: Refer to the reference manual to know if the dsi is present on your device. Signed-off-by: Philippe Cornu --- drivers/gpu/drm/stm/ltdc.c | 64 ++++++++++++++++++++++++++++++++-------------- 1 file changed, 45 insertions(+), 19 deletions(-) diff --git a/drivers/gpu/drm/stm/ltdc.c b/drivers/gpu/drm/stm/ltdc.c index d5c8a42..38a6739 100644 --- a/drivers/gpu/drm/stm/ltdc.c +++ b/drivers/gpu/drm/stm/ltdc.c @@ -33,6 +33,8 @@ #define MAX_IRQ 4 +#define MAX_ENDPOINTS 2 + #define HWVER_10200 0x010200 #define HWVER_10300 0x010300 #define HWVER_20101 0x020101 @@ -886,18 +888,33 @@ int ltdc_load(struct drm_device *ddev) struct ltdc_device *ldev = ddev->dev_private; struct device *dev = ddev->dev; struct device_node *np = dev->of_node; - struct drm_bridge *bridge; - struct drm_panel *panel; + struct drm_bridge *bridge[MAX_ENDPOINTS] = {NULL}; + struct drm_panel *panel[MAX_ENDPOINTS] = {NULL}; struct drm_crtc *crtc; struct reset_control *rstc; struct resource *res; - int irq, ret, i; + int irq, ret, i, endpoint_not_ready = -ENODEV; DRM_DEBUG_DRIVER("\n"); - ret = drm_of_find_panel_or_bridge(np, 0, 0, &panel, &bridge); - if (ret) - return ret; + /* Get endpoints if any */ + for (i = 0; i < MAX_ENDPOINTS; i++) { + ret = drm_of_find_panel_or_bridge(np, 0, i, &panel[i], + &bridge[i]); + + /* + * If at least one endpoint is ready, continue probing, + * else if at least one endpoint is -EPROBE_DEFER and + * there is no previous ready endpoints, defer probing. + */ + if (!ret) + endpoint_not_ready = 0; + else if (ret == -EPROBE_DEFER && endpoint_not_ready) + endpoint_not_ready = -EPROBE_DEFER; + } + + if (endpoint_not_ready) + return endpoint_not_ready; rstc = devm_reset_control_get_exclusive(dev, NULL); @@ -958,19 +975,25 @@ int ltdc_load(struct drm_device *ddev) DRM_INFO("ltdc hw version 0x%08x - ready\n", ldev->caps.hw_version); - if (panel) { - bridge = drm_panel_bridge_add(panel, DRM_MODE_CONNECTOR_DPI); - if (IS_ERR(bridge)) { - DRM_ERROR("Failed to create panel-bridge\n"); - ret = PTR_ERR(bridge); - goto err; + /* Add endpoints panels or bridges if any */ + for (i = 0; i < MAX_ENDPOINTS; i++) { + if (panel[i]) { + bridge[i] = drm_panel_bridge_add(panel[i], + DRM_MODE_CONNECTOR_DPI); + if (IS_ERR(bridge[i])) { + DRM_ERROR("panel-bridge endpoint %d\n", i); + ret = PTR_ERR(bridge[i]); + goto err; + } } - } - ret = ltdc_encoder_init(ddev, bridge); - if (ret) { - DRM_ERROR("Failed to init encoder\n"); - goto err; + if (bridge[i]) { + ret = ltdc_encoder_init(ddev, bridge[i]); + if (ret) { + DRM_ERROR("init encoder endpoint %d\n", i); + goto err; + } + } } crtc = devm_kzalloc(dev, sizeof(*crtc), GFP_KERNEL); @@ -998,7 +1021,8 @@ int ltdc_load(struct drm_device *ddev) return 0; err: - drm_panel_bridge_remove(bridge); + for (i = 0; i < MAX_ENDPOINTS; i++) + drm_panel_bridge_remove(bridge[i]); clk_disable_unprepare(ldev->pixel_clk); @@ -1008,10 +1032,12 @@ int ltdc_load(struct drm_device *ddev) void ltdc_unload(struct drm_device *ddev) { struct ltdc_device *ldev = ddev->dev_private; + int i; DRM_DEBUG_DRIVER("\n"); - drm_of_panel_bridge_remove(ddev->dev->of_node, 0, 0); + for (i = 0; i < MAX_ENDPOINTS; i++) + drm_of_panel_bridge_remove(ddev->dev->of_node, 0, i); clk_disable_unprepare(ldev->pixel_clk); } -- 1.9.1 From 1583535672877536919@xxx Wed Nov 08 21:41:40 +0000 2017 X-GM-THRID: 1583428086602479824 X-Gmail-Labels: Inbox,Category Forums,HistoricalUnread