aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/media/rc/img-ir/img-ir-hw.c16
-rw-r--r--drivers/media/rc/img-ir/img-ir-hw.h16
-rw-r--r--drivers/media/rc/img-ir/img-ir-jvc.c8
-rw-r--r--drivers/media/rc/img-ir/img-ir-nec.c24
-rw-r--r--drivers/media/rc/img-ir/img-ir-sanyo.c8
-rw-r--r--drivers/media/rc/img-ir/img-ir-sharp.c8
-rw-r--r--drivers/media/rc/img-ir/img-ir-sony.c12
7 files changed, 53 insertions, 39 deletions
diff --git a/drivers/media/rc/img-ir/img-ir-hw.c b/drivers/media/rc/img-ir/img-ir-hw.c
index 2fd47c9bf5d8..88fada5dd238 100644
--- a/drivers/media/rc/img-ir/img-ir-hw.c
+++ b/drivers/media/rc/img-ir/img-ir-hw.c
@@ -806,20 +806,22 @@ static void img_ir_handle_data(struct img_ir_priv *priv, u32 len, u64 raw)
806 struct img_ir_priv_hw *hw = &priv->hw; 806 struct img_ir_priv_hw *hw = &priv->hw;
807 const struct img_ir_decoder *dec = hw->decoder; 807 const struct img_ir_decoder *dec = hw->decoder;
808 int ret = IMG_IR_SCANCODE; 808 int ret = IMG_IR_SCANCODE;
809 u32 scancode; 809 struct img_ir_scancode_req request;
810 enum rc_type protocol = RC_TYPE_UNKNOWN; 810
811 request.protocol = RC_TYPE_UNKNOWN;
811 812
812 if (dec->scancode) 813 if (dec->scancode)
813 ret = dec->scancode(len, raw, &protocol, &scancode, hw->enabled_protocols); 814 ret = dec->scancode(len, raw, hw->enabled_protocols, &request);
814 else if (len >= 32) 815 else if (len >= 32)
815 scancode = (u32)raw; 816 request.scancode = (u32)raw;
816 else if (len < 32) 817 else if (len < 32)
817 scancode = (u32)raw & ((1 << len)-1); 818 request.scancode = (u32)raw & ((1 << len)-1);
818 dev_dbg(priv->dev, "data (%u bits) = %#llx\n", 819 dev_dbg(priv->dev, "data (%u bits) = %#llx\n",
819 len, (unsigned long long)raw); 820 len, (unsigned long long)raw);
820 if (ret == IMG_IR_SCANCODE) { 821 if (ret == IMG_IR_SCANCODE) {
821 dev_dbg(priv->dev, "decoded scan code %#x\n", scancode); 822 dev_dbg(priv->dev, "decoded scan code %#x\n",
822 rc_keydown(hw->rdev, protocol, scancode, 0); 823 request.scancode);
824 rc_keydown(hw->rdev, request.protocol, request.scancode, 0);
823 img_ir_end_repeat(priv); 825 img_ir_end_repeat(priv);
824 } else if (ret == IMG_IR_REPEATCODE) { 826 } else if (ret == IMG_IR_REPEATCODE) {
825 if (hw->mode == IMG_IR_M_REPEATING) { 827 if (hw->mode == IMG_IR_M_REPEATING) {
diff --git a/drivers/media/rc/img-ir/img-ir-hw.h b/drivers/media/rc/img-ir/img-ir-hw.h
index 5c2b216c5fe3..aeef3d1dd30d 100644
--- a/drivers/media/rc/img-ir/img-ir-hw.h
+++ b/drivers/media/rc/img-ir/img-ir-hw.h
@@ -133,6 +133,18 @@ struct img_ir_timing_regvals {
133#define IMG_IR_REPEATCODE 1 /* repeat the previous code */ 133#define IMG_IR_REPEATCODE 1 /* repeat the previous code */
134 134
135/** 135/**
136 * struct img_ir_scancode_req - Scancode request data.
137 * @protocol: Protocol code of received message (defaults to
138 * RC_TYPE_UNKNOWN).
139 * @scancode: Scan code of received message (must be written by
140 * handler if IMG_IR_SCANCODE is returned).
141 */
142struct img_ir_scancode_req {
143 enum rc_type protocol;
144 u32 scancode;
145};
146
147/**
136 * struct img_ir_decoder - Decoder settings for an IR protocol. 148 * struct img_ir_decoder - Decoder settings for an IR protocol.
137 * @type: Protocol types bitmap. 149 * @type: Protocol types bitmap.
138 * @tolerance: Timing tolerance as a percentage (default 10%). 150 * @tolerance: Timing tolerance as a percentage (default 10%).
@@ -162,8 +174,8 @@ struct img_ir_decoder {
162 struct img_ir_control control; 174 struct img_ir_control control;
163 175
164 /* scancode logic */ 176 /* scancode logic */
165 int (*scancode)(int len, u64 raw, enum rc_type *protocol, 177 int (*scancode)(int len, u64 raw, u64 enabled_protocols,
166 u32 *scancode, u64 enabled_protocols); 178 struct img_ir_scancode_req *request);
167 int (*filter)(const struct rc_scancode_filter *in, 179 int (*filter)(const struct rc_scancode_filter *in,
168 struct img_ir_filter *out, u64 protocols); 180 struct img_ir_filter *out, u64 protocols);
169}; 181};
diff --git a/drivers/media/rc/img-ir/img-ir-jvc.c b/drivers/media/rc/img-ir/img-ir-jvc.c
index a60dda8bf706..d3e2fc0bcfe1 100644
--- a/drivers/media/rc/img-ir/img-ir-jvc.c
+++ b/drivers/media/rc/img-ir/img-ir-jvc.c
@@ -12,8 +12,8 @@
12#include "img-ir-hw.h" 12#include "img-ir-hw.h"
13 13
14/* Convert JVC data to a scancode */ 14/* Convert JVC data to a scancode */
15static int img_ir_jvc_scancode(int len, u64 raw, enum rc_type *protocol, 15static int img_ir_jvc_scancode(int len, u64 raw, u64 enabled_protocols,
16 u32 *scancode, u64 enabled_protocols) 16 struct img_ir_scancode_req *request)
17{ 17{
18 unsigned int cust, data; 18 unsigned int cust, data;
19 19
@@ -23,8 +23,8 @@ static int img_ir_jvc_scancode(int len, u64 raw, enum rc_type *protocol,
23 cust = (raw >> 0) & 0xff; 23 cust = (raw >> 0) & 0xff;
24 data = (raw >> 8) & 0xff; 24 data = (raw >> 8) & 0xff;
25 25
26 *protocol = RC_TYPE_JVC; 26 request->protocol = RC_TYPE_JVC;
27 *scancode = cust << 8 | data; 27 request->scancode = cust << 8 | data;
28 return IMG_IR_SCANCODE; 28 return IMG_IR_SCANCODE;
29} 29}
30 30
diff --git a/drivers/media/rc/img-ir/img-ir-nec.c b/drivers/media/rc/img-ir/img-ir-nec.c
index 739897549b5b..27a7ea8f1260 100644
--- a/drivers/media/rc/img-ir/img-ir-nec.c
+++ b/drivers/media/rc/img-ir/img-ir-nec.c
@@ -13,8 +13,8 @@
13#include <linux/bitrev.h> 13#include <linux/bitrev.h>
14 14
15/* Convert NEC data to a scancode */ 15/* Convert NEC data to a scancode */
16static int img_ir_nec_scancode(int len, u64 raw, enum rc_type *protocol, 16static int img_ir_nec_scancode(int len, u64 raw, u64 enabled_protocols,
17 u32 *scancode, u64 enabled_protocols) 17 struct img_ir_scancode_req *request)
18{ 18{
19 unsigned int addr, addr_inv, data, data_inv; 19 unsigned int addr, addr_inv, data, data_inv;
20 /* a repeat code has no data */ 20 /* a repeat code has no data */
@@ -30,23 +30,23 @@ static int img_ir_nec_scancode(int len, u64 raw, enum rc_type *protocol,
30 if ((data_inv ^ data) != 0xff) { 30 if ((data_inv ^ data) != 0xff) {
31 /* 32-bit NEC (used by Apple and TiVo remotes) */ 31 /* 32-bit NEC (used by Apple and TiVo remotes) */
32 /* scan encoding: as transmitted, MSBit = first received bit */ 32 /* scan encoding: as transmitted, MSBit = first received bit */
33 *scancode = bitrev8(addr) << 24 | 33 request->scancode = bitrev8(addr) << 24 |
34 bitrev8(addr_inv) << 16 | 34 bitrev8(addr_inv) << 16 |
35 bitrev8(data) << 8 | 35 bitrev8(data) << 8 |
36 bitrev8(data_inv); 36 bitrev8(data_inv);
37 } else if ((addr_inv ^ addr) != 0xff) { 37 } else if ((addr_inv ^ addr) != 0xff) {
38 /* Extended NEC */ 38 /* Extended NEC */
39 /* scan encoding: AAaaDD */ 39 /* scan encoding: AAaaDD */
40 *scancode = addr << 16 | 40 request->scancode = addr << 16 |
41 addr_inv << 8 | 41 addr_inv << 8 |
42 data; 42 data;
43 } else { 43 } else {
44 /* Normal NEC */ 44 /* Normal NEC */
45 /* scan encoding: AADD */ 45 /* scan encoding: AADD */
46 *scancode = addr << 8 | 46 request->scancode = addr << 8 |
47 data; 47 data;
48 } 48 }
49 *protocol = RC_TYPE_NEC; 49 request->protocol = RC_TYPE_NEC;
50 return IMG_IR_SCANCODE; 50 return IMG_IR_SCANCODE;
51} 51}
52 52
diff --git a/drivers/media/rc/img-ir/img-ir-sanyo.c b/drivers/media/rc/img-ir/img-ir-sanyo.c
index 6b0653ecdf5a..f394994ffc22 100644
--- a/drivers/media/rc/img-ir/img-ir-sanyo.c
+++ b/drivers/media/rc/img-ir/img-ir-sanyo.c
@@ -23,8 +23,8 @@
23#include "img-ir-hw.h" 23#include "img-ir-hw.h"
24 24
25/* Convert Sanyo data to a scancode */ 25/* Convert Sanyo data to a scancode */
26static int img_ir_sanyo_scancode(int len, u64 raw, enum rc_type *protocol, 26static int img_ir_sanyo_scancode(int len, u64 raw, u64 enabled_protocols,
27 u32 *scancode, u64 enabled_protocols) 27 struct img_ir_scancode_req *request)
28{ 28{
29 unsigned int addr, addr_inv, data, data_inv; 29 unsigned int addr, addr_inv, data, data_inv;
30 /* a repeat code has no data */ 30 /* a repeat code has no data */
@@ -44,8 +44,8 @@ static int img_ir_sanyo_scancode(int len, u64 raw, enum rc_type *protocol,
44 return -EINVAL; 44 return -EINVAL;
45 45
46 /* Normal Sanyo */ 46 /* Normal Sanyo */
47 *protocol = RC_TYPE_SANYO; 47 request->protocol = RC_TYPE_SANYO;
48 *scancode = addr << 8 | data; 48 request->scancode = addr << 8 | data;
49 return IMG_IR_SCANCODE; 49 return IMG_IR_SCANCODE;
50} 50}
51 51
diff --git a/drivers/media/rc/img-ir/img-ir-sharp.c b/drivers/media/rc/img-ir/img-ir-sharp.c
index 3300a38802ac..fe5acc4f030e 100644
--- a/drivers/media/rc/img-ir/img-ir-sharp.c
+++ b/drivers/media/rc/img-ir/img-ir-sharp.c
@@ -12,8 +12,8 @@
12#include "img-ir-hw.h" 12#include "img-ir-hw.h"
13 13
14/* Convert Sharp data to a scancode */ 14/* Convert Sharp data to a scancode */
15static int img_ir_sharp_scancode(int len, u64 raw, enum rc_type *protocol, 15static int img_ir_sharp_scancode(int len, u64 raw, u64 enabled_protocols,
16 u32 *scancode, u64 enabled_protocols) 16 struct img_ir_scancode_req *request)
17{ 17{
18 unsigned int addr, cmd, exp, chk; 18 unsigned int addr, cmd, exp, chk;
19 19
@@ -32,8 +32,8 @@ static int img_ir_sharp_scancode(int len, u64 raw, enum rc_type *protocol,
32 /* probably the second half of the message */ 32 /* probably the second half of the message */
33 return -EINVAL; 33 return -EINVAL;
34 34
35 *protocol = RC_TYPE_SHARP; 35 request->protocol = RC_TYPE_SHARP;
36 *scancode = addr << 8 | cmd; 36 request->scancode = addr << 8 | cmd;
37 return IMG_IR_SCANCODE; 37 return IMG_IR_SCANCODE;
38} 38}
39 39
diff --git a/drivers/media/rc/img-ir/img-ir-sony.c b/drivers/media/rc/img-ir/img-ir-sony.c
index 3a0f17b0752c..7f7375f82ed6 100644
--- a/drivers/media/rc/img-ir/img-ir-sony.c
+++ b/drivers/media/rc/img-ir/img-ir-sony.c
@@ -12,8 +12,8 @@
12#include "img-ir-hw.h" 12#include "img-ir-hw.h"
13 13
14/* Convert Sony data to a scancode */ 14/* Convert Sony data to a scancode */
15static int img_ir_sony_scancode(int len, u64 raw, enum rc_type *protocol, 15static int img_ir_sony_scancode(int len, u64 raw, u64 enabled_protocols,
16 u32 *scancode, u64 enabled_protocols) 16 struct img_ir_scancode_req *request)
17{ 17{
18 unsigned int dev, subdev, func; 18 unsigned int dev, subdev, func;
19 19
@@ -25,7 +25,7 @@ static int img_ir_sony_scancode(int len, u64 raw, enum rc_type *protocol,
25 raw >>= 7; 25 raw >>= 7;
26 dev = raw & 0x1f; /* next 5 bits */ 26 dev = raw & 0x1f; /* next 5 bits */
27 subdev = 0; 27 subdev = 0;
28 *protocol = RC_TYPE_SONY12; 28 request->protocol = RC_TYPE_SONY12;
29 break; 29 break;
30 case 15: 30 case 15:
31 if (!(enabled_protocols & RC_BIT_SONY15)) 31 if (!(enabled_protocols & RC_BIT_SONY15))
@@ -34,7 +34,7 @@ static int img_ir_sony_scancode(int len, u64 raw, enum rc_type *protocol,
34 raw >>= 7; 34 raw >>= 7;
35 dev = raw & 0xff; /* next 8 bits */ 35 dev = raw & 0xff; /* next 8 bits */
36 subdev = 0; 36 subdev = 0;
37 *protocol = RC_TYPE_SONY15; 37 request->protocol = RC_TYPE_SONY15;
38 break; 38 break;
39 case 20: 39 case 20:
40 if (!(enabled_protocols & RC_BIT_SONY20)) 40 if (!(enabled_protocols & RC_BIT_SONY20))
@@ -44,12 +44,12 @@ static int img_ir_sony_scancode(int len, u64 raw, enum rc_type *protocol,
44 dev = raw & 0x1f; /* next 5 bits */ 44 dev = raw & 0x1f; /* next 5 bits */
45 raw >>= 5; 45 raw >>= 5;
46 subdev = raw & 0xff; /* next 8 bits */ 46 subdev = raw & 0xff; /* next 8 bits */
47 *protocol = RC_TYPE_SONY20; 47 request->protocol = RC_TYPE_SONY20;
48 break; 48 break;
49 default: 49 default:
50 return -EINVAL; 50 return -EINVAL;
51 } 51 }
52 *scancode = dev << 16 | subdev << 8 | func; 52 request->scancode = dev << 16 | subdev << 8 | func;
53 return IMG_IR_SCANCODE; 53 return IMG_IR_SCANCODE;
54} 54}
55 55