On Tue, Mar 31, 2015 at 08:48:06PM +0300, Antti Seppälä wrote:
>From: James Hogan <ja...@albanarts.com>
>
>Add a callback to raw ir handlers for encoding and modulating a scancode
>to a set of raw events. This could be used for transmit, or for
>converting a wakeup scancode filter to a form that is more suitable for
>raw hardware wake up filters.
>
>Signed-off-by: James Hogan <ja...@albanarts.com>
>Signed-off-by: Antti Seppälä <a.sepp...@gmail.com>
>Cc: David Härdeman <da...@hardeman.nu>
>---
>
>Notes:
>    Changes in v3:
>     - Ported to apply against latest media-tree
>    
>    Changes in v2:
>     - Alter encode API to return -ENOBUFS when there isn't enough buffer
>       space. When this occurs all buffer contents must have been written
>       with the partial encoding of the scancode. This is to allow drivers
>       such as nuvoton-cir to provide a shorter buffer and still get a
>       useful partial encoding for the wakeup pattern.
>
> drivers/media/rc/rc-core-priv.h |  2 ++
> drivers/media/rc/rc-ir-raw.c    | 37 +++++++++++++++++++++++++++++++++++++
> include/media/rc-core.h         |  3 +++
> 3 files changed, 42 insertions(+)
>
>diff --git a/drivers/media/rc/rc-core-priv.h b/drivers/media/rc/rc-core-priv.h
>index b68d4f76..122c25f 100644
>--- a/drivers/media/rc/rc-core-priv.h
>+++ b/drivers/media/rc/rc-core-priv.h
>@@ -25,6 +25,8 @@ struct ir_raw_handler {
> 
>       u64 protocols; /* which are handled by this handler */
>       int (*decode)(struct rc_dev *dev, struct ir_raw_event event);
>+      int (*encode)(u64 protocols, const struct rc_scancode_filter *scancode,
>+                    struct ir_raw_event *events, unsigned int max);
> 
>       /* These two should only be used by the lirc decoder */
>       int (*raw_register)(struct rc_dev *dev);
>diff --git a/drivers/media/rc/rc-ir-raw.c b/drivers/media/rc/rc-ir-raw.c
>index b732ac6..dd47fe5 100644
>--- a/drivers/media/rc/rc-ir-raw.c
>+++ b/drivers/media/rc/rc-ir-raw.c
>@@ -246,6 +246,43 @@ static int change_protocol(struct rc_dev *dev, u64 
>*rc_type)
>       return 0;
> }
> 
>+/**
>+ * ir_raw_encode_scancode() - Encode a scancode as raw events
>+ *
>+ * @protocols:                permitted protocols
>+ * @scancode:         scancode filter describing a single scancode
>+ * @events:           array of raw events to write into
>+ * @max:              max number of raw events
>+ *
>+ * Attempts to encode the scancode as raw events.
>+ *
>+ * Returns:   The number of events written.
>+ *            -ENOBUFS if there isn't enough space in the array to fit the
>+ *            encoding. In this case all @max events will have been written.
>+ *            -EINVAL if the scancode is ambiguous or invalid, or if no
>+ *            compatible encoder was found.
>+ */
>+int ir_raw_encode_scancode(u64 protocols,

Why a bitmask of protocols and not a single protocol enum? What's the
use case for encoding a given scancode according to one out of a number
of protocols (and not even knowing which one)??

>+                         const struct rc_scancode_filter *scancode,
>+                         struct ir_raw_event *events, unsigned int max)
>+{
>+      struct ir_raw_handler *handler;
>+      int ret = -EINVAL;
>+
>+      mutex_lock(&ir_raw_handler_lock);
>+      list_for_each_entry(handler, &ir_raw_handler_list, list) {
>+              if (handler->protocols & protocols && handler->encode) {
>+                      ret = handler->encode(protocols, scancode, events, max);
>+                      if (ret >= 0 || ret == -ENOBUFS)
>+                              break;
>+              }
>+      }
>+      mutex_unlock(&ir_raw_handler_lock);
>+
>+      return ret;
>+}
>+EXPORT_SYMBOL(ir_raw_encode_scancode);
>+
> /*
>  * Used to (un)register raw event clients
>  */
>diff --git a/include/media/rc-core.h b/include/media/rc-core.h
>index 2c7fbca..5703c08 100644
>--- a/include/media/rc-core.h
>+++ b/include/media/rc-core.h
>@@ -250,6 +250,9 @@ int ir_raw_event_store_edge(struct rc_dev *dev, enum 
>raw_event_type type);
> int ir_raw_event_store_with_filter(struct rc_dev *dev,
>                               struct ir_raw_event *ev);
> void ir_raw_event_set_idle(struct rc_dev *dev, bool idle);
>+int ir_raw_encode_scancode(u64 protocols,
>+                         const struct rc_scancode_filter *scancode,
>+                         struct ir_raw_event *events, unsigned int max);
> 
> static inline void ir_raw_event_reset(struct rc_dev *dev)
> {
>-- 
>2.0.5
>

-- 
David Härdeman
--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to