dib0700_core.c 23.0 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
/* Linux driver for devices based on the DiBcom DiB0700 USB bridge
 *
 *	This program is free software; you can redistribute it and/or modify it
 *	under the terms of the GNU General Public License as published by the Free
 *	Software Foundation, version 2.
 *
 *  Copyright (C) 2005-6 DiBcom, SA
 */
#include "dib0700.h"

/* debug */
int dvb_usb_dib0700_debug;
module_param_named(debug,dvb_usb_dib0700_debug, int, 0644);
MODULE_PARM_DESC(debug, "set debugging level (1=info,2=fw,4=fwdata,8=data (or-able))." DVB_USB_DEBUG_STATUS);

16 17 18
static int nb_packet_buffer_size = 21;
module_param(nb_packet_buffer_size, int, 0644);
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 22
DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr);

23 24 25 26

int dib0700_get_version(struct dvb_usb_device *d, u32 *hwversion,
			u32 *romversion, u32 *ramversion, u32 *fwtype)
{
27 28 29
	struct dib0700_state *st = d->priv;
	int ret;

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 37
				  REQUEST_GET_VERSION,
				  USB_TYPE_VENDOR | USB_DIR_IN, 0, 0,
38
				  st->buf, 16, USB_CTRL_GET_TIMEOUT);
39
	if (hwversion != NULL)
40 41
		*hwversion  = (st->buf[0] << 24)  | (st->buf[1] << 16)  |
			(st->buf[2] << 8)  | st->buf[3];
42
	if (romversion != NULL)
43 44
		*romversion = (st->buf[4] << 24)  | (st->buf[5] << 16)  |
			(st->buf[6] << 8)  | st->buf[7];
45
	if (ramversion != NULL)
46 47
		*ramversion = (st->buf[8] << 24)  | (st->buf[9] << 16)  |
			(st->buf[10] << 8) | st->buf[11];
48
	if (fwtype != NULL)
49 50
		*fwtype     = (st->buf[12] << 24) | (st->buf[13] << 16) |
			(st->buf[14] << 8) | st->buf[15];
51
	mutex_unlock(&d->usb_mutex);
52 53 54
	return ret;
}

55 56 57 58 59 60
/* expecting rx buffer: request data[0] data[1] ... data[2] */
static int dib0700_ctrl_wr(struct dvb_usb_device *d, u8 *tx, u8 txlen)
{
	int status;

	deb_data(">>> ");
61
	debug_dump(tx, txlen, deb_data);
62 63 64 65 66 67

	status = usb_control_msg(d->udev, usb_sndctrlpipe(d->udev,0),
		tx[0], USB_TYPE_VENDOR | USB_DIR_OUT, 0, 0, tx, txlen,
		USB_CTRL_GET_TIMEOUT);

	if (status != txlen)
68
		deb_data("ep 0 write error (status = %d, len: %d)\n",status,txlen);
69 70 71 72 73

	return status < 0 ? status : 0;
}

/* 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 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102
{
	u16 index, value;
	int status;

	if (txlen < 2) {
		err("tx buffer length is smaller than 2. Makes no sense.");
		return -EINVAL;
	}
	if (txlen > 4) {
		err("tx buffer length is larger than 4. Not supported.");
		return -EINVAL;
	}

	deb_data(">>> ");
	debug_dump(tx,txlen,deb_data);

	value = ((txlen - 2) << 8) | tx[1];
	index = 0;
	if (txlen > 2)
		index |= (tx[2] << 8);
	if (txlen > 3)
		index |= tx[3];

	status = usb_control_msg(d->udev, usb_rcvctrlpipe(d->udev,0), tx[0],
			USB_TYPE_VENDOR | USB_DIR_IN, value, index, rx, rxlen,
			USB_CTRL_GET_TIMEOUT);

	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 109 110 111 112

	return status; /* length in case of success */
}

