Received: by 2002:a05:6359:c8b:b0:c7:702f:21d4 with SMTP id go11csp2510767rwb; Mon, 3 Oct 2022 01:37:58 -0700 (PDT) X-Google-Smtp-Source: AMsMyM6ruXbpYqO56NtQDnEccSxtodp/ez8YjQdP3rMINP6hTE5f4mYZn9WVtcXQE0N28WKXcN2M X-Received: by 2002:a17:902:bcc3:b0:178:639a:1a10 with SMTP id o3-20020a170902bcc300b00178639a1a10mr20974088pls.159.1664786278637; Mon, 03 Oct 2022 01:37:58 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1664786278; cv=none; d=google.com; s=arc-20160816; b=fFjD1+CQ3F+00bz+myPQDItMHVrBSRPzVu34SrRoSeDbLry4+AGti+zXlVPNSNo1qF 1DtslsvtfXuxvrCjN2+I+S4oIlPYf8ua21/9CD9CRolasEhX/bpLGJZZ2Lac7YQwPbBg MU3rADvKFIOxTyGEm+3IBjtla2LfwSdGjnZvjiGEExregiQFqcEytZ8DNboB44yhPnKm NczBengGBGGNW6dU+EBn6N1A52SWz9rImuJCNkcbAJkkL0OmNCztKEIVikXTRojEDPSg wrtHlgwPLjBF+xOEi5sY/89pV2cYLP0hLzZVXUGawUr99T1y+CZz/nFM+76ELeiyUJ7R ZkBQ== 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=Ub/TAkRtfaL2k1Xpa4TQthAO0y5oobU0uwQqNexnOzA=; b=cDFXvhIkAqRwm5rzDXk1+D1Cm+sQiH3LSwynvKx9y0Lxbl3zNE5EwXpTUROTSv4R7s e40S5t7FZJ8GuEoyyMQ74eP2DQl6/3C/VyjmYImxDFW4Etfa0i4jUpkrfVpkdAUCW7eU p1mmeAqkzvyheXr20KbGi0b7x/Sw9rH1Hu9siNqOWcj+WwOirU5/2ZPabFmabsOLL0Pk 70FYKdw5g11tF8M+kto8AYkXJdIlG/qvZrCtL71qgC4LKpS9nahoDnEtd/f/nhZ7VZKr aaxCXLTQ+oG6FWejMVUnrMnTNnX0LKUF12OkqIzwA/PzPr91dYV4LfW1onqVoUjSdWek kdnQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b="Zc/YPfFn"; 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 s72-20020a632c4b000000b0043f06af753csi9755870pgs.0.2022.10.03.01.37.47; Mon, 03 Oct 2022 01:37:58 -0700 (PDT) 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="Zc/YPfFn"; 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 S230391AbiJCHYs (ORCPT + 99 others); Mon, 3 Oct 2022 03:24:48 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:38216 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229942AbiJCHX2 (ORCPT ); Mon, 3 Oct 2022 03:23:28 -0400 Received: from dfw.source.kernel.org (dfw.source.kernel.org [139.178.84.217]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 10AC94A819; Mon, 3 Oct 2022 00:17:05 -0700 (PDT) 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 dfw.source.kernel.org (Postfix) with ESMTPS id 9912660F9D; Mon, 3 Oct 2022 07:17:04 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id AEB85C43144; Mon, 3 Oct 2022 07:17:03 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1664781424; bh=ZpKjv/MqU+BVENNAyJSrumUBGjzF0RDQDNmlN6qablY=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Zc/YPfFnqqTYbo18W6DQ4EJxa66XvRlgC96gEv0/zaP8unB+LB+3t2dk5E1DHAxuO 9WHOv2gr/qxPA3XQp5pDK9rsXlK/Um/nbkjZpCo0OHFcBTf+Cf6z9qRESRsI8BHtnx t0YPuKJSzONGD96jj7HBSZ7LrorYYEcac9k/OknA= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Paul Cercueil , Aidan MacDonald , Stephen Boyd Subject: [PATCH 5.15 15/83] clk: ingenic-tcu: Properly enable registers before accessing timers Date: Mon, 3 Oct 2022 09:10:40 +0200 Message-Id: <20221003070722.365624246@linuxfoundation.org> X-Mailer: git-send-email 2.37.3 In-Reply-To: <20221003070721.971297651@linuxfoundation.org> References: <20221003070721.971297651@linuxfoundation.org> User-Agent: quilt/0.67 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-7.1 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_HI, SPF_HELO_NONE,SPF_PASS autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Aidan MacDonald commit 6726d552a6912e88cf63fe2bda87b2efa0efc7d0 upstream. Access to registers is guarded by ingenic_tcu_{enable,disable}_regs() so the stop bit can be cleared before accessing a timer channel, but those functions did not clear the stop bit on SoCs with a global TCU clock gate. Testing on the X1000 has revealed that the stop bits must be cleared _and_ the global TCU clock must be ungated to access timer registers. This appears to be the norm on Ingenic SoCs, and is specified in the documentation for the X1000 and numerous JZ47xx SoCs. If the stop bit isn't cleared, register writes don't take effect and the system can be left in a broken state, eg. the watchdog timer may not run. The bug probably went unnoticed because stop bits are zeroed when the SoC is reset, and the kernel does not set them unless a timer gets disabled at runtime. However, it is possible that a bootloader or a previous kernel (if using kexec) leaves the stop bits set and we should not rely on them being cleared. Fixing this is easy: have ingenic_tcu_{enable,disable}_regs() always clear the stop bit, regardless of the presence of a global TCU gate. Reviewed-by: Paul Cercueil Tested-by: Paul Cercueil Fixes: 4f89e4b8f121 ("clk: ingenic: Add driver for the TCU clocks") Cc: stable@vger.kernel.org Signed-off-by: Aidan MacDonald Link: https://lore.kernel.org/r/20220617122254.738900-1-aidanmacdonald.0x0@gmail.com Signed-off-by: Stephen Boyd Signed-off-by: Greg Kroah-Hartman --- drivers/clk/ingenic/tcu.c | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) --- a/drivers/clk/ingenic/tcu.c +++ b/drivers/clk/ingenic/tcu.c @@ -100,15 +100,11 @@ static bool ingenic_tcu_enable_regs(stru bool enabled = false; /* - * If the SoC has no global TCU clock, we must ungate the channel's - * clock to be able to access its registers. - * If we have a TCU clock, it will be enabled automatically as it has - * been attached to the regmap. + * According to the programming manual, a timer channel's registers can + * only be accessed when the channel's stop bit is clear. */ - if (!tcu->clk) { - enabled = !!ingenic_tcu_is_enabled(hw); - regmap_write(tcu->map, TCU_REG_TSCR, BIT(info->gate_bit)); - } + enabled = !!ingenic_tcu_is_enabled(hw); + regmap_write(tcu->map, TCU_REG_TSCR, BIT(info->gate_bit)); return enabled; } @@ -119,8 +115,7 @@ static void ingenic_tcu_disable_regs(str const struct ingenic_tcu_clk_info *info = tcu_clk->info; struct ingenic_tcu *tcu = tcu_clk->tcu; - if (!tcu->clk) - regmap_write(tcu->map, TCU_REG_TSSR, BIT(info->gate_bit)); + regmap_write(tcu->map, TCU_REG_TSSR, BIT(info->gate_bit)); } static u8 ingenic_tcu_get_parent(struct clk_hw *hw)