1 | #include <linux/module.h>
|
2 | #include <linux/kernel.h>
|
3 | #include <linux/init.h>
|
4 | #include <asm/io.h>
|
5 | #include <asm/uaccess.h>
|
6 |
|
7 | #include "ssvirq.h"
|
8 |
|
9 | static volatile unsigned long ssvirq_count = 0;
|
10 | static unsigned long *ssvirq_userptr = NULL;
|
11 | static int ssvirq_used = 0, irqnr = SSVIRQ_IRQNUMBER;
|
12 | .
|
13 | .
|
14 | .
|
15 |
|
16 | /* load kernel module - insmod ssvirq.o... */
|
17 | static int __init ssvirq_init(void) {
|
18 |
|
19 | AT91PS_SYS AT91_SYS = (AT91PS_SYS) AT91C_VA_BASE_SYS;
|
20 |
|
21 | /* change Source Mode Register for
|
22 | AIC entry 25 to positive edge triggered */
|
23 | AT91_SYS->AIC_SMR[25] = (0x3 << 5);
|
24 | /* PIO function disable - enable IRQ0 pin */
|
25 | AT91_SYS->PIOB_PDR = (1 << 29);
|
26 |
|
27 | /* register irq handler */
|
28 | if (request_irq(irqnr, ssvirq_interrupt, SA_INTERRUPT,
|
29 | "ssvirq", NULL)) {
|
30 | printk(KERN_ERR "ssvirq: can't get assigned irq %i\n", irqnr);
|
31 | return -EIO;
|
32 | }
|
33 |
|
34 | /* register character device handler */
|
35 | if (register_chrdev(SSVIRQ_MAJOR,"ssvirq",&ssvirq_fops)) {
|
36 | printk(KERN_ERR "ssvirq: unable to get major %d\n", SSVIRQ_MAJOR);
|
37 | free_irq(irqnr, NULL);
|
38 | return -EIO;
|
39 | }
|
40 |
|
41 | printk(KERN_INFO "ssvirq module installed.\n");
|
42 |
|
43 | return 0;
|
44 | }
|
45 |
|
46 | /* unload kernel module - rmmod ssvirq... */
|
47 | static void __exit ssvirq_cleanup(void) {
|
48 |
|
49 | /* unregister irq handler */
|
50 | free_irq(irqnr, NULL);
|
51 | /* unregister character device handler */
|
52 | unregister_chrdev(SSVIRQ_MAJOR, "ssvirq");
|
53 | printk(KERN_INFO "ssvirq module removed.\n");
|
54 | }
|
55 |
|
56 | EXPORT_NO_SYMBOLS;
|
57 |
|
58 | module_init(ssvirq_init);
|
59 | module_exit(ssvirq_cleanup);
|