linux/Documentation/blackfin/gptimers-example.c
<<
>>
Prefs
   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#ifdef IRQ_TIMER5
  21#define SAMPLE_IRQ_TIMER IRQ_TIMER5
  22#else
  23#define SAMPLE_IRQ_TIMER IRQ_TIMER2
  24#endif
  25
  26struct gptimer_data {
  27        uint32_t period, width;
  28};
  29static struct gptimer_data data;
  30
  31/* ... random driver state ... */
  32
  33static irqreturn_t gptimer_example_irq(int irq, void *dev_id)
  34{
  35        struct gptimer_data *data = dev_id;
  36
  37        /* make sure it was our timer which caused the interrupt */
  38        if (!get_gptimer_intr(TIMER5_id))
  39                return IRQ_NONE;
  40
  41        /* read the width/period values that were captured for the waveform */
  42        data->width = get_gptimer_pwidth(TIMER5_id);
  43        data->period = get_gptimer_period(TIMER5_id);
  44
  45        /* acknowledge the interrupt */
  46        clear_gptimer_intr(TIMER5_id);
  47
  48        /* tell the upper layers we took care of things */
  49        return IRQ_HANDLED;
  50}
  51
  52/* ... random driver code ... */
  53
  54static int __init gptimer_example_init(void)
  55{
  56        int ret;
  57
  58        /* grab the peripheral pins */
  59        ret = peripheral_request(P_TMR5, DRIVER_NAME);
  60        if (ret) {
  61                printk(KERN_NOTICE DRIVER_NAME ": peripheral request failed\n");
  62                return ret;
  63        }
  64
  65        /* grab the IRQ for the timer */
  66        ret = request_irq(SAMPLE_IRQ_TIMER, gptimer_example_irq,
  67                        IRQF_SHARED, DRIVER_NAME, &data);
  68        if (ret) {
  69                printk(KERN_NOTICE DRIVER_NAME ": IRQ request failed\n");
  70                peripheral_free(P_TMR5);
  71                return ret;
  72        }
  73
  74        /* setup the timer and enable it */
  75        set_gptimer_config(TIMER5_id,
  76                        WDTH_CAP | PULSE_HI | PERIOD_CNT | IRQ_ENA);
  77        enable_gptimers(TIMER5bit);
  78
  79        return 0;
  80}
  81module_init(gptimer_example_init);
  82
  83static void __exit gptimer_example_exit(void)
  84{
  85        disable_gptimers(TIMER5bit);
  86        free_irq(SAMPLE_IRQ_TIMER, &data);
  87        peripheral_free(P_TMR5);
  88}
  89module_exit(gptimer_example_exit);
  90
  91MODULE_LICENSE("BSD");
  92