[media] mceusb: add and use mce_dbg printk macro
[deliverable/linux.git] / drivers / media / rc / mceusb.c
CommitLineData
66e89522
JW
1/*
2 * Driver for USB Windows Media Center Ed. eHome Infrared Transceivers
3 *
4 * Copyright (c) 2010 by Jarod Wilson <jarod@redhat.com>
5 *
6 * Based on the original lirc_mceusb and lirc_mceusb2 drivers, by Dan
7 * Conti, Martin Blatter and Daniel Melander, the latter of which was
8 * in turn also based on the lirc_atiusb driver by Paul Miller. The
9 * two mce drivers were merged into one by Jarod Wilson, with transmit
10 * support for the 1st-gen device added primarily by Patrick Calhoun,
11 * with a bit of tweaks by Jarod. Debugging improvements and proper
12 * support for what appears to be 3rd-gen hardware added by Jarod.
13 * Initial port from lirc driver to ir-core drivery by Jarod, based
14 * partially on a port to an earlier proposed IR infrastructure by
15 * Jon Smirl, which included enhancements and simplifications to the
16 * incoming IR buffer parsing routines.
17 *
66e89522
JW
18 *
19 * This program is free software; you can redistribute it and/or modify
20 * it under the terms of the GNU General Public License as published by
21 * the Free Software Foundation; either version 2 of the License, or
22 * (at your option) any later version.
23 *
24 * This program is distributed in the hope that it will be useful,
25 * but WITHOUT ANY WARRANTY; without even the implied warranty of
26 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
27 * GNU General Public License for more details.
28 *
29 * You should have received a copy of the GNU General Public License
30 * along with this program; if not, write to the Free Software
31 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
32 *
33 */
34
35#include <linux/device.h>
36#include <linux/module.h>
37#include <linux/slab.h>
635f76b2
PB
38#include <linux/usb.h>
39#include <linux/usb/input.h>
6bda9644 40#include <media/rc-core.h>
66e89522
JW
41
42#define DRIVER_VERSION "1.91"
43#define DRIVER_AUTHOR "Jarod Wilson <jarod@wilsonet.com>"
44#define DRIVER_DESC "Windows Media Center Ed. eHome Infrared Transceiver " \
45 "device driver"
46#define DRIVER_NAME "mceusb"
47
4a883918
JW
48#define USB_BUFLEN 32 /* USB reception buffer length */
49#define USB_CTRL_MSG_SZ 2 /* Size of usb ctrl msg on gen1 hw */
50#define MCE_G1_INIT_MSGS 40 /* Init messages on gen1 hw to throw out */
66e89522
JW
51
52/* MCE constants */
4a883918
JW
53#define MCE_CMDBUF_SIZE 384 /* MCE Command buffer length */
54#define MCE_TIME_UNIT 50 /* Approx 50us resolution */
55#define MCE_CODE_LENGTH 5 /* Normal length of packet (with header) */
56#define MCE_PACKET_SIZE 4 /* Normal length of packet (without header) */
57#define MCE_IRDATA_HEADER 0x84 /* Actual header format is 0x80 + num_bytes */
58#define MCE_IRDATA_TRAILER 0x80 /* End of IR data */
59#define MCE_TX_HEADER_LENGTH 3 /* # of bytes in the initializing tx header */
60#define MCE_MAX_CHANNELS 2 /* Two transmitters, hardware dependent? */
61#define MCE_DEFAULT_TX_MASK 0x03 /* Vals: TX1=0x01, TX2=0x02, ALL=0x03 */
62#define MCE_PULSE_BIT 0x80 /* Pulse bit, MSB set == PULSE else SPACE */
63#define MCE_PULSE_MASK 0x7f /* Pulse mask */
64#define MCE_MAX_PULSE_LENGTH 0x7f /* Longest transmittable pulse symbol */
65
66#define MCE_HW_CMD_HEADER 0xff /* MCE hardware command header */
67#define MCE_COMMAND_HEADER 0x9f /* MCE command header */
68#define MCE_COMMAND_MASK 0xe0 /* Mask out command bits */
69#define MCE_COMMAND_NULL 0x00 /* These show up various places... */
70/* if buf[i] & MCE_COMMAND_MASK == 0x80 and buf[i] != MCE_COMMAND_HEADER,
71 * then we're looking at a raw IR data sample */
72#define MCE_COMMAND_IRDATA 0x80
73#define MCE_PACKET_LENGTH_MASK 0x1f /* Packet length mask */
74
75/* Sub-commands, which follow MCE_COMMAND_HEADER or MCE_HW_CMD_HEADER */
1cd50f25 76#define MCE_CMD_SIG_END 0x01 /* End of signal */
4a883918
JW
77#define MCE_CMD_PING 0x03 /* Ping device */
78#define MCE_CMD_UNKNOWN 0x04 /* Unknown */
79#define MCE_CMD_UNKNOWN2 0x05 /* Unknown */
80#define MCE_CMD_S_CARRIER 0x06 /* Set TX carrier frequency */
81#define MCE_CMD_G_CARRIER 0x07 /* Get TX carrier frequency */
82#define MCE_CMD_S_TXMASK 0x08 /* Set TX port bitmask */
83#define MCE_CMD_UNKNOWN3 0x09 /* Unknown */
84#define MCE_CMD_UNKNOWN4 0x0a /* Unknown */
85#define MCE_CMD_G_REVISION 0x0b /* Get hw/sw revision */
86#define MCE_CMD_S_TIMEOUT 0x0c /* Set RX timeout value */
87#define MCE_CMD_G_TIMEOUT 0x0d /* Get RX timeout value */
88#define MCE_CMD_UNKNOWN5 0x0e /* Unknown */
89#define MCE_CMD_UNKNOWN6 0x0f /* Unknown */
90#define MCE_CMD_G_RXPORTSTS 0x11 /* Get RX port status */
91#define MCE_CMD_G_TXMASK 0x13 /* Set TX port bitmask */
92#define MCE_CMD_S_RXSENSOR 0x14 /* Set RX sensor (std/learning) */
93#define MCE_CMD_G_RXSENSOR 0x15 /* Get RX sensor (std/learning) */
2ee95db2 94#define MCE_RSP_PULSE_COUNT 0x15 /* RX pulse count (only if learning) */
4a883918
JW
95#define MCE_CMD_TX_PORTS 0x16 /* Get number of TX ports */
96#define MCE_CMD_G_WAKESRC 0x17 /* Get wake source */
97#define MCE_CMD_UNKNOWN7 0x18 /* Unknown */
98#define MCE_CMD_UNKNOWN8 0x19 /* Unknown */
99#define MCE_CMD_UNKNOWN9 0x1b /* Unknown */
100#define MCE_CMD_DEVICE_RESET 0xaa /* Reset the hardware */
101#define MCE_RSP_CMD_INVALID 0xfe /* Invalid command issued */
66e89522
JW
102
103
104/* module parameters */
105#ifdef CONFIG_USB_DEBUG
106static int debug = 1;
107#else
108static int debug;
109#endif
110
5ae8f9a3
JW
111#define mce_dbg(dev, fmt, ...) \
112 do { \
113 if (debug) \
114 dev_info(dev, fmt, ## __VA_ARGS__); \
115 } while (0)
116
66e89522
JW
117/* general constants */
118#define SEND_FLAG_IN_PROGRESS 1
119#define SEND_FLAG_COMPLETE 2
120#define RECV_FLAG_IN_PROGRESS 3
121#define RECV_FLAG_COMPLETE 4
122
123#define MCEUSB_RX 1
124#define MCEUSB_TX 2
125
126#define VENDOR_PHILIPS 0x0471
127#define VENDOR_SMK 0x0609
128#define VENDOR_TATUNG 0x1460
129#define VENDOR_GATEWAY 0x107b
130#define VENDOR_SHUTTLE 0x1308
131#define VENDOR_SHUTTLE2 0x051c
132#define VENDOR_MITSUMI 0x03ee
133#define VENDOR_TOPSEED 0x1784
134#define VENDOR_RICAVISION 0x179d
135#define VENDOR_ITRON 0x195d
136#define VENDOR_FIC 0x1509
137#define VENDOR_LG 0x043e
138#define VENDOR_MICROSOFT 0x045e
139#define VENDOR_FORMOSA 0x147a
140#define VENDOR_FINTEK 0x1934
141#define VENDOR_PINNACLE 0x2304
142#define VENDOR_ECS 0x1019
143#define VENDOR_WISTRON 0x0fb8
144#define VENDOR_COMPRO 0x185b
145#define VENDOR_NORTHSTAR 0x04eb
146#define VENDOR_REALTEK 0x0bda
147#define VENDOR_TIVO 0x105a
56e92f60 148#define VENDOR_CONEXANT 0x0572
66e89522 149
37dbd3a6
MCC
150enum mceusb_model_type {
151 MCE_GEN2 = 0, /* Most boards */
152 MCE_GEN1,
153 MCE_GEN3,
154 MCE_GEN2_TX_INV,
155 POLARIS_EVK,
6f6c625d 156 CX_HYBRID_TV,
a6994eb0 157 MULTIFUNCTION,
d8ee99e7 158 TIVO_KIT,
2faa0ca8 159 MCE_GEN2_NO_TX,
37dbd3a6
MCC
160};
161
162struct mceusb_model {
163 u32 mce_gen1:1;
164 u32 mce_gen2:1;
165 u32 mce_gen3:1;
d8cc7fd7 166 u32 tx_mask_normal:1;
6f6c625d 167 u32 no_tx:1;
37dbd3a6 168
a6994eb0
JW
169 int ir_intfnum;
170
17c2b1fd 171 const char *rc_map; /* Allow specify a per-board map */
3459d455 172 const char *name; /* per-board name */
37dbd3a6
MCC
173};
174
175static const struct mceusb_model mceusb_model[] = {
176 [MCE_GEN1] = {
177 .mce_gen1 = 1,
d8cc7fd7 178 .tx_mask_normal = 1,
37dbd3a6
MCC
179 },
180 [MCE_GEN2] = {
181 .mce_gen2 = 1,
182 },
2faa0ca8
JW
183 [MCE_GEN2_NO_TX] = {
184 .mce_gen2 = 1,
185 .no_tx = 1,
186 },
37dbd3a6
MCC
187 [MCE_GEN2_TX_INV] = {
188 .mce_gen2 = 1,
d8cc7fd7 189 .tx_mask_normal = 1,
37dbd3a6
MCC
190 },
191 [MCE_GEN3] = {
192 .mce_gen3 = 1,
d8cc7fd7 193 .tx_mask_normal = 1,
37dbd3a6
MCC
194 },
195 [POLARIS_EVK] = {
17c2b1fd
MCC
196 /*
197 * In fact, the EVK is shipped without
198 * remotes, but we should have something handy,
199 * to allow testing it
200 */
15195d3a 201 .rc_map = RC_MAP_HAUPPAUGE,
6f6c625d
JW
202 .name = "Conexant Hybrid TV (cx231xx) MCE IR",
203 },
204 [CX_HYBRID_TV] = {
6f6c625d
JW
205 .no_tx = 1, /* tx isn't wired up at all */
206 .name = "Conexant Hybrid TV (cx231xx) MCE IR",
37dbd3a6 207 },
a6994eb0
JW
208 [MULTIFUNCTION] = {
209 .mce_gen2 = 1,
210 .ir_intfnum = 2,
211 },
d8ee99e7
JW
212 [TIVO_KIT] = {
213 .mce_gen2 = 1,
214 .rc_map = RC_MAP_TIVO,
215 },
37dbd3a6
MCC
216};
217
66e89522
JW
218static struct usb_device_id mceusb_dev_table[] = {
219 /* Original Microsoft MCE IR Transceiver (often HP-branded) */
37dbd3a6
MCC
220 { USB_DEVICE(VENDOR_MICROSOFT, 0x006d),
221 .driver_info = MCE_GEN1 },
66e89522
JW
222 /* Philips Infrared Transceiver - Sahara branded */
223 { USB_DEVICE(VENDOR_PHILIPS, 0x0608) },
224 /* Philips Infrared Transceiver - HP branded */
37dbd3a6
MCC
225 { USB_DEVICE(VENDOR_PHILIPS, 0x060c),
226 .driver_info = MCE_GEN2_TX_INV },
66e89522
JW
227 /* Philips SRM5100 */
228 { USB_DEVICE(VENDOR_PHILIPS, 0x060d) },
229 /* Philips Infrared Transceiver - Omaura */
230 { USB_DEVICE(VENDOR_PHILIPS, 0x060f) },
231 /* Philips Infrared Transceiver - Spinel plus */
232 { USB_DEVICE(VENDOR_PHILIPS, 0x0613) },
233 /* Philips eHome Infrared Transceiver */
234 { USB_DEVICE(VENDOR_PHILIPS, 0x0815) },
c13df9cf
JW
235 /* Philips/Spinel plus IR transceiver for ASUS */
236 { USB_DEVICE(VENDOR_PHILIPS, 0x206c) },
237 /* Philips/Spinel plus IR transceiver for ASUS */
238 { USB_DEVICE(VENDOR_PHILIPS, 0x2088) },
e296e127
JW
239 /* Philips IR transceiver (Dell branded) */
240 { USB_DEVICE(VENDOR_PHILIPS, 0x2093) },
a6994eb0
JW
241 /* Realtek MCE IR Receiver and card reader */
242 { USB_DEVICE(VENDOR_REALTEK, 0x0161),
243 .driver_info = MULTIFUNCTION },
66e89522 244 /* SMK/Toshiba G83C0004D410 */
37dbd3a6
MCC
245 { USB_DEVICE(VENDOR_SMK, 0x031d),
246 .driver_info = MCE_GEN2_TX_INV },
66e89522 247 /* SMK eHome Infrared Transceiver (Sony VAIO) */
37dbd3a6
MCC
248 { USB_DEVICE(VENDOR_SMK, 0x0322),
249 .driver_info = MCE_GEN2_TX_INV },
66e89522 250 /* bundled with Hauppauge PVR-150 */
37dbd3a6
MCC
251 { USB_DEVICE(VENDOR_SMK, 0x0334),
252 .driver_info = MCE_GEN2_TX_INV },
66e89522
JW
253 /* SMK eHome Infrared Transceiver */
254 { USB_DEVICE(VENDOR_SMK, 0x0338) },
255 /* Tatung eHome Infrared Transceiver */
256 { USB_DEVICE(VENDOR_TATUNG, 0x9150) },
257 /* Shuttle eHome Infrared Transceiver */
258 { USB_DEVICE(VENDOR_SHUTTLE, 0xc001) },
259 /* Shuttle eHome Infrared Transceiver */
260 { USB_DEVICE(VENDOR_SHUTTLE2, 0xc001) },
261 /* Gateway eHome Infrared Transceiver */
262 { USB_DEVICE(VENDOR_GATEWAY, 0x3009) },
263 /* Mitsumi */
264 { USB_DEVICE(VENDOR_MITSUMI, 0x2501) },
265 /* Topseed eHome Infrared Transceiver */
37dbd3a6
MCC
266 { USB_DEVICE(VENDOR_TOPSEED, 0x0001),
267 .driver_info = MCE_GEN2_TX_INV },
66e89522 268 /* Topseed HP eHome Infrared Transceiver */
37dbd3a6
MCC
269 { USB_DEVICE(VENDOR_TOPSEED, 0x0006),
270 .driver_info = MCE_GEN2_TX_INV },
66e89522 271 /* Topseed eHome Infrared Transceiver */
37dbd3a6
MCC
272 { USB_DEVICE(VENDOR_TOPSEED, 0x0007),
273 .driver_info = MCE_GEN2_TX_INV },
66e89522 274 /* Topseed eHome Infrared Transceiver */
37dbd3a6
MCC
275 { USB_DEVICE(VENDOR_TOPSEED, 0x0008),
276 .driver_info = MCE_GEN3 },
66e89522 277 /* Topseed eHome Infrared Transceiver */
37dbd3a6
MCC
278 { USB_DEVICE(VENDOR_TOPSEED, 0x000a),
279 .driver_info = MCE_GEN2_TX_INV },
66e89522 280 /* Topseed eHome Infrared Transceiver */
37dbd3a6 281 { USB_DEVICE(VENDOR_TOPSEED, 0x0011),
7d9a46f9 282 .driver_info = MCE_GEN3 },
66e89522
JW
283 /* Ricavision internal Infrared Transceiver */
284 { USB_DEVICE(VENDOR_RICAVISION, 0x0010) },
285 /* Itron ione Libra Q-11 */
286 { USB_DEVICE(VENDOR_ITRON, 0x7002) },
287 /* FIC eHome Infrared Transceiver */
288 { USB_DEVICE(VENDOR_FIC, 0x9242) },
289 /* LG eHome Infrared Transceiver */
290 { USB_DEVICE(VENDOR_LG, 0x9803) },
291 /* Microsoft MCE Infrared Transceiver */
292 { USB_DEVICE(VENDOR_MICROSOFT, 0x00a0) },
293 /* Formosa eHome Infrared Transceiver */
294 { USB_DEVICE(VENDOR_FORMOSA, 0xe015) },
295 /* Formosa21 / eHome Infrared Receiver */
296 { USB_DEVICE(VENDOR_FORMOSA, 0xe016) },
297 /* Formosa aim / Trust MCE Infrared Receiver */
2faa0ca8
JW
298 { USB_DEVICE(VENDOR_FORMOSA, 0xe017),
299 .driver_info = MCE_GEN2_NO_TX },
66e89522
JW
300 /* Formosa Industrial Computing / Beanbag Emulation Device */
301 { USB_DEVICE(VENDOR_FORMOSA, 0xe018) },
302 /* Formosa21 / eHome Infrared Receiver */
303 { USB_DEVICE(VENDOR_FORMOSA, 0xe03a) },
304 /* Formosa Industrial Computing AIM IR605/A */
305 { USB_DEVICE(VENDOR_FORMOSA, 0xe03c) },
306 /* Formosa Industrial Computing */
307 { USB_DEVICE(VENDOR_FORMOSA, 0xe03e) },
fbb1f1b0
JW
308 /* Fintek eHome Infrared Transceiver (HP branded) */
309 { USB_DEVICE(VENDOR_FINTEK, 0x5168) },
66e89522
JW
310 /* Fintek eHome Infrared Transceiver */
311 { USB_DEVICE(VENDOR_FINTEK, 0x0602) },
312 /* Fintek eHome Infrared Transceiver (in the AOpen MP45) */
313 { USB_DEVICE(VENDOR_FINTEK, 0x0702) },
314 /* Pinnacle Remote Kit */
37dbd3a6
MCC
315 { USB_DEVICE(VENDOR_PINNACLE, 0x0225),
316 .driver_info = MCE_GEN3 },
66e89522
JW
317 /* Elitegroup Computer Systems IR */
318 { USB_DEVICE(VENDOR_ECS, 0x0f38) },
319 /* Wistron Corp. eHome Infrared Receiver */
320 { USB_DEVICE(VENDOR_WISTRON, 0x0002) },
321 /* Compro K100 */
322 { USB_DEVICE(VENDOR_COMPRO, 0x3020) },
323 /* Compro K100 v2 */
324 { USB_DEVICE(VENDOR_COMPRO, 0x3082) },
325 /* Northstar Systems, Inc. eHome Infrared Transceiver */
326 { USB_DEVICE(VENDOR_NORTHSTAR, 0xe004) },
327 /* TiVo PC IR Receiver */
d8ee99e7
JW
328 { USB_DEVICE(VENDOR_TIVO, 0x2000),
329 .driver_info = TIVO_KIT },
6f6c625d 330 /* Conexant Hybrid TV "Shelby" Polaris SDK */
37dbd3a6
MCC
331 { USB_DEVICE(VENDOR_CONEXANT, 0x58a1),
332 .driver_info = POLARIS_EVK },
6f6c625d
JW
333 /* Conexant Hybrid TV RDU253S Polaris */
334 { USB_DEVICE(VENDOR_CONEXANT, 0x58a5),
335 .driver_info = CX_HYBRID_TV },
66e89522
JW
336 /* Terminating entry */
337 { }
338};
339
66e89522
JW
340/* data structure for each usb transceiver */
341struct mceusb_dev {
342 /* ir-core bits */
d8b4b582 343 struct rc_dev *rc;
2ee95db2
JW
344
345 /* optional features we can enable */
346 bool carrier_report_enabled;
347 bool learning_enabled;
66e89522
JW
348
349 /* core device bits */
350 struct device *dev;
66e89522
JW
351
352 /* usb */
353 struct usb_device *usbdev;
354 struct urb *urb_in;
355 struct usb_endpoint_descriptor *usb_ep_in;
356 struct usb_endpoint_descriptor *usb_ep_out;
357
358 /* buffers and dma */
359 unsigned char *buf_in;
360 unsigned int len_in;
2ee95db2
JW
361 dma_addr_t dma_in;
362 dma_addr_t dma_out;
39dc5c3a
MCC
363
364 enum {
365 CMD_HEADER = 0,
366 SUBCMD,
367 CMD_DATA,
368 PARSE_IRDATA,
369 } parser_state;
39dc5c3a 370
2ee95db2 371 u8 cmd, rem; /* Remaining IR data bytes in packet */
66e89522
JW
372
373 struct {
374 u32 connected:1;
d8cc7fd7 375 u32 tx_mask_normal:1;
66e89522 376 u32 microsoft_gen1:1;
6f6c625d 377 u32 no_tx:1;
66e89522
JW
378 } flags;
379
e23fb964 380 /* transmit support */
66e89522 381 int send_flags;
e23fb964
JW
382 u32 carrier;
383 unsigned char tx_mask;
66e89522
JW
384
385 char name[128];
386 char phys[64];
37dbd3a6 387 enum mceusb_model_type model;
66e89522
JW
388};
389
390/*
391 * MCE Device Command Strings
392 * Device command responses vary from device to device...
393 * - DEVICE_RESET resets the hardware to its default state
394 * - GET_REVISION fetches the hardware/software revision, common
395 * replies are ff 0b 45 ff 1b 08 and ff 0b 50 ff 1b 42
396 * - GET_CARRIER_FREQ gets the carrier mode and frequency of the
397 * device, with replies in the form of 9f 06 MM FF, where MM is 0-3,
398 * meaning clk of 10000000, 2500000, 625000 or 156250, and FF is
399 * ((clk / frequency) - 1)
400 * - GET_RX_TIMEOUT fetches the receiver timeout in units of 50us,
401 * response in the form of 9f 0c msb lsb
402 * - GET_TX_BITMASK fetches the transmitter bitmask, replies in
403 * the form of 9f 08 bm, where bm is the bitmask
404 * - GET_RX_SENSOR fetches the RX sensor setting -- long-range
405 * general use one or short-range learning one, in the form of
406 * 9f 14 ss, where ss is either 01 for long-range or 02 for short
407 * - SET_CARRIER_FREQ sets a new carrier mode and frequency
408 * - SET_TX_BITMASK sets the transmitter bitmask
409 * - SET_RX_TIMEOUT sets the receiver timeout
410 * - SET_RX_SENSOR sets which receiver sensor to use
411 */
4a883918
JW
412static char DEVICE_RESET[] = {MCE_COMMAND_NULL, MCE_HW_CMD_HEADER,
413 MCE_CMD_DEVICE_RESET};
414static char GET_REVISION[] = {MCE_HW_CMD_HEADER, MCE_CMD_G_REVISION};
415static char GET_UNKNOWN[] = {MCE_HW_CMD_HEADER, MCE_CMD_UNKNOWN7};
416static char GET_UNKNOWN2[] = {MCE_COMMAND_HEADER, MCE_CMD_UNKNOWN2};
417static char GET_CARRIER_FREQ[] = {MCE_COMMAND_HEADER, MCE_CMD_G_CARRIER};
418static char GET_RX_TIMEOUT[] = {MCE_COMMAND_HEADER, MCE_CMD_G_TIMEOUT};
419static char GET_TX_BITMASK[] = {MCE_COMMAND_HEADER, MCE_CMD_G_TXMASK};
420static char GET_RX_SENSOR[] = {MCE_COMMAND_HEADER, MCE_CMD_G_RXSENSOR};
66e89522
JW
421/* sub in desired values in lower byte or bytes for full command */
422/* FIXME: make use of these for transmit.
4a883918
JW
423static char SET_CARRIER_FREQ[] = {MCE_COMMAND_HEADER,
424 MCE_CMD_S_CARRIER, 0x00, 0x00};
425static char SET_TX_BITMASK[] = {MCE_COMMAND_HEADER, MCE_CMD_S_TXMASK, 0x00};
426static char SET_RX_TIMEOUT[] = {MCE_COMMAND_HEADER,
427 MCE_CMD_S_TIMEOUT, 0x00, 0x00};
428static char SET_RX_SENSOR[] = {MCE_COMMAND_HEADER,
429 MCE_CMD_S_RXSENSOR, 0x00};
66e89522
JW
430*/
431
39dc5c3a
MCC
432static int mceusb_cmdsize(u8 cmd, u8 subcmd)
433{
434 int datasize = 0;
435
436 switch (cmd) {
4a883918
JW
437 case MCE_COMMAND_NULL:
438 if (subcmd == MCE_HW_CMD_HEADER)
39dc5c3a
MCC
439 datasize = 1;
440 break;
4a883918 441 case MCE_HW_CMD_HEADER:
39dc5c3a 442 switch (subcmd) {
4a883918 443 case MCE_CMD_G_REVISION:
39dc5c3a
MCC
444 datasize = 2;
445 break;
446 }
4a883918 447 case MCE_COMMAND_HEADER:
39dc5c3a 448 switch (subcmd) {
4a883918
JW
449 case MCE_CMD_UNKNOWN:
450 case MCE_CMD_S_CARRIER:
451 case MCE_CMD_S_TIMEOUT:
2ee95db2 452 case MCE_RSP_PULSE_COUNT:
39dc5c3a
MCC
453 datasize = 2;
454 break;
1cd50f25 455 case MCE_CMD_SIG_END:
4a883918
JW
456 case MCE_CMD_S_TXMASK:
457 case MCE_CMD_S_RXSENSOR:
39dc5c3a
MCC
458 datasize = 1;
459 break;
460 }
461 }
462 return datasize;
463}
464
66e89522 465static void mceusb_dev_printdata(struct mceusb_dev *ir, char *buf,
36e9d260 466 int offset, int len, bool out)
66e89522
JW
467{
468 char codes[USB_BUFLEN * 3 + 1];
469 char inout[9];
66e89522
JW
470 u8 cmd, subcmd, data1, data2;
471 struct device *dev = ir->dev;
36e9d260
JW
472 int i, start, skip = 0;
473
474 if (!debug)
475 return;
66e89522 476
657290b6 477 /* skip meaningless 0xb1 0x60 header bytes on orig receiver */
29b4494b 478 if (ir->flags.microsoft_gen1 && !out && !offset)
36e9d260 479 skip = 2;
66e89522 480
36e9d260 481 if (len <= skip)
66e89522
JW
482 return;
483
484 for (i = 0; i < len && i < USB_BUFLEN; i++)
36e9d260 485 snprintf(codes + i * 3, 4, "%02x ", buf[i + offset] & 0xff);
66e89522 486
36e9d260 487 dev_info(dev, "%sx data: %s(length=%d)\n",
66e89522
JW
488 (out ? "t" : "r"), codes, len);
489
490 if (out)
491 strcpy(inout, "Request\0");
492 else
493 strcpy(inout, "Got\0");
494
36e9d260
JW
495 start = offset + skip;
496 cmd = buf[start] & 0xff;
497 subcmd = buf[start + 1] & 0xff;
498 data1 = buf[start + 2] & 0xff;
499 data2 = buf[start + 3] & 0xff;
66e89522
JW
500
501 switch (cmd) {
4a883918
JW
502 case MCE_COMMAND_NULL:
503 if ((subcmd == MCE_HW_CMD_HEADER) &&
504 (data1 == MCE_CMD_DEVICE_RESET))
66e89522
JW
505 dev_info(dev, "Device reset requested\n");
506 else
507 dev_info(dev, "Unknown command 0x%02x 0x%02x\n",
508 cmd, subcmd);
509 break;
4a883918 510 case MCE_HW_CMD_HEADER:
66e89522 511 switch (subcmd) {
4a883918 512 case MCE_CMD_G_REVISION:
66e89522
JW
513 if (len == 2)
514 dev_info(dev, "Get hw/sw rev?\n");
515 else
516 dev_info(dev, "hw/sw rev 0x%02x 0x%02x "
517 "0x%02x 0x%02x\n", data1, data2,
36e9d260 518 buf[start + 4], buf[start + 5]);
66e89522 519 break;
4a883918 520 case MCE_CMD_DEVICE_RESET:
66e89522
JW
521 dev_info(dev, "Device reset requested\n");
522 break;
4a883918 523 case MCE_RSP_CMD_INVALID:
66e89522
JW
524 dev_info(dev, "Previous command not supported\n");
525 break;
4a883918
JW
526 case MCE_CMD_UNKNOWN7:
527 case MCE_CMD_UNKNOWN9:
66e89522
JW
528 default:
529 dev_info(dev, "Unknown command 0x%02x 0x%02x\n",
530 cmd, subcmd);
531 break;
532 }
533 break;
4a883918 534 case MCE_COMMAND_HEADER:
66e89522 535 switch (subcmd) {
1cd50f25
JW
536 case MCE_CMD_SIG_END:
537 dev_info(dev, "End of signal\n");
538 break;
4a883918 539 case MCE_CMD_PING:
66e89522
JW
540 dev_info(dev, "Ping\n");
541 break;
4a883918 542 case MCE_CMD_UNKNOWN:
66e89522
JW
543 dev_info(dev, "Resp to 9f 05 of 0x%02x 0x%02x\n",
544 data1, data2);
545 break;
4a883918 546 case MCE_CMD_S_CARRIER:
66e89522
JW
547 dev_info(dev, "%s carrier mode and freq of "
548 "0x%02x 0x%02x\n", inout, data1, data2);
549 break;
4a883918 550 case MCE_CMD_G_CARRIER:
66e89522
JW
551 dev_info(dev, "Get carrier mode and freq\n");
552 break;
4a883918 553 case MCE_CMD_S_TXMASK:
66e89522
JW
554 dev_info(dev, "%s transmit blaster mask of 0x%02x\n",
555 inout, data1);
556 break;
4a883918 557 case MCE_CMD_S_TIMEOUT:
66e89522
JW
558 /* value is in units of 50us, so x*50/100 or x/2 ms */
559 dev_info(dev, "%s receive timeout of %d ms\n",
560 inout, ((data1 << 8) | data2) / 2);
561 break;
4a883918 562 case MCE_CMD_G_TIMEOUT:
66e89522
JW
563 dev_info(dev, "Get receive timeout\n");
564 break;
4a883918 565 case MCE_CMD_G_TXMASK:
66e89522
JW
566 dev_info(dev, "Get transmit blaster mask\n");
567 break;
4a883918 568 case MCE_CMD_S_RXSENSOR:
66e89522
JW
569 dev_info(dev, "%s %s-range receive sensor in use\n",
570 inout, data1 == 0x02 ? "short" : "long");
571 break;
4a883918 572 case MCE_CMD_G_RXSENSOR:
2ee95db2
JW
573 /* aka MCE_RSP_PULSE_COUNT */
574 if (out)
66e89522 575 dev_info(dev, "Get receive sensor\n");
2ee95db2
JW
576 else if (ir->learning_enabled)
577 dev_info(dev, "RX pulse count: %d\n",
66e89522
JW
578 ((data1 << 8) | data2));
579 break;
4a883918 580 case MCE_RSP_CMD_INVALID:
66e89522
JW
581 dev_info(dev, "Error! Hardware is likely wedged...\n");
582 break;
4a883918
JW
583 case MCE_CMD_UNKNOWN2:
584 case MCE_CMD_UNKNOWN3:
585 case MCE_CMD_UNKNOWN5:
66e89522
JW
586 default:
587 dev_info(dev, "Unknown command 0x%02x 0x%02x\n",
588 cmd, subcmd);
589 break;
590 }
591 break;
592 default:
593 break;
594 }
36e9d260
JW
595
596 if (cmd == MCE_IRDATA_TRAILER)
597 dev_info(dev, "End of raw IR data\n");
598 else if ((cmd != MCE_COMMAND_HEADER) &&
599 ((cmd & MCE_COMMAND_MASK) == MCE_COMMAND_IRDATA))
600 dev_info(dev, "Raw IR data, %d pulse/space samples\n", ir->rem);
66e89522
JW
601}
602
7c294402 603static void mce_async_callback(struct urb *urb, struct pt_regs *regs)
66e89522
JW
604{
605 struct mceusb_dev *ir;
606 int len;
607
608 if (!urb)
609 return;
610
611 ir = urb->context;
612 if (ir) {
613 len = urb->actual_length;
614
5ae8f9a3 615 mce_dbg(ir->dev, "callback called (status=%d len=%d)\n",
66e89522
JW
616 urb->status, len);
617
36e9d260 618 mceusb_dev_printdata(ir, urb->transfer_buffer, 0, len, true);
66e89522
JW
619 }
620
621}
622
623/* request incoming or send outgoing usb packet - used to initialize remote */
51ea6292
JW
624static void mce_request_packet(struct mceusb_dev *ir, unsigned char *data,
625 int size, int urb_type)
66e89522 626{
51ea6292 627 int res, pipe;
66e89522
JW
628 struct urb *async_urb;
629 struct device *dev = ir->dev;
630 unsigned char *async_buf;
631
632 if (urb_type == MCEUSB_TX) {
633 async_urb = usb_alloc_urb(0, GFP_KERNEL);
634 if (unlikely(!async_urb)) {
635 dev_err(dev, "Error, couldn't allocate urb!\n");
636 return;
637 }
638
639 async_buf = kzalloc(size, GFP_KERNEL);
640 if (!async_buf) {
641 dev_err(dev, "Error, couldn't allocate buf!\n");
642 usb_free_urb(async_urb);
643 return;
644 }
645
646 /* outbound data */
51ea6292
JW
647 pipe = usb_sndintpipe(ir->usbdev,
648 ir->usb_ep_out->bEndpointAddress);
649 usb_fill_int_urb(async_urb, ir->usbdev, pipe,
7c294402 650 async_buf, size, (usb_complete_t)mce_async_callback,
51ea6292 651 ir, ir->usb_ep_out->bInterval);
66e89522
JW
652 memcpy(async_buf, data, size);
653
654 } else if (urb_type == MCEUSB_RX) {
655 /* standard request */
656 async_urb = ir->urb_in;
657 ir->send_flags = RECV_FLAG_IN_PROGRESS;
658
659 } else {
660 dev_err(dev, "Error! Unknown urb type %d\n", urb_type);
661 return;
662 }
663
5ae8f9a3 664 mce_dbg(dev, "receive request called (size=%#x)\n", size);
66e89522
JW
665
666 async_urb->transfer_buffer_length = size;
667 async_urb->dev = ir->usbdev;
668
669 res = usb_submit_urb(async_urb, GFP_ATOMIC);
670 if (res) {
5ae8f9a3 671 mce_dbg(dev, "receive request FAILED! (res=%d)\n", res);
66e89522
JW
672 return;
673 }
5ae8f9a3 674 mce_dbg(dev, "receive request complete (res=%d)\n", res);
66e89522
JW
675}
676
677static void mce_async_out(struct mceusb_dev *ir, unsigned char *data, int size)
678{
51ea6292 679 mce_request_packet(ir, data, size, MCEUSB_TX);
66e89522
JW
680}
681
682static void mce_sync_in(struct mceusb_dev *ir, unsigned char *data, int size)
683{
51ea6292 684 mce_request_packet(ir, data, size, MCEUSB_RX);
66e89522
JW
685}
686
e23fb964 687/* Send data out the IR blaster port(s) */
d8b4b582 688static int mceusb_tx_ir(struct rc_dev *dev, int *txbuf, u32 n)
e23fb964 689{
d8b4b582 690 struct mceusb_dev *ir = dev->priv;
e23fb964
JW
691 int i, ret = 0;
692 int count, cmdcount = 0;
693 unsigned char *cmdbuf; /* MCE command buffer */
694 long signal_duration = 0; /* Singnal length in us */
695 struct timeval start_time, end_time;
696
697 do_gettimeofday(&start_time);
698
699 count = n / sizeof(int);
700
701 cmdbuf = kzalloc(sizeof(int) * MCE_CMDBUF_SIZE, GFP_KERNEL);
702 if (!cmdbuf)
703 return -ENOMEM;
704
705 /* MCE tx init header */
4a883918
JW
706 cmdbuf[cmdcount++] = MCE_COMMAND_HEADER;
707 cmdbuf[cmdcount++] = MCE_CMD_S_TXMASK;
e23fb964
JW
708 cmdbuf[cmdcount++] = ir->tx_mask;
709
710 /* Generate mce packet data */
711 for (i = 0; (i < count) && (cmdcount < MCE_CMDBUF_SIZE); i++) {
712 signal_duration += txbuf[i];
713 txbuf[i] = txbuf[i] / MCE_TIME_UNIT;
714
715 do { /* loop to support long pulses/spaces > 127*50us=6.35ms */
716
717 /* Insert mce packet header every 4th entry */
718 if ((cmdcount < MCE_CMDBUF_SIZE) &&
719 (cmdcount - MCE_TX_HEADER_LENGTH) %
720 MCE_CODE_LENGTH == 0)
4a883918 721 cmdbuf[cmdcount++] = MCE_IRDATA_HEADER;
e23fb964
JW
722
723 /* Insert mce packet data */
724 if (cmdcount < MCE_CMDBUF_SIZE)
725 cmdbuf[cmdcount++] =
726 (txbuf[i] < MCE_PULSE_BIT ?
727 txbuf[i] : MCE_MAX_PULSE_LENGTH) |
728 (i & 1 ? 0x00 : MCE_PULSE_BIT);
729 else {
730 ret = -EINVAL;
731 goto out;
732 }
733
734 } while ((txbuf[i] > MCE_MAX_PULSE_LENGTH) &&
735 (txbuf[i] -= MCE_MAX_PULSE_LENGTH));
736 }
737
738 /* Fix packet length in last header */
739 cmdbuf[cmdcount - (cmdcount - MCE_TX_HEADER_LENGTH) % MCE_CODE_LENGTH] =
4a883918
JW
740 MCE_COMMAND_IRDATA + (cmdcount - MCE_TX_HEADER_LENGTH) %
741 MCE_CODE_LENGTH - 1;
e23fb964
JW
742
743 /* Check if we have room for the empty packet at the end */
744 if (cmdcount >= MCE_CMDBUF_SIZE) {
745 ret = -EINVAL;
746 goto out;
747 }
748
749 /* All mce commands end with an empty packet (0x80) */
4a883918 750 cmdbuf[cmdcount++] = MCE_IRDATA_TRAILER;
e23fb964
JW
751
752 /* Transmit the command to the mce device */
753 mce_async_out(ir, cmdbuf, cmdcount);
754
755 /*
756 * The lircd gap calculation expects the write function to
757 * wait the time it takes for the ircommand to be sent before
758 * it returns.
759 */
760 do_gettimeofday(&end_time);
761 signal_duration -= (end_time.tv_usec - start_time.tv_usec) +
762 (end_time.tv_sec - start_time.tv_sec) * 1000000;
763
764 /* delay with the closest number of ticks */
765 set_current_state(TASK_INTERRUPTIBLE);
766 schedule_timeout(usecs_to_jiffies(signal_duration));
767
768out:
769 kfree(cmdbuf);
770 return ret ? ret : n;
771}
772
6f6c625d 773/* Sets active IR outputs -- mce devices typically have two */
d8b4b582 774static int mceusb_set_tx_mask(struct rc_dev *dev, u32 mask)
657290b6 775{
d8b4b582 776 struct mceusb_dev *ir = dev->priv;
657290b6 777
d8cc7fd7
JW
778 if (ir->flags.tx_mask_normal)
779 ir->tx_mask = mask;
780 else
4a883918
JW
781 ir->tx_mask = (mask != MCE_DEFAULT_TX_MASK ?
782 mask ^ MCE_DEFAULT_TX_MASK : mask) << 1;
657290b6
JW
783
784 return 0;
785}
786
e23fb964 787/* Sets the send carrier frequency and mode */
d8b4b582 788static int mceusb_set_tx_carrier(struct rc_dev *dev, u32 carrier)
e23fb964 789{
d8b4b582 790 struct mceusb_dev *ir = dev->priv;
e23fb964
JW
791 int clk = 10000000;
792 int prescaler = 0, divisor = 0;
4a883918
JW
793 unsigned char cmdbuf[4] = { MCE_COMMAND_HEADER,
794 MCE_CMD_S_CARRIER, 0x00, 0x00 };
e23fb964
JW
795
796 /* Carrier has changed */
797 if (ir->carrier != carrier) {
798
799 if (carrier == 0) {
800 ir->carrier = carrier;
1cd50f25 801 cmdbuf[2] = MCE_CMD_SIG_END;
4a883918 802 cmdbuf[3] = MCE_IRDATA_TRAILER;
5ae8f9a3 803 mce_dbg(ir->dev, "%s: disabling carrier "
e23fb964
JW
804 "modulation\n", __func__);
805 mce_async_out(ir, cmdbuf, sizeof(cmdbuf));
806 return carrier;
807 }
808
809 for (prescaler = 0; prescaler < 4; ++prescaler) {
810 divisor = (clk >> (2 * prescaler)) / carrier;
4a883918 811 if (divisor <= 0xff) {
e23fb964
JW
812 ir->carrier = carrier;
813 cmdbuf[2] = prescaler;
814 cmdbuf[3] = divisor;
5ae8f9a3 815 mce_dbg(ir->dev, "%s: requesting %u HZ "
e23fb964
JW
816 "carrier\n", __func__, carrier);
817
818 /* Transmit new carrier to mce device */
819 mce_async_out(ir, cmdbuf, sizeof(cmdbuf));
820 return carrier;
821 }
822 }
823
824 return -EINVAL;
825
826 }
827
828 return carrier;
829}
830
2ee95db2
JW
831/*
832 * We don't do anything but print debug spew for many of the command bits
833 * we receive from the hardware, but some of them are useful information
834 * we want to store so that we can use them.
835 */
836static void mceusb_handle_command(struct mceusb_dev *ir, int index)
837{
838 u8 hi = ir->buf_in[index + 1] & 0xff;
839 u8 lo = ir->buf_in[index + 2] & 0xff;
840
841 switch (ir->buf_in[index]) {
842 /* 2-byte return value commands */
843 case MCE_CMD_S_TIMEOUT:
b4608fae 844 ir->rc->timeout = US_TO_NS((hi << 8 | lo) / 2);
2ee95db2
JW
845 break;
846
847 /* 1-byte return value commands */
848 case MCE_CMD_S_TXMASK:
849 ir->tx_mask = hi;
850 break;
851 case MCE_CMD_S_RXSENSOR:
852 ir->learning_enabled = (hi == 0x02);
853 break;
854 default:
855 break;
856 }
857}
858
66e89522
JW
859static void mceusb_process_ir_data(struct mceusb_dev *ir, int buf_len)
860{
4651918a 861 DEFINE_IR_RAW_EVENT(rawir);
39dc5c3a 862 int i = 0;
66e89522
JW
863
864 /* skip meaningless 0xb1 0x60 header bytes on orig receiver */
865 if (ir->flags.microsoft_gen1)
39dc5c3a 866 i = 2;
66e89522 867
29b4494b
JW
868 /* if there's no data, just return now */
869 if (buf_len <= i)
870 return;
871
39dc5c3a
MCC
872 for (; i < buf_len; i++) {
873 switch (ir->parser_state) {
874 case SUBCMD:
875 ir->rem = mceusb_cmdsize(ir->cmd, ir->buf_in[i]);
36e9d260
JW
876 mceusb_dev_printdata(ir, ir->buf_in, i - 1,
877 ir->rem + 2, false);
2ee95db2 878 mceusb_handle_command(ir, i);
39dc5c3a
MCC
879 ir->parser_state = CMD_DATA;
880 break;
881 case PARSE_IRDATA:
66e89522 882 ir->rem--;
5bd9d73c 883 init_ir_raw_event(&rawir);
66e89522
JW
884 rawir.pulse = ((ir->buf_in[i] & MCE_PULSE_BIT) != 0);
885 rawir.duration = (ir->buf_in[i] & MCE_PULSE_MASK)
b4608fae 886 * US_TO_NS(MCE_TIME_UNIT);
66e89522 887
5ae8f9a3 888 mce_dbg(ir->dev, "Storing %s with duration %d\n",
66e89522
JW
889 rawir.pulse ? "pulse" : "space",
890 rawir.duration);
891
d8b4b582 892 ir_raw_event_store_with_filter(ir->rc, &rawir);
39dc5c3a
MCC
893 break;
894 case CMD_DATA:
895 ir->rem--;
896 break;
897 case CMD_HEADER:
898 /* decode mce packets of the form (84),AA,BB,CC,DD */
899 /* IR data packets can span USB messages - rem */
900 ir->cmd = ir->buf_in[i];
4a883918
JW
901 if ((ir->cmd == MCE_COMMAND_HEADER) ||
902 ((ir->cmd & MCE_COMMAND_MASK) !=
903 MCE_COMMAND_IRDATA)) {
39dc5c3a
MCC
904 ir->parser_state = SUBCMD;
905 continue;
906 }
907 ir->rem = (ir->cmd & MCE_PACKET_LENGTH_MASK);
2ee95db2
JW
908 mceusb_dev_printdata(ir, ir->buf_in,
909 i, ir->rem + 1, false);
1cd50f25 910 if (ir->rem)
39dc5c3a 911 ir->parser_state = PARSE_IRDATA;
5bd9d73c
JW
912 else
913 ir_raw_event_reset(ir->rc);
39dc5c3a 914 break;
66e89522
JW
915 }
916
39dc5c3a
MCC
917 if (ir->parser_state != CMD_HEADER && !ir->rem)
918 ir->parser_state = CMD_HEADER;
66e89522 919 }
5ae8f9a3 920 mce_dbg(ir->dev, "processed IR data, calling ir_raw_event_handle\n");
d8b4b582 921 ir_raw_event_handle(ir->rc);
66e89522
JW
922}
923
66e89522
JW
924static void mceusb_dev_recv(struct urb *urb, struct pt_regs *regs)
925{
926 struct mceusb_dev *ir;
927 int buf_len;
928
929 if (!urb)
930 return;
931
932 ir = urb->context;
933 if (!ir) {
934 usb_unlink_urb(urb);
935 return;
936 }
937
938 buf_len = urb->actual_length;
939
66e89522
JW
940 if (ir->send_flags == RECV_FLAG_IN_PROGRESS) {
941 ir->send_flags = SEND_FLAG_COMPLETE;
5ae8f9a3 942 mce_dbg(ir->dev, "setup answer received %d bytes\n",
66e89522
JW
943 buf_len);
944 }
945
946 switch (urb->status) {
947 /* success */
948 case 0:
949 mceusb_process_ir_data(ir, buf_len);
950 break;
951
952 case -ECONNRESET:
953 case -ENOENT:
954 case -ESHUTDOWN:
955 usb_unlink_urb(urb);
956 return;
957
958 case -EPIPE:
959 default:
5ae8f9a3 960 mce_dbg(ir->dev, "Error: urb status = %d\n", urb->status);
66e89522
JW
961 break;
962 }
963
964 usb_submit_urb(urb, GFP_ATOMIC);
965}
966
967static void mceusb_gen1_init(struct mceusb_dev *ir)
968{
ca17a4f0 969 int ret;
22b0766b 970 int maxp = ir->len_in;
66e89522 971 struct device *dev = ir->dev;
b48592e4 972 char *data;
657290b6
JW
973
974 data = kzalloc(USB_CTRL_MSG_SZ, GFP_KERNEL);
975 if (!data) {
976 dev_err(dev, "%s: memory allocation failed!\n", __func__);
657290b6
JW
977 return;
978 }
66e89522
JW
979
980 /*
b48592e4 981 * This is a strange one. Windows issues a set address to the device
66e89522
JW
982 * on the receive control pipe and expect a certain value pair back
983 */
66e89522
JW
984 ret = usb_control_msg(ir->usbdev, usb_rcvctrlpipe(ir->usbdev, 0),
985 USB_REQ_SET_ADDRESS, USB_TYPE_VENDOR, 0, 0,
657290b6 986 data, USB_CTRL_MSG_SZ, HZ * 3);
5ae8f9a3
JW
987 mce_dbg(dev, "%s - ret = %d\n", __func__, ret);
988 mce_dbg(dev, "%s - data[0] = %d, data[1] = %d\n",
66e89522
JW
989 __func__, data[0], data[1]);
990
991 /* set feature: bit rate 38400 bps */
992 ret = usb_control_msg(ir->usbdev, usb_sndctrlpipe(ir->usbdev, 0),
993 USB_REQ_SET_FEATURE, USB_TYPE_VENDOR,
994 0xc04e, 0x0000, NULL, 0, HZ * 3);
995
5ae8f9a3 996 mce_dbg(dev, "%s - ret = %d\n", __func__, ret);
66e89522
JW
997
998 /* bRequest 4: set char length to 8 bits */
999 ret = usb_control_msg(ir->usbdev, usb_sndctrlpipe(ir->usbdev, 0),
1000 4, USB_TYPE_VENDOR,
1001 0x0808, 0x0000, NULL, 0, HZ * 3);
5ae8f9a3 1002 mce_dbg(dev, "%s - retB = %d\n", __func__, ret);
66e89522
JW
1003
1004 /* bRequest 2: set handshaking to use DTR/DSR */
1005 ret = usb_control_msg(ir->usbdev, usb_sndctrlpipe(ir->usbdev, 0),
1006 2, USB_TYPE_VENDOR,
1007 0x0000, 0x0100, NULL, 0, HZ * 3);
5ae8f9a3 1008 mce_dbg(dev, "%s - retC = %d\n", __func__, ret);
657290b6 1009
22b0766b
JW
1010 /* device reset */
1011 mce_async_out(ir, DEVICE_RESET, sizeof(DEVICE_RESET));
1012 mce_sync_in(ir, NULL, maxp);
1013
1014 /* get hw/sw revision? */
1015 mce_async_out(ir, GET_REVISION, sizeof(GET_REVISION));
1016 mce_sync_in(ir, NULL, maxp);
1017
657290b6 1018 kfree(data);
66e89522
JW
1019};
1020
1021static void mceusb_gen2_init(struct mceusb_dev *ir)
1022{
1023 int maxp = ir->len_in;
1024
66e89522
JW
1025 /* device reset */
1026 mce_async_out(ir, DEVICE_RESET, sizeof(DEVICE_RESET));
1027 mce_sync_in(ir, NULL, maxp);
1028
1029 /* get hw/sw revision? */
1030 mce_async_out(ir, GET_REVISION, sizeof(GET_REVISION));
1031 mce_sync_in(ir, NULL, maxp);
1032
22b0766b 1033 /* unknown what the next two actually return... */
66e89522
JW
1034 mce_async_out(ir, GET_UNKNOWN, sizeof(GET_UNKNOWN));
1035 mce_sync_in(ir, NULL, maxp);
22b0766b
JW
1036 mce_async_out(ir, GET_UNKNOWN2, sizeof(GET_UNKNOWN2));
1037 mce_sync_in(ir, NULL, maxp);
66e89522
JW
1038}
1039
22b0766b 1040static void mceusb_get_parameters(struct mceusb_dev *ir)
66e89522
JW
1041{
1042 int maxp = ir->len_in;
1043
66e89522
JW
1044 /* get the carrier and frequency */
1045 mce_async_out(ir, GET_CARRIER_FREQ, sizeof(GET_CARRIER_FREQ));
1046 mce_sync_in(ir, NULL, maxp);
1047
6f6c625d
JW
1048 if (!ir->flags.no_tx) {
1049 /* get the transmitter bitmask */
1050 mce_async_out(ir, GET_TX_BITMASK, sizeof(GET_TX_BITMASK));
1051 mce_sync_in(ir, NULL, maxp);
1052 }
66e89522
JW
1053
1054 /* get receiver timeout value */
1055 mce_async_out(ir, GET_RX_TIMEOUT, sizeof(GET_RX_TIMEOUT));
1056 mce_sync_in(ir, NULL, maxp);
1057
1058 /* get receiver sensor setting */
1059 mce_async_out(ir, GET_RX_SENSOR, sizeof(GET_RX_SENSOR));
1060 mce_sync_in(ir, NULL, maxp);
1061}
1062
d8b4b582 1063static struct rc_dev *mceusb_init_rc_dev(struct mceusb_dev *ir)
66e89522 1064{
66e89522 1065 struct device *dev = ir->dev;
d8b4b582
DH
1066 struct rc_dev *rc;
1067 int ret;
66e89522 1068
d8b4b582
DH
1069 rc = rc_allocate_device();
1070 if (!rc) {
1071 dev_err(dev, "remote dev allocation failed\n");
1072 goto out;
66e89522
JW
1073 }
1074
3459d455 1075 snprintf(ir->name, sizeof(ir->name), "%s (%04x:%04x)",
d8b4b582 1076 mceusb_model[ir->model].name ?
5ad1a555 1077 mceusb_model[ir->model].name :
d8b4b582 1078 "Media Center Ed. eHome Infrared Remote Transceiver",
66e89522
JW
1079 le16_to_cpu(ir->usbdev->descriptor.idVendor),
1080 le16_to_cpu(ir->usbdev->descriptor.idProduct));
1081
66e89522 1082 usb_make_path(ir->usbdev, ir->phys, sizeof(ir->phys));
66e89522 1083
d8b4b582
DH
1084 rc->input_name = ir->name;
1085 rc->input_phys = ir->phys;
1086 usb_to_input_id(ir->usbdev, &rc->input_id);
1087 rc->dev.parent = dev;
1088 rc->priv = ir;
1089 rc->driver_type = RC_DRIVER_IR_RAW;
52b66144 1090 rc->allowed_protos = RC_TYPE_ALL;
b4608fae 1091 rc->timeout = US_TO_NS(1000);
6f6c625d 1092 if (!ir->flags.no_tx) {
d8b4b582
DH
1093 rc->s_tx_mask = mceusb_set_tx_mask;
1094 rc->s_tx_carrier = mceusb_set_tx_carrier;
1095 rc->tx_ir = mceusb_tx_ir;
6f6c625d 1096 }
d8b4b582
DH
1097 rc->driver_name = DRIVER_NAME;
1098 rc->map_name = mceusb_model[ir->model].rc_map ?
1099 mceusb_model[ir->model].rc_map : RC_MAP_RC6_MCE;
66e89522 1100
d8b4b582 1101 ret = rc_register_device(rc);
66e89522 1102 if (ret < 0) {
d8b4b582
DH
1103 dev_err(dev, "remote dev registration failed\n");
1104 goto out;
66e89522
JW
1105 }
1106
d8b4b582 1107 return rc;
66e89522 1108
d8b4b582
DH
1109out:
1110 rc_free_device(rc);
66e89522
JW
1111 return NULL;
1112}
1113
1114static int __devinit mceusb_dev_probe(struct usb_interface *intf,
1115 const struct usb_device_id *id)
1116{
1117 struct usb_device *dev = interface_to_usbdev(intf);
1118 struct usb_host_interface *idesc;
1119 struct usb_endpoint_descriptor *ep = NULL;
1120 struct usb_endpoint_descriptor *ep_in = NULL;
1121 struct usb_endpoint_descriptor *ep_out = NULL;
66e89522 1122 struct mceusb_dev *ir = NULL;
d732a72d 1123 int pipe, maxp, i;
66e89522 1124 char buf[63], name[128] = "";
37dbd3a6 1125 enum mceusb_model_type model = id->driver_info;
66e89522
JW
1126 bool is_gen3;
1127 bool is_microsoft_gen1;
d8cc7fd7 1128 bool tx_mask_normal;
a6994eb0 1129 int ir_intfnum;
66e89522 1130
5ae8f9a3 1131 mce_dbg(&intf->dev, "%s called\n", __func__);
66e89522 1132
66e89522
JW
1133 idesc = intf->cur_altsetting;
1134
37dbd3a6
MCC
1135 is_gen3 = mceusb_model[model].mce_gen3;
1136 is_microsoft_gen1 = mceusb_model[model].mce_gen1;
d8cc7fd7 1137 tx_mask_normal = mceusb_model[model].tx_mask_normal;
a6994eb0 1138 ir_intfnum = mceusb_model[model].ir_intfnum;
56e92f60 1139
a6994eb0
JW
1140 /* There are multi-function devices with non-IR interfaces */
1141 if (idesc->desc.bInterfaceNumber != ir_intfnum)
1142 return -ENODEV;
66e89522
JW
1143
1144 /* step through the endpoints to find first bulk in and out endpoint */
1145 for (i = 0; i < idesc->desc.bNumEndpoints; ++i) {
1146 ep = &idesc->endpoint[i].desc;
1147
1148 if ((ep_in == NULL)
1149 && ((ep->bEndpointAddress & USB_ENDPOINT_DIR_MASK)
1150 == USB_DIR_IN)
1151 && (((ep->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK)
1152 == USB_ENDPOINT_XFER_BULK)
1153 || ((ep->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK)
1154 == USB_ENDPOINT_XFER_INT))) {
1155
66e89522
JW
1156 ep_in = ep;
1157 ep_in->bmAttributes = USB_ENDPOINT_XFER_INT;
d732a72d 1158 ep_in->bInterval = 1;
5ae8f9a3 1159 mce_dbg(&intf->dev, "acceptable inbound endpoint "
d732a72d 1160 "found\n");
66e89522
JW
1161 }
1162
1163 if ((ep_out == NULL)
1164 && ((ep->bEndpointAddress & USB_ENDPOINT_DIR_MASK)
1165 == USB_DIR_OUT)
1166 && (((ep->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK)
1167 == USB_ENDPOINT_XFER_BULK)
1168 || ((ep->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK)
1169 == USB_ENDPOINT_XFER_INT))) {
1170
66e89522
JW
1171 ep_out = ep;
1172 ep_out->bmAttributes = USB_ENDPOINT_XFER_INT;
d732a72d 1173 ep_out->bInterval = 1;
5ae8f9a3 1174 mce_dbg(&intf->dev, "acceptable outbound endpoint "
d732a72d 1175 "found\n");
66e89522
JW
1176 }
1177 }
1178 if (ep_in == NULL) {
5ae8f9a3 1179 mce_dbg(&intf->dev, "inbound and/or endpoint not found\n");
66e89522
JW
1180 return -ENODEV;
1181 }
1182
1183 pipe = usb_rcvintpipe(dev, ep_in->bEndpointAddress);
1184 maxp = usb_maxpacket(dev, pipe, usb_pipeout(pipe));
1185
1186 ir = kzalloc(sizeof(struct mceusb_dev), GFP_KERNEL);
1187 if (!ir)
1188 goto mem_alloc_fail;
1189
1190 ir->buf_in = usb_alloc_coherent(dev, maxp, GFP_ATOMIC, &ir->dma_in);
1191 if (!ir->buf_in)
1192 goto buf_in_alloc_fail;
1193
1194 ir->urb_in = usb_alloc_urb(0, GFP_KERNEL);
1195 if (!ir->urb_in)
1196 goto urb_in_alloc_fail;
1197
1198 ir->usbdev = dev;
1199 ir->dev = &intf->dev;
1200 ir->len_in = maxp;
66e89522 1201 ir->flags.microsoft_gen1 = is_microsoft_gen1;
d8cc7fd7 1202 ir->flags.tx_mask_normal = tx_mask_normal;
6f6c625d 1203 ir->flags.no_tx = mceusb_model[model].no_tx;
37dbd3a6
MCC
1204 ir->model = model;
1205
66e89522
JW
1206 /* Saving usb interface data for use by the transmitter routine */
1207 ir->usb_ep_in = ep_in;
1208 ir->usb_ep_out = ep_out;
1209
1210 if (dev->descriptor.iManufacturer
1211 && usb_string(dev, dev->descriptor.iManufacturer,
1212 buf, sizeof(buf)) > 0)
1213 strlcpy(name, buf, sizeof(name));
1214 if (dev->descriptor.iProduct
1215 && usb_string(dev, dev->descriptor.iProduct,
1216 buf, sizeof(buf)) > 0)
1217 snprintf(name + strlen(name), sizeof(name) - strlen(name),
1218 " %s", buf);
1219
d8b4b582
DH
1220 ir->rc = mceusb_init_rc_dev(ir);
1221 if (!ir->rc)
1222 goto rc_dev_fail;
66e89522 1223
b48592e4
JW
1224 /* flush buffers on the device */
1225 mce_sync_in(ir, NULL, maxp);
1226 mce_sync_in(ir, NULL, maxp);
1227
1228 /* wire up inbound data handler */
66e89522
JW
1229 usb_fill_int_urb(ir->urb_in, dev, pipe, ir->buf_in,
1230 maxp, (usb_complete_t) mceusb_dev_recv, ir, ep_in->bInterval);
1231 ir->urb_in->transfer_dma = ir->dma_in;
1232 ir->urb_in->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
1233
66e89522 1234 /* initialize device */
22b0766b 1235 if (ir->flags.microsoft_gen1)
66e89522 1236 mceusb_gen1_init(ir);
22b0766b 1237 else if (!is_gen3)
66e89522
JW
1238 mceusb_gen2_init(ir);
1239
22b0766b 1240 mceusb_get_parameters(ir);
66e89522 1241
6f6c625d 1242 if (!ir->flags.no_tx)
d8b4b582 1243 mceusb_set_tx_mask(ir->rc, MCE_DEFAULT_TX_MASK);
66e89522
JW
1244
1245 usb_set_intfdata(intf, ir);
1246
1247 dev_info(&intf->dev, "Registered %s on usb%d:%d\n", name,
1248 dev->bus->busnum, dev->devnum);
1249
1250 return 0;
1251
1252 /* Error-handling path */
d8b4b582 1253rc_dev_fail:
66e89522
JW
1254 usb_free_urb(ir->urb_in);
1255urb_in_alloc_fail:
1256 usb_free_coherent(dev, maxp, ir->buf_in, ir->dma_in);
1257buf_in_alloc_fail:
1258 kfree(ir);
1259mem_alloc_fail:
1260 dev_err(&intf->dev, "%s: device setup failed!\n", __func__);
1261
1262 return -ENOMEM;
1263}
1264
1265
1266static void __devexit mceusb_dev_disconnect(struct usb_interface *intf)
1267{
1268 struct usb_device *dev = interface_to_usbdev(intf);
1269 struct mceusb_dev *ir = usb_get_intfdata(intf);
1270
1271 usb_set_intfdata(intf, NULL);
1272
1273 if (!ir)
1274 return;
1275
1276 ir->usbdev = NULL;
d8b4b582 1277 rc_unregister_device(ir->rc);
66e89522
JW
1278 usb_kill_urb(ir->urb_in);
1279 usb_free_urb(ir->urb_in);
1280 usb_free_coherent(dev, ir->len_in, ir->buf_in, ir->dma_in);
1281
1282 kfree(ir);
1283}
1284
1285static int mceusb_dev_suspend(struct usb_interface *intf, pm_message_t message)
1286{
1287 struct mceusb_dev *ir = usb_get_intfdata(intf);
1288 dev_info(ir->dev, "suspend\n");
1289 usb_kill_urb(ir->urb_in);
1290 return 0;
1291}
1292
1293static int mceusb_dev_resume(struct usb_interface *intf)
1294{
1295 struct mceusb_dev *ir = usb_get_intfdata(intf);
1296 dev_info(ir->dev, "resume\n");
1297 if (usb_submit_urb(ir->urb_in, GFP_ATOMIC))
1298 return -EIO;
1299 return 0;
1300}
1301
1302static struct usb_driver mceusb_dev_driver = {
1303 .name = DRIVER_NAME,
1304 .probe = mceusb_dev_probe,
1305 .disconnect = mceusb_dev_disconnect,
1306 .suspend = mceusb_dev_suspend,
1307 .resume = mceusb_dev_resume,
1308 .reset_resume = mceusb_dev_resume,
1309 .id_table = mceusb_dev_table
1310};
1311
1312static int __init mceusb_dev_init(void)
1313{
1314 int ret;
1315
1316 ret = usb_register(&mceusb_dev_driver);
1317 if (ret < 0)
1318 printk(KERN_ERR DRIVER_NAME
1319 ": usb register failed, result = %d\n", ret);
1320
1321 return ret;
1322}
1323
1324static void __exit mceusb_dev_exit(void)
1325{
1326 usb_deregister(&mceusb_dev_driver);
1327}
1328
1329module_init(mceusb_dev_init);
1330module_exit(mceusb_dev_exit);
1331
1332MODULE_DESCRIPTION(DRIVER_DESC);
1333MODULE_AUTHOR(DRIVER_AUTHOR);
1334MODULE_LICENSE("GPL");
1335MODULE_DEVICE_TABLE(usb, mceusb_dev_table);
1336
1337module_param(debug, bool, S_IRUGO | S_IWUSR);
1338MODULE_PARM_DESC(debug, "Debug enabled or not");
This page took 0.185929 seconds and 5 git commands to generate.