xref: /linux/drivers/media/rc/img-ir/img-ir-rc5.c (revision c532de5a67a70f8533d495f8f2aaa9a0491c3ad0)
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /*
3  * ImgTec IR Decoder setup for Philips RC-5 protocol.
4  *
5  * Copyright 2012-2014 Imagination Technologies Ltd.
6  */
7 
8 #include "img-ir-hw.h"
9 
10 /* Convert RC5 data to a scancode */
11 static int img_ir_rc5_scancode(int len, u64 raw, u64 enabled_protocols,
12 				struct img_ir_scancode_req *request)
13 {
14 	unsigned int addr, cmd, tgl, start;
15 
16 	/* Quirk in the decoder shifts everything by 2 to the left. */
17 	raw   >>= 2;
18 
19 	start	=  (raw >> 13)	& 0x01;
20 	tgl	=  (raw >> 11)	& 0x01;
21 	addr	=  (raw >>  6)	& 0x1f;
22 	cmd	=   raw		& 0x3f;
23 	/*
24 	 * 12th bit is used to extend the command in extended RC5 and has
25 	 * no effect on standard RC5.
26 	 */
27 	cmd	+= ((raw >> 12) & 0x01) ? 0 : 0x40;
28 
29 	if (!start)
30 		return -EINVAL;
31 
32 	request->protocol = RC_PROTO_RC5;
33 	request->scancode = addr << 8 | cmd;
34 	request->toggle   = tgl;
35 	return IMG_IR_SCANCODE;
36 }
37 
38 /* Convert RC5 scancode to RC5 data filter */
39 static int img_ir_rc5_filter(const struct rc_scancode_filter *in,
40 				 struct img_ir_filter *out, u64 protocols)
41 {
42 	/* Not supported by the hw. */
43 	return -EINVAL;
44 }
45 
46 /*
47  * RC-5 decoder
48  * see http://www.sbprojects.com/knowledge/ir/rc5.php
49  */
50 struct img_ir_decoder img_ir_rc5 = {
51 	.type      = RC_PROTO_BIT_RC5,
52 	.control   = {
53 		.bitoriend2	= 1,
54 		.code_type	= IMG_IR_CODETYPE_BIPHASE,
55 		.decodend2	= 1,
56 	},
57 	/* main timings */
58 	.tolerance	= 16,
59 	.unit		= 888888, /* 1/36k*32=888.888microseconds */
60 	.timings	= {
61 		/* 10 symbol */
62 		.s10 = {
63 			.pulse	= { 1 },
64 			.space	= { 1 },
65 		},
66 
67 		/* 11 symbol */
68 		.s11 = {
69 			.pulse	= { 1 },
70 			.space	= { 1 },
71 		},
72 
73 		/* free time */
74 		.ft  = {
75 			.minlen = 14,
76 			.maxlen = 14,
77 			.ft_min = 5,
78 		},
79 	},
80 
81 	/* scancode logic */
82 	.scancode	= img_ir_rc5_scancode,
83 	.filter		= img_ir_rc5_filter,
84 };
85