All of lore.kernel.org
 help / color / mirror / Atom feed
From: Sascha Hauer <s.hauer@pengutronix.de>
To: Sean Cross <xobs@kosagi.com>
Cc: Thierry Reding <thierry.reding@gmail.com>,
	Grant Likely <grant.likely@linaro.org>,
	Rob Herring <robh+dt@kernel.org>,
	linux-pwm@vger.kernel.org, devicetree@vger.kernel.org
Subject: Re: [PATCH] pwm: imx: Support very long period lengths
Date: Mon, 28 Apr 2014 14:43:01 +0200	[thread overview]
Message-ID: <20140428124301.GS5858@pengutronix.de> (raw)
In-Reply-To: <535E4521.6070102@kosagi.com>

On Mon, Apr 28, 2014 at 08:10:09PM +0800, Sean Cross wrote:
> On 04/28/14 17:22, Sascha Hauer wrote:
> >On Mon, Apr 28, 2014 at 04:55:31PM +0800, Sean Cross wrote:
> >>The IMX PWM block supports using both the system clock and a 32 kHz
> >>clock for driving PWM events.  For very long period lengths, use the
> >>32 kHz clock instead of the high-speed clock.
> >>
> >>Signed-off-by: Sean Cross <xobs@kosagi.com>
> >>---
> >>  drivers/pwm/pwm-imx.c | 14 +++++++++++---
> >>  1 file changed, 11 insertions(+), 3 deletions(-)
> >>
> >>diff --git a/drivers/pwm/pwm-imx.c b/drivers/pwm/pwm-imx.c
> >>index cc47733..8410455 100644
> >>--- a/drivers/pwm/pwm-imx.c
> >>+++ b/drivers/pwm/pwm-imx.c
> >>@@ -36,9 +36,11 @@
> >>  #define MX3_PWMCR_DOZEEN                (1 << 24)
> >>  #define MX3_PWMCR_WAITEN                (1 << 23)
> >>  #define MX3_PWMCR_DBGEN			(1 << 22)
> >>+#define MX3_PWMCR_CLKSRC_IPG_32K  (3 << 16)
> >>  #define MX3_PWMCR_CLKSRC_IPG_HIGH (2 << 16)
> >>  #define MX3_PWMCR_CLKSRC_IPG      (1 << 16)
> >>  #define MX3_PWMCR_EN              (1 << 0)
> >>+#define MX3_SLOW_THRESHOLD_NS	100000
> >>  struct imx_chip {
> >>  	struct clk	*clk_per;
> >>@@ -107,7 +109,13 @@ static int imx_pwm_config_v2(struct pwm_chip *chip,
> >>  	unsigned long period_cycles, duty_cycles, prescale;
> >>  	u32 cr;
> >>-	c = clk_get_rate(imx->clk_per);
> >>+	if (duty_ns > MX3_SLOW_THRESHOLD_NS) {
> >If anything you have to check the period_cycles, not the duty_cycles.
> >
> >100000 seems to be some arbitrary value suitable for some unspecified
> >ipg clock rate. I think you should use it when the period_cycles
> >register overflows.
> In this case, it's for a backlight controller that requires a 100 Hz
> clock.  But you're right, hard-coding the values is a bad idea.
> 
> With the prescaler and the period_cycles register, it might not
> actually overflow, but instead the resolution might become too poor
> to be useful.  The prescaler supports dividing by up to 4096, but it
> gets difficult to hit a particular value.

Hm, this seems to be a common problem. grep for prescale in the pwm
drivers. It seems several drivers iterate over the possible prescalers
to find the best values. Maybe it's time to add some helper function
for this task?

> 
> So with my target of a 100 Hz clock, it appears as though no values
> overflow yet I can't use IPG_HIGH.
> 
> What is the best way to handle this?
> >>+		cr = MX3_PWMCR_CLKSRC_IPG_32K;
> >>+		c = 32768;
> >How about providing a proper clock instead of hardcoding this?
> >
> That seems like a lot of work, and I don't see any other PWM devices
> that do this.  If I understand the clock system, I'd have to add the
> following to pwm-imx.c:
> 
>     - Each PWM would get three new clocks added to its struct
> imx_chip -- a clk_ipg_mux, a clk_ipg_32k, and a clk_ipg_high
>     - The struct imx_chip would also gain a clk_ckil entry for the
> 32768 Hz clock
>     - These three clocks would need to be created on _probe() and
> destroyed on _remove()
>     - clk_ipg_32k would get reparented to ckil (or whatever the
> 32768 Hz clock is on that platform)
>     - clk_ipg_high would get reparented to imx->clk_per
>     - The recalc_rate(), round_rate(), and set_rate() would need to
> be implemented (and calculated) for clk_ipg_32k and clk_ipg_high

I didn't mean you should implement the PWM internal mux as clocks. This
is completely driver internal and it's not necessary to make them real
clocks.

> 
> Additionally, "ckil" would need to be added to the pwm entry for
> every dts file.

Yes, indeed. This way we do not rely on hardcoded values for ckil. ckil
is 32000Hz on some (admittedly older) SoCs.

So my suggestion is: Add ckil lookup to the pwm nodes of imx6qdl.dtsi,
do a clk_get(dev, "ckil") in the driver and use it when available.

Sascha

-- 
Pengutronix e.K.                           |                             |
Industrial Linux Solutions                 | http://www.pengutronix.de/  |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0    |
Amtsgericht Hildesheim, HRA 2686           | Fax:   +49-5121-206917-5555 |

      reply	other threads:[~2014-04-28 12:43 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-04-28  8:55 [PATCH] pwm: imx: Add support for low-speed PWM Sean Cross
     [not found] ` <1398675331-10980-1-git-send-email-xobs-nXMMniAx+RbQT0dZR+AlfA@public.gmane.org>
2014-04-28  8:55   ` [PATCH] pwm: imx: Support very long period lengths Sean Cross
2014-04-28  9:22     ` Sascha Hauer
2014-04-28 12:10       ` Sean Cross
2014-04-28 12:43         ` Sascha Hauer [this message]

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=20140428124301.GS5858@pengutronix.de \
    --to=s.hauer@pengutronix.de \
    --cc=devicetree@vger.kernel.org \
    --cc=grant.likely@linaro.org \
    --cc=linux-pwm@vger.kernel.org \
    --cc=robh+dt@kernel.org \
    --cc=thierry.reding@gmail.com \
    --cc=xobs@kosagi.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.