public inbox for u-boot@lists.denx.de
 help / color / mirror / Atom feed
From: Stefano Babic <sbabic@denx.de>
To: u-boot@lists.denx.de
Subject: [U-Boot] [PATCH v3 3/6] pwm, imx6: add support for pwm modul on imx6
Date: Wed, 16 Jul 2014 11:14:24 +0200	[thread overview]
Message-ID: <53C64270.7050507@denx.de> (raw)
In-Reply-To: <1405500696-32597-4-git-send-email-hs@denx.de>

Hi Heiko,

On 16/07/2014 10:51, Heiko Schocher wrote:
> add basic support for the pwm modul found on imx6.
> 
> Signed-off-by: Heiko Schocher <hs@denx.de>
> Cc: Stefano Babic <sbabic@denx.de>
> 
> ---
> - changes for v3:
>   new in v3, as Stefano Babic suggested
> 
>  README                |   4 ++
>  drivers/Makefile      |   1 +
>  drivers/pwm/Makefile  |  13 ++++++
>  drivers/pwm/pwm-imx.c | 109 ++++++++++++++++++++++++++++++++++++++++++++++++++
>  4 files changed, 127 insertions(+)
>  create mode 100644 drivers/pwm/Makefile
>  create mode 100644 drivers/pwm/pwm-imx.c
> 
> diff --git a/README b/README
> index 1eecba6..9f07831 100644
> --- a/README
> +++ b/README
> @@ -1377,6 +1377,10 @@ The following options need to be configured:
>  			CONFIG_SH_ETHER_CACHE_WRITEBACK
>  			If this option is set, the driver enables cache flush.
>  
> +- PWM Support:
> +		CONFIG_PWM_IMX
> +		Support for PWM modul on the imx6.
> +
>  - TPM Support:
>  		CONFIG_TPM
>  		Support TPM devices.
> diff --git a/drivers/Makefile b/drivers/Makefile
> index b23076f..b22b109 100644
> --- a/drivers/Makefile
> +++ b/drivers/Makefile
> @@ -15,3 +15,4 @@ obj-y += video/
>  obj-y += watchdog/
>  obj-$(CONFIG_QE) += qe/
>  obj-y += memory/
> +obj-y += pwm/
> diff --git a/drivers/pwm/Makefile b/drivers/pwm/Makefile
> new file mode 100644
> index 0000000..3173e20
> --- /dev/null
> +++ b/drivers/pwm/Makefile
> @@ -0,0 +1,13 @@
> +#
> +# (C) Copyright 2006
> +# Wolfgang Denk, DENX Software Engineering, wd at denx.de.
> +#
> +# (C) Copyright 2001
> +# Erik Theisen, Wave 7 Optics, etheisen at mindspring.com.
> +#
> +# SPDX-License-Identifier:	GPL-2.0+
> +#
> +
> +#ccflags-y += -DDEBUG
> +
> +obj-$(CONFIG_PWM_IMX) += pwm-imx.o
> diff --git a/drivers/pwm/pwm-imx.c b/drivers/pwm/pwm-imx.c
> new file mode 100644
> index 0000000..c70e150
> --- /dev/null
> +++ b/drivers/pwm/pwm-imx.c
> @@ -0,0 +1,109 @@
> +/*
> + * (C) Copyright 2014
> + * Heiko Schocher, DENX Software Engineering, hs at denx.de.
> + *
> + * Basic support for the pwm modul on imx6.
> + *
> + * Based on linux:drivers/pwm/pwm-imx.c
> + * from
> + * Sascha Hauer <s.hauer@pengutronix.de>
> + *
> + * SPDX-License-Identifier:	GPL-2.0+
> + */
> +
> +#include <common.h>
> +#include <div64.h>
> +#include <pwm.h>
> +#include <asm/arch/imx-regs.h>
> +#include <asm/io.h>
> +
> +/* pwm_id from 0..3 */
> +static struct pwm_regs *pwm_id_to_reg(int pwm_id)
> +{
> +	switch (pwm_id) {
> +	case 0:
> +		return (struct pwm_regs *)PWM1_BASE_ADDR;
> +		break;
> +	case 1:
> +		return (struct pwm_regs *)PWM2_BASE_ADDR;
> +		break;
> +	case 2:
> +		return (struct pwm_regs *)PWM3_BASE_ADDR;
> +		break;
> +	case 3:
> +		return (struct pwm_regs *)PWM4_BASE_ADDR;
> +		break;
> +	default:
> +		printf("unknown pwm_id: %d\n", pwm_id);
> +		break;
> +	}
> +	return NULL;
> +}
> +
> +int pwm_init(int pwm_id, int div, int invert)
> +{
> +	struct pwm_regs *pwm = (struct pwm_regs *)pwm_id_to_reg(pwm_id);
> +
> +	writel(0, &pwm->ir);
> +	return 0;
> +}
> +
> +int pwm_config(int pwm_id, int duty_ns, int period_ns)
> +{
> +	struct pwm_regs *pwm = (struct pwm_regs *)pwm_id_to_reg(pwm_id);
> +	unsigned long long c;
> +	unsigned long period_cycles, duty_cycles, prescale;
> +	u32 cr;
> +
> +	/*
> +	 * we have not yet a clock framework for imx6, so add the clock
> +	 * value here as a define. Replace it when we have the clock
> +	 * framework.
> +	 */
> +	c = CONFIG_IMX6_PWM_PER_CLK;
> +	c = c * period_ns;
> +	do_div(c, 1000000000);
> +	period_cycles = c;
> +
> +	prescale = period_cycles / 0x10000 + 1;
> +
> +	period_cycles /= prescale;
> +	c = (unsigned long long)period_cycles * duty_ns;
> +	do_div(c, period_ns);
> +	duty_cycles = c;
> +
> +	/*
> +	 * according to imx pwm RM, the real period value should be
> +	 * PERIOD value in PWMPR plus 2.
> +	 */
> +	if (period_cycles > 2)
> +		period_cycles -= 2;
> +	else
> +		period_cycles = 0;
> +
> +	cr = PWMCR_PRESCALER(prescale) |
> +		PWMCR_DOZEEN | PWMCR_WAITEN |
> +		PWMCR_DBGEN | PWMCR_CLKSRC_IPG_HIGH;
> +
> +	writel(cr, &pwm->cr);
> +	/* set duty cycles */
> +	writel(duty_cycles, &pwm->sar);
> +	/* set period cycles */
> +	writel(period_cycles, &pwm->pr);
> +	return 0;
> +}
> +
> +int pwm_enable(int pwm_id)
> +{
> +	struct pwm_regs *pwm = (struct pwm_regs *)pwm_id_to_reg(pwm_id);
> +
> +	setbits_le32(&pwm->cr, PWMCR_EN);
> +	return 0;
> +}
> +
> +void pwm_disable(int pwm_id)
> +{
> +	struct pwm_regs *pwm = (struct pwm_regs *)pwm_id_to_reg(pwm_id);
> +
> +	clrbits_le32(&pwm->cr, PWMCR_EN);
> +}
> 

