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 <[email protected]> > Cc: Stefano Babic <[email protected]> > > --- > - 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, [email protected]. > +# > +# (C) Copyright 2001 > +# Erik Theisen, Wave 7 Optics, [email protected]. > +# > +# 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, [email protected]. > + * > + * Basic support for the pwm modul on imx6. > + * > + * Based on linux:drivers/pwm/pwm-imx.c > + * from > + * Sascha Hauer <[email protected]> > + * > + * 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 <[email protected]> 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: [email protected] ===================================================================== _______________________________________________ U-Boot mailing list [email protected] http://lists.denx.de/mailman/listinfo/u-boot

