|
@@ -1585,20 +1585,24 @@ struct rc_dev *rc_allocate_device(enum rc_driver_type type)
|
|
if (!dev)
|
|
if (!dev)
|
|
return NULL;
|
|
return NULL;
|
|
|
|
|
|
- dev->input_dev = input_allocate_device();
|
|
|
|
- if (!dev->input_dev) {
|
|
|
|
- kfree(dev);
|
|
|
|
- return NULL;
|
|
|
|
- }
|
|
|
|
|
|
+ if (type != RC_DRIVER_IR_RAW_TX) {
|
|
|
|
+ dev->input_dev = input_allocate_device();
|
|
|
|
+ if (!dev->input_dev) {
|
|
|
|
+ kfree(dev);
|
|
|
|
+ return NULL;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ dev->input_dev->getkeycode = ir_getkeycode;
|
|
|
|
+ dev->input_dev->setkeycode = ir_setkeycode;
|
|
|
|
+ input_set_drvdata(dev->input_dev, dev);
|
|
|
|
|
|
- dev->input_dev->getkeycode = ir_getkeycode;
|
|
|
|
- dev->input_dev->setkeycode = ir_setkeycode;
|
|
|
|
- input_set_drvdata(dev->input_dev, dev);
|
|
|
|
|
|
+ setup_timer(&dev->timer_keyup, ir_timer_keyup,
|
|
|
|
+ (unsigned long)dev);
|
|
|
|
|
|
- spin_lock_init(&dev->rc_map.lock);
|
|
|
|
- spin_lock_init(&dev->keylock);
|
|
|
|
|
|
+ spin_lock_init(&dev->rc_map.lock);
|
|
|
|
+ spin_lock_init(&dev->keylock);
|
|
|
|
+ }
|
|
mutex_init(&dev->lock);
|
|
mutex_init(&dev->lock);
|
|
- setup_timer(&dev->timer_keyup, ir_timer_keyup, (unsigned long)dev);
|
|
|
|
|
|
|
|
dev->dev.type = &rc_dev_type;
|
|
dev->dev.type = &rc_dev_type;
|
|
dev->dev.class = &rc_class;
|
|
dev->dev.class = &rc_class;
|
|
@@ -1727,7 +1731,7 @@ out_table:
|
|
|
|
|
|
static void rc_free_rx_device(struct rc_dev *dev)
|
|
static void rc_free_rx_device(struct rc_dev *dev)
|
|
{
|
|
{
|
|
- if (!dev)
|
|
|
|
|
|
+ if (!dev || dev->driver_type == RC_DRIVER_IR_RAW_TX)
|
|
return;
|
|
return;
|
|
|
|
|
|
ir_free_table(&dev->rc_map);
|
|
ir_free_table(&dev->rc_map);
|
|
@@ -1757,7 +1761,8 @@ int rc_register_device(struct rc_dev *dev)
|
|
atomic_set(&dev->initialized, 0);
|
|
atomic_set(&dev->initialized, 0);
|
|
|
|
|
|
dev->dev.groups = dev->sysfs_groups;
|
|
dev->dev.groups = dev->sysfs_groups;
|
|
- dev->sysfs_groups[attr++] = &rc_dev_protocol_attr_grp;
|
|
|
|
|
|
+ if (dev->driver_type != RC_DRIVER_IR_RAW_TX)
|
|
|
|
+ dev->sysfs_groups[attr++] = &rc_dev_protocol_attr_grp;
|
|
if (dev->s_filter)
|
|
if (dev->s_filter)
|
|
dev->sysfs_groups[attr++] = &rc_dev_filter_attr_grp;
|
|
dev->sysfs_groups[attr++] = &rc_dev_filter_attr_grp;
|
|
if (dev->s_wakeup_filter)
|
|
if (dev->s_wakeup_filter)
|
|
@@ -1773,11 +1778,14 @@ int rc_register_device(struct rc_dev *dev)
|
|
dev->input_name ?: "Unspecified device", path ?: "N/A");
|
|
dev->input_name ?: "Unspecified device", path ?: "N/A");
|
|
kfree(path);
|
|
kfree(path);
|
|
|
|
|
|
- rc = rc_setup_rx_device(dev);
|
|
|
|
- if (rc)
|
|
|
|
- goto out_dev;
|
|
|
|
|
|
+ if (dev->driver_type != RC_DRIVER_IR_RAW_TX) {
|
|
|
|
+ rc = rc_setup_rx_device(dev);
|
|
|
|
+ if (rc)
|
|
|
|
+ goto out_dev;
|
|
|
|
+ }
|
|
|
|
|
|
- if (dev->driver_type == RC_DRIVER_IR_RAW) {
|
|
|
|
|
|
+ if (dev->driver_type == RC_DRIVER_IR_RAW ||
|
|
|
|
+ dev->driver_type == RC_DRIVER_IR_RAW_TX) {
|
|
if (!raw_init) {
|
|
if (!raw_init) {
|
|
request_module_nowait("ir-lirc-codec");
|
|
request_module_nowait("ir-lirc-codec");
|
|
raw_init = true;
|
|
raw_init = true;
|