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