diff -Naur pcfclock-0.44.orig/linux/pcfclock.c pcfclock-0.44/linux/pcfclock.c
--- pcfclock-0.44.orig/linux/pcfclock.c	2004-05-17 18:26:12.000000000 +0200
+++ pcfclock-0.44/linux/pcfclock.c	2008-10-27 00:16:45.607110512 +0100
@@ -49,16 +49,25 @@
 #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>
+#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,26)
 #include <asm/semaphore.h>
+#else
+#include <linux/semaphore.h>
+#endif
 
 /* Major device number */
 #define PCFCLOCK_MAJOR 181
@@ -93,6 +102,38 @@
 
 static struct pcfclock_struct pcfclock_table[PCFCLOCK_NO];
 
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27)
+#  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) device_create(class, device, dev, NULL, fmt, rest)
+#  define CLASS_DEVICE_DESTROY(class, dev) device_destroy(class, dev)
+static struct class *pcfclock_class;
+#elif LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,26)
+#  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) device_create(class, device, dev, fmt, rest)
+#  define CLASS_DEVICE_DESTROY(class, dev) device_destroy(class, dev)
+static struct class *pcfclock_class;
+#elif 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 +442,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 +487,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 +557,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 +614,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");