az6007.c 19.8 KB
Newer Older
1 2 3 4 5 6 7 8 9
/*
 * Driver for AzureWave 6007 DVB-C/T USB2.0 and clones
 *
 * Copyright (c) Henry Wang <Henry.wang@AzureWave.com>
 *
 * This driver was made publicly available by Terratec, at:
 *	http://linux.terratec.de/files/TERRATEC_H7/20110323_TERRATEC_H7_Linux.tar.gz
 * The original driver's license is GPL, as declared with MODULE_LICENSE()
 *
10 11 12
 * Copyright (c) 2010-2011 Mauro Carvalho Chehab <mchehab@redhat.com>
 *	Driver modified by in order to work with upstream drxk driver, and
 *	tons of bugs got fixed.
13 14 15 16 17 18 19 20 21
 *
 * 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 under version 2 of the License.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
22 23 24 25 26
 */

#include "drxk.h"
#include "mt2063.h"
#include "dvb_ca_en50221.h"
27 28
#include "dvb_usb.h"
#include "cypress_firmware.h"
29

30
#define AZ6007_FIRMWARE "dvb-usb-terratec-h7-az6007.fw"
31

32 33 34
static int az6007_xfer_debug;
module_param_named(xfer_debug, az6007_xfer_debug, int, 0644);
MODULE_PARM_DESC(xfer_debug, "Enable xfer debug");
35

36 37
DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr);

38 39 40 41 42 43 44 45 46
/* Known requests (Cypress FX2 firmware + az6007 "private" ones*/

#define FX2_OED			0xb5
#define AZ6007_READ_DATA	0xb7
#define AZ6007_I2C_RD		0xb9
#define AZ6007_POWER		0xbc
#define AZ6007_I2C_WR		0xbd
#define FX2_SCON1		0xc0
#define AZ6007_TS_THROUGH	0xc7
47
#define AZ6007_READ_IR		0xb4
48

49
struct az6007_device_state {
50
	struct mutex		mutex;
51
	struct mutex		ca_mutex;
52 53
	struct dvb_ca_en50221	ca;
	unsigned		warm:1;
54
	int			(*gate_ctrl) (struct dvb_frontend *, int);
55
	unsigned char		data[4096];
56 57
};

58
static struct drxk_config terratec_h7_drxk = {
59
	.adr = 0x29,
60 61 62
	.parallel_ts = true,
	.dynamic_clk = true,
	.single_master = true,
63
	.enable_merr_cfg = true,
64
	.no_i2c_bridge = false,
65
	.chunk_size = 64,
66
	.mpeg_out_clk_strength = 0x02,
67
	.microcode_name = "dvb-usb-terratec-h7-drxk.fw",
68 69
};

70 71
static int drxk_gate_ctrl(struct dvb_frontend *fe, int enable)
{
72
	struct az6007_device_state *st = fe_to_priv(fe);
73
	struct dvb_usb_adapter *adap = fe->sec_priv;
74
	int status = 0;
75

76
	pr_debug("%s: %s\n", __func__, enable ? "enable" : "disable");
77

78
	if (!adap || !st)
79 80
		return -EINVAL;

81
	if (enable)
82
		status = st->gate_ctrl(fe, 1);
83
	else
84
		status = st->gate_ctrl(fe, 0);
85

86 87 88
	return status;
}

89
static struct mt2063_config az6007_mt2063_config = {
90
	.tuner_address = 0x60,
91 92 93
	.refclock = 36125000,
};

94
static int __az6007_read(struct usb_device *udev, u8 req, u16 value,
95
			    u16 index, u8 *b, int blen)
96
{
97
	int ret;
98

99 100
	ret = usb_control_msg(udev,
			      usb_rcvctrlpipe(udev, 0),
101 102 103
			      req,
			      USB_TYPE_VENDOR | USB_DIR_IN,
			      value, index, b, blen, 5000);
104
	if (ret < 0) {
105
		pr_warn("usb read operation failed. (%d)\n", ret);
106 107
		return -EIO;
	}
108

109 110 111 112 113 114
	if (az6007_xfer_debug) {
		printk(KERN_DEBUG "az6007: IN  req: %02x, value: %04x, index: %04x\n",
		       req, value, index);
		print_hex_dump_bytes("az6007: payload: ",
				     DUMP_PREFIX_NONE, b, blen);
	}
115 116 117 118

	return ret;
}

