162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-or-later 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * ImgTec IR Decoder setup for JVC 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 JVC data to a scancode */ 1162306a36Sopenharmony_cistatic int img_ir_jvc_scancode(int len, u64 raw, u64 enabled_protocols, 1262306a36Sopenharmony_ci struct img_ir_scancode_req *request) 1362306a36Sopenharmony_ci{ 1462306a36Sopenharmony_ci unsigned int cust, data; 1562306a36Sopenharmony_ci 1662306a36Sopenharmony_ci if (len != 16) 1762306a36Sopenharmony_ci return -EINVAL; 1862306a36Sopenharmony_ci 1962306a36Sopenharmony_ci cust = (raw >> 0) & 0xff; 2062306a36Sopenharmony_ci data = (raw >> 8) & 0xff; 2162306a36Sopenharmony_ci 2262306a36Sopenharmony_ci request->protocol = RC_PROTO_JVC; 2362306a36Sopenharmony_ci request->scancode = cust << 8 | data; 2462306a36Sopenharmony_ci return IMG_IR_SCANCODE; 2562306a36Sopenharmony_ci} 2662306a36Sopenharmony_ci 2762306a36Sopenharmony_ci/* Convert JVC scancode to JVC data filter */ 2862306a36Sopenharmony_cistatic int img_ir_jvc_filter(const struct rc_scancode_filter *in, 2962306a36Sopenharmony_ci struct img_ir_filter *out, u64 protocols) 3062306a36Sopenharmony_ci{ 3162306a36Sopenharmony_ci unsigned int cust, data; 3262306a36Sopenharmony_ci unsigned int cust_m, data_m; 3362306a36Sopenharmony_ci 3462306a36Sopenharmony_ci cust = (in->data >> 8) & 0xff; 3562306a36Sopenharmony_ci cust_m = (in->mask >> 8) & 0xff; 3662306a36Sopenharmony_ci data = (in->data >> 0) & 0xff; 3762306a36Sopenharmony_ci data_m = (in->mask >> 0) & 0xff; 3862306a36Sopenharmony_ci 3962306a36Sopenharmony_ci out->data = cust | data << 8; 4062306a36Sopenharmony_ci out->mask = cust_m | data_m << 8; 4162306a36Sopenharmony_ci 4262306a36Sopenharmony_ci return 0; 4362306a36Sopenharmony_ci} 4462306a36Sopenharmony_ci 4562306a36Sopenharmony_ci/* 4662306a36Sopenharmony_ci * JVC decoder 4762306a36Sopenharmony_ci * See also http://www.sbprojects.com/knowledge/ir/jvc.php 4862306a36Sopenharmony_ci * http://support.jvc.com/consumer/support/documents/RemoteCodes.pdf 4962306a36Sopenharmony_ci */ 5062306a36Sopenharmony_cistruct img_ir_decoder img_ir_jvc = { 5162306a36Sopenharmony_ci .type = RC_PROTO_BIT_JVC, 5262306a36Sopenharmony_ci .control = { 5362306a36Sopenharmony_ci .decoden = 1, 5462306a36Sopenharmony_ci .code_type = IMG_IR_CODETYPE_PULSEDIST, 5562306a36Sopenharmony_ci }, 5662306a36Sopenharmony_ci /* main timings */ 5762306a36Sopenharmony_ci .unit = 527500, /* 527.5 us */ 5862306a36Sopenharmony_ci .timings = { 5962306a36Sopenharmony_ci /* leader symbol */ 6062306a36Sopenharmony_ci .ldr = { 6162306a36Sopenharmony_ci .pulse = { 16 /* 8.44 ms */ }, 6262306a36Sopenharmony_ci .space = { 8 /* 4.22 ms */ }, 6362306a36Sopenharmony_ci }, 6462306a36Sopenharmony_ci /* 0 symbol */ 6562306a36Sopenharmony_ci .s00 = { 6662306a36Sopenharmony_ci .pulse = { 1 /* 527.5 us +-60 us */ }, 6762306a36Sopenharmony_ci .space = { 1 /* 527.5 us */ }, 6862306a36Sopenharmony_ci }, 6962306a36Sopenharmony_ci /* 1 symbol */ 7062306a36Sopenharmony_ci .s01 = { 7162306a36Sopenharmony_ci .pulse = { 1 /* 527.5 us +-60 us */ }, 7262306a36Sopenharmony_ci .space = { 3 /* 1.5825 ms +-40 us */ }, 7362306a36Sopenharmony_ci }, 7462306a36Sopenharmony_ci /* free time */ 7562306a36Sopenharmony_ci .ft = { 7662306a36Sopenharmony_ci .minlen = 16, 7762306a36Sopenharmony_ci .maxlen = 16, 7862306a36Sopenharmony_ci .ft_min = 10, /* 5.275 ms */ 7962306a36Sopenharmony_ci }, 8062306a36Sopenharmony_ci }, 8162306a36Sopenharmony_ci /* scancode logic */ 8262306a36Sopenharmony_ci .scancode = img_ir_jvc_scancode, 8362306a36Sopenharmony_ci .filter = img_ir_jvc_filter, 8462306a36Sopenharmony_ci}; 85