commit: http://blackfin.uclinux.org/git/?p=linux-kernel;a=commitdiff;h=3610264507d93c80bafe3c6b87c76f46604d6f0f branch: http://blackfin.uclinux.org/git/?p=linux-kernel;a=shortlog;h=refs/heads/trunk
Signed-off-by: Steven Miao <[email protected]> --- arch/blackfin/include/asm/bfin_simple_timer.h | 6 ++++++ drivers/char/bfin_simple_timer.c | 23 +++++++++++++++++------ 2 files changed, 23 insertions(+), 6 deletions(-) diff --git a/arch/blackfin/include/asm/bfin_simple_timer.h b/arch/blackfin/include/asm/bfin_simple_timer.h index aadfb1a..b2d5e73 100644 --- a/arch/blackfin/include/asm/bfin_simple_timer.h +++ b/arch/blackfin/include/asm/bfin_simple_timer.h @@ -17,5 +17,11 @@ #define BFIN_SIMPLE_TIMER_START _IO(BFIN_SIMPLE_TIMER_IOCTL_MAGIC, 6) #define BFIN_SIMPLE_TIMER_STOP _IO(BFIN_SIMPLE_TIMER_IOCTL_MAGIC, 8) #define BFIN_SIMPLE_TIMER_READ _IO(BFIN_SIMPLE_TIMER_IOCTL_MAGIC, 10) +#define BFIN_SIMPLE_TIMER_READ_COUNTER _IO(BFIN_SIMPLE_TIMER_IOCTL_MAGIC, 11) + +#define BFIN_SIMPLE_TIMER_MODE_PWM_ONESHOT 0 +#define BFIN_SIMPLE_TIMER_MODE_PWMOUT_CONT 1 +#define BFIN_SIMPLE_TIMER_MODE_WDTH_CAP 2 +#define BFIN_SIMPLE_TIMER_MODE_PWMOUT_CONT_NOIRQ 3 #endif diff --git a/drivers/char/bfin_simple_timer.c b/drivers/char/bfin_simple_timer.c index b9c43b5..6a261ca 100644 --- a/drivers/char/bfin_simple_timer.c +++ b/drivers/char/bfin_simple_timer.c @@ -32,6 +32,7 @@ #include <linux/proc_fs.h> #include <linux/interrupt.h> #include <linux/device.h> +#include <linux/uaccess.h> #include <asm/gptimers.h> #include <asm/irq.h> #include <asm/bfin_simple_timer.h> @@ -96,8 +97,8 @@ timer_ioctl(struct file *filp, uint cmd, unsigned long arg) case BFIN_SIMPLE_TIMER_SET_MODE: mode = arg; switch (mode) { - pr_debug(DRV_NAME ": TIMER_SET_MODE: mode %d\n", mode); - case 0: + pr_debug(DRV_NAME ": TIMER_SET_MODE: mode %lu\n", mode); + case BFIN_SIMPLE_TIMER_MODE_PWM_ONESHOT: #ifdef CONFIG_BF60x set_gptimer_config(t->id, TIMER_OUT_DIS | TIMER_MODE_PWM | TIMER_PULSE_HI | TIMER_IRQ_WID_DLY); @@ -105,7 +106,7 @@ timer_ioctl(struct file *filp, uint cmd, unsigned long arg) set_gptimer_config(t->id, OUT_DIS | PWM_OUT | PERIOD_CNT | IRQ_ENA); #endif break; - case 1: + case BFIN_SIMPLE_TIMER_MODE_PWMOUT_CONT: #ifdef CONFIG_BF60x set_gptimer_config(t->id, TIMER_MODE_PWM_CONT | TIMER_PULSE_HI | TIMER_IRQ_PER); @@ -113,13 +114,21 @@ timer_ioctl(struct file *filp, uint cmd, unsigned long arg) set_gptimer_config(t->id, PWM_OUT | PERIOD_CNT | IRQ_ENA); #endif break; - case 2: + case BFIN_SIMPLE_TIMER_MODE_WDTH_CAP: #ifdef CONFIG_BF60x set_gptimer_config(t->id, TIMER_MODE_WDTH | TIMER_IRQ_PER); #else set_gptimer_config(t->id, WDTH_CAP | PERIOD_CNT | IRQ_ENA); #endif break; + case BFIN_SIMPLE_TIMER_MODE_PWMOUT_CONT_NOIRQ: +#ifdef CONFIG_BF60x + set_gptimer_config(t->id, TIMER_MODE_PWM_CONT + | TIMER_PULSE_HI); +#else + set_gptimer_config(t->id, PWM_OUT | PERIOD_CNT); +#endif + break; default: pr_debug(DRV_NAME ": error mode\n"); } @@ -135,8 +144,10 @@ timer_ioctl(struct file *filp, uint cmd, unsigned long arg) disable_gptimers(t->bit); break; case BFIN_SIMPLE_TIMER_READ: - /* XXX: this should be put_user() */ - *((unsigned long *)arg) = t->isr_count; + put_user(t->isr_count, (unsigned long __user *)arg); + break; + case BFIN_SIMPLE_TIMER_READ_COUNTER: + put_user(get_gptimer_count(t->id), (unsigned long __user *)arg); break; default: return -EINVAL;
_______________________________________________ Linux-kernel-commits mailing list [email protected] https://blackfin.uclinux.org/mailman/listinfo/linux-kernel-commits
