[media] rc-core: add separate defines for protocol bitmaps and numbers
The RC_TYPE_* defines are currently used both where a single protocol is expected and where a bitmap of protocols is expected. Functions like rc_keydown() and functions which add/remove entries to the keytable want a single protocol. Future userspace APIs would also benefit from numeric protocols (rather than bitmap ones). Keytables are smaller if they can use a small(ish) integer rather than a bitmap. Other functions or struct members (e.g. allowed_protos, enabled_protocols, etc) accept multiple protocols and need a bitmap. Using different types reduces the risk of programmer error. Using a protocol enum whereever possible also makes for a more future-proof user-space API as we don't need to worry about a sufficient number of bits being available (e.g. in structs used for ioctl() calls). The use of both a number and a corresponding bit is dalso one in e.g. the input subsystem as well (see all the references to set/clear bit when changing keytables for example). This patch separate the different usages in preparation for upcoming patches. Where a single protocol is expected, enum rc_type is used; where one or more protocol(s) are expected, something like u64 is used. The patch has been rewritten so that the format of the sysfs "protocols" file is no longer altered (at the loss of some detail). The file itself should probably be deprecated in the future though. Signed-off-by: David Härdeman <david@hardeman.nu> Cc: Andy Walls <awalls@md.metrocast.net> Cc: Maxim Levitsky <maximlevitsky@gmail.com> Cc: Antti Palosaari <crope@iki.fi> Cc: Mike Isely <isely@pobox.com> Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
这个提交包含在:
@@ -784,7 +784,7 @@ static void ati_remote_rc_init(struct ati_remote *ati_remote)
|
||||
|
||||
rdev->priv = ati_remote;
|
||||
rdev->driver_type = RC_DRIVER_SCANCODE;
|
||||
rdev->allowed_protos = RC_TYPE_OTHER;
|
||||
rdev->allowed_protos = RC_BIT_OTHER;
|
||||
rdev->driver_name = "ati_remote";
|
||||
|
||||
rdev->open = ati_remote_rc_open;
|
||||
|
@@ -1046,7 +1046,7 @@ static int ene_probe(struct pnp_dev *pnp_dev, const struct pnp_device_id *id)
|
||||
learning_mode_force = false;
|
||||
|
||||
rdev->driver_type = RC_DRIVER_IR_RAW;
|
||||
rdev->allowed_protos = RC_TYPE_ALL;
|
||||
rdev->allowed_protos = RC_BIT_ALL;
|
||||
rdev->priv = dev;
|
||||
rdev->open = ene_open;
|
||||
rdev->close = ene_close;
|
||||
|
@@ -541,7 +541,7 @@ static int fintek_probe(struct pnp_dev *pdev, const struct pnp_device_id *dev_id
|
||||
/* Set up the rc device */
|
||||
rdev->priv = fintek;
|
||||
rdev->driver_type = RC_DRIVER_IR_RAW;
|
||||
rdev->allowed_protos = RC_TYPE_ALL;
|
||||
rdev->allowed_protos = RC_BIT_ALL;
|
||||
rdev->open = fintek_open;
|
||||
rdev->close = fintek_close;
|
||||
rdev->input_name = FINTEK_DESCRIPTION;
|
||||
|
@@ -95,7 +95,7 @@ static int __devinit gpio_ir_recv_probe(struct platform_device *pdev)
|
||||
if (pdata->allowed_protos)
|
||||
rcdev->allowed_protos = pdata->allowed_protos;
|
||||
else
|
||||
rcdev->allowed_protos = RC_TYPE_ALL;
|
||||
rcdev->allowed_protos = RC_BIT_ALL;
|
||||
rcdev->map_name = pdata->map_name ?: RC_MAP_EMPTY;
|
||||
|
||||
gpio_dev->rcdev = rcdev;
|
||||
|
@@ -499,7 +499,7 @@ static int __devinit iguanair_probe(struct usb_interface *intf,
|
||||
usb_to_input_id(ir->udev, &rc->input_id);
|
||||
rc->dev.parent = &intf->dev;
|
||||
rc->driver_type = RC_DRIVER_IR_RAW;
|
||||
rc->allowed_protos = RC_TYPE_ALL;
|
||||
rc->allowed_protos = RC_BIT_ALL;
|
||||
rc->priv = ir;
|
||||
rc->open = iguanair_open;
|
||||
rc->close = iguanair_close;
|
||||
|
@@ -1001,7 +1001,7 @@ static void imon_touch_display_timeout(unsigned long data)
|
||||
* it is not, so we must acquire it prior to calling send_packet, which
|
||||
* requires that the lock is held.
|
||||
*/
|
||||
static int imon_ir_change_protocol(struct rc_dev *rc, u64 rc_type)
|
||||
static int imon_ir_change_protocol(struct rc_dev *rc, u64 *rc_type)
|
||||
{
|
||||
int retval;
|
||||
struct imon_context *ictx = rc->priv;
|
||||
@@ -1010,31 +1010,27 @@ static int imon_ir_change_protocol(struct rc_dev *rc, u64 rc_type)
|
||||
unsigned char ir_proto_packet[] = {
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86 };
|
||||
|
||||
if (rc_type && !(rc_type & rc->allowed_protos))
|
||||
if (*rc_type && !(*rc_type & rc->allowed_protos))
|
||||
dev_warn(dev, "Looks like you're trying to use an IR protocol "
|
||||
"this device does not support\n");
|
||||
|
||||
switch (rc_type) {
|
||||
case RC_TYPE_RC6:
|
||||
if (*rc_type & RC_BIT_RC6_MCE) {
|
||||
dev_dbg(dev, "Configuring IR receiver for MCE protocol\n");
|
||||
ir_proto_packet[0] = 0x01;
|
||||
break;
|
||||
case RC_TYPE_UNKNOWN:
|
||||
case RC_TYPE_OTHER:
|
||||
*rc_type = RC_BIT_RC6_MCE;
|
||||
} else if (*rc_type & RC_BIT_OTHER) {
|
||||
dev_dbg(dev, "Configuring IR receiver for iMON protocol\n");
|
||||
if (!pad_stabilize)
|
||||
dev_dbg(dev, "PAD stabilize functionality disabled\n");
|
||||
/* ir_proto_packet[0] = 0x00; // already the default */
|
||||
rc_type = RC_TYPE_OTHER;
|
||||
break;
|
||||
default:
|
||||
*rc_type = RC_BIT_OTHER;
|
||||
} else {
|
||||
dev_warn(dev, "Unsupported IR protocol specified, overriding "
|
||||
"to iMON IR protocol\n");
|
||||
if (!pad_stabilize)
|
||||
dev_dbg(dev, "PAD stabilize functionality disabled\n");
|
||||
/* ir_proto_packet[0] = 0x00; // already the default */
|
||||
rc_type = RC_TYPE_OTHER;
|
||||
break;
|
||||
*rc_type = RC_BIT_OTHER;
|
||||
}
|
||||
|
||||
memcpy(ictx->usb_tx_buf, &ir_proto_packet, sizeof(ir_proto_packet));
|
||||
@@ -1048,7 +1044,7 @@ static int imon_ir_change_protocol(struct rc_dev *rc, u64 rc_type)
|
||||
if (retval)
|
||||
goto out;
|
||||
|
||||
ictx->rc_type = rc_type;
|
||||
ictx->rc_type = *rc_type;
|
||||
ictx->pad_mouse = false;
|
||||
|
||||
out:
|
||||
@@ -1323,7 +1319,7 @@ static void imon_pad_to_keys(struct imon_context *ictx, unsigned char *buf)
|
||||
rel_x = buf[2];
|
||||
rel_y = buf[3];
|
||||
|
||||
if (ictx->rc_type == RC_TYPE_OTHER && pad_stabilize) {
|
||||
if (ictx->rc_type == RC_BIT_OTHER && pad_stabilize) {
|
||||
if ((buf[1] == 0) && ((rel_x != 0) || (rel_y != 0))) {
|
||||
dir = stabilize((int)rel_x, (int)rel_y,
|
||||
timeout, threshold);
|
||||
@@ -1390,7 +1386,7 @@ static void imon_pad_to_keys(struct imon_context *ictx, unsigned char *buf)
|
||||
buf[0] = 0x01;
|
||||
buf[1] = buf[4] = buf[5] = buf[6] = buf[7] = 0;
|
||||
|
||||
if (ictx->rc_type == RC_TYPE_OTHER && pad_stabilize) {
|
||||
if (ictx->rc_type == RC_BIT_OTHER && pad_stabilize) {
|
||||
dir = stabilize((int)rel_x, (int)rel_y,
|
||||
timeout, threshold);
|
||||
if (!dir) {
|
||||
@@ -1511,7 +1507,7 @@ static void imon_incoming_packet(struct imon_context *ictx,
|
||||
kc = imon_panel_key_lookup(scancode);
|
||||
} else {
|
||||
scancode = be32_to_cpu(*((u32 *)buf));
|
||||
if (ictx->rc_type == RC_TYPE_RC6) {
|
||||
if (ictx->rc_type == RC_BIT_RC6_MCE) {
|
||||
ktype = IMON_KEY_IMON;
|
||||
if (buf[0] == 0x80)
|
||||
ktype = IMON_KEY_MCE;
|
||||
@@ -1744,7 +1740,7 @@ static void imon_get_ffdc_type(struct imon_context *ictx)
|
||||
{
|
||||
u8 ffdc_cfg_byte = ictx->usb_rx_buf[6];
|
||||
u8 detected_display_type = IMON_DISPLAY_TYPE_NONE;
|
||||
u64 allowed_protos = RC_TYPE_OTHER;
|
||||
u64 allowed_protos = RC_BIT_OTHER;
|
||||
|
||||
switch (ffdc_cfg_byte) {
|
||||
/* iMON Knob, no display, iMON IR + vol knob */
|
||||
@@ -1775,13 +1771,13 @@ static void imon_get_ffdc_type(struct imon_context *ictx)
|
||||
case 0x9e:
|
||||
dev_info(ictx->dev, "0xffdc iMON VFD, MCE IR");
|
||||
detected_display_type = IMON_DISPLAY_TYPE_VFD;
|
||||
allowed_protos = RC_TYPE_RC6;
|
||||
allowed_protos = RC_BIT_RC6_MCE;
|
||||
break;
|
||||
/* iMON LCD, MCE IR */
|
||||
case 0x9f:
|
||||
dev_info(ictx->dev, "0xffdc iMON LCD, MCE IR");
|
||||
detected_display_type = IMON_DISPLAY_TYPE_LCD;
|
||||
allowed_protos = RC_TYPE_RC6;
|
||||
allowed_protos = RC_BIT_RC6_MCE;
|
||||
break;
|
||||
default:
|
||||
dev_info(ictx->dev, "Unknown 0xffdc device, "
|
||||
@@ -1789,7 +1785,7 @@ static void imon_get_ffdc_type(struct imon_context *ictx)
|
||||
detected_display_type = IMON_DISPLAY_TYPE_VFD;
|
||||
/* We don't know which one it is, allow user to set the
|
||||
* RC6 one from userspace if OTHER wasn't correct. */
|
||||
allowed_protos |= RC_TYPE_RC6;
|
||||
allowed_protos |= RC_BIT_RC6_MCE;
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -1875,7 +1871,7 @@ static struct rc_dev *imon_init_rdev(struct imon_context *ictx)
|
||||
|
||||
rdev->priv = ictx;
|
||||
rdev->driver_type = RC_DRIVER_SCANCODE;
|
||||
rdev->allowed_protos = RC_TYPE_OTHER | RC_TYPE_RC6; /* iMON PAD or MCE */
|
||||
rdev->allowed_protos = RC_BIT_OTHER | RC_BIT_RC6_MCE; /* iMON PAD or MCE */
|
||||
rdev->change_protocol = imon_ir_change_protocol;
|
||||
rdev->driver_name = MOD_NAME;
|
||||
|
||||
@@ -1893,7 +1889,7 @@ static struct rc_dev *imon_init_rdev(struct imon_context *ictx)
|
||||
|
||||
imon_set_display_type(ictx);
|
||||
|
||||
if (ictx->rc_type == RC_TYPE_RC6)
|
||||
if (ictx->rc_type == RC_BIT_RC6_MCE)
|
||||
rdev->map_name = RC_MAP_IMON_MCE;
|
||||
else
|
||||
rdev->map_name = RC_MAP_IMON_PAD;
|
||||
|
@@ -47,7 +47,7 @@ static int ir_jvc_decode(struct rc_dev *dev, struct ir_raw_event ev)
|
||||
{
|
||||
struct jvc_dec *data = &dev->raw->jvc;
|
||||
|
||||
if (!(dev->raw->enabled_protocols & RC_TYPE_JVC))
|
||||
if (!(dev->raw->enabled_protocols & RC_BIT_JVC))
|
||||
return 0;
|
||||
|
||||
if (!is_timing_event(ev)) {
|
||||
@@ -174,7 +174,7 @@ out:
|
||||
}
|
||||
|
||||
static struct ir_raw_handler jvc_handler = {
|
||||
.protocols = RC_TYPE_JVC,
|
||||
.protocols = RC_BIT_JVC,
|
||||
.decode = ir_jvc_decode,
|
||||
};
|
||||
|
||||
|
@@ -35,7 +35,7 @@ static int ir_lirc_decode(struct rc_dev *dev, struct ir_raw_event ev)
|
||||
struct lirc_codec *lirc = &dev->raw->lirc;
|
||||
int sample;
|
||||
|
||||
if (!(dev->raw->enabled_protocols & RC_TYPE_LIRC))
|
||||
if (!(dev->raw->enabled_protocols & RC_BIT_LIRC))
|
||||
return 0;
|
||||
|
||||
if (!dev->raw->lirc.drv || !dev->raw->lirc.drv->rbuf)
|
||||
@@ -408,7 +408,7 @@ static int ir_lirc_unregister(struct rc_dev *dev)
|
||||
}
|
||||
|
||||
static struct ir_raw_handler lirc_handler = {
|
||||
.protocols = RC_TYPE_LIRC,
|
||||
.protocols = RC_BIT_LIRC,
|
||||
.decode = ir_lirc_decode,
|
||||
.raw_register = ir_lirc_register,
|
||||
.raw_unregister = ir_lirc_unregister,
|
||||
|
@@ -216,7 +216,7 @@ static int ir_mce_kbd_decode(struct rc_dev *dev, struct ir_raw_event ev)
|
||||
u32 scancode;
|
||||
unsigned long delay;
|
||||
|
||||
if (!(dev->raw->enabled_protocols & RC_TYPE_MCE_KBD))
|
||||
if (!(dev->raw->enabled_protocols & RC_BIT_MCE_KBD))
|
||||
return 0;
|
||||
|
||||
if (!is_timing_event(ev)) {
|
||||
@@ -422,7 +422,7 @@ static int ir_mce_kbd_unregister(struct rc_dev *dev)
|
||||
}
|
||||
|
||||
static struct ir_raw_handler mce_kbd_handler = {
|
||||
.protocols = RC_TYPE_MCE_KBD,
|
||||
.protocols = RC_BIT_MCE_KBD,
|
||||
.decode = ir_mce_kbd_decode,
|
||||
.raw_register = ir_mce_kbd_register,
|
||||
.raw_unregister = ir_mce_kbd_unregister,
|
||||
|
@@ -52,7 +52,7 @@ static int ir_nec_decode(struct rc_dev *dev, struct ir_raw_event ev)
|
||||
u8 address, not_address, command, not_command;
|
||||
bool send_32bits = false;
|
||||
|
||||
if (!(dev->raw->enabled_protocols & RC_TYPE_NEC))
|
||||
if (!(dev->raw->enabled_protocols & RC_BIT_NEC))
|
||||
return 0;
|
||||
|
||||
if (!is_timing_event(ev)) {
|
||||
@@ -201,7 +201,7 @@ static int ir_nec_decode(struct rc_dev *dev, struct ir_raw_event ev)
|
||||
}
|
||||
|
||||
static struct ir_raw_handler nec_handler = {
|
||||
.protocols = RC_TYPE_NEC,
|
||||
.protocols = RC_BIT_NEC,
|
||||
.decode = ir_nec_decode,
|
||||
};
|
||||
|
||||
|
@@ -52,8 +52,8 @@ static int ir_rc5_decode(struct rc_dev *dev, struct ir_raw_event ev)
|
||||
u8 toggle;
|
||||
u32 scancode;
|
||||
|
||||
if (!(dev->raw->enabled_protocols & RC_TYPE_RC5))
|
||||
return 0;
|
||||
if (!(dev->raw->enabled_protocols & (RC_BIT_RC5 | RC_BIT_RC5X)))
|
||||
return 0;
|
||||
|
||||
if (!is_timing_event(ev)) {
|
||||
if (ev.reset)
|
||||
@@ -128,6 +128,10 @@ again:
|
||||
if (data->wanted_bits == RC5X_NBITS) {
|
||||
/* RC5X */
|
||||
u8 xdata, command, system;
|
||||
if (!(dev->raw->enabled_protocols & RC_BIT_RC5X)) {
|
||||
data->state = STATE_INACTIVE;
|
||||
return 0;
|
||||
}
|
||||
xdata = (data->bits & 0x0003F) >> 0;
|
||||
command = (data->bits & 0x00FC0) >> 6;
|
||||
system = (data->bits & 0x1F000) >> 12;
|
||||
@@ -141,6 +145,10 @@ again:
|
||||
} else {
|
||||
/* RC5 */
|
||||
u8 command, system;
|
||||
if (!(dev->raw->enabled_protocols & RC_BIT_RC5)) {
|
||||
data->state = STATE_INACTIVE;
|
||||
return 0;
|
||||
}
|
||||
command = (data->bits & 0x0003F) >> 0;
|
||||
system = (data->bits & 0x007C0) >> 6;
|
||||
toggle = (data->bits & 0x00800) ? 1 : 0;
|
||||
@@ -164,7 +172,7 @@ out:
|
||||
}
|
||||
|
||||
static struct ir_raw_handler rc5_handler = {
|
||||
.protocols = RC_TYPE_RC5,
|
||||
.protocols = RC_BIT_RC5 | RC_BIT_RC5X,
|
||||
.decode = ir_rc5_decode,
|
||||
};
|
||||
|
||||
|
@@ -48,8 +48,8 @@ static int ir_rc5_sz_decode(struct rc_dev *dev, struct ir_raw_event ev)
|
||||
u8 toggle, command, system;
|
||||
u32 scancode;
|
||||
|
||||
if (!(dev->raw->enabled_protocols & RC_TYPE_RC5_SZ))
|
||||
return 0;
|
||||
if (!(dev->raw->enabled_protocols & RC_BIT_RC5_SZ))
|
||||
return 0;
|
||||
|
||||
if (!is_timing_event(ev)) {
|
||||
if (ev.reset)
|
||||
@@ -128,7 +128,7 @@ out:
|
||||
}
|
||||
|
||||
static struct ir_raw_handler rc5_sz_handler = {
|
||||
.protocols = RC_TYPE_RC5_SZ,
|
||||
.protocols = RC_BIT_RC5_SZ,
|
||||
.decode = ir_rc5_sz_decode,
|
||||
};
|
||||
|
||||
|
@@ -89,7 +89,9 @@ static int ir_rc6_decode(struct rc_dev *dev, struct ir_raw_event ev)
|
||||
u32 scancode;
|
||||
u8 toggle;
|
||||
|
||||
if (!(dev->raw->enabled_protocols & RC_TYPE_RC6))
|
||||
if (!(dev->raw->enabled_protocols &
|
||||
(RC_BIT_RC6_0 | RC_BIT_RC6_6A_20 | RC_BIT_RC6_6A_24 |
|
||||
RC_BIT_RC6_6A_32 | RC_BIT_RC6_MCE)))
|
||||
return 0;
|
||||
|
||||
if (!is_timing_event(ev)) {
|
||||
@@ -271,7 +273,9 @@ out:
|
||||
}
|
||||
|
||||
static struct ir_raw_handler rc6_handler = {
|
||||
.protocols = RC_TYPE_RC6,
|
||||
.protocols = RC_BIT_RC6_0 | RC_BIT_RC6_6A_20 |
|
||||
RC_BIT_RC6_6A_24 | RC_BIT_RC6_6A_32 |
|
||||
RC_BIT_RC6_MCE,
|
||||
.decode = ir_rc6_decode,
|
||||
};
|
||||
|
||||
|
@@ -58,7 +58,7 @@ static int ir_sanyo_decode(struct rc_dev *dev, struct ir_raw_event ev)
|
||||
u32 scancode;
|
||||
u8 address, command, not_command;
|
||||
|
||||
if (!(dev->raw->enabled_protocols & RC_TYPE_SANYO))
|
||||
if (!(dev->raw->enabled_protocols & RC_BIT_SANYO))
|
||||
return 0;
|
||||
|
||||
if (!is_timing_event(ev)) {
|
||||
@@ -179,7 +179,7 @@ static int ir_sanyo_decode(struct rc_dev *dev, struct ir_raw_event ev)
|
||||
}
|
||||
|
||||
static struct ir_raw_handler sanyo_handler = {
|
||||
.protocols = RC_TYPE_SANYO,
|
||||
.protocols = RC_BIT_SANYO,
|
||||
.decode = ir_sanyo_decode,
|
||||
};
|
||||
|
||||
|
@@ -45,7 +45,8 @@ static int ir_sony_decode(struct rc_dev *dev, struct ir_raw_event ev)
|
||||
u32 scancode;
|
||||
u8 device, subdevice, function;
|
||||
|
||||
if (!(dev->raw->enabled_protocols & RC_TYPE_SONY))
|
||||
if (!(dev->raw->enabled_protocols &
|
||||
(RC_BIT_SONY12 | RC_BIT_SONY15 | RC_BIT_SONY20)))
|
||||
return 0;
|
||||
|
||||
if (!is_timing_event(ev)) {
|
||||
@@ -123,16 +124,28 @@ static int ir_sony_decode(struct rc_dev *dev, struct ir_raw_event ev)
|
||||
|
||||
switch (data->count) {
|
||||
case 12:
|
||||
if (!(dev->raw->enabled_protocols & RC_BIT_SONY12)) {
|
||||
data->state = STATE_INACTIVE;
|
||||
return 0;
|
||||
}
|
||||
device = bitrev8((data->bits << 3) & 0xF8);
|
||||
subdevice = 0;
|
||||
function = bitrev8((data->bits >> 4) & 0xFE);
|
||||
break;
|
||||
case 15:
|
||||
if (!(dev->raw->enabled_protocols & RC_BIT_SONY15)) {
|
||||
data->state = STATE_INACTIVE;
|
||||
return 0;
|
||||
}
|
||||
device = bitrev8((data->bits >> 0) & 0xFF);
|
||||
subdevice = 0;
|
||||
function = bitrev8((data->bits >> 7) & 0xFE);
|
||||
break;
|
||||
case 20:
|
||||
if (!(dev->raw->enabled_protocols & RC_BIT_SONY20)) {
|
||||
data->state = STATE_INACTIVE;
|
||||
return 0;
|
||||
}
|
||||
device = bitrev8((data->bits >> 5) & 0xF8);
|
||||
subdevice = bitrev8((data->bits >> 0) & 0xFF);
|
||||
function = bitrev8((data->bits >> 12) & 0xFE);
|
||||
@@ -157,7 +170,7 @@ out:
|
||||
}
|
||||
|
||||
static struct ir_raw_handler sony_handler = {
|
||||
.protocols = RC_TYPE_SONY,
|
||||
.protocols = RC_BIT_SONY12 | RC_BIT_SONY15 | RC_BIT_SONY20,
|
||||
.decode = ir_sony_decode,
|
||||
};
|
||||
|
||||
|
@@ -1563,7 +1563,7 @@ static int ite_probe(struct pnp_dev *pdev, const struct pnp_device_id
|
||||
/* set up ir-core props */
|
||||
rdev->priv = itdev;
|
||||
rdev->driver_type = RC_DRIVER_IR_RAW;
|
||||
rdev->allowed_protos = RC_TYPE_ALL;
|
||||
rdev->allowed_protos = RC_BIT_ALL;
|
||||
rdev->open = ite_open;
|
||||
rdev->close = ite_close;
|
||||
rdev->s_idle = ite_s_idle;
|
||||
|
@@ -121,7 +121,7 @@ static struct rc_map_list imon_mce_map = {
|
||||
.scan = imon_mce,
|
||||
.size = ARRAY_SIZE(imon_mce),
|
||||
/* its RC6, but w/a hardware decoder */
|
||||
.rc_type = RC_TYPE_RC6,
|
||||
.rc_type = RC_TYPE_RC6_MCE,
|
||||
.name = RC_MAP_IMON_MCE,
|
||||
}
|
||||
};
|
||||
|
@@ -97,7 +97,7 @@ static struct rc_map_list rc6_mce_map = {
|
||||
.map = {
|
||||
.scan = rc6_mce,
|
||||
.size = ARRAY_SIZE(rc6_mce),
|
||||
.rc_type = RC_TYPE_RC6,
|
||||
.rc_type = RC_TYPE_RC6_MCE,
|
||||
.name = RC_MAP_RC6_MCE,
|
||||
}
|
||||
};
|
||||
|
@@ -1205,7 +1205,7 @@ static struct rc_dev *mceusb_init_rc_dev(struct mceusb_dev *ir)
|
||||
rc->dev.parent = dev;
|
||||
rc->priv = ir;
|
||||
rc->driver_type = RC_DRIVER_IR_RAW;
|
||||
rc->allowed_protos = RC_TYPE_ALL;
|
||||
rc->allowed_protos = RC_BIT_ALL;
|
||||
rc->timeout = MS_TO_NS(100);
|
||||
if (!ir->flags.no_tx) {
|
||||
rc->s_tx_mask = mceusb_set_tx_mask;
|
||||
|
@@ -1045,7 +1045,7 @@ static int nvt_probe(struct pnp_dev *pdev, const struct pnp_device_id *dev_id)
|
||||
/* Set up the rc device */
|
||||
rdev->priv = nvt;
|
||||
rdev->driver_type = RC_DRIVER_IR_RAW;
|
||||
rdev->allowed_protos = RC_TYPE_ALL;
|
||||
rdev->allowed_protos = RC_BIT_ALL;
|
||||
rdev->open = nvt_open;
|
||||
rdev->close = nvt_close;
|
||||
rdev->tx_ir = nvt_tx_ir;
|
||||
|
@@ -195,7 +195,7 @@ static int __init loop_init(void)
|
||||
rc->map_name = RC_MAP_EMPTY;
|
||||
rc->priv = &loopdev;
|
||||
rc->driver_type = RC_DRIVER_IR_RAW;
|
||||
rc->allowed_protos = RC_TYPE_ALL;
|
||||
rc->allowed_protos = RC_BIT_ALL;
|
||||
rc->timeout = 100 * 1000 * 1000; /* 100 ms */
|
||||
rc->min_timeout = 1;
|
||||
rc->max_timeout = UINT_MAX;
|
||||
|
@@ -725,25 +725,36 @@ static struct class ir_input_class = {
|
||||
.devnode = ir_devnode,
|
||||
};
|
||||
|
||||
/*
|
||||
* These are the protocol textual descriptions that are
|
||||
* used by the sysfs protocols file. Note that the order
|
||||
* of the entries is relevant.
|
||||
*/
|
||||
static struct {
|
||||
u64 type;
|
||||
char *name;
|
||||
} proto_names[] = {
|
||||
{ RC_TYPE_UNKNOWN, "unknown" },
|
||||
{ RC_TYPE_RC5, "rc-5" },
|
||||
{ RC_TYPE_NEC, "nec" },
|
||||
{ RC_TYPE_RC6, "rc-6" },
|
||||
{ RC_TYPE_JVC, "jvc" },
|
||||
{ RC_TYPE_SONY, "sony" },
|
||||
{ RC_TYPE_RC5_SZ, "rc-5-sz" },
|
||||
{ RC_TYPE_SANYO, "sanyo" },
|
||||
{ RC_TYPE_MCE_KBD, "mce_kbd" },
|
||||
{ RC_TYPE_LIRC, "lirc" },
|
||||
{ RC_TYPE_OTHER, "other" },
|
||||
{ RC_BIT_NONE, "none" },
|
||||
{ RC_BIT_OTHER, "other" },
|
||||
{ RC_BIT_UNKNOWN, "unknown" },
|
||||
{ RC_BIT_RC5 |
|
||||
RC_BIT_RC5X, "rc-5" },
|
||||
{ RC_BIT_NEC, "nec" },
|
||||
{ RC_BIT_RC6_0 |
|
||||
RC_BIT_RC6_6A_20 |
|
||||
RC_BIT_RC6_6A_24 |
|
||||
RC_BIT_RC6_6A_32 |
|
||||
RC_BIT_RC6_MCE, "rc-6" },
|
||||
{ RC_BIT_JVC, "jvc" },
|
||||
{ RC_BIT_SONY12 |
|
||||
RC_BIT_SONY15 |
|
||||
RC_BIT_SONY20, "sony" },
|
||||
{ RC_BIT_RC5_SZ, "rc-5-sz" },
|
||||
{ RC_BIT_SANYO, "sanyo" },
|
||||
{ RC_BIT_MCE_KBD, "mce_kbd" },
|
||||
{ RC_BIT_LIRC, "lirc" },
|
||||
};
|
||||
|
||||
#define PROTO_NONE "none"
|
||||
|
||||
/**
|
||||
* show_protocols() - shows the current IR protocol(s)
|
||||
* @device: the device descriptor
|
||||
@@ -790,6 +801,9 @@ static ssize_t show_protocols(struct device *device,
|
||||
tmp += sprintf(tmp, "[%s] ", proto_names[i].name);
|
||||
else if (allowed & proto_names[i].type)
|
||||
tmp += sprintf(tmp, "%s ", proto_names[i].name);
|
||||
|
||||
if (allowed & proto_names[i].type)
|
||||
allowed &= ~proto_names[i].type;
|
||||
}
|
||||
|
||||
if (tmp != buf)
|
||||
@@ -867,26 +881,20 @@ static ssize_t store_protocols(struct device *device,
|
||||
disable = false;
|
||||
}
|
||||
|
||||
if (!enable && !disable && !strncasecmp(tmp, PROTO_NONE, sizeof(PROTO_NONE))) {
|
||||
tmp += sizeof(PROTO_NONE);
|
||||
mask = 0;
|
||||
count++;
|
||||
} else {
|
||||
for (i = 0; i < ARRAY_SIZE(proto_names); i++) {
|
||||
if (!strcasecmp(tmp, proto_names[i].name)) {
|
||||
tmp += strlen(proto_names[i].name);
|
||||
mask = proto_names[i].type;
|
||||
break;
|
||||
}
|
||||
for (i = 0; i < ARRAY_SIZE(proto_names); i++) {
|
||||
if (!strcasecmp(tmp, proto_names[i].name)) {
|
||||
mask = proto_names[i].type;
|
||||
break;
|
||||
}
|
||||
if (i == ARRAY_SIZE(proto_names)) {
|
||||
IR_dprintk(1, "Unknown protocol: '%s'\n", tmp);
|
||||
ret = -EINVAL;
|
||||
goto out;
|
||||
}
|
||||
count++;
|
||||
}
|
||||
|
||||
if (i == ARRAY_SIZE(proto_names)) {
|
||||
IR_dprintk(1, "Unknown protocol: '%s'\n", tmp);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
count++;
|
||||
|
||||
if (enable)
|
||||
type |= mask;
|
||||
else if (disable)
|
||||
@@ -902,7 +910,7 @@ static ssize_t store_protocols(struct device *device,
|
||||
}
|
||||
|
||||
if (dev->change_protocol) {
|
||||
rc = dev->change_protocol(dev, type);
|
||||
rc = dev->change_protocol(dev, &type);
|
||||
if (rc < 0) {
|
||||
IR_dprintk(1, "Error setting protocols to 0x%llx\n",
|
||||
(long long)type);
|
||||
@@ -1117,7 +1125,8 @@ int rc_register_device(struct rc_dev *dev)
|
||||
}
|
||||
|
||||
if (dev->change_protocol) {
|
||||
rc = dev->change_protocol(dev, rc_map->rc_type);
|
||||
u64 rc_type = (1 << rc_map->rc_type);
|
||||
rc = dev->change_protocol(dev, &rc_type);
|
||||
if (rc < 0)
|
||||
goto out_raw;
|
||||
}
|
||||
|
@@ -1082,7 +1082,7 @@ static struct rc_dev *redrat3_init_rc_dev(struct redrat3_dev *rr3)
|
||||
rc->dev.parent = dev;
|
||||
rc->priv = rr3;
|
||||
rc->driver_type = RC_DRIVER_IR_RAW;
|
||||
rc->allowed_protos = RC_TYPE_ALL;
|
||||
rc->allowed_protos = RC_BIT_ALL;
|
||||
rc->timeout = US_TO_NS(2750);
|
||||
rc->tx_ir = redrat3_transmit_ir;
|
||||
rc->s_tx_carrier = redrat3_set_tx_carrier;
|
||||
|
@@ -322,7 +322,7 @@ static struct rc_dev *streamzap_init_rc_dev(struct streamzap_ir *sz)
|
||||
rdev->dev.parent = dev;
|
||||
rdev->priv = sz;
|
||||
rdev->driver_type = RC_DRIVER_IR_RAW;
|
||||
rdev->allowed_protos = RC_TYPE_ALL;
|
||||
rdev->allowed_protos = RC_BIT_ALL;
|
||||
rdev->driver_name = DRIVER_NAME;
|
||||
rdev->map_name = RC_MAP_STREAMZAP;
|
||||
|
||||
|
@@ -316,7 +316,7 @@ static int __devinit ttusbir_probe(struct usb_interface *intf,
|
||||
usb_to_input_id(tt->udev, &rc->input_id);
|
||||
rc->dev.parent = &intf->dev;
|
||||
rc->driver_type = RC_DRIVER_IR_RAW;
|
||||
rc->allowed_protos = RC_TYPE_ALL;
|
||||
rc->allowed_protos = RC_BIT_ALL;
|
||||
rc->priv = tt;
|
||||
rc->driver_name = DRIVER_NAME;
|
||||
rc->map_name = RC_MAP_TT_1500;
|
||||
|
@@ -1022,7 +1022,7 @@ wbcir_probe(struct pnp_dev *device, const struct pnp_device_id *dev_id)
|
||||
data->dev->priv = data;
|
||||
data->dev->dev.parent = &device->dev;
|
||||
data->dev->timeout = MS_TO_NS(100);
|
||||
data->dev->allowed_protos = RC_TYPE_ALL;
|
||||
data->dev->allowed_protos = RC_BIT_ALL;
|
||||
|
||||
if (!request_region(data->wbase, WAKEUP_IOMEM_LEN, DRVNAME)) {
|
||||
dev_err(dev, "Region 0x%lx-0x%lx already in use!\n",
|
||||
|
在新工单中引用
屏蔽一个用户