int dib0700_set_gpio(struct dvb_usb_device *d, enum dib07x0_gpios gpio, u8 gpio_dir, u8 gpio_val)
{
113
	struct dib0700_state *st = d->priv;
114 115 116
	int ret;

	if (mutex_lock_interruptible(&d->usb_mutex) < 0) {
117
		err("could not acquire lock");
118
		return -EINTR;
119
	}
120 121 122 123 124 125 126

	st->buf[0] = REQUEST_SET_GPIO;
	st->buf[1] = gpio;
	st->buf[2] = ((gpio_dir & 0x01) << 7) | ((gpio_val & 0x01) << 6);

	ret = dib0700_ctrl_wr(d, st->buf, 3);

127
	mutex_unlock(&d->usb_mutex);
128
	return ret;
129 130
}

131 132
static int dib0700_set_usb_xfer_len(struct dvb_usb_device *d, u16 nb_ts_packets)
{
133 134 135 136
	struct dib0700_state *st = d->priv;
	int ret;

	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 143 144
		st->buf[0] = REQUEST_SET_USB_XFER_LEN;
		st->buf[1] = (nb_ts_packets >> 8) & 0xff;
		st->buf[2] = nb_ts_packets & 0xff;
145 146 147

		deb_info("set the USB xfer len to %i Ts packet\n", nb_ts_packets);

148
		ret = dib0700_ctrl_wr(d, st->buf, 3);
149
		mutex_unlock(&d->usb_mutex);
150 151 152 153 154 155
	} else {
		deb_info("this firmware does not allow to change the USB xfer len\n");
		ret = -EIO;
	}

	return ret;
156 157
}

158
/*
159
 * I2C master xfer function (supported in 1.20 firmware)
160
 */
161 162 163 164 165 166 167
static int dib0700_i2c_xfer_new(struct i2c_adapter *adap, struct i2c_msg *msg,
				int num)
{
	/* The new i2c firmware messages are more reliable and in particular
	   properly support i2c read calls not preceded by a write */

	struct dvb_usb_device *d = i2c_get_adapdata(adap);
168
	struct dib0700_state *st = d->priv;
169 170 171 172 173 174 175 176 177
	uint8_t bus_mode = 1;  /* 0=eeprom bus, 1=frontend bus */
	uint8_t gen_mode = 0; /* 0=master i2c, 1=gpio i2c */
	uint8_t en_start = 0;
	uint8_t en_stop = 0;
	int result, i;

	/* Ensure nobody else hits the i2c bus while we're sending our
	   sequence of messages, (such as the remote control thread) */
	if (mutex_lock_interruptible(&d->i2c_mutex) < 0)
178
		return -EINTR;
179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205

	for (i = 0; i < num; i++) {
		if (i == 0) {
			/* First message in the transaction */
			en_start = 1;
		} else if (!(msg[i].flags & I2C_M_NOSTART)) {
			/* Device supports repeated-start */
			en_start = 1;
		} else {
			/* Not the first packet and device doesn't support
			   repeated start */
			en_start = 0;
		}
		if (i == (num - 1)) {
			/* Last message in the transaction */
			en_stop = 1;
		}

		if (msg[i].flags & I2C_M_RD) {
			/* Read request */
			u16 index, value;
			uint8_t i2c_dest;

			i2c_dest = (msg[i].addr << 1);
			value = ((en_start << 7) | (en_stop << 6) |
				 (msg[i].len & 0x3F)) << 8 | i2c_dest;
			/* I2C ctrl + FE bus; */
206 207
			index = ((gen_mode << 6) & 0xC0) |
				((bus_mode << 4) & 0x30);
208 209 210 211 212

			result = usb_control_msg(d->udev,
						 usb_rcvctrlpipe(d->udev, 0),
						 REQUEST_NEW_I2C_READ,
						 USB_TYPE_VENDOR | USB_DIR_IN,
213
						 value, index, st->buf,
214 215 216
						 msg[i].len,
						 USB_CTRL_GET_TIMEOUT);
			if (result < 0) {
217
				deb_info("i2c read error (status = %d)\n", result);
218 219
				break;
			}
220

221 222 223 224 225 226 227 228
			if (msg[i].len > sizeof(st->buf)) {
				deb_info("buffer too small to fit %d bytes\n",
					 msg[i].len);
				return -EIO;
			}

			memcpy(msg[i].buf, st->buf, msg[i].len);

229 230 231
			deb_data("<<< ");
			debug_dump(msg[i].buf, msg[i].len, deb_data);

232 233
		} else {
			/* Write request */
234
			if (mutex_lock_interruptible(&d->usb_mutex) < 0) {
235
				err("could not acquire lock");
236 237
				mutex_unlock(&d->i2c_mutex);
				return -EINTR;
238
			}
239 240 241
			st->buf[0] = REQUEST_NEW_I2C_WRITE;
			st->buf[1] = msg[i].addr << 1;
			st->buf[2] = (en_start << 7) | (en_stop << 6) |
242 243
				(msg[i].len & 0x3F);
			/* I2C ctrl + FE bus; */
244
			st->buf[3] = ((gen_mode << 6) & 0xC0) |
245
				 ((bus_mode << 4) & 0x30);
246 247 248 249 250 251 252

			if (msg[i].len > sizeof(st->buf) - 4) {
				deb_info("i2c message to big: %d\n",
					 msg[i].len);
				return -EIO;
			}

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 260 261 262
			result = usb_control_msg(d->udev,
						 usb_sndctrlpipe(d->udev, 0),
						 REQUEST_NEW_I2C_WRITE,
						 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 269 270 271 272 273 274 275 276 277 278 279 280
				break;
			}
		}
	}
	mutex_unlock(&d->i2c_mutex);
	return i;
}

