Received: by 2002:a05:6a10:1a4d:0:0:0:0 with SMTP id nk13csp834394pxb; Tue, 8 Feb 2022 03:39:15 -0800 (PST) X-Google-Smtp-Source: ABdhPJzr1/SuNdVeOjuCl3XaWGKvCiMNhP1EgoseUoNYOhHKMU7xHBectHv/Qx5jUavq3jP1e8ge X-Received: by 2002:a17:90a:bc81:: with SMTP id x1mr890471pjr.119.1644320355561; Tue, 08 Feb 2022 03:39:15 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1644320355; cv=none; d=google.com; s=arc-20160816; b=Id3Ls31iA9R6lxbEFs94IKEEeIVCe9/9ibCYq7p+mU6D6MonHj9HGi2XPs4G/lejoq d7S/iMAJp/wWivVKLNk7KTgiBXM4UcwO+KcvMrGE1F7Kc+qkVvQb/0sksEe8hfOEF5nT AV1GWAp6aWlXPv/cXKUEXM0Kl/GaJsNPkuzL7WG2e9K+/dSSXu5dxQV0e8hoL3pcYk5Z EQ63vINkky2mrrQh1bXh6JfLiyzfY8OVhENGo2ESsqY0vqM2pfHSmBpRFoh2H2CO/LOe sJIO9tondTSxN4KMDNVPP3avegjjR3l5gQTVDpK45xIQC/YDpMCgqE3UnQCyCsdVeX+T nS7A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=+W8BrkQhSvwgq3rsbyJfwzZqeoRGXMvC1qmmGgoJ1jo=; b=Iy/9nALumL67KjFpneGD65bG7I2Hits5xtQH9SkpjDdByMc+fi0Bd2GnnlF2nSTOqk G6wWFa+UQlkgOXiwg362PnNr9ECXn5FSbJ9JZzB22JqCPns28oKRiwAfmgy0FNFJ9Vu8 9tgVNumivQs6/WiAoyNThe4R9Utw/Z3H+/3U05Y3ET62geV7s/mFMHIlzFe2PKlTDYNS F+Hves/AocoP7fU8xkUotMEaGXfIgOulb5CEIKqNyiu7ZKor4xqykwQtRY9c9GKAP5OW v9w4HoNyeNKZdQM5szCRRRUHv5gjQWOrPT9C2XU24wYB1H1sXX1hM/RPiPz6wChPW1b5 XY+A== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=X527u0Mp; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id e7si14312609plh.419.2022.02.08.03.39.02; Tue, 08 Feb 2022 03:39:15 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=X527u0Mp; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1358004AbiBDJZD (ORCPT + 99 others); Fri, 4 Feb 2022 04:25:03 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:60912 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1357632AbiBDJYB (ORCPT ); Fri, 4 Feb 2022 04:24:01 -0500 Received: from ams.source.kernel.org (ams.source.kernel.org [IPv6:2604:1380:4601:e00::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 7097FC06175B; Fri, 4 Feb 2022 01:24:00 -0800 (PST) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ams.source.kernel.org (Postfix) with ESMTPS id 47BFBB836F6; Fri, 4 Feb 2022 09:23:53 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 80AF6C004E1; Fri, 4 Feb 2022 09:23:51 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1643966632; bh=OxpOP/jUrCZimqEHq+PDepB4El50IioImZso2DkqQNM=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=X527u0MpPCe/WStAqYkPIcrVOFgt/1A7GFensW9AJwdOTSvinj5w0/gzCS7hRZzCQ Kn4YAWebRcfBAwRq3VWsLc1527tLbhdinM4WZUtQAW644eaW3TN4GnzI4tYrboPrZb kG8gX5jOC9gkqtecUZS/IT+K/N5UpfoKOraG6pv4= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Michael Stapelberg , Maxime Ripard Subject: [PATCH 5.15 05/32] drm/vc4: hdmi: Make sure the device is powered with CEC Date: Fri, 4 Feb 2022 10:22:15 +0100 Message-Id: <20220204091915.421812582@linuxfoundation.org> X-Mailer: git-send-email 2.35.1 In-Reply-To: <20220204091915.247906930@linuxfoundation.org> References: <20220204091915.247906930@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Maxime Ripard Commit 20b0dfa86bef0e80b41b0e5ac38b92f23b6f27f9 upstream. The original commit depended on a rework commit (724fc856c09e ("drm/vc4: hdmi: Split the CEC disable / enable functions in two")) that (rightfully) didn't reach stable. However, probably because the context changed, when the patch was applied to stable the pm_runtime_put called got moved to the end of the vc4_hdmi_cec_adap_enable function (that would have become vc4_hdmi_cec_disable with the rework) to vc4_hdmi_cec_init. This means that at probe time, we now drop our reference to the clocks and power domains and thus end up with a CPU hang when the CPU tries to access registers. The call to pm_runtime_resume_and_get() is also problematic since the .adap_enable CEC hook is called both to enable and to disable the controller. That means that we'll now call pm_runtime_resume_and_get() at disable time as well, messing with the reference counting. The behaviour we should have though would be to have pm_runtime_resume_and_get() called when the CEC controller is enabled, and pm_runtime_put when it's disabled. We need to move things around a bit to behave that way, but it aligns stable with upstream. Cc: # 5.10.x Cc: # 5.15.x Cc: # 5.16.x Reported-by: Michael Stapelberg Signed-off-by: Maxime Ripard Signed-off-by: Greg Kroah-Hartman --- drivers/gpu/drm/vc4/vc4_hdmi.c | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) --- a/drivers/gpu/drm/vc4/vc4_hdmi.c +++ b/drivers/gpu/drm/vc4/vc4_hdmi.c @@ -1738,18 +1738,18 @@ static int vc4_hdmi_cec_adap_enable(stru u32 val; int ret; - ret = pm_runtime_resume_and_get(&vc4_hdmi->pdev->dev); - if (ret) - return ret; + if (enable) { + ret = pm_runtime_resume_and_get(&vc4_hdmi->pdev->dev); + if (ret) + return ret; - val = HDMI_READ(HDMI_CEC_CNTRL_5); - val &= ~(VC4_HDMI_CEC_TX_SW_RESET | VC4_HDMI_CEC_RX_SW_RESET | - VC4_HDMI_CEC_CNT_TO_4700_US_MASK | - VC4_HDMI_CEC_CNT_TO_4500_US_MASK); - val |= ((4700 / usecs) << VC4_HDMI_CEC_CNT_TO_4700_US_SHIFT) | - ((4500 / usecs) << VC4_HDMI_CEC_CNT_TO_4500_US_SHIFT); + val = HDMI_READ(HDMI_CEC_CNTRL_5); + val &= ~(VC4_HDMI_CEC_TX_SW_RESET | VC4_HDMI_CEC_RX_SW_RESET | + VC4_HDMI_CEC_CNT_TO_4700_US_MASK | + VC4_HDMI_CEC_CNT_TO_4500_US_MASK); + val |= ((4700 / usecs) << VC4_HDMI_CEC_CNT_TO_4700_US_SHIFT) | + ((4500 / usecs) << VC4_HDMI_CEC_CNT_TO_4500_US_SHIFT); - if (enable) { HDMI_WRITE(HDMI_CEC_CNTRL_5, val | VC4_HDMI_CEC_TX_SW_RESET | VC4_HDMI_CEC_RX_SW_RESET); HDMI_WRITE(HDMI_CEC_CNTRL_5, val); @@ -1777,7 +1777,10 @@ static int vc4_hdmi_cec_adap_enable(stru HDMI_WRITE(HDMI_CEC_CPU_MASK_SET, VC4_HDMI_CPU_CEC); HDMI_WRITE(HDMI_CEC_CNTRL_5, val | VC4_HDMI_CEC_TX_SW_RESET | VC4_HDMI_CEC_RX_SW_RESET); + + pm_runtime_put(&vc4_hdmi->pdev->dev); } + return 0; } @@ -1888,8 +1891,6 @@ static int vc4_hdmi_cec_init(struct vc4_ if (ret < 0) goto err_remove_handlers; - pm_runtime_put(&vc4_hdmi->pdev->dev); - return 0; err_remove_handlers: