On Fri, Sep 10, 2010 at 22:04:08, Caglar Akyuz wrote:
> On Thursday 09 September 2010 01:40:49 pm Sugumar Natarajan wrote:
> > This patch adds generic PWM support where it maintains the list of PWM 
> > control devices that can be added or removed.
> > 
> > The interface provides a list of functions that can be accessed by the 
> > PWM control driver module and the generic PWM driver.
> > 
> > The PWM control driver module such as eCAP uses the interface to 
> > register and add itself to the list as a PWM control device.
> > The generic PWM driver uses the interface to search for a PWM control 
> > device and if present, uses the device for PWM control.
> > 
> 
> How does real pwm modules fit in this architecture? For instance L-138 have 
> eHRPWM modules for PWM generation. 
> 
> * Should we add a seperate file for eHRPWM module?
> 
> or
> 
> * Should we integrate it in davinci_pwm file?
> 
> Best Regards,
> Caglar
> 
> > Signed-off-by: Sugumar Natarajan <[email protected]>
> > ---
> > Changes since v2:
> > a) pwm_config_device callback is made more flexible.
> > b) pwm_request function code has been made more cleaner.
> > c) Sanity-check/warn has been included.
> > 
> >  arch/arm/mach-davinci/Makefile                   |    3 +
> >  arch/arm/mach-davinci/davinci_pwm.c              |  130
> >  ++++++++++++++++++++++ arch/arm/mach-davinci/include/mach/davinci_pwm.h | 
> >   32 ++++++
> >  3 files changed, 165 insertions(+), 0 deletions(-)  create mode 
> > 100644 arch/arm/mach-davinci/davinci_pwm.c
> >  create mode 100644 arch/arm/mach-davinci/include/mach/davinci_pwm.h
> > 
> > diff --git a/arch/arm/mach-davinci/Makefile  
> > b/arch/arm/mach-davinci/Makefile index a7a70d1..90ca821 100644
> > --- a/arch/arm/mach-davinci/Makefile
> > +++ b/arch/arm/mach-davinci/Makefile
> > @@ -39,3 +39,6 @@ obj-$(CONFIG_MACH_MITYOMAPL138)           += 
> > board-mityomapl138.o
> >  obj-$(CONFIG_CPU_FREQ)                     += cpufreq.o
> >  obj-$(CONFIG_CPU_IDLE)                     += cpuidle.o
> >  obj-$(CONFIG_SUSPEND)                      += pm.o sleep.o
> > +
> > +# Generic PWM control support
> > +obj-$(CONFIG_HAVE_PWM)                     += davinci_pwm.o
> > diff --git a/arch/arm/mach-davinci/davinci_pwm.c
> >  b/arch/arm/mach-davinci/davinci_pwm.c new file mode 100644 index 
> > 0000000..c2b8b9a
> > --- /dev/null
> > +++ b/arch/arm/mach-davinci/davinci_pwm.c
> > @@ -0,0 +1,130 @@
> > +/*
> > + * Copyright (C) 2010 Texas Instruments Incorporated - 
> > +http://www.ti.com/
> > + *
> > + * This program is free software; you can redistribute it and/or
> > + * modify it under the terms of the GNU General Public License as
> > + * published by the Free Software Foundation version 2.
> > + *
> > + * This program is distributed .as is. WITHOUT ANY WARRANTY of any
> > + * kind, whether express or implied; without even the implied 
> > +warranty
> > + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> > + * GNU General Public License for more details.
> > + */
> > +
> > +#include <linux/module.h>
> > +#include <linux/kernel.h>
> > +#include <linux/platform_device.h>
> > +#include <linux/err.h>
> > +#include <linux/clk.h>
> > +#include <linux/io.h>
> > +#include <linux/pwm.h>
> > +#include <mach/davinci_pwm.h>
> > +
> > +int pwm_config(struct pwm_device *pwm, int duty_ns, int period_ns) {
> > +   unsigned int clock_freq;
> > +   unsigned int period_cycles;
> > +   unsigned int duty_cycle;
> > +   int ret = 0;
> > +
> > +   if (WARN_ON(!pwm))
> > +           return -EINVAL;
> > +
> > +   if (pwm->pwm_config_device) {
> > +           if (!period_ns || duty_ns > period_ns)
> > +                   return -EINVAL;
> > +
> > +           clock_freq = clk_get_rate(pwm->clk) / USEC_PER_SEC;
> > +           period_cycles = (clock_freq * period_ns) / MSEC_PER_SEC;
> > +           duty_cycle = (clock_freq * duty_ns) / MSEC_PER_SEC;
> > +           ret = pwm->pwm_config_device(pwm, period_cycles, duty_cycle);
> > +   }
> > +
> > +   return ret;
> > +}
> > +EXPORT_SYMBOL(pwm_config);
> > +
> > +int pwm_enable(struct pwm_device *pwm) {
> > +   if (WARN_ON(!pwm))
> > +           return -EINVAL;
> > +
> > +   return clk_enable(pwm->clk);
> > +}
> > +EXPORT_SYMBOL(pwm_enable);
> > +
> > +void pwm_disable(struct pwm_device *pwm) {
> > +   if (WARN_ON(!pwm))
> > +           return;
> > +
> > +   clk_disable(pwm->clk);
> > +}
> > +EXPORT_SYMBOL(pwm_disable);
> > +
> > +static DEFINE_MUTEX(pwm_lock);
> > +static LIST_HEAD(pwm_list);
> > +
> > +struct pwm_device *pwm_request(int pwm_id, const char *label) {
> > +   struct pwm_device *pwm, *tmp_pwm = ERR_PTR(-ENOENT);
> > +
> > +   mutex_lock(&pwm_lock);
> > +
> > +   list_for_each_entry(pwm, &pwm_list, node) {
> > +           if (pwm->pwm_id == pwm_id) {
> > +                   if (pwm->use_count == 0) {
> > +                           pwm->use_count++;
> > +                           pwm->label = label;
> > +                   } else {
> > +                           pwm = ERR_PTR(-EBUSY);
> > +                   }
> > +                   tmp_pwm = pwm;
> > +                   break;
> > +           }
> > +   }
> > +
> > +   mutex_unlock(&pwm_lock);
> > +   return tmp_pwm;
> > +}
> > +EXPORT_SYMBOL(pwm_request);
> > +
> > +void pwm_free(struct pwm_device *pwm) {
> > +   if (WARN_ON(!pwm))
> > +           return;
> > +
> > +   mutex_lock(&pwm_lock);
> > +
> > +   if (pwm->use_count) {
> > +           pwm->use_count--;
> > +           pwm->label = NULL;
> > +   } else {
> > +           dev_warn(&pwm->pdev->dev, "PWM device already freed\n");
> > +   }
> > +
> > +   mutex_unlock(&pwm_lock);
> > +}
> > +EXPORT_SYMBOL(pwm_free);
> > +
> > +void pwm_add(struct pwm_device *pwm)
> > +{
> > +   if (WARN_ON(!pwm))
> > +           return;
> > +
> > +   mutex_lock(&pwm_lock);
> > +   list_add_tail(&pwm->node, &pwm_list);
> > +   mutex_unlock(&pwm_lock);
> > +}
> > +EXPORT_SYMBOL(pwm_add);
> > +
> > +void pwm_remove(struct pwm_device *pwm) {
> > +   if (WARN_ON(!pwm))
> > +           return;
> > +
> > +   mutex_lock(&pwm_lock);
> > +   list_del(&pwm->node);
> > +   mutex_unlock(&pwm_lock);
> > +}
> > +EXPORT_SYMBOL(pwm_remove);
> > diff --git a/arch/arm/mach-davinci/include/mach/davinci_pwm.h
> >  b/arch/arm/mach-davinci/include/mach/davinci_pwm.h new file mode 
> > 100644 index 0000000..3b7a3c8
> > --- /dev/null
> > +++ b/arch/arm/mach-davinci/include/mach/davinci_pwm.h
> > @@ -0,0 +1,32 @@
> > +/*
> > + * Copyright (C) 2010 Texas Instruments Incorporated - 
> > +http://www.ti.com/
> > + *
> > + * This program is free software; you can redistribute it and/or
> > + * modify it under the terms of the GNU General Public License as
> > + * published by the Free Software Foundation version 2.
> > + *
> > + * This program is distributed .as is. WITHOUT ANY WARRANTY of any
> > + * kind, whether express or implied; without even the implied 
> > +warranty
> > + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> > + * GNU General Public License for more details.
> > + *
> > + */
> > +
> > +#ifndef __DAVINCI_PWM_H
> > +#define __DAVINCI_PWM_H
> > +
> > +struct pwm_device {
> > +   struct list_head        node;
> > +   struct platform_device  *pdev;
> > +   int (*pwm_config_device)(struct pwm_device *pwm,
> > +           unsigned int period, unsigned int dutycycle);
> > +   const char      *label;
> > +   struct clk      *clk;
> > +   unsigned int    use_count;
> > +   unsigned int    pwm_id;
> > +};
> > +
> > +void pwm_add(struct pwm_device *pwm); void pwm_remove(struct 
> > +pwm_device *pwm);
> > +
> > +#endif
> > 
> 

Caglar,
 We have to add separate file for eHRPWM module.

Regards,
N.Sugumar


_______________________________________________
Davinci-linux-open-source mailing list
[email protected]
http://linux.davincidsp.com/mailman/listinfo/davinci-linux-open-source

Reply via email to