aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorJarod Wilson <jarod@redhat.com>2011-05-04 13:02:42 -0400
committerMauro Carvalho Chehab <mchehab@redhat.com>2011-05-20 15:25:00 -0400
commit2154be651b90ab0e6b5e9b9cf127a75429f9e90c (patch)
tree4f1e33d5639df6b8495da302029c17913c211427 /drivers
parent08aeb7c9a42ab7aa8b53c8f7779ec58f860a565c (diff)
[media] redrat3: new rc-core IR transceiver device driver
This is a new rc-core device driver for the IR transceivers made by RedRat Ltd. (http://redrat.co.uk/). It started out life as an out-of-lirc-tree lirc driver, maintained in its own repo on sourceforge, by Stephen Cox. He started porting it to what was then ir-core, and I finally picked it up about two week ago and did a fairly large overhaul on it, and its now into a state where I'm fairly comfortable submitting it here for review and inclusion in the kernel. I'm claiming authorship of this driver, since while it started out as Stephen's work, its definitely a derivative work now, at 876 lines added and 1698 lines removed since grabbing it from sourceforge. Stephen's name is retained as secondary author though, and credited in the headers. Those interested in seeing how the changes evolved can (at least for now) look at this branch in my git tree: http://git.kernel.org/?p=linux/kernel/git/jarod/linux-2.6-ir.git;a=shortlog;h=refs/heads/redrat3 That won't be around forever though, and I'm doing this as a single commit to go into mainline. Anyway... I've successfully tested in-kernel decode of rc5, rc6 and nec remotes, as well as lirc userspace decode of rc5 and rc6. There are still some quirks here to sort out with rc5 lirc userspace decode, but I'm working with the RedRat folks themselves to figure out what's going on there (rc5 lirc decode works, but you only get an event on key release -- in-kernel rc5 decode behaves perfectly fine). Note that lirc decode of rc6 is working perfectly. Transmit is also working, tested by pointing the redrat3 at an mceusb transceiver, which happily picked up the transmitted signals and properly decoded them. There's no default remote for this hardware, so its somewhat arbitrarily set to use the Hauppauge RC5 keymap by default. Easily changed out by way of ir-keytable and irrelevant if you're using lircd for decode. CC: Chris Dodge <chris@redrat.co.uk> CC: Andrew Vincer <Andrew.Vincer@redrat.co.uk> CC: Stephen Cox <scox_nz@yahoo.com> Signed-off-by: Jarod Wilson <jarod@redhat.com> Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/media/rc/Kconfig11
-rw-r--r--drivers/media/rc/Makefile1
-rw-r--r--drivers/media/rc/redrat3.c1344
3 files changed, 1356 insertions, 0 deletions
diff --git a/drivers/media/rc/Kconfig b/drivers/media/rc/Kconfig
index 7f03142a329f..154c337f00fd 100644
--- a/drivers/media/rc/Kconfig
+++ b/drivers/media/rc/Kconfig
@@ -161,6 +161,17 @@ config IR_NUVOTON
161 To compile this driver as a module, choose M here: the 161 To compile this driver as a module, choose M here: the
162 module will be called nuvoton-cir. 162 module will be called nuvoton-cir.
163 163
164config IR_REDRAT3
165 tristate "RedRat3 IR Transceiver"
166 depends on USB_ARCH_HAS_HCD
167 depends on RC_CORE
168 select USB
169 ---help---
170 Say Y here if you want to use a RedRat3 Infrared Transceiver.
171
172 To compile this driver as a module, choose M here: the
173 module will be called redrat3.
174
164config IR_STREAMZAP 175config IR_STREAMZAP
165 tristate "Streamzap PC Remote IR Receiver" 176 tristate "Streamzap PC Remote IR Receiver"
166 depends on USB_ARCH_HAS_HCD 177 depends on USB_ARCH_HAS_HCD
diff --git a/drivers/media/rc/Makefile b/drivers/media/rc/Makefile
index c6cfe70d862f..1f90a219a162 100644
--- a/drivers/media/rc/Makefile
+++ b/drivers/media/rc/Makefile
@@ -18,6 +18,7 @@ obj-$(CONFIG_IR_ITE_CIR) += ite-cir.o
18obj-$(CONFIG_IR_MCEUSB) += mceusb.o 18obj-$(CONFIG_IR_MCEUSB) += mceusb.o
19obj-$(CONFIG_IR_NUVOTON) += nuvoton-cir.o 19obj-$(CONFIG_IR_NUVOTON) += nuvoton-cir.o
20obj-$(CONFIG_IR_ENE) += ene_ir.o 20obj-$(CONFIG_IR_ENE) += ene_ir.o
21obj-$(CONFIG_IR_REDRAT3) += redrat3.o
21obj-$(CONFIG_IR_STREAMZAP) += streamzap.o 22obj-$(CONFIG_IR_STREAMZAP) += streamzap.o
22obj-$(CONFIG_IR_WINBOND_CIR) += winbond-cir.o 23obj-$(CONFIG_IR_WINBOND_CIR) += winbond-cir.o
23obj-$(CONFIG_RC_LOOPBACK) += rc-loopback.o 24obj-$(CONFIG_RC_LOOPBACK) += rc-loopback.o
diff --git a/drivers/media/rc/redrat3.c b/drivers/media/rc/redrat3.c
new file mode 100644
index 000000000000..5147767ccb78
--- /dev/null
+++ b/drivers/media/rc/redrat3.c
@@ -0,0 +1,1344 @@
1/*
2 * USB RedRat3 IR Transceiver rc-core driver
3 *
4 * Copyright (c) 2011 by Jarod Wilson <jarod@redhat.com>
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 <jarod@redhat.com>"
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
64static int debug = 1;
65#else
66static 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 */
163static 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 */
172struct 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 */
233struct 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
247static 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
261static 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 */
289static 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
309static 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
370static 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... */
382static 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 */
403static 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 */
418static 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
436static 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 */
541static 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 */
569static 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 */
595static 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
614static 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
632static 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
665static 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
705static 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
732static 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
779static 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 */
793static 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
833out:
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 */
841static 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
889static 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
905static 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
913static 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
922static 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
1074out:
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
1086static 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
1129out:
1130 rc_free_device(rc);
1131 return NULL;
1132}
1133
1134static 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
1260error:
1261 redrat3_delete(rr3, rr3->udev);
1262
1263no_endpoints:
1264 dev_err(dev, "%s: retval = %x", __func__, retval);
1265
1266 return retval;
1267}
1268
1269static 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
1288static 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
1296static 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
1305static 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
1315static 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
1327static void __exit redrat3_dev_exit(void)
1328{
1329 usb_deregister(&redrat3_dev_driver);
1330}
1331
1332module_init(redrat3_dev_init);
1333module_exit(redrat3_dev_exit);
1334
1335MODULE_DESCRIPTION(DRIVER_DESC);
1336MODULE_AUTHOR(DRIVER_AUTHOR);
1337MODULE_AUTHOR(DRIVER_AUTHOR2);
1338MODULE_LICENSE("GPL");
1339MODULE_DEVICE_TABLE(usb, redrat3_dev_table);
1340
1341module_param(debug, int, S_IRUGO | S_IWUSR);
1342MODULE_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).");