1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
|
diff -Naur linux.orig/pcfclock.c linux/pcfclock.c
--- linux.orig/pcfclock.c 2004-05-17 18:26:12.000000000 +0200
+++ linux/pcfclock.c 2007-01-08 21:16:44.000000000 +0100
@@ -49,13 +49,18 @@
#include <linux/major.h>
#include <linux/fs.h>
#include <linux/sched.h>
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,18)
#include <linux/devfs_fs_kernel.h>
+#endif
#include <linux/string.h>
#include <linux/delay.h>
#include <linux/parport.h>
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
#include <linux/device.h>
#endif
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,17)
+#include <linux/moduleparam.h>
+#endif
#include <asm/uaccess.h>
#include <asm/semaphore.h>
@@ -93,6 +98,26 @@
static struct pcfclock_struct pcfclock_table[PCFCLOCK_NO];
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,17)
+# define CLASS_CREATE(owner, name) class_create(owner, name)
+# define CLASS_DESTROY(class) class_destroy(class)
+# define CLASS_DEVICE_CREATE(class, dev, device, fmt, rest) class_device_create(class, NULL, dev, device, fmt, rest)
+# define CLASS_DEVICE_DESTROY(class, dev) class_device_destroy(class, dev)
+static struct class *pcfclock_class;
+#elif LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,13)
+# define CLASS_CREATE(owner, name) class_create(owner, name)
+# define CLASS_DESTROY(class) class_destroy(class)
+# define CLASS_DEVICE_CREATE(class, dev, device, fmt, rest) class_device_create(class, dev, device, fmt, rest)
+# define CLASS_DEVICE_DESTROY(class, dev) class_device_destroy(class, dev)
+static struct class *pcfclock_class;
+#elif LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
+# define CLASS_CREATE(owner, name) class_simple_create(owner, name)
+# define CLASS_DESTROY(class) class_simple_destroy(class)
+# define CLASS_DEVICE_CREATE(class, dev, device, fmt, rest) class_simple_device_add(class, dev, device, fmt, rest)
+# define CLASS_DEVICE_DESTROY(class, dev) class_simple_device_remove(dev)
+static struct class_simple *pcfclock_class;
+#endif
+
/*
* The radio clock transmits data only to the PC when requested. While the
* time signal is received for the first time no communication between the PC
@@ -401,7 +426,11 @@
static int parport_nr[PCFCLOCK_NO] = {[0 ... PCFCLOCK_NO - 1] = PCFCLOCK_PARPORT_UNSPEC };
static char *parport[PCFCLOCK_NO] = { NULL, };
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,17)
+module_param_array(parport, charp, NULL, 0);
+#else
MODULE_PARM(parport, "1-" __MODULE_STRING(PCFCLOCK_NO) "s");
+#endif
#ifndef MODULE
static int __init
@@ -442,7 +471,10 @@
return 1;
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
+ CLASS_DEVICE_CREATE(pcfclock_class, MKDEV(PCFCLOCK_MAJOR, n), NULL, "pcfclock%d", n);
+# if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,18)
devfs_mk_cdev(MKDEV(PCFCLOCK_MAJOR, n), S_IFCHR | S_IRUGO, "pcfclocks/%d", n);
+# endif
#else
sprintf(name, "%d", n);
devfs_register(devfs_handle, name, DEVFS_FL_DEFAULT, PCFCLOCK_MAJOR, n, S_IFCHR | S_IRUGO,
@@ -509,7 +541,10 @@
printk(KERN_ERR "pcfclock: unable to get major %d\n", PCFCLOCK_MAJOR);
return -EIO;
}
+ pcfclock_class = CLASS_CREATE(THIS_MODULE, "pcfclock");
+# if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,18)
devfs_mk_dir("pcfclocks");
+# endif
#else
if (devfs_register_chrdev(PCFCLOCK_MAJOR, "pcfclock", &pcfclock_fops)) {
printk(KERN_ERR "pcfclock: unable to get major %d\n", PCFCLOCK_MAJOR);
@@ -563,10 +598,16 @@
for (n = 0; n < PCFCLOCK_NO; n++) {
if (pcfclock_table[n].dev != NULL) {
parport_unregister_device(pcfclock_table[n].dev);
+ CLASS_DEVICE_DESTROY(pcfclock_class, MKDEV(PCFCLOCK_MAJOR, n));
+# if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,18)
devfs_remove("pcfclocks/%d", n);
+# endif
}
}
+ CLASS_DESTROY(pcfclock_class);
+# if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,18)
devfs_remove("pcfclocks");
+# endif
#else
devfs_unregister(devfs_handle);
devfs_unregister_chrdev(PCFCLOCK_MAJOR, "pcfclock");
|