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