public inbox for linux-media@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH 4/4] ir-core: allow specifying multiple protocols at one open/write
       [not found] <cover.1277744236.git.mchehab@redhat.com>
@ 2010-06-28 16:59 ` Mauro Carvalho Chehab
  2010-06-28 16:59 ` [PATCH 3/4] ir-core: Add support for disabling all protocols Mauro Carvalho Chehab
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 4+ messages in thread
From: Mauro Carvalho Chehab @ 2010-06-28 16:59 UTC (permalink / raw)
  Cc: Linux Media Mailing List

With this change, it is now possible to do something like:
        su -c 'echo "none +rc-5 +nec" > /sys/class/rc/rc1/protocols'

This prevents the need of multiple opens, one for each protocol change,
and makes userspace application easier.

Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>

diff --git a/drivers/media/IR/ir-sysfs.c b/drivers/media/IR/ir-sysfs.c
index db8c7f4..e538f16 100644
--- a/drivers/media/IR/ir-sysfs.c
+++ b/drivers/media/IR/ir-sysfs.c
@@ -117,61 +117,62 @@ static ssize_t store_protocols(struct device *d,
 	const char *tmp;
 	u64 type;
 	u64 mask;
-	int rc, i;
+	int rc, i, count = 0;
 	unsigned long flags;
 
-	tmp = skip_spaces(data);
-	if (*tmp == '\0') {
-		IR_dprintk(1, "Protocol not specified\n");
-		return -EINVAL;
-	} else if (*tmp == '+') {
-		enable = true;
-		disable = false;
-		tmp++;
-	} else if (*tmp == '-') {
-		enable = false;
-		disable = true;
-		tmp++;
-	} else {
-		enable = false;
-		disable = false;
-	}
-
-
-	if (!enable && !disable && !strncasecmp(tmp, PROTO_NONE, sizeof(PROTO_NONE))) {
-		mask = 0;
-		tmp += sizeof(PROTO_NONE);
-	} 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;
-		}
-	}
-
-	tmp = skip_spaces(tmp);
-	if (*tmp != '\0') {
-		IR_dprintk(1, "Invalid trailing characters\n");
-		return -EINVAL;
-	}
-
 	if (ir_dev->props->driver_type == RC_DRIVER_SCANCODE)
 		type = ir_dev->rc_tab.ir_type;
 	else
 		type = ir_dev->raw->enabled_protocols;
 
-	if (enable)
-		type |= mask;
-	else if (disable)
-		type &= ~mask;
-	else
-		type = mask;
+	while ((tmp = strsep((char **) &data, " \n")) != NULL) {
+		if (!*tmp)
+			break;
+
+		if (*tmp == '+') {
+			enable = true;
+			disable = false;
+			tmp++;
+		} else if (*tmp == '-') {
+			enable = false;
+			disable = true;
+			tmp++;
+		} else {
+			enable = false;
+			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 (!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: '%s'\n", tmp);
+				return -EINVAL;
+			}
+			count++;
+		}
+
+		if (enable)
+			type |= mask;
+		else if (disable)
+			type &= ~mask;
+		else
+			type = mask;
+	}
+
+	if (!count) {
+		IR_dprintk(1, "Protocol not specified\n");
+		return -EINVAL;
+	}
 
 	if (ir_dev->props && ir_dev->props->change_protocol) {
 		rc = ir_dev->props->change_protocol(ir_dev->props->priv,
@@ -191,7 +192,6 @@ static ssize_t store_protocols(struct device *d,
 		ir_dev->raw->enabled_protocols = type;
 	}
 
-
 	IR_dprintk(1, "Current protocol(s): 0x%llx\n",
 		   (long long)type);
 
-- 
1.7.1


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* [PATCH 3/4] ir-core: Add support for disabling all protocols
       [not found] <cover.1277744236.git.mchehab@redhat.com>
  2010-06-28 16:59 ` [PATCH 4/4] ir-core: allow specifying multiple protocols at one open/write Mauro Carvalho Chehab
@ 2010-06-28 16:59 ` Mauro Carvalho Chehab
  2010-06-28 16:59 ` [PATCH 2/4] ir-core: Rename sysfs protocols nomenclature to rc-5 and rc-6 Mauro Carvalho Chehab
  2010-06-28 17:00 ` [PATCH 1/4] ir-core: Remove magic numbers at the sysfs logic Mauro Carvalho Chehab
  3 siblings, 0 replies; 4+ messages in thread
From: Mauro Carvalho Chehab @ 2010-06-28 16:59 UTC (permalink / raw)
  Cc: Linux Media Mailing List

Writing "none" to /dev/class/rc/rc*/protocols will disable all protocols.
This allows an easier setup, from userspace, as userspace applications don't
need to disable protocol per protocol, before enabling a different set of
protocols.

Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>

diff --git a/drivers/media/IR/ir-sysfs.c b/drivers/media/IR/ir-sysfs.c
index 9a464a3..db8c7f4 100644
--- a/drivers/media/IR/ir-sysfs.c
+++ b/drivers/media/IR/ir-sysfs.c
@@ -45,6 +45,8 @@ static struct {
 	{ IR_TYPE_SONY,		"sony"		},
 };
 
+#define PROTO_NONE	"none"
+
 /**
  * show_protocols() - shows the current IR protocol(s)
  * @d:		the device descriptor
@@ -101,6 +103,7 @@ static ssize_t show_protocols(struct device *d,
  * Writing "+proto" will add a protocol to the list of enabled protocols.
  * Writing "-proto" will remove a protocol from the list of enabled protocols.
  * Writing "proto" will enable only "proto".
+ * Writing "none" will disable all protocols.
  * Returns -EINVAL if an invalid protocol combination or unknown protocol name
  * is used, otherwise @len.
  */
@@ -134,16 +137,22 @@ static ssize_t store_protocols(struct device *d,
 		disable = false;
 	}
 
-	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 (!enable && !disable && !strncasecmp(tmp, PROTO_NONE, sizeof(PROTO_NONE))) {
+		mask = 0;
+		tmp += sizeof(PROTO_NONE);
+	} 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;
 		}
-	}
-	if (i == ARRAY_SIZE(proto_names)) {
-		IR_dprintk(1, "Unknown protocol\n");
-		return -EINVAL;
 	}
 
 	tmp = skip_spaces(tmp);
