commit: http://blackfin.uclinux.org/git/?p=linux-kernel;a=commitdiff;h=6d759e52c5a6190f020c6b0121fd1304088061cf
branch: http://blackfin.uclinux.org/git/?p=linux-kernel;a=shortlog;h=refs/heads/2012R1

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

Reply via email to