Listing 1. my_module.c

#include <linux/init.h>
#include <linux/fs.h>
#include <linux/module.h>
#include <linux/sched.h>
#include <linux/interrupt.h>

static struct file_operations fops;
static int Major, irq = 7;

static void OurISR (int irq, void *device,
                    struct pt_regs *regs)
{
  /* important and immediate time critical tasks */
}

static int __init my_init_module(void)
{
    int status;
    Major = register_chrdev(0, "OurDevice", &fops);

    if (Major == -1) {
        printk (" Dynamic Major number "
                "allocation failed\n");
        return Major;
    }

    status = request_irq(irq,
                         (void *)OurISR,
                         SA_INTERRUPT,
                         "OurDevice", &fops);
    if (status == -EBUSY) {
        printk ("IRQ number allocation failed\n");
        unregister_chrdev(Major, "OurDevice");
        return status;
    }

    printk ("The module is successfully loaded\n");
    printk ("Major number for OurDevice:   %d\n",
            Major);
    printk ("IRQ number for OurDevice:     %d\n",
            irq);
    return 0;
}

static void __exit my_cleanup_module (void)
{
    printk("Major number %d  IRQ number %d "
            "are released\n", Major, irq);
    free_irq(irq, &fops);
    unregister_chrdev(Major, "OurDevice");
    printk("The Module is successfully unloaded\n");
}

module_init (my_init_module);
module_exit (my_cleanup_module);

MODULE_LICENSE("GPL");

