aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/media/dvb-frontends/af9033.c2
-rw-r--r--drivers/media/usb/dvb-usb-v2/af9035.c140
-rw-r--r--drivers/media/usb/dvb-usb-v2/af9035.h5
3 files changed, 99 insertions, 48 deletions
diff --git a/drivers/media/dvb-frontends/af9033.c b/drivers/media/dvb-frontends/af9033.c
index 745d2fa3fbdc..c9cad989b8b9 100644
--- a/drivers/media/dvb-frontends/af9033.c
+++ b/drivers/media/dvb-frontends/af9033.c
@@ -339,9 +339,11 @@ static int af9033_init(struct dvb_frontend *fe)
339 ret = af9033_wr_reg_mask(state, 0x00d91c, 0x01, 0x01); 339 ret = af9033_wr_reg_mask(state, 0x00d91c, 0x01, 0x01);
340 if (ret < 0) 340 if (ret < 0)
341 goto err; 341 goto err;
342
342 ret = af9033_wr_reg_mask(state, 0x00d917, 0x00, 0x01); 343 ret = af9033_wr_reg_mask(state, 0x00d917, 0x00, 0x01);
343 if (ret < 0) 344 if (ret < 0)
344 goto err; 345 goto err;
346
345 ret = af9033_wr_reg_mask(state, 0x00d916, 0x00, 0x01); 347 ret = af9033_wr_reg_mask(state, 0x00d916, 0x00, 0x01);
346 if (ret < 0) 348 if (ret < 0)
347 goto err; 349 goto err;
diff --git a/drivers/media/usb/dvb-usb-v2/af9035.c b/drivers/media/usb/dvb-usb-v2/af9035.c
index 15625eb28b56..d1beb7ffe72c 100644
--- a/drivers/media/usb/dvb-usb-v2/af9035.c
+++ b/drivers/media/usb/dvb-usb-v2/af9035.c
@@ -211,12 +211,13 @@ static int af9035_i2c_master_xfer(struct i2c_adapter *adap,
211 ret = -EOPNOTSUPP; 211 ret = -EOPNOTSUPP;
212 } else if ((msg[0].addr == state->af9033_config[0].i2c_addr) || 212 } else if ((msg[0].addr == state->af9033_config[0].i2c_addr) ||
213 (msg[0].addr == state->af9033_config[1].i2c_addr)) { 213 (msg[0].addr == state->af9033_config[1].i2c_addr)) {
214 /* integrated demod */ 214 /* demod access via firmware interface */
215 u32 reg = msg[0].buf[0] << 16 | msg[0].buf[1] << 8 | 215 u32 reg = msg[0].buf[0] << 16 | msg[0].buf[1] << 8 |
216 msg[0].buf[2]; 216 msg[0].buf[2];
217 if (state->af9033_config[1].i2c_addr && 217
218 (msg[0].addr == state->af9033_config[1].i2c_addr)) 218 if (msg[0].addr == state->af9033_config[1].i2c_addr)
219 reg |= 0x100000; 219 reg |= 0x100000;
220
220 ret = af9035_rd_regs(d, reg, &msg[1].buf[0], 221 ret = af9035_rd_regs(d, reg, &msg[1].buf[0],
221 msg[1].len); 222 msg[1].len);
222 } else { 223 } else {
@@ -226,7 +227,7 @@ static int af9035_i2c_master_xfer(struct i2c_adapter *adap,
226 buf, msg[1].len, msg[1].buf }; 227 buf, msg[1].len, msg[1].buf };
227 req.mbox |= ((msg[0].addr & 0x80) >> 3); 228 req.mbox |= ((msg[0].addr & 0x80) >> 3);
228 buf[0] = msg[1].len; 229 buf[0] = msg[1].len;
229 buf[1] = (u8)(msg[0].addr << 1); 230 buf[1] = msg[0].addr << 1;
230 buf[2] = 0x00; /* reg addr len */ 231 buf[2] = 0x00; /* reg addr len */
231 buf[3] = 0x00; /* reg addr MSB */ 232 buf[3] = 0x00; /* reg addr MSB */
232 buf[4] = 0x00; /* reg addr LSB */ 233 buf[4] = 0x00; /* reg addr LSB */
@@ -239,12 +240,13 @@ static int af9035_i2c_master_xfer(struct i2c_adapter *adap,
239 ret = -EOPNOTSUPP; 240 ret = -EOPNOTSUPP;
240 } else if ((msg[0].addr == state->af9033_config[0].i2c_addr) || 241 } else if ((msg[0].addr == state->af9033_config[0].i2c_addr) ||
241 (msg[0].addr == state->af9033_config[1].i2c_addr)) { 242 (msg[0].addr == state->af9033_config[1].i2c_addr)) {
242 /* integrated demod */ 243 /* demod access via firmware interface */
243 u32 reg = msg[0].buf[0] << 16 | msg[0].buf[1] << 8 | 244 u32 reg = msg[0].buf[0] << 16 | msg[0].buf[1] << 8 |
244 msg[0].buf[2]; 245 msg[0].buf[2];
245 if (state->af9033_config[1].i2c_addr && 246
246 (msg[0].addr == state->af9033_config[1].i2c_addr)) 247 if (msg[0].addr == state->af9033_config[1].i2c_addr)
247 reg |= 0x100000; 248 reg |= 0x100000;
249
248 ret = af9035_wr_regs(d, reg, &msg[0].buf[3], 250 ret = af9035_wr_regs(d, reg, &msg[0].buf[3],
249 msg[0].len - 3); 251 msg[0].len - 3);
250 } else { 252 } else {
@@ -254,7 +256,7 @@ static int af9035_i2c_master_xfer(struct i2c_adapter *adap,
254 0, NULL }; 256 0, NULL };
255 req.mbox |= ((msg[0].addr & 0x80) >> 3); 257 req.mbox |= ((msg[0].addr & 0x80) >> 3);
256 buf[0] = msg[0].len; 258 buf[0] = msg[0].len;
257 buf[1] = (u8)(msg[0].addr << 1); 259 buf[1] = msg[0].addr << 1;
258 buf[2] = 0x00; /* reg addr len */ 260 buf[2] = 0x00; /* reg addr len */
259 buf[3] = 0x00; /* reg addr MSB */ 261 buf[3] = 0x00; /* reg addr MSB */
260 buf[4] = 0x00; /* reg addr LSB */ 262 buf[4] = 0x00; /* reg addr LSB */
@@ -293,30 +295,9 @@ static int af9035_identify_state(struct dvb_usb_device *d, const char **name)
293 int ret; 295 int ret;
294 u8 wbuf[1] = { 1 }; 296 u8 wbuf[1] = { 1 };
295 u8 rbuf[4]; 297 u8 rbuf[4];
296 u8 tmp;
297 struct usb_req req = { CMD_FW_QUERYINFO, 0, sizeof(wbuf), wbuf, 298 struct usb_req req = { CMD_FW_QUERYINFO, 0, sizeof(wbuf), wbuf,
298 sizeof(rbuf), rbuf }; 299 sizeof(rbuf), rbuf };
299 300
300 /* check if there is dual tuners */
301 ret = af9035_rd_reg(d, EEPROM_DUAL_MODE, &tmp);
302 if (ret < 0)
303 goto err;
304
305 if (tmp) {
306 /* read 2nd demodulator I2C address */
307 ret = af9035_rd_reg(d, EEPROM_2WIREADDR, &tmp);
308 if (ret < 0)
309 goto err;
310
311 ret = af9035_wr_reg(d, 0x00417f, tmp);
312 if (ret < 0)
313 goto err;
314
315 ret = af9035_wr_reg(d, 0x00d81a, 1);
316 if (ret < 0)
317 goto err;
318 }
319
320 ret = af9035_ctrl_msg(d, &req); 301 ret = af9035_ctrl_msg(d, &req);
321 if (ret < 0) 302 if (ret < 0)
322 goto err; 303 goto err;
@@ -344,12 +325,57 @@ static int af9035_download_firmware(struct dvb_usb_device *d,
344 struct usb_req req = { 0, 0, 0, NULL, 0, NULL }; 325 struct usb_req req = { 0, 0, 0, NULL, 0, NULL };
345 struct usb_req req_fw_dl = { CMD_FW_DL, 0, 0, wbuf, 0, NULL }; 326 struct usb_req req_fw_dl = { CMD_FW_DL, 0, 0, wbuf, 0, NULL };
346 struct usb_req req_fw_ver = { CMD_FW_QUERYINFO, 0, 1, wbuf, 4, rbuf } ; 327 struct usb_req req_fw_ver = { CMD_FW_QUERYINFO, 0, 1, wbuf, 4, rbuf } ;
347 u8 hdr_core; 328 u8 hdr_core, tmp;
348 u16 hdr_addr, hdr_data_len, hdr_checksum; 329 u16 hdr_addr, hdr_data_len, hdr_checksum;
349 #define MAX_DATA 58 330 #define MAX_DATA 58
350 #define HDR_SIZE 7 331 #define HDR_SIZE 7
351 332
352 /* 333 /*
334 * In case of dual tuner configuration we need to do some extra
335 * initialization in order to download firmware to slave demod too,
336 * which is done by master demod.
337 * Master feeds also clock and controls power via GPIO.
338 */
339 ret = af9035_rd_reg(d, EEPROM_DUAL_MODE, &tmp);
340 if (ret < 0)
341 goto err;
342
343 if (tmp) {
344 /* configure gpioh1, reset & power slave demod */
345 ret = af9035_wr_reg_mask(d, 0x00d8b0, 0x01, 0x01);
346 if (ret < 0)
347 goto err;
348
349 ret = af9035_wr_reg_mask(d, 0x00d8b1, 0x01, 0x01);
350 if (ret < 0)
351 goto err;
352
353 ret = af9035_wr_reg_mask(d, 0x00d8af, 0x00, 0x01);
354 if (ret < 0)
355 goto err;
356
357 usleep_range(10000, 50000);
358
359 ret = af9035_wr_reg_mask(d, 0x00d8af, 0x01, 0x01);
360 if (ret < 0)
361 goto err;
362
363 /* tell the slave I2C address */
364 ret = af9035_rd_reg(d, EEPROM_2ND_DEMOD_ADDR, &tmp);
365 if (ret < 0)
366 goto err;
367
368 ret = af9035_wr_reg(d, 0x00417f, tmp);
369 if (ret < 0)
370 goto err;
371
372 /* enable clock out */
373 ret = af9035_wr_reg_mask(d, 0x00d81a, 0x01, 0x01);
374 if (ret < 0)
375 goto err;
376 }
377
378 /*
353 * Thanks to Daniel Glöckner <daniel-gl@gmx.net> about that info! 379 * Thanks to Daniel Glöckner <daniel-gl@gmx.net> about that info!
354 * 380 *
355 * byte 0: MCS 51 core 381 * byte 0: MCS 51 core
@@ -520,22 +546,27 @@ static int af9035_read_config(struct dvb_usb_device *d)
520 u8 tmp; 546 u8 tmp;
521 u16 tmp16; 547 u16 tmp16;
522 548
549 /* demod I2C "address" */
550 state->af9033_config[0].i2c_addr = 0x38;
551
523 /* check if there is dual tuners */ 552 /* check if there is dual tuners */
524 ret = af9035_rd_reg(d, EEPROM_DUAL_MODE, &tmp); 553 ret = af9035_rd_reg(d, EEPROM_DUAL_MODE, &tmp);
525 if (ret < 0) 554 if (ret < 0)
526 goto err; 555 goto err;
527 556
528 state->dual_mode = tmp; 557 state->dual_mode = tmp;
529 dev_dbg(&d->udev->dev, "%s: dual mode=%d\n", 558 dev_dbg(&d->udev->dev, "%s: dual mode=%d\n", __func__,
530 __func__, state->dual_mode); 559 state->dual_mode);
531 560
532 if (state->dual_mode) { 561 if (state->dual_mode) {
533 /* read 2nd demodulator I2C address */ 562 /* read 2nd demodulator I2C address */
534 ret = af9035_rd_reg(d, EEPROM_2WIREADDR, &tmp); 563 ret = af9035_rd_reg(d, EEPROM_2ND_DEMOD_ADDR, &tmp);
535 if (ret < 0) 564 if (ret < 0)
536 goto err; 565 goto err;
566
537 state->af9033_config[1].i2c_addr = tmp; 567 state->af9033_config[1].i2c_addr = tmp;
538 pr_debug("%s: 2nd demod I2C addr:%02x\n", __func__, tmp); 568 dev_dbg(&d->udev->dev, "%s: 2nd demod I2C addr=%02x\n",
569 __func__, tmp);
539 } 570 }
540 571
541 for (i = 0; i < state->dual_mode + 1; i++) { 572 for (i = 0; i < state->dual_mode + 1; i++) {
@@ -563,6 +594,16 @@ static int af9035_read_config(struct dvb_usb_device *d)
563 KBUILD_MODNAME, tmp); 594 KBUILD_MODNAME, tmp);
564 } 595 }
565 596
597 /* disable dual mode if driver does not support it */
598 if (i == 1)
599 switch (tmp) {
600 default:
601 state->dual_mode = false;
602 dev_info(&d->udev->dev, "%s: driver does not " \
603 "support 2nd tuner and will " \
604 "disable it", KBUILD_MODNAME);
605 }
606
566 /* tuner IF frequency */ 607 /* tuner IF frequency */
567 ret = af9035_rd_reg(d, EEPROM_1_IFFREQ_L + eeprom_shift, &tmp); 608 ret = af9035_rd_reg(d, EEPROM_1_IFFREQ_L + eeprom_shift, &tmp);
568 if (ret < 0) 609 if (ret < 0)
@@ -798,15 +839,14 @@ static int af9035_frontend_attach(struct dvb_usb_adapter *adap)
798 if (ret < 0) 839 if (ret < 0)
799 goto err; 840 goto err;
800 841
801 ret = af9035_wr_reg(d, 0x00d81a, 842 ret = af9035_wr_reg(d, 0x00d81a, state->dual_mode);
802 state->dual_mode);
803 if (ret < 0) 843 if (ret < 0)
804 goto err; 844 goto err;
805 } 845 }
806 846
807 /* attach demodulator */ 847 /* attach demodulator */
808 adap->fe[0] = dvb_attach(af9033_attach, 848 adap->fe[0] = dvb_attach(af9033_attach, &state->af9033_config[adap->id],
809 &state->af9033_config[adap->id], &d->i2c_adap); 849 &d->i2c_adap);
810 if (adap->fe[0] == NULL) { 850 if (adap->fe[0] == NULL) {
811 ret = -ENODEV; 851 ret = -ENODEV;
812 goto err; 852 goto err;
@@ -866,6 +906,11 @@ static int af9035_tuner_attach(struct dvb_usb_adapter *adap)
866 struct dvb_usb_device *d = adap_to_d(adap); 906 struct dvb_usb_device *d = adap_to_d(adap);
867 int ret; 907 int ret;
868 struct dvb_frontend *fe; 908 struct dvb_frontend *fe;
909 u8 tuner_addr;
910 /*
911 * XXX: Hack used in that function: we abuse unused I2C address bit [7]
912 * to carry info about used I2C bus for dual tuner configuration.
913 */
869 914
870 switch (state->af9033_config[adap->id].tuner) { 915 switch (state->af9033_config[adap->id].tuner) {
871 case AF9033_TUNER_TUA9001: 916 case AF9033_TUNER_TUA9001:
@@ -898,16 +943,15 @@ static int af9035_tuner_attach(struct dvb_usb_adapter *adap)
898 &d->i2c_adap, &af9035_fc0011_config); 943 &d->i2c_adap, &af9035_fc0011_config);
899 break; 944 break;
900 case AF9033_TUNER_MXL5007T: 945 case AF9033_TUNER_MXL5007T:
901 state->tuner_address[adap->id] = 0x60;
902 /* hack, use b[7] to carry used I2C-bus */
903 state->tuner_address[adap->id] |= (adap->id << 7);
904 if (adap->id == 0) { 946 if (adap->id == 0) {
905 ret = af9035_wr_reg(d, 0x00d8e0, 1); 947 ret = af9035_wr_reg(d, 0x00d8e0, 1);
906 if (ret < 0) 948 if (ret < 0)
907 goto err; 949 goto err;
950
908 ret = af9035_wr_reg(d, 0x00d8e1, 1); 951 ret = af9035_wr_reg(d, 0x00d8e1, 1);
909 if (ret < 0) 952 if (ret < 0)
910 goto err; 953 goto err;
954
911 ret = af9035_wr_reg(d, 0x00d8df, 0); 955 ret = af9035_wr_reg(d, 0x00d8df, 0);
912 if (ret < 0) 956 if (ret < 0)
913 goto err; 957 goto err;
@@ -923,27 +967,35 @@ static int af9035_tuner_attach(struct dvb_usb_adapter *adap)
923 ret = af9035_wr_reg(d, 0x00d8c0, 1); 967 ret = af9035_wr_reg(d, 0x00d8c0, 1);
924 if (ret < 0) 968 if (ret < 0)
925 goto err; 969 goto err;
970
926 ret = af9035_wr_reg(d, 0x00d8c1, 1); 971 ret = af9035_wr_reg(d, 0x00d8c1, 1);
927 if (ret < 0) 972 if (ret < 0)
928 goto err; 973 goto err;
974
929 ret = af9035_wr_reg(d, 0x00d8bf, 0); 975 ret = af9035_wr_reg(d, 0x00d8bf, 0);
930 if (ret < 0) 976 if (ret < 0)
931 goto err; 977 goto err;
978
932 ret = af9035_wr_reg(d, 0x00d8b4, 1); 979 ret = af9035_wr_reg(d, 0x00d8b4, 1);
933 if (ret < 0) 980 if (ret < 0)
934 goto err; 981 goto err;
982
935 ret = af9035_wr_reg(d, 0x00d8b5, 1); 983 ret = af9035_wr_reg(d, 0x00d8b5, 1);
936 if (ret < 0) 984 if (ret < 0)
937 goto err; 985 goto err;
986
938 ret = af9035_wr_reg(d, 0x00d8b3, 1); 987 ret = af9035_wr_reg(d, 0x00d8b3, 1);
939 if (ret < 0) 988 if (ret < 0)
940 goto err; 989 goto err;
990
991 tuner_addr = 0x60;
992 } else {
993 tuner_addr = 0x60 | 0x80; /* I2C bus hack */
941 } 994 }
942 995
943 /* attach tuner */ 996 /* attach tuner */
944 fe = dvb_attach(mxl5007t_attach, adap->fe[0], 997 fe = dvb_attach(mxl5007t_attach, adap->fe[0], &d->i2c_adap,
945 &d->i2c_adap, state->tuner_address[adap->id], 998 tuner_addr, &af9035_mxl5007t_config[adap->id]);
946 &af9035_mxl5007t_config[adap->id]);
947 break; 999 break;
948 case AF9033_TUNER_TDA18218: 1000 case AF9033_TUNER_TDA18218:
949 /* attach tuner */ 1001 /* attach tuner */
diff --git a/drivers/media/usb/dvb-usb-v2/af9035.h b/drivers/media/usb/dvb-usb-v2/af9035.h
index e26e04d076aa..29f3eec22c2c 100644
--- a/drivers/media/usb/dvb-usb-v2/af9035.h
+++ b/drivers/media/usb/dvb-usb-v2/af9035.h
@@ -54,10 +54,7 @@ struct usb_req {
54struct state { 54struct state {
55 u8 seq; /* packet sequence number */ 55 u8 seq; /* packet sequence number */
56 bool dual_mode; 56 bool dual_mode;
57
58 struct af9033_config af9033_config[2]; 57 struct af9033_config af9033_config[2];
59
60 u8 tuner_address[2];
61}; 58};
62 59
63u32 clock_lut[] = { 60u32 clock_lut[] = {
@@ -94,7 +91,7 @@ u32 clock_lut_it9135[] = {
94/* EEPROM locations */ 91/* EEPROM locations */
95#define EEPROM_IR_MODE 0x430d 92#define EEPROM_IR_MODE 0x430d
96#define EEPROM_DUAL_MODE 0x4326 93#define EEPROM_DUAL_MODE 0x4326
97#define EEPROM_2WIREADDR 0x4327 94#define EEPROM_2ND_DEMOD_ADDR 0x4327
98#define EEPROM_IR_TYPE 0x4329 95#define EEPROM_IR_TYPE 0x4329
99#define EEPROM_1_IFFREQ_L 0x432d 96#define EEPROM_1_IFFREQ_L 0x432d
100#define EEPROM_1_IFFREQ_H 0x432e 97#define EEPROM_1_IFFREQ_H 0x432e