return ret;
 }
 
+static int ite_firmware_select(struct usb_device *udev,
+       struct dvb_usb_device_properties *props)
+{
+       int sw;
+       /* auto switch */
+       if (le16_to_cpu(udev->descriptor.idProduct) ==
+                       USB_PID_ITETECH_IT9135)
+               sw = IT9135_V1_FW;
+       else
+               sw = IT9137_FW;
+
+       switch (sw) {
+       case IT9135_V1_FW:
+               it913x_config.firmware_ver = 0;
+               it913x_config.adc_x2 = 1;
+               break;
+       case IT9137_FW:
+       default:
+               it913x_config.firmware_ver = 0;
+               it913x_config.adc_x2 = 0;
+       }
+
+       return 0;
+}
+
 #define TS_MPEG_PKT_SIZE       188
 #define EP_LOW                 21
 #define TS_BUFFER_SIZE_PID     (EP_LOW*TS_MPEG_PKT_SIZE)
                props->adapter[1].fe[0].stream.u.bulk.buffersize =
                        props->adapter[0].fe[0].stream.u.bulk.buffersize;
 
+       ret = ite_firmware_select(udev, props);
+
        if (firm_no > 0) {
                *cold = 0;
                return 0;
 
        if (it913x_config.dual_mode) {
                ret |= it913x_wr_reg(udev, DEV_0, 0x4bfb, CHIP2_I2C_ADDR);
-               ret |= it913x_wr_reg(udev, DEV_0,  CLK_O_EN, 0x1);
+               if (it913x_config.firmware_ver == 1)
+                       ret |= it913x_wr_reg(udev, DEV_0,  0xcfff, 0x1);
+               else
+                       ret |= it913x_wr_reg(udev, DEV_0,  CLK_O_EN, 0x1);
        } else {
                ret |= it913x_wr_reg(udev, DEV_0, 0x4bfb, 0x0);
-               ret |= it913x_wr_reg(udev, DEV_0,  CLK_O_EN, 0x0);
+               if (it913x_config.firmware_ver == 1)
+                       ret |= it913x_wr_reg(udev, DEV_0,  0xcfff, 0x0);
+               else
+                       ret |= it913x_wr_reg(udev, DEV_0,  CLK_O_EN, 0x0);
        }
 
        *cold = 1;
 
        {PRO_LINK, LOCK3_OUT, {0x01}, 0x01},
        {PRO_LINK, PADMISCDRSR, {0x01}, 0x01},
        {PRO_LINK, PADMISCDR2, {0x00}, 0x01},
+       {PRO_DMOD, 0xec57, {0x00, 0x00}, 0x02},
        {PRO_LINK, PADMISCDR4, {0x00}, 0x01}, /* Power up */
        {PRO_LINK, PADMISCDR8, {0x00}, 0x01},
        {0xff, 0x0000, {0x00}, 0x00} /* Terminating Entry */
        {PRO_DMOD, 0xfba8, {0x01}, 0x01}, /* Tuner Clock Off  */
        {PRO_DMOD, 0xec40, {0x00}, 0x01}, /* Power Down Tuner */
        {PRO_DMOD, 0xec02, {0x3f, 0x1f, 0x3f, 0x3f}, 0x04},
+       {PRO_DMOD, 0xec06, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+                               0x00, 0x00, 0x00, 0x00}, 0x0c},
+       {PRO_DMOD, 0xec12, {0x00, 0x00, 0x00, 0x00}, 0x04},
+       {PRO_DMOD, 0xec17, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+                               0x00}, 0x09},
+       {PRO_DMOD, 0xec22, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+                               0x00, 0x00}, 0x0a},
+       {PRO_DMOD, 0xec20, {0x00}, 0x01},
        {PRO_DMOD, 0xec3f, {0x01}, 0x01},
        {0xff, 0x0000, {0x00}, 0x00}, /* Terminating Entry */
 };
 
+static struct it913xset set_it9135_template[] = {
+       {PRO_DMOD, 0xee06, {0x00}, 0x01},
+       {PRO_DMOD, 0xec56, {0x00}, 0x01},
+       {PRO_DMOD, 0xec4c, {0x00}, 0x01},
+       {PRO_DMOD, 0xec4d, {0x00}, 0x01},
+       {PRO_DMOD, 0xec4e, {0x00}, 0x01},
+       {PRO_DMOD, 0x011e, {0x00}, 0x01}, /* Older Devices */
+       {PRO_DMOD, 0x011f, {0x00}, 0x01},
+       {0xff, 0x0000, {0x00}, 0x00}, /* Terminating Entry */
+};
+
 static struct it913xset set_it9137_template[] = {
        {PRO_DMOD, 0xee06, {0x00}, 0x01},
        {PRO_DMOD, 0xec56, {0x00}, 0x01},
 
        u8 lna_band;
        u8 bw;
 
+       if (state->config->firmware_ver == 1)
+               set_tuner = set_it9135_template;
+       else
+               set_tuner = set_it9137_template;
+
        deb_info("Tuner Frequency %d Bandwidth %d", frequency, bandwidth);
 
        if (frequency >= 51000 && frequency <= 440000) {
        b[2] = (adc >> 16) & 0xff;
        ret |= it913x_write(state, PRO_DMOD, ADC_FREQ, b, 3);
 
-       info("Crystal Frequency :%d Adc Frequency :%d",
-               state->crystalFrequency, state->adcFrequency);
+       if (state->config->adc_x2)
+               ret |= it913x_write_reg(state, PRO_DMOD, ADC_X_2, 0x01);
+       b[0] = 0;
+       b[1] = 0;
+       b[2] = 0;
+       ret |= it913x_write(state, PRO_DMOD, 0x0029, b, 3);
+
+       info("Crystal Frequency :%d Adc Frequency :%d ADC X2: %02x",
+               state->crystalFrequency, state->adcFrequency,
+                       state->config->adc_x2);
        deb_info("Xtal value :%04x Adc value :%04x", xtal, adc);
 
        if (ret < 0)
        /* Power Up Tuner - common all versions */
        ret = it913x_write_reg(state, PRO_DMOD, 0xec40, 0x1);
 
-       ret |= it913x_write_reg(state, PRO_DMOD, AFE_MEM0, 0x0);
-
        ret |= it913x_fe_script_loader(state, init_1);
 
+       ret |= it913x_write_reg(state, PRO_DMOD, AFE_MEM0, 0x0);
+
        ret |= it913x_write_reg(state, PRO_DMOD, 0xfba8, 0x0);
 
        return (ret < 0) ? -ENODEV : 0;
 
 MODULE_DESCRIPTION("it913x Frontend and it9137 tuner");
 MODULE_AUTHOR("Malcolm Priestley tvboxspy@gmail.com");
-MODULE_VERSION("1.10");
+MODULE_VERSION("1.12");
 MODULE_LICENSE("GPL");