aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/dvb
diff options
context:
space:
mode:
authorMalcolm Priestley <tvboxspy@gmail.com>2011-11-28 16:04:21 -0500
committerMauro Carvalho Chehab <mchehab@redhat.com>2011-12-11 05:13:27 -0500
commit990f49af3f564b9a0f572e06f22e2ae34c79c37d (patch)
tree87858d195c1cb942dd2269f0cc46d79fe6f3b205 /drivers/media/dvb
parent773ddbd228dc16a4829836e1dc16383e44c8575e (diff)
[media] it913x: support for different tuner regs
There appears to be differences in the tuner registers on earlier IT9135 devices. Using the current IT9137 settings cause corruptions on some channels This patch is in preparation for multi firmware loading and current unsupported types. Signed-off-by: Malcolm Priestley <tvboxspy@gmail.com> Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Diffstat (limited to 'drivers/media/dvb')
-rw-r--r--drivers/media/dvb/dvb-usb/it913x.c37
-rw-r--r--drivers/media/dvb/frontends/it913x-fe-priv.h20
-rw-r--r--drivers/media/dvb/frontends/it913x-fe.c23
-rw-r--r--drivers/media/dvb/frontends/it913x-fe.h9
4 files changed, 82 insertions, 7 deletions
diff --git a/drivers/media/dvb/dvb-usb/it913x.c b/drivers/media/dvb/dvb-usb/it913x.c
index 24f04b4ac87..d57e0626369 100644
--- a/drivers/media/dvb/dvb-usb/it913x.c
+++ b/drivers/media/dvb/dvb-usb/it913x.c
@@ -338,6 +338,31 @@ static int it913x_rc_query(struct dvb_usb_device *d)
338 return ret; 338 return ret;
339} 339}
340 340
341static int ite_firmware_select(struct usb_device *udev,
342 struct dvb_usb_device_properties *props)
343{
344 int sw;
345 /* auto switch */
346 if (le16_to_cpu(udev->descriptor.idProduct) ==
347 USB_PID_ITETECH_IT9135)
348 sw = IT9135_V1_FW;
349 else
350 sw = IT9137_FW;
351
352 switch (sw) {
353 case IT9135_V1_FW:
354 it913x_config.firmware_ver = 0;
355 it913x_config.adc_x2 = 1;
356 break;
357 case IT9137_FW:
358 default:
359 it913x_config.firmware_ver = 0;
360 it913x_config.adc_x2 = 0;
361 }
362
363 return 0;
364}
365
341#define TS_MPEG_PKT_SIZE 188 366#define TS_MPEG_PKT_SIZE 188
342#define EP_LOW 21 367#define EP_LOW 21
343#define TS_BUFFER_SIZE_PID (EP_LOW*TS_MPEG_PKT_SIZE) 368#define TS_BUFFER_SIZE_PID (EP_LOW*TS_MPEG_PKT_SIZE)
@@ -392,6 +417,8 @@ static int it913x_identify_state(struct usb_device *udev,
392 props->adapter[1].fe[0].stream.u.bulk.buffersize = 417 props->adapter[1].fe[0].stream.u.bulk.buffersize =
393 props->adapter[0].fe[0].stream.u.bulk.buffersize; 418 props->adapter[0].fe[0].stream.u.bulk.buffersize;
394 419
420 ret = ite_firmware_select(udev, props);
421
395 if (firm_no > 0) { 422 if (firm_no > 0) {
396 *cold = 0; 423 *cold = 0;
397 return 0; 424 return 0;
@@ -421,10 +448,16 @@ static int it913x_identify_state(struct usb_device *udev,
421 448
422 if (it913x_config.dual_mode) { 449 if (it913x_config.dual_mode) {
423 ret |= it913x_wr_reg(udev, DEV_0, 0x4bfb, CHIP2_I2C_ADDR); 450 ret |= it913x_wr_reg(udev, DEV_0, 0x4bfb, CHIP2_I2C_ADDR);
424 ret |= it913x_wr_reg(udev, DEV_0, CLK_O_EN, 0x1); 451 if (it913x_config.firmware_ver == 1)
452 ret |= it913x_wr_reg(udev, DEV_0, 0xcfff, 0x1);
453 else
454 ret |= it913x_wr_reg(udev, DEV_0, CLK_O_EN, 0x1);
425 } else { 455 } else {
426 ret |= it913x_wr_reg(udev, DEV_0, 0x4bfb, 0x0); 456 ret |= it913x_wr_reg(udev, DEV_0, 0x4bfb, 0x0);
427 ret |= it913x_wr_reg(udev, DEV_0, CLK_O_EN, 0x0); 457 if (it913x_config.firmware_ver == 1)
458 ret |= it913x_wr_reg(udev, DEV_0, 0xcfff, 0x0);
459 else
460 ret |= it913x_wr_reg(udev, DEV_0, CLK_O_EN, 0x0);
428 } 461 }
429 462
430 *cold = 1; 463 *cold = 1;
diff --git a/drivers/media/dvb/frontends/it913x-fe-priv.h b/drivers/media/dvb/frontends/it913x-fe-priv.h
index 836a5b81821..ad2b644db1d 100644
--- a/drivers/media/dvb/frontends/it913x-fe-priv.h
+++ b/drivers/media/dvb/frontends/it913x-fe-priv.h
@@ -230,6 +230,7 @@ static struct it913xset init_1[] = {
230 {PRO_LINK, LOCK3_OUT, {0x01}, 0x01}, 230 {PRO_LINK, LOCK3_OUT, {0x01}, 0x01},
231 {PRO_LINK, PADMISCDRSR, {0x01}, 0x01}, 231 {PRO_LINK, PADMISCDRSR, {0x01}, 0x01},
232 {PRO_LINK, PADMISCDR2, {0x00}, 0x01}, 232 {PRO_LINK, PADMISCDR2, {0x00}, 0x01},
233 {PRO_DMOD, 0xec57, {0x00, 0x00}, 0x02},
233 {PRO_LINK, PADMISCDR4, {0x00}, 0x01}, /* Power up */ 234 {PRO_LINK, PADMISCDR4, {0x00}, 0x01}, /* Power up */
234 {PRO_LINK, PADMISCDR8, {0x00}, 0x01}, 235 {PRO_LINK, PADMISCDR8, {0x00}, 0x01},
235 {0xff, 0x0000, {0x00}, 0x00} /* Terminating Entry */ 236 {0xff, 0x0000, {0x00}, 0x00} /* Terminating Entry */
@@ -1010,10 +1011,29 @@ static struct it913xset it9137_tuner_off[] = {
1010 {PRO_DMOD, 0xfba8, {0x01}, 0x01}, /* Tuner Clock Off */ 1011 {PRO_DMOD, 0xfba8, {0x01}, 0x01}, /* Tuner Clock Off */
1011 {PRO_DMOD, 0xec40, {0x00}, 0x01}, /* Power Down Tuner */ 1012 {PRO_DMOD, 0xec40, {0x00}, 0x01}, /* Power Down Tuner */
1012 {PRO_DMOD, 0xec02, {0x3f, 0x1f, 0x3f, 0x3f}, 0x04}, 1013 {PRO_DMOD, 0xec02, {0x3f, 0x1f, 0x3f, 0x3f}, 0x04},
1014 {PRO_DMOD, 0xec06, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1015 0x00, 0x00, 0x00, 0x00}, 0x0c},
1016 {PRO_DMOD, 0xec12, {0x00, 0x00, 0x00, 0x00}, 0x04},
1017 {PRO_DMOD, 0xec17, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1018 0x00}, 0x09},
1019 {PRO_DMOD, 0xec22, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1020 0x00, 0x00}, 0x0a},
1021 {PRO_DMOD, 0xec20, {0x00}, 0x01},
1013 {PRO_DMOD, 0xec3f, {0x01}, 0x01}, 1022 {PRO_DMOD, 0xec3f, {0x01}, 0x01},
1014 {0xff, 0x0000, {0x00}, 0x00}, /* Terminating Entry */ 1023 {0xff, 0x0000, {0x00}, 0x00}, /* Terminating Entry */
1015}; 1024};
1016 1025
1026static struct it913xset set_it9135_template[] = {
1027 {PRO_DMOD, 0xee06, {0x00}, 0x01},
1028 {PRO_DMOD, 0xec56, {0x00}, 0x01},
1029 {PRO_DMOD, 0xec4c, {0x00}, 0x01},
1030 {PRO_DMOD, 0xec4d, {0x00}, 0x01},
1031 {PRO_DMOD, 0xec4e, {0x00}, 0x01},
1032 {PRO_DMOD, 0x011e, {0x00}, 0x01}, /* Older Devices */
1033 {PRO_DMOD, 0x011f, {0x00}, 0x01},
1034 {0xff, 0x0000, {0x00}, 0x00}, /* Terminating Entry */
1035};
1036
1017static struct it913xset set_it9137_template[] = { 1037static struct it913xset set_it9137_template[] = {
1018 {PRO_DMOD, 0xee06, {0x00}, 0x01}, 1038 {PRO_DMOD, 0xee06, {0x00}, 0x01},
1019 {PRO_DMOD, 0xec56, {0x00}, 0x01}, 1039 {PRO_DMOD, 0xec56, {0x00}, 0x01},
diff --git a/drivers/media/dvb/frontends/it913x-fe.c b/drivers/media/dvb/frontends/it913x-fe.c
index e0cf8818ae4..8088e62a202 100644
--- a/drivers/media/dvb/frontends/it913x-fe.c
+++ b/drivers/media/dvb/frontends/it913x-fe.c
@@ -245,6 +245,11 @@ static int it9137_set_tuner(struct it913x_fe_state *state,
245 u8 lna_band; 245 u8 lna_band;
246 u8 bw; 246 u8 bw;
247 247
248 if (state->config->firmware_ver == 1)
249 set_tuner = set_it9135_template;
250 else
251 set_tuner = set_it9137_template;
252
248 deb_info("Tuner Frequency %d Bandwidth %d", frequency, bandwidth); 253 deb_info("Tuner Frequency %d Bandwidth %d", frequency, bandwidth);
249 254
250 if (frequency >= 51000 && frequency <= 440000) { 255 if (frequency >= 51000 && frequency <= 440000) {
@@ -774,8 +779,16 @@ static int it913x_fe_start(struct it913x_fe_state *state)
774 b[2] = (adc >> 16) & 0xff; 779 b[2] = (adc >> 16) & 0xff;
775 ret |= it913x_write(state, PRO_DMOD, ADC_FREQ, b, 3); 780 ret |= it913x_write(state, PRO_DMOD, ADC_FREQ, b, 3);
776 781
777 info("Crystal Frequency :%d Adc Frequency :%d", 782 if (state->config->adc_x2)
778 state->crystalFrequency, state->adcFrequency); 783 ret |= it913x_write_reg(state, PRO_DMOD, ADC_X_2, 0x01);
784 b[0] = 0;
785 b[1] = 0;
786 b[2] = 0;
787 ret |= it913x_write(state, PRO_DMOD, 0x0029, b, 3);
788
789 info("Crystal Frequency :%d Adc Frequency :%d ADC X2: %02x",
790 state->crystalFrequency, state->adcFrequency,
791 state->config->adc_x2);
779 deb_info("Xtal value :%04x Adc value :%04x", xtal, adc); 792 deb_info("Xtal value :%04x Adc value :%04x", xtal, adc);
780 793
781 if (ret < 0) 794 if (ret < 0)
@@ -840,10 +853,10 @@ static int it913x_fe_init(struct dvb_frontend *fe)
840 /* Power Up Tuner - common all versions */ 853 /* Power Up Tuner - common all versions */
841 ret = it913x_write_reg(state, PRO_DMOD, 0xec40, 0x1); 854 ret = it913x_write_reg(state, PRO_DMOD, 0xec40, 0x1);
842 855
843 ret |= it913x_write_reg(state, PRO_DMOD, AFE_MEM0, 0x0);
844
845 ret |= it913x_fe_script_loader(state, init_1); 856 ret |= it913x_fe_script_loader(state, init_1);
846 857
858 ret |= it913x_write_reg(state, PRO_DMOD, AFE_MEM0, 0x0);
859
847 ret |= it913x_write_reg(state, PRO_DMOD, 0xfba8, 0x0); 860 ret |= it913x_write_reg(state, PRO_DMOD, 0xfba8, 0x0);
848 861
849 return (ret < 0) ? -ENODEV : 0; 862 return (ret < 0) ? -ENODEV : 0;
@@ -938,5 +951,5 @@ static struct dvb_frontend_ops it913x_fe_ofdm_ops = {
938 951
939MODULE_DESCRIPTION("it913x Frontend and it9137 tuner"); 952MODULE_DESCRIPTION("it913x Frontend and it9137 tuner");
940MODULE_AUTHOR("Malcolm Priestley tvboxspy@gmail.com"); 953MODULE_AUTHOR("Malcolm Priestley tvboxspy@gmail.com");
941MODULE_VERSION("1.10"); 954MODULE_VERSION("1.12");
942MODULE_LICENSE("GPL"); 955MODULE_LICENSE("GPL");
diff --git a/drivers/media/dvb/frontends/it913x-fe.h b/drivers/media/dvb/frontends/it913x-fe.h
index 43f879a053c..4143ef9c4fa 100644
--- a/drivers/media/dvb/frontends/it913x-fe.h
+++ b/drivers/media/dvb/frontends/it913x-fe.h
@@ -28,6 +28,8 @@ struct ite_config {
28 u8 chip_ver; 28 u8 chip_ver;
29 u16 chip_type; 29 u16 chip_type;
30 u32 firmware; 30 u32 firmware;
31 u8 firmware_ver;
32 u8 adc_x2;
31 u8 tuner_id_0; 33 u8 tuner_id_0;
32 u8 tuner_id_1; 34 u8 tuner_id_1;
33 u8 dual_mode; 35 u8 dual_mode;
@@ -211,4 +213,11 @@ enum {
211 WRITE_CMD, 213 WRITE_CMD,
212}; 214};
213 215
216enum {
217 IT9135_AUTO = 0,
218 IT9137_FW,
219 IT9135_V1_FW,
220 IT9135_V2_FW,
221};
222
214#endif /* IT913X_FE_H */ 223#endif /* IT913X_FE_H */