]> git.kernelconcepts.de Git - karo-tx-linux.git/blob - drivers/media/usb/dvb-usb/dib0700_core.c
Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/klassert/ipsec
[karo-tx-linux.git] / drivers / media / usb / dvb-usb / dib0700_core.c
1 /* Linux driver for devices based on the DiBcom DiB0700 USB bridge
2  *
3  *      This program is free software; you can redistribute it and/or modify it
4  *      under the terms of the GNU General Public License as published by the Free
5  *      Software Foundation, version 2.
6  *
7  *  Copyright (C) 2005-6 DiBcom, SA
8  */
9 #include "dib0700.h"
10
11 /* debug */
12 int dvb_usb_dib0700_debug;
13 module_param_named(debug,dvb_usb_dib0700_debug, int, 0644);
14 MODULE_PARM_DESC(debug, "set debugging level (1=info,2=fw,4=fwdata,8=data (or-able))." DVB_USB_DEBUG_STATUS);
15
16 static int nb_packet_buffer_size = 21;
17 module_param(nb_packet_buffer_size, int, 0644);
18 MODULE_PARM_DESC(nb_packet_buffer_size,
19         "Set the dib0700 driver data buffer size. This parameter corresponds to the number of TS packets. The actual size of the data buffer corresponds to this parameter multiplied by 188 (default: 21)");
20
21 DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr);
22
23
24 int dib0700_get_version(struct dvb_usb_device *d, u32 *hwversion,
25                         u32 *romversion, u32 *ramversion, u32 *fwtype)
26 {
27         struct dib0700_state *st = d->priv;
28         int ret;
29
30         if (mutex_lock_interruptible(&d->usb_mutex) < 0) {
31                 err("could not acquire lock");
32                 return -EINTR;
33         }
34
35         ret = usb_control_msg(d->udev, usb_rcvctrlpipe(d->udev, 0),
36                                   REQUEST_GET_VERSION,
37                                   USB_TYPE_VENDOR | USB_DIR_IN, 0, 0,
38                                   st->buf, 16, USB_CTRL_GET_TIMEOUT);
39         if (hwversion != NULL)
40                 *hwversion  = (st->buf[0] << 24)  | (st->buf[1] << 16)  |
41                         (st->buf[2] << 8)  | st->buf[3];
42         if (romversion != NULL)
43                 *romversion = (st->buf[4] << 24)  | (st->buf[5] << 16)  |
44                         (st->buf[6] << 8)  | st->buf[7];
45         if (ramversion != NULL)
46                 *ramversion = (st->buf[8] << 24)  | (st->buf[9] << 16)  |
47                         (st->buf[10] << 8) | st->buf[11];
48         if (fwtype != NULL)
49                 *fwtype     = (st->buf[12] << 24) | (st->buf[13] << 16) |
50                         (st->buf[14] << 8) | st->buf[15];
51         mutex_unlock(&d->usb_mutex);
52         return ret;
53 }
54
55 /* expecting rx buffer: request data[0] data[1] ... data[2] */
56 static int dib0700_ctrl_wr(struct dvb_usb_device *d, u8 *tx, u8 txlen)
57 {
58         int status;
59
60         deb_data(">>> ");
61         debug_dump(tx, txlen, deb_data);
62
63         status = usb_control_msg(d->udev, usb_sndctrlpipe(d->udev,0),
64                 tx[0], USB_TYPE_VENDOR | USB_DIR_OUT, 0, 0, tx, txlen,
65                 USB_CTRL_GET_TIMEOUT);
66
67         if (status != txlen)
68                 deb_data("ep 0 write error (status = %d, len: %d)\n",status,txlen);
69
70         return status < 0 ? status : 0;
71 }
72
73 /* expecting tx buffer: request data[0] ... data[n] (n <= 4) */
74 int dib0700_ctrl_rd(struct dvb_usb_device *d, u8 *tx, u8 txlen, u8 *rx, u8 rxlen)
75 {
76         u16 index, value;
77         int status;
78
79         if (txlen < 2) {
80                 err("tx buffer length is smaller than 2. Makes no sense.");
81                 return -EINVAL;
82         }
83         if (txlen > 4) {
84                 err("tx buffer length is larger than 4. Not supported.");
85                 return -EINVAL;
86         }
87
88         deb_data(">>> ");
89         debug_dump(tx,txlen,deb_data);
90
91         value = ((txlen - 2) << 8) | tx[1];
92         index = 0;
93         if (txlen > 2)
94                 index |= (tx[2] << 8);
95         if (txlen > 3)
96                 index |= tx[3];
97
98         status = usb_control_msg(d->udev, usb_rcvctrlpipe(d->udev,0), tx[0],
99                         USB_TYPE_VENDOR | USB_DIR_IN, value, index, rx, rxlen,
100                         USB_CTRL_GET_TIMEOUT);
101
102         if (status < 0)
103                 deb_info("ep 0 read error (status = %d)\n",status);
104
105         deb_data("<<< ");
106         debug_dump(rx, rxlen, deb_data);
107
108         return status; /* length in case of success */
109 }
110
111 int dib0700_set_gpio(struct dvb_usb_device *d, enum dib07x0_gpios gpio, u8 gpio_dir, u8 gpio_val)
112 {
113         struct dib0700_state *st = d->priv;
114         int ret;
115
116         if (mutex_lock_interruptible(&d->usb_mutex) < 0) {
117                 err("could not acquire lock");
118                 return -EINTR;
119         }
120
121         st->buf[0] = REQUEST_SET_GPIO;
122         st->buf[1] = gpio;
123         st->buf[2] = ((gpio_dir & 0x01) << 7) | ((gpio_val & 0x01) << 6);
124
125         ret = dib0700_ctrl_wr(d, st->buf, 3);
126
127         mutex_unlock(&d->usb_mutex);
128         return ret;
129 }
130
131 static int dib0700_set_usb_xfer_len(struct dvb_usb_device *d, u16 nb_ts_packets)
132 {
133         struct dib0700_state *st = d->priv;
134         int ret;
135
136         if (st->fw_version >= 0x10201) {
137                 if (mutex_lock_interruptible(&d->usb_mutex) < 0) {
138                         err("could not acquire lock");
139                         return -EINTR;
140                 }
141
142                 st->buf[0] = REQUEST_SET_USB_XFER_LEN;
143                 st->buf[1] = (nb_ts_packets >> 8) & 0xff;
144                 st->buf[2] = nb_ts_packets & 0xff;
145
146                 deb_info("set the USB xfer len to %i Ts packet\n", nb_ts_packets);
147
148                 ret = dib0700_ctrl_wr(d, st->buf, 3);
149                 mutex_unlock(&d->usb_mutex);
150         } else {
151                 deb_info("this firmware does not allow to change the USB xfer len\n");
152                 ret = -EIO;
153         }
154
155         return ret;
156 }
157
158 /*
159  * I2C master xfer function (supported in 1.20 firmware)
160  */
161 static int dib0700_i2c_xfer_new(struct i2c_adapter *adap, struct i2c_msg *msg,
162                                 int num)
163 {
164         /* The new i2c firmware messages are more reliable and in particular
165            properly support i2c read calls not preceded by a write */
166
167         struct dvb_usb_device *d = i2c_get_adapdata(adap);
168         struct dib0700_state *st = d->priv;
169         uint8_t bus_mode = 1;  /* 0=eeprom bus, 1=frontend bus */
170         uint8_t gen_mode = 0; /* 0=master i2c, 1=gpio i2c */
171         uint8_t en_start = 0;
172         uint8_t en_stop = 0;
173         int result, i;
174
175         /* Ensure nobody else hits the i2c bus while we're sending our
176            sequence of messages, (such as the remote control thread) */
177         if (mutex_lock_interruptible(&d->i2c_mutex) < 0)
178                 return -EINTR;
179
180         for (i = 0; i < num; i++) {
181                 if (i == 0) {
182                         /* First message in the transaction */
183                         en_start = 1;
184                 } else if (!(msg[i].flags & I2C_M_NOSTART)) {
185                         /* Device supports repeated-start */
186                         en_start = 1;
187                 } else {
188                         /* Not the first packet and device doesn't support
189                            repeated start */
190                         en_start = 0;
191                 }
192                 if (i == (num - 1)) {
193                         /* Last message in the transaction */
194                         en_stop = 1;
195                 }
196
197                 if (msg[i].flags & I2C_M_RD) {
198                         /* Read request */
199                         u16 index, value;
200                         uint8_t i2c_dest;
201
202                         i2c_dest = (msg[i].addr << 1);
203                         value = ((en_start << 7) | (en_stop << 6) |
204                                  (msg[i].len & 0x3F)) << 8 | i2c_dest;
205                         /* I2C ctrl + FE bus; */
206                         index = ((gen_mode << 6) & 0xC0) |
207                                 ((bus_mode << 4) & 0x30);
208
209                         result = usb_control_msg(d->udev,
210                                                  usb_rcvctrlpipe(d->udev, 0),
211                                                  REQUEST_NEW_I2C_READ,
212                                                  USB_TYPE_VENDOR | USB_DIR_IN,
213                                                  value, index, st->buf,
214                                                  msg[i].len,
215                                                  USB_CTRL_GET_TIMEOUT);
216                         if (result < 0) {
217                                 deb_info("i2c read error (status = %d)\n", result);
218                                 break;
219                         }
220
221                         if (msg[i].len > sizeof(st->buf)) {
222                                 deb_info("buffer too small to fit %d bytes\n",
223                                          msg[i].len);
224                                 return -EIO;
225                         }
226
227                         memcpy(msg[i].buf, st->buf, msg[i].len);
228
229                         deb_data("<<< ");
230                         debug_dump(msg[i].buf, msg[i].len, deb_data);
231
232                 } else {
233                         /* Write request */
234                         if (mutex_lock_interruptible(&d->usb_mutex) < 0) {
235                                 err("could not acquire lock");
236                                 mutex_unlock(&d->i2c_mutex);
237                                 return -EINTR;
238                         }
239                         st->buf[0] = REQUEST_NEW_I2C_WRITE;
240                         st->buf[1] = msg[i].addr << 1;
241                         st->buf[2] = (en_start << 7) | (en_stop << 6) |
242                                 (msg[i].len & 0x3F);
243                         /* I2C ctrl + FE bus; */
244                         st->buf[3] = ((gen_mode << 6) & 0xC0) |
245                                  ((bus_mode << 4) & 0x30);
246
247                         if (msg[i].len > sizeof(st->buf) - 4) {
248                                 deb_info("i2c message to big: %d\n",
249                                          msg[i].len);
250                                 return -EIO;
251                         }
252
253                         /* The Actual i2c payload */
254                         memcpy(&st->buf[4], msg[i].buf, msg[i].len);
255
256                         deb_data(">>> ");
257                         debug_dump(st->buf, msg[i].len + 4, deb_data);
258
259                         result = usb_control_msg(d->udev,
260                                                  usb_sndctrlpipe(d->udev, 0),
261                                                  REQUEST_NEW_I2C_WRITE,
262                                                  USB_TYPE_VENDOR | USB_DIR_OUT,
263                                                  0, 0, st->buf, msg[i].len + 4,
264                                                  USB_CTRL_GET_TIMEOUT);
265                         mutex_unlock(&d->usb_mutex);
266                         if (result < 0) {
267                                 deb_info("i2c write error (status = %d)\n", result);
268                                 break;
269                         }
270                 }
271         }
272         mutex_unlock(&d->i2c_mutex);
273         return i;
274 }
275
276 /*
277  * I2C master xfer function (pre-1.20 firmware)
278  */
279 static int dib0700_i2c_xfer_legacy(struct i2c_adapter *adap,
280                                    struct i2c_msg *msg, int num)
281 {
282         struct dvb_usb_device *d = i2c_get_adapdata(adap);
283         struct dib0700_state *st = d->priv;
284         int i,len;
285
286         if (mutex_lock_interruptible(&d->i2c_mutex) < 0)
287                 return -EINTR;
288         if (mutex_lock_interruptible(&d->usb_mutex) < 0) {
289                 err("could not acquire lock");
290                 mutex_unlock(&d->i2c_mutex);
291                 return -EINTR;
292         }
293
294         for (i = 0; i < num; i++) {
295                 /* fill in the address */
296                 st->buf[1] = msg[i].addr << 1;
297                 /* fill the buffer */
298                 if (msg[i].len > sizeof(st->buf) - 2) {
299                         deb_info("i2c xfer to big: %d\n",
300                                 msg[i].len);
301                         return -EIO;
302                 }
303                 memcpy(&st->buf[2], msg[i].buf, msg[i].len);
304
305                 /* write/read request */
306                 if (i+1 < num && (msg[i+1].flags & I2C_M_RD)) {
307                         st->buf[0] = REQUEST_I2C_READ;
308                         st->buf[1] |= 1;
309
310                         /* special thing in the current firmware: when length is zero the read-failed */
311                         len = dib0700_ctrl_rd(d, st->buf, msg[i].len + 2,
312                                               st->buf, msg[i + 1].len);
313                         if (len <= 0) {
314                                 deb_info("I2C read failed on address 0x%02x\n",
315                                                 msg[i].addr);
316                                 break;
317                         }
318
319                         if (msg[i + 1].len > sizeof(st->buf)) {
320                                 deb_info("i2c xfer buffer to small for %d\n",
321                                         msg[i].len);
322                                 return -EIO;
323                         }
324                         memcpy(msg[i + 1].buf, st->buf, msg[i + 1].len);
325
326                         msg[i+1].len = len;
327
328                         i++;
329                 } else {
330                         st->buf[0] = REQUEST_I2C_WRITE;
331                         if (dib0700_ctrl_wr(d, st->buf, msg[i].len + 2) < 0)
332                                 break;
333                 }
334         }
335         mutex_unlock(&d->usb_mutex);
336         mutex_unlock(&d->i2c_mutex);
337
338         return i;
339 }
340
341 static int dib0700_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg *msg,
342                             int num)
343 {
344         struct dvb_usb_device *d = i2c_get_adapdata(adap);
345         struct dib0700_state *st = d->priv;
346
347         if (st->fw_use_new_i2c_api == 1) {
348                 /* User running at least fw 1.20 */
349                 return dib0700_i2c_xfer_new(adap, msg, num);
350         } else {
351                 /* Use legacy calls */
352                 return dib0700_i2c_xfer_legacy(adap, msg, num);
353         }
354 }
355
356 static u32 dib0700_i2c_func(struct i2c_adapter *adapter)
357 {
358         return I2C_FUNC_I2C;
359 }
360
361 struct i2c_algorithm dib0700_i2c_algo = {
362         .master_xfer   = dib0700_i2c_xfer,
363         .functionality = dib0700_i2c_func,
364 };
365
366 int dib0700_identify_state(struct usb_device *udev, struct dvb_usb_device_properties *props,
367                         struct dvb_usb_device_description **desc, int *cold)
368 {
369         s16 ret;
370         u8 *b;
371
372         b = kmalloc(16, GFP_KERNEL);
373         if (!b)
374                 return  -ENOMEM;
375
376
377         ret = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0),
378                 REQUEST_GET_VERSION, USB_TYPE_VENDOR | USB_DIR_IN, 0, 0, b, 16, USB_CTRL_GET_TIMEOUT);
379
380         deb_info("FW GET_VERSION length: %d\n",ret);
381
382         *cold = ret <= 0;
383         deb_info("cold: %d\n", *cold);
384
385         kfree(b);
386         return 0;
387 }
388
389 static int dib0700_set_clock(struct dvb_usb_device *d, u8 en_pll,
390         u8 pll_src, u8 pll_range, u8 clock_gpio3, u16 pll_prediv,
391         u16 pll_loopdiv, u16 free_div, u16 dsuScaler)
392 {
393         struct dib0700_state *st = d->priv;
394         int ret;
395
396         if (mutex_lock_interruptible(&d->usb_mutex) < 0) {
397                 err("could not acquire lock");
398                 return -EINTR;
399         }
400
401         st->buf[0] = REQUEST_SET_CLOCK;
402         st->buf[1] = (en_pll << 7) | (pll_src << 6) |
403                 (pll_range << 5) | (clock_gpio3 << 4);
404         st->buf[2] = (pll_prediv >> 8)  & 0xff; /* MSB */
405         st->buf[3] =  pll_prediv        & 0xff; /* LSB */
406         st->buf[4] = (pll_loopdiv >> 8) & 0xff; /* MSB */
407         st->buf[5] =  pll_loopdiv       & 0xff; /* LSB */
408         st->buf[6] = (free_div >> 8)    & 0xff; /* MSB */
409         st->buf[7] =  free_div          & 0xff; /* LSB */
410         st->buf[8] = (dsuScaler >> 8)   & 0xff; /* MSB */
411         st->buf[9] =  dsuScaler         & 0xff; /* LSB */
412
413         ret = dib0700_ctrl_wr(d, st->buf, 10);
414         mutex_unlock(&d->usb_mutex);
415
416         return ret;
417 }
418
419 int dib0700_set_i2c_speed(struct dvb_usb_device *d, u16 scl_kHz)
420 {
421         struct dib0700_state *st = d->priv;
422         u16 divider;
423         int ret;
424
425         if (scl_kHz == 0)
426                 return -EINVAL;
427
428         if (mutex_lock_interruptible(&d->usb_mutex) < 0) {
429                 err("could not acquire lock");
430                 return -EINTR;
431         }
432
433         st->buf[0] = REQUEST_SET_I2C_PARAM;
434         divider = (u16) (30000 / scl_kHz);
435         st->buf[1] = 0;
436         st->buf[2] = (u8) (divider >> 8);
437         st->buf[3] = (u8) (divider & 0xff);
438         divider = (u16) (72000 / scl_kHz);
439         st->buf[4] = (u8) (divider >> 8);
440         st->buf[5] = (u8) (divider & 0xff);
441         divider = (u16) (72000 / scl_kHz); /* clock: 72MHz */
442         st->buf[6] = (u8) (divider >> 8);
443         st->buf[7] = (u8) (divider & 0xff);
444
445         deb_info("setting I2C speed: %04x %04x %04x (%d kHz).",
446                 (st->buf[2] << 8) | (st->buf[3]), (st->buf[4] << 8) |
447                 st->buf[5], (st->buf[6] << 8) | st->buf[7], scl_kHz);
448
449         ret = dib0700_ctrl_wr(d, st->buf, 8);
450         mutex_unlock(&d->usb_mutex);
451
452         return ret;
453 }
454
455
456 int dib0700_ctrl_clock(struct dvb_usb_device *d, u32 clk_MHz, u8 clock_out_gp3)
457 {
458         switch (clk_MHz) {
459                 case 72: dib0700_set_clock(d, 1, 0, 1, clock_out_gp3, 2, 24, 0, 0x4c); break;
460                 default: return -EINVAL;
461         }
462         return 0;
463 }
464
465 static int dib0700_jumpram(struct usb_device *udev, u32 address)
466 {
467         int ret = 0, actlen;
468         u8 *buf;
469
470         buf = kmalloc(8, GFP_KERNEL);
471         if (!buf)
472                 return -ENOMEM;
473         buf[0] = REQUEST_JUMPRAM;
474         buf[1] = 0;
475         buf[2] = 0;
476         buf[3] = 0;
477         buf[4] = (address >> 24) & 0xff;
478         buf[5] = (address >> 16) & 0xff;
479         buf[6] = (address >> 8)  & 0xff;
480         buf[7] =  address        & 0xff;
481
482         if ((ret = usb_bulk_msg(udev, usb_sndbulkpipe(udev, 0x01),buf,8,&actlen,1000)) < 0) {
483                 deb_fw("jumpram to 0x%x failed\n",address);
484                 goto out;
485         }
486         if (actlen != 8) {
487                 deb_fw("jumpram to 0x%x failed\n",address);
488                 ret = -EIO;
489                 goto out;
490         }
491 out:
492         kfree(buf);
493         return ret;
494 }
495
496 int dib0700_download_firmware(struct usb_device *udev, const struct firmware *fw)
497 {
498         struct hexline hx;
499         int pos = 0, ret, act_len, i, adap_num;
500         u8 *buf;
501         u32 fw_version;
502
503         buf = kmalloc(260, GFP_KERNEL);
504         if (!buf)
505                 return -ENOMEM;
506
507         while ((ret = dvb_usb_get_hexline(fw, &hx, &pos)) > 0) {
508                 deb_fwdata("writing to address 0x%08x (buffer: 0x%02x %02x)\n",
509                                 hx.addr, hx.len, hx.chk);
510
511                 buf[0] = hx.len;
512                 buf[1] = (hx.addr >> 8) & 0xff;
513                 buf[2] =  hx.addr       & 0xff;
514                 buf[3] = hx.type;
515                 memcpy(&buf[4],hx.data,hx.len);
516                 buf[4+hx.len] = hx.chk;
517
518                 ret = usb_bulk_msg(udev,
519                         usb_sndbulkpipe(udev, 0x01),
520                         buf,
521                         hx.len + 5,
522                         &act_len,
523                         1000);
524
525                 if (ret < 0) {
526                         err("firmware download failed at %d with %d",pos,ret);
527                         goto out;
528                 }
529         }
530
531         if (ret == 0) {
532                 /* start the firmware */
533                 if ((ret = dib0700_jumpram(udev, 0x70000000)) == 0) {
534                         info("firmware started successfully.");
535                         msleep(500);
536                 }
537         } else
538                 ret = -EIO;
539
540         /* the number of ts packet has to be at least 1 */
541         if (nb_packet_buffer_size < 1)
542                 nb_packet_buffer_size = 1;
543
544         /* get the firmware version */
545         usb_control_msg(udev, usb_rcvctrlpipe(udev, 0),
546                                   REQUEST_GET_VERSION,
547                                   USB_TYPE_VENDOR | USB_DIR_IN, 0, 0,
548                                   buf, 16, USB_CTRL_GET_TIMEOUT);
549         fw_version = (buf[8] << 24) | (buf[9] << 16) | (buf[10] << 8) | buf[11];
550
551         /* set the buffer size - DVB-USB is allocating URB buffers
552          * only after the firwmare download was successful */
553         for (i = 0; i < dib0700_device_count; i++) {
554                 for (adap_num = 0; adap_num < dib0700_devices[i].num_adapters;
555                                 adap_num++) {
556                         if (fw_version >= 0x10201) {
557                                 dib0700_devices[i].adapter[adap_num].fe[0].stream.u.bulk.buffersize = 188*nb_packet_buffer_size;
558                         } else {
559                                 /* for fw version older than 1.20.1,
560                                  * the buffersize has to be n times 512 */
561                                 dib0700_devices[i].adapter[adap_num].fe[0].stream.u.bulk.buffersize = ((188*nb_packet_buffer_size+188/2)/512)*512;
562                                 if (dib0700_devices[i].adapter[adap_num].fe[0].stream.u.bulk.buffersize < 512)
563                                         dib0700_devices[i].adapter[adap_num].fe[0].stream.u.bulk.buffersize = 512;
564                         }
565                 }
566         }
567 out:
568         kfree(buf);
569         return ret;
570 }
571
572 int dib0700_streaming_ctrl(struct dvb_usb_adapter *adap, int onoff)
573 {
574         struct dib0700_state *st = adap->dev->priv;
575         int ret;
576
577         if ((onoff != 0) && (st->fw_version >= 0x10201)) {
578                 /* for firmware later than 1.20.1,
579                  * the USB xfer length can be set  */
580                 ret = dib0700_set_usb_xfer_len(adap->dev,
581                         st->nb_packet_buffer_size);
582                 if (ret < 0) {
583                         deb_info("can not set the USB xfer len\n");
584                         return ret;
585                 }
586         }
587
588         mutex_lock(&adap->dev->usb_mutex);
589
590         st->buf[0] = REQUEST_ENABLE_VIDEO;
591         /* this bit gives a kind of command,
592          * rather than enabling something or not */
593         st->buf[1] = (onoff << 4) | 0x00;
594
595         if (st->disable_streaming_master_mode == 1)
596                 st->buf[2] = 0x00;
597         else
598                 st->buf[2] = 0x01 << 4; /* Master mode */
599
600         st->buf[3] = 0x00;
601
602         deb_info("modifying (%d) streaming state for %d\n", onoff, adap->id);
603
604         st->channel_state &= ~0x3;
605         if ((adap->fe_adap[0].stream.props.endpoint != 2)
606                         && (adap->fe_adap[0].stream.props.endpoint != 3)) {
607                 deb_info("the endpoint number (%i) is not correct, use the adapter id instead", adap->fe_adap[0].stream.props.endpoint);
608                 if (onoff)
609                         st->channel_state |=    1 << (adap->id);
610                 else
611                         st->channel_state |=    1 << ~(adap->id);
612         } else {
613                 if (onoff)
614                         st->channel_state |=    1 << (adap->fe_adap[0].stream.props.endpoint-2);
615                 else
616                         st->channel_state |=    1 << (3-adap->fe_adap[0].stream.props.endpoint);
617         }
618
619         st->buf[2] |= st->channel_state;
620
621         deb_info("data for streaming: %x %x\n", st->buf[1], st->buf[2]);
622
623         ret = dib0700_ctrl_wr(adap->dev, st->buf, 4);
624         mutex_unlock(&adap->dev->usb_mutex);
625
626         return ret;
627 }
628
629 int dib0700_change_protocol(struct rc_dev *rc, u64 *rc_type)
630 {
631         struct dvb_usb_device *d = rc->priv;
632         struct dib0700_state *st = d->priv;
633         int new_proto, ret;
634
635         if (mutex_lock_interruptible(&d->usb_mutex) < 0) {
636                 err("could not acquire lock");
637                 return -EINTR;
638         }
639
640         st->buf[0] = REQUEST_SET_RC;
641         st->buf[1] = 0;
642         st->buf[2] = 0;
643
644         /* Set the IR mode */
645         if (*rc_type & RC_BIT_RC5) {
646                 new_proto = 1;
647                 *rc_type = RC_BIT_RC5;
648         } else if (*rc_type & RC_BIT_NEC) {
649                 new_proto = 0;
650                 *rc_type = RC_BIT_NEC;
651         } else if (*rc_type & RC_BIT_RC6_MCE) {
652                 if (st->fw_version < 0x10200) {
653                         ret = -EINVAL;
654                         goto out;
655                 }
656                 new_proto = 2;
657                 *rc_type = RC_BIT_RC6_MCE;
658         } else {
659                 ret = -EINVAL;
660                 goto out;
661         }
662
663         st->buf[1] = new_proto;
664
665         ret = dib0700_ctrl_wr(d, st->buf, 3);
666         if (ret < 0) {
667                 err("ir protocol setup failed");
668                 goto out;
669         }
670
671         d->props.rc.core.protocol = *rc_type;
672
673 out:
674         mutex_unlock(&d->usb_mutex);
675         return ret;
676 }
677
678 /* This is the structure of the RC response packet starting in firmware 1.20 */
679 struct dib0700_rc_response {
680         u8 report_id;
681         u8 data_state;
682         union {
683                 struct {
684                         u8 system;
685                         u8 not_system;
686                         u8 data;
687                         u8 not_data;
688                 } nec;
689                 struct {
690                         u8 not_used;
691                         u8 system;
692                         u8 data;
693                         u8 not_data;
694                 } rc5;
695         };
696 };
697 #define RC_MSG_SIZE_V1_20 6
698
699 static void dib0700_rc_urb_completion(struct urb *purb)
700 {
701         struct dvb_usb_device *d = purb->context;
702         struct dib0700_rc_response *poll_reply;
703         enum rc_type protocol;
704         u32 keycode;
705         u8 toggle;
706
707         deb_info("%s()\n", __func__);
708         if (d->rc_dev == NULL) {
709                 /* This will occur if disable_rc_polling=1 */
710                 kfree(purb->transfer_buffer);
711                 usb_free_urb(purb);
712                 return;
713         }
714
715         poll_reply = purb->transfer_buffer;
716
717         if (purb->status < 0) {
718                 deb_info("discontinuing polling\n");
719                 kfree(purb->transfer_buffer);
720                 usb_free_urb(purb);
721                 return;
722         }
723
724         if (purb->actual_length != RC_MSG_SIZE_V1_20) {
725                 deb_info("malformed rc msg size=%d\n", purb->actual_length);
726                 goto resubmit;
727         }
728
729         deb_data("IR ID = %02X state = %02X System = %02X %02X Cmd = %02X %02X (len %d)\n",
730                  poll_reply->report_id, poll_reply->data_state,
731                  poll_reply->nec.system, poll_reply->nec.not_system,
732                  poll_reply->nec.data, poll_reply->nec.not_data,
733                  purb->actual_length);
734
735         switch (d->props.rc.core.protocol) {
736         case RC_BIT_NEC:
737                 toggle = 0;
738
739                 /* NEC protocol sends repeat code as 0 0 0 FF */
740                 if (poll_reply->nec.system     == 0x00 &&
741                     poll_reply->nec.not_system == 0x00 &&
742                     poll_reply->nec.data       == 0x00 &&
743                     poll_reply->nec.not_data   == 0xff) {
744                         poll_reply->data_state = 2;
745                         rc_repeat(d->rc_dev);
746                         goto resubmit;
747                 }
748
749                 if ((poll_reply->nec.data ^ poll_reply->nec.not_data) != 0xff) {
750                         deb_data("NEC32 protocol\n");
751                         keycode = RC_SCANCODE_NEC32(poll_reply->nec.system     << 24 |
752                                                      poll_reply->nec.not_system << 16 |
753                                                      poll_reply->nec.data       << 8  |
754                                                      poll_reply->nec.not_data);
755                         protocol = RC_TYPE_NEC32;
756                 } else if ((poll_reply->nec.system ^ poll_reply->nec.not_system) != 0xff) {
757                         deb_data("NEC extended protocol\n");
758                         keycode = RC_SCANCODE_NECX(poll_reply->nec.system << 8 |
759                                                     poll_reply->nec.not_system,
760                                                     poll_reply->nec.data);
761
762                         protocol = RC_TYPE_NECX;
763                 } else {
764                         deb_data("NEC normal protocol\n");
765                         keycode = RC_SCANCODE_NEC(poll_reply->nec.system,
766                                                    poll_reply->nec.data);
767                         protocol = RC_TYPE_NEC;
768                 }
769
770                 break;
771         default:
772                 deb_data("RC5 protocol\n");
773                 protocol = RC_TYPE_RC5;
774                 toggle = poll_reply->report_id;
775                 keycode = RC_SCANCODE_RC5(poll_reply->rc5.system, poll_reply->rc5.data);
776
777                 if ((poll_reply->rc5.data ^ poll_reply->rc5.not_data) != 0xff) {
778                         /* Key failed integrity check */
779                         err("key failed integrity check: %02x %02x %02x %02x",
780                             poll_reply->rc5.not_used, poll_reply->rc5.system,
781                             poll_reply->rc5.data, poll_reply->rc5.not_data);
782                         goto resubmit;
783                 }
784
785                 break;
786         }
787
788         rc_keydown(d->rc_dev, protocol, keycode, toggle);
789
790 resubmit:
791         /* Clean the buffer before we requeue */
792         memset(purb->transfer_buffer, 0, RC_MSG_SIZE_V1_20);
793
794         /* Requeue URB */
795         usb_submit_urb(purb, GFP_ATOMIC);
796 }
797
798 int dib0700_rc_setup(struct dvb_usb_device *d, struct usb_interface *intf)
799 {
800         struct dib0700_state *st = d->priv;
801         struct urb *purb;
802         const struct usb_endpoint_descriptor *e;
803         int ret, rc_ep = 1;
804         unsigned int pipe = 0;
805
806         /* Poll-based. Don't initialize bulk mode */
807         if (st->fw_version < 0x10200 || !intf)
808                 return 0;
809
810         /* Starting in firmware 1.20, the RC info is provided on a bulk pipe */
811
812         if (intf->altsetting[0].desc.bNumEndpoints < rc_ep + 1)
813                 return -ENODEV;
814
815         purb = usb_alloc_urb(0, GFP_KERNEL);
816         if (purb == NULL)
817                 return -ENOMEM;
818
819         purb->transfer_buffer = kzalloc(RC_MSG_SIZE_V1_20, GFP_KERNEL);
820         if (purb->transfer_buffer == NULL) {
821                 err("rc kzalloc failed");
822                 usb_free_urb(purb);
823                 return -ENOMEM;
824         }
825
826         purb->status = -EINPROGRESS;
827
828         /*
829          * Some devices like the Hauppauge NovaTD model 52009 use an interrupt
830          * endpoint, while others use a bulk one.
831          */
832         e = &intf->altsetting[0].endpoint[rc_ep].desc;
833         if (usb_endpoint_dir_in(e)) {
834                 if (usb_endpoint_xfer_bulk(e)) {
835                         pipe = usb_rcvbulkpipe(d->udev, rc_ep);
836                         usb_fill_bulk_urb(purb, d->udev, pipe,
837                                           purb->transfer_buffer,
838                                           RC_MSG_SIZE_V1_20,
839                                           dib0700_rc_urb_completion, d);
840
841                 } else if (usb_endpoint_xfer_int(e)) {
842                         pipe = usb_rcvintpipe(d->udev, rc_ep);
843                         usb_fill_int_urb(purb, d->udev, pipe,
844                                           purb->transfer_buffer,
845                                           RC_MSG_SIZE_V1_20,
846                                           dib0700_rc_urb_completion, d, 1);
847                 }
848         }
849
850         if (!pipe) {
851                 err("There's no endpoint for remote controller");
852                 kfree(purb->transfer_buffer);
853                 usb_free_urb(purb);
854                 return 0;
855         }
856
857         ret = usb_submit_urb(purb, GFP_ATOMIC);
858         if (ret) {
859                 err("rc submit urb failed");
860                 kfree(purb->transfer_buffer);
861                 usb_free_urb(purb);
862         }
863
864         return ret;
865 }
866
867 static int dib0700_probe(struct usb_interface *intf,
868                 const struct usb_device_id *id)
869 {
870         int i;
871         struct dvb_usb_device *dev;
872
873         for (i = 0; i < dib0700_device_count; i++)
874                 if (dvb_usb_device_init(intf, &dib0700_devices[i], THIS_MODULE,
875                     &dev, adapter_nr) == 0) {
876                         struct dib0700_state *st = dev->priv;
877                         u32 hwversion, romversion, fw_version, fwtype;
878
879                         dib0700_get_version(dev, &hwversion, &romversion,
880                                 &fw_version, &fwtype);
881
882                         deb_info("Firmware version: %x, %d, 0x%x, %d\n",
883                                 hwversion, romversion, fw_version, fwtype);
884
885                         st->fw_version = fw_version;
886                         st->nb_packet_buffer_size = (u32)nb_packet_buffer_size;
887
888                         /* Disable polling mode on newer firmwares */
889                         if (st->fw_version >= 0x10200)
890                                 dev->props.rc.core.bulk_mode = true;
891                         else
892                                 dev->props.rc.core.bulk_mode = false;
893
894                         dib0700_rc_setup(dev, intf);
895
896                         return 0;
897                 }
898
899         return -ENODEV;
900 }
901
902 static struct usb_driver dib0700_driver = {
903         .name       = "dvb_usb_dib0700",
904         .probe      = dib0700_probe,
905         .disconnect = dvb_usb_device_exit,
906         .id_table   = dib0700_usb_id_table,
907 };
908
909 module_usb_driver(dib0700_driver);
910
911 MODULE_FIRMWARE("dvb-usb-dib0700-1.20.fw");
912 MODULE_AUTHOR("Patrick Boettcher <patrick.boettcher@posteo.de>");
913 MODULE_DESCRIPTION("Driver for devices based on DiBcom DiB0700 - USB bridge");
914 MODULE_VERSION("1.0");
915 MODULE_LICENSE("GPL");