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