**************************************************************
*Registers the dev_t number in sysfs and 
*declares major during "one run only" class declaration
*NZG/MWelling
*09/19/2007
*EMAC.Inc
**************************************************************
diff -uprN linux-2.6.20-at92_e1.2/drivers/misc/classes/char/gpio_char.c linux-2.6.20.snap/drivers/misc/classes/char/gpio_char.c
--- linux-2.6.20-at92_e1.2/drivers/misc/classes/char/gpio_char.c	2007-09-19 15:52:41.000000000 -0400
+++ linux-2.6.20.snap/drivers/misc/classes/char/gpio_char.c	2007-09-18 17:57:33.000000000 -0400
@@ -38,10 +38,10 @@ struct gpio_char_dev {
 
 /* function prototypes */
 static int gpio_char_ioctl(struct inode *inode, struct file *file,
-        unsigned int cmd, unsigned long arg);
+		unsigned int cmd, unsigned long arg);
 static int gpio_char_open(struct inode *inode, struct file *file);
 static int gpio_char_release(struct inode *inode, struct file *file);
-static void gpio_char_setup_cdev(struct gpio_char_dev *dev);
+static int gpio_char_setup_cdev(struct gpio_char_dev *dev);
 
 /* struct for fops declarations */
 static const struct file_operations gpio_char_fops =
@@ -168,14 +168,14 @@ int gpio_char_init(void)
         gpio_major = MAJOR(dev);
     }
     if (result < 0)
-        printk(KERN_WARNING "gpio_char: can't get major %d\n", gpio_major);
+        printk(KERN_WARNING "gpio_char: can't get major %d, err %d\n", gpio_major,result);
     
     return result;
 }
 
 /* registers the actual char device, called by create when invoked by gpio class */
 
-static void gpio_char_setup_cdev(struct gpio_char_dev *dev)
+static int gpio_char_setup_cdev(struct gpio_char_dev *dev)
 {
     static int index = 0;
     int err, devno = MKDEV(gpio_major, gpio_minor + index);
@@ -190,6 +190,7 @@ static void gpio_char_setup_cdev(struct 
         printk(KERN_NOTICE "gpio_char: Error %d adding gpio_char%d\n", err, index);
     
     index++;
+    return devno;
 }
 
 /* create and register a new char device */
@@ -203,7 +204,6 @@ int gpio_char_create(struct gpio_s *gpio
         return -ENOMEM;
     }
     chardev->gpio = gpio;
-    gpio_char_setup_cdev(chardev);
     
-    return 0;
+    return gpio_char_setup_cdev(chardev);
 }
diff -uprN linux-2.6.20-at92_e1.2/drivers/misc/classes/gpio.c linux-2.6.20.snap/drivers/misc/classes/gpio.c
--- linux-2.6.20-at92_e1.2/drivers/misc/classes/gpio.c	2007-09-19 15:52:41.000000000 -0400
+++ linux-2.6.20.snap/drivers/misc/classes/gpio.c	2007-09-18 17:57:33.000000000 -0400
@@ -36,11 +36,11 @@ struct class *gpio_declare(void){
 	if(!gpioclass){
 		printk("registering GPIO class\n");
 		gpioclass=class_create(THIS_MODULE,"gpio");
-	}
 #ifdef CONFIG_GPIOCLASS_CHAR
-	gpio_char_init();
+		gpio_char_init();
 #endif
-return gpioclass;
+	}
+	return gpioclass;
 }
 
 /***************************************************************************
@@ -154,23 +154,26 @@ static CLASS_DEVICE_ATTR(index,S_IRUGO|S
 * class instantiation
 */
 struct class_device *gpio_register_class_device(gpio_t *gpio){		
-	struct class *gpio_master = gpio_declare();
-	struct class_device *dev = class_device_create(gpio_master, NULL, MKDEV(0, 0), NULL, gpio->name);
-	dev->class_data = gpio;
+struct class *gpio_master = gpio_declare();
+struct class_device *dev;	
+dev_t devnum = MKDEV(0, 0);
+
+#ifdef CONFIG_GPIOCLASS_CHAR
+devnum = gpio_char_create(gpio);
+#endif	
+	
+dev = class_device_create(gpio_master, NULL, devnum, NULL, gpio->name);
+dev->class_data = gpio;	
 
 #ifdef CONFIG_GPIOCLASS_SYSFS
 	if((gpio->ddr_write)&&(gpio->ddr_read))class_device_create_file(dev,&class_device_attr_ddr);
 	if((gpio->data_write)&&(gpio->data_read))class_device_create_file(dev,&class_device_attr_data);
 	if((gpio->index_write)&&(gpio->index_read))class_device_create_file(dev,&class_device_attr_index);
 #endif	 
-	 
+
 #ifdef CONFIG_GPIOCLASS_RTDM
 	rt_gpio_device_create(gpio);
 #endif
 
-#ifdef CONFIG_GPIOCLASS_CHAR
-	gpio_char_create(gpio);
-#endif
-
-	return dev;			
+return dev;			
 }
