-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Blackfin: add an example showing how to use the gptimers API
Signed-off-by: Mike Frysinger <vapier@gentoo.org>
- Loading branch information
Mike Frysinger
committed
Dec 15, 2009
1 parent
7a1a8cc
commit 4b60779
Showing
2 changed files
with
89 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,6 @@ | ||
obj-m := gptimers-example.o | ||
|
||
all: modules | ||
|
||
modules clean: | ||
$(MAKE) -C ../.. SUBDIRS=$(PWD) $@ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,83 @@ | ||
/* | ||
* Simple gptimers example | ||
* http://docs.blackfin.uclinux.org/doku.php?id=linux-kernel:drivers:gptimers | ||
* | ||
* Copyright 2007-2009 Analog Devices Inc. | ||
* | ||
* Licensed under the GPL-2 or later. | ||
*/ | ||
|
||
#include <linux/interrupt.h> | ||
#include <linux/module.h> | ||
|
||
#include <asm/gptimers.h> | ||
#include <asm/portmux.h> | ||
|
||
/* ... random driver includes ... */ | ||
|
||
#define DRIVER_NAME "gptimer_example" | ||
|
||
struct gptimer_data { | ||
uint32_t period, width; | ||
}; | ||
static struct gptimer_data data; | ||
|
||
/* ... random driver state ... */ | ||
|
||
static irqreturn_t gptimer_example_irq(int irq, void *dev_id) | ||
{ | ||
struct gptimer_data *data = dev_id; | ||
|
||
/* make sure it was our timer which caused the interrupt */ | ||
if (!get_gptimer_intr(TIMER5_id)) | ||
return IRQ_NONE; | ||
|
||
/* read the width/period values that were captured for the waveform */ | ||
data->width = get_gptimer_pwidth(TIMER5_id); | ||
data->period = get_gptimer_period(TIMER5_id); | ||
|
||
/* acknowledge the interrupt */ | ||
clear_gptimer_intr(TIMER5_id); | ||
|
||
/* tell the upper layers we took care of things */ | ||
return IRQ_HANDLED; | ||
} | ||
|
||
/* ... random driver code ... */ | ||
|
||
static int __init gptimer_example_init(void) | ||
{ | ||
int ret; | ||
|
||
/* grab the peripheral pins */ | ||
ret = peripheral_request(P_TMR5, DRIVER_NAME); | ||
if (ret) { | ||
printk(KERN_NOTICE DRIVER_NAME ": peripheral request failed\n"); | ||
return ret; | ||
} | ||
|
||
/* grab the IRQ for the timer */ | ||
ret = request_irq(IRQ_TIMER5, gptimer_example_irq, IRQF_SHARED, DRIVER_NAME, &data); | ||
if (ret) { | ||
printk(KERN_NOTICE DRIVER_NAME ": IRQ request failed\n"); | ||
peripheral_free(P_TMR5); | ||
return ret; | ||
} | ||
|
||
/* setup the timer and enable it */ | ||
set_gptimer_config(TIMER5_id, WDTH_CAP | PULSE_HI | PERIOD_CNT | IRQ_ENA); | ||
enable_gptimers(TIMER5bit); | ||
|
||
return 0; | ||
} | ||
module_init(gptimer_example_init); | ||
|
||
static void __exit gptimer_example_exit(void) | ||
{ | ||
disable_gptimers(TIMER5bit); | ||
free_irq(IRQ_TIMER5, &data); | ||
peripheral_free(P_TMR5); | ||
} | ||
module_exit(gptimer_example_exit); | ||
|
||
MODULE_LICENSE("BSD"); |