Received: by 2002:a05:6a10:d5a5:0:0:0:0 with SMTP id gn37csp2082093pxb; Thu, 7 Oct 2021 23:51:53 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwnoFHsrR5zbsP4VmMY3PyaFMSy3l6Lf6lwnhokTZQkfNs1R4IPpe85pYvnugVNAKG2EisL X-Received: by 2002:aa7:92d2:0:b0:44b:566e:ec5 with SMTP id k18-20020aa792d2000000b0044b566e0ec5mr8409918pfa.30.1633675913584; Thu, 07 Oct 2021 23:51:53 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1633675913; cv=none; d=google.com; s=arc-20160816; b=NIrvnFzp3naYnRL0G41dWr4vm7PmPrxgl9n4aXlbKked2bb2K6SfxG2zj4Q//rOUQw bay6jAbKu2w08fN4pucLxyY24QMGDirzh2FpflSxuHTjAjWO2FiwTnzrV2AVqNsaTWxD Nb8FkpfwcuMvxJcSTFK7ZxaTT07gq1lpyEhzo8rFETWIN/UJW3bS4Vvgt8GXyD8tDGk5 TEgD0c0OEiApPC6AhQnO8JA7yeLHWGXazcSVV14DOYj0CjoLMjYCk349Vvymwg3BTkR5 g9QVVeM113Y0mRqiBBch7B7E0hC6IGfp+IO0UD/3UlCGbKSFsFqUPEXNRb6ZYXZ3ezmW OSMQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:content-language :in-reply-to:mime-version:user-agent:date:message-id:from:references :cc:to:subject:dkim-signature; bh=BA1SQapvvCAz+oDHnVnfNV3L9jjEVw0WkLjaLMpinks=; b=liWXt/q+7u5yVN96p6lKmgqte9PDVXRNphkjrQQuQM9rUqwCYjbw1dsn6hF/2i9W0c Ym5jm3ca60V2UeIzLNeJOpb/JKj4ELG//VWWUuaFel7Qv21vUjBOfgQhFgLVCHWzf/cf vw10dktzl8M3jP5nDlfYcue01dYBg+bxqCgjEE/UwBnFs7clZl+fYRBoHvkJfS4GtCPM CdvKwKk4A60qsIgJItzDeb507C6CNhd2zpaFTUSJLHtS1nrnMPHqrsoTuKl4bKJN82ti yQrjZ+8oMOs5pZseJGscaF46l9DUy/L2b8ZM5ETVB10Z3bnsTbX1kX6lfWUx9+aSTyoV 8LvQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@canonical.com header.s=20210705 header.b=b+oFwbMj; 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=canonical.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id r26si2037332pgv.229.2021.10.07.23.51.40; Thu, 07 Oct 2021 23:51:53 -0700 (PDT) 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=@canonical.com header.s=20210705 header.b=b+oFwbMj; 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=canonical.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229828AbhJHGwx (ORCPT + 99 others); Fri, 8 Oct 2021 02:52:53 -0400 Received: from smtp-relay-internal-0.canonical.com ([185.125.188.122]:51846 "EHLO smtp-relay-internal-0.canonical.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229490AbhJHGwv (ORCPT ); Fri, 8 Oct 2021 02:52:51 -0400 Received: from mail-wr1-f72.google.com (mail-wr1-f72.google.com [209.85.221.72]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by smtp-relay-internal-0.canonical.com (Postfix) with ESMTPS id F001E4001D for ; Fri, 8 Oct 2021 06:50:55 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=canonical.com; s=20210705; t=1633675855; bh=BA1SQapvvCAz+oDHnVnfNV3L9jjEVw0WkLjaLMpinks=; h=Subject:To:Cc:References:From:Message-ID:Date:MIME-Version: In-Reply-To:Content-Type; b=b+oFwbMjZ7Q1gR/N0QXHu5mFy5QHiPxBo/SO33cX8kTDMVFCPBti4eBnOwOfPTtUk Sz5mqlgwr3pIlLTUas4FXq+6p36HMBI2Zk29euTptSwFeqGanyrb1TrivjBriBJgfd YDyV9BEBaaaCX68P8gVZYzKvjmArkw9PL+AkwMS/Qk2QD2CFyE2NcUc5qJlYquuWUF Xd7rjzGoMuAK03ys0TzjVpKSqOR4lGmy6VfsdBOKDiD5puONFt5/bNXmpcCFtYLxzT 9oOZ7y/VGFr6+Fed5CcsY5dCDHXg7kgrcSi1GDq4ntk841xEu/IrjCg89ex46PVHsU hGlulWeaDelNQ== Received: by mail-wr1-f72.google.com with SMTP id 75-20020adf82d1000000b00160cbb0f800so5746952wrc.22 for ; Thu, 07 Oct 2021 23:50:55 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:subject:to:cc:references:from:message-id:date :user-agent:mime-version:in-reply-to:content-language :content-transfer-encoding; bh=BA1SQapvvCAz+oDHnVnfNV3L9jjEVw0WkLjaLMpinks=; b=pJybmzkUsnAEH8Li5XLFKcwd6M9GpHXJt2hF02Qqfend+PrE8Sl1+JirB2YbVbDurx YN1lS234sMNJHApW0ecda0BHttfYsMOJ8uBrVmUj14Ytgw+GR4cl8l/iKFr3MBzVXCbj fPk/TB3nlcZ8W1IEAEXpnmFcODvNxXdvx/g8XoCy6JW2OA7IZauhrPNsmGSiGa4SKuUR lgJOfNbxrj13CHiC0uvvB6d+nxfvN05ovBojSTGi0u3cuOhsQLofLd+UU9celt1TLevA t8n1GXPoK8smgPw0u0IBNTMrLiAjXO5SpKguZuEVSuBip+oX36RcwnYHEkb3DlL8ZBE6 4XdQ== X-Gm-Message-State: AOAM530Tp/UrE5KSmPIYHWgCHTOzURKNjAGTgn2eadjrqB09ikL6jf4p A0g9Nq2M1zULksAE64sJwhbwSgiSg08wk0EfSa9qqDs6vpclcL5BSaVP0QlZP1Doj3G4VdkYV9o urZ9jBfwRTTKBaKGL7lpsSNHCK3xEU7xrftT9/WHibw== X-Received: by 2002:a05:600c:a05:: with SMTP id z5mr1495896wmp.73.1633675855422; Thu, 07 Oct 2021 23:50:55 -0700 (PDT) X-Received: by 2002:a05:600c:a05:: with SMTP id z5mr1495870wmp.73.1633675855214; Thu, 07 Oct 2021 23:50:55 -0700 (PDT) Received: from [192.168.1.24] (xdsl-188-155-186-13.adslplus.ch. [188.155.186.13]) by smtp.gmail.com with ESMTPSA id d8sm1489334wrz.84.2021.10.07.23.50.54 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Thu, 07 Oct 2021 23:50:54 -0700 (PDT) Subject: Re: [PATCH 1/6] clk: samsung: Enable bus clock on init To: Sam Protsenko Cc: Sylwester Nawrocki , =?UTF-8?Q?Pawe=c5=82_Chmiel?= , Chanwoo Choi , Tomasz Figa , Rob Herring , Stephen Boyd , Michael Turquette , Ryu Euiyoul , Tom Gall , Sumit Semwal , John Stultz , Amit Pundir , devicetree , linux-arm Mailing List , linux-clk , Linux Kernel Mailing List , Linux Samsung SOC References: <20210914155607.14122-1-semen.protsenko@linaro.org> <20210914155607.14122-2-semen.protsenko@linaro.org> <6ef3e9a3-77e7-48b7-cbcd-c13db50d0cd9@canonical.com> <16ee07a1-afa9-b258-8836-e96de84551db@canonical.com> From: Krzysztof Kozlowski Message-ID: <14624734-40bf-2e39-354c-244e730ef8e1@canonical.com> Date: Fri, 8 Oct 2021 08:50:54 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Thunderbird/78.13.0 MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset=utf-8 Content-Language: en-US Content-Transfer-Encoding: 7bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 06/10/2021 15:29, Sam Protsenko wrote: > On Wed, 6 Oct 2021 at 15:38, Krzysztof Kozlowski > wrote: >> >> On 06/10/2021 12:46, Sam Protsenko wrote: >>> On Wed, 15 Sept 2021 at 11:21, Krzysztof Kozlowski >>> wrote: >>>> >>>> On 14/09/2021 17:56, Sam Protsenko wrote: >>>>> By default if bus clock has no users its "enable count" value is 0. It >>>>> might be actually running if it's already enabled in bootloader, but >>>>> then in some cases it can be disabled by mistake. For example, such case >>>>> was observed when dw_mci_probe() enabled bus clock, then failed to do >>>>> something and disabled that bus clock on error path. After that even >>>>> attempt to read the 'clk_summary' file in DebugFS freezed forever, as >>>>> CMU bus clock ended up being disabled and it wasn't possible to access >>>>> CMU registers anymore. >>>>> >>>>> To avoid such cases, CMU driver must increment the ref count for that >>>>> bus clock by running clk_prepare_enable(). There is already existing >>>>> '.clk_name' field in struct samsung_cmu_info, exactly for that reason. >>>>> It was added in commit 523d3de41f02 ("clk: samsung: exynos5433: Add >>>>> support for runtime PM"). But the clock is actually enabled only in >>>>> Exynos5433 clock driver. Let's mimic what is done there in generic >>>>> samsung_cmu_register_one() function, so other drivers can benefit from >>>>> that `.clk_name' field. As was described above, it might be helpful not >>>>> only for PM reasons, but also to prevent possible erroneous clock gating >>>>> on error paths. >>>>> >>>>> Another way to workaround that issue would be to use CLOCK_IS_CRITICAL >>>>> flag for corresponding gate clocks. But that might be not very good >>>>> design decision, as we might still want to disable that bus clock, e.g. >>>>> on PM suspend. >>>>> >>>>> Signed-off-by: Sam Protsenko >>>>> --- >>>>> drivers/clk/samsung/clk.c | 13 +++++++++++++ >>>>> 1 file changed, 13 insertions(+) >>>>> >>>>> diff --git a/drivers/clk/samsung/clk.c b/drivers/clk/samsung/clk.c >>>>> index 1949ae7851b2..da65149fa502 100644 >>>>> --- a/drivers/clk/samsung/clk.c >>>>> +++ b/drivers/clk/samsung/clk.c >>>>> @@ -357,6 +357,19 @@ struct samsung_clk_provider * __init samsung_cmu_register_one( >>>>> >>>>> ctx = samsung_clk_init(np, reg_base, cmu->nr_clk_ids); >>>>> >>>>> + /* Keep bus clock running, so it's possible to access CMU registers */ >>>>> + if (cmu->clk_name) { >>>>> + struct clk *bus_clk; >>>>> + >>>>> + bus_clk = __clk_lookup(cmu->clk_name); >>>>> + if (bus_clk) { >>>>> + clk_prepare_enable(bus_clk); >>>>> + } else { >>>>> + pr_err("%s: could not find bus clock %s\n", __func__, >>>>> + cmu->clk_name); >>>>> + } >>>>> + } >>>>> + >>>> >>>> Solving this problem in generic way makes sense but your solution is >>>> insufficient. You skipped suspend/resume paths and in such case you >>>> should remove the Exynos5433-specific code. >>>> >>> >>> Keeping core bus clocks always running seems like a separate >>> independent feature to me (not related to suspend/resume). It's >>> mentioned in commit 523d3de41f02 ("clk: samsung: exynos5433: Add >>> support for runtime PM") this way: >>> >>> "Also for each CMU there is one special parent clock, which has to >>> be enabled all the time when any access to CMU registers is being >>> done." >>> >>> Why do you think suspend/resume paths have to be implemented along >>> with it? Btw, I didn't add PM ops in clk-exynos850, as PM is not >>> implemented on my board yet and I can't test it. >> >> You can skip the runtime PM, so keep your patch almost like it is now >> (in respect to Sylwester's comment about __clk_lookup). However now the >> Exynos5433 will enable the clk_name twice: here and in >> exynos5433_cmu_probe(). >> >> If you keep this approach, you need to remove duplicated part in >> exynos5433_cmu_probe()... >> > > My patch is only touching samsung_cmu_register_one(), and > exynos5433_cmu_probe() doesn't call samsung_cmu_register_one(). So I > don't think there can be a problem there. Or I'm missing something? > > samsung_cmu_register_one() is actually called from 5433 clk driver, > but only from CMUs registered with CLK_OF_DECLARE(), and those are not > setting .clk_name field, so my code is not affecting those either. You are right. > > Real problem I can see is that I can't avoid using __clk_lookup() if I > implement that code in samsung_cmu_register_one(). Tried to do use > clk_get(NULL, ...) instead, but it doesn't work with 1st param (dev) > being NULL, because samsung_clk_register_*() functions don't register > clkdev (only samsung_clk_register_fixed_rate() does), hence > LIST_HEAD(clocks) is empty in clkdev.c, and clk_get() fails, when not > provided with actual 'dev' param, which in turn is not present in > samsung_cmu_register_one()... > > About using platform_driver: as I can see from clk-exynos5433.c, only > CMUs which belong to Power Domains are registered as platform_driver. > Rest of CMUs are registered using CLK_OF_DECLARE(), thus they don't > get platform_device param. That makes it harder to avoid using > __clk_lookup() inside samsung_cmu_register_one(). > > All that said, I feel like correct way to implement this patch would be: > 1. Register all PD-capable CMUs as platform_driver in clk-exynos850 > (all CMUs except CMU_TOP) > 2. Move bus clock enablement code from samsung_cmu_register_one() to > corresponding clk-exynos850 probe function > > This way I would be able to use clk_get(dev, ...) instead of > __clk_lookup(), and that won't affect any existing code for sure. Code > will be more unified w.r.t. how it's done in clk-exynos5433, and > platform_device will be a foundation for implementing PM ops later. > Taking into account how much design decisions should be done for using > that in common code -- I'd say let's do that later, as a separate > refactoring activity. > > Do you think that makes sense? Yes, makes sense. Thank you! Best regards, Krzysztof