diff options
-rw-r--r-- | drivers/media/rc/img-ir/img-ir-hw.c | 16 | ||||
-rw-r--r-- | drivers/media/rc/img-ir/img-ir-hw.h | 16 | ||||
-rw-r--r-- | drivers/media/rc/img-ir/img-ir-jvc.c | 8 | ||||
-rw-r--r-- | drivers/media/rc/img-ir/img-ir-nec.c | 24 | ||||
-rw-r--r-- | drivers/media/rc/img-ir/img-ir-sanyo.c | 8 | ||||
-rw-r--r-- | drivers/media/rc/img-ir/img-ir-sharp.c | 8 | ||||
-rw-r--r-- | drivers/media/rc/img-ir/img-ir-sony.c | 12 |
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 | */ | ||
142 | struct 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 */ |
15 | static int img_ir_jvc_scancode(int len, u64 raw, enum rc_type *protocol, | 15 | static 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 */ |
16 | static int img_ir_nec_scancode(int len, u64 raw, enum rc_type *protocol, | 16 | static 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 */ |
26 | static int img_ir_sanyo_scancode(int len, u64 raw, enum rc_type *protocol, | 26 | static 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 */ |
15 | static int img_ir_sharp_scancode(int len, u64 raw, enum rc_type *protocol, | 15 | static 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 */ |
15 | static int img_ir_sony_scancode(int len, u64 raw, enum rc_type *protocol, | 15 | static 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 | ||