From patchwork Tue Feb 11 17:12:27 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dmitry Osipenko X-Patchwork-Id: 319355 X-Patchwork-Delegate: treding@nvidia.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id B47A32C00B0 for ; Wed, 12 Feb 2014 04:14:41 +1100 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752893AbaBKROD (ORCPT ); Tue, 11 Feb 2014 12:14:03 -0500 Received: from mail-la0-f45.google.com ([209.85.215.45]:39055 "EHLO mail-la0-f45.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751305AbaBKROA (ORCPT ); Tue, 11 Feb 2014 12:14:00 -0500 Received: by mail-la0-f45.google.com with SMTP id b8so6114110lan.18 for ; Tue, 11 Feb 2014 09:13:59 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id; bh=tHEv1ReJwa+66LvB+LrEIk4fAFbtbPI/lFn1HrLhxS0=; b=0TpIOdcRe3+v8MpvDrq0Ks/7rrbEvYSVupF57o2YqdUX8Hgi6odqaU6FnFNjFgbxdH PWai0xr2g2n9L2quEijMWaHWr+wxFk9cjswratgqQAhPVS7lC086jJ272lO2sLjg2/C7 diIsJus7I27N+uPUVvTA9C0NuzVvTcxZerq17eHxTJCyy7aaY6db82sD0b3zY5WyffwD 0xHiYbOOwmPCwPdSHW1YywJVKi1SagksPaEilMh2bMIJJ7Ts2qeHbGhRUOBwaiZDajka NIFS9smpu7DdsYbERSu2nJoqBDAb7LJdIvUHx3BxzFgk8+RR1G8MaGYsQslKJZJix+KS WBDg== X-Received: by 10.112.142.100 with SMTP id rv4mr537443lbb.78.1392138839107; Tue, 11 Feb 2014 09:13:59 -0800 (PST) Received: from smtp.gmail.com:587 (ppp37-190-30-154.pppoe.spdop.ru. [37.190.30.154]) by mx.google.com with ESMTPSA id k1sm20557665lbc.5.2014.02.11.09.13.57 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 11 Feb 2014 09:13:58 -0800 (PST) Received: by smtp.gmail.com:587 (sSMTP sendmail emulation); Tue, 11 Feb 2014 21:13:47 +0400 From: Dmitry Osipenko To: thierry.reding@gmail.com, tbergstrom@nvidia.com, airlied@linux.ie, swarren@wwwdotorg.org Cc: dri-devel@lists.freedesktop.org, linux-tegra@vger.kernel.org, linux-kernel@vger.kernel.org, Dmitry Osipenko Subject: [PATCH 1/1] drm/tegra: Add guard to avoid double disable/enable of RGB outputs Date: Tue, 11 Feb 2014 21:12:27 +0400 Message-Id: <1392138747-18198-1-git-send-email-digetx@gmail.com> X-Mailer: git-send-email 1.8.5.3 Sender: linux-tegra-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-tegra@vger.kernel.org Add guard to check whether RGB output is already enabled in the way it's done for HDMI output. Fixes possible hang on trying to disable output twice (first time during driver probe and second on fb registering). Signed-off-by: Dmitry Osipenko --- drivers/gpu/drm/tegra/rgb.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/drivers/gpu/drm/tegra/rgb.c b/drivers/gpu/drm/tegra/rgb.c index 338f7f6..0266fb4 100644 --- a/drivers/gpu/drm/tegra/rgb.c +++ b/drivers/gpu/drm/tegra/rgb.c @@ -15,6 +15,7 @@ struct tegra_rgb { struct tegra_output output; struct tegra_dc *dc; + bool enabled; struct clk *clk_parent; struct clk *clk; @@ -89,6 +90,9 @@ static int tegra_output_rgb_enable(struct tegra_output *output) struct tegra_rgb *rgb = to_rgb(output); unsigned long value; + if (rgb->enabled) + return 0; + tegra_dc_write_regs(rgb->dc, rgb_enable, ARRAY_SIZE(rgb_enable)); value = DE_SELECT_ACTIVE | DE_CONTROL_NORMAL; @@ -122,6 +126,8 @@ static int tegra_output_rgb_enable(struct tegra_output *output) tegra_dc_writel(rgb->dc, GENERAL_ACT_REQ << 8, DC_CMD_STATE_CONTROL); tegra_dc_writel(rgb->dc, GENERAL_ACT_REQ, DC_CMD_STATE_CONTROL); + rgb->enabled = true; + return 0; } @@ -130,6 +136,9 @@ static int tegra_output_rgb_disable(struct tegra_output *output) struct tegra_rgb *rgb = to_rgb(output); unsigned long value; + if (!rgb->enabled) + return 0; + value = tegra_dc_readl(rgb->dc, DC_CMD_DISPLAY_POWER_CONTROL); value &= ~(PW0_ENABLE | PW1_ENABLE | PW2_ENABLE | PW3_ENABLE | PW4_ENABLE | PM0_ENABLE | PM1_ENABLE); @@ -144,6 +153,8 @@ static int tegra_output_rgb_disable(struct tegra_output *output) tegra_dc_write_regs(rgb->dc, rgb_disable, ARRAY_SIZE(rgb_disable)); + rgb->enabled = false; + return 0; }