Received: by 2002:a05:6a10:a0d1:0:0:0:0 with SMTP id j17csp2803034pxa; Tue, 25 Aug 2020 03:52:54 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwxslVRCKfFjNXSZVAKbbYUANp22G4JSnfRhuufYR8upkPckeV0xVDW1GhfBgb3Gd7dz2YN X-Received: by 2002:aa7:cada:: with SMTP id l26mr5051276edt.112.1598352774594; Tue, 25 Aug 2020 03:52:54 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1598352774; cv=none; d=google.com; s=arc-20160816; b=waWizL6Cl/rDzGQb8ieZjAQb/BR4Z9L991eHgrM1+bUecO3+7BWg9bMDAZPHCbk4y2 ZUrM/9qyL5v5f6bzuLWBy98+wgU6EHgvFjAh9fgyt2K4+td9hYfA+/K8+ZO7uFlxzt/F AcYk8bwdoRY1qRqfgaUh3NqDRmhQ+6d8Y+uSFWzOypy7vZbMqRe2W11UO0JxPERjZAD/ aiL3PB3Y2tgRWYS1X9Q4gsN7z8TwclIBp98/O3Pis2rARGMzOZbdLMVFgBpXkfXHI2i5 +EnnBaZ2GJGoNBsdXSwkmWpVskWdsqsmVyPfZQUMUWj7941PT0fa7Hbyh2hS7n2YuHLt 0HIg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:mime-version:user-agent :content-transfer-encoding:references:in-reply-to:date:cc:to:from :subject:message-id; bh=PTKy0SG6xVB+fLJqiPGit6eCI2NO8YrTUWZHaXhNk24=; b=GbaIZZUSBZQLNdRoqSjBnBdbyicO/mjYM5qcuwtlLdRxLfhG3g0XD4+P6loxlP15aH Mn6vYy7BRrIG25lcM1ElknbpVN8IoWSPI3KQ8+EFXwyaVr6MKMI6fV2/O0tXGostgsWG 4Tg/wSKw1M/2dnJOh9T8fy9WFgvQLdt9RZ7zTsiFR9rQuOx6HnfI05bKnXRbLTppqEBs TBbF+GoIT16YKYurMs5P4N8jC0ZwClOe1RVf53ProFjWWlGzQVxlgv5nWq3JBRQh6fS8 uB9anFCO+B0P5f5vD9Y9JRw8ceF1qf1iXwDqivnY4l3kcQRztSx97DG+9ztiuucbE9iF S64A== 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 Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id f16si4456285ejd.376.2020.08.25.03.52.31; Tue, 25 Aug 2020 03:52:54 -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 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729876AbgHYKtI convert rfc822-to-8bit (ORCPT + 99 others); Tue, 25 Aug 2020 06:49:08 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:54752 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729827AbgHYKtI (ORCPT ); Tue, 25 Aug 2020 06:49:08 -0400 Received: from metis.ext.pengutronix.de (metis.ext.pengutronix.de [IPv6:2001:67c:670:201:290:27ff:fe1d:cc33]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id BCF7CC061755 for ; Tue, 25 Aug 2020 03:49:07 -0700 (PDT) Received: from lupine.hi.pengutronix.de ([2001:67c:670:100:3ad5:47ff:feaf:1a17] helo=lupine) by metis.ext.pengutronix.de with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1kAWVO-0000U2-F8; Tue, 25 Aug 2020 12:48:42 +0200 Received: from pza by lupine with local (Exim 4.92) (envelope-from ) id 1kAWVN-0006J5-K9; Tue, 25 Aug 2020 12:48:41 +0200 Message-ID: Subject: Re: [PATCH v2 11/17] clk: imx: Add blk_ctrl combo driver From: Philipp Zabel To: Abel Vesa , 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 Cc: NXP Linux Team , linux-arm-kernel@lists.infradead.org, Linux Kernel Mailing List , linux-clk@vger.kernel.org Date: Tue, 25 Aug 2020 12:48:41 +0200 In-Reply-To: <1597406966-13740-12-git-send-email-abel.vesa@nxp.com> References: <1597406966-13740-1-git-send-email-abel.vesa@nxp.com> <1597406966-13740-12-git-send-email-abel.vesa@nxp.com> Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: 8BIT User-Agent: Evolution 3.30.5-1.1 MIME-Version: 1.0 X-SA-Exim-Connect-IP: 2001:67c:670:100:3ad5:47ff:feaf:1a17 X-SA-Exim-Mail-From: p.zabel@pengutronix.de X-SA-Exim-Scanned: No (on metis.ext.pengutronix.de); SAEximRunCond expanded to false X-PTX-Original-Recipient: linux-kernel@vger.kernel.org Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 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. > + > + 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