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
=====================================================================
next prev parent 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 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.