/*
 * I2C master xfer function (pre-1.20 firmware)
 */
static int dib0700_i2c_xfer_legacy(struct i2c_adapter *adap,
				   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 285 286
	int i,len;

	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 291
		mutex_unlock(&d->i2c_mutex);
		return -EINTR;
292
	}
293 294 295

	for (i = 0; i < num; i++) {
		/* fill in the address */
296
		st->buf[1] = msg[i].addr << 1;
297
		/* fill the buffer */
298 299 300 301 302
		if (msg[i].len > sizeof(st->buf) - 2) {
			deb_info("i2c xfer to big: %d\n",
				msg[i].len);
			return -EIO;
		}
303
		memcpy(&st->buf[2], msg[i].buf, msg[i].len);
304 305 306

		/* write/read request */
		if (i+1 < num && (msg[i+1].flags & I2C_M_RD)) {
307 308
			st->buf[0] = REQUEST_I2C_READ;
			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 320 321 322 323
			if (msg[i + 1].len > sizeof(st->buf)) {
				deb_info("i2c xfer buffer to small for %d\n",
					msg[i].len);
				return -EIO;
			}
324 325
			memcpy(msg[i + 1].buf, st->buf, msg[i + 1].len);

326 327 328 329
			msg[i+1].len = len;

			i++;
		} else {
330 331
			st->buf[0] = REQUEST_I2C_WRITE;
			if (dib0700_ctrl_wr(d, st->buf, msg[i].len + 2) < 0)
332 333 334
				break;
		}
	}
335
	mutex_unlock(&d->usb_mutex);
336
	mutex_unlock(&d->i2c_mutex);
337

338 339 340
	return i;
}

341 342 343 344 345 346 347 348 349 350 351 352 353 354 355
static int dib0700_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg *msg,
			    int num)
{
	struct dvb_usb_device *d = i2c_get_adapdata(adap);
	struct dib0700_state *st = d->priv;

	if (st->fw_use_new_i2c_api == 1) {
		/* User running at least fw 1.20 */
		return dib0700_i2c_xfer_new(adap, msg, num);
	} else {
		/* Use legacy calls */
		return dib0700_i2c_xfer_legacy(adap, msg, num);
	}
}

356 357 358 359 360 361 362 363 364 365
static u32 dib0700_i2c_func(struct i2c_adapter *adapter)
{
	return I2C_FUNC_I2C;
}

