Пример #1
0
static int af9015_read_config(struct usb_device *udev)
{
	int ret;
	u8 val, i, offset = 0;
	struct req_t req = {READ_I2C, AF9015_I2C_EEPROM, 0, 0, 1, 1, &val};

	/* IR remote controller */
	req.addr = AF9015_EEPROM_IR_MODE;
	/* first message will timeout often due to possible hw bug */
	for (i = 0; i < 4; i++) {
		ret = af9015_rw_udev(udev, &req);
		if (!ret)
			break;
	}
	if (ret)
		goto error;

	ret = af9015_eeprom_hash(udev);
	if (ret)
		goto error;

	deb_info("%s: IR mode:%d\n", __func__, val);
	for (i = 0; i < af9015_properties_count; i++) {
		if (val == AF9015_IR_MODE_DISABLED)
			af9015_properties[i].rc.core.rc_codes = NULL;
		else
			af9015_set_remote_config(udev, &af9015_properties[i]);
	}

	/* TS mode - one or two receivers */
	req.addr = AF9015_EEPROM_TS_MODE;
	ret = af9015_rw_udev(udev, &req);
	if (ret)
		goto error;
	af9015_config.dual_mode = val;
	deb_info("%s: TS mode:%d\n", __func__, af9015_config.dual_mode);

	/* Set adapter0 buffer size according to USB port speed, adapter1 buffer
	   size can be static because it is enabled only USB2.0 */
	for (i = 0; i < af9015_properties_count; i++) {
		/* USB1.1 set smaller buffersize and disable 2nd adapter */
		if (udev->speed == USB_SPEED_FULL) {
			af9015_properties[i].adapter[0].stream.u.bulk.buffersize
				= TS_USB11_FRAME_SIZE;
			/* disable 2nd adapter because we don't have
			   PID-filters */
			af9015_config.dual_mode = 0;
		} else {
			af9015_properties[i].adapter[0].stream.u.bulk.buffersize
				= TS_USB20_FRAME_SIZE;
		}
	}

	if (af9015_config.dual_mode) {
		/* read 2nd demodulator I2C address */
		req.addr = AF9015_EEPROM_DEMOD2_I2C;
		ret = af9015_rw_udev(udev, &req);
		if (ret)
			goto error;
		af9015_af9013_config[1].demod_address = val;

		/* enable 2nd adapter */
		for (i = 0; i < af9015_properties_count; i++)
			af9015_properties[i].num_adapters = 2;

	} else {
		 /* disable 2nd adapter */
		for (i = 0; i < af9015_properties_count; i++)
			af9015_properties[i].num_adapters = 1;
	}

	for (i = 0; i < af9015_properties[0].num_adapters; i++) {
		if (i == 1)
			offset = AF9015_EEPROM_OFFSET;
		/* xtal */
		req.addr = AF9015_EEPROM_XTAL_TYPE1 + offset;
		ret = af9015_rw_udev(udev, &req);
		if (ret)
			goto error;
		switch (val) {
		case 0:
			af9015_af9013_config[i].adc_clock = 28800;
			break;
		case 1:
			af9015_af9013_config[i].adc_clock = 20480;
			break;
		case 2:
			af9015_af9013_config[i].adc_clock = 28000;
			break;
		case 3:
			af9015_af9013_config[i].adc_clock = 25000;
			break;
		};
		deb_info("%s: [%d] xtal:%d set adc_clock:%d\n", __func__, i,
			val, af9015_af9013_config[i].adc_clock);

		/* tuner IF */
		req.addr = AF9015_EEPROM_IF1H + offset;
		ret = af9015_rw_udev(udev, &req);
		if (ret)
			goto error;
		af9015_af9013_config[i].tuner_if = val << 8;
		req.addr = AF9015_EEPROM_IF1L + offset;
		ret = af9015_rw_udev(udev, &req);
		if (ret)
			goto error;
		af9015_af9013_config[i].tuner_if += val;
		deb_info("%s: [%d] IF1:%d\n", __func__, i,
			af9015_af9013_config[0].tuner_if);

		/* MT2060 IF1 */
		req.addr = AF9015_EEPROM_MT2060_IF1H  + offset;
		ret = af9015_rw_udev(udev, &req);
		if (ret)
			goto error;
		af9015_config.mt2060_if1[i] = val << 8;
		req.addr = AF9015_EEPROM_MT2060_IF1L + offset;
		ret = af9015_rw_udev(udev, &req);
		if (ret)
			goto error;
		af9015_config.mt2060_if1[i] += val;
		deb_info("%s: [%d] MT2060 IF1:%d\n", __func__, i,
			af9015_config.mt2060_if1[i]);

		/* tuner */
		req.addr =  AF9015_EEPROM_TUNER_ID1 + offset;
		ret = af9015_rw_udev(udev, &req);
		if (ret)
			goto error;
		switch (val) {
		case AF9013_TUNER_ENV77H11D5:
		case AF9013_TUNER_MT2060:
		case AF9013_TUNER_QT1010:
		case AF9013_TUNER_UNKNOWN:
		case AF9013_TUNER_MT2060_2:
		case AF9013_TUNER_TDA18271:
		case AF9013_TUNER_QT1010A:
		case AF9013_TUNER_TDA18218:
			af9015_af9013_config[i].rf_spec_inv = 1;
			break;
		case AF9013_TUNER_MXL5003D:
		case AF9013_TUNER_MXL5005D:
		case AF9013_TUNER_MXL5005R:
		case AF9013_TUNER_MXL5007T:
			af9015_af9013_config[i].rf_spec_inv = 0;
			break;
		case AF9013_TUNER_MC44S803:
			af9015_af9013_config[i].gpio[1] = AF9013_GPIO_LO;
			af9015_af9013_config[i].rf_spec_inv = 1;
			break;
		default:
			warn("tuner id:%d not supported, please report!", val);
			return -ENODEV;
		};

		af9015_af9013_config[i].tuner = val;
		deb_info("%s: [%d] tuner id:%d\n", __func__, i, val);
	}

error:
	if (ret)
		err("eeprom read failed:%d", ret);

	/* AverMedia AVerTV Volar Black HD (A850) device have bad EEPROM
	   content :-( Override some wrong values here. Ditto for the
	   AVerTV Red HD+ (A850T) device. */
	if (le16_to_cpu(udev->descriptor.idVendor) == USB_VID_AVERMEDIA &&
		((le16_to_cpu(udev->descriptor.idProduct) ==
			USB_PID_AVERMEDIA_A850) ||
		(le16_to_cpu(udev->descriptor.idProduct) ==
			USB_PID_AVERMEDIA_A850T))) {
		deb_info("%s: AverMedia A850: overriding config\n", __func__);
		/* disable dual mode */
		af9015_config.dual_mode = 0;
		 /* disable 2nd adapter */
		for (i = 0; i < af9015_properties_count; i++)
			af9015_properties[i].num_adapters = 1;

		/* set correct IF */
		af9015_af9013_config[0].tuner_if = 4570;
	}

	return ret;
}
Пример #2
0
static int af9015_read_config(struct dvb_usb_device *d)
{
    struct af9015_state *state = d_to_priv(d);
    int ret;
    u8 val, i, offset = 0;
    struct req_t req = {READ_I2C, AF9015_I2C_EEPROM, 0, 0, 1, 1, &val};

    dev_dbg(&d->udev->dev, "%s:\n", __func__);

    /* IR remote controller */
    req.addr = AF9015_EEPROM_IR_MODE;
    /* first message will timeout often due to possible hw bug */
    for (i = 0; i < 4; i++) {
        ret = af9015_ctrl_msg(d, &req);
        if (!ret)
            break;
    }
    if (ret)
        goto error;

    ret = af9015_eeprom_hash(d);
    if (ret)
        goto error;

    state->ir_mode = val;
    dev_dbg(&d->udev->dev, "%s: IR mode=%d\n", __func__, val);

    /* TS mode - one or two receivers */
    req.addr = AF9015_EEPROM_TS_MODE;
    ret = af9015_ctrl_msg(d, &req);
    if (ret)
        goto error;

    state->dual_mode = val;
    dev_dbg(&d->udev->dev, "%s: TS mode=%d\n", __func__, state->dual_mode);

    /* disable 2nd adapter because we don't have PID-filters */
    if (d->udev->speed == USB_SPEED_FULL)
        state->dual_mode = 0;

    if (state->dual_mode) {
        /* read 2nd demodulator I2C address */
        req.addr = AF9015_EEPROM_DEMOD2_I2C;
        ret = af9015_ctrl_msg(d, &req);
        if (ret)
            goto error;

        state->af9013_config[1].i2c_addr = val;
    }

    for (i = 0; i < state->dual_mode + 1; i++) {
        if (i == 1)
            offset = AF9015_EEPROM_OFFSET;
        /* xtal */
        req.addr = AF9015_EEPROM_XTAL_TYPE1 + offset;
        ret = af9015_ctrl_msg(d, &req);
        if (ret)
            goto error;
        switch (val) {
        case 0:
            state->af9013_config[i].clock = 28800000;
            break;
        case 1:
            state->af9013_config[i].clock = 20480000;
            break;
        case 2:
            state->af9013_config[i].clock = 28000000;
            break;
        case 3:
            state->af9013_config[i].clock = 25000000;
            break;
        }
        dev_dbg(&d->udev->dev, "%s: [%d] xtal=%d set clock=%d\n",
                __func__, i, val,
                state->af9013_config[i].clock);

        /* IF frequency */
        req.addr = AF9015_EEPROM_IF1H + offset;
        ret = af9015_ctrl_msg(d, &req);
        if (ret)
            goto error;

        state->af9013_config[i].if_frequency = val << 8;

        req.addr = AF9015_EEPROM_IF1L + offset;
        ret = af9015_ctrl_msg(d, &req);
        if (ret)
            goto error;

        state->af9013_config[i].if_frequency += val;
        state->af9013_config[i].if_frequency *= 1000;
        dev_dbg(&d->udev->dev, "%s: [%d] IF frequency=%d\n", __func__,
                i, state->af9013_config[i].if_frequency);

        /* MT2060 IF1 */
        req.addr = AF9015_EEPROM_MT2060_IF1H  + offset;
        ret = af9015_ctrl_msg(d, &req);
        if (ret)
            goto error;
        state->mt2060_if1[i] = val << 8;
        req.addr = AF9015_EEPROM_MT2060_IF1L + offset;
        ret = af9015_ctrl_msg(d, &req);
        if (ret)
            goto error;
        state->mt2060_if1[i] += val;
        dev_dbg(&d->udev->dev, "%s: [%d] MT2060 IF1=%d\n", __func__, i,
                state->mt2060_if1[i]);

        /* tuner */
        req.addr =  AF9015_EEPROM_TUNER_ID1 + offset;
        ret = af9015_ctrl_msg(d, &req);
        if (ret)
            goto error;
        switch (val) {
        case AF9013_TUNER_ENV77H11D5:
        case AF9013_TUNER_MT2060:
        case AF9013_TUNER_QT1010:
        case AF9013_TUNER_UNKNOWN:
        case AF9013_TUNER_MT2060_2:
        case AF9013_TUNER_TDA18271:
        case AF9013_TUNER_QT1010A:
        case AF9013_TUNER_TDA18218:
            state->af9013_config[i].spec_inv = 1;
            break;
        case AF9013_TUNER_MXL5003D:
        case AF9013_TUNER_MXL5005D:
        case AF9013_TUNER_MXL5005R:
        case AF9013_TUNER_MXL5007T:
            state->af9013_config[i].spec_inv = 0;
            break;
        case AF9013_TUNER_MC44S803:
            state->af9013_config[i].gpio[1] = AF9013_GPIO_LO;
            state->af9013_config[i].spec_inv = 1;
            break;
        default:
            dev_err(&d->udev->dev, "%s: tuner id=%d not " \
                    "supported, please report!\n",
                    KBUILD_MODNAME, val);
            return -ENODEV;
        }

        state->af9013_config[i].tuner = val;
        dev_dbg(&d->udev->dev, "%s: [%d] tuner id=%d\n",
                __func__, i, val);
    }

error:
    if (ret)
        dev_err(&d->udev->dev, "%s: eeprom read failed=%d\n",
                KBUILD_MODNAME, ret);

    /* AverMedia AVerTV Volar Black HD (A850) device have bad EEPROM
       content :-( Override some wrong values here. Ditto for the
       AVerTV Red HD+ (A850T) device. */
    if (le16_to_cpu(d->udev->descriptor.idVendor) == USB_VID_AVERMEDIA &&
            ((le16_to_cpu(d->udev->descriptor.idProduct) ==
              USB_PID_AVERMEDIA_A850) ||
             (le16_to_cpu(d->udev->descriptor.idProduct) ==
              USB_PID_AVERMEDIA_A850T))) {
        dev_dbg(&d->udev->dev,
                "%s: AverMedia A850: overriding config\n",
                __func__);
        /* disable dual mode */
        state->dual_mode = 0;

        /* set correct IF */
        state->af9013_config[0].if_frequency = 4570000;
    }

    return ret;
}