Merge branch 'xen/xenbus' into upstream/xen
[pandora-kernel.git] / 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");