xref: /linux/drivers/media/common/siano/smsir.c (revision 528222d8)
11e6f57b2SMauro Carvalho Chehab // SPDX-License-Identifier: GPL-2.0+
21e6f57b2SMauro Carvalho Chehab //
31e6f57b2SMauro Carvalho Chehab // Siano Mobile Silicon, Inc.
41e6f57b2SMauro Carvalho Chehab // MDTV receiver kernel modules.
51e6f57b2SMauro Carvalho Chehab // Copyright (C) 2006-2009, Uri Shkolnik
61e6f57b2SMauro Carvalho Chehab //
71e6f57b2SMauro Carvalho Chehab // Copyright (c) 2010 - Mauro Carvalho Chehab
81e6f57b2SMauro Carvalho Chehab //	- Ported the driver to use rc-core
91e6f57b2SMauro Carvalho Chehab //	- IR raw event decoding is now done at rc-core
101e6f57b2SMauro Carvalho Chehab //	- Code almost re-written
110013ca8cSMauro Carvalho Chehab 
120013ca8cSMauro Carvalho Chehab 
135e022d1aSMauro Carvalho Chehab #include "smscoreapi.h"
145e022d1aSMauro Carvalho Chehab 
150013ca8cSMauro Carvalho Chehab #include <linux/types.h>
160013ca8cSMauro Carvalho Chehab #include <linux/input.h>
170013ca8cSMauro Carvalho Chehab 
180013ca8cSMauro Carvalho Chehab #include "smsir.h"
190013ca8cSMauro Carvalho Chehab #include "sms-cards.h"
200013ca8cSMauro Carvalho Chehab 
210013ca8cSMauro Carvalho Chehab #define MODULE_NAME "smsmdtv"
220013ca8cSMauro Carvalho Chehab 
sms_ir_event(struct smscore_device_t * coredev,const char * buf,int len)230013ca8cSMauro Carvalho Chehab void sms_ir_event(struct smscore_device_t *coredev, const char *buf, int len)
240013ca8cSMauro Carvalho Chehab {
250013ca8cSMauro Carvalho Chehab 	int i;
260013ca8cSMauro Carvalho Chehab 	const s32 *samples = (const void *)buf;
270013ca8cSMauro Carvalho Chehab 
280013ca8cSMauro Carvalho Chehab 	for (i = 0; i < len >> 2; i++) {
29183e19f5SSean Young 		struct ir_raw_event ev = {
30*528222d8SSean Young 			.duration = abs(samples[i]),
31183e19f5SSean Young 			.pulse = (samples[i] > 0) ? false : true
32183e19f5SSean Young 		};
330013ca8cSMauro Carvalho Chehab 
340013ca8cSMauro Carvalho Chehab 		ir_raw_event_store(coredev->ir.dev, &ev);
350013ca8cSMauro Carvalho Chehab 	}
360013ca8cSMauro Carvalho Chehab 	ir_raw_event_handle(coredev->ir.dev);
370013ca8cSMauro Carvalho Chehab }
380013ca8cSMauro Carvalho Chehab 
sms_ir_init(struct smscore_device_t * coredev)390013ca8cSMauro Carvalho Chehab int sms_ir_init(struct smscore_device_t *coredev)
400013ca8cSMauro Carvalho Chehab {
410013ca8cSMauro Carvalho Chehab 	int err;
420013ca8cSMauro Carvalho Chehab 	int board_id = smscore_get_board_id(coredev);
430013ca8cSMauro Carvalho Chehab 	struct rc_dev *dev;
440013ca8cSMauro Carvalho Chehab 
459b283e67SMauro Carvalho Chehab 	pr_debug("Allocating rc device\n");
460f7499fdSAndi Shyti 	dev = rc_allocate_device(RC_DRIVER_IR_RAW);
475ed0a2c7SMauro Carvalho Chehab 	if (!dev)
480013ca8cSMauro Carvalho Chehab 		return -ENOMEM;
490013ca8cSMauro Carvalho Chehab 
500013ca8cSMauro Carvalho Chehab 	coredev->ir.controller = 0;	/* Todo: vega/nova SPI number */
51*528222d8SSean Young 	coredev->ir.timeout = US_TO_NS(IR_DEFAULT_TIMEOUT);
529b283e67SMauro Carvalho Chehab 	pr_debug("IR port %d, timeout %d ms\n",
530013ca8cSMauro Carvalho Chehab 			coredev->ir.controller, coredev->ir.timeout);
540013ca8cSMauro Carvalho Chehab 
550013ca8cSMauro Carvalho Chehab 	snprintf(coredev->ir.name, sizeof(coredev->ir.name),
560013ca8cSMauro Carvalho Chehab 		 "SMS IR (%s)", sms_get_board(board_id)->name);
570013ca8cSMauro Carvalho Chehab 
58c0decac1SMauro Carvalho Chehab 	strscpy(coredev->ir.phys, coredev->devpath, sizeof(coredev->ir.phys));
590013ca8cSMauro Carvalho Chehab 	strlcat(coredev->ir.phys, "/ir0", sizeof(coredev->ir.phys));
600013ca8cSMauro Carvalho Chehab 
61518f4b26SSean Young 	dev->device_name = coredev->ir.name;
620013ca8cSMauro Carvalho Chehab 	dev->input_phys = coredev->ir.phys;
630013ca8cSMauro Carvalho Chehab 	dev->dev.parent = coredev->device;
640013ca8cSMauro Carvalho Chehab 
650013ca8cSMauro Carvalho Chehab #if 0
665a13e40bSMauro Carvalho Chehab 	/* TODO: properly initialize the parameters below */
670013ca8cSMauro Carvalho Chehab 	dev->input_id.bustype = BUS_USB;
680013ca8cSMauro Carvalho Chehab 	dev->input_id.version = 1;
690013ca8cSMauro Carvalho Chehab 	dev->input_id.vendor = le16_to_cpu(dev->udev->descriptor.idVendor);
700013ca8cSMauro Carvalho Chehab 	dev->input_id.product = le16_to_cpu(dev->udev->descriptor.idProduct);
710013ca8cSMauro Carvalho Chehab #endif
720013ca8cSMauro Carvalho Chehab 
730013ca8cSMauro Carvalho Chehab 	dev->priv = coredev;
746d741bfeSSean Young 	dev->allowed_protocols = RC_PROTO_BIT_ALL_IR_DECODER;
750013ca8cSMauro Carvalho Chehab 	dev->map_name = sms_get_board(board_id)->rc_codes;
760013ca8cSMauro Carvalho Chehab 	dev->driver_name = MODULE_NAME;
770013ca8cSMauro Carvalho Chehab 
789b283e67SMauro Carvalho Chehab 	pr_debug("Input device (IR) %s is set for key events\n",
79518f4b26SSean Young 		 dev->device_name);
800013ca8cSMauro Carvalho Chehab 
810013ca8cSMauro Carvalho Chehab 	err = rc_register_device(dev);
820013ca8cSMauro Carvalho Chehab 	if (err < 0) {
835ed0a2c7SMauro Carvalho Chehab 		pr_err("Failed to register device\n");
840013ca8cSMauro Carvalho Chehab 		rc_free_device(dev);
850013ca8cSMauro Carvalho Chehab 		return err;
860013ca8cSMauro Carvalho Chehab 	}
870013ca8cSMauro Carvalho Chehab 
880013ca8cSMauro Carvalho Chehab 	coredev->ir.dev = dev;
890013ca8cSMauro Carvalho Chehab 	return 0;
900013ca8cSMauro Carvalho Chehab }
910013ca8cSMauro Carvalho Chehab 
sms_ir_exit(struct smscore_device_t * coredev)920013ca8cSMauro Carvalho Chehab void sms_ir_exit(struct smscore_device_t *coredev)
930013ca8cSMauro Carvalho Chehab {
940013ca8cSMauro Carvalho Chehab 	rc_unregister_device(coredev->ir.dev);
950013ca8cSMauro Carvalho Chehab 
969b283e67SMauro Carvalho Chehab 	pr_debug("\n");
970013ca8cSMauro Carvalho Chehab }
98