diff --git a/drivers/media/IR/ir-sysfs.c b/drivers/media/IR/ir-sysfs.c index 005621d067f0d24f69ee22a7357aa5b1a9b311e9..f897c483e7bcaae2f9efdba08d3348847445b674 100644 --- a/drivers/media/IR/ir-sysfs.c +++ b/drivers/media/IR/ir-sysfs.c @@ -33,6 +33,18 @@ static struct class ir_input_class = { .devnode = ir_devnode, }; +static struct { + u64 type; + char *name; +} proto_names[] = { + { IR_TYPE_UNKNOWN, "unknown" }, + { IR_TYPE_RC5, "rc5" }, + { IR_TYPE_NEC, "nec" }, + { IR_TYPE_RC6, "rc6" }, + { IR_TYPE_JVC, "jvc" }, + { IR_TYPE_SONY, "sony" }, +}; + /** * show_protocols() - shows the current IR protocol(s) * @d: the device descriptor @@ -50,6 +62,7 @@ static ssize_t show_protocols(struct device *d, struct ir_input_dev *ir_dev = dev_get_drvdata(d); u64 allowed, enabled; char *tmp = buf; + int i; if (ir_dev->props->driver_type == RC_DRIVER_SCANCODE) { enabled = ir_dev->rc_tab.ir_type; @@ -63,35 +76,12 @@ static ssize_t show_protocols(struct device *d, (long long)allowed, (long long)enabled); - if (allowed & enabled & IR_TYPE_UNKNOWN) - tmp += sprintf(tmp, "[unknown] "); - else if (allowed & IR_TYPE_UNKNOWN) - tmp += sprintf(tmp, "unknown "); - - if (allowed & enabled & IR_TYPE_RC5) - tmp += sprintf(tmp, "[rc5] "); - else if (allowed & IR_TYPE_RC5) - tmp += sprintf(tmp, "rc5 "); - - if (allowed & enabled & IR_TYPE_NEC) - tmp += sprintf(tmp, "[nec] "); - else if (allowed & IR_TYPE_NEC) - tmp += sprintf(tmp, "nec "); - - if (allowed & enabled & IR_TYPE_RC6) - tmp += sprintf(tmp, "[rc6] "); - else if (allowed & IR_TYPE_RC6) - tmp += sprintf(tmp, "rc6 "); - - if (allowed & enabled & IR_TYPE_JVC) - tmp += sprintf(tmp, "[jvc] "); - else if (allowed & IR_TYPE_JVC) - tmp += sprintf(tmp, "jvc "); - - if (allowed & enabled & IR_TYPE_SONY) - tmp += sprintf(tmp, "[sony] "); - else if (allowed & IR_TYPE_SONY) - tmp += sprintf(tmp, "sony "); + for (i = 0; i < ARRAY_SIZE(proto_names); i++) { + if (allowed & enabled & proto_names[i].type) + tmp += sprintf(tmp, "[%s] ", proto_names[i].name); + else if (allowed & proto_names[i].type) + tmp += sprintf(tmp, "%s ", proto_names[i].name); + } if (tmp != buf) tmp--; @@ -124,12 +114,14 @@ static ssize_t store_protocols(struct device *d, const char *tmp; u64 type; u64 mask; - int rc; + int rc, i; unsigned long flags; tmp = skip_spaces(data); - - if (*tmp == '+') { + if (*tmp == '\0') { + IR_dprintk(1, "Protocol not specified\n"); + return -EINVAL; + } else if (*tmp == '+') { enable = true; disable = false; tmp++; @@ -142,25 +134,14 @@ static ssize_t store_protocols(struct device *d, disable = false; } - if (!strncasecmp(tmp, "unknown", 7)) { - tmp += 7; - mask = IR_TYPE_UNKNOWN; - } else if (!strncasecmp(tmp, "rc5", 3)) { - tmp += 3; - mask = IR_TYPE_RC5; - } else if (!strncasecmp(tmp, "nec", 3)) { - tmp += 3; - mask = IR_TYPE_NEC; - } else if (!strncasecmp(tmp, "rc6", 3)) { - tmp += 3; - mask = IR_TYPE_RC6; - } else if (!strncasecmp(tmp, "jvc", 3)) { - tmp += 3; - mask = IR_TYPE_JVC; - } else if (!strncasecmp(tmp, "sony", 4)) { - tmp += 4; - mask = IR_TYPE_SONY; - } else { + for (i = 0; i < ARRAY_SIZE(proto_names); i++) { + if (!strncasecmp(tmp, proto_names[i].name, strlen(proto_names[i].name))) { + tmp += strlen(proto_names[i].name); + mask = proto_names[i].type; + break; + } + } + if (i == ARRAY_SIZE(proto_names)) { IR_dprintk(1, "Unknown protocol\n"); return -EINVAL; }