Commit ab93ce06 authored by Sifan Naeem's avatar Sifan Naeem Committed by Mauro Carvalho Chehab
Browse files

[media] rc: img-ir: add scancode requests to a struct



The information being requested of hardware decode callbacks through
the img-ir-hw scancode API is mounting up, so combine it into a struct
which can be passed in with a single pointer rather than multiple
pointer arguments. This allows it to be extended more easily without
touching all the hardware decode callbacks.

Signed-off-by: default avatarSifan Naeem <sifan.naeem@imgtec.com>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@osg.samsung.com>
parent 32e63f03
Loading
Loading
Loading
Loading
+9 −7
Original line number Diff line number Diff line
@@ -806,20 +806,22 @@ static void img_ir_handle_data(struct img_ir_priv *priv, u32 len, u64 raw)
	struct img_ir_priv_hw *hw = &priv->hw;
	const struct img_ir_decoder *dec = hw->decoder;
	int ret = IMG_IR_SCANCODE;
	u32 scancode;
	enum rc_type protocol = RC_TYPE_UNKNOWN;
	struct img_ir_scancode_req request;

	request.protocol = RC_TYPE_UNKNOWN;

	if (dec->scancode)
		ret = dec->scancode(len, raw, &protocol, &scancode, hw->enabled_protocols);
		ret = dec->scancode(len, raw, hw->enabled_protocols, &request);
	else if (len >= 32)
		scancode = (u32)raw;
		request.scancode = (u32)raw;
	else if (len < 32)
		scancode = (u32)raw & ((1 << len)-1);
		request.scancode = (u32)raw & ((1 << len)-1);
	dev_dbg(priv->dev, "data (%u bits) = %#llx\n",
		len, (unsigned long long)raw);
	if (ret == IMG_IR_SCANCODE) {
		dev_dbg(priv->dev, "decoded scan code %#x\n", scancode);
		rc_keydown(hw->rdev, protocol, scancode, 0);
		dev_dbg(priv->dev, "decoded scan code %#x\n",
			request.scancode);
		rc_keydown(hw->rdev, request.protocol, request.scancode, 0);
		img_ir_end_repeat(priv);
	} else if (ret == IMG_IR_REPEATCODE) {
		if (hw->mode == IMG_IR_M_REPEATING) {
+14 −2
Original line number Diff line number Diff line
@@ -132,6 +132,18 @@ struct img_ir_timing_regvals {
#define IMG_IR_SCANCODE		0	/* new scancode */
#define IMG_IR_REPEATCODE	1	/* repeat the previous code */

/**
 * struct img_ir_scancode_req - Scancode request data.
 * @protocol:	Protocol code of received message (defaults to
 *		RC_TYPE_UNKNOWN).
 * @scancode:	Scan code of received message (must be written by
 *		handler if IMG_IR_SCANCODE is returned).
 */
struct img_ir_scancode_req {
	enum rc_type protocol;
	u32 scancode;
};

/**
 * struct img_ir_decoder - Decoder settings for an IR protocol.
 * @type:	Protocol types bitmap.
@@ -162,8 +174,8 @@ struct img_ir_decoder {
	struct img_ir_control		control;

	/* scancode logic */
	int (*scancode)(int len, u64 raw, enum rc_type *protocol,
			u32 *scancode, u64 enabled_protocols);
	int (*scancode)(int len, u64 raw, u64 enabled_protocols,
			struct img_ir_scancode_req *request);
	int (*filter)(const struct rc_scancode_filter *in,
		      struct img_ir_filter *out, u64 protocols);
};
+4 −4
Original line number Diff line number Diff line
@@ -12,8 +12,8 @@
#include "img-ir-hw.h"

/* Convert JVC data to a scancode */
static int img_ir_jvc_scancode(int len, u64 raw, enum rc_type *protocol,
			       u32 *scancode, u64 enabled_protocols)
static int img_ir_jvc_scancode(int len, u64 raw, u64 enabled_protocols,
			       struct img_ir_scancode_req *request)
{
	unsigned int cust, data;

@@ -23,8 +23,8 @@ static int img_ir_jvc_scancode(int len, u64 raw, enum rc_type *protocol,
	cust = (raw >> 0) & 0xff;
	data = (raw >> 8) & 0xff;

	*protocol = RC_TYPE_JVC;
	*scancode = cust << 8 | data;
	request->protocol = RC_TYPE_JVC;
	request->scancode = cust << 8 | data;
	return IMG_IR_SCANCODE;
}

+12 −12
Original line number Diff line number Diff line
@@ -13,8 +13,8 @@
#include <linux/bitrev.h>

/* Convert NEC data to a scancode */
static int img_ir_nec_scancode(int len, u64 raw, enum rc_type *protocol,
			       u32 *scancode, u64 enabled_protocols)
static int img_ir_nec_scancode(int len, u64 raw, u64 enabled_protocols,
			       struct img_ir_scancode_req *request)
{
	unsigned int addr, addr_inv, data, data_inv;
	/* a repeat code has no data */
@@ -30,23 +30,23 @@ static int img_ir_nec_scancode(int len, u64 raw, enum rc_type *protocol,
	if ((data_inv ^ data) != 0xff) {
		/* 32-bit NEC (used by Apple and TiVo remotes) */
		/* scan encoding: as transmitted, MSBit = first received bit */
		*scancode = bitrev8(addr)     << 24 |
		request->scancode = bitrev8(addr)     << 24 |
				bitrev8(addr_inv) << 16 |
				bitrev8(data)     <<  8 |
				bitrev8(data_inv);
	} else if ((addr_inv ^ addr) != 0xff) {
		/* Extended NEC */
		/* scan encoding: AAaaDD */
		*scancode = addr     << 16 |
		request->scancode = addr     << 16 |
				addr_inv <<  8 |
				data;
	} else {
		/* Normal NEC */
		/* scan encoding: AADD */
		*scancode = addr << 8 |
		request->scancode = addr << 8 |
				data;
	}
	*protocol = RC_TYPE_NEC;
	request->protocol = RC_TYPE_NEC;
	return IMG_IR_SCANCODE;
}

+4 −4
Original line number Diff line number Diff line
@@ -23,8 +23,8 @@
#include "img-ir-hw.h"

/* Convert Sanyo data to a scancode */
static int img_ir_sanyo_scancode(int len, u64 raw, enum rc_type *protocol,
				 u32 *scancode, u64 enabled_protocols)
static int img_ir_sanyo_scancode(int len, u64 raw, u64 enabled_protocols,
				 struct img_ir_scancode_req *request)
{
	unsigned int addr, addr_inv, data, data_inv;
	/* a repeat code has no data */
@@ -44,8 +44,8 @@ static int img_ir_sanyo_scancode(int len, u64 raw, enum rc_type *protocol,
		return -EINVAL;

	/* Normal Sanyo */
	*protocol = RC_TYPE_SANYO;
	*scancode = addr << 8 | data;
	request->protocol = RC_TYPE_SANYO;
	request->scancode = addr << 8 | data;
	return IMG_IR_SCANCODE;
}

Loading