From: Boris Brezillon <boris.brezillon@free-electrons.com>
To: Stefan Agner <stefan@agner.ch>
Cc: Lukasz Majewski <lukma@denx.de>,
Thierry Reding <thierry.reding@gmail.com>,
Sascha Hauer <s.hauer@pengutronix.de>,
linux-pwm@vger.kernel.org,
Bhuvanchandra DV <bhuvanchandra.dv@toradex.com>,
linux-kernel@vger.kernel.org,
Lothar Wassmann <LW@karo-electronics.de>,
kernel@pengutronix.de, Fabio Estevam <fabio.estevam@nxp.com>,
Lukasz Majewski <l.majewski@majess.pl>
Subject: Re: [PATCH v4 07/11] pwm: imx: Provide atomic PWM support for i.MX PWMv2
Date: Tue, 10 Jan 2017 08:59:09 +0100 [thread overview]
Message-ID: <20170110085909.69b80820@bbrezillon> (raw)
In-Reply-To: <66893ecf40113ccd55569ca99be093f0@agner.ch>
On Mon, 09 Jan 2017 19:14:43 -0800
Stefan Agner <stefan@agner.ch> wrote:
> >>
> >> >
> >> > But, while reviewing your patch I realized this was actually unneeded
> >> > (see the explanation in my previous review).
> >> >
> >> > >
> >> > > Now it depends on cstate.enabled flag.
> >> > >
> >> > > So we end up with
> >> > >
> >> > > if (state.enabled && !cstate.enabled)
> >> > > clk_preapre_enable();
> >> >
> >> > Yep, and that's correct.
> >>
> >> And following patch:
> >> http://patchwork.ozlabs.org/patch/709510/
> >>
> >> address this issue.
> >
> > Yes, that was needed because the enable/disable path were not
> > separated, and we were unconditionally writing to the IP registers
> > even when the PWM was already disabled (which is probably the case
> > generating the fault reported by Stefan). This is not the case anymore,
> > but let's wait for Stefan to confirm this.
>
> With v4 as is, the kernel crashes/hangs on i.MX 7.
>
> The function imx_pwm_apply_v2 gets first called with state->enabled 0,
> cstate->enabled 0. This branches to else and leads to a register access
> with clocks disabled (and if that would succeed, also an unbalanced
> disable?...)
>
> With the proposed change plus the additional change in the else branch
> it works for me:
>
> @@ -192,19 +193,20 @@ static int imx_pwm_apply_v2(struct pwm_chip *chip,
> struct pwm_device *pwm,
> else
> period_cycles = 0;
>
> - ret = clk_prepare_enable(imx->clk_per);
> - if (ret)
> - return ret;
> -
> /*
> * Wait for a free FIFO slot if the PWM is already
> enabled, and
> * flush the FIFO if the PWM was disabled and is about
> to be
> * enabled.
> */
> - if (cstate.enabled)
> + if (cstate.enabled) {
> imx_pwm_wait_fifo_slot(chip, pwm);
> - else if (state->enabled)
> + } else if (state->enabled) {
> + ret = clk_prepare_enable(imx->clk_per);
> + if (ret)
> + return ret;
> +
> imx_pwm_sw_reset(chip);
> + }
>
> writel(duty_cycles, imx->mmio_base + MX3_PWMSAR);
> writel(period_cycles, imx->mmio_base + MX3_PWMPR);
> @@ -218,7 +220,7 @@ static int imx_pwm_apply_v2(struct pwm_chip *chip,
> struct pwm_device *pwm,
> cr |= MX3_PWMCR_POUTC;
>
> writel(cr, imx->mmio_base + MX3_PWMCR);
> - } else {
> + } else if (cstate.enabled) {
> writel(0, imx->mmio_base + MX3_PWMCR);
>
> clk_disable_unprepare(imx->clk_per);
>
>
> This would not disable a disabled PWM anymore, I guess at normal use not
> a problem. Only at bootup it could end up left on, but I guess if we
> care about boot time transition we should implement get_state, but
> something which we can do in a follow up patch.
Yep, that's a different problem which could be addressed by
implementing ->get_state(). Note that you don't necessary want to
disable the PWM at boot time, in some situation, when the PWM is
driving a critical device (like the VDDIODDR regulator), you want the
transition between the bootloader/firmware and Linux to be as smooth as
possible. Actually, 'initial state retrieval' and 'atomic changes'
were added to handle this case.
Stefan, one last thing, can you apply patch 2 alone and check if it
doesn't introduce a regression?
Thanks,
Boris
next prev parent reply other threads:[~2017-01-10 7:59 UTC|newest]
Thread overview: 28+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-01-04 23:36 [PATCH v4 00/11] pwm: imx: Provide atomic operation for IMX PWM driver Lukasz Majewski
2017-01-04 23:36 ` [PATCH v4 01/11] pwm: print error messages with pr_err() instead of pr_debug() Lukasz Majewski
2017-01-04 23:36 ` [PATCH v4 02/11] pwm: imx: remove ipg clock and enable per clock when required Lukasz Majewski
2017-01-05 7:14 ` Boris Brezillon
2017-01-05 7:26 ` Lukasz Majewski
2017-01-05 8:27 ` Boris Brezillon
2017-01-05 8:32 ` Lukasz Majewski
2017-01-10 17:28 ` Stefan Agner
2017-01-04 23:36 ` [PATCH v4 03/11] pwm: imx: Add separate set of pwm ops for PWMv1 and PWMv2 Lukasz Majewski
2017-01-04 23:36 ` [PATCH v4 04/11] pwm: imx: Rewrite imx_pwm_*_v1 code to facilitate switch to atomic pwm operation Lukasz Majewski
2017-01-04 23:36 ` [PATCH v4 05/11] pwm: imx: Move PWMv2 software reset code to a separate function Lukasz Majewski
2017-01-04 23:36 ` [PATCH v4 06/11] pwm: imx: Move PWMv2 wait for fifo slot " Lukasz Majewski
2017-01-04 23:36 ` [PATCH v4 07/11] pwm: imx: Provide atomic PWM support for i.MX PWMv2 Lukasz Majewski
2017-01-05 8:50 ` Boris Brezillon
2017-01-05 9:03 ` Lukasz Majewski
2017-01-05 9:19 ` Boris Brezillon
2017-01-05 9:35 ` Lukasz Majewski
2017-01-05 9:53 ` Boris Brezillon
2017-01-10 3:14 ` Stefan Agner
2017-01-10 3:14 ` Stefan Agner
2017-01-10 7:59 ` Boris Brezillon [this message]
2017-01-05 21:15 ` Andy Shevchenko
2017-01-06 7:06 ` Boris Brezillon
2017-01-07 18:35 ` Lukasz Majewski
2017-01-04 23:36 ` [PATCH v4 08/11] pwm: imx: Remove redundant i.MX PWMv2 code Lukasz Majewski
2017-01-04 23:36 ` [PATCH v4 09/11] pwm: core: make the PWM_POLARITY flag in DTB optional Lukasz Majewski
2017-01-04 23:36 ` [PATCH v4 10/11] pwm: imx: doc: Update imx-pwm.txt documentation entry Lukasz Majewski
2017-01-04 23:36 ` [PATCH v4 11/11] pwm: imx: Add polarity inversion support to i.MX's PWMv2 Lukasz Majewski
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=20170110085909.69b80820@bbrezillon \
--to=boris.brezillon@free-electrons.com \
--cc=LW@karo-electronics.de \
--cc=bhuvanchandra.dv@toradex.com \
--cc=fabio.estevam@nxp.com \
--cc=kernel@pengutronix.de \
--cc=l.majewski@majess.pl \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pwm@vger.kernel.org \
--cc=lukma@denx.de \
--cc=s.hauer@pengutronix.de \
--cc=stefan@agner.ch \
--cc=thierry.reding@gmail.com \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.