Linux-libre 5.3.12-gnu
[librecmc/linux-libre.git] / drivers / media / rc / img-ir / img-ir-sharp.c
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /*
3  * ImgTec IR Decoder setup for Sharp protocol.
4  *
5  * Copyright 2012-2014 Imagination Technologies Ltd.
6  */
7
8 #include "img-ir-hw.h"
9
10 /* Convert Sharp data to a scancode */
11 static int img_ir_sharp_scancode(int len, u64 raw, u64 enabled_protocols,
12                                  struct img_ir_scancode_req *request)
13 {
14         unsigned int addr, cmd, exp, chk;
15
16         if (len != 15)
17                 return -EINVAL;
18
19         addr = (raw >>   0) & 0x1f;
20         cmd  = (raw >>   5) & 0xff;
21         exp  = (raw >>  13) &  0x1;
22         chk  = (raw >>  14) &  0x1;
23
24         /* validate data */
25         if (!exp)
26                 return -EINVAL;
27         if (chk)
28                 /* probably the second half of the message */
29                 return -EINVAL;
30
31         request->protocol = RC_PROTO_SHARP;
32         request->scancode = addr << 8 | cmd;
33         return IMG_IR_SCANCODE;
34 }
35
36 /* Convert Sharp scancode to Sharp data filter */
37 static int img_ir_sharp_filter(const struct rc_scancode_filter *in,
38                                struct img_ir_filter *out, u64 protocols)
39 {
40         unsigned int addr, cmd, exp = 0, chk = 0;
41         unsigned int addr_m, cmd_m, exp_m = 0, chk_m = 0;
42
43         addr   = (in->data >> 8) & 0x1f;
44         addr_m = (in->mask >> 8) & 0x1f;
45         cmd    = (in->data >> 0) & 0xff;
46         cmd_m  = (in->mask >> 0) & 0xff;
47         if (cmd_m) {
48                 /* if filtering commands, we can only match the first part */
49                 exp   = 1;
50                 exp_m = 1;
51                 chk   = 0;
52                 chk_m = 1;
53         }
54
55         out->data = addr        |
56                     cmd   <<  5 |
57                     exp   << 13 |
58                     chk   << 14;
59         out->mask = addr_m      |
60                     cmd_m <<  5 |
61                     exp_m << 13 |
62                     chk_m << 14;
63
64         return 0;
65 }
66
67 /*
68  * Sharp decoder
69  * See also http://www.sbprojects.com/knowledge/ir/sharp.php
70  */
71 struct img_ir_decoder img_ir_sharp = {
72         .type = RC_PROTO_BIT_SHARP,
73         .control = {
74                 .decoden = 0,
75                 .decodend2 = 1,
76                 .code_type = IMG_IR_CODETYPE_PULSEDIST,
77                 .d1validsel = 1,
78         },
79         /* main timings */
80         .tolerance = 20,        /* 20% */
81         .timings = {
82                 /* 0 symbol */
83                 .s10 = {
84                         .pulse = { 320  /* 320 us */ },
85                         .space = { 680  /* 1 ms period */ },
86                 },
87                 /* 1 symbol */
88                 .s11 = {
89                         .pulse = { 320  /* 320 us */ },
90                         .space = { 1680 /* 2 ms period */ },
91                 },
92                 /* free time */
93                 .ft = {
94                         .minlen = 15,
95                         .maxlen = 15,
96                         .ft_min = 5000, /* 5 ms */
97                 },
98         },
99         /* scancode logic */
100         .scancode = img_ir_sharp_scancode,
101         .filter = img_ir_sharp_filter,
102 };