summaryrefslogtreecommitdiff
path: root/drivers/char
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/char')
-rw-r--r--drivers/char/ftimer.c3
-rw-r--r--drivers/char/lptimer.c16
-rw-r--r--drivers/char/mvf_timer_master.c1
-rw-r--r--drivers/char/pitimer.c35
4 files changed, 44 insertions, 11 deletions
diff --git a/drivers/char/ftimer.c b/drivers/char/ftimer.c
index 88a31997ef8f..9fe19fa70475 100644
--- a/drivers/char/ftimer.c
+++ b/drivers/char/ftimer.c
@@ -311,7 +311,7 @@ int ftm_probe(struct platform_device *pdev)
struct resource *ftm_membase, *ftm_irq;
struct mvf_ftm_dev *timedevptr;
- ftm_membase = platform_get_resource(pdev, IORESOURCE_MEM, 1);
+ ftm_membase = platform_get_resource(pdev, IORESOURCE_MEM, 0);
ftm_irq = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
if (!ftm_irq || !ftm_membase){
@@ -353,6 +353,7 @@ int ftm_probe(struct platform_device *pdev)
platform_set_drvdata(pdev, timedevptr);
timer_master_register_platform(pdev);
+ printk (KERN_INFO "Flex Timer Module Driver (id = %d) Installed.\n", pdev->id);
return 0;
}
diff --git a/drivers/char/lptimer.c b/drivers/char/lptimer.c
index 3203580beda1..d955cbd4c7fb 100644
--- a/drivers/char/lptimer.c
+++ b/drivers/char/lptimer.c
@@ -112,7 +112,7 @@ int lpt_enable_timer( int timer_handle)
// must not be altered.
val = readl(membase + LPTMR_CSR_OFFSET);
val |= ( LPTMR_CSR_TEN|LPTMR_CSR_TIE);
- writel( val, membase + LPTMR_CSR_TEN);
+ writel( val, membase + LPTMR_CSR_OFFSET);
return 0;
}
@@ -142,7 +142,7 @@ int lpt_disable_timer( int timer_handle)
// including the CNR and TCF.
val = readl(membase + LPTMR_CSR_OFFSET);
val &= ~LPTMR_CSR_TEN;
- writel( val, membase + LPTMR_CSR_TEN);
+ writel( val, membase + LPTMR_CSR_OFFSET);
return 0;
}
@@ -175,6 +175,9 @@ int lpt_read_counter( int timer_handle, unsigned long *counter)
pdev = timer_master_get_pdev(timer_handle);
timedevptr = platform_get_drvdata(pdev);
+ // Synchronize temporary reg
+ writel( 0, timedevptr->membase + LPTMR_CNR_OFFSET);
+
// 16bit timer
*counter = readl( timedevptr->membase + LPTMR_CNR_OFFSET) & 0x0000ffff;
@@ -251,6 +254,11 @@ int lpt_param_set( int timer_handle, struct mvf_lpt_request *req, void (*event_h
// compare
writel( req->compare_value, membase + LPTMR_CMR_OFFSET);
+#if 0
+printk("register LPTMR_CSR_OFFSET %x\n", readl( timedevptr->membase + LPTMR_CSR_OFFSET));
+printk("register LPTMR_PSR_OFFSET %x\n", readl( timedevptr->membase + LPTMR_PSR_OFFSET));
+printk("register LPTMR_CMR_OFFSET %x\n", readl( timedevptr->membase + LPTMR_CMR_OFFSET));
+#endif
timedevptr->event_handler = event_handler;
timedevptr->configured++;
@@ -272,7 +280,7 @@ int lpt_probe(struct platform_device *pdev)
struct resource *lptmr_membase, *lptmr_irq;
struct mvf_lpt_dev *timedevptr;
- lptmr_membase = platform_get_resource(pdev, IORESOURCE_MEM, 1);
+ lptmr_membase = platform_get_resource(pdev, IORESOURCE_MEM, 0);
lptmr_irq = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
if (!lptmr_irq || !lptmr_membase){
@@ -310,6 +318,8 @@ int lpt_probe(struct platform_device *pdev)
timer_master_register_platform(pdev);
+ printk (KERN_INFO "Low Power Timer Driver Installed.\n");
+
return 0;
}
diff --git a/drivers/char/mvf_timer_master.c b/drivers/char/mvf_timer_master.c
index 56d134d499be..4bf245feed54 100644
--- a/drivers/char/mvf_timer_master.c
+++ b/drivers/char/mvf_timer_master.c
@@ -88,6 +88,7 @@ static int timer_master_alloc_timer( int index)
if ( master_control.is_opened[ i] == TIMER_AVAILABLE){
master_control.is_opened[ i] = TIMER_BUSY;
ret = i;
+ break;
}
}
}else
diff --git a/drivers/char/pitimer.c b/drivers/char/pitimer.c
index b83da781e76c..2b81732d4aa5 100644
--- a/drivers/char/pitimer.c
+++ b/drivers/char/pitimer.c
@@ -115,7 +115,13 @@ int pit_enable_timer( int timer_handle)
membase = timedevptr->membase;
- writel( PIT_TFLG_TIF, timedevptr->membase + PIT_TFLG_OFFSET( i));
+// writel( PIT_TFLG_TIF, timedevptr->membase + PIT_TFLG_OFFSET( i));
+
+ // enable timer Int
+ val = PIT_TCTR_TIE;
+ writel( val, membase + PIT_TCTRL_OFFSET( i));
+
+ // enable timer
val = PIT_TCTR_TEN | PIT_TCTR_TIE;
writel( val, membase + PIT_TCTRL_OFFSET( i));
@@ -195,7 +201,6 @@ int pit_param_set( int timer_handle, unsigned long load_val, void (*event_handle
struct platform_device *pdev;
struct mvf_pit_dev *timedevptr;
-
if ( !timer_master_is_opened( timer_handle)){
return -EAGAIN;
}
@@ -227,12 +232,12 @@ int pit_probe(struct platform_device *pdev)
{
int size;
int result;
- int i;
+ int i, init_start;
unsigned long val;
struct resource *pit_membase, *pit_irq;
struct mvf_pit_dev *timedevptr;
- pit_membase = platform_get_resource(pdev, IORESOURCE_MEM, 1);
+ pit_membase = platform_get_resource(pdev, IORESOURCE_MEM, 0);
pit_irq = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
if (!pit_irq || !pit_membase){
@@ -278,10 +283,26 @@ int pit_probe(struct platform_device *pdev)
// timer clock start
writel( 0, timedevptr->membase + PIT_MCR_OFFSET);
}else{
- // assume PIT 0 is kernel system tick
+#ifdef CONFIG_MVF_USE_PIT
pit_alloc_timer( PIT0);
- printk(KERN_WARNING"Maybe PIT0 is system tick\n");
+ printk(KERN_WARNING"PIT0 is system tick.\n");
+#endif
+ }
+
+ // init timer
+#ifdef CONFIG_MVF_USE_PIT
+ // init from pit1
+ init_start = 1;
+#else
+ // init from pit0
+ init_start = 0;
+#endif
+
+ for ( i = init_start; i < TIMER_MASTER_MAX_TIMER; i ++){
+ writel( 0, timedevptr->membase + PIT_TCTRL_OFFSET( i));
+
}
+ printk (KERN_INFO "Periodic Timer Driver Installed.\n");
return 0;
}
@@ -293,7 +314,7 @@ static int __devexit pit_remove(struct platform_device *pdev)
timedevptr = platform_get_drvdata(pdev);
// disable all
- pit_disable_timer( 0);
+// pit_disable_timer( 0);
clk_disable( timedevptr->clk);
kfree( timedevptr);