119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135
static int az6007_read(struct dvb_usb_device *d, u8 req, u16 value,
			    u16 index, u8 *b, int blen)
{
	struct az6007_device_state *st = d->priv;
	int ret;

	if (mutex_lock_interruptible(&st->mutex) < 0)
		return -EAGAIN;

	ret = __az6007_read(d->udev, req, value, index, b, blen);

	mutex_unlock(&st->mutex);

	return ret;
}

static int __az6007_write(struct usb_device *udev, u8 req, u16 value,
136 137 138 139
			     u16 index, u8 *b, int blen)
{
	int ret;

140 141 142 143 144 145
	if (az6007_xfer_debug) {
		printk(KERN_DEBUG "az6007: OUT req: %02x, value: %04x, index: %04x\n",
		       req, value, index);
		print_hex_dump_bytes("az6007: payload: ",
				     DUMP_PREFIX_NONE, b, blen);
	}
146

147
	if (blen > 64) {
148 149
		pr_err("az6007: tried to write %d bytes, but I2C max size is 64 bytes\n",
		       blen);
150
		return -EOPNOTSUPP;
151
	}
152

153 154
	ret = usb_control_msg(udev,
			      usb_sndctrlpipe(udev, 0),
155 156 157 158
			      req,
			      USB_TYPE_VENDOR | USB_DIR_OUT,
			      value, index, b, blen, 5000);
	if (ret != blen) {
159
		pr_err("usb write operation failed. (%d)\n", ret);
160
		return -EIO;
161
	}
162

163 164 165
	return 0;
}

166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181
static int az6007_write(struct dvb_usb_device *d, u8 req, u16 value,
			    u16 index, u8 *b, int blen)
{
	struct az6007_device_state *st = d->priv;
	int ret;

	if (mutex_lock_interruptible(&st->mutex) < 0)
		return -EAGAIN;

	ret = __az6007_write(d->udev, req, value, index, b, blen);

	mutex_unlock(&st->mutex);

	return ret;
}

182
static int az6007_streaming_ctrl(struct dvb_frontend *fe, int onoff)
183
{
184
	struct dvb_usb_device *d = fe_to_d(fe);
185

186
	pr_debug("%s: %s\n", __func__, onoff ? "enable" : "disable");
187

188
	return az6007_write(d, 0xbc, onoff, 0, NULL, 0);
189 190 191
}

/* remote control stuff (does not work with my box) */
192
static int az6007_rc_query(struct dvb_usb_device *d)
193
{
194
	struct az6007_device_state *st = d_to_priv(d);
195
	unsigned code = 0;
196

197
	az6007_read(d, AZ6007_READ_IR, 0, 0, st->data, 10);
198

199
	if (st->data[1] == 0x44)
200 201
		return 0;

202 203 204 205 206 207 208 209
	if ((st->data[1] ^ st->data[2]) == 0xff)
		code = st->data[1];
	else
		code = st->data[1] << 8 | st->data[2];

	if ((st->data[3] ^ st->data[4]) == 0xff)
		code = code << 8 | st->data[3];
	else
210
		code = code << 16 | st->data[3] << 8 | st->data[4];
211

212
	rc_keydown(d->rc_dev, code, st->data[5]);
213

214 215 216
	return 0;
}

217 218 219 220 221
static int az6007_ci_read_attribute_mem(struct dvb_ca_en50221 *ca,
					int slot,
					int address)
{
	struct dvb_usb_device *d = (struct dvb_usb_device *)ca->data;
222
	struct az6007_device_state *state = d_to_priv(d);
223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246

	int ret;
	u8 req;
	u16 value;
	u16 index;
	int blen;
	u8 *b;

	if (slot != 0)
		return -EINVAL;

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

	mutex_lock(&state->ca_mutex);

	req = 0xC1;
	value = address;
	index = 0;
	blen = 1;

	ret = az6007_read(d, req, value, index, b, blen);
	if (ret < 0) {
247
		pr_warn("usb in operation failed. (%d)\n", ret);
248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263
		ret = -EINVAL;
	} else {
		ret = b[0];
	}

	mutex_unlock(&state->ca_mutex);
	kfree(b);
	return ret;
}

