From patchwork Wed Jul 1 02:21:25 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dmitry Osipenko X-Patchwork-Id: 1320211 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=vger.kernel.org (client-ip=23.128.96.18; helo=vger.kernel.org; envelope-from=linux-tegra-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20161025 header.b=ZcFylXjO; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by ozlabs.org (Postfix) with ESMTP id 49xQ5d3DCTz9sTV for ; Wed, 1 Jul 2020 12:24:05 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726858AbgGACX7 (ORCPT ); Tue, 30 Jun 2020 22:23:59 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:50948 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726834AbgGACX6 (ORCPT ); Tue, 30 Jun 2020 22:23:58 -0400 Received: from mail-lj1-x244.google.com (mail-lj1-x244.google.com [IPv6:2a00:1450:4864:20::244]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id AEC9BC061755; Tue, 30 Jun 2020 19:23:57 -0700 (PDT) Received: by mail-lj1-x244.google.com with SMTP id s1so25093772ljo.0; Tue, 30 Jun 2020 19:23:57 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=h/buGMp+Ss9uiUTlhYkjRB/SevbvsV7Suq67TOhl6lM=; b=ZcFylXjOLKEs1YEHNYW5SEnwvyP1m2KYyDK40/iSh+wd1xzgRYRzAkZ02SDRdHlvKS FgrWvv/f3DqvqBTjLmLMu4Vgb37oufCQuhSiLv7Q8iMnxlMii3z2EN99y3ogpR5LzBEt 0fn0iX2x4kpfMChJJ1RtTXPIBNkK0+CXoEQIIOnJgB9wcneA3QNTxl5UBz6qmXB4MpD1 qLT+F+1ONyFbEv9w+pZzH42FrR1hpE8wt08Gr9xjhZWw4kJmx47RfgK8qOhTzI3Usqvf EUJDevskWnGxAUq5YBorUMVQzkr7/o32+e8vp7FaZrropV+fV4n2v7q6GABdOBvgbR1r CbKA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=h/buGMp+Ss9uiUTlhYkjRB/SevbvsV7Suq67TOhl6lM=; b=AmZve8DvSTjSPmOxmPGPcOevznLoFzJA/pmVZWjHK+oPjGzyqTtIO8WoPDvmylaUpL SK+5+dxLBBQPxcOEyzGuBS5HXJmx/SNDtKTkIQ3PTZveul99tIh7YGI9JlCNmUKZowyT ohD7w4tu8/0tJRMCY/UIl6QhonZF0zGkaIckKaF8QpEqZyYj5fvVbGU5eTceUfSFVP3u wv0s5dh1QeRcHCj7AASAWWigxEb8f77jxad3+di6P0lNTbW71g8tF89mfQzUGMJhmiMT uT3QFKrwUHCf3Mbm1ZV45FITFMIVDfmx3UkDSqYOD55DzR0gl6+CK6Vd/h1psjM3Tb/X IEfA== X-Gm-Message-State: AOAM531adIjyQN0mNxptzElLSk59h3dJKBH61WDdxq3Rv1AL5Qll/u46 ujDPYL7Suym3z3cJ+K+eyldPU9O8TtM= X-Google-Smtp-Source: ABdhPJzLVu+pc8eNoqlmFJWxGvBMY4WUCgYsygKPGHe9uic2XNC86UNcEKaXm3lAtRK2Rl63z8Fk0Q== X-Received: by 2002:a05:651c:3cf:: with SMTP id f15mr9939751ljp.365.1593570236235; Tue, 30 Jun 2020 19:23:56 -0700 (PDT) Received: from localhost.localdomain (79-139-237-54.dynamic.spd-mgts.ru. [79.139.237.54]) by smtp.gmail.com with ESMTPSA id f21sm1303557ljj.121.2020.06.30.19.23.55 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 30 Jun 2020 19:23:55 -0700 (PDT) From: Dmitry Osipenko To: Thierry Reding , Sam Ravnborg , Laurent Pinchart Cc: dri-devel@lists.freedesktop.org, linux-tegra@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v9 1/4] drm/tegra: output: Don't leak OF node on error Date: Wed, 1 Jul 2020 05:21:25 +0300 Message-Id: <20200701022128.12968-2-digetx@gmail.com> X-Mailer: git-send-email 2.26.0 In-Reply-To: <20200701022128.12968-1-digetx@gmail.com> References: <20200701022128.12968-1-digetx@gmail.com> MIME-Version: 1.0 Sender: linux-tegra-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-tegra@vger.kernel.org The OF node should be put before returning error in tegra_output_probe(), otherwise node's refcount will be leaked. Reviewed-by: Laurent Pinchart Reviewed-by: Sam Ravnborg Signed-off-by: Dmitry Osipenko --- drivers/gpu/drm/tegra/output.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/drivers/gpu/drm/tegra/output.c b/drivers/gpu/drm/tegra/output.c index e36e5e7c2f69..a6a711d54e88 100644 --- a/drivers/gpu/drm/tegra/output.c +++ b/drivers/gpu/drm/tegra/output.c @@ -102,10 +102,10 @@ int tegra_output_probe(struct tegra_output *output) panel = of_parse_phandle(output->of_node, "nvidia,panel", 0); if (panel) { output->panel = of_drm_find_panel(panel); + of_node_put(panel); + if (IS_ERR(output->panel)) return PTR_ERR(output->panel); - - of_node_put(panel); } output->edid = of_get_property(output->of_node, "nvidia,edid", &size); @@ -113,13 +113,12 @@ int tegra_output_probe(struct tegra_output *output) ddc = of_parse_phandle(output->of_node, "nvidia,ddc-i2c-bus", 0); if (ddc) { output->ddc = of_find_i2c_adapter_by_node(ddc); + of_node_put(ddc); + if (!output->ddc) { err = -EPROBE_DEFER; - of_node_put(ddc); return err; } - - of_node_put(ddc); } output->hpd_gpio = devm_gpiod_get_from_of_node(output->dev, From patchwork Wed Jul 1 02:21:26 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dmitry Osipenko X-Patchwork-Id: 1320214 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=vger.kernel.org (client-ip=23.128.96.18; helo=vger.kernel.org; envelope-from=linux-tegra-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20161025 header.b=WOZH3Nn9; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by ozlabs.org (Postfix) with ESMTP id 49xQ5t4zJyz9sTV for ; Wed, 1 Jul 2020 12:24:18 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726957AbgGACYO (ORCPT ); Tue, 30 Jun 2020 22:24:14 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:50954 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726847AbgGACX7 (ORCPT ); Tue, 30 Jun 2020 22:23:59 -0400 Received: from mail-lf1-x143.google.com (mail-lf1-x143.google.com [IPv6:2a00:1450:4864:20::143]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id A7A33C03E979; Tue, 30 Jun 2020 19:23:58 -0700 (PDT) Received: by mail-lf1-x143.google.com with SMTP id t9so12655218lfl.5; Tue, 30 Jun 2020 19:23:58 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=a5nZg8KheWIS8ObVaNA2RcCFchGpMXgRR/HHGM1BHBw=; b=WOZH3Nn9evGdNfNdegsmScfv681f/RyxGofCEPnYWGfspTEyGhonNre+yGBHn5bFfa sxTcaYeEaMnRWVLKe6dvl953jlQGCQ90o4ua4ivcGyBeLWZRJOINabmsrtxixKEvjfTs rbOv9o6+OeD7sJ5vR+COPvihHs5V3r5hDipoEF41JSOpjhY4i1iU3acV2Zg4TXZ1LabF J/TkePIkZrTOmGmyxPRnEKauahz/hGAbNE3AhAXj+cq3pUaNCKcoSaLRj/r2e3ZlZj3b NageNukvNfawQfIsidTyucHIEs5hhntMok1Rxq3MsKd2uiw0jxmGMBHY+EAUfqj4e1Jt 6Dzg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=a5nZg8KheWIS8ObVaNA2RcCFchGpMXgRR/HHGM1BHBw=; b=WRTcdkOqwiIHdrLnBxCfFqRZI+cw7tifWscqCCwKKflQBATydbJWRHHR4dflvNuS3h tgmumx29mbYJAU5ljYq6BpbQ6Ddd/aT5n/TuCBiYhLDXp5ck2NW02XPmKr3BhdcgMaKY viZxcL6Zl+r2n56cJW7Cq1qVWCADCNWrrP4txZHf9CbCvmtjZ2NhwHUCS75LutT8MeUx eKioCEk7rdmvnn43Pe3udX6LlgOk+eS6G6R4ajJYWsHNcHbfpS5o2c9IilGZFoch43AF kw5fy9cyzTkBA2dnVLwBkdQD0eh/bScJq576TLdctZs2BnyaQfxw2WIpcYswTR8dQ4aO h9ng== X-Gm-Message-State: AOAM530voMtzvE2OqEnnI06v+aCyGJHIZXRKM5AMf+vkP+sg5uIr0p3O 3I/cEo2l8DejvuKXjRnYDYQ= X-Google-Smtp-Source: ABdhPJxLkVvzwxeFv14SPpaqlsYj0gMEYB9Z7wtPKtzeNL3g1IL8KbUjYp/yAgjzyzyrDcB8Hs5VPA== X-Received: by 2002:ac2:569c:: with SMTP id 28mr13540340lfr.195.1593570237240; Tue, 30 Jun 2020 19:23:57 -0700 (PDT) Received: from localhost.localdomain (79-139-237-54.dynamic.spd-mgts.ru. [79.139.237.54]) by smtp.gmail.com with ESMTPSA id f21sm1303557ljj.121.2020.06.30.19.23.56 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 30 Jun 2020 19:23:56 -0700 (PDT) From: Dmitry Osipenko To: Thierry Reding , Sam Ravnborg , Laurent Pinchart Cc: dri-devel@lists.freedesktop.org, linux-tegra@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v9 2/4] drm/tegra: output: Support DRM bridges Date: Wed, 1 Jul 2020 05:21:26 +0300 Message-Id: <20200701022128.12968-3-digetx@gmail.com> X-Mailer: git-send-email 2.26.0 In-Reply-To: <20200701022128.12968-1-digetx@gmail.com> References: <20200701022128.12968-1-digetx@gmail.com> MIME-Version: 1.0 Sender: linux-tegra-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-tegra@vger.kernel.org Newer Tegra device-trees will specify a video output graph which involves a bridge. This patch adds initial support for the DRM bridges to the Tegra DRM output. Acked-by: Sam Ravnborg Signed-off-by: Dmitry Osipenko --- drivers/gpu/drm/tegra/drm.h | 2 ++ drivers/gpu/drm/tegra/output.c | 12 ++++++++++++ 2 files changed, 14 insertions(+) diff --git a/drivers/gpu/drm/tegra/drm.h b/drivers/gpu/drm/tegra/drm.h index b25443255be6..f38de08e0c95 100644 --- a/drivers/gpu/drm/tegra/drm.h +++ b/drivers/gpu/drm/tegra/drm.h @@ -12,6 +12,7 @@ #include #include +#include #include #include #include @@ -116,6 +117,7 @@ struct tegra_output { struct device_node *of_node; struct device *dev; + struct drm_bridge *bridge; struct drm_panel *panel; struct i2c_adapter *ddc; const struct edid *edid; diff --git a/drivers/gpu/drm/tegra/output.c b/drivers/gpu/drm/tegra/output.c index a6a711d54e88..ccd1421f1b24 100644 --- a/drivers/gpu/drm/tegra/output.c +++ b/drivers/gpu/drm/tegra/output.c @@ -5,6 +5,7 @@ */ #include +#include #include #include @@ -99,8 +100,19 @@ int tegra_output_probe(struct tegra_output *output) if (!output->of_node) output->of_node = output->dev->of_node; + err = drm_of_find_panel_or_bridge(output->of_node, -1, -1, + &output->panel, &output->bridge); + if (err && err != -ENODEV) + return err; + panel = of_parse_phandle(output->of_node, "nvidia,panel", 0); if (panel) { + /* + * Don't mix nvidia,panel phandle with the graph in a + * device-tree. + */ + WARN_ON(output->panel || output->bridge); + output->panel = of_drm_find_panel(panel); of_node_put(panel); From patchwork Wed Jul 1 02:21:27 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dmitry Osipenko X-Patchwork-Id: 1320213 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=vger.kernel.org (client-ip=23.128.96.18; helo=vger.kernel.org; envelope-from=linux-tegra-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20161025 header.b=VE7s85l5; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by ozlabs.org (Postfix) with ESMTP id 49xQ5n289Nz9sPF for ; Wed, 1 Jul 2020 12:24:13 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726906AbgGACYC (ORCPT ); Tue, 30 Jun 2020 22:24:02 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:50960 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726865AbgGACYA (ORCPT ); Tue, 30 Jun 2020 22:24:00 -0400 Received: from mail-lj1-x242.google.com (mail-lj1-x242.google.com [IPv6:2a00:1450:4864:20::242]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id AEFD5C061755; Tue, 30 Jun 2020 19:23:59 -0700 (PDT) Received: by mail-lj1-x242.google.com with SMTP id f5so9192467ljj.10; Tue, 30 Jun 2020 19:23:59 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=bfaJuFdXozXDPR9zng+hgfPKlX3mT8FyISD1FTQ25bo=; b=VE7s85l5fyLK0B6o/yt86K8C9cK16DV3MrIuvwOOuc+NBn1BXoVRakQLfb1/3Yg/aZ R+HSNymIVAhgmg3e2ojg6/JRCpoBa4x3lmzlk+2suLHFSujns4KhQxR1QLr4D9sFpwCb 9Q+ZXTqCF+JPPInnPjoTcecuq8t5akEpl/N/smciUfH/pmYq9aHD8SvSiu5k2OiV1o3e cEoGjNI+o2cyYd8MlsF4TE/B2SGmBqOTAiO3wyWDwmSd8NuIPVrAQ8Ye/XG1rH6jwVKE W2OlthjfiervACVtspzepIMIv3aLd5e4XHJdJcYbuodAlHEygtys3135ZqG/+3iwg43p IpwA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=bfaJuFdXozXDPR9zng+hgfPKlX3mT8FyISD1FTQ25bo=; b=lGfe0FY3O5j5hnl3W5ks2eWxne3WmuLqjZQ58UVsODJeO0YeSncHeY7RcPE7vOJbR5 yzW/K5DERCn3R3Wjj+t5SwFgGhwhZbQwMLs2wFFbMQ2roAgwonLSlL/y2fK9s4svAxgx SQmqobAQw1TcnJBRyibh4EKCzHVl2FVWFfiMOve3rT5T3iqaBHEvj9QQbrAsaEhOJ1oU mOhA+40na5vO6Ef5t7psoZ/GkpLVAiY0SPGpncQxXXgBREP0y7EOwuW5b5F8apFMUTff x2jcR/kFt8lFZUs+Bid7a8zqxLmz8cwD45uv75zYbc3NEXK2WJa0vzYDCSQaGurpHowe qq4Q== X-Gm-Message-State: AOAM5320ft+TzW/xaCWb7uv3fMEmVrT6LBoltX5aeTIJHnG1JFtOrFD+ Awwl9+JnFCcKnvboN6vjTGY= X-Google-Smtp-Source: ABdhPJw8XwqM+o3V3NyT/ahxuvQDzRvny1dTXfsyM+RgMUzYUT+Wa94GwTf+cWLO24giLZ5NMMBl+g== X-Received: by 2002:a05:651c:3c2:: with SMTP id f2mr12254508ljp.37.1593570238171; Tue, 30 Jun 2020 19:23:58 -0700 (PDT) Received: from localhost.localdomain (79-139-237-54.dynamic.spd-mgts.ru. [79.139.237.54]) by smtp.gmail.com with ESMTPSA id f21sm1303557ljj.121.2020.06.30.19.23.57 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 30 Jun 2020 19:23:57 -0700 (PDT) From: Dmitry Osipenko To: Thierry Reding , Sam Ravnborg , Laurent Pinchart Cc: dri-devel@lists.freedesktop.org, linux-tegra@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v9 3/4] drm/tegra: output: rgb: Support LVDS encoder bridge Date: Wed, 1 Jul 2020 05:21:27 +0300 Message-Id: <20200701022128.12968-4-digetx@gmail.com> X-Mailer: git-send-email 2.26.0 In-Reply-To: <20200701022128.12968-1-digetx@gmail.com> References: <20200701022128.12968-1-digetx@gmail.com> MIME-Version: 1.0 Sender: linux-tegra-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-tegra@vger.kernel.org Newer Tegra device-trees will specify a video output graph, which involves LVDS encoder bridge. This patch adds support for the LVDS encoder bridge to the RGB output, allowing us to model the display hardware properly. Reviewed-by: Laurent Pinchart Acked-by: Sam Ravnborg Signed-off-by: Dmitry Osipenko --- drivers/gpu/drm/tegra/rgb.c | 58 +++++++++++++++++++++++++++++++------ 1 file changed, 49 insertions(+), 9 deletions(-) diff --git a/drivers/gpu/drm/tegra/rgb.c b/drivers/gpu/drm/tegra/rgb.c index 0562a7eb793f..9a7024ec96bc 100644 --- a/drivers/gpu/drm/tegra/rgb.c +++ b/drivers/gpu/drm/tegra/rgb.c @@ -7,6 +7,7 @@ #include #include +#include #include #include @@ -267,24 +268,63 @@ int tegra_dc_rgb_remove(struct tegra_dc *dc) int tegra_dc_rgb_init(struct drm_device *drm, struct tegra_dc *dc) { struct tegra_output *output = dc->rgb; + struct drm_connector *connector; int err; if (!dc->rgb) return -ENODEV; - drm_connector_init(drm, &output->connector, &tegra_rgb_connector_funcs, - DRM_MODE_CONNECTOR_LVDS); - drm_connector_helper_add(&output->connector, - &tegra_rgb_connector_helper_funcs); - output->connector.dpms = DRM_MODE_DPMS_OFF; - drm_simple_encoder_init(drm, &output->encoder, DRM_MODE_ENCODER_LVDS); drm_encoder_helper_add(&output->encoder, &tegra_rgb_encoder_helper_funcs); - drm_connector_attach_encoder(&output->connector, - &output->encoder); - drm_connector_register(&output->connector); + /* + * Tegra devices that have LVDS panel utilize LVDS encoder bridge + * for converting up to 28 LCD LVTTL lanes into 5/4 LVDS lanes that + * go to display panel's receiver. + * + * Encoder usually have a power-down control which needs to be enabled + * in order to transmit data to the panel. Historically devices that + * use an older device-tree version didn't model the bridge, assuming + * that encoder is turned ON by default, while today's DRM allows us + * to model LVDS encoder properly. + * + * Newer device-trees utilize LVDS encoder bridge, which provides + * us with a connector and handles the display panel. + * + * For older device-trees we fall back to our own connector and use + * nvidia,panel phandle. + */ + if (output->bridge) { + err = drm_bridge_attach(&output->encoder, output->bridge, + NULL, DRM_BRIDGE_ATTACH_NO_CONNECTOR); + if (err) { + dev_err(output->dev, "failed to attach bridge: %d\n", + err); + return err; + } + + connector = drm_bridge_connector_init(drm, &output->encoder); + if (IS_ERR(connector)) { + dev_err(output->dev, + "failed to initialize bridge connector: %pe\n", + connector); + return PTR_ERR(connector); + } + + drm_connector_attach_encoder(connector, &output->encoder); + } else { + drm_connector_init(drm, &output->connector, + &tegra_rgb_connector_funcs, + DRM_MODE_CONNECTOR_LVDS); + drm_connector_helper_add(&output->connector, + &tegra_rgb_connector_helper_funcs); + output->connector.dpms = DRM_MODE_DPMS_OFF; + + drm_connector_attach_encoder(&output->connector, + &output->encoder); + drm_connector_register(&output->connector); + } err = tegra_output_init(drm, output); if (err < 0) { From patchwork Wed Jul 1 02:21:28 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dmitry Osipenko X-Patchwork-Id: 1320212 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=vger.kernel.org (client-ip=23.128.96.18; helo=vger.kernel.org; envelope-from=linux-tegra-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20161025 header.b=qFD+B4Qi; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by ozlabs.org (Postfix) with ESMTP id 49xQ5d6FSyz9sTZ for ; Wed, 1 Jul 2020 12:24:05 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726921AbgGACYD (ORCPT ); Tue, 30 Jun 2020 22:24:03 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:50966 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726888AbgGACYC (ORCPT ); Tue, 30 Jun 2020 22:24:02 -0400 Received: from mail-lj1-x243.google.com (mail-lj1-x243.google.com [IPv6:2a00:1450:4864:20::243]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id A3151C03E979; Tue, 30 Jun 2020 19:24:00 -0700 (PDT) Received: by mail-lj1-x243.google.com with SMTP id t25so20499366lji.12; Tue, 30 Jun 2020 19:24:00 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=37Z3HYJxY12m2q1zLLMVAo9a4Krobq6zohBrdzALyVQ=; b=qFD+B4QikxOPYBwCWRO9sRvcJ2ylNeF6BprSPGFu5CmB/30cJbPc09FTRF2BC4pN6d qMk0PmA+6quTB3ZITKmCox3cQiCpeQ1BVxZHQWhtHRVbSATljqc3zXQzaV9vDjh0yc5y K4XIHbtjgDPD5W/9k01ErjNXGiaOMwoXrSioPERhYLJOG6RPeAP4IbX72j/cbt0w6/JK DBB6BR1FGiOzc83lxK/Qu4+2NQb4Ry5iao5zlNNiOUcwuq0tQ0i4KheOcf+jSOTjKEhI VcuMYNeZtCUh7Nqm6EIYFMWiWkvGO/RAthl0raQ3TDh9Rb65bDaJml3dEHL6I6oQ25x2 m/hA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=37Z3HYJxY12m2q1zLLMVAo9a4Krobq6zohBrdzALyVQ=; b=C92xQjOJ6AlXRHKbyg42oBARh8NkjD3rEHDqdmwKWF9JarBORUUgBjt/FOUHn8OX8j 8/+JlFqvLVwGpcVN59Fcn+NjQo7hNzkVJg+gJOTqmYKT4mH4S1njoLFfOweNrp/M+ybI 5YsLBagIvyDdJWGwVzd4chqEuKoZmXznsE5v2QmxGdYF20pG3YVjFNe5+X+WQiS/gDlh jnRyzf+IrL/cpQWHriB8KBI5c6gK5x91upD6iDVi3hUB93svj51FOrtkTUoTW57hmV1+ lswuozHyGBSipMn/DcdqJqaKEHfsNyP564kSWERuMpBckGeOX3NvEoAyNdMLTfdPmeHD wO0A== X-Gm-Message-State: AOAM530aa6QWSzEnaI12zrf5blCaEAoacoL02I2i2DtkRFqOV8nJ0iRK dQWX4zWr0v6IRpnye3DSQG8= X-Google-Smtp-Source: ABdhPJxo1aYYW2nGVu0mj1YJyPlgU5yUWa8RQdGqU5qZJuAQjK37DvU9T6Hbv4tlibV9uHbzIp8naQ== X-Received: by 2002:a2e:81c4:: with SMTP id s4mr8902702ljg.284.1593570239143; Tue, 30 Jun 2020 19:23:59 -0700 (PDT) Received: from localhost.localdomain (79-139-237-54.dynamic.spd-mgts.ru. [79.139.237.54]) by smtp.gmail.com with ESMTPSA id f21sm1303557ljj.121.2020.06.30.19.23.58 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 30 Jun 2020 19:23:58 -0700 (PDT) From: Dmitry Osipenko To: Thierry Reding , Sam Ravnborg , Laurent Pinchart Cc: dri-devel@lists.freedesktop.org, linux-tegra@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v9 4/4] drm/tegra: output: rgb: Wrap directly-connected panel into DRM bridge Date: Wed, 1 Jul 2020 05:21:28 +0300 Message-Id: <20200701022128.12968-5-digetx@gmail.com> X-Mailer: git-send-email 2.26.0 In-Reply-To: <20200701022128.12968-1-digetx@gmail.com> References: <20200701022128.12968-1-digetx@gmail.com> MIME-Version: 1.0 Sender: linux-tegra-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-tegra@vger.kernel.org Currently Tegra DRM driver manually manages display panel, but this management could be moved out into DRM core if we'll wrap panel into DRM bridge. This patch wraps RGB panel into a DRM bridge and removes manual handling of the panel from the RGB output code. Suggested-by: Laurent Pinchart Acked-by: Sam Ravnborg Signed-off-by: Dmitry Osipenko --- drivers/gpu/drm/tegra/rgb.c | 70 ++++++++++--------------------------- 1 file changed, 18 insertions(+), 52 deletions(-) diff --git a/drivers/gpu/drm/tegra/rgb.c b/drivers/gpu/drm/tegra/rgb.c index 9a7024ec96bc..4142a56ca764 100644 --- a/drivers/gpu/drm/tegra/rgb.c +++ b/drivers/gpu/drm/tegra/rgb.c @@ -8,7 +8,6 @@ #include #include -#include #include #include "drm.h" @@ -86,45 +85,13 @@ static void tegra_dc_write_regs(struct tegra_dc *dc, tegra_dc_writel(dc, table[i].value, table[i].offset); } -static const struct drm_connector_funcs tegra_rgb_connector_funcs = { - .reset = drm_atomic_helper_connector_reset, - .detect = tegra_output_connector_detect, - .fill_modes = drm_helper_probe_single_connector_modes, - .destroy = tegra_output_connector_destroy, - .atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state, - .atomic_destroy_state = drm_atomic_helper_connector_destroy_state, -}; - -static enum drm_mode_status -tegra_rgb_connector_mode_valid(struct drm_connector *connector, - struct drm_display_mode *mode) -{ - /* - * FIXME: For now, always assume that the mode is okay. There are - * unresolved issues with clk_round_rate(), which doesn't always - * reliably report whether a frequency can be set or not. - */ - return MODE_OK; -} - -static const struct drm_connector_helper_funcs tegra_rgb_connector_helper_funcs = { - .get_modes = tegra_output_connector_get_modes, - .mode_valid = tegra_rgb_connector_mode_valid, -}; - static void tegra_rgb_encoder_disable(struct drm_encoder *encoder) { struct tegra_output *output = encoder_to_output(encoder); struct tegra_rgb *rgb = to_rgb(output); - if (output->panel) - drm_panel_disable(output->panel); - tegra_dc_write_regs(rgb->dc, rgb_disable, ARRAY_SIZE(rgb_disable)); tegra_dc_commit(rgb->dc); - - if (output->panel) - drm_panel_unprepare(output->panel); } static void tegra_rgb_encoder_enable(struct drm_encoder *encoder) @@ -133,9 +100,6 @@ static void tegra_rgb_encoder_enable(struct drm_encoder *encoder) struct tegra_rgb *rgb = to_rgb(output); u32 value; - if (output->panel) - drm_panel_prepare(output->panel); - tegra_dc_write_regs(rgb->dc, rgb_enable, ARRAY_SIZE(rgb_enable)); value = DE_SELECT_ACTIVE | DE_CONTROL_NORMAL; @@ -157,9 +121,6 @@ static void tegra_rgb_encoder_enable(struct drm_encoder *encoder) tegra_dc_writel(rgb->dc, value, DC_DISP_SHIFT_CLOCK_OPTIONS); tegra_dc_commit(rgb->dc); - - if (output->panel) - drm_panel_enable(output->panel); } static int @@ -278,6 +239,23 @@ int tegra_dc_rgb_init(struct drm_device *drm, struct tegra_dc *dc) drm_encoder_helper_add(&output->encoder, &tegra_rgb_encoder_helper_funcs); + /* + * Wrap directly-connected panel into DRM bridge in order to let + * DRM core to handle panel for us. + */ + if (output->panel) { + output->bridge = devm_drm_panel_bridge_add(output->dev, + output->panel); + if (IS_ERR(output->bridge)) { + dev_err(output->dev, + "failed to wrap panel into bridge: %pe\n", + output->bridge); + return PTR_ERR(output->bridge); + } + + output->panel = NULL; + } + /* * Tegra devices that have LVDS panel utilize LVDS encoder bridge * for converting up to 28 LCD LVTTL lanes into 5/4 LVDS lanes that @@ -292,8 +270,7 @@ int tegra_dc_rgb_init(struct drm_device *drm, struct tegra_dc *dc) * Newer device-trees utilize LVDS encoder bridge, which provides * us with a connector and handles the display panel. * - * For older device-trees we fall back to our own connector and use - * nvidia,panel phandle. + * For older device-trees we wrapped panel into the panel-bridge. */ if (output->bridge) { err = drm_bridge_attach(&output->encoder, output->bridge, @@ -313,17 +290,6 @@ int tegra_dc_rgb_init(struct drm_device *drm, struct tegra_dc *dc) } drm_connector_attach_encoder(connector, &output->encoder); - } else { - drm_connector_init(drm, &output->connector, - &tegra_rgb_connector_funcs, - DRM_MODE_CONNECTOR_LVDS); - drm_connector_helper_add(&output->connector, - &tegra_rgb_connector_helper_funcs); - output->connector.dpms = DRM_MODE_DPMS_OFF; - - drm_connector_attach_encoder(&output->connector, - &output->encoder); - drm_connector_register(&output->connector); } err = tegra_output_init(drm, output);