-- 
1.7.1



^ permalink raw reply related	[flat|nested] 4+ messages in thread

* [PATCH 2/4] ir-core: Rename sysfs protocols nomenclature to rc-5 and rc-6
       [not found] <cover.1277744236.git.mchehab@redhat.com>
  2010-06-28 16:59 ` [PATCH 4/4] ir-core: allow specifying multiple protocols at one open/write Mauro Carvalho Chehab
  2010-06-28 16:59 ` [PATCH 3/4] ir-core: Add support for disabling all protocols Mauro Carvalho Chehab
@ 2010-06-28 16:59 ` Mauro Carvalho Chehab
  2010-06-28 17:00 ` [PATCH 1/4] ir-core: Remove magic numbers at the sysfs logic Mauro Carvalho Chehab
  3 siblings, 0 replies; 4+ messages in thread
From: Mauro Carvalho Chehab @ 2010-06-28 16:59 UTC (permalink / raw)
  Cc: Linux Media Mailing List

While rc-5 and rc-6 protocols are generally abreviated as "rc5" and "rc6",
previous sysfs nodes uses rc-5 and rc-6 for the Philips protocols. This is
consistent with the protocol nomenclature given by the original Philips
spec: "Remote control system RC-5" (doc. Nr. 9398 706 23011).
Also, rc5 is the name of a widely known cryptography protocol.

So, the better is to keep referring to those protocols as "rc-5" and "rc-6".

Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>

diff --git a/drivers/media/IR/ir-sysfs.c b/drivers/media/IR/ir-sysfs.c
index 2b1a9d2..9a464a3 100644
--- a/drivers/media/IR/ir-sysfs.c
+++ b/drivers/media/IR/ir-sysfs.c
@@ -38,9 +38,9 @@ static struct {
 	char	*name;
 } proto_names[] = {
 	{ IR_TYPE_UNKNOWN,	"unknown"	},
-	{ IR_TYPE_RC5,		"rc5"		},
+	{ IR_TYPE_RC5,		"rc-5"		},
 	{ IR_TYPE_NEC,		"nec"		},
-	{ IR_TYPE_RC6,		"rc6"		},
+	{ IR_TYPE_RC6,		"rc-6"		},
 	{ IR_TYPE_JVC,		"jvc"		},
 	{ IR_TYPE_SONY,		"sony"		},
 };
-- 
1.7.1



^ permalink raw reply related	[flat|nested] 4+ messages in thread

* [PATCH 1/4] ir-core: Remove magic numbers at the sysfs logic
       [not found] <cover.1277744236.git.mchehab@redhat.com>
                   ` (2 preceding siblings ...)
  2010-06-28 16:59 ` [PATCH 2/4] ir-core: Rename sysfs protocols nomenclature to rc-5 and rc-6 Mauro Carvalho Chehab
@ 2010-06-28 17:00 ` Mauro Carvalho Chehab
  3 siblings, 0 replies; 4+ messages in thread
From: Mauro Carvalho Chehab @ 2010-06-28 17:00 UTC (permalink / raw)
  Cc: Linux Media Mailing List

Instead of using "magic" sizes for protocol names, replace them by an
array, and use strlen().

No functional changes.

Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>

diff --git a/drivers/media/IR/ir-sysfs.c b/drivers/media/IR/ir-sysfs.c
index f73e4a6..2b1a9d2 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;
 	}
-- 
1.7.1



^ permalink raw reply related	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2010-06-28 17:00 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
     [not found] <cover.1277744236.git.mchehab@redhat.com>
2010-06-28 16:59 ` [PATCH 4/4] ir-core: allow specifying multiple protocols at one open/write Mauro Carvalho Chehab
2010-06-28 16:59 ` [PATCH 3/4] ir-core: Add support for disabling all protocols Mauro Carvalho Chehab
2010-06-28 16:59 ` [PATCH 2/4] ir-core: Rename sysfs protocols nomenclature to rc-5 and rc-6 Mauro Carvalho Chehab
2010-06-28 17:00 ` [PATCH 1/4] ir-core: Remove magic numbers at the sysfs logic Mauro Carvalho Chehab

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox