Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
awilliam
GitHub Repository: awilliam/linux-vfio
Path: blob/master/drivers/media/rc/redrat3.c
15109 views
1
/*
2
* USB RedRat3 IR Transceiver rc-core driver
3
*
4
* Copyright (c) 2011 by Jarod Wilson <[email protected]>
5
* based heavily on the work of Stephen Cox, with additional
6
* help from RedRat Ltd.
7
*
8
* This driver began life based an an old version of the first-generation
9
* lirc_mceusb driver from the lirc 0.7.2 distribution. It was then
10
* significantly rewritten by Stephen Cox with the aid of RedRat Ltd's
11
* Chris Dodge.
12
*
13
* The driver was then ported to rc-core and significantly rewritten again,
14
* by Jarod, using the in-kernel mceusb driver as a guide, after an initial
15
* port effort was started by Stephen.
16
*
17
* TODO LIST:
18
* - fix lirc not showing repeats properly
19
* --
20
*
21
* The RedRat3 is a USB transceiver with both send & receive,
22
* with 2 separate sensors available for receive to enable
23
* both good long range reception for general use, and good
24
* short range reception when required for learning a signal.
25
*
26
* http://www.redrat.co.uk/
27
*
28
* It uses its own little protocol to communicate, the required
29
* parts of which are embedded within this driver.
30
* --
31
*
32
* This program is free software; you can redistribute it and/or modify
33
* it under the terms of the GNU General Public License as published by
34
* the Free Software Foundation; either version 2 of the License, or
35
* (at your option) any later version.
36
*
37
* This program is distributed in the hope that it will be useful,
38
* but WITHOUT ANY WARRANTY; without even the implied warranty of
39
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
40
* GNU General Public License for more details.
41
*
42
* You should have received a copy of the GNU General Public License
43
* along with this program; if not, write to the Free Software
44
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
45
*
46
*/
47
48
#include <linux/device.h>
49
#include <linux/module.h>
50
#include <linux/slab.h>
51
#include <linux/usb.h>
52
#include <linux/usb/input.h>
53
#include <media/rc-core.h>
54
55
/* Driver Information */
56
#define DRIVER_VERSION "0.70"
57
#define DRIVER_AUTHOR "Jarod Wilson <[email protected]>"
58
#define DRIVER_AUTHOR2 "The Dweller, Stephen Cox"
59
#define DRIVER_DESC "RedRat3 USB IR Transceiver Driver"
60
#define DRIVER_NAME "redrat3"
61
62
/* module parameters */
63
#ifdef CONFIG_USB_DEBUG
64
static int debug = 1;
65
#else
66
static int debug;
67
#endif
68
69
#define RR3_DEBUG_STANDARD 0x1
70
#define RR3_DEBUG_FUNCTION_TRACE 0x2
71
72
#define rr3_dbg(dev, fmt, ...) \
73
do { \
74
if (debug & RR3_DEBUG_STANDARD) \
75
dev_info(dev, fmt, ## __VA_ARGS__); \
76
} while (0)
77
78
#define rr3_ftr(dev, fmt, ...) \
79
do { \
80
if (debug & RR3_DEBUG_FUNCTION_TRACE) \
81
dev_info(dev, fmt, ## __VA_ARGS__); \
82
} while (0)
83
84
/* bulk data transfer types */
85
#define RR3_ERROR 0x01
86
#define RR3_MOD_SIGNAL_IN 0x20
87
#define RR3_MOD_SIGNAL_OUT 0x21
88
89
/* Get the RR firmware version */
90
#define RR3_FW_VERSION 0xb1
91
#define RR3_FW_VERSION_LEN 64
92
/* Send encoded signal bulk-sent earlier*/
93
#define RR3_TX_SEND_SIGNAL 0xb3
94
#define RR3_SET_IR_PARAM 0xb7
95
#define RR3_GET_IR_PARAM 0xb8
96
/* Blink the red LED on the device */
97
#define RR3_BLINK_LED 0xb9
98
/* Read serial number of device */
99
#define RR3_READ_SER_NO 0xba
100
#define RR3_SER_NO_LEN 4
101
/* Start capture with the RC receiver */
102
#define RR3_RC_DET_ENABLE 0xbb
103
/* Stop capture with the RC receiver */
104
#define RR3_RC_DET_DISABLE 0xbc
105
/* Return the status of RC detector capture */
106
#define RR3_RC_DET_STATUS 0xbd
107
/* Reset redrat */
108
#define RR3_RESET 0xa0
109
110
/* Max number of lengths in the signal. */
111
#define RR3_IR_IO_MAX_LENGTHS 0x01
112
/* Periods to measure mod. freq. */
113
#define RR3_IR_IO_PERIODS_MF 0x02
114
/* Size of memory for main signal data */
115
#define RR3_IR_IO_SIG_MEM_SIZE 0x03
116
/* Delta value when measuring lengths */
117
#define RR3_IR_IO_LENGTH_FUZZ 0x04
118
/* Timeout for end of signal detection */
119
#define RR3_IR_IO_SIG_TIMEOUT 0x05
120
/* Minumum value for pause recognition. */
121
#define RR3_IR_IO_MIN_PAUSE 0x06
122
123
/* Clock freq. of EZ-USB chip */
124
#define RR3_CLK 24000000
125
/* Clock periods per timer count */
126
#define RR3_CLK_PER_COUNT 12
127
/* (RR3_CLK / RR3_CLK_PER_COUNT) */
128
#define RR3_CLK_CONV_FACTOR 2000000
129
/* USB bulk-in IR data endpoint address */
130
#define RR3_BULK_IN_EP_ADDR 0x82
131
132
/* Raw Modulated signal data value offsets */
133
#define RR3_PAUSE_OFFSET 0
134
#define RR3_FREQ_COUNT_OFFSET 4
135
#define RR3_NUM_PERIOD_OFFSET 6
136
#define RR3_MAX_LENGTHS_OFFSET 8
137
#define RR3_NUM_LENGTHS_OFFSET 9
138
#define RR3_MAX_SIGS_OFFSET 10
139
#define RR3_NUM_SIGS_OFFSET 12
140
#define RR3_REPEATS_OFFSET 14
141
142
/* Size of the fixed-length portion of the signal */
143
#define RR3_HEADER_LENGTH 15
144
#define RR3_DRIVER_MAXLENS 128
145
#define RR3_MAX_SIG_SIZE 512
146
#define RR3_MAX_BUF_SIZE \
147
((2 * RR3_HEADER_LENGTH) + RR3_DRIVER_MAXLENS + RR3_MAX_SIG_SIZE)
148
#define RR3_TIME_UNIT 50
149
#define RR3_END_OF_SIGNAL 0x7f
150
#define RR3_TX_HEADER_OFFSET 4
151
#define RR3_TX_TRAILER_LEN 2
152
#define RR3_RX_MIN_TIMEOUT 5
153
#define RR3_RX_MAX_TIMEOUT 2000
154
155
/* The 8051's CPUCS Register address */
156
#define RR3_CPUCS_REG_ADDR 0x7f92
157
158
#define USB_RR3USB_VENDOR_ID 0x112a
159
#define USB_RR3USB_PRODUCT_ID 0x0001
160
#define USB_RR3IIUSB_PRODUCT_ID 0x0005
161
162
/* table of devices that work with this driver */
163
static struct usb_device_id redrat3_dev_table[] = {
164
/* Original version of the RedRat3 */
165
{USB_DEVICE(USB_RR3USB_VENDOR_ID, USB_RR3USB_PRODUCT_ID)},
166
/* Second Version/release of the RedRat3 - RetRat3-II */
167
{USB_DEVICE(USB_RR3USB_VENDOR_ID, USB_RR3IIUSB_PRODUCT_ID)},
168
{} /* Terminating entry */
169
};
170
171
/* Structure to hold all of our device specific stuff */
172
struct redrat3_dev {
173
/* core device bits */
174
struct rc_dev *rc;
175
struct device *dev;
176
177
/* save off the usb device pointer */
178
struct usb_device *udev;
179
180
/* the receive endpoint */
181
struct usb_endpoint_descriptor *ep_in;
182
/* the buffer to receive data */
183
unsigned char *bulk_in_buf;
184
/* urb used to read ir data */
185
struct urb *read_urb;
186
187
/* the send endpoint */
188
struct usb_endpoint_descriptor *ep_out;
189
/* the buffer to send data */
190
unsigned char *bulk_out_buf;
191
/* the urb used to send data */
192
struct urb *write_urb;
193
194
/* usb dma */
195
dma_addr_t dma_in;
196
dma_addr_t dma_out;
197
198
/* true if write urb is busy */
199
bool write_busy;
200
/* wait for the write to finish */
201
struct completion write_finished;
202
203
/* locks this structure */
204
struct mutex lock;
205
206
/* rx signal timeout timer */
207
struct timer_list rx_timeout;
208
209
/* Is the device currently receiving? */
210
bool recv_in_progress;
211
/* is the detector enabled*/
212
bool det_enabled;
213
/* Is the device currently transmitting?*/
214
bool transmitting;
215
216
/* store for current packet */
217
char pbuf[RR3_MAX_BUF_SIZE];
218
u16 pktlen;
219
u16 pkttype;
220
u16 bytes_read;
221
/* indicate whether we are going to reprocess
222
* the USB callback with a bigger buffer */
223
int buftoosmall;
224
char *datap;
225
226
u32 carrier;
227
228
char name[128];
229
char phys[64];
230
};
231
232
/* All incoming data buffers adhere to a very specific data format */
233
struct redrat3_signal_header {
234
u16 length; /* Length of data being transferred */
235
u16 transfer_type; /* Type of data transferred */
236
u32 pause; /* Pause between main and repeat signals */
237
u16 mod_freq_count; /* Value of timer on mod. freq. measurement */
238
u16 no_periods; /* No. of periods over which mod. freq. is measured */
239
u8 max_lengths; /* Max no. of lengths (i.e. size of array) */
240
u8 no_lengths; /* Actual no. of elements in lengths array */
241
u16 max_sig_size; /* Max no. of values in signal data array */
242
u16 sig_size; /* Acuto no. of values in signal data array */
243
u8 no_repeats; /* No. of repeats of repeat signal section */
244
/* Here forward is the lengths and signal data */
245
};
246
247
static void redrat3_dump_signal_header(struct redrat3_signal_header *header)
248
{
249
pr_info("%s:\n", __func__);
250
pr_info(" * length: %u, transfer_type: 0x%02x\n",
251
header->length, header->transfer_type);
252
pr_info(" * pause: %u, freq_count: %u, no_periods: %u\n",
253
header->pause, header->mod_freq_count, header->no_periods);
254
pr_info(" * lengths: %u (max: %u)\n",
255
header->no_lengths, header->max_lengths);
256
pr_info(" * sig_size: %u (max: %u)\n",
257
header->sig_size, header->max_sig_size);
258
pr_info(" * repeats: %u\n", header->no_repeats);
259
}
260
261
static void redrat3_dump_signal_data(char *buffer, u16 len)
262
{
263
int offset, i;
264
char *data_vals;
265
266
pr_info("%s:", __func__);
267
268
offset = RR3_TX_HEADER_OFFSET + RR3_HEADER_LENGTH
269
+ (RR3_DRIVER_MAXLENS * sizeof(u16));
270
271
/* read RR3_DRIVER_MAXLENS from ctrl msg */
272
data_vals = buffer + offset;
273
274
for (i = 0; i < len; i++) {
275
if (i % 10 == 0)
276
pr_cont("\n * ");
277
pr_cont("%02x ", *data_vals++);
278
}
279
280
pr_cont("\n");
281
}
282
283
/*
284
* redrat3_issue_async
285
*
286
* Issues an async read to the ir data in port..
287
* sets the callback to be redrat3_handle_async
288
*/
289
static void redrat3_issue_async(struct redrat3_dev *rr3)
290
{
291
int res;
292
293
rr3_ftr(rr3->dev, "Entering %s\n", __func__);
294
295
if (!rr3->det_enabled) {
296
dev_warn(rr3->dev, "not issuing async read, "
297
"detector not enabled\n");
298
return;
299
}
300
301
memset(rr3->bulk_in_buf, 0, rr3->ep_in->wMaxPacketSize);
302
res = usb_submit_urb(rr3->read_urb, GFP_ATOMIC);
303
if (res)
304
rr3_dbg(rr3->dev, "%s: receive request FAILED! "
305
"(res %d, len %d)\n", __func__, res,
306
rr3->read_urb->transfer_buffer_length);
307
}
308
309
static void redrat3_dump_fw_error(struct redrat3_dev *rr3, int code)
310
{
311
if (!rr3->transmitting && (code != 0x40))
312
dev_info(rr3->dev, "fw error code 0x%02x: ", code);
313
314
switch (code) {
315
case 0x00:
316
pr_cont("No Error\n");
317
break;
318
319
/* Codes 0x20 through 0x2f are IR Firmware Errors */
320
case 0x20:
321
pr_cont("Initial signal pulse not long enough "
322
"to measure carrier frequency\n");
323
break;
324
case 0x21:
325
pr_cont("Not enough length values allocated for signal\n");
326
break;
327
case 0x22:
328
pr_cont("Not enough memory allocated for signal data\n");
329
break;
330
case 0x23:
331
pr_cont("Too many signal repeats\n");
332
break;
333
case 0x28:
334
pr_cont("Insufficient memory available for IR signal "
335
"data memory allocation\n");
336
break;
337
case 0x29:
338
pr_cont("Insufficient memory available "
339
"for IrDa signal data memory allocation\n");
340
break;
341
342
/* Codes 0x30 through 0x3f are USB Firmware Errors */
343
case 0x30:
344
pr_cont("Insufficient memory available for bulk "
345
"transfer structure\n");
346
break;
347
348
/*
349
* Other error codes... These are primarily errors that can occur in
350
* the control messages sent to the redrat
351
*/
352
case 0x40:
353
if (!rr3->transmitting)
354
pr_cont("Signal capture has been terminated\n");
355
break;
356
case 0x41:
357
pr_cont("Attempt to set/get and unknown signal I/O "
358
"algorithm parameter\n");
359
break;
360
case 0x42:
361
pr_cont("Signal capture already started\n");
362
break;
363
364
default:
365
pr_cont("Unknown Error\n");
366
break;
367
}
368
}
369
370
static u32 redrat3_val_to_mod_freq(struct redrat3_signal_header *ph)
371
{
372
u32 mod_freq = 0;
373
374
if (ph->mod_freq_count != 0)
375
mod_freq = (RR3_CLK * ph->no_periods) /
376
(ph->mod_freq_count * RR3_CLK_PER_COUNT);
377
378
return mod_freq;
379
}
380
381
/* this function scales down the figures for the same result... */
382
static u32 redrat3_len_to_us(u32 length)
383
{
384
u32 biglen = length * 1000;
385
u32 divisor = (RR3_CLK_CONV_FACTOR) / 1000;
386
u32 result = (u32) (biglen / divisor);
387
388
/* don't allow zero lengths to go back, breaks lirc */
389
return result ? result : 1;
390
}
391
392
/*
393
* convert us back into redrat3 lengths
394
*
395
* length * 1000 length * 1000000
396
* ------------- = ---------------- = micro
397
* rr3clk / 1000 rr3clk
398
399
* 6 * 2 4 * 3 micro * rr3clk micro * rr3clk / 1000
400
* ----- = 4 ----- = 6 -------------- = len ---------------------
401
* 3 2 1000000 1000
402
*/
403
static u32 redrat3_us_to_len(u32 microsec)
404
{
405
u32 result;
406
u32 divisor;
407
408
microsec &= IR_MAX_DURATION;
409
divisor = (RR3_CLK_CONV_FACTOR / 1000);
410
result = (u32)(microsec * divisor) / 1000;
411
412
/* don't allow zero lengths to go back, breaks lirc */
413
return result ? result : 1;
414
415
}
416
417
/* timer callback to send long trailing space on receive timeout */
418
static void redrat3_rx_timeout(unsigned long data)
419
{
420
struct redrat3_dev *rr3 = (struct redrat3_dev *)data;
421
DEFINE_IR_RAW_EVENT(rawir);
422
423
rawir.pulse = false;
424
rawir.duration = rr3->rc->timeout;
425
rr3_dbg(rr3->dev, "storing trailing space with duration %d\n",
426
rawir.duration);
427
ir_raw_event_store_with_filter(rr3->rc, &rawir);
428
429
rr3_dbg(rr3->dev, "calling ir_raw_event_handle\n");
430
ir_raw_event_handle(rr3->rc);
431
432
rr3_dbg(rr3->dev, "calling ir_raw_event_reset\n");
433
ir_raw_event_reset(rr3->rc);
434
}
435
436
static void redrat3_process_ir_data(struct redrat3_dev *rr3)
437
{
438
DEFINE_IR_RAW_EVENT(rawir);
439
struct redrat3_signal_header header;
440
struct device *dev;
441
int i;
442
unsigned long delay;
443
u32 mod_freq, single_len;
444
u16 *len_vals;
445
u8 *data_vals;
446
u32 tmp32;
447
u16 tmp16;
448
char *sig_data;
449
450
if (!rr3) {
451
pr_err("%s called with no context!\n", __func__);
452
return;
453
}
454
455
rr3_ftr(rr3->dev, "Entered %s\n", __func__);
456
457
dev = rr3->dev;
458
sig_data = rr3->pbuf;
459
460
header.length = rr3->pktlen;
461
header.transfer_type = rr3->pkttype;
462
463
/* Sanity check */
464
if (!(header.length >= RR3_HEADER_LENGTH))
465
dev_warn(dev, "read returned less than rr3 header len\n");
466
467
delay = usecs_to_jiffies(rr3->rc->timeout / 1000);
468
mod_timer(&rr3->rx_timeout, jiffies + delay);
469
470
memcpy(&tmp32, sig_data + RR3_PAUSE_OFFSET, sizeof(tmp32));
471
header.pause = be32_to_cpu(tmp32);
472
473
memcpy(&tmp16, sig_data + RR3_FREQ_COUNT_OFFSET, sizeof(tmp16));
474
header.mod_freq_count = be16_to_cpu(tmp16);
475
476
memcpy(&tmp16, sig_data + RR3_NUM_PERIOD_OFFSET, sizeof(tmp16));
477
header.no_periods = be16_to_cpu(tmp16);
478
479
header.max_lengths = sig_data[RR3_MAX_LENGTHS_OFFSET];
480
header.no_lengths = sig_data[RR3_NUM_LENGTHS_OFFSET];
481
482
memcpy(&tmp16, sig_data + RR3_MAX_SIGS_OFFSET, sizeof(tmp16));
483
header.max_sig_size = be16_to_cpu(tmp16);
484
485
memcpy(&tmp16, sig_data + RR3_NUM_SIGS_OFFSET, sizeof(tmp16));
486
header.sig_size = be16_to_cpu(tmp16);
487
488
header.no_repeats= sig_data[RR3_REPEATS_OFFSET];
489
490
if (debug) {
491
redrat3_dump_signal_header(&header);
492
redrat3_dump_signal_data(sig_data, header.sig_size);
493
}
494
495
mod_freq = redrat3_val_to_mod_freq(&header);
496
rr3_dbg(dev, "Got mod_freq of %u\n", mod_freq);
497
498
/* Here we pull out the 'length' values from the signal */
499
len_vals = (u16 *)(sig_data + RR3_HEADER_LENGTH);
500
501
data_vals = sig_data + RR3_HEADER_LENGTH +
502
(header.max_lengths * sizeof(u16));
503
504
/* process each rr3 encoded byte into an int */
505
for (i = 0; i < header.sig_size; i++) {
506
u16 val = len_vals[data_vals[i]];
507
single_len = redrat3_len_to_us((u32)be16_to_cpu(val));
508
509
/* cap the value to IR_MAX_DURATION */
510
single_len &= IR_MAX_DURATION;
511
512
/* we should always get pulse/space/pulse/space samples */
513
if (i % 2)
514
rawir.pulse = false;
515
else
516
rawir.pulse = true;
517
518
rawir.duration = US_TO_NS(single_len);
519
rr3_dbg(dev, "storing %s with duration %d (i: %d)\n",
520
rawir.pulse ? "pulse" : "space", rawir.duration, i);
521
ir_raw_event_store_with_filter(rr3->rc, &rawir);
522
}
523
524
/* add a trailing space, if need be */
525
if (i % 2) {
526
rawir.pulse = false;
527
/* this duration is made up, and may not be ideal... */
528
rawir.duration = rr3->rc->timeout / 2;
529
rr3_dbg(dev, "storing trailing space with duration %d\n",
530
rawir.duration);
531
ir_raw_event_store_with_filter(rr3->rc, &rawir);
532
}
533
534
rr3_dbg(dev, "calling ir_raw_event_handle\n");
535
ir_raw_event_handle(rr3->rc);
536
537
return;
538
}
539
540
/* Util fn to send rr3 cmds */
541
static u8 redrat3_send_cmd(int cmd, struct redrat3_dev *rr3)
542
{
543
struct usb_device *udev;
544
u8 *data;
545
int res;
546
547
data = kzalloc(sizeof(u8), GFP_KERNEL);
548
if (!data)
549
return -ENOMEM;
550
551
udev = rr3->udev;
552
res = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0), cmd,
553
USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_IN,
554
0x0000, 0x0000, data, sizeof(u8), HZ * 10);
555
556
if (res < 0) {
557
dev_err(rr3->dev, "%s: Error sending rr3 cmd res %d, data %d",
558
__func__, res, *data);
559
res = -EIO;
560
} else
561
res = (u8)data[0];
562
563
kfree(data);
564
565
return res;
566
}
567
568
/* Enables the long range detector and starts async receive */
569
static int redrat3_enable_detector(struct redrat3_dev *rr3)
570
{
571
struct device *dev = rr3->dev;
572
u8 ret;
573
574
rr3_ftr(dev, "Entering %s\n", __func__);
575
576
ret = redrat3_send_cmd(RR3_RC_DET_ENABLE, rr3);
577
if (ret != 0)
578
dev_dbg(dev, "%s: unexpected ret of %d\n",
579
__func__, ret);
580
581
ret = redrat3_send_cmd(RR3_RC_DET_STATUS, rr3);
582
if (ret != 1) {
583
dev_err(dev, "%s: detector status: %d, should be 1\n",
584
__func__, ret);
585
return -EIO;
586
}
587
588
rr3->det_enabled = true;
589
redrat3_issue_async(rr3);
590
591
return 0;
592
}
593
594
/* Disables the rr3 long range detector */
595
static void redrat3_disable_detector(struct redrat3_dev *rr3)
596
{
597
struct device *dev = rr3->dev;
598
u8 ret;
599
600
rr3_ftr(dev, "Entering %s\n", __func__);
601
602
ret = redrat3_send_cmd(RR3_RC_DET_DISABLE, rr3);
603
if (ret != 0)
604
dev_err(dev, "%s: failure!\n", __func__);
605
606
ret = redrat3_send_cmd(RR3_RC_DET_STATUS, rr3);
607
if (ret != 0)
608
dev_warn(dev, "%s: detector status: %d, should be 0\n",
609
__func__, ret);
610
611
rr3->det_enabled = false;
612
}
613
614
static inline void redrat3_delete(struct redrat3_dev *rr3,
615
struct usb_device *udev)
616
{
617
rr3_ftr(rr3->dev, "%s cleaning up\n", __func__);
618
usb_kill_urb(rr3->read_urb);
619
usb_kill_urb(rr3->write_urb);
620
621
usb_free_urb(rr3->read_urb);
622
usb_free_urb(rr3->write_urb);
623
624
usb_free_coherent(udev, rr3->ep_in->wMaxPacketSize,
625
rr3->bulk_in_buf, rr3->dma_in);
626
usb_free_coherent(udev, rr3->ep_out->wMaxPacketSize,
627
rr3->bulk_out_buf, rr3->dma_out);
628
629
kfree(rr3);
630
}
631
632
static u32 redrat3_get_timeout(struct device *dev,
633
struct rc_dev *rc, struct usb_device *udev)
634
{
635
u32 *tmp;
636
u32 timeout = MS_TO_NS(150); /* a sane default, if things go haywire */
637
int len, ret, pipe;
638
639
len = sizeof(*tmp);
640
tmp = kzalloc(len, GFP_KERNEL);
641
if (!tmp) {
642
dev_warn(dev, "Memory allocation faillure\n");
643
return timeout;
644
}
645
646
pipe = usb_rcvctrlpipe(udev, 0);
647
ret = usb_control_msg(udev, pipe, RR3_GET_IR_PARAM,
648
USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_IN,
649
RR3_IR_IO_SIG_TIMEOUT, 0, tmp, len, HZ * 5);
650
if (ret != len) {
651
dev_warn(dev, "Failed to read timeout from hardware\n");
652
return timeout;
653
}
654
655
timeout = US_TO_NS(redrat3_len_to_us(be32_to_cpu(*tmp)));
656
if (timeout < rc->min_timeout)
657
timeout = rc->min_timeout;
658
else if (timeout > rc->max_timeout)
659
timeout = rc->max_timeout;
660
661
rr3_dbg(dev, "Got timeout of %d ms\n", timeout / (1000 * 1000));
662
return timeout;
663
}
664
665
static void redrat3_reset(struct redrat3_dev *rr3)
666
{
667
struct usb_device *udev = rr3->udev;
668
struct device *dev = rr3->dev;
669
int rc, rxpipe, txpipe;
670
u8 *val;
671
int len = sizeof(u8);
672
673
rr3_ftr(dev, "Entering %s\n", __func__);
674
675
rxpipe = usb_rcvctrlpipe(udev, 0);
676
txpipe = usb_sndctrlpipe(udev, 0);
677
678
val = kzalloc(len, GFP_KERNEL);
679
if (!val) {
680
dev_err(dev, "Memory allocation failure\n");
681
return;
682
}
683
684
*val = 0x01;
685
rc = usb_control_msg(udev, rxpipe, RR3_RESET,
686
USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_IN,
687
RR3_CPUCS_REG_ADDR, 0, val, len, HZ * 25);
688
rr3_dbg(dev, "reset returned 0x%02x\n", rc);
689
690
*val = 5;
691
rc = usb_control_msg(udev, txpipe, RR3_SET_IR_PARAM,
692
USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_OUT,
693
RR3_IR_IO_LENGTH_FUZZ, 0, val, len, HZ * 25);
694
rr3_dbg(dev, "set ir parm len fuzz %d rc 0x%02x\n", *val, rc);
695
696
*val = RR3_DRIVER_MAXLENS;
697
rc = usb_control_msg(udev, txpipe, RR3_SET_IR_PARAM,
698
USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_OUT,
699
RR3_IR_IO_MAX_LENGTHS, 0, val, len, HZ * 25);
700
rr3_dbg(dev, "set ir parm max lens %d rc 0x%02x\n", *val, rc);
701
702
kfree(val);
703
}
704
705
static void redrat3_get_firmware_rev(struct redrat3_dev *rr3)
706
{
707
int rc = 0;
708
char *buffer;
709
710
rr3_ftr(rr3->dev, "Entering %s\n", __func__);
711
712
buffer = kzalloc(sizeof(char) * (RR3_FW_VERSION_LEN + 1), GFP_KERNEL);
713
if (!buffer) {
714
dev_err(rr3->dev, "Memory allocation failure\n");
715
return;
716
}
717
718
rc = usb_control_msg(rr3->udev, usb_rcvctrlpipe(rr3->udev, 0),
719
RR3_FW_VERSION,
720
USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_IN,
721
0, 0, buffer, RR3_FW_VERSION_LEN, HZ * 5);
722
723
if (rc >= 0)
724
dev_info(rr3->dev, "Firmware rev: %s", buffer);
725
else
726
dev_err(rr3->dev, "Problem fetching firmware ID\n");
727
728
kfree(buffer);
729
rr3_ftr(rr3->dev, "Exiting %s\n", __func__);
730
}
731
732
static void redrat3_read_packet_start(struct redrat3_dev *rr3, int len)
733
{
734
u16 tx_error;
735
u16 hdrlen;
736
737
rr3_ftr(rr3->dev, "Entering %s\n", __func__);
738
739
/* grab the Length and type of transfer */
740
memcpy(&(rr3->pktlen), (unsigned char *) rr3->bulk_in_buf,
741
sizeof(rr3->pktlen));
742
memcpy(&(rr3->pkttype), ((unsigned char *) rr3->bulk_in_buf +
743
sizeof(rr3->pktlen)),
744
sizeof(rr3->pkttype));
745
746
/*data needs conversion to know what its real values are*/
747
rr3->pktlen = be16_to_cpu(rr3->pktlen);
748
rr3->pkttype = be16_to_cpu(rr3->pkttype);
749
750
switch (rr3->pkttype) {
751
case RR3_ERROR:
752
memcpy(&tx_error, ((unsigned char *)rr3->bulk_in_buf
753
+ (sizeof(rr3->pktlen) + sizeof(rr3->pkttype))),
754
sizeof(tx_error));
755
tx_error = be16_to_cpu(tx_error);
756
redrat3_dump_fw_error(rr3, tx_error);
757
break;
758
759
case RR3_MOD_SIGNAL_IN:
760
hdrlen = sizeof(rr3->pktlen) + sizeof(rr3->pkttype);
761
rr3->bytes_read = len;
762
rr3->bytes_read -= hdrlen;
763
rr3->datap = &(rr3->pbuf[0]);
764
765
memcpy(rr3->datap, ((unsigned char *)rr3->bulk_in_buf + hdrlen),
766
rr3->bytes_read);
767
rr3->datap += rr3->bytes_read;
768
rr3_dbg(rr3->dev, "bytes_read %d, pktlen %d\n",
769
rr3->bytes_read, rr3->pktlen);
770
break;
771
772
default:
773
rr3_dbg(rr3->dev, "ignoring packet with type 0x%02x, "
774
"len of %d, 0x%02x\n", rr3->pkttype, len, rr3->pktlen);
775
break;
776
}
777
}
778
779
static void redrat3_read_packet_continue(struct redrat3_dev *rr3, int len)
780
{
781
782
rr3_ftr(rr3->dev, "Entering %s\n", __func__);
783
784
memcpy(rr3->datap, (unsigned char *)rr3->bulk_in_buf, len);
785
rr3->datap += len;
786
787
rr3->bytes_read += len;
788
rr3_dbg(rr3->dev, "bytes_read %d, pktlen %d\n",
789
rr3->bytes_read, rr3->pktlen);
790
}
791
792
/* gather IR data from incoming urb, process it when we have enough */
793
static int redrat3_get_ir_data(struct redrat3_dev *rr3, int len)
794
{
795
struct device *dev = rr3->dev;
796
int ret = 0;
797
798
rr3_ftr(dev, "Entering %s\n", __func__);
799
800
if (rr3->pktlen > RR3_MAX_BUF_SIZE) {
801
dev_err(rr3->dev, "error: packet larger than buffer\n");
802
ret = -EINVAL;
803
goto out;
804
}
805
806
if ((rr3->bytes_read == 0) &&
807
(len >= (sizeof(rr3->pkttype) + sizeof(rr3->pktlen)))) {
808
redrat3_read_packet_start(rr3, len);
809
} else if (rr3->bytes_read != 0) {
810
redrat3_read_packet_continue(rr3, len);
811
} else if (rr3->bytes_read == 0) {
812
dev_err(dev, "error: no packet data read\n");
813
ret = -ENODATA;
814
goto out;
815
}
816
817
if (rr3->bytes_read > rr3->pktlen) {
818
dev_err(dev, "bytes_read (%d) greater than pktlen (%d)\n",
819
rr3->bytes_read, rr3->pktlen);
820
ret = -EINVAL;
821
goto out;
822
} else if (rr3->bytes_read < rr3->pktlen)
823
/* we're still accumulating data */
824
return 0;
825
826
/* if we get here, we've got IR data to decode */
827
if (rr3->pkttype == RR3_MOD_SIGNAL_IN)
828
redrat3_process_ir_data(rr3);
829
else
830
rr3_dbg(dev, "discarding non-signal data packet "
831
"(type 0x%02x)\n", rr3->pkttype);
832
833
out:
834
rr3->bytes_read = 0;
835
rr3->pktlen = 0;
836
rr3->pkttype = 0;
837
return ret;
838
}
839
840
/* callback function from USB when async USB request has completed */
841
static void redrat3_handle_async(struct urb *urb, struct pt_regs *regs)
842
{
843
struct redrat3_dev *rr3;
844
845
if (!urb)
846
return;
847
848
rr3 = urb->context;
849
if (!rr3) {
850
pr_err("%s called with invalid context!\n", __func__);
851
usb_unlink_urb(urb);
852
return;
853
}
854
855
rr3_ftr(rr3->dev, "Entering %s\n", __func__);
856
857
if (!rr3->det_enabled) {
858
rr3_dbg(rr3->dev, "received a read callback but detector "
859
"disabled - ignoring\n");
860
return;
861
}
862
863
switch (urb->status) {
864
case 0:
865
redrat3_get_ir_data(rr3, urb->actual_length);
866
break;
867
868
case -ECONNRESET:
869
case -ENOENT:
870
case -ESHUTDOWN:
871
usb_unlink_urb(urb);
872
return;
873
874
case -EPIPE:
875
default:
876
dev_warn(rr3->dev, "Error: urb status = %d\n", urb->status);
877
rr3->bytes_read = 0;
878
rr3->pktlen = 0;
879
rr3->pkttype = 0;
880
break;
881
}
882
883
if (!rr3->transmitting)
884
redrat3_issue_async(rr3);
885
else
886
rr3_dbg(rr3->dev, "IR transmit in progress\n");
887
}
888
889
static void redrat3_write_bulk_callback(struct urb *urb, struct pt_regs *regs)
890
{
891
struct redrat3_dev *rr3;
892
int len;
893
894
if (!urb)
895
return;
896
897
rr3 = urb->context;
898
if (rr3) {
899
len = urb->actual_length;
900
rr3_ftr(rr3->dev, "%s: called (status=%d len=%d)\n",
901
__func__, urb->status, len);
902
}
903
}
904
905
static u16 mod_freq_to_val(unsigned int mod_freq)
906
{
907
int mult = 6000000;
908
909
/* Clk used in mod. freq. generation is CLK24/4. */
910
return (u16)(65536 - (mult / mod_freq));
911
}
912
913
static int redrat3_set_tx_carrier(struct rc_dev *dev, u32 carrier)
914
{
915
struct redrat3_dev *rr3 = dev->priv;
916
917
rr3->carrier = carrier;
918
919
return carrier;
920
}
921
922
static int redrat3_transmit_ir(struct rc_dev *rcdev, int *txbuf, u32 n)
923
{
924
struct redrat3_dev *rr3 = rcdev->priv;
925
struct device *dev = rr3->dev;
926
struct redrat3_signal_header header;
927
int i, j, count, ret, ret_len, offset;
928
int lencheck, cur_sample_len, pipe;
929
char *buffer = NULL, *sigdata = NULL;
930
int *sample_lens = NULL;
931
u32 tmpi;
932
u16 tmps;
933
u8 *datap;
934
u8 curlencheck = 0;
935
u16 *lengths_ptr;
936
int sendbuf_len;
937
938
rr3_ftr(dev, "Entering %s\n", __func__);
939
940
if (rr3->transmitting) {
941
dev_warn(dev, "%s: transmitter already in use\n", __func__);
942
return -EAGAIN;
943
}
944
945
count = n / sizeof(int);
946
if (count > (RR3_DRIVER_MAXLENS * 2))
947
return -EINVAL;
948
949
rr3->transmitting = true;
950
951
redrat3_disable_detector(rr3);
952
953
if (rr3->det_enabled) {
954
dev_err(dev, "%s: cannot tx while rx is enabled\n", __func__);
955
ret = -EIO;
956
goto out;
957
}
958
959
sample_lens = kzalloc(sizeof(int) * RR3_DRIVER_MAXLENS, GFP_KERNEL);
960
if (!sample_lens) {
961
ret = -ENOMEM;
962
goto out;
963
}
964
965
for (i = 0; i < count; i++) {
966
for (lencheck = 0; lencheck < curlencheck; lencheck++) {
967
cur_sample_len = redrat3_us_to_len(txbuf[i]);
968
if (sample_lens[lencheck] == cur_sample_len)
969
break;
970
}
971
if (lencheck == curlencheck) {
972
cur_sample_len = redrat3_us_to_len(txbuf[i]);
973
rr3_dbg(dev, "txbuf[%d]=%u, pos %d, enc %u\n",
974
i, txbuf[i], curlencheck, cur_sample_len);
975
if (curlencheck < 255) {
976
/* now convert the value to a proper
977
* rr3 value.. */
978
sample_lens[curlencheck] = cur_sample_len;
979
curlencheck++;
980
} else {
981
dev_err(dev, "signal too long\n");
982
ret = -EINVAL;
983
goto out;
984
}
985
}
986
}
987
988
sigdata = kzalloc((count + RR3_TX_TRAILER_LEN), GFP_KERNEL);
989
if (!sigdata) {
990
ret = -ENOMEM;
991
goto out;
992
}
993
994
sigdata[count] = RR3_END_OF_SIGNAL;
995
sigdata[count + 1] = RR3_END_OF_SIGNAL;
996
for (i = 0; i < count; i++) {
997
for (j = 0; j < curlencheck; j++) {
998
if (sample_lens[j] == redrat3_us_to_len(txbuf[i]))
999
sigdata[i] = j;
1000
}
1001
}
1002
1003
offset = RR3_TX_HEADER_OFFSET;
1004
sendbuf_len = RR3_HEADER_LENGTH + (sizeof(u16) * RR3_DRIVER_MAXLENS)
1005
+ count + RR3_TX_TRAILER_LEN + offset;
1006
1007
buffer = kzalloc(sendbuf_len, GFP_KERNEL);
1008
if (!buffer) {
1009
ret = -ENOMEM;
1010
goto out;
1011
}
1012
1013
/* fill in our packet header */
1014
header.length = sendbuf_len - offset;
1015
header.transfer_type = RR3_MOD_SIGNAL_OUT;
1016
header.pause = redrat3_len_to_us(100);
1017
header.mod_freq_count = mod_freq_to_val(rr3->carrier);
1018
header.no_periods = 0; /* n/a to transmit */
1019
header.max_lengths = RR3_DRIVER_MAXLENS;
1020
header.no_lengths = curlencheck;
1021
header.max_sig_size = RR3_MAX_SIG_SIZE;
1022
header.sig_size = count + RR3_TX_TRAILER_LEN;
1023
/* we currently rely on repeat handling in the IR encoding source */
1024
header.no_repeats = 0;
1025
1026
tmps = cpu_to_be16(header.length);
1027
memcpy(buffer, &tmps, 2);
1028
1029
tmps = cpu_to_be16(header.transfer_type);
1030
memcpy(buffer + 2, &tmps, 2);
1031
1032
tmpi = cpu_to_be32(header.pause);
1033
memcpy(buffer + offset, &tmpi, sizeof(tmpi));
1034
1035
tmps = cpu_to_be16(header.mod_freq_count);
1036
memcpy(buffer + offset + RR3_FREQ_COUNT_OFFSET, &tmps, 2);
1037
1038
buffer[offset + RR3_NUM_LENGTHS_OFFSET] = header.no_lengths;
1039
1040
tmps = cpu_to_be16(header.sig_size);
1041
memcpy(buffer + offset + RR3_NUM_SIGS_OFFSET, &tmps, 2);
1042
1043
buffer[offset + RR3_REPEATS_OFFSET] = header.no_repeats;
1044
1045
lengths_ptr = (u16 *)(buffer + offset + RR3_HEADER_LENGTH);
1046
for (i = 0; i < curlencheck; ++i)
1047
lengths_ptr[i] = cpu_to_be16(sample_lens[i]);
1048
1049
datap = (u8 *)(buffer + offset + RR3_HEADER_LENGTH +
1050
(sizeof(u16) * RR3_DRIVER_MAXLENS));
1051
memcpy(datap, sigdata, (count + RR3_TX_TRAILER_LEN));
1052
1053
if (debug) {
1054
redrat3_dump_signal_header(&header);
1055
redrat3_dump_signal_data(buffer, header.sig_size);
1056
}
1057
1058
pipe = usb_sndbulkpipe(rr3->udev, rr3->ep_out->bEndpointAddress);
1059
tmps = usb_bulk_msg(rr3->udev, pipe, buffer,
1060
sendbuf_len, &ret_len, 10 * HZ);
1061
rr3_dbg(dev, "sent %d bytes, (ret %d)\n", ret_len, tmps);
1062
1063
/* now tell the hardware to transmit what we sent it */
1064
pipe = usb_rcvctrlpipe(rr3->udev, 0);
1065
ret = usb_control_msg(rr3->udev, pipe, RR3_TX_SEND_SIGNAL,
1066
USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_IN,
1067
0, 0, buffer, 2, HZ * 10);
1068
1069
if (ret < 0)
1070
dev_err(dev, "Error: control msg send failed, rc %d\n", ret);
1071
else
1072
ret = n;
1073
1074
out:
1075
kfree(sample_lens);
1076
kfree(buffer);
1077
kfree(sigdata);
1078
1079
rr3->transmitting = false;
1080
1081
redrat3_enable_detector(rr3);
1082
1083
return ret;
1084
}
1085
1086
static struct rc_dev *redrat3_init_rc_dev(struct redrat3_dev *rr3)
1087
{
1088
struct device *dev = rr3->dev;
1089
struct rc_dev *rc;
1090
int ret = -ENODEV;
1091
u16 prod = le16_to_cpu(rr3->udev->descriptor.idProduct);
1092
1093
rc = rc_allocate_device();
1094
if (!rc) {
1095
dev_err(dev, "remote input dev allocation failed\n");
1096
goto out;
1097
}
1098
1099
snprintf(rr3->name, sizeof(rr3->name), "RedRat3%s "
1100
"Infrared Remote Transceiver (%04x:%04x)",
1101
prod == USB_RR3IIUSB_PRODUCT_ID ? "-II" : "",
1102
le16_to_cpu(rr3->udev->descriptor.idVendor), prod);
1103
1104
usb_make_path(rr3->udev, rr3->phys, sizeof(rr3->phys));
1105
1106
rc->input_name = rr3->name;
1107
rc->input_phys = rr3->phys;
1108
usb_to_input_id(rr3->udev, &rc->input_id);
1109
rc->dev.parent = dev;
1110
rc->priv = rr3;
1111
rc->driver_type = RC_DRIVER_IR_RAW;
1112
rc->allowed_protos = RC_TYPE_ALL;
1113
rc->min_timeout = MS_TO_NS(RR3_RX_MIN_TIMEOUT);
1114
rc->max_timeout = MS_TO_NS(RR3_RX_MAX_TIMEOUT);
1115
rc->timeout = redrat3_get_timeout(dev, rc, rr3->udev);
1116
rc->tx_ir = redrat3_transmit_ir;
1117
rc->s_tx_carrier = redrat3_set_tx_carrier;
1118
rc->driver_name = DRIVER_NAME;
1119
rc->map_name = RC_MAP_HAUPPAUGE;
1120
1121
ret = rc_register_device(rc);
1122
if (ret < 0) {
1123
dev_err(dev, "remote dev registration failed\n");
1124
goto out;
1125
}
1126
1127
return rc;
1128
1129
out:
1130
rc_free_device(rc);
1131
return NULL;
1132
}
1133
1134
static int __devinit redrat3_dev_probe(struct usb_interface *intf,
1135
const struct usb_device_id *id)
1136
{
1137
struct usb_device *udev = interface_to_usbdev(intf);
1138
struct device *dev = &intf->dev;
1139
struct usb_host_interface *uhi;
1140
struct redrat3_dev *rr3;
1141
struct usb_endpoint_descriptor *ep;
1142
struct usb_endpoint_descriptor *ep_in = NULL;
1143
struct usb_endpoint_descriptor *ep_out = NULL;
1144
u8 addr, attrs;
1145
int pipe, i;
1146
int retval = -ENOMEM;
1147
1148
rr3_ftr(dev, "%s called\n", __func__);
1149
1150
uhi = intf->cur_altsetting;
1151
1152
/* find our bulk-in and bulk-out endpoints */
1153
for (i = 0; i < uhi->desc.bNumEndpoints; ++i) {
1154
ep = &uhi->endpoint[i].desc;
1155
addr = ep->bEndpointAddress;
1156
attrs = ep->bmAttributes;
1157
1158
if ((ep_in == NULL) &&
1159
((addr & USB_ENDPOINT_DIR_MASK) == USB_DIR_IN) &&
1160
((attrs & USB_ENDPOINT_XFERTYPE_MASK) ==
1161
USB_ENDPOINT_XFER_BULK)) {
1162
rr3_dbg(dev, "found bulk-in endpoint at 0x%02x\n",
1163
ep->bEndpointAddress);
1164
/* data comes in on 0x82, 0x81 is for other data... */
1165
if (ep->bEndpointAddress == RR3_BULK_IN_EP_ADDR)
1166
ep_in = ep;
1167
}
1168
1169
if ((ep_out == NULL) &&
1170
((addr & USB_ENDPOINT_DIR_MASK) == USB_DIR_OUT) &&
1171
((attrs & USB_ENDPOINT_XFERTYPE_MASK) ==
1172
USB_ENDPOINT_XFER_BULK)) {
1173
rr3_dbg(dev, "found bulk-out endpoint at 0x%02x\n",
1174
ep->bEndpointAddress);
1175
ep_out = ep;
1176
}
1177
}
1178
1179
if (!ep_in || !ep_out) {
1180
dev_err(dev, "Couldn't find both in and out endpoints\n");
1181
retval = -ENODEV;
1182
goto no_endpoints;
1183
}
1184
1185
/* allocate memory for our device state and initialize it */
1186
rr3 = kzalloc(sizeof(*rr3), GFP_KERNEL);
1187
if (rr3 == NULL) {
1188
dev_err(dev, "Memory allocation failure\n");
1189
goto error;
1190
}
1191
1192
rr3->dev = &intf->dev;
1193
1194
/* set up bulk-in endpoint */
1195
rr3->read_urb = usb_alloc_urb(0, GFP_KERNEL);
1196
if (!rr3->read_urb) {
1197
dev_err(dev, "Read urb allocation failure\n");
1198
goto error;
1199
}
1200
1201
rr3->ep_in = ep_in;
1202
rr3->bulk_in_buf = usb_alloc_coherent(udev, ep_in->wMaxPacketSize,
1203
GFP_ATOMIC, &rr3->dma_in);
1204
if (!rr3->bulk_in_buf) {
1205
dev_err(dev, "Read buffer allocation failure\n");
1206
goto error;
1207
}
1208
1209
pipe = usb_rcvbulkpipe(udev, ep_in->bEndpointAddress);
1210
usb_fill_bulk_urb(rr3->read_urb, udev, pipe,
1211
rr3->bulk_in_buf, ep_in->wMaxPacketSize,
1212
(usb_complete_t)redrat3_handle_async, rr3);
1213
1214
/* set up bulk-out endpoint*/
1215
rr3->write_urb = usb_alloc_urb(0, GFP_KERNEL);
1216
if (!rr3->write_urb) {
1217
dev_err(dev, "Write urb allocation failure\n");
1218
goto error;
1219
}
1220
1221
rr3->ep_out = ep_out;
1222
rr3->bulk_out_buf = usb_alloc_coherent(udev, ep_out->wMaxPacketSize,
1223
GFP_ATOMIC, &rr3->dma_out);
1224
if (!rr3->bulk_out_buf) {
1225
dev_err(dev, "Write buffer allocation failure\n");
1226
goto error;
1227
}
1228
1229
pipe = usb_sndbulkpipe(udev, ep_out->bEndpointAddress);
1230
usb_fill_bulk_urb(rr3->write_urb, udev, pipe,
1231
rr3->bulk_out_buf, ep_out->wMaxPacketSize,
1232
(usb_complete_t)redrat3_write_bulk_callback, rr3);
1233
1234
mutex_init(&rr3->lock);
1235
rr3->udev = udev;
1236
1237
redrat3_reset(rr3);
1238
redrat3_get_firmware_rev(rr3);
1239
1240
/* might be all we need to do? */
1241
retval = redrat3_enable_detector(rr3);
1242
if (retval < 0)
1243
goto error;
1244
1245
/* default.. will get overridden by any sends with a freq defined */
1246
rr3->carrier = 38000;
1247
1248
rr3->rc = redrat3_init_rc_dev(rr3);
1249
if (!rr3->rc)
1250
goto error;
1251
1252
setup_timer(&rr3->rx_timeout, redrat3_rx_timeout, (unsigned long)rr3);
1253
1254
/* we can register the device now, as it is ready */
1255
usb_set_intfdata(intf, rr3);
1256
1257
rr3_ftr(dev, "Exiting %s\n", __func__);
1258
return 0;
1259
1260
error:
1261
redrat3_delete(rr3, rr3->udev);
1262
1263
no_endpoints:
1264
dev_err(dev, "%s: retval = %x", __func__, retval);
1265
1266
return retval;
1267
}
1268
1269
static void __devexit redrat3_dev_disconnect(struct usb_interface *intf)
1270
{
1271
struct usb_device *udev = interface_to_usbdev(intf);
1272
struct redrat3_dev *rr3 = usb_get_intfdata(intf);
1273
1274
rr3_ftr(&intf->dev, "Entering %s\n", __func__);
1275
1276
if (!rr3)
1277
return;
1278
1279
redrat3_disable_detector(rr3);
1280
1281
usb_set_intfdata(intf, NULL);
1282
rc_unregister_device(rr3->rc);
1283
redrat3_delete(rr3, udev);
1284
1285
rr3_ftr(&intf->dev, "RedRat3 IR Transceiver now disconnected\n");
1286
}
1287
1288
static int redrat3_dev_suspend(struct usb_interface *intf, pm_message_t message)
1289
{
1290
struct redrat3_dev *rr3 = usb_get_intfdata(intf);
1291
rr3_ftr(rr3->dev, "suspend\n");
1292
usb_kill_urb(rr3->read_urb);
1293
return 0;
1294
}
1295
1296
static int redrat3_dev_resume(struct usb_interface *intf)
1297
{
1298
struct redrat3_dev *rr3 = usb_get_intfdata(intf);
1299
rr3_ftr(rr3->dev, "resume\n");
1300
if (usb_submit_urb(rr3->read_urb, GFP_ATOMIC))
1301
return -EIO;
1302
return 0;
1303
}
1304
1305
static struct usb_driver redrat3_dev_driver = {
1306
.name = DRIVER_NAME,
1307
.probe = redrat3_dev_probe,
1308
.disconnect = redrat3_dev_disconnect,
1309
.suspend = redrat3_dev_suspend,
1310
.resume = redrat3_dev_resume,
1311
.reset_resume = redrat3_dev_resume,
1312
.id_table = redrat3_dev_table
1313
};
1314
1315
static int __init redrat3_dev_init(void)
1316
{
1317
int ret;
1318
1319
ret = usb_register(&redrat3_dev_driver);
1320
if (ret < 0)
1321
pr_err(DRIVER_NAME
1322
": usb register failed, result = %d\n", ret);
1323
1324
return ret;
1325
}
1326
1327
static void __exit redrat3_dev_exit(void)
1328
{
1329
usb_deregister(&redrat3_dev_driver);
1330
}
1331
1332
module_init(redrat3_dev_init);
1333
module_exit(redrat3_dev_exit);
1334
1335
MODULE_DESCRIPTION(DRIVER_DESC);
1336
MODULE_AUTHOR(DRIVER_AUTHOR);
1337
MODULE_AUTHOR(DRIVER_AUTHOR2);
1338
MODULE_LICENSE("GPL");
1339
MODULE_DEVICE_TABLE(usb, redrat3_dev_table);
1340
1341
module_param(debug, int, S_IRUGO | S_IWUSR);
1342
MODULE_PARM_DESC(debug, "Enable module debug spew. 0 = no debugging (default) "
1343
"0x1 = standard debug messages, 0x2 = function tracing debug. "
1344
"Flag bits are addative (i.e., 0x3 for both debug types).");
1345
1346