Merge branch 'bugfixes' of git://git.linux-nfs.org/projects/trondmy/nfs-2.6
[pandora-kernel.git] / drivers / media / IR / ir-sysfs.c
index 46d4246..38423a8 100644 (file)
@@ -43,6 +43,7 @@ static struct {
        { IR_TYPE_RC6,          "rc-6"          },
        { IR_TYPE_JVC,          "jvc"           },
        { IR_TYPE_SONY,         "sony"          },
+       { IR_TYPE_RC5_SZ,       "rc-5-sz"       },
        { IR_TYPE_LIRC,         "lirc"          },
 };
 
@@ -67,6 +68,10 @@ static ssize_t show_protocols(struct device *d,
        char *tmp = buf;
        int i;
 
+       /* Device is being removed */
+       if (!ir_dev)
+               return -EINVAL;
+
        if (ir_dev->props && ir_dev->props->driver_type == RC_DRIVER_SCANCODE) {
                enabled = ir_dev->rc_tab.ir_type;
                allowed = ir_dev->props->allowed_protos;
@@ -122,6 +127,10 @@ static ssize_t store_protocols(struct device *d,
        int rc, i, count = 0;
        unsigned long flags;
 
+       /* Device is being removed */
+       if (!ir_dev)
+               return -EINVAL;
+
        if (ir_dev->props && ir_dev->props->driver_type == RC_DRIVER_SCANCODE)
                type = ir_dev->rc_tab.ir_type;
        else if (ir_dev->raw)
@@ -256,8 +265,6 @@ static struct device_type rc_dev_type = {
  */
 int ir_register_class(struct input_dev *input_dev)
 {
-       int rc;
-       const char *path;
        struct ir_input_dev *ir_dev = input_get_drvdata(input_dev);
        int devno = find_first_zero_bit(&ir_core_dev_number,
                                        IRRCV_NUM_DEVICES);
@@ -266,17 +273,28 @@ int ir_register_class(struct input_dev *input_dev)
                return devno;
 
        ir_dev->dev.type = &rc_dev_type;
+       ir_dev->devno = devno;
 
        ir_dev->dev.class = &ir_input_class;
        ir_dev->dev.parent = input_dev->dev.parent;
+       input_dev->dev.parent = &ir_dev->dev;
        dev_set_name(&ir_dev->dev, "rc%d", devno);
        dev_set_drvdata(&ir_dev->dev, ir_dev);
-       rc = device_register(&ir_dev->dev);
-       if (rc)
-               return rc;
+       return  device_register(&ir_dev->dev);
+};
+
+/**
+ * ir_register_input - registers ir input device with input subsystem
+ * @input_dev: the struct input_dev descriptor of the device
+ */
+
+int ir_register_input(struct input_dev *input_dev)
+{
+       struct ir_input_dev *ir_dev = input_get_drvdata(input_dev);
+       int rc;
+       const char *path;
 
 
-       input_dev->dev.parent = &ir_dev->dev;
        rc = input_register_device(input_dev);
        if (rc < 0) {
                device_del(&ir_dev->dev);
@@ -292,11 +310,9 @@ int ir_register_class(struct input_dev *input_dev)
                path ? path : "N/A");
        kfree(path);
 
-       ir_dev->devno = devno;
-       set_bit(devno, &ir_core_dev_number);
-
+       set_bit(ir_dev->devno, &ir_core_dev_number);
        return 0;
-};
+}
 
 /**
  * ir_unregister_class() - removes the sysfs for sysfs for
@@ -309,6 +325,7 @@ void ir_unregister_class(struct input_dev *input_dev)
 {
        struct ir_input_dev *ir_dev = input_get_drvdata(input_dev);
 
+       input_set_drvdata(input_dev, NULL);
        clear_bit(ir_dev->devno, &ir_core_dev_number);
        input_unregister_device(input_dev);
        device_del(&ir_dev->dev);