struct i2c_algorithm dib0700_i2c_algo = {
	.master_xfer   = dib0700_i2c_xfer,
	.functionality = dib0700_i2c_func,
};

366 367 368
int dib0700_identify_state(struct usb_device *udev, struct dvb_usb_device_properties *props,
			struct dvb_usb_device_description **desc, int *cold)
{
369 370 371 372 373 374 375 376 377
	s16 ret;
	u8 *b;

	b = kmalloc(16, GFP_KERNEL);
	if (!b)
		return	-ENOMEM;


	ret = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0),
378 379 380 381 382
		REQUEST_GET_VERSION, USB_TYPE_VENDOR | USB_DIR_IN, 0, 0, b, 16, USB_CTRL_GET_TIMEOUT);

	deb_info("FW GET_VERSION length: %d\n",ret);

	*cold = ret <= 0;
383
	deb_info("cold: %d\n", *cold);
384 385

	kfree(b);
386 387 388
	return 0;
}

389 390 391 392
static int 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)
{
393
	struct dib0700_state *st = d->priv;
394 395 396
	int ret;

	if (mutex_lock_interruptible(&d->usb_mutex) < 0) {
397
		err("could not acquire lock");
398
		return -EINTR;
399
	}
400 401 402 403 404 405 406 407 408 409 410 411 412 413

	st->buf[0] = REQUEST_SET_CLOCK;
	st->buf[1] = (en_pll << 7) | (pll_src << 6) |
		(pll_range << 5) | (clock_gpio3 << 4);
	st->buf[2] = (pll_prediv >> 8)  & 0xff; /* MSB */
	st->buf[3] =  pll_prediv        & 0xff; /* LSB */
	st->buf[4] = (pll_loopdiv >> 8) & 0xff; /* MSB */
	st->buf[5] =  pll_loopdiv       & 0xff; /* LSB */
	st->buf[6] = (free_div >> 8)    & 0xff; /* MSB */
	st->buf[7] =  free_div          & 0xff; /* LSB */
	st->buf[8] = (dsuScaler >> 8)   & 0xff; /* MSB */
	st->buf[9] =  dsuScaler         & 0xff; /* LSB */

	ret = dib0700_ctrl_wr(d, st->buf, 10);
414
	mutex_unlock(&d->usb_mutex);
415 416

	return ret;
417 418
}

419 420
int dib0700_set_i2c_speed(struct dvb_usb_device *d, u16 scl_kHz)
{
421
	struct dib0700_state *st = d->priv;
422
	u16 divider;
423
	int ret;
424 425 426 427

	if (scl_kHz == 0)
		return -EINVAL;

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 436 437
	st->buf[1] = 0;
	st->buf[2] = (u8) (divider >> 8);
	st->buf[3] = (u8) (divider & 0xff);
438
	divider = (u16) (72000 / scl_kHz);
439 440
	st->buf[4] = (u8) (divider >> 8);
	st->buf[5] = (u8) (divider & 0xff);
441
	divider = (u16) (72000 / scl_kHz); /* clock: 72MHz */
442 443
	st->buf[6] = (u8) (divider >> 8);
	st->buf[7] = (u8) (divider & 0xff);
444

445
	deb_info("setting I2C speed: %04x %04x %04x (%d kHz).",
446 447
		(st->buf[2] << 8) | (st->buf[3]), (st->buf[4] << 8) |
		st->buf[5], (st->buf[6] << 8) | st->buf[7], scl_kHz);
448 449 450 451 452

	ret = dib0700_ctrl_wr(d, st->buf, 8);
	mutex_unlock(&d->usb_mutex);

	return ret;
453 454 455
}


456 457 458 459 460 461 462 463 464
int dib0700_ctrl_clock(struct dvb_usb_device *d, u32 clk_MHz, u8 clock_out_gp3)
{
	switch (clk_MHz) {
		case 72: dib0700_set_clock(d, 1, 0, 1, clock_out_gp3, 2, 24, 0, 0x4c); break;
		default: return -EINVAL;
	}
	return 0;
}

