summaryrefslogtreecommitdiff
blob: 2ac0c44b6362b7d23ac500e1e09ab950e257a20a (plain)
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");