Received: by 2002:a05:6a10:206:0:0:0:0 with SMTP id 6csp525271pxj; Wed, 2 Jun 2021 05:19:19 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxoQR7jT0J30wYIAQA61sZv8ZMRa5s2Q8TYb+0U5mylWt+ZpmpyaQxaqvaAlQfZCSXMySWt X-Received: by 2002:a05:6402:1046:: with SMTP id e6mr38281756edu.218.1622636359538; Wed, 02 Jun 2021 05:19:19 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1622636359; cv=none; d=google.com; s=arc-20160816; b=F6ODS5/aXkOoZzybMheF8ZXXhIK3X+vKtte1MIXIeLK7uHuOnLSETbB2aFQehK66Me 4ZEWEuIkwKa4KqNWPaYH8YA4eftqOme9WjAF8wWEJZVDkgu4v9Nm9jb+sc9nftTtvlut YIZoTsEAmKwbzQ+x9IVYcnhHEjiyX6UkNmlcexfKRyJjThhB2hIUi6t7XTTnd5RPqJWr NYqE7LNiIddJf4HoxyHVXVF8LlUesBOBQ5WU/BMbaDc/pu9+gOwZQe/LbYuUPKDwMuBd iAG8ipl2+Jr9mM++9nIsiSq+QaEz6cUXAt71CYpYAMPMJ8syd3gHeDB8jbgjU8Cli9dC WFxA== 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=YWSY2cvkvidrGJauSm19Qmn4FgCLAu02zP7qkPvv6YY=; b=vAK1He6WqL3QkqXLs4K4d5E5ewd744k+w21yujbgcF5v7aji/EnJgDHBTx0twnjA7A /ULkeAaSr7wz8s0Rm54P/AqeRA92WBs3aPpnh9jt1SbGVNH9YQ5YpuZ6h2jQ6w3qYEKK f426XFSkw58R8OwL7S81iyqmGPJjGeY/m51n5OM25mjKuPHy2DBEZQ+WtglQnKVkU4wJ lzoACYRxVvT8WNFf6pdlTSn0OMWkMpz6bb6QZVw8X+vq20FEJ2T6RZjkUYSo/cgzFDYE v1rOZnIUjo/op7PopNvMk1GLVnWYa59ePKdgnuB6o8RQz85+scAtCEl+WmUqvOl1nYeo cXqQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=kQQsl2Up; 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=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id g2si1803832edu.441.2021.06.02.05.18.57; Wed, 02 Jun 2021 05:19:19 -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=@gmail.com header.s=20161025 header.b=kQQsl2Up; 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=QUARANTINE dis=NONE) header.from=gmail.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229765AbhFBMRo (ORCPT + 99 others); Wed, 2 Jun 2021 08:17:44 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:37082 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229541AbhFBMRo (ORCPT ); Wed, 2 Jun 2021 08:17:44 -0400 Received: from mail-wr1-x42c.google.com (mail-wr1-x42c.google.com [IPv6:2a00:1450:4864:20::42c]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 1749DC061574 for ; Wed, 2 Jun 2021 05:16:00 -0700 (PDT) Received: by mail-wr1-x42c.google.com with SMTP id h8so2057576wrz.8 for ; Wed, 02 Jun 2021 05:16:00 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=subject:to:cc:references:from:message-id:date:user-agent :mime-version:in-reply-to:content-language:content-transfer-encoding; bh=YWSY2cvkvidrGJauSm19Qmn4FgCLAu02zP7qkPvv6YY=; b=kQQsl2UpBlB6F2Fk5+FuEtjEbKlu1rn2IDj2N3IsksURVjrcDfzgw0akVFK2ZJrium 7B9DHOzOfhCN1pHe+R7wqs9Bwy7HFnI6PeLGLEQN+Bz/YlJ2qPWQf2QIk2gt/siQyP66 kx0pTnpoUKSqZ1bVspuqO00aRF+mZ/e6mpEipknqziVjKuxTHTbYkNY9JJy9I8vmBM6V 8zrOmG5ohKCSYLrZQbXQpN0iTSHwaqv6Vdug5QTyZHKv4BonHDYQSWF4EG4L/i4j7sYa W8QgIgOPl6GG3UDgukR4o6+gnS8RO2MzJuMI4EMhtQ4hY0EykvhjeaustbCZLYXOBjdP KGfA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; 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=YWSY2cvkvidrGJauSm19Qmn4FgCLAu02zP7qkPvv6YY=; b=aO0o3LTH8MoxUdI8XHeDqjPM/NsPe/Ylew0GTLM8RABN2s3Zkhw1ozkoy0EJc3G2Py LiRGrOFhFHmM0g5HtR1X4HXFNxYbqEt/YAP5FXljZZro7dmsLh8xDZ+lOzUxau2vjjMI 2mrx46EE8+gPlfQZuyhO4K/WDVg3P9ILYvQIx7jGMI7Y+DRXGV7XZJIqdK1JqzAwdcUV 6M7rPWIa5OXStSoChvm5miSwfHYTVbx6ADw+gl6UafJgqxsX4GIzBCtsHoS+9QlFyRNh wX0XjH2UWgKog+IUv54jscuVeciPq3h/ca+sPYpz45zHuEJgEa6V7z3JKd4TMG3HfnFC v18w== X-Gm-Message-State: AOAM532FY2TqgBJ6LffieY+CgXj7eKvnoBS8RFGdGp/tlYPqTgc4TWTs y56L1pZVIMAP8fndxIfIw/8uP5DfR3I= X-Received: by 2002:adf:a193:: with SMTP id u19mr17638169wru.9.1622636158691; Wed, 02 Jun 2021 05:15:58 -0700 (PDT) Received: from ziggy.stardust ([37.223.145.68]) by smtp.gmail.com with ESMTPSA id s7sm7187825wrf.91.2021.06.02.05.15.57 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Wed, 02 Jun 2021 05:15:58 -0700 (PDT) Subject: Re: [PATCH v2 1/3] soc: mtk-pm-domains: Fix the clock prepared issue To: Hsin-Yi Wang Cc: linux-arm-kernel@lists.infradead.org, linux-mediatek@lists.infradead.org, linux-kernel@vger.kernel.org, Rob Herring , Enric Balletbo i Serra , chun-jie.chen@mediatek.corp-partner.google.com, Yong Wu References: <20210601035905.2970384-1-hsinyi@chromium.org> From: Matthias Brugger Message-ID: Date: Wed, 2 Jun 2021 14:15:57 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Thunderbird/78.10.2 MIME-Version: 1.0 In-Reply-To: <20210601035905.2970384-1-hsinyi@chromium.org> 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 01/06/2021 05:59, Hsin-Yi Wang wrote: > From: Weiyi Lu > > In this new power domain driver, when adding one power domain > it will prepare the dependent clocks at the same. > So we only do clk_bulk_enable/disable control during power ON/OFF. > When system suspend, the pm runtime framework will forcely power off > power domains. However, the dependent clocks are disabled but kept > prepared. > > In MediaTek clock drivers, PLL would be turned ON when we do > clk_bulk_prepare control. > > Clock hierarchy: > PLL --> > DIV_CK --> > CLK_MUX > (may be dependent clocks) > --> > SUBSYS_CG > (may be dependent clocks) > > It will lead some unexpected clock states during system suspend. > This patch will fix by doing prepare_enable/disable_unprepare on > dependent clocks at the same time while we are going to power on/off > any power domain. > > Fixes: 59b644b01cf4 ("soc: mediatek: Add MediaTek SCPSYS power domains") > Signed-off-by: Weiyi Lu > Signed-off-by: Hsin-Yi Wang > Reviewed-by: chun-jie.chen > Reviewed-by: Enric Balletbo i Serra Both patches applied to v5.13-next/soc Thanks! > --- > drivers/soc/mediatek/mtk-pm-domains.c | 31 +++++++-------------------- > 1 file changed, 8 insertions(+), 23 deletions(-) > > diff --git a/drivers/soc/mediatek/mtk-pm-domains.c b/drivers/soc/mediatek/mtk-pm-domains.c > index 0af00efa0ef8..536d8c64b2b4 100644 > --- a/drivers/soc/mediatek/mtk-pm-domains.c > +++ b/drivers/soc/mediatek/mtk-pm-domains.c > @@ -211,7 +211,7 @@ static int scpsys_power_on(struct generic_pm_domain *genpd) > if (ret) > return ret; > > - ret = clk_bulk_enable(pd->num_clks, pd->clks); > + ret = clk_bulk_prepare_enable(pd->num_clks, pd->clks); > if (ret) > goto err_reg; > > @@ -229,7 +229,7 @@ static int scpsys_power_on(struct generic_pm_domain *genpd) > regmap_clear_bits(scpsys->base, pd->data->ctl_offs, PWR_ISO_BIT); > regmap_set_bits(scpsys->base, pd->data->ctl_offs, PWR_RST_B_BIT); > > - ret = clk_bulk_enable(pd->num_subsys_clks, pd->subsys_clks); > + ret = clk_bulk_prepare_enable(pd->num_subsys_clks, pd->subsys_clks); > if (ret) > goto err_pwr_ack; > > @@ -246,9 +246,9 @@ static int scpsys_power_on(struct generic_pm_domain *genpd) > err_disable_sram: > scpsys_sram_disable(pd); > err_disable_subsys_clks: > - clk_bulk_disable(pd->num_subsys_clks, pd->subsys_clks); > + clk_bulk_disable_unprepare(pd->num_subsys_clks, pd->subsys_clks); > err_pwr_ack: > - clk_bulk_disable(pd->num_clks, pd->clks); > + clk_bulk_disable_unprepare(pd->num_clks, pd->clks); > err_reg: > scpsys_regulator_disable(pd->supply); > return ret; > @@ -269,7 +269,7 @@ static int scpsys_power_off(struct generic_pm_domain *genpd) > if (ret < 0) > return ret; > > - clk_bulk_disable(pd->num_subsys_clks, pd->subsys_clks); > + clk_bulk_disable_unprepare(pd->num_subsys_clks, pd->subsys_clks); > > /* subsys power off */ > regmap_clear_bits(scpsys->base, pd->data->ctl_offs, PWR_RST_B_BIT); > @@ -284,7 +284,7 @@ static int scpsys_power_off(struct generic_pm_domain *genpd) > if (ret < 0) > return ret; > > - clk_bulk_disable(pd->num_clks, pd->clks); > + clk_bulk_disable_unprepare(pd->num_clks, pd->clks); > > scpsys_regulator_disable(pd->supply); > > @@ -405,14 +405,6 @@ generic_pm_domain *scpsys_add_one_domain(struct scpsys *scpsys, struct device_no > pd->subsys_clks[i].clk = clk; > } > > - ret = clk_bulk_prepare(pd->num_clks, pd->clks); > - if (ret) > - goto err_put_subsys_clocks; > - > - ret = clk_bulk_prepare(pd->num_subsys_clks, pd->subsys_clks); > - if (ret) > - goto err_unprepare_clocks; > - > /* > * Initially turn on all domains to make the domains usable > * with !CONFIG_PM and to get the hardware in sync with the > @@ -427,7 +419,7 @@ generic_pm_domain *scpsys_add_one_domain(struct scpsys *scpsys, struct device_no > ret = scpsys_power_on(&pd->genpd); > if (ret < 0) { > dev_err(scpsys->dev, "%pOF: failed to power on domain: %d\n", node, ret); > - goto err_unprepare_clocks; > + goto err_put_subsys_clocks; > } > } > > @@ -435,7 +427,7 @@ generic_pm_domain *scpsys_add_one_domain(struct scpsys *scpsys, struct device_no > ret = -EINVAL; > dev_err(scpsys->dev, > "power domain with id %d already exists, check your device-tree\n", id); > - goto err_unprepare_subsys_clocks; > + goto err_put_subsys_clocks; > } > > if (!pd->data->name) > @@ -455,10 +447,6 @@ generic_pm_domain *scpsys_add_one_domain(struct scpsys *scpsys, struct device_no > > return scpsys->pd_data.domains[id]; > > -err_unprepare_subsys_clocks: > - clk_bulk_unprepare(pd->num_subsys_clks, pd->subsys_clks); > -err_unprepare_clocks: > - clk_bulk_unprepare(pd->num_clks, pd->clks); > err_put_subsys_clocks: > clk_bulk_put(pd->num_subsys_clks, pd->subsys_clks); > err_put_clocks: > @@ -537,10 +525,7 @@ static void scpsys_remove_one_domain(struct scpsys_domain *pd) > "failed to remove domain '%s' : %d - state may be inconsistent\n", > pd->genpd.name, ret); > > - clk_bulk_unprepare(pd->num_clks, pd->clks); > clk_bulk_put(pd->num_clks, pd->clks); > - > - clk_bulk_unprepare(pd->num_subsys_clks, pd->subsys_clks); > clk_bulk_put(pd->num_subsys_clks, pd->subsys_clks); > } > >