465 466
static int dib0700_jumpram(struct usb_device *udev, u32 address)
{
467 468 469 470 471 472 473 474 475 476 477 478 479 480
	int ret = 0, actlen;
	u8 *buf;

	buf = kmalloc(8, GFP_KERNEL);
	if (!buf)
		return -ENOMEM;
	buf[0] = REQUEST_JUMPRAM;
	buf[1] = 0;
	buf[2] = 0;
	buf[3] = 0;
	buf[4] = (address >> 24) & 0xff;
	buf[5] = (address >> 16) & 0xff;
	buf[6] = (address >> 8)  & 0xff;
	buf[7] =  address        & 0xff;
481 482 483

	if ((ret = usb_bulk_msg(udev, usb_sndbulkpipe(udev, 0x01),buf,8,&actlen,1000)) < 0) {
		deb_fw("jumpram to 0x%x failed\n",address);
484
		goto out;
485 486 487
	}
	if (actlen != 8) {
		deb_fw("jumpram to 0x%x failed\n",address);
488 489
		ret = -EIO;
		goto out;
490
	}
491 492 493
out:
	kfree(buf);
	return ret;
494 495 496 497 498
}

int dib0700_download_firmware(struct usb_device *udev, const struct firmware *fw)
{
	struct hexline hx;
499
	int pos = 0, ret, act_len, i, adap_num;
500
	u8 *buf;
501
	u32 fw_version;
502

503 504 505
	buf = kmalloc(260, GFP_KERNEL);
	if (!buf)
		return -ENOMEM;
506 507

	while ((ret = dvb_usb_get_hexline(fw, &hx, &pos)) > 0) {
508 509
		deb_fwdata("writing to address 0x%08x (buffer: 0x%02x %02x)\n",
				hx.addr, hx.len, hx.chk);
510 511

		buf[0] = hx.len;
512 513
		buf[1] = (hx.addr >> 8) & 0xff;
		buf[2] =  hx.addr       & 0xff;
514 515 516 517 518 519 520 521 522 523 524 525 526
		buf[3] = hx.type;
		memcpy(&buf[4],hx.data,hx.len);
		buf[4+hx.len] = hx.chk;

		ret = usb_bulk_msg(udev,
			usb_sndbulkpipe(udev, 0x01),
			buf,
			hx.len + 5,
			&act_len,
			1000);

		if (ret < 0) {
			err("firmware download failed at %d with %d",pos,ret);
527
			goto out;
528 529 530 531 532
		}
	}

	if (ret == 0) {
		/* start the firmware */
533
		if ((ret = dib0700_jumpram(udev, 0x70000000)) == 0) {
534
			info("firmware started successfully.");
535
			msleep(500);
536
		}
537 538 539
	} else
		ret = -EIO;

540 541 542 543
	/* the number of ts packet has to be at least 1 */
	if (nb_packet_buffer_size < 1)
		nb_packet_buffer_size = 1;

544
	/* get the firmware version */
545 546 547
	usb_control_msg(udev, usb_rcvctrlpipe(udev, 0),
				  REQUEST_GET_VERSION,
				  USB_TYPE_VENDOR | USB_DIR_IN, 0, 0,
548 549
				  buf, 16, USB_CTRL_GET_TIMEOUT);
	fw_version = (buf[8] << 24) | (buf[9] << 16) | (buf[10] << 8) | buf[11];
550 551 552 553 554 555

	/* set the buffer size - DVB-USB is allocating URB buffers
	 * only after the firwmare download was successful */
	for (i = 0; i < dib0700_device_count; i++) {
		for (adap_num = 0; adap_num < dib0700_devices[i].num_adapters;
				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 560
				/* for fw version older than 1.20.1,
				 * the buffersize has to be n times 512 */
561 562 563
				dib0700_devices[i].adapter[adap_num].fe[0].stream.u.bulk.buffersize = ((188*nb_packet_buffer_size+188/2)/512)*512;
				if (dib0700_devices[i].adapter[adap_num].fe[0].stream.u.bulk.buffersize < 512)
					dib0700_devices[i].adapter[adap_num].fe[0].stream.u.bulk.buffersize = 512;
564 565 566
			}
		}
	}
