Received: by 2002:a05:6a10:8c0a:0:0:0:0 with SMTP id go10csp913389pxb; Wed, 3 Mar 2021 20:51:00 -0800 (PST) X-Google-Smtp-Source: ABdhPJxfT2x6zAN4QLcs+v+RO8RxBtqzSPlRSNYe/sXqg5tBkUIXjl9rd2IqXfXETelwB18Vz0UF X-Received: by 2002:a50:ee19:: with SMTP id g25mr2378806eds.351.1614833460579; Wed, 03 Mar 2021 20:51:00 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1614833460; cv=none; d=google.com; s=arc-20160816; b=ePFwumvMzq2QMfQ/ovXDcvt3tEBo/PenFebvc4H4RZtTMMTQGZrlsoJenNVlLWQPhg KO3lgdDnnr048js3ZGakIspBw/lXrXIDdrMntc2TVItlcRaBaq2ZJ1R/2bB7OwBEBLOi v3XVJ0x6hk2lUISV494RTmaAaCeXrmeULMStFS1IplXlNA+p92He8XQlepLYI8IWqn/N 6LL2cYhORql+rLzXsSJPMkKB9jeMod46WpSHNyVDfy1JpSDx5dDF4JVVFVHFnMI++3fS PKy6DaS8uIW80lIDiES3Ib5lCQgjLa43WIsbJUOadE95LWXinOYYeX/9IrlmoYzE9l4p HNqg== 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=PkU+BQ5hRucNVmr9LseWYDt/2hIrTNjt2lIuunAFMB4=; b=UTJ8L2n4M+/S3tc0chdX5v8CEDzC3MEREcvRD+C0u2zr5R1pIqEe8iDneKfnVkobXd QKW3tuYZItDz3XJdG0b4o77JoYhlav2WC5ejXGrwPsvh1VgxoNJDCCdvn/89Nl3+HWL1 KyacrxyKG7Rh2ZABcvqm8gQtAIymWxyECk/qYPVKmmsamGohBMZuVpIJ7LeSlNbuewt2 KmrqoCgRmv3YX3o94RpYFF+M2mulST/KOXAQ6H0fTHw+W541QtLqEFl4Ot96zX8s1zqR Hya573RbNPhbyHoQ0ogHQ5+5ALaEv47zXYlpEEEiY+RAM4YfdroYrEn5wYJ8VNYYIjsL Ultw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=u9rO0dPh; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 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 vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id h17si14588915edr.331.2021.03.03.20.50.38; Wed, 03 Mar 2021 20:51:00 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=u9rO0dPh; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 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 S1441876AbhCBB5W (ORCPT + 99 others); Mon, 1 Mar 2021 20:57:22 -0500 Received: from mail.kernel.org ([198.145.29.99]:50716 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S242086AbhCATfI (ORCPT ); Mon, 1 Mar 2021 14:35:08 -0500 Received: by mail.kernel.org (Postfix) with ESMTPSA id 113C665200; Mon, 1 Mar 2021 17:21:32 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1614619293; bh=kvVSK4iz6G8SvJ7GwNvkgmH05szPo7FQtFbJyKPhz3o=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=u9rO0dPhO6su0P0cQareEZLqrhuXBh0RahxifQt7Xg9/HnZ97nRpiS/OWHR2wk1Y0 J7S1YGYUl6dsG/JuW7IbdPeMS3h38pusw/wPxXBKfmfcloR86853j/ihkuINKPVFa5 F5707npP2ZzJZ46T4+lKAhW9UeBOJe8Ymt0X1yWM= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Trent Piepho , Simon South , Thierry Reding , Sasha Levin Subject: [PATCH 5.10 403/663] pwm: rockchip: Eliminate potential race condition when probing Date: Mon, 1 Mar 2021 17:10:51 +0100 Message-Id: <20210301161201.808684446@linuxfoundation.org> X-Mailer: git-send-email 2.30.1 In-Reply-To: <20210301161141.760350206@linuxfoundation.org> References: <20210301161141.760350206@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: Simon South [ Upstream commit d21ba5d6217bd5a6a696678385906ed1994b380b ] Commit 48cf973cae33 ("pwm: rockchip: Avoid glitches on already running PWMs") introduced a potential race condition in rockchip_pwm_probe(): A consumer could enable an inactive PWM, or disable a running one, between rockchip_pwm_probe() registering the device via pwmchip_add() and checking whether it is enabled (to determine whether it was started by a bootloader). This could result in a device's PWM clock being either enabled once more than necessary, potentially causing it to continue running when no longer needed, or disabled once more than necessary, producing a warning from the kernel. Eliminate these possibilities by modifying rockchip_pwm_probe() so it checks whether a device is enabled before registering it rather than after. Fixes: 48cf973cae33 ("pwm: rockchip: Avoid glitches on already running PWMs") Reported-by: Trent Piepho Signed-off-by: Simon South Signed-off-by: Thierry Reding Signed-off-by: Sasha Levin --- drivers/pwm/pwm-rockchip.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/drivers/pwm/pwm-rockchip.c b/drivers/pwm/pwm-rockchip.c index ede027fbf2bb4..3b8da7b0091b1 100644 --- a/drivers/pwm/pwm-rockchip.c +++ b/drivers/pwm/pwm-rockchip.c @@ -289,6 +289,7 @@ static int rockchip_pwm_probe(struct platform_device *pdev) struct rockchip_pwm_chip *pc; struct resource *r; u32 enable_conf, ctrl; + bool enabled; int ret, count; id = of_match_device(rockchip_pwm_dt_ids, &pdev->dev); @@ -351,6 +352,10 @@ static int rockchip_pwm_probe(struct platform_device *pdev) pc->chip.of_pwm_n_cells = 3; } + enable_conf = pc->data->enable_conf; + ctrl = readl_relaxed(pc->base + pc->data->regs.ctrl); + enabled = (ctrl & enable_conf) == enable_conf; + ret = pwmchip_add(&pc->chip); if (ret < 0) { dev_err(&pdev->dev, "pwmchip_add() failed: %d\n", ret); @@ -358,9 +363,7 @@ static int rockchip_pwm_probe(struct platform_device *pdev) } /* Keep the PWM clk enabled if the PWM appears to be up and running. */ - enable_conf = pc->data->enable_conf; - ctrl = readl_relaxed(pc->base + pc->data->regs.ctrl); - if ((ctrl & enable_conf) != enable_conf) + if (!enabled) clk_disable(pc->clk); clk_disable(pc->pclk); -- 2.27.0