[media] ati_remote: switch to single-byte scancodes
[pandora-kernel.git] / drivers / media / rc / rc-main.c
index 3186ac7..666d4bb 100644 (file)
@@ -735,6 +735,7 @@ static struct {
        { RC_TYPE_JVC,          "jvc"           },
        { RC_TYPE_SONY,         "sony"          },
        { RC_TYPE_RC5_SZ,       "rc-5-sz"       },
+       { RC_TYPE_MCE_KBD,      "mce_kbd"       },
        { RC_TYPE_LIRC,         "lirc"          },
        { RC_TYPE_OTHER,        "other"         },
 };
@@ -927,10 +928,6 @@ out:
 
 static void rc_dev_release(struct device *device)
 {
-       struct rc_dev *dev = to_rc_dev(device);
-
-       kfree(dev);
-       module_put(THIS_MODULE);
 }
 
 #define ADD_HOTPLUG_VAR(fmt, val...)                                   \
@@ -944,6 +941,9 @@ static int rc_dev_uevent(struct device *device, struct kobj_uevent_env *env)
 {
        struct rc_dev *dev = to_rc_dev(device);
 
+       if (!dev || !dev->input_dev)
+               return -ENODEV;
+
        if (dev->rc_map.name)
                ADD_HOTPLUG_VAR("NAME=%s", dev->rc_map.name);
        if (dev->driver_name)
@@ -1012,10 +1012,16 @@ EXPORT_SYMBOL_GPL(rc_allocate_device);
 
 void rc_free_device(struct rc_dev *dev)
 {
-       if (dev) {
+       if (!dev)
+               return;
+
+       if (dev->input_dev)
                input_free_device(dev->input_dev);
-               put_device(&dev->dev);
-       }
+
+       put_device(&dev->dev);
+
+       kfree(dev);
+       module_put(THIS_MODULE);
 }
 EXPORT_SYMBOL_GPL(rc_free_device);
 
@@ -1099,7 +1105,6 @@ int rc_register_device(struct rc_dev *dev)
                if (rc < 0)
                        goto out_input;
        }
-       mutex_unlock(&dev->lock);
 
        if (dev->change_protocol) {
                rc = dev->change_protocol(dev, rc_map->rc_type);
@@ -1107,6 +1112,8 @@ int rc_register_device(struct rc_dev *dev)
                        goto out_raw;
        }
 
+       mutex_unlock(&dev->lock);
+
        IR_dprintk(1, "Registered rc%ld (driver: %s, remote: %s, mode %s)\n",
                   dev->devno,
                   dev->driver_name ? dev->driver_name : "unknown",
@@ -1141,14 +1148,18 @@ void rc_unregister_device(struct rc_dev *dev)
        if (dev->driver_type == RC_DRIVER_IR_RAW)
                ir_raw_event_unregister(dev);
 
+       /* Freeing the table should also call the stop callback */
+       ir_free_table(&dev->rc_map);
+       IR_dprintk(1, "Freed keycode table\n");
+
        input_unregister_device(dev->input_dev);
        dev->input_dev = NULL;
 
-       ir_free_table(&dev->rc_map);
-       IR_dprintk(1, "Freed keycode table\n");
+       device_del(&dev->dev);
 
-       device_unregister(&dev->dev);
+       rc_free_device(dev);
 }
+
 EXPORT_SYMBOL_GPL(rc_unregister_device);
 
 /*