From patchwork Thu Aug 13 22:06:53 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dmitry Osipenko X-Patchwork-Id: 11716551 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id E6387722 for ; Mon, 17 Aug 2020 07:07:00 +0000 (UTC) Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id C47B22072D for ; Mon, 17 Aug 2020 07:07:00 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="U4El73tu" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org C47B22072D Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=dri-devel-bounces@lists.freedesktop.org Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 5734B6E453; Mon, 17 Aug 2020 07:06:40 +0000 (UTC) X-Original-To: dri-devel@lists.freedesktop.org Delivered-To: dri-devel@lists.freedesktop.org Received: from mail-lj1-x241.google.com (mail-lj1-x241.google.com [IPv6:2a00:1450:4864:20::241]) by gabe.freedesktop.org (Postfix) with ESMTPS id 1F53D6E264 for ; Thu, 13 Aug 2020 22:07:07 +0000 (UTC) Received: by mail-lj1-x241.google.com with SMTP id t23so7898179ljc.3 for ; Thu, 13 Aug 2020 15:07:07 -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=UhpftvxhrGW/I5vMTkvaan80pR3Bf4Ukt8/Qr1N367o=; b=U4El73tuzw8u2iTw2U3rFgaS36+EbTzTxzil61hPtSoIHRP/nGy/sYT4669apwUZ56 1fLO1E+40xwQUYiilDfsE+6LFATlD28+Pv5r7petk4yla8wj1M+zx2l4gxnC07Melcb2 xY2TjnzvlzzHuNT8+t97d/f+tE9aXsW4vuM8jisUNzcp2cfeq4PFosOS7g9OUeSF78hp b3trwaz9jl/zDRDaGRfliXTUFTjDhrnkUttmhFc9AOxVP1Utl/wfPrAgZY64xyKorDe1 EZ1U+ti6KcGW072dmi+99zAiCq9MlJw7FEtE3P2B21pJGsUF26w3JwVu4DbXoO6lJ9U2 OloA== 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=UhpftvxhrGW/I5vMTkvaan80pR3Bf4Ukt8/Qr1N367o=; b=gvqnaVEq+gzpkhwce6946/3zvH6811bn0bWifLQjb7ZCodU+icpJ35zi32EvWPZ6XK KQTEqJMRmQ9o65xiNNYhR3X2x65IjCeSBDhNuTiolCO4FMbH+88Q1Ng5tHjJ2quvycRF d/shqOi+BqmN3V9+3woEyVdLvEM/kX8wP1doQ6JLB2FpBw0D5c86RuJCoGy5P4wAvZ8e wNwN+3wLjRJog4IYRSeq/jAH+LBuQSoGl0g4p3YGeEHZTPjTv/jrdAE796h9N1oYUD5Q Lw9FF0KQ++EapM4GRitFbV0Nnvl/zHXU+qz3HGxnDEcusxV72WGKF6sgFarPuTCTxiH7 Ud/w== X-Gm-Message-State: AOAM531mQObHKNM5Q2LP9x7sT+CPAfvltEI4PCn6IUBHe86O6WaXvBEc cl3F9VQPJxVzTbzkWH9uhJo= X-Google-Smtp-Source: ABdhPJxdE8SJN6Fl3O8SlSPSFn7L3H7MJoggtpc0XWT3dFeJWVU0/K7OehXS6p0pQlnWdtOB/5iZUQ== X-Received: by 2002:a2e:b61c:: with SMTP id r28mr2741025ljn.23.1597356425541; Thu, 13 Aug 2020 15:07:05 -0700 (PDT) Received: from localhost.localdomain (109-252-170-211.dynamic.spd-mgts.ru. [109.252.170.211]) by smtp.gmail.com with ESMTPSA id z20sm1354452ljk.97.2020.08.13.15.07.04 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 13 Aug 2020 15:07:04 -0700 (PDT) From: Dmitry Osipenko To: Thierry Reding , Sam Ravnborg , Laurent Pinchart Subject: [PATCH RESEND v10 1/4] drm/tegra: output: Don't leak OF node on error Date: Fri, 14 Aug 2020 01:06:53 +0300 Message-Id: <20200813220656.30838-2-digetx@gmail.com> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20200813220656.30838-1-digetx@gmail.com> References: <20200813220656.30838-1-digetx@gmail.com> MIME-Version: 1.0 X-Mailman-Approved-At: Mon, 17 Aug 2020 07:06:11 +0000 X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: linux-tegra@vger.kernel.org, linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" 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 Thu Aug 13 22:06:54 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dmitry Osipenko X-Patchwork-Id: 11716539 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 8B396138C for ; Mon, 17 Aug 2020 07:06:34 +0000 (UTC) Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 6946F2072D for ; Mon, 17 Aug 2020 07:06:34 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="lFCLXi/+" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 6946F2072D Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=dri-devel-bounces@lists.freedesktop.org Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 457316E446; Mon, 17 Aug 2020 07:06:14 +0000 (UTC) X-Original-To: dri-devel@lists.freedesktop.org Delivered-To: dri-devel@lists.freedesktop.org Received: from mail-lf1-x144.google.com (mail-lf1-x144.google.com [IPv6:2a00:1450:4864:20::144]) by gabe.freedesktop.org (Postfix) with ESMTPS id 021366E261 for ; Thu, 13 Aug 2020 22:07:08 +0000 (UTC) Received: by mail-lf1-x144.google.com with SMTP id 140so3827576lfi.5 for ; Thu, 13 Aug 2020 15:07:07 -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=sWzvdmgXDHuOtJszdX4J4B9Z4Waxa6XTUameiQDphcY=; b=lFCLXi/++Wld7Pef95SQoNaKCO+nuVwKA83lj/LWRH6z1GpTKPIvZgA5QoycREtvh5 Jdo4w+LW3Mkg1MqCnYz+wIXca7AxkwEy8q+D9I7X2L4Kw0YawnZfLX6TVhiiaAMI+/Du Gr3Jv0qPWpGsCBR8yQsjnui7P5NDvMkGgoMdoBQM5KCEWfJ12s0XVlKWfNMR9n3S+348 RLtZj72ntG+TmiCwaW7D1WMAkaoYvf6c4dUcxXlmw0zvFjuMhxde/Wc34oL04cMFcCTz 0NlkoALfIqdTnf4Q2EJ+FJq66X97NMUloMese9QHP1AX+p3P5d6JukihtBt+MxOHu1g+ 2o4Q== 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=sWzvdmgXDHuOtJszdX4J4B9Z4Waxa6XTUameiQDphcY=; b=PemNWGM7E8l/48wU9glD+CdARQnOzZBR+sPfwR8OUTu557BTzmzAH2J+wIi4teXK0k uVSKuSEhF/NFWqfs7FykLDMDdZd+K7pv8htNMyO4fcJRu31vUbhyBbrg8MfvLAeQIxvI 2BPSnDk14O3ScVY2cn3LTpolSN7xTRKSnVNUf2Q8UFNxMX3dVAWE/fnkl9scb+jSj/8A QHTiCAOJk8nFA5IEcucyCP56BuAuj6MSx5hLL3lH8ucLbjS1OyMPyGwaJB51RTK5dXoK 2y7nb5/hMSGGgB+iBi1rxtq11hbyJMWuZGX0cYmFYj6RkpN9+9yiNnLj7C9Ub0cXGh89 IgMw== X-Gm-Message-State: AOAM5313iYzyK75wxOuPT8uU3fx5dX4h9WJ67XiDzD9zlD5/VizLtbzJ aIMx4BCHpMOfuMD7el6Zgi8= X-Google-Smtp-Source: ABdhPJyxqKir1ref2JB/ZBi9uoJB2LHWMxuOvTIGdPa97QGjik3HXoPPQbGgeYDxvzXimJtkPnh0FA== X-Received: by 2002:a05:6512:20c1:: with SMTP id u1mr3143864lfr.17.1597356426488; Thu, 13 Aug 2020 15:07:06 -0700 (PDT) Received: from localhost.localdomain (109-252-170-211.dynamic.spd-mgts.ru. [109.252.170.211]) by smtp.gmail.com with ESMTPSA id z20sm1354452ljk.97.2020.08.13.15.07.05 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 13 Aug 2020 15:07:05 -0700 (PDT) From: Dmitry Osipenko To: Thierry Reding , Sam Ravnborg , Laurent Pinchart Subject: [PATCH RESEND v10 2/4] drm/tegra: output: Support DRM bridges Date: Fri, 14 Aug 2020 01:06:54 +0300 Message-Id: <20200813220656.30838-3-digetx@gmail.com> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20200813220656.30838-1-digetx@gmail.com> References: <20200813220656.30838-1-digetx@gmail.com> MIME-Version: 1.0 X-Mailman-Approved-At: Mon, 17 Aug 2020 07:06:11 +0000 X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: linux-tegra@vger.kernel.org, linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" 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 Thu Aug 13 22:06:55 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dmitry Osipenko X-Patchwork-Id: 11716549 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 86C94722 for ; Mon, 17 Aug 2020 07:06:59 +0000 (UTC) Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 64C892072D for ; Mon, 17 Aug 2020 07:06:59 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="bHsUBV2c" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 64C892072D Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=dri-devel-bounces@lists.freedesktop.org Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id A5EC46E450; Mon, 17 Aug 2020 07:06:39 +0000 (UTC) X-Original-To: dri-devel@lists.freedesktop.org Delivered-To: dri-devel@lists.freedesktop.org Received: from mail-lf1-x144.google.com (mail-lf1-x144.google.com [IPv6:2a00:1450:4864:20::144]) by gabe.freedesktop.org (Postfix) with ESMTPS id EF7F96E264 for ; Thu, 13 Aug 2020 22:07:08 +0000 (UTC) Received: by mail-lf1-x144.google.com with SMTP id i19so3833780lfj.8 for ; Thu, 13 Aug 2020 15:07:08 -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=OmsWTXLXrvD6z5b5tExtN9EHdrhOpOALjSmo38Bf/sM=; b=bHsUBV2c+Fb4ZHulGsBDExf4/jndEYU2MzlugJ91C8gez/F2GbPCeYUtHw/olcx6xu z6mvJVUs6ZRR5Gq+z9biQNy8XYA3LF8lxRokyP4Z/eLFfrtKNxWblmEBUFl1HG4xIZFa MrR3SBEf1N5N81LFFSe5txHra/EEKIzih0sfkcevw+Y7nhkLFAzy9I6y9vxcAcv7dLcd U3HHgAEJIYfgwx4iGmB/D9IimEozUB29fdNamh4XmKoi65n3f5npzBTslbReqaiQtjB0 NaAb3mkTA69f1a/Q4tOJ6HyGoaQ01ZEwodKyjVBmdBg0va1kP07asK26FeHo8Kdeo96s K1Qg== 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=OmsWTXLXrvD6z5b5tExtN9EHdrhOpOALjSmo38Bf/sM=; b=Y5E/tezoosj8LOkW4qw9kV5V8oeWPgxpUM/rvzfPV+Spsx9G5ezLr4rlkZ7cryFcg0 xkeSplDW3Y5hbGa2q9hDUcakHa4CtsXqoiFDHBV+2W16fc7YIsJH6Az66qg45O610PN+ sHFb2mNSk2RFreplHTBAcoANDaKPsU/oBsQ40HP2lOYrXMCeQbh4hD2l/mzdCt8aNtEj ZScf7XwPsox+Me03U9rH+h6YVGTSaX7oRXGk2S5EPkUtt9/hk0/U+ZzP/m2AFL+SNj7F SOdEa0zEYPb2WeRwgJB7r3RZ4yhXuoZ03XG/zJnIAh1h8jgm8ej/0Aj3LtjBZxi+y2uu tDDQ== X-Gm-Message-State: AOAM532di+lDRmqIxVfWqr3BLtv/JSP4uyI9eJYeIvocjbgp9v13bsD6 H7Ky3HY5QUVmJU2ck993HKo= X-Google-Smtp-Source: ABdhPJxCt+Urw+PLB7gAAG5UmAyBWVnprNQVRC60kwA0gCpR2CL3zlDyHyK5rVP2E75qDpmJhCtR4g== X-Received: by 2002:a05:6512:2010:: with SMTP id a16mr3080487lfb.196.1597356427346; Thu, 13 Aug 2020 15:07:07 -0700 (PDT) Received: from localhost.localdomain (109-252-170-211.dynamic.spd-mgts.ru. [109.252.170.211]) by smtp.gmail.com with ESMTPSA id z20sm1354452ljk.97.2020.08.13.15.07.06 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 13 Aug 2020 15:07:06 -0700 (PDT) From: Dmitry Osipenko To: Thierry Reding , Sam Ravnborg , Laurent Pinchart Subject: [PATCH RESEND v10 3/4] drm/tegra: output: rgb: Support LVDS encoder bridge Date: Fri, 14 Aug 2020 01:06:55 +0300 Message-Id: <20200813220656.30838-4-digetx@gmail.com> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20200813220656.30838-1-digetx@gmail.com> References: <20200813220656.30838-1-digetx@gmail.com> MIME-Version: 1.0 X-Mailman-Approved-At: Mon, 17 Aug 2020 07:06:11 +0000 X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: linux-tegra@vger.kernel.org, linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" 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 Thu Aug 13 22:06:56 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dmitry Osipenko X-Patchwork-Id: 11716611 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 6F8F2722 for ; Mon, 17 Aug 2020 07:08:10 +0000 (UTC) Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 4DD622072D for ; Mon, 17 Aug 2020 07:08:10 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="H/93/Trn" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 4DD622072D Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=dri-devel-bounces@lists.freedesktop.org Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 04C346E4B5; Mon, 17 Aug 2020 07:06:52 +0000 (UTC) X-Original-To: dri-devel@lists.freedesktop.org Delivered-To: dri-devel@lists.freedesktop.org Received: from mail-lj1-x242.google.com (mail-lj1-x242.google.com [IPv6:2a00:1450:4864:20::242]) by gabe.freedesktop.org (Postfix) with ESMTPS id EC5796E277 for ; Thu, 13 Aug 2020 22:07:09 +0000 (UTC) Received: by mail-lj1-x242.google.com with SMTP id f26so7852843ljc.8 for ; Thu, 13 Aug 2020 15:07:09 -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=NNB1WJ7nT7eTiS7MheejVX1+HgDEY/PQRFgw5jRVS9A=; b=H/93/TrnfP5dYTTzKMRei86RrmGKRuJpnVo69hwYEaNhgzQv8D2Wq4dCigDFKztgmE J3AzebWfRJzq2ALp9Vg3BUCP40hzyo1ayz+p8Iq8GFbpfKlT8SpoaKgt7KWJ5Mb484gc PuOPwnx0ZZytynM2HDS21srgF24uhnKQL1NNzBW6hkyJN4NNgz/DHXstP2JvHX7KGtsz LauTs1SW9I+0BkeaAB97OQ2dHyrmnUJo5uMA6ubt+aAbw7ACCb8po3x9sVxwOfP1r4st EI8OTJ+UMyWdD0bQVr4Q4jempm5UMae7iVZefgsD6IAFgZlGjwiXGlQLuGzo0FPE8Fn4 zZ9g== 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=NNB1WJ7nT7eTiS7MheejVX1+HgDEY/PQRFgw5jRVS9A=; b=ME77VwrsSYjhvEozBywE+Fkmgs2vengNHAosCoqj/drjLBA7uuv6Rps3yybAZJFnYd m7HYgI5Ztw6+6mGenVwCDm4cc9IGGZXcrfcglgY1zu7n5TgNJIkjsZsLR+aD33J94NwP FD92ZKa/aysG/Gwpzg9xd9fp6VffIPXj9SxTT3CX+U79GqUyH3zv2iAirG7A1M8GvkYd PizBNZ758kMUjL9kPQ+79q1JjC97D/9NHg00d2cKAPEt82SRL+IDimz5dJQlMkhOftAn KV6HIUFHdufwpJTP1qVWKOnxSUCTnrL7fcizsLZJ7euGN0cX+F+Imb0fi/yYG6Bs07dB w2xg== X-Gm-Message-State: AOAM530vnSAPLfC1QW3ZsCOzY+D+1a11i3vjIq2FX9SSxqJXYGGn2uDa qiMPsBU/+OGWedcl6RXD2E8= X-Google-Smtp-Source: ABdhPJxBFe4j/gvqI+fonyfgEXxpOyTzTLmdf61nd407n4XUc3CAYfN7yHv+TItbEWcV3APUxRvm3g== X-Received: by 2002:a05:651c:1b4:: with SMTP id c20mr2836389ljn.432.1597356428258; Thu, 13 Aug 2020 15:07:08 -0700 (PDT) Received: from localhost.localdomain (109-252-170-211.dynamic.spd-mgts.ru. [109.252.170.211]) by smtp.gmail.com with ESMTPSA id z20sm1354452ljk.97.2020.08.13.15.07.07 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 13 Aug 2020 15:07:07 -0700 (PDT) From: Dmitry Osipenko To: Thierry Reding , Sam Ravnborg , Laurent Pinchart Subject: [PATCH RESEND v10 4/4] drm/tegra: output: rgb: Wrap directly-connected panel into DRM bridge Date: Fri, 14 Aug 2020 01:06:56 +0300 Message-Id: <20200813220656.30838-5-digetx@gmail.com> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20200813220656.30838-1-digetx@gmail.com> References: <20200813220656.30838-1-digetx@gmail.com> MIME-Version: 1.0 X-Mailman-Approved-At: Mon, 17 Aug 2020 07:06:11 +0000 X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: linux-tegra@vger.kernel.org, linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" 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);