diff options
Diffstat (limited to 'drivers/char')
-rw-r--r-- | drivers/char/ftimer.c | 3 | ||||
-rw-r--r-- | drivers/char/lptimer.c | 16 | ||||
-rw-r--r-- | drivers/char/mvf_timer_master.c | 1 | ||||
-rw-r--r-- | drivers/char/pitimer.c | 35 |
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); |