1 /****************************************************************
3 Siano Mobile Silicon, Inc.
4 MDTV receiver kernel modules.
5 Copyright (C) 2006-2009, Uri Shkolnik
7 Copyright (c) 2010 - Mauro Carvalho Chehab
8 - Ported the driver to use rc-core
9 - IR raw event decoding is now done at rc-core
10 - Code almost re-written
12 This program is free software: you can redistribute it and/or modify
13 it under the terms of the GNU General Public License as published by
14 the Free Software Foundation, either version 2 of the License, or
15 (at your option) any later version.
17 This program is distributed in the hope that it will be useful,
18 but WITHOUT ANY WARRANTY; without even the implied warranty of
19 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 GNU General Public License for more details.
22 You should have received a copy of the GNU General Public License
23 along with this program. If not, see <http://www.gnu.org/licenses/>.
25 ****************************************************************/
28 #include "smscoreapi.h"
30 #include <linux/types.h>
31 #include <linux/input.h>
34 #include "sms-cards.h"
36 #define MODULE_NAME "smsmdtv"
38 void sms_ir_event(struct smscore_device_t
*coredev
, const char *buf
, int len
)
41 const s32
*samples
= (const void *)buf
;
43 for (i
= 0; i
< len
>> 2; i
++) {
44 DEFINE_IR_RAW_EVENT(ev
);
46 ev
.duration
= abs(samples
[i
]) * 1000; /* Convert to ns */
47 ev
.pulse
= (samples
[i
] > 0) ? false : true;
49 ir_raw_event_store(coredev
->ir
.dev
, &ev
);
51 ir_raw_event_handle(coredev
->ir
.dev
);
54 int sms_ir_init(struct smscore_device_t
*coredev
)
57 int board_id
= smscore_get_board_id(coredev
);
60 pr_debug("Allocating rc device\n");
61 dev
= rc_allocate_device(RC_DRIVER_IR_RAW
);
65 coredev
->ir
.controller
= 0; /* Todo: vega/nova SPI number */
66 coredev
->ir
.timeout
= IR_DEFAULT_TIMEOUT
;
67 pr_debug("IR port %d, timeout %d ms\n",
68 coredev
->ir
.controller
, coredev
->ir
.timeout
);
70 snprintf(coredev
->ir
.name
, sizeof(coredev
->ir
.name
),
71 "SMS IR (%s)", sms_get_board(board_id
)->name
);
73 strlcpy(coredev
->ir
.phys
, coredev
->devpath
, sizeof(coredev
->ir
.phys
));
74 strlcat(coredev
->ir
.phys
, "/ir0", sizeof(coredev
->ir
.phys
));
76 dev
->device_name
= coredev
->ir
.name
;
77 dev
->input_phys
= coredev
->ir
.phys
;
78 dev
->dev
.parent
= coredev
->device
;
81 /* TODO: properly initialize the parameters below */
82 dev
->input_id
.bustype
= BUS_USB
;
83 dev
->input_id
.version
= 1;
84 dev
->input_id
.vendor
= le16_to_cpu(dev
->udev
->descriptor
.idVendor
);
85 dev
->input_id
.product
= le16_to_cpu(dev
->udev
->descriptor
.idProduct
);
89 dev
->allowed_protocols
= RC_PROTO_BIT_ALL_IR_DECODER
;
90 dev
->map_name
= sms_get_board(board_id
)->rc_codes
;
91 dev
->driver_name
= MODULE_NAME
;
93 pr_debug("Input device (IR) %s is set for key events\n",
96 err
= rc_register_device(dev
);
98 pr_err("Failed to register device\n");
103 coredev
->ir
.dev
= dev
;
107 void sms_ir_exit(struct smscore_device_t
*coredev
)
109 rc_unregister_device(coredev
->ir
.dev
);