static int az6007_ci_write_attribute_mem(struct dvb_ca_en50221 *ca,
					 int slot,
					 int address,
					 u8 value)
{
	struct dvb_usb_device *d = (struct dvb_usb_device *)ca->data;
264
	struct az6007_device_state *state = d_to_priv(d);
265 266 267 268 269 270 271

	int ret;
	u8 req;
	u16 value1;
	u16 index;
	int blen;

272
	pr_debug("%s(), slot %d\n", __func__, slot);
273 274 275 276 277 278 279 280 281 282 283
	if (slot != 0)
		return -EINVAL;

	mutex_lock(&state->ca_mutex);
	req = 0xC2;
	value1 = address;
	index = value;
	blen = 0;

	ret = az6007_write(d, req, value1, index, NULL, blen);
	if (ret != 0)
284
		pr_warn("usb out operation failed. (%d)\n", ret);
285 286 287 288 289 290 291 292 293 294

	mutex_unlock(&state->ca_mutex);
	return ret;
}

static int az6007_ci_read_cam_control(struct dvb_ca_en50221 *ca,
				      int slot,
				      u8 address)
{
	struct dvb_usb_device *d = (struct dvb_usb_device *)ca->data;
295
	struct az6007_device_state *state = d_to_priv(d);
296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319

	int ret;
	u8 req;
	u16 value;
	u16 index;
	int blen;
	u8 *b;

	if (slot != 0)
		return -EINVAL;

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

	mutex_lock(&state->ca_mutex);

	req = 0xC3;
	value = address;
	index = 0;
	blen = 2;

	ret = az6007_read(d, req, value, index, b, blen);
	if (ret < 0) {
320
		pr_warn("usb in operation failed. (%d)\n", ret);
321 322 323
		ret = -EINVAL;
	} else {
		if (b[0] == 0)
324
			pr_warn("Read CI IO error\n");
325 326

		ret = b[1];
327
		pr_debug("read cam data = %x from 0x%x\n", b[1], value);
328 329 330 331 332 333 334 335 336 337 338 339 340
	}

	mutex_unlock(&state->ca_mutex);
	kfree(b);
	return ret;
}

static int az6007_ci_write_cam_control(struct dvb_ca_en50221 *ca,
				       int slot,
				       u8 address,
				       u8 value)
{
	struct dvb_usb_device *d = (struct dvb_usb_device *)ca->data;
341
	struct az6007_device_state *state = d_to_priv(d);
342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359

	int ret;
	u8 req;
	u16 value1;
	u16 index;
	int blen;

	if (slot != 0)
		return -EINVAL;

	mutex_lock(&state->ca_mutex);
	req = 0xC4;
	value1 = address;
	index = value;
	blen = 0;

	ret = az6007_write(d, req, value1, index, NULL, blen);
	if (ret != 0) {
360
		pr_warn("usb out operation failed. (%d)\n", ret);
361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390
		goto failed;
	}

failed:
	mutex_unlock(&state->ca_mutex);
	return ret;
}

static int CI_CamReady(struct dvb_ca_en50221 *ca, int slot)
{
	struct dvb_usb_device *d = (struct dvb_usb_device *)ca->data;

	int ret;
	u8 req;
	u16 value;
	u16 index;
	int blen;
	u8 *b;

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

	req = 0xC8;
	value = 0;
	index = 0;
	blen = 1;

	ret = az6007_read(d, req, value, index, b, blen);
	if (ret < 0) {
391
		pr_warn("usb in operation failed. (%d)\n", ret);
392 393 394 395 396 397 398 399 400 401 402
		ret = -EIO;
	} else{
		ret = b[0];
	}
	kfree(b);
	return ret;
}

static int az6007_ci_slot_reset(struct dvb_ca_en50221 *ca, int slot)
{
	struct dvb_usb_device *d = (struct dvb_usb_device *)ca->data;
403
	struct az6007_device_state *state = d_to_priv(d);
404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419

	int ret, i;
	u8 req;
	u16 value;
	u16 index;
	int blen;

	mutex_lock(&state->ca_mutex);

	req = 0xC6;
	value = 1;
	index = 0;
	blen = 0;

	ret = az6007_write(d, req, value, index, NULL, blen);
	if (ret != 0) {
420
		pr_warn("usb out operation failed. (%d)\n", ret);
421 422 423 424 425 426 427 428 429 430 431
		goto failed;
	}

	msleep(500);
	req = 0xC6;
	value = 0;
	index = 0;
	blen = 0;

	ret = az6007_write(d, req, value, index, NULL, blen);
	if (ret != 0) {
432
		pr_warn("usb out operation failed. (%d)\n", ret);
433 434 435 436 437 438 439
		goto failed;
	}

	for (i = 0; i < 15; i++) {
		msleep(100);

		if (CI_CamReady(ca, slot)) {
440
			pr_debug("CAM Ready\n");
441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458
			break;
		}
	}
	msleep(5000);

failed:
	mutex_unlock(&state->ca_mutex);
	return ret;
}

