diff options
| author | Mike Frysinger <vapier@gentoo.org> | 2009-10-21 17:22:35 -0400 |
|---|---|---|
| committer | Mike Frysinger <vapier@gentoo.org> | 2009-12-15 00:15:04 -0500 |
| commit | 4b60779d5ea76908c3bc82d93280b733335fce48 (patch) | |
| tree | 4ee2014159244156117153197f0624ace75ef3fc | |
| parent | 7a1a8cc1902af3a2a19636da3674008b2f1246db (diff) | |
Blackfin: add an example showing how to use the gptimers API
Signed-off-by: Mike Frysinger <vapier@gentoo.org>
| -rw-r--r-- | Documentation/blackfin/Makefile | 6 | ||||
| -rw-r--r-- | Documentation/blackfin/gptimers-example.c | 83 |
2 files changed, 89 insertions, 0 deletions
diff --git a/Documentation/blackfin/Makefile b/Documentation/blackfin/Makefile new file mode 100644 index 00000000000..773dbb103f1 --- /dev/null +++ b/Documentation/blackfin/Makefile | |||
| @@ -0,0 +1,6 @@ | |||
| 1 | obj-m := gptimers-example.o | ||
| 2 | |||
| 3 | all: modules | ||
| 4 | |||
| 5 | modules clean: | ||
| 6 | $(MAKE) -C ../.. SUBDIRS=$(PWD) $@ | ||
diff --git a/Documentation/blackfin/gptimers-example.c b/Documentation/blackfin/gptimers-example.c new file mode 100644 index 00000000000..b1bd6340e74 --- /dev/null +++ b/Documentation/blackfin/gptimers-example.c | |||
| @@ -0,0 +1,83 @@ | |||
| 1 | /* | ||
| 2 | * Simple gptimers example | ||
| 3 | * http://docs.blackfin.uclinux.org/doku.php?id=linux-kernel:drivers:gptimers | ||
| 4 | * | ||
| 5 | * Copyright 2007-2009 Analog Devices Inc. | ||
| 6 | * | ||
| 7 | * Licensed under the GPL-2 or later. | ||
| 8 | */ | ||
| 9 | |||
| 10 | #include <linux/interrupt.h> | ||
| 11 | #include <linux/module.h> | ||
| 12 | |||
| 13 | #include <asm/gptimers.h> | ||
| 14 | #include <asm/portmux.h> | ||
| 15 | |||
| 16 | /* ... random driver includes ... */ | ||
| 17 | |||
| 18 | #define DRIVER_NAME "gptimer_example" | ||
| 19 | |||
| 20 | struct gptimer_data { | ||
| 21 | uint32_t period, width; | ||
| 22 | }; | ||
| 23 | static struct gptimer_data data; | ||
| 24 | |||
| 25 | /* ... random driver state ... */ | ||
| 26 | |||
| 27 | static irqreturn_t gptimer_example_irq(int irq, void *dev_id) | ||
| 28 | { | ||
| 29 | struct gptimer_data *data = dev_id; | ||
| 30 | |||
| 31 | /* make sure it was our timer which caused the interrupt */ | ||
| 32 | if (!get_gptimer_intr(TIMER5_id)) | ||
| 33 | return IRQ_NONE; | ||
| 34 | |||
| 35 | /* read the width/period values that were captured for the waveform */ | ||
| 36 | data->width = get_gptimer_pwidth(TIMER5_id); | ||
| 37 | data->period = get_gptimer_period(TIMER5_id); | ||
| 38 | |||
| 39 | /* acknowledge the interrupt */ | ||
| 40 | clear_gptimer_intr(TIMER5_id); | ||
| 41 | |||
| 42 | /* tell the upper layers we took care of things */ | ||
| 43 | return IRQ_HANDLED; | ||
| 44 | } | ||
| 45 | |||
| 46 | /* ... random driver code ... */ | ||
| 47 | |||
| 48 | static int __init gptimer_example_init(void) | ||
| 49 | { | ||
| 50 | int ret; | ||
| 51 | |||
| 52 | /* grab the peripheral pins */ | ||
| 53 | ret = peripheral_request(P_TMR5, DRIVER_NAME); | ||
| 54 | if (ret) { | ||
| 55 | printk(KERN_NOTICE DRIVER_NAME ": peripheral request failed\n"); | ||
| 56 | return ret; | ||
| 57 | } | ||
| 58 | |||
| 59 | /* grab the IRQ for the timer */ | ||
| 60 | ret = request_irq(IRQ_TIMER5, gptimer_example_irq, IRQF_SHARED, DRIVER_NAME, &data); | ||
| 61 | if (ret) { | ||
| 62 | printk(KERN_NOTICE DRIVER_NAME ": IRQ request failed\n"); | ||
| 63 | peripheral_free(P_TMR5); | ||
| 64 | return ret; | ||
| 65 | } | ||
| 66 | |||
| 67 | /* setup the timer and enable it */ | ||
| 68 | set_gptimer_config(TIMER5_id, WDTH_CAP | PULSE_HI | PERIOD_CNT | IRQ_ENA); | ||
| 69 | enable_gptimers(TIMER5bit); | ||
| 70 | |||
| 71 | return 0; | ||
| 72 | } | ||
| 73 | module_init(gptimer_example_init); | ||
| 74 | |||
| 75 | static void __exit gptimer_example_exit(void) | ||
| 76 | { | ||
| 77 | disable_gptimers(TIMER5bit); | ||
| 78 | free_irq(IRQ_TIMER5, &data); | ||
| 79 | peripheral_free(P_TMR5); | ||
| 80 | } | ||
| 81 | module_exit(gptimer_example_exit); | ||
| 82 | |||
| 83 | MODULE_LICENSE("BSD"); | ||
