Received: by 10.223.176.5 with SMTP id f5csp348338wra; Tue, 30 Jan 2018 12:30:59 -0800 (PST) X-Google-Smtp-Source: AH8x227tU1ITjabEQZPiXEuE9ZCOdUtwGuGFPOudBwymQxnmLyfkP78D1QivukXjduUGfhLFi571 X-Received: by 2002:a17:902:7897:: with SMTP id q23-v6mr5694777pll.166.1517344259613; Tue, 30 Jan 2018 12:30:59 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1517344259; cv=none; d=google.com; s=arc-20160816; b=GP7JNfISQOGMZ4ZBqGw9OAhRF5tGgc+lgtFNQtImb+5NicX1CeorwHoCs9ZHq1Od9i yrTNokf1SEmaJCWGSYNcb0TbKM5XJz6PpYuJt+IsvB11naoAVaNKkEcFtW7qoMUD1qhL lMF8+mzcf8e6jp1HvEcriyt6ZSzAQIBCwBJi6vTEscWkxBdZNE5M+Gnfz54BUTtt1PcC N81s3jR4mWkw1FKnox/N8mi2uFygpldnj6CbW6LqCq6BhhnsVklwRIVJmsSdDOGdVrv4 Us7OgyYI0gXo3w8gZGT4ywmQHaULVMHom4+WcK73rzaOjdtIcThyWS/txqI+cYqbhIX3 Mv2Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfert-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :arc-authentication-results; bh=8wXP/VtRSU2gNGlm/NJX8jHDzeWbHPaDIUvt0x6nY08=; b=YXz0Zc02jz1jo7mUxbdl2GJuPFAw5HZ4rG/AbVAEdKkeG9diVJXgiT1vu+MHaLwRDc uSO6BQG5QBO7qdVL4uH5TDOxrR3KPtuu0E5NKhq1SCcJuQoXlD0je8P2DmfhhK+RbM3b z6vYUsd3NVJ6y6Lo3GVeKD4MIQToXK0hHQbgMLK8CxrRU7hf41d4VSeMIHgbiDkX320h sNUCYiQAPMZ7zoyXFKMO1mofsLpASI33wDDA/+amKTXVI1V5oYFmNfDkUZ/dXjAdufy+ fnpxOGXKrPrRFBQsrNQcde+l4Cf0Vo7a6PiifGftgSLeY7h+kdohgNpb+U8Vbs8tz4Tc mRDA== 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; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=collabora.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id a5-v6si2953231plt.652.2018.01.30.12.30.45; Tue, 30 Jan 2018 12:30:59 -0800 (PST) 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; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=collabora.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753130AbeA3UaJ (ORCPT + 99 others); Tue, 30 Jan 2018 15:30:09 -0500 Received: from bhuna.collabora.co.uk ([46.235.227.227]:56670 "EHLO bhuna.collabora.co.uk" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752792AbeA3UaG (ORCPT ); Tue, 30 Jan 2018 15:30:06 -0500 Received: from localhost.localdomain (unknown [IPv6:2a01:e35:8a7e:4790:1865:5d14:35de:d167]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) (Authenticated sender: tescande) by bhuna.collabora.co.uk (Postfix) with ESMTPSA id A9C9927451E; Tue, 30 Jan 2018 20:30:04 +0000 (GMT) From: Thierry Escande To: Archit Taneja , Inki Dae , Thierry Reding , Sandy Huang , Sean Paul , David Airlie , Tomasz Figa , Enric Balletbo i Serra Cc: Haixia Shi , =?UTF-8?q?=C3=98rjan=20Eide?= , Zain Wang , Yakir Yang , Lin Huang , Douglas Anderson , Mark Yao , linux-kernel@vger.kernel.org, linux-rockchip@lists.infradead.org, dri-devel@lists.freedesktop.org Subject: [PATCH v3 41/43] drm/rockchip: Disable PSR from reboot notifier Date: Tue, 30 Jan 2018 21:29:11 +0100 Message-Id: <20180130202913.28724-42-thierry.escande@collabora.com> X-Mailer: git-send-email 2.14.1 In-Reply-To: <20180130202913.28724-1-thierry.escande@collabora.com> References: <20180130202913.28724-1-thierry.escande@collabora.com> MIME-Version: 1.0 Content-Type: text/plain; charset = "utf-8" Content-Transfert-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Tomasz Figa It looks like the driver subsystem detaches devices from power domains at shutdown without consent of the drivers. This means that we might have our power domain turned off behind our back and the only way to avoid problems is to stop doing any hardware programming at some point before the power is cut. A reboot notifier, despite being a misnomer and handling shutdowns as well, is a good place to do it. Signed-off-by: Tomasz Figa Signed-off-by: Thierry Escande --- drivers/gpu/drm/rockchip/rockchip_drm_psr.c | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_psr.c b/drivers/gpu/drm/rockchip/rockchip_drm_psr.c index e7e16d92d5a1..1bf5cba9a64d 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_psr.c +++ b/drivers/gpu/drm/rockchip/rockchip_drm_psr.c @@ -13,6 +13,7 @@ */ #include +#include #include #include @@ -33,6 +34,7 @@ struct psr_drv { struct delayed_work flush_work; struct work_struct disable_work; + struct notifier_block reboot_nb; struct input_handler input_handler; int (*set)(struct drm_encoder *encoder, bool enable); @@ -309,6 +311,24 @@ static const struct input_device_id psr_ids[] = { { }, }; +static int rockchip_drm_psr_reboot_notifier(struct notifier_block *nb, + unsigned long action, void *data) +{ + struct psr_drv *psr = container_of(nb, struct psr_drv, reboot_nb); + + /* + * It looks like the driver subsystem detaches devices from power + * domains at shutdown without consent of the drivers. This means + * that we might have our power domain turned off behind our back + * and the only way to avoid problems is to stop doing any hardware + * programming after this point, which is achieved by the unbalanced + * call below. + */ + rockchip_drm_psr_inhibit_get(psr->encoder); + + return 0; +} + /** * rockchip_drm_psr_register - register encoder to psr driver * @encoder: encoder that obtain the PSR function @@ -361,6 +381,9 @@ int rockchip_drm_psr_register(struct drm_encoder *encoder, if (error) goto err1; + psr->reboot_nb.notifier_call = rockchip_drm_psr_reboot_notifier; + register_reboot_notifier(&psr->reboot_nb); + mutex_lock(&drm_drv->psr_list_lock); list_add_tail(&psr->list, &drm_drv->psr_list); mutex_unlock(&drm_drv->psr_list_lock); @@ -403,6 +426,7 @@ void rockchip_drm_psr_unregister(struct drm_encoder *encoder) WARN_ON(psr->inhibit_count != 1); list_del(&psr->list); + unregister_reboot_notifier(&psr->reboot_nb); input_unregister_handler(&psr->input_handler); kfree(psr->input_handler.name); kfree(psr); -- 2.14.1