static int az6007_ci_slot_shutdown(struct dvb_ca_en50221 *ca, int slot)
{
	return 0;
}

static int az6007_ci_slot_ts_enable(struct dvb_ca_en50221 *ca, int slot)
{
	struct dvb_usb_device *d = (struct dvb_usb_device *)ca->data;
459
	struct az6007_device_state *state = d_to_priv(d);
460 461 462 463 464 465 466

	int ret;
	u8 req;
	u16 value;
	u16 index;
	int blen;

467
	pr_debug("%s()\n", __func__);
468 469 470 471 472 473 474 475
	mutex_lock(&state->ca_mutex);
	req = 0xC7;
	value = 1;
	index = 0;
	blen = 0;

	ret = az6007_write(d, req, value, index, NULL, blen);
	if (ret != 0) {
476
		pr_warn("usb out operation failed. (%d)\n", ret);
477 478 479 480 481 482 483 484 485 486 487
		goto failed;
	}

failed:
	mutex_unlock(&state->ca_mutex);
	return ret;
}

static int az6007_ci_poll_slot_status(struct dvb_ca_en50221 *ca, int slot, int open)
{
	struct dvb_usb_device *d = (struct dvb_usb_device *)ca->data;
488
	struct az6007_device_state *state = d_to_priv(d);
489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507
	int ret;
	u8 req;
	u16 value;
	u16 index;
	int blen;
	u8 *b;

	b = kmalloc(12, GFP_KERNEL);
	if (!b)
		return -ENOMEM;
	mutex_lock(&state->ca_mutex);

	req = 0xC5;
	value = 0;
	index = 0;
	blen = 1;

	ret = az6007_read(d, req, value, index, b, blen);
	if (ret < 0) {
508
		pr_warn("usb in operation failed. (%d)\n", ret);
509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527
		ret = -EIO;
	} else
		ret = 0;

	if (!ret && b[0] == 1) {
		ret = DVB_CA_EN50221_POLL_CAM_PRESENT |
		      DVB_CA_EN50221_POLL_CAM_READY;
	}

	mutex_unlock(&state->ca_mutex);
	kfree(b);
	return ret;
}


static void az6007_ci_uninit(struct dvb_usb_device *d)
{
	struct az6007_device_state *state;

528
	pr_debug("%s()\n", __func__);
529 530 531 532

	if (NULL == d)
		return;

533
	state = d_to_priv(d);
534 535 536 537 538 539 540 541 542 543 544 545
	if (NULL == state)
		return;

	if (NULL == state->ca.data)
		return;

	dvb_ca_en50221_release(&state->ca);

	memset(&state->ca, 0, sizeof(state->ca));
}


546
static int az6007_ci_init(struct dvb_usb_adapter *adap)
547
{
548 549
	struct dvb_usb_device *d = adap_to_d(adap);
	struct az6007_device_state *state = adap_to_priv(adap);
550 551
	int ret;

552
	pr_debug("%s()\n", __func__);
553 554 555 556 557 558 559 560 561 562 563 564 565

	mutex_init(&state->ca_mutex);
	state->ca.owner			= THIS_MODULE;
	state->ca.read_attribute_mem	= az6007_ci_read_attribute_mem;
	state->ca.write_attribute_mem	= az6007_ci_write_attribute_mem;
	state->ca.read_cam_control	= az6007_ci_read_cam_control;
	state->ca.write_cam_control	= az6007_ci_write_cam_control;
	state->ca.slot_reset		= az6007_ci_slot_reset;
	state->ca.slot_shutdown		= az6007_ci_slot_shutdown;
	state->ca.slot_ts_enable	= az6007_ci_slot_ts_enable;
	state->ca.poll_slot_status	= az6007_ci_poll_slot_status;
	state->ca.data			= d;

566
	ret = dvb_ca_en50221_init(&adap->dvb_adap,
567 568 569 570
				  &state->ca,
				  0, /* flags */
				  1);/* n_slots */
	if (ret != 0) {
571
		pr_err("Cannot initialize CI: Error %d.\n", ret);
572 573 574 575
		memset(&state->ca, 0, sizeof(state->ca));
		return ret;
	}

576
	pr_debug("CI initialized.\n");
577 578 579 580

	return 0;
}

