2017-12-01 08:47:13 -05:00
// SPDX-License-Identifier: GPL-2.0+
//
// Siano Mobile Silicon, Inc.
// MDTV receiver kernel modules.
// Copyright (C) 2006-2009, Uri Shkolnik
//
// Copyright (c) 2010 - Mauro Carvalho Chehab
// - Ported the driver to use rc-core
// - IR raw event decoding is now done at rc-core
// - Code almost re-written
2009-04-05 06:01:37 -03:00
2015-02-22 10:46:56 -03:00
# include "smscoreapi.h"
2009-04-05 06:01:37 -03:00
# include <linux/types.h>
# include <linux/input.h>
# include "smsir.h"
# include "sms-cards.h"
2010-08-01 17:19:29 -03:00
# define MODULE_NAME "smsmdtv"
2009-04-05 06:01:37 -03:00
2010-08-01 17:19:29 -03:00
void sms_ir_event ( struct smscore_device_t * coredev , const char * buf , int len )
2009-04-05 06:01:37 -03:00
{
int i ;
2010-08-01 17:19:29 -03:00
const s32 * samples = ( const void * ) buf ;
2009-04-05 06:01:37 -03:00
2010-08-01 17:19:29 -03:00
for ( i = 0 ; i < len > > 2 ; i + + ) {
2010-10-24 23:05:29 -03:00
DEFINE_IR_RAW_EVENT ( ev ) ;
2009-04-05 06:01:37 -03:00
2010-08-01 17:19:29 -03:00
ev . duration = abs ( samples [ i ] ) * 1000 ; /* Convert to ns */
ev . pulse = ( samples [ i ] > 0 ) ? false : true ;
2009-04-05 06:01:37 -03:00
2010-10-29 16:08:23 -03:00
ir_raw_event_store ( coredev - > ir . dev , & ev ) ;
2009-04-05 06:01:37 -03:00
}
2010-10-29 16:08:23 -03:00
ir_raw_event_handle ( coredev - > ir . dev ) ;
2009-04-05 06:01:37 -03:00
}
int sms_ir_init ( struct smscore_device_t * coredev )
{
2010-10-29 16:08:23 -03:00
int err ;
2010-08-01 15:30:50 -03:00
int board_id = smscore_get_board_id ( coredev ) ;
2010-10-29 16:08:23 -03:00
struct rc_dev * dev ;
2009-04-05 06:01:37 -03:00
2015-02-22 11:33:09 -03:00
pr_debug ( " Allocating rc device \n " ) ;
2016-12-16 06:50:58 -02:00
dev = rc_allocate_device ( RC_DRIVER_IR_RAW ) ;
2015-02-22 11:04:35 -03:00
if ( ! dev )
2009-04-05 06:01:37 -03:00
return - ENOMEM ;
coredev - > ir . controller = 0 ; /* Todo: vega/nova SPI number */
coredev - > ir . timeout = IR_DEFAULT_TIMEOUT ;
2015-02-22 11:33:09 -03:00
pr_debug ( " IR port %d, timeout %d ms \n " ,
2009-04-05 06:01:37 -03:00
coredev - > ir . controller , coredev - > ir . timeout ) ;
2010-08-01 17:19:29 -03:00
snprintf ( coredev - > ir . name , sizeof ( coredev - > ir . name ) ,
" SMS IR (%s) " , sms_get_board ( board_id ) - > name ) ;
2010-08-01 15:30:50 -03:00
strlcpy ( coredev - > ir . phys , coredev - > devpath , sizeof ( coredev - > ir . phys ) ) ;
strlcat ( coredev - > ir . phys , " /ir0 " , sizeof ( coredev - > ir . phys ) ) ;
2017-07-01 12:13:19 -04:00
dev - > device_name = coredev - > ir . name ;
2010-10-29 16:08:23 -03:00
dev - > input_phys = coredev - > ir . phys ;
dev - > dev . parent = coredev - > device ;
2009-04-05 06:01:37 -03:00
2010-08-01 17:19:29 -03:00
#if 0
2015-05-08 08:59:16 -03:00
/* TODO: properly initialize the parameters below */
2010-10-29 16:08:23 -03:00
dev - > input_id . bustype = BUS_USB ;
dev - > input_id . version = 1 ;
dev - > input_id . vendor = le16_to_cpu ( dev - > udev - > descriptor . idVendor ) ;
dev - > input_id . product = le16_to_cpu ( dev - > udev - > descriptor . idProduct ) ;
2010-08-01 17:19:29 -03:00
# endif
2010-10-29 16:08:23 -03:00
dev - > priv = coredev ;
2017-08-07 16:20:58 -04:00
dev - > allowed_protocols = RC_PROTO_BIT_ALL_IR_DECODER ;
2010-10-29 16:08:23 -03:00
dev - > map_name = sms_get_board ( board_id ) - > rc_codes ;
dev - > driver_name = MODULE_NAME ;
2009-04-05 06:01:37 -03:00
2015-02-22 11:33:09 -03:00
pr_debug ( " Input device (IR) %s is set for key events \n " ,
2017-07-01 12:13:19 -04:00
dev - > device_name ) ;
2009-04-05 06:01:37 -03:00
2010-10-29 16:08:23 -03:00
err = rc_register_device ( dev ) ;
if ( err < 0 ) {
2015-02-22 11:04:35 -03:00
pr_err ( " Failed to register device \n " ) ;
2010-10-29 16:08:23 -03:00
rc_free_device ( dev ) ;
return err ;
2009-04-05 06:01:37 -03:00
}
2010-10-29 16:08:23 -03:00
coredev - > ir . dev = dev ;
2009-04-05 06:01:37 -03:00
return 0 ;
}
void sms_ir_exit ( struct smscore_device_t * coredev )
{
2014-11-24 18:32:30 -03:00
rc_unregister_device ( coredev - > ir . dev ) ;
2009-04-05 06:01:37 -03:00
2015-02-22 11:33:09 -03:00
pr_debug ( " \n " ) ;
2009-04-05 06:01:37 -03:00
}