18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-or-later 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * ImgTec IR Decoder setup for Philips RC-5 protocol. 48c2ecf20Sopenharmony_ci * 58c2ecf20Sopenharmony_ci * Copyright 2012-2014 Imagination Technologies Ltd. 68c2ecf20Sopenharmony_ci */ 78c2ecf20Sopenharmony_ci 88c2ecf20Sopenharmony_ci#include "img-ir-hw.h" 98c2ecf20Sopenharmony_ci 108c2ecf20Sopenharmony_ci/* Convert RC5 data to a scancode */ 118c2ecf20Sopenharmony_cistatic int img_ir_rc5_scancode(int len, u64 raw, u64 enabled_protocols, 128c2ecf20Sopenharmony_ci struct img_ir_scancode_req *request) 138c2ecf20Sopenharmony_ci{ 148c2ecf20Sopenharmony_ci unsigned int addr, cmd, tgl, start; 158c2ecf20Sopenharmony_ci 168c2ecf20Sopenharmony_ci /* Quirk in the decoder shifts everything by 2 to the left. */ 178c2ecf20Sopenharmony_ci raw >>= 2; 188c2ecf20Sopenharmony_ci 198c2ecf20Sopenharmony_ci start = (raw >> 13) & 0x01; 208c2ecf20Sopenharmony_ci tgl = (raw >> 11) & 0x01; 218c2ecf20Sopenharmony_ci addr = (raw >> 6) & 0x1f; 228c2ecf20Sopenharmony_ci cmd = raw & 0x3f; 238c2ecf20Sopenharmony_ci /* 248c2ecf20Sopenharmony_ci * 12th bit is used to extend the command in extended RC5 and has 258c2ecf20Sopenharmony_ci * no effect on standard RC5. 268c2ecf20Sopenharmony_ci */ 278c2ecf20Sopenharmony_ci cmd += ((raw >> 12) & 0x01) ? 0 : 0x40; 288c2ecf20Sopenharmony_ci 298c2ecf20Sopenharmony_ci if (!start) 308c2ecf20Sopenharmony_ci return -EINVAL; 318c2ecf20Sopenharmony_ci 328c2ecf20Sopenharmony_ci request->protocol = RC_PROTO_RC5; 338c2ecf20Sopenharmony_ci request->scancode = addr << 8 | cmd; 348c2ecf20Sopenharmony_ci request->toggle = tgl; 358c2ecf20Sopenharmony_ci return IMG_IR_SCANCODE; 368c2ecf20Sopenharmony_ci} 378c2ecf20Sopenharmony_ci 388c2ecf20Sopenharmony_ci/* Convert RC5 scancode to RC5 data filter */ 398c2ecf20Sopenharmony_cistatic int img_ir_rc5_filter(const struct rc_scancode_filter *in, 408c2ecf20Sopenharmony_ci struct img_ir_filter *out, u64 protocols) 418c2ecf20Sopenharmony_ci{ 428c2ecf20Sopenharmony_ci /* Not supported by the hw. */ 438c2ecf20Sopenharmony_ci return -EINVAL; 448c2ecf20Sopenharmony_ci} 458c2ecf20Sopenharmony_ci 468c2ecf20Sopenharmony_ci/* 478c2ecf20Sopenharmony_ci * RC-5 decoder 488c2ecf20Sopenharmony_ci * see http://www.sbprojects.com/knowledge/ir/rc5.php 498c2ecf20Sopenharmony_ci */ 508c2ecf20Sopenharmony_cistruct img_ir_decoder img_ir_rc5 = { 518c2ecf20Sopenharmony_ci .type = RC_PROTO_BIT_RC5, 528c2ecf20Sopenharmony_ci .control = { 538c2ecf20Sopenharmony_ci .bitoriend2 = 1, 548c2ecf20Sopenharmony_ci .code_type = IMG_IR_CODETYPE_BIPHASE, 558c2ecf20Sopenharmony_ci .decodend2 = 1, 568c2ecf20Sopenharmony_ci }, 578c2ecf20Sopenharmony_ci /* main timings */ 588c2ecf20Sopenharmony_ci .tolerance = 16, 598c2ecf20Sopenharmony_ci .unit = 888888, /* 1/36k*32=888.888microseconds */ 608c2ecf20Sopenharmony_ci .timings = { 618c2ecf20Sopenharmony_ci /* 10 symbol */ 628c2ecf20Sopenharmony_ci .s10 = { 638c2ecf20Sopenharmony_ci .pulse = { 1 }, 648c2ecf20Sopenharmony_ci .space = { 1 }, 658c2ecf20Sopenharmony_ci }, 668c2ecf20Sopenharmony_ci 678c2ecf20Sopenharmony_ci /* 11 symbol */ 688c2ecf20Sopenharmony_ci .s11 = { 698c2ecf20Sopenharmony_ci .pulse = { 1 }, 708c2ecf20Sopenharmony_ci .space = { 1 }, 718c2ecf20Sopenharmony_ci }, 728c2ecf20Sopenharmony_ci 738c2ecf20Sopenharmony_ci /* free time */ 748c2ecf20Sopenharmony_ci .ft = { 758c2ecf20Sopenharmony_ci .minlen = 14, 768c2ecf20Sopenharmony_ci .maxlen = 14, 778c2ecf20Sopenharmony_ci .ft_min = 5, 788c2ecf20Sopenharmony_ci }, 798c2ecf20Sopenharmony_ci }, 808c2ecf20Sopenharmony_ci 818c2ecf20Sopenharmony_ci /* scancode logic */ 828c2ecf20Sopenharmony_ci .scancode = img_ir_rc5_scancode, 838c2ecf20Sopenharmony_ci .filter = img_ir_rc5_filter, 848c2ecf20Sopenharmony_ci}; 85