581
static int az6007_read_mac_addr(struct dvb_usb_adapter *adap, u8 mac[6])
582
{
583 584
	struct dvb_usb_device *d = adap_to_d(adap);
	struct az6007_device_state *st = adap_to_priv(adap);
585
	int ret;
586 587

	ret = az6007_read(d, AZ6007_READ_DATA, 6, 0, st->data, 6);
588
	memcpy(mac, st->data, 6);
589

590
	if (ret > 0)
591
		pr_debug("%s: mac is %pM\n", __func__, mac);
592 593 594

	return ret;
}
595

596 597
static int az6007_frontend_attach(struct dvb_usb_adapter *adap)
{
598 599
	struct az6007_device_state *st = adap_to_priv(adap);
	struct dvb_usb_device *d = adap_to_d(adap);
600

601
	pr_debug("attaching demod drxk\n");
602

603 604 605
	adap->fe[0] = dvb_attach(drxk_attach, &terratec_h7_drxk,
				 &d->i2c_adap);
	if (!adap->fe[0])
606
		return -EINVAL;
607

608 609 610
	adap->fe[0]->sec_priv = adap;
	st->gate_ctrl = adap->fe[0]->ops.i2c_gate_ctrl;
	adap->fe[0]->ops.i2c_gate_ctrl = drxk_gate_ctrl;
611

612 613
	az6007_ci_init(adap);

614 615 616 617 618
	return 0;
}

static int az6007_tuner_attach(struct dvb_usb_adapter *adap)
{
619 620 621
	struct dvb_usb_device *d = adap_to_d(adap);

	pr_debug("attaching tuner mt2063\n");
622

623
	/* Attach mt2063 to DVB-C frontend */
624 625 626
	if (adap->fe[0]->ops.i2c_gate_ctrl)
		adap->fe[0]->ops.i2c_gate_ctrl(adap->fe[0], 1);
	if (!dvb_attach(mt2063_attach, adap->fe[0],
627
			&az6007_mt2063_config,
628
			&d->i2c_adap))
629
		return -EINVAL;
630

631 632
	if (adap->fe[0]->ops.i2c_gate_ctrl)
		adap->fe[0]->ops.i2c_gate_ctrl(adap->fe[0], 0);
633

634 635 636
	return 0;
}

637 638
int az6007_power_ctrl(struct dvb_usb_device *d, int onoff)
{
639
	struct az6007_device_state *st = d_to_priv(d);
640 641
	int ret;

642
	pr_debug("%s()\n", __func__);
643 644

	if (!st->warm) {
645
		mutex_init(&st->mutex);
646

647
		ret = az6007_write(d, AZ6007_POWER, 0, 2, NULL, 0);
648 649 650
		if (ret < 0)
			return ret;
		msleep(60);
651
		ret = az6007_write(d, AZ6007_POWER, 1, 4, NULL, 0);
652 653 654
		if (ret < 0)
			return ret;
		msleep(100);
655
		ret = az6007_write(d, AZ6007_POWER, 1, 3, NULL, 0);
656 657 658
		if (ret < 0)
			return ret;
		msleep(20);
659
		ret = az6007_write(d, AZ6007_POWER, 1, 4, NULL, 0);
660 661 662 663
		if (ret < 0)
			return ret;

		msleep(400);
664
		ret = az6007_write(d, FX2_SCON1, 0, 3, NULL, 0);
665 666
		if (ret < 0)
			return ret;
667
		msleep(150);
668
		ret = az6007_write(d, FX2_SCON1, 1, 3, NULL, 0);
669 670
		if (ret < 0)
			return ret;
671
		msleep(430);
672
		ret = az6007_write(d, AZ6007_POWER, 0, 0, NULL, 0);
673 674
		if (ret < 0)
			return ret;
675

676
		st->warm = true;
677

678 679
		return 0;
	}
680

681 682 683
	if (!onoff)
		return 0;

684 685
	az6007_write(d, AZ6007_POWER, 0, 0, NULL, 0);
	az6007_write(d, AZ6007_TS_THROUGH, 0, 0, NULL, 0);
686 687 688 689

	return 0;
}

690
/* I2C */
691 692
static int az6007_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[],
			   int num)