567 568
out:
	kfree(buf);
569 570 571 572 573 574
	return ret;
}

int dib0700_streaming_ctrl(struct dvb_usb_adapter *adap, int onoff)
{
	struct dib0700_state *st = adap->dev->priv;
575 576 577 578 579 580 581 582 583 584 585 586
	int ret;

	if ((onoff != 0) && (st->fw_version >= 0x10201)) {
		/* for firmware later than 1.20.1,
		 * the USB xfer length can be set  */
		ret = dib0700_set_usb_xfer_len(adap->dev,
			st->nb_packet_buffer_size);
		if (ret < 0) {
			deb_info("can not set the USB xfer len\n");
			return ret;
		}
	}
587

588
	mutex_lock(&adap->dev->usb_mutex);
589

590 591 592 593
	st->buf[0] = REQUEST_ENABLE_VIDEO;
	/* this bit gives a kind of command,
	 * rather than enabling something or not */
	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 603

	deb_info("modifying (%d) streaming state for %d\n", onoff, adap->id);

604
	st->channel_state &= ~0x3;
605 606 607
	if ((adap->fe_adap[0].stream.props.endpoint != 2)
			&& (adap->fe_adap[0].stream.props.endpoint != 3)) {
		deb_info("the endpoint number (%i) is not correct, use the adapter id instead", adap->fe_adap[0].stream.props.endpoint);
608 609 610
		if (onoff)
			st->channel_state |=	1 << (adap->id);
		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 624 625 626
	ret = dib0700_ctrl_wr(adap->dev, st->buf, 4);
	mutex_unlock(&adap->dev->usb_mutex);

	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 633 634
	struct dib0700_state *st = d->priv;
	int new_proto, ret;

635
	if (mutex_lock_interruptible(&d->usb_mutex) < 0) {
636
		err("could not acquire lock");
637
		return -EINTR;
638 639
	}

640 641 642 643
	st->buf[0] = REQUEST_SET_RC;
	st->buf[1] = 0;
	st->buf[2] = 0;

644
	/* Set the IR mode */
645
	if (*rc_type & RC_BIT_RC5) {
646
		new_proto = 1;
647 648
		*rc_type = RC_BIT_RC5;
	} else if (*rc_type & RC_BIT_NEC) {
649
		new_proto = 0;
650 651
		*rc_type = RC_BIT_NEC;
	} else if (*rc_type & RC_BIT_RC6_MCE) {
652 653 654 655
		if (st->fw_version < 0x10200) {
			ret = -EINVAL;
			goto out;
		}
656
		new_proto = 2;
657
		*rc_type = RC_BIT_RC6_MCE;
658 659 660 661
	} else {
		ret = -EINVAL;
		goto out;
	}
662

663
	st->buf[1] = new_proto;
664

665
	ret = dib0700_ctrl_wr(d, st->buf, 3);
666 667
	if (ret < 0) {
		err("ir protocol setup failed");
668
		goto out;
669 670
	}

671
	d->props.rc.core.protocol = *rc_type;
672

673 674
out:
	mutex_unlock(&d->usb_mutex);
675 676 677
	return ret;
}

678 679 680 681
/* This is the structure of the RC response packet starting in firmware 1.20 */
struct dib0700_rc_response {
	u8 report_id;
	u8 data_state;
682 683 684 685 686 687 688 689 690 691 692 693 694 695
	union {
		struct {
			u8 system;
			u8 not_system;
			u8 data;
			u8 not_data;
		} nec;
		struct {
			u8 not_used;
			u8 system;
			u8 data;
			u8 not_data;
		} rc5;
	};
696 697 698 699 700 701
};
#define RC_MSG_SIZE_V1_20 6

static void dib0700_rc_urb_completion(struct urb *purb)
{
	struct dvb_usb_device *d = purb->context;
702
	struct dib0700_rc_response *poll_reply;
703
	enum rc_type protocol;
704
	u32 uninitialized_var(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 712 713 714
		usb_free_urb(purb);
		return;
	}

715
	poll_reply = purb->transfer_buffer;
716 717 718

	if (purb->status < 0) {
		deb_info("discontinuing polling\n");
719
		kfree(purb->transfer_buffer);
720 721 722 723 724 725 726 727 728
		usb_free_urb(purb);
		return;
	}

	if (purb->actual_length != RC_MSG_SIZE_V1_20) {
		deb_info("malformed rc msg size=%d\n", purb->actual_length);
		goto resubmit;
	}

729 730
	deb_data("IR ID = %02X state = %02X System = %02X %02X Cmd = %02X %02X (len %d)\n",
		 poll_reply->report_id, poll_reply->data_state,
731 732
		 poll_reply->nec.system, poll_reply->nec.not_system,
		 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 741 742 743
		if (poll_reply->nec.system     == 0x00 &&
		    poll_reply->nec.not_system == 0x00 &&
		    poll_reply->nec.data       == 0x00 &&
		    poll_reply->nec.not_data   == 0xff) {
744
			poll_reply->data_state = 2;
745 746
			break;
		}
747

748
		if ((poll_reply->nec.data ^ poll_reply->nec.not_data) != 0xff) {
749
			deb_data("NEC32 protocol\n");
750 751 752 753
			keycode = RC_SCANCODE_NEC32(poll_reply->nec.system     << 24 |
						     poll_reply->nec.not_system << 16 |
						     poll_reply->nec.data       << 8  |
						     poll_reply->nec.not_data);
754
			protocol = RC_TYPE_NEC32;
755
		} else if ((poll_reply->nec.system ^ poll_reply->nec.not_system) != 0xff) {
756
			deb_data("NEC extended protocol\n");
757 758 759
			keycode = RC_SCANCODE_NECX(poll_reply->nec.system << 8 |
						    poll_reply->nec.not_system,
						    poll_reply->nec.data);
760

761
			protocol = RC_TYPE_NECX;
762 763
		} else {
			deb_data("NEC normal protocol\n");
764 765
			keycode = RC_SCANCODE_NEC(poll_reply->nec.system,
						   poll_reply->nec.data);
766
			protocol = RC_TYPE_NEC;
767 768
		}

769 770
		break;
	default:
771
		deb_data("RC5 protocol\n");
772
		protocol = RC_TYPE_RC5;
773
		toggle = poll_reply->report_id;
774 775 776 777 778 779 780 781 782
		keycode = RC_SCANCODE_RC5(poll_reply->rc5.system, poll_reply->rc5.data);

		if ((poll_reply->rc5.data ^ poll_reply->rc5.not_data) != 0xff) {
			/* Key failed integrity check */
			err("key failed integrity check: %02x %02x %02x %02x",
			    poll_reply->rc5.not_used, poll_reply->rc5.system,
			    poll_reply->rc5.data, poll_reply->rc5.not_data);
			goto resubmit;
		}
783

784 785 786
		break;
	}

787
	rc_keydown(d->rc_dev, protocol, keycode, toggle);
788 789 790 791 792 793 794 795 796

resubmit:
	/* Clean the buffer before we requeue */
	memset(purb->transfer_buffer, 0, RC_MSG_SIZE_V1_20);

	/* Requeue URB */
	usb_submit_urb(purb, GFP_ATOMIC);
}

797
int dib0700_rc_setup(struct dvb_usb_device *d, struct usb_interface *intf)
798
{
799 800
	struct dib0700_state *st = d->priv;
	struct urb *purb;
801 802 803
	const struct usb_endpoint_descriptor *e;
	int ret, rc_ep = 1;
	unsigned int pipe = 0;
804

805
	/* Poll-based. Don't initialize bulk mode */
806
	if (st->fw_version < 0x10200 || !intf)
807 808 809
		return 0;

	/* Starting in firmware 1.20, the RC info is provided on a bulk pipe */
810

811
	purb = usb_alloc_urb(0, GFP_KERNEL);
812
	if (purb == NULL)
813
		return -ENOMEM;
814 815 816

	purb->transfer_buffer = kzalloc(RC_MSG_SIZE_V1_20, GFP_KERNEL);
	if (purb->transfer_buffer == NULL) {
817
		err("rc kzalloc failed");
818
		usb_free_urb(purb);
819
		return -ENOMEM;
820 821 822
	}

	purb->status = -EINPROGRESS;
823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851

	/*
	 * Some devices like the Hauppauge NovaTD model 52009 use an interrupt
	 * endpoint, while others use a bulk one.
	 */
	e = &intf->altsetting[0].endpoint[rc_ep].desc;
	if (usb_endpoint_dir_in(e)) {
		if (usb_endpoint_xfer_bulk(e)) {
			pipe = usb_rcvbulkpipe(d->udev, rc_ep);
			usb_fill_bulk_urb(purb, d->udev, pipe,
					  purb->transfer_buffer,
					  RC_MSG_SIZE_V1_20,
					  dib0700_rc_urb_completion, d);

		} else if (usb_endpoint_xfer_int(e)) {
			pipe = usb_rcvintpipe(d->udev, rc_ep);
			usb_fill_int_urb(purb, d->udev, pipe,
					  purb->transfer_buffer,
					  RC_MSG_SIZE_V1_20,
					  dib0700_rc_urb_completion, d, 1);
		}
	}

	if (!pipe) {
		err("There's no endpoint for remote controller");
		kfree(purb->transfer_buffer);
		usb_free_urb(purb);
		return 0;
	}
852 853

	ret = usb_submit_urb(purb, GFP_ATOMIC);
854
	if (ret) {
855
		err("rc submit urb failed");
856 857 858
		kfree(purb->transfer_buffer);
		usb_free_urb(purb);
	}
859

860
	return ret;
861 862
}

863 864 865 866
static int dib0700_probe(struct usb_interface *intf,
		const struct usb_device_id *id)
{
	int i;
867
	struct dvb_usb_device *dev;
868 869

	for (i = 0; i < dib0700_device_count; i++)
870
		if (dvb_usb_device_init(intf, &dib0700_devices[i], THIS_MODULE,
871 872 873 874 875 876 877 878 879 880 881 882 883
		    &dev, adapter_nr) == 0) {
			struct dib0700_state *st = dev->priv;
			u32 hwversion, romversion, fw_version, fwtype;

			dib0700_get_version(dev, &hwversion, &romversion,
				&fw_version, &fwtype);

			deb_info("Firmware version: %x, %d, 0x%x, %d\n",
				hwversion, romversion, fw_version, fwtype);

			st->fw_version = fw_version;
			st->nb_packet_buffer_size = (u32)nb_packet_buffer_size;

884 885 886 887 888 889
			/* Disable polling mode on newer firmwares */
			if (st->fw_version >= 0x10200)
				dev->props.rc.core.bulk_mode = true;
			else
				dev->props.rc.core.bulk_mode = false;

890
			dib0700_rc_setup(dev, intf);
891

892
			return 0;
893
		}
894 895 896 897 898 899 900 901 902 903 904

	return -ENODEV;
}

static struct usb_driver dib0700_driver = {
	.name       = "dvb_usb_dib0700",
	.probe      = dib0700_probe,
	.disconnect = dvb_usb_device_exit,
	.id_table   = dib0700_usb_id_table,
};

905
module_usb_driver(dib0700_driver);
906

907
MODULE_FIRMWARE("dvb-usb-dib0700-1.20.fw");
908
MODULE_AUTHOR("Patrick Boettcher <patrick.boettcher@posteo.de>");
909 910 911
MODULE_DESCRIPTION("Driver for devices based on DiBcom DiB0700 - USB bridge");
MODULE_VERSION("1.0");
MODULE_LICENSE("GPL");