From: Thierry Reding <thierry.reding@gmail.com>
To: Benjamin Gaignard <benjamin.gaignard@linaro.org>
Cc: Lee Jones <lee.jones@linaro.org>,
robh+dt@kernel.org, Mark Rutland <mark.rutland@arm.com>,
Alexandre Torgue <alexandre.torgue@st.com>,
devicetree@vger.kernel.org,
Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
Linux PWM List <linux-pwm@vger.kernel.org>,
Jonathan Cameron <jic23@kernel.org>,
Hartmut Knaack <knaack.h@gmx.de>,
Lars-Peter Clausen <lars@metafoo.de>,
Peter Meerwald-Stadler <pmeerw@pmeerw.net>,
linux-iio@vger.kernel.org, linux-arm-kernel@lists.infradead.org,
Fabrice Gasnier <fabrice.gasnier@st.com>,
Gerald Baeza <gerald.baeza@st.com>,
Arnaud Pouliquen <arnaud.pouliquen@st.com>,
Linus Walleij <linus.walleij@linaro.org>,
Linaro Kernel Mailman List <linaro-kernel@lists.linaro.org>,
Benjamin Gaignard <benjamin.gaignard@st.com>
Subject: Re: [PATCH v7 4/8] PWM: add PWM driver for STM32 plaftorm
Date: Wed, 18 Jan 2017 12:37:59 +0100 [thread overview]
Message-ID: <20170118113759.GA16826@ulmo.ba.sec> (raw)
In-Reply-To: <CA+M3ks64VEE8a0oeiA8J-T5FDzwWTo=pdaMACy+pz7EyOQY-Jg@mail.gmail.com>
[-- Attachment #1: Type: text/plain, Size: 4616 bytes --]
On Wed, Jan 18, 2017 at 12:15:58PM +0100, Benjamin Gaignard wrote:
> 2017-01-18 11:08 GMT+01:00 Thierry Reding <thierry.reding@gmail.com>:
> > On Thu, Jan 05, 2017 at 10:25:40AM +0100, Benjamin Gaignard wrote:
[...]
> >> +static u32 active_channels(struct stm32_pwm *dev)
> >> +{
> >> + u32 ccer;
> >> +
> >> + regmap_read(dev->regmap, TIM_CCER, &ccer);
> >> +
> >> + return ccer & TIM_CCER_CCXE;
> >> +}
> >
> > This looks like something that you could track in software, but this is
> > probably fine, too. Again, technically regmap_read() could fail, so you
> > might want to consider adding some code to handle it. In practice it
> > probably won't, so maybe you don't.
>
> TIM_CCER_CCXE is a value that IIO timer can also read (not write) so
> I have keep the same logic for pwm driver.
Would that not be racy? What happens if after active_channels() here,
the IIO timer modifies the TIM_CCER register?
> >> + ret = stm32_pwm_config(chip, pwm, state->duty_cycle, state->period);
> >> + if (ret)
> >> + return ret;
> >> +
> >> + if (!enabled && state->enabled)
> >> + ret = stm32_pwm_enable(chip, pwm);
> >> +
> >> + return ret;
> >> +}
> >
> > Would it be possible to merge stm32_pwm_disable(), stm32_pwm_enable(),
> > stm32_pwm_set_polarity() and stm32_pwm_config() into stm32_pwm_apply()?
> > Part of the reason for the atomic API was to make it easier to write
> > these drivers, but your implementation effectively copies what the
> > transitional helpers do.
> >
> > It might not make a difference technically in your case, but I think
> > it'd make the implementation more compact and set a better example for
> > future reference.
>
> hmm... it will create a fat function with lot of where
> enabling/disabling/configuration
> will be mixed I'm really not convince that will more compact and readable.
I don't object to splitting this up into separate functions, I just
don't think the functions should correspond to the legacy ones. One
variant that I think could work out nicely would be to have one
function that precomputes the various values, call in from ->apply()
and then do only the register writes along with a couple of
conditionals depending on enable state, for example.
> >> +static const struct pwm_ops stm32pwm_ops = {
> >> + .owner = THIS_MODULE,
> >> + .apply = stm32_pwm_apply,
> >> +};
> >> +
> >> +static int stm32_pwm_set_breakinput(struct stm32_pwm *priv,
> >> + int level, int filter)
> >> +{
> >> + u32 bdtr = TIM_BDTR_BKE;
> >> +
> >> + if (level)
> >> + bdtr |= TIM_BDTR_BKP;
> >> +
> >> + bdtr |= (filter & TIM_BDTR_BKF_MASK) << TIM_BDTR_BKF_SHIFT;
> >> +
> >> + regmap_update_bits(priv->regmap,
> >> + TIM_BDTR, TIM_BDTR_BKE | TIM_BDTR_BKP | TIM_BDTR_BKF,
> >> + bdtr);
> >> +
> >> + regmap_read(priv->regmap, TIM_BDTR, &bdtr);
> >> +
> >> + return (bdtr & TIM_BDTR_BKE) ? 0 : -EINVAL;
> >> +}
> >> +
> >> +static int stm32_pwm_set_breakinput2(struct stm32_pwm *priv,
> >> + int level, int filter)
> >> +{
> >> + u32 bdtr = TIM_BDTR_BK2E;
> >> +
> >> + if (level)
> >> + bdtr |= TIM_BDTR_BK2P;
> >> +
> >> + bdtr |= (filter & TIM_BDTR_BKF_MASK) << TIM_BDTR_BK2F_SHIFT;
> >> +
> >> + regmap_update_bits(priv->regmap,
> >> + TIM_BDTR, TIM_BDTR_BK2E |
> >> + TIM_BDTR_BK2P |
> >> + TIM_BDTR_BK2F,
> >> + bdtr);
> >> +
> >> + regmap_read(priv->regmap, TIM_BDTR, &bdtr);
> >> +
> >> + return (bdtr & TIM_BDTR_BK2E) ? 0 : -EINVAL;
> >> +}
> >
> > As far as I can tell the only difference here is the various bit
> > positions. Can you collapse the above two functions and add a new
> > parameter to unify some code?
>
> Yes it is all about bit shifting, I had try unify those two functions
> with index has additional parameter
> but it just add if() before each lines so no real benefit for code size.
How about if you precompute the values and masks? Something like:
u32 bke = (index == 0) ? ... : ...;
u32 bkp = (index == 0) ? ... : ...;
u32 bkf = (index == 0) ? ... : ...;
u32 mask = (index == 0) ? ... : ...;
bdtr = bke | bkf;
if (level)
bdtr |= bkp;
regmap_update_bits(priv->regmap, TIM_BDTR, mask, bdtr);
regmap_read(priv->regmap, TIM_BDTR, &bdtr);
return (bdtr & bke) ? 0 : -EINVAL;
?
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]
WARNING: multiple messages have this Message-ID (diff)
From: thierry.reding@gmail.com (Thierry Reding)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH v7 4/8] PWM: add PWM driver for STM32 plaftorm
Date: Wed, 18 Jan 2017 12:37:59 +0100 [thread overview]
Message-ID: <20170118113759.GA16826@ulmo.ba.sec> (raw)
In-Reply-To: <CA+M3ks64VEE8a0oeiA8J-T5FDzwWTo=pdaMACy+pz7EyOQY-Jg@mail.gmail.com>
On Wed, Jan 18, 2017 at 12:15:58PM +0100, Benjamin Gaignard wrote:
> 2017-01-18 11:08 GMT+01:00 Thierry Reding <thierry.reding@gmail.com>:
> > On Thu, Jan 05, 2017 at 10:25:40AM +0100, Benjamin Gaignard wrote:
[...]
> >> +static u32 active_channels(struct stm32_pwm *dev)
> >> +{
> >> + u32 ccer;
> >> +
> >> + regmap_read(dev->regmap, TIM_CCER, &ccer);
> >> +
> >> + return ccer & TIM_CCER_CCXE;
> >> +}
> >
> > This looks like something that you could track in software, but this is
> > probably fine, too. Again, technically regmap_read() could fail, so you
> > might want to consider adding some code to handle it. In practice it
> > probably won't, so maybe you don't.
>
> TIM_CCER_CCXE is a value that IIO timer can also read (not write) so
> I have keep the same logic for pwm driver.
Would that not be racy? What happens if after active_channels() here,
the IIO timer modifies the TIM_CCER register?
> >> + ret = stm32_pwm_config(chip, pwm, state->duty_cycle, state->period);
> >> + if (ret)
> >> + return ret;
> >> +
> >> + if (!enabled && state->enabled)
> >> + ret = stm32_pwm_enable(chip, pwm);
> >> +
> >> + return ret;
> >> +}
> >
> > Would it be possible to merge stm32_pwm_disable(), stm32_pwm_enable(),
> > stm32_pwm_set_polarity() and stm32_pwm_config() into stm32_pwm_apply()?
> > Part of the reason for the atomic API was to make it easier to write
> > these drivers, but your implementation effectively copies what the
> > transitional helpers do.
> >
> > It might not make a difference technically in your case, but I think
> > it'd make the implementation more compact and set a better example for
> > future reference.
>
> hmm... it will create a fat function with lot of where
> enabling/disabling/configuration
> will be mixed I'm really not convince that will more compact and readable.
I don't object to splitting this up into separate functions, I just
don't think the functions should correspond to the legacy ones. One
variant that I think could work out nicely would be to have one
function that precomputes the various values, call in from ->apply()
and then do only the register writes along with a couple of
conditionals depending on enable state, for example.
> >> +static const struct pwm_ops stm32pwm_ops = {
> >> + .owner = THIS_MODULE,
> >> + .apply = stm32_pwm_apply,
> >> +};
> >> +
> >> +static int stm32_pwm_set_breakinput(struct stm32_pwm *priv,
> >> + int level, int filter)
> >> +{
> >> + u32 bdtr = TIM_BDTR_BKE;
> >> +
> >> + if (level)
> >> + bdtr |= TIM_BDTR_BKP;
> >> +
> >> + bdtr |= (filter & TIM_BDTR_BKF_MASK) << TIM_BDTR_BKF_SHIFT;
> >> +
> >> + regmap_update_bits(priv->regmap,
> >> + TIM_BDTR, TIM_BDTR_BKE | TIM_BDTR_BKP | TIM_BDTR_BKF,
> >> + bdtr);
> >> +
> >> + regmap_read(priv->regmap, TIM_BDTR, &bdtr);
> >> +
> >> + return (bdtr & TIM_BDTR_BKE) ? 0 : -EINVAL;
> >> +}
> >> +
> >> +static int stm32_pwm_set_breakinput2(struct stm32_pwm *priv,
> >> + int level, int filter)
> >> +{
> >> + u32 bdtr = TIM_BDTR_BK2E;
> >> +
> >> + if (level)
> >> + bdtr |= TIM_BDTR_BK2P;
> >> +
> >> + bdtr |= (filter & TIM_BDTR_BKF_MASK) << TIM_BDTR_BK2F_SHIFT;
> >> +
> >> + regmap_update_bits(priv->regmap,
> >> + TIM_BDTR, TIM_BDTR_BK2E |
> >> + TIM_BDTR_BK2P |
> >> + TIM_BDTR_BK2F,
> >> + bdtr);
> >> +
> >> + regmap_read(priv->regmap, TIM_BDTR, &bdtr);
> >> +
> >> + return (bdtr & TIM_BDTR_BK2E) ? 0 : -EINVAL;
> >> +}
> >
> > As far as I can tell the only difference here is the various bit
> > positions. Can you collapse the above two functions and add a new
> > parameter to unify some code?
>
> Yes it is all about bit shifting, I had try unify those two functions
> with index has additional parameter
> but it just add if() before each lines so no real benefit for code size.
How about if you precompute the values and masks? Something like:
u32 bke = (index == 0) ? ... : ...;
u32 bkp = (index == 0) ? ... : ...;
u32 bkf = (index == 0) ? ... : ...;
u32 mask = (index == 0) ? ... : ...;
bdtr = bke | bkf;
if (level)
bdtr |= bkp;
regmap_update_bits(priv->regmap, TIM_BDTR, mask, bdtr);
regmap_read(priv->regmap, TIM_BDTR, &bdtr);
return (bdtr & bke) ? 0 : -EINVAL;
?
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: not available
URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20170118/7b32fa5f/attachment.sig>
next prev parent reply other threads:[~2017-01-18 11:38 UTC|newest]
Thread overview: 80+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-01-05 9:25 [PATCH v7 0/8] Add PWM and IIO timer drivers for STM32 Benjamin Gaignard
2017-01-05 9:25 ` Benjamin Gaignard
2017-01-05 9:25 ` [PATCH v7 1/8] MFD: add bindings for STM32 Timers driver Benjamin Gaignard
2017-01-05 9:25 ` Benjamin Gaignard
2017-01-05 9:25 ` Benjamin Gaignard
2017-01-09 17:59 ` Rob Herring
2017-01-09 17:59 ` Rob Herring
2017-01-09 17:59 ` Rob Herring
2017-01-05 9:25 ` [PATCH v7 2/8] MFD: add " Benjamin Gaignard
2017-01-05 9:25 ` Benjamin Gaignard
2017-01-05 9:25 ` Benjamin Gaignard
2017-01-09 18:00 ` Rob Herring
2017-01-09 18:00 ` Rob Herring
2017-01-10 8:56 ` Benjamin Gaignard
2017-01-10 8:56 ` Benjamin Gaignard
2017-01-10 8:56 ` Benjamin Gaignard
2017-01-10 8:56 ` Benjamin Gaignard
2017-01-05 9:25 ` [PATCH v7 3/8] PWM: add pwm-stm32 DT bindings Benjamin Gaignard
2017-01-05 9:25 ` Benjamin Gaignard
2017-01-05 9:25 ` Benjamin Gaignard
2017-01-09 18:01 ` Rob Herring
2017-01-09 18:01 ` Rob Herring
2017-01-18 9:20 ` Thierry Reding
2017-01-18 9:20 ` Thierry Reding
2017-01-18 9:20 ` Thierry Reding
2017-01-18 9:42 ` Benjamin Gaignard
2017-01-18 9:42 ` Benjamin Gaignard
2017-01-18 9:42 ` Benjamin Gaignard
2017-01-05 9:25 ` [PATCH v7 4/8] PWM: add PWM driver for STM32 plaftorm Benjamin Gaignard
2017-01-05 9:25 ` Benjamin Gaignard
2017-01-05 9:25 ` Benjamin Gaignard
2017-01-18 10:08 ` Thierry Reding
2017-01-18 10:08 ` Thierry Reding
2017-01-18 10:08 ` Thierry Reding
2017-01-18 11:15 ` Benjamin Gaignard
2017-01-18 11:15 ` Benjamin Gaignard
2017-01-18 11:15 ` Benjamin Gaignard
2017-01-18 11:15 ` Benjamin Gaignard
2017-01-18 11:37 ` Thierry Reding [this message]
2017-01-18 11:37 ` Thierry Reding
2017-01-18 12:37 ` Benjamin Gaignard
2017-01-18 12:37 ` Benjamin Gaignard
2017-01-18 12:37 ` Benjamin Gaignard
2017-01-18 12:37 ` Benjamin Gaignard
2017-01-18 10:16 ` Thierry Reding
2017-01-18 10:16 ` Thierry Reding
2017-01-18 11:16 ` Benjamin Gaignard
2017-01-18 11:16 ` Benjamin Gaignard
2017-01-18 11:16 ` Benjamin Gaignard
2017-01-18 11:16 ` Benjamin Gaignard
2017-01-05 9:25 ` [PATCH v7 5/8] IIO: add bindings for STM32 timer trigger driver Benjamin Gaignard
2017-01-05 9:25 ` Benjamin Gaignard
2017-01-05 9:25 ` Benjamin Gaignard
2017-01-08 11:23 ` Jonathan Cameron
2017-01-08 11:23 ` Jonathan Cameron
2017-01-09 18:04 ` Rob Herring
2017-01-09 18:04 ` Rob Herring
2017-01-09 18:04 ` Rob Herring
2017-01-10 8:55 ` Benjamin Gaignard
2017-01-10 8:55 ` Benjamin Gaignard
2017-01-10 8:55 ` Benjamin Gaignard
2017-01-10 8:55 ` Benjamin Gaignard
2017-01-05 9:25 ` [PATCH v7 6/8] IIO: add " Benjamin Gaignard
2017-01-05 9:25 ` Benjamin Gaignard
2017-01-08 11:30 ` Jonathan Cameron
2017-01-08 11:30 ` Jonathan Cameron
2017-01-05 9:25 ` [PATCH v7 7/8] ARM: dts: stm32: add Timers driver for stm32f429 MCU Benjamin Gaignard
2017-01-05 9:25 ` Benjamin Gaignard
2017-01-05 9:25 ` Benjamin Gaignard
2017-01-05 9:25 ` [PATCH v7 8/8] ARM: dts: stm32: Enable pwm1 and pwm3 for stm32f469-disco Benjamin Gaignard
2017-01-05 9:25 ` Benjamin Gaignard
2017-01-05 14:49 ` [PATCH v7 0/8] Add PWM and IIO timer drivers for STM32 Lee Jones
2017-01-05 14:49 ` Lee Jones
2017-01-06 7:58 ` Benjamin Gaignard
2017-01-06 7:58 ` Benjamin Gaignard
2017-01-06 7:58 ` Benjamin Gaignard
2017-01-13 12:30 ` Benjamin Gaignard
2017-01-13 12:30 ` Benjamin Gaignard
2017-01-13 12:30 ` Benjamin Gaignard
2017-01-13 12:30 ` Benjamin Gaignard
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=20170118113759.GA16826@ulmo.ba.sec \
--to=thierry.reding@gmail.com \
--cc=alexandre.torgue@st.com \
--cc=arnaud.pouliquen@st.com \
--cc=benjamin.gaignard@linaro.org \
--cc=benjamin.gaignard@st.com \
--cc=devicetree@vger.kernel.org \
--cc=fabrice.gasnier@st.com \
--cc=gerald.baeza@st.com \
--cc=jic23@kernel.org \
--cc=knaack.h@gmx.de \
--cc=lars@metafoo.de \
--cc=lee.jones@linaro.org \
--cc=linaro-kernel@lists.linaro.org \
--cc=linus.walleij@linaro.org \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-iio@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pwm@vger.kernel.org \
--cc=mark.rutland@arm.com \
--cc=pmeerw@pmeerw.net \
--cc=robh+dt@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 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.