693 694
{
	struct dvb_usb_device *d = i2c_get_adapdata(adap);
695
	struct az6007_device_state *st = d_to_priv(d);
696 697
	int i, j, len;
	int ret = 0;
698 699 700
	u16 index;
	u16 value;
	int length;
701
	u8 req, addr;
702

703
	if (mutex_lock_interruptible(&st->mutex) < 0)
704 705
		return -EAGAIN;

706 707 708 709 710 711 712 713 714 715 716 717
	for (i = 0; i < num; i++) {
		addr = msgs[i].addr << 1;
		if (((i + 1) < num)
		    && (msgs[i].len == 1)
		    && (!msgs[i].flags & I2C_M_RD)
		    && (msgs[i + 1].flags & I2C_M_RD)
		    && (msgs[i].addr == msgs[i + 1].addr)) {
			/*
			 * A write + read xfer for the same address, where
			 * the first xfer has just 1 byte length.
			 * Need to join both into one operation
			 */
718 719
			if (az6007_xfer_debug)
				printk(KERN_DEBUG "az6007: I2C W/R addr=0x%x len=%d/%d\n",
720
				       addr, msgs[i].len, msgs[i + 1].len);
721
			req = AZ6007_I2C_RD;
722 723
			index = msgs[i].buf[0];
			value = addr | (1 << 8);
724 725
			length = 6 + msgs[i + 1].len;
			len = msgs[i + 1].len;
726 727
			ret = __az6007_read(d->udev, req, value, index,
					    st->data, length);
728
			if (ret >= len) {
729
				for (j = 0; j < len; j++)
730
					msgs[i + 1].buf[j] = st->data[j + 5];
731 732 733 734 735
			} else
				ret = -EIO;
			i++;
		} else if (!(msgs[i].flags & I2C_M_RD)) {
			/* write bytes */
736 737
			if (az6007_xfer_debug)
				printk(KERN_DEBUG "az6007: I2C W addr=0x%x len=%d\n",
738
				       addr, msgs[i].len);
739
			req = AZ6007_I2C_WR;
740 741 742 743
			index = msgs[i].buf[0];
			value = addr | (1 << 8);
			length = msgs[i].len - 1;
			len = msgs[i].len - 1;
744
			for (j = 0; j < len; j++)
745
				st->data[j] = msgs[i].buf[j + 1];
746 747
			ret =  __az6007_write(d->udev, req, value, index,
					      st->data, length);
748 749
		} else {
			/* read bytes */
750 751
			if (az6007_xfer_debug)
				printk(KERN_DEBUG "az6007: I2C R addr=0x%x len=%d\n",
752
				       addr, msgs[i].len);
753
			req = AZ6007_I2C_RD;
754 755 756 757
			index = msgs[i].buf[0];
			value = addr;
			length = msgs[i].len + 6;
			len = msgs[i].len;
758 759
			ret = __az6007_read(d->udev, req, value, index,
					    st->data, length);
760
			for (j = 0; j < len; j++)
761
				msgs[i].buf[j] = st->data[j + 5];
762
		}
763 764
		if (ret < 0)
			goto err;
765
	}
766
err:
767
	mutex_unlock(&st->mutex);
768 769

	if (ret < 0) {
770
		pr_info("%s ERROR: %i\n", __func__, ret);
771 772 773
		return ret;
	}
	return num;
774 775 776 777 778 779 780 781
}

static u32 az6007_i2c_func(struct i2c_adapter *adapter)
{
	return I2C_FUNC_I2C;
}

static struct i2c_algorithm az6007_i2c_algo = {
782
	.master_xfer = az6007_i2c_xfer,
783 784 785
	.functionality = az6007_i2c_func,
};

786
int az6007_identify_state(struct dvb_usb_device *d, const char **name)
787
{
788
	int ret;
789 790
	u8 *mac;

791 792
	pr_debug("Identifying az6007 state\n");

793 794 795
	mac = kmalloc(6, GFP_ATOMIC);
	if (!mac)
		return -ENOMEM;
796

797
	/* Try to read the mac address */
798
	ret = __az6007_read(d->udev, AZ6007_READ_DATA, 6, 0, mac, 6);
799
	if (ret == 6)
800
		ret = WARM;
801
	else
802
		ret = COLD;
803

804 805
	kfree(mac);

806 807 808 809
	if (ret == COLD) {
		__az6007_write(d->udev, 0x09, 1, 0, NULL, 0);
		__az6007_write(d->udev, 0x00, 0, 0, NULL, 0);
		__az6007_write(d->udev, 0x00, 0, 0, NULL, 0);
810 811
	}

812 813 814
	pr_debug("Device is on %s state\n",
		 ret == WARM ? "warm" : "cold");
	return ret;
815 816
}

