aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/rc/rc-main.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/media/rc/rc-main.c')
-rw-r--r--drivers/media/rc/rc-main.c29
1 files changed, 19 insertions, 10 deletions
diff --git a/drivers/media/rc/rc-main.c b/drivers/media/rc/rc-main.c
index 51a23f48bc7..666d4bb5b1f 100644
--- a/drivers/media/rc/rc-main.c
+++ b/drivers/media/rc/rc-main.c
@@ -928,10 +928,6 @@ out:
928 928
929static void rc_dev_release(struct device *device) 929static void rc_dev_release(struct device *device)
930{ 930{
931 struct rc_dev *dev = to_rc_dev(device);
932
933 kfree(dev);
934 module_put(THIS_MODULE);
935} 931}
936 932
937#define ADD_HOTPLUG_VAR(fmt, val...) \ 933#define ADD_HOTPLUG_VAR(fmt, val...) \
@@ -945,6 +941,9 @@ static int rc_dev_uevent(struct device *device, struct kobj_uevent_env *env)
945{ 941{
946 struct rc_dev *dev = to_rc_dev(device); 942 struct rc_dev *dev = to_rc_dev(device);
947 943
944 if (!dev || !dev->input_dev)
945 return -ENODEV;
946
948 if (dev->rc_map.name) 947 if (dev->rc_map.name)
949 ADD_HOTPLUG_VAR("NAME=%s", dev->rc_map.name); 948 ADD_HOTPLUG_VAR("NAME=%s", dev->rc_map.name);
950 if (dev->driver_name) 949 if (dev->driver_name)
@@ -1013,10 +1012,16 @@ EXPORT_SYMBOL_GPL(rc_allocate_device);
1013 1012
1014void rc_free_device(struct rc_dev *dev) 1013void rc_free_device(struct rc_dev *dev)
1015{ 1014{
1016 if (dev) { 1015 if (!dev)
1016 return;
1017
1018 if (dev->input_dev)
1017 input_free_device(dev->input_dev); 1019 input_free_device(dev->input_dev);
1018 put_device(&dev->dev); 1020
1019 } 1021 put_device(&dev->dev);
1022
1023 kfree(dev);
1024 module_put(THIS_MODULE);
1020} 1025}
1021EXPORT_SYMBOL_GPL(rc_free_device); 1026EXPORT_SYMBOL_GPL(rc_free_device);
1022 1027
@@ -1143,14 +1148,18 @@ void rc_unregister_device(struct rc_dev *dev)
1143 if (dev->driver_type == RC_DRIVER_IR_RAW) 1148 if (dev->driver_type == RC_DRIVER_IR_RAW)
1144 ir_raw_event_unregister(dev); 1149 ir_raw_event_unregister(dev);
1145 1150
1151 /* Freeing the table should also call the stop callback */
1152 ir_free_table(&dev->rc_map);
1153 IR_dprintk(1, "Freed keycode table\n");
1154
1146 input_unregister_device(dev->input_dev); 1155 input_unregister_device(dev->input_dev);
1147 dev->input_dev = NULL; 1156 dev->input_dev = NULL;
1148 1157
1149 ir_free_table(&dev->rc_map); 1158 device_del(&dev->dev);
1150 IR_dprintk(1, "Freed keycode table\n");
1151 1159
1152 device_unregister(&dev->dev); 1160 rc_free_device(dev);
1153} 1161}
1162
1154EXPORT_SYMBOL_GPL(rc_unregister_device); 1163EXPORT_SYMBOL_GPL(rc_unregister_device);
1155 1164
1156/* 1165/*