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