Nice ! Should we also add in the commit message that the code is
directly taken from kernel driver ?

Acked-by: Stefano Babic <sbabic@denx.de>

Best regards,
Stefano Babic

-- 
=====================================================================
DENX Software Engineering GmbH,     MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: +49-8142-66989-53 Fax: +49-8142-66989-80 Email: sbabic at denx.de
=====================================================================

  reply	other threads:[~2014-07-16  9:14 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-07-16  8:51 [U-Boot] [PATCH v3 0/6] arm, imx6: add aristainetos board support Heiko Schocher
2014-07-16  8:51 ` [U-Boot] [PATCH v3 1/6] imx6: add gpr2 usb_otg_id iomux select control define Heiko Schocher
2014-07-16  8:51 ` [U-Boot] [PATCH v3 2/6] i.MX6: define struct pwm_regs and PWMCR_* defines Heiko Schocher
2014-07-16  8:51 ` [U-Boot] [PATCH v3 3/6] pwm, imx6: add support for pwm modul on imx6 Heiko Schocher
2014-07-16  9:14   ` Stefano Babic [this message]
2014-07-16  9:21     ` Heiko Schocher
2014-07-16  9:44     ` Wolfgang Denk
2014-07-16  8:51 ` [U-Boot] [PATCH v3 4/6] i.MX6: add enable_spi_clk() Heiko Schocher
2014-07-16  8:51 ` [U-Boot] [PATCH v3 5/6] spi: add config option to enable the WP pin function on st micron flashes Heiko Schocher
2014-07-16  8:51 ` [U-Boot] [PATCH v3 6/6] arm, imx6: add aristainetos board Heiko Schocher
2014-07-16  9:20   ` Stefano Babic

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=53C64270.7050507@denx.de \
    --to=sbabic@denx.de \
    --cc=u-boot@lists.denx.de \
    /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