All of lore.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.