^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) // SPDX-License-Identifier: GPL-2.0-or-later
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * ImgTec IR Decoder setup for JVC protocol.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) * Copyright 2012-2014 Imagination Technologies Ltd.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) #include "img-ir-hw.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) /* Convert JVC data to a scancode */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) static int img_ir_jvc_scancode(int len, u64 raw, u64 enabled_protocols,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) struct img_ir_scancode_req *request)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) unsigned int cust, data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) if (len != 16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) cust = (raw >> 0) & 0xff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) data = (raw >> 8) & 0xff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) request->protocol = RC_PROTO_JVC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) request->scancode = cust << 8 | data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) return IMG_IR_SCANCODE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) /* Convert JVC scancode to JVC data filter */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) static int img_ir_jvc_filter(const struct rc_scancode_filter *in,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) struct img_ir_filter *out, u64 protocols)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) unsigned int cust, data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) unsigned int cust_m, data_m;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) cust = (in->data >> 8) & 0xff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) cust_m = (in->mask >> 8) & 0xff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) data = (in->data >> 0) & 0xff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) data_m = (in->mask >> 0) & 0xff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) out->data = cust | data << 8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) out->mask = cust_m | data_m << 8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) * JVC decoder
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) * See also http://www.sbprojects.com/knowledge/ir/jvc.php
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) * http://support.jvc.com/consumer/support/documents/RemoteCodes.pdf
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) struct img_ir_decoder img_ir_jvc = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) .type = RC_PROTO_BIT_JVC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) .control = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) .decoden = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) .code_type = IMG_IR_CODETYPE_PULSEDIST,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) /* main timings */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) .unit = 527500, /* 527.5 us */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) .timings = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) /* leader symbol */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) .ldr = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) .pulse = { 16 /* 8.44 ms */ },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) .space = { 8 /* 4.22 ms */ },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) /* 0 symbol */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) .s00 = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) .pulse = { 1 /* 527.5 us +-60 us */ },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) .space = { 1 /* 527.5 us */ },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) /* 1 symbol */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) .s01 = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) .pulse = { 1 /* 527.5 us +-60 us */ },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) .space = { 3 /* 1.5825 ms +-40 us */ },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) /* free time */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) .ft = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) .minlen = 16,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) .maxlen = 16,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) .ft_min = 10, /* 5.275 ms */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) /* scancode logic */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) .scancode = img_ir_jvc_scancode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) .filter = img_ir_jvc_filter,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) };