817 818 819 820
static void az6007_usb_disconnect(struct usb_interface *intf)
{
	struct dvb_usb_device *d = usb_get_intfdata(intf);
	az6007_ci_uninit(d);
821
	dvb_usbv2_disconnect(intf);
822 823
}

824
static int az6007_get_rc_config(struct dvb_usb_device *d, struct dvb_usb_rc *rc)
825
{
826 827 828 829 830 831 832
	pr_debug("Getting az6007 Remote Control properties\n");

	rc->allowed_protos = RC_TYPE_NEC;
	rc->query          = az6007_rc_query;
	rc->interval       = 400;

	return 0;
833 834
}

835 836 837 838
static int az6007_download_firmware(struct dvb_usb_device *d,
	const struct firmware *fw)
{
	pr_debug("Loading az6007 firmware\n");
839

840 841
	return usbv2_cypress_load_firmware(d->udev, fw, CYPRESS_FX2);
}
842

843 844 845 846 847 848 849
/* DVB USB Driver stuff */
static struct dvb_usb_device_properties az6007_props = {
	.driver_name         = KBUILD_MODNAME,
	.owner               = THIS_MODULE,
	.firmware            = AZ6007_FIRMWARE,

	.adapter_nr          = adapter_nr,
850
	.size_of_priv        = sizeof(struct az6007_device_state),
851 852 853 854 855 856 857
	.i2c_algo            = &az6007_i2c_algo,
	.tuner_attach        = az6007_tuner_attach,
	.frontend_attach     = az6007_frontend_attach,
	.streaming_ctrl      = az6007_streaming_ctrl,
	.get_rc_config       = az6007_get_rc_config,
	.read_mac_address    = az6007_read_mac_addr,
	.download_firmware   = az6007_download_firmware,
858
	.identify_state	     = az6007_identify_state,
859 860 861 862
	.power_ctrl          = az6007_power_ctrl,
	.num_adapters        = 1,
	.adapter             = {
		{ .stream = DVB_USB_STREAM_BULK(0x02, 10, 4096), }
863 864
	}
};
865

866 867 868 869 870 871 872 873 874 875 876 877
static struct usb_device_id az6007_usb_table[] = {
	{DVB_USB_DEVICE(USB_VID_AZUREWAVE, USB_PID_AZUREWAVE_6007,
		&az6007_props, "Azurewave 6007", RC_MAP_EMPTY)},
	{DVB_USB_DEVICE(USB_VID_TERRATEC, USB_PID_TERRATEC_H7,
		&az6007_props, "Terratec H7", RC_MAP_NEC_TERRATEC_CINERGY_XS)},
	{DVB_USB_DEVICE(USB_VID_TERRATEC, USB_PID_TERRATEC_H7_2,
		&az6007_props, "Terratec H7", RC_MAP_NEC_TERRATEC_CINERGY_XS)},
	{0},
};

MODULE_DEVICE_TABLE(usb, az6007_usb_table);

878 879
/* usb specific object needed to register this driver with the usb subsystem */
static struct usb_driver az6007_usb_driver = {
880
	.name		= KBUILD_MODNAME,
881
	.id_table	= az6007_usb_table,
882 883 884 885 886 887
	.probe		= dvb_usbv2_probe,
	.disconnect	= az6007_usb_disconnect,
	.suspend	= dvb_usbv2_suspend,
	.resume		= dvb_usbv2_resume,
	.no_dynamic_id	= 1,
	.soft_unbind	= 1,
888 889
};

890
module_usb_driver(az6007_usb_driver);
891 892

MODULE_AUTHOR("Henry Wang <Henry.wang@AzureWave.com>");
893
MODULE_AUTHOR("Mauro Carvalho Chehab <mchehab@redhat.com>");
894
MODULE_DESCRIPTION("Driver for AzureWave 6007 DVB-C/T USB2.0 and clones");
895
MODULE_VERSION("2.0");
896
MODULE_LICENSE("GPL");
897
MODULE_FIRMWARE(AZ6007_FIRMWARE);