Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Blackfin: add an example showing how to use the gptimers API

Signed-off-by: Mike Frysinger <vapier@gentoo.org>

+89
+6
Documentation/blackfin/Makefile
··· 1 + obj-m := gptimers-example.o 2 + 3 + all: modules 4 + 5 + modules clean: 6 + $(MAKE) -C ../.. SUBDIRS=$(PWD) $@
+83
Documentation/blackfin/gptimers-example.c
··· 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");