162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-or-later 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * ImgTec IR Decoder setup for Philips RC-5 protocol. 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Copyright 2012-2014 Imagination Technologies Ltd. 662306a36Sopenharmony_ci */ 762306a36Sopenharmony_ci 862306a36Sopenharmony_ci#include "img-ir-hw.h" 962306a36Sopenharmony_ci 1062306a36Sopenharmony_ci/* Convert RC5 data to a scancode */ 1162306a36Sopenharmony_cistatic int img_ir_rc5_scancode(int len, u64 raw, u64 enabled_protocols, 1262306a36Sopenharmony_ci struct img_ir_scancode_req *request) 1362306a36Sopenharmony_ci{ 1462306a36Sopenharmony_ci unsigned int addr, cmd, tgl, start; 1562306a36Sopenharmony_ci 1662306a36Sopenharmony_ci /* Quirk in the decoder shifts everything by 2 to the left. */ 1762306a36Sopenharmony_ci raw >>= 2; 1862306a36Sopenharmony_ci 1962306a36Sopenharmony_ci start = (raw >> 13) & 0x01; 2062306a36Sopenharmony_ci tgl = (raw >> 11) & 0x01; 2162306a36Sopenharmony_ci addr = (raw >> 6) & 0x1f; 2262306a36Sopenharmony_ci cmd = raw & 0x3f; 2362306a36Sopenharmony_ci /* 2462306a36Sopenharmony_ci * 12th bit is used to extend the command in extended RC5 and has 2562306a36Sopenharmony_ci * no effect on standard RC5. 2662306a36Sopenharmony_ci */ 2762306a36Sopenharmony_ci cmd += ((raw >> 12) & 0x01) ? 0 : 0x40; 2862306a36Sopenharmony_ci 2962306a36Sopenharmony_ci if (!start) 3062306a36Sopenharmony_ci return -EINVAL; 3162306a36Sopenharmony_ci 3262306a36Sopenharmony_ci request->protocol = RC_PROTO_RC5; 3362306a36Sopenharmony_ci request->scancode = addr << 8 | cmd; 3462306a36Sopenharmony_ci request->toggle = tgl; 3562306a36Sopenharmony_ci return IMG_IR_SCANCODE; 3662306a36Sopenharmony_ci} 3762306a36Sopenharmony_ci 3862306a36Sopenharmony_ci/* Convert RC5 scancode to RC5 data filter */ 3962306a36Sopenharmony_cistatic int img_ir_rc5_filter(const struct rc_scancode_filter *in, 4062306a36Sopenharmony_ci struct img_ir_filter *out, u64 protocols) 4162306a36Sopenharmony_ci{ 4262306a36Sopenharmony_ci /* Not supported by the hw. */ 4362306a36Sopenharmony_ci return -EINVAL; 4462306a36Sopenharmony_ci} 4562306a36Sopenharmony_ci 4662306a36Sopenharmony_ci/* 4762306a36Sopenharmony_ci * RC-5 decoder 4862306a36Sopenharmony_ci * see http://www.sbprojects.com/knowledge/ir/rc5.php 4962306a36Sopenharmony_ci */ 5062306a36Sopenharmony_cistruct img_ir_decoder img_ir_rc5 = { 5162306a36Sopenharmony_ci .type = RC_PROTO_BIT_RC5, 5262306a36Sopenharmony_ci .control = { 5362306a36Sopenharmony_ci .bitoriend2 = 1, 5462306a36Sopenharmony_ci .code_type = IMG_IR_CODETYPE_BIPHASE, 5562306a36Sopenharmony_ci .decodend2 = 1, 5662306a36Sopenharmony_ci }, 5762306a36Sopenharmony_ci /* main timings */ 5862306a36Sopenharmony_ci .tolerance = 16, 5962306a36Sopenharmony_ci .unit = 888888, /* 1/36k*32=888.888microseconds */ 6062306a36Sopenharmony_ci .timings = { 6162306a36Sopenharmony_ci /* 10 symbol */ 6262306a36Sopenharmony_ci .s10 = { 6362306a36Sopenharmony_ci .pulse = { 1 }, 6462306a36Sopenharmony_ci .space = { 1 }, 6562306a36Sopenharmony_ci }, 6662306a36Sopenharmony_ci 6762306a36Sopenharmony_ci /* 11 symbol */ 6862306a36Sopenharmony_ci .s11 = { 6962306a36Sopenharmony_ci .pulse = { 1 }, 7062306a36Sopenharmony_ci .space = { 1 }, 7162306a36Sopenharmony_ci }, 7262306a36Sopenharmony_ci 7362306a36Sopenharmony_ci /* free time */ 7462306a36Sopenharmony_ci .ft = { 7562306a36Sopenharmony_ci .minlen = 14, 7662306a36Sopenharmony_ci .maxlen = 14, 7762306a36Sopenharmony_ci .ft_min = 5, 7862306a36Sopenharmony_ci }, 7962306a36Sopenharmony_ci }, 8062306a36Sopenharmony_ci 8162306a36Sopenharmony_ci /* scancode logic */ 8262306a36Sopenharmony_ci .scancode = img_ir_rc5_scancode, 8362306a36Sopenharmony_ci .filter = img_ir_rc5_filter, 8462306a36Sopenharmony_ci}; 85