devicetree.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Philipp Zabel <p.zabel@pengutronix.de>
To: Abel Vesa <abel.vesa@nxp.com>
Cc: Dong Aisheng <aisheng.dong@nxp.com>,
	Rob Herring <robh@kernel.org>, Peng Fan <peng.fan@nxp.com>,
	Fugang Duan <fugang.duan@nxp.com>, Jacky Bai <ping.bai@nxp.com>,
	Anson Huang <anson.huang@nxp.com>,
	devicetree@vger.kernel.org, Stephen Boyd <sboyd@kernel.org>,
	Mike Turquette <mturquette@baylibre.com>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	NXP Linux Team <linux-imx@nxp.com>,
	Sascha Hauer <kernel@pengutronix.de>,
	Fabio Estevam <fabio.estevam@nxp.com>,
	Shawn Guo <shawnguo@kernel.org>,
	linux-clk@vger.kernel.org, linux-arm-kernel@lists.infradead.org
Subject: Re: [PATCH v2 11/17] clk: imx: Add blk_ctrl combo driver
Date: Tue, 25 Aug 2020 14:07:29 +0200	[thread overview]
Message-ID: <8e8e33386eea12036bb17529b4d578704bf735d1.camel@pengutronix.de> (raw)
In-Reply-To: <20200825112421.eut7gx3i4eirhnfw@fsr-ub1664-175>

On Tue, 2020-08-25 at 14:24 +0300, Abel Vesa wrote:
[...]
> > > +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.

This is about something different. pm_runtime_get() just queues the
device to be enabled at a later point, but I presume you want to have it
enabled before writing to its registers. (The question here is can you
write to the registers, and have the device update its internal state,
while the power domain is disabled?)
Either way, if you want the reset to be asserted after the function
returns (as is required by the reset API), as I understand it, you have
to make sure that the power domain is activated before the function
returns.
Therefore pm_runtime_get_sync() is required instead of pm_runtime_get(),
and that must be called outside of the spin locked section. My
suggestion would be:

	if (assert)
		pm_runtime_get_sync();
	spin_lock_irqsave();
	/* ... */
	spin_unlock_irqrestore();
	if (assert && asserted_before)
		pm_runtime_put();

unless the following might be an issue:

> > > +
> > > +	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);

Could this cause problems if the power domain is already disabled? If
so, it would be best to either temporarily enable power, or to skip the
register writes if asserted_before == 0 && !assert.

> > > +		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

  reply	other threads:[~2020-08-25 12:07 UTC|newest]

Thread overview: 48+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-08-14 12:09 [PATCH v2 00/17] Add BLK_CTRL support for i.MX8MP Abel Vesa
2020-08-14 12:09 ` [PATCH v2 01/17] dt-bindings: clocks: imx8mp: Rename audiomix ids clocks to audio_blk_ctrl Abel Vesa
2020-08-17  7:44   ` Dong Aisheng
2020-08-25  2:12   ` Rob Herring
2020-08-14 12:09 ` [PATCH v2 02/17] dt-bindings: reset: imx8mp: Add audio blk_ctrl reset IDs Abel Vesa
2020-08-17  7:45   ` Dong Aisheng
2020-08-25  2:13   ` Rob Herring
2020-08-14 12:09 ` [PATCH v2 03/17] dt-bindings: clock: imx8mp: Add ids for the audio shared gate Abel Vesa
2020-08-17  7:45   ` Dong Aisheng
2020-08-14 12:09 ` [PATCH v2 04/17] dt-bindings: clock: imx8mp: Add media blk_ctrl clock IDs Abel Vesa
2020-08-17  7:46   ` Dong Aisheng
2020-08-14 12:09 ` [PATCH v2 05/17] dt-bindings: reset: imx8mp: Add media blk_ctrl reset IDs Abel Vesa
2020-08-17  7:47   ` Dong Aisheng
2020-08-14 12:09 ` [PATCH v2 06/17] dt-bindings: clock: imx8mp: Add hdmi blk_ctrl clock IDs Abel Vesa
2020-08-14 12:09 ` [PATCH v2 07/17] dt-bindings: reset: imx8mp: Add hdmi blk_ctrl reset IDs Abel Vesa
2020-08-17  7:47   ` Dong Aisheng
2020-08-14 12:09 ` [PATCH v2 08/17] clk: imx8mp: Add audio shared gate Abel Vesa
2020-08-17  7:48   ` Dong Aisheng
2020-08-14 12:09 ` [PATCH v2 09/17] arm64: dts: Remove imx-hdmimix-reset header file Abel Vesa
2020-08-17  7:51   ` Dong Aisheng
2020-08-19 20:09     ` Abel Vesa
2020-08-14 12:09 ` [PATCH v2 10/17] Documentation: bindings: clk: Add bindings for i.MX BLK_CTRL Abel Vesa
2020-08-17  8:07   ` Dong Aisheng
2020-08-25  2:14   ` Rob Herring
2020-08-14 12:09 ` [PATCH v2 11/17] clk: imx: Add blk_ctrl combo driver Abel Vesa
2020-08-18 11:27   ` Dong Aisheng
2020-08-19 20:31     ` Abel Vesa
2020-08-20  1:40       ` Dong Aisheng
2020-08-25 10:48   ` Philipp Zabel
2020-08-25 11:24     ` Abel Vesa
2020-08-25 12:07       ` Philipp Zabel [this message]
2020-08-25 14:11         ` Abel Vesa
2020-08-25 18:30         ` Abel Vesa
2020-08-26  7:46           ` Philipp Zabel
2020-08-14 12:09 ` [PATCH v2 12/17] clk: imx8mp: Add audio blk_ctrl clocks and resets Abel Vesa
2020-08-18 11:29   ` Dong Aisheng
2020-08-19 20:33     ` Abel Vesa
2020-08-14 12:09 ` [PATCH v2 13/17] clk: imx8mp: Add hdmi " Abel Vesa
2020-08-14 12:09 ` [PATCH v2 14/17] clk: imx8mp: Add media " Abel Vesa
2020-08-14 12:09 ` [PATCH v2 15/17] arm64: dts: imx8mp: Add audio_blk_ctrl node Abel Vesa
2020-08-18 11:32   ` Dong Aisheng
2020-08-19 20:33     ` Abel Vesa
2020-08-14 12:09 ` [PATCH v2 16/17] arm64: dts: imx8mp: Add media_blk_ctrl node Abel Vesa
2020-08-18 11:34   ` Dong Aisheng
2020-08-19 20:37     ` Abel Vesa
2020-08-20  1:31       ` Dong Aisheng
2020-09-07  9:11         ` Abel Vesa
2020-08-14 12:09 ` [PATCH v2 17/17] arm64: dts: imx8mp: Add hdmi_blk_ctrl node Abel Vesa

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=8e8e33386eea12036bb17529b4d578704bf735d1.camel@pengutronix.de \
    --to=p.zabel@pengutronix.de \
    --cc=abel.vesa@nxp.com \
    --cc=aisheng.dong@nxp.com \
    --cc=anson.huang@nxp.com \
    --cc=devicetree@vger.kernel.org \
    --cc=fabio.estevam@nxp.com \
    --cc=fugang.duan@nxp.com \
    --cc=kernel@pengutronix.de \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-clk@vger.kernel.org \
    --cc=linux-imx@nxp.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mturquette@baylibre.com \
    --cc=peng.fan@nxp.com \
    --cc=ping.bai@nxp.com \
    --cc=robh@kernel.org \
    --cc=sboyd@kernel.org \
    --cc=shawnguo@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).