Received: by 2002:a05:6a10:a0d1:0:0:0:0 with SMTP id j17csp2822025pxa; Tue, 25 Aug 2020 04:26:34 -0700 (PDT) X-Google-Smtp-Source: ABdhPJydvtHz+D1IJvtYf0JDl9aiDaxArNCT56YCXC01MwiJkr/46uqRhgiHg1FTQH3fHxkoPeZQ X-Received: by 2002:a50:d80b:: with SMTP id o11mr9559377edj.148.1598354794393; Tue, 25 Aug 2020 04:26:34 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1598354794; cv=none; d=google.com; s=arc-20160816; b=suP3+XhNu8UDa7+T5cn02+T9BZ8JXpxxkZKYnIo3P8bQrhK6I2uN3BpdsSaJAJ4aIQ rDTtV5eez2TaRKVdNP26j0sBNieKeIM6D2oiN8v6OuSpGf7hFCZZSkYKv4Reg/LNvkNx 5AF9R0AYeFG3zB17x0P8qVGTkjmXFz0disnl9wpUVOSjwZ81uVfTWRpfiPlDmGw9epJm nhmNi9G4bnIfv13GBdyTAcY8+vw8Kz2/oNikOWTS5SMnPohAS1JuWipSkGdQMgAbTcQy o/GdvNE2aRdioY3OSe8Jbu706I3q7CBpGJWxvaX1u6+Ax1AGrxhXFxWs9nD1gsnMSA5a qfxA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:user-agent:in-reply-to :content-disposition:mime-version:references:message-id:subject:cc :to:from:date; bh=zOHBUmj90WdTqsilP7GwZ2Ju2xpriXhhbxpL4pP8Msk=; b=zVx2oU/YEblKkWSgh+ucRDgxHSAkr9t1tlrfI6UF+RDUKxPTI2cuXbaBeXluMHHAqM nVi98uBGp+sh5DEgI2QUHffoUBK0tBOLFq5fc1Gugl3bs18tebnJaMrSUeAuhBPXMprf AxjihMVTt1nZt8gj1cG07GX2S2GxRiTpT8x7jAwpRhcxPLccp6h3oqFcpx7GktpFVY3p jQSaAWkuqFJE/QIljLRqhu6YMhd4xiSFWv2K8zu2huDPrtxk0N+CD27OAMcUqWn8BPAo kliX3ybieT1CRodJQZ74SzyXqtUeYH/rLJYmpRCOcAaYNdPw38rX5cd7qFcsvXeRNbN2 0zBg== ARC-Authentication-Results: i=1; mx.google.com; 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=fail (p=NONE sp=NONE dis=NONE) header.from=nxp.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id y21si8370714ejf.554.2020.08.25.04.26.09; Tue, 25 Aug 2020 04:26:34 -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; 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=fail (p=NONE sp=NONE dis=NONE) header.from=nxp.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729968AbgHYLY3 (ORCPT + 99 others); Tue, 25 Aug 2020 07:24:29 -0400 Received: from inva020.nxp.com ([92.121.34.13]:49232 "EHLO inva020.nxp.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729873AbgHYLYY (ORCPT ); Tue, 25 Aug 2020 07:24:24 -0400 Received: from inva020.nxp.com (localhost [127.0.0.1]) by inva020.eu-rdc02.nxp.com (Postfix) with ESMTP id E3EB21A12CE; Tue, 25 Aug 2020 13:24:21 +0200 (CEST) Received: from inva024.eu-rdc02.nxp.com (inva024.eu-rdc02.nxp.com [134.27.226.22]) by inva020.eu-rdc02.nxp.com (Postfix) with ESMTP id D5D4E1A059F; Tue, 25 Aug 2020 13:24:21 +0200 (CEST) Received: from localhost (fsr-ub1664-175.ea.freescale.net [10.171.82.40]) by inva024.eu-rdc02.nxp.com (Postfix) with ESMTP id BEA35203CB; Tue, 25 Aug 2020 13:24:21 +0200 (CEST) Date: Tue, 25 Aug 2020 14:24:21 +0300 From: Abel Vesa To: Philipp Zabel Cc: Mike Turquette , Stephen Boyd , Rob Herring , Shawn Guo , Sascha Hauer , Fabio Estevam , Anson Huang , Jacky Bai , Peng Fan , Dong Aisheng , Fugang Duan , devicetree@vger.kernel.org, NXP Linux Team , linux-arm-kernel@lists.infradead.org, Linux Kernel Mailing List , linux-clk@vger.kernel.org Subject: Re: [PATCH v2 11/17] clk: imx: Add blk_ctrl combo driver Message-ID: <20200825112421.eut7gx3i4eirhnfw@fsr-ub1664-175> References: <1597406966-13740-1-git-send-email-abel.vesa@nxp.com> <1597406966-13740-12-git-send-email-abel.vesa@nxp.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: NeoMutt/20180622 X-Virus-Scanned: ClamAV using ClamSMTP Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 20-08-25 12:48:41, Philipp Zabel wrote: > On Fri, 2020-08-14 at 15:09 +0300, Abel Vesa wrote: > > On i.MX8MP, there is a new type of IP which is called BLK_CTRL in > > RM and usually is comprised of some GPRs that are considered too > > generic to be part of any dedicated IP from that specific subsystem. > > > > In general, some of the GPRs have some clock bits, some have reset bits, > > so in order to be able to use the imx clock API, this needs to be > > in a clock driver. From there it can use the reset controller API and > > leave the rest to the syscon. > > > > This driver is intended to work with the following BLK_CTRL IPs found in > > i.MX8MP (but it might be reused by the future i.MX platforms that > > have this kind of IP in their design): > > - Audio > > - Media > > - HDMI > > > > Signed-off-by: Abel Vesa > > --- > > drivers/clk/imx/Makefile | 2 +- > > drivers/clk/imx/clk-blk-ctrl.c | 327 +++++++++++++++++++++++++++++++++++++++++ > > drivers/clk/imx/clk-blk-ctrl.h | 81 ++++++++++ > > 3 files changed, 409 insertions(+), 1 deletion(-) > > create mode 100644 drivers/clk/imx/clk-blk-ctrl.c > > create mode 100644 drivers/clk/imx/clk-blk-ctrl.h > > > > diff --git a/drivers/clk/imx/Makefile b/drivers/clk/imx/Makefile > > index 928f874c..7afe1df 100644 > > --- a/drivers/clk/imx/Makefile > > +++ b/drivers/clk/imx/Makefile > > @@ -27,7 +27,7 @@ obj-$(CONFIG_MXC_CLK_SCU) += \ > > > > obj-$(CONFIG_CLK_IMX8MM) += clk-imx8mm.o > > obj-$(CONFIG_CLK_IMX8MN) += clk-imx8mn.o > > -obj-$(CONFIG_CLK_IMX8MP) += clk-imx8mp.o > > +obj-$(CONFIG_CLK_IMX8MP) += clk-imx8mp.o clk-blk-ctrl.o > > obj-$(CONFIG_CLK_IMX8MQ) += clk-imx8mq.o > > obj-$(CONFIG_CLK_IMX8QXP) += clk-imx8qxp.o clk-imx8qxp-lpcg.o > > > > diff --git a/drivers/clk/imx/clk-blk-ctrl.c b/drivers/clk/imx/clk-blk-ctrl.c > > new file mode 100644 > > index 00000000..1672646 > > --- /dev/null > > +++ b/drivers/clk/imx/clk-blk-ctrl.c > > @@ -0,0 +1,327 @@ > > +// SPDX-License-Identifier: GPL-2.0-only > > +/* > > + * Copyright 2020 NXP. > > + */ > > + > > +#include > > +#include > > +#include > > +#include > > +#include > > +#include > > +#include > > +#include > > +#include > > +#include > > +#include > > +#include > > +#include > > + > > +#include "clk.h" > > +#include "clk-blk-ctrl.h" > > + > > +struct reset_hw { > > + u32 offset; > > + u32 shift; > > + u32 mask; > > + bool asserted; > > +}; > > + > > +struct pm_safekeep_info { > > + uint32_t *regs_values; > > + uint32_t *regs_offsets; > > + uint32_t regs_num; > > +}; > > + > > +struct imx_blk_ctrl_drvdata { > > + void __iomem *base; > > + struct reset_controller_dev rcdev; > > + struct reset_hw *rst_hws; > > + struct pm_safekeep_info pm_info; > > + > > + spinlock_t lock; > > +}; > > + > > +static int imx_blk_ctrl_reset_set(struct reset_controller_dev *rcdev, > > + unsigned long id, bool assert) > > +{ > > + struct imx_blk_ctrl_drvdata *drvdata = container_of(rcdev, > > + struct imx_blk_ctrl_drvdata, rcdev); > > + unsigned int offset = drvdata->rst_hws[id].offset; > > + unsigned int shift = drvdata->rst_hws[id].shift; > > + unsigned int mask = drvdata->rst_hws[id].mask; > > + void __iomem *reg_addr = drvdata->base + offset; > > + unsigned long flags; > > + unsigned int asserted_before = 0, asserted_after = 0; > > + u32 reg; > > + int i; > > + > > + spin_lock_irqsave(&drvdata->lock, flags); > > + > > + for (i = 0; i < drvdata->rcdev.nr_resets; i++) > > + if (drvdata->rst_hws[i].asserted) > > + asserted_before++; > > + > > + if (asserted_before == 0 && assert) > > + pm_runtime_get(rcdev->dev); > > Shouldn't that be pm_runtime_get_sync() ? > > I would do that unconditionally before locking drvdata->lock and then > drop unnecessary refcounts afterwards. > I thought we already discussed this on the last's version thread. The assert and deassert do not necessary get called in pairs, leading to the device power domain staying always on because some use called assert multiple times without doig the same number of deasserts. > > + > > + if (assert) { > > + reg = readl(reg_addr); > > + writel(reg & ~(mask << shift), reg_addr); > > + drvdata->rst_hws[id].asserted = true; > > + } else { > > + reg = readl(reg_addr); > > + writel(reg | (mask << shift), reg_addr); > > + drvdata->rst_hws[id].asserted = false; > > + } > > + > > + for (i = 0; i < drvdata->rcdev.nr_resets; i++) > > + if (drvdata->rst_hws[i].asserted) > > + asserted_after++; > > + > > + if (asserted_before == 1 && asserted_after == 0) > > + pm_runtime_put(rcdev->dev); > > + > > + spin_unlock_irqrestore(&drvdata->lock, flags); > > + > > + return 0; > > +} > > regards > Philipp