diff options
author | Antti Palosaari <crope@iki.fi> | 2014-08-31 19:57:05 -0400 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@osg.samsung.com> | 2014-09-21 18:37:33 -0400 |
commit | f5b00a767006e47f9c32099f0797068a7a3e4c5c (patch) | |
tree | d35c687d37592e704d82beb8cdc9057aadce39c6 | |
parent | 09611caad158f868993261c7d9277a9a331f8ea3 (diff) |
[media] af9033: convert to I2C client
Convert driver to kernel I2C model.
Signed-off-by: Antti Palosaari <crope@iki.fi>
Signed-off-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
-rw-r--r-- | drivers/media/dvb-frontends/af9033.c | 236 | ||||
-rw-r--r-- | drivers/media/dvb-frontends/af9033.h | 44 | ||||
-rw-r--r-- | drivers/media/usb/dvb-usb-v2/af9035.c | 50 | ||||
-rw-r--r-- | drivers/media/usb/dvb-usb-v2/af9035.h | 2 |
4 files changed, 183 insertions, 149 deletions
diff --git a/drivers/media/dvb-frontends/af9033.c b/drivers/media/dvb-frontends/af9033.c index 43b7335f27e4..c40ae49effb5 100644 --- a/drivers/media/dvb-frontends/af9033.c +++ b/drivers/media/dvb-frontends/af9033.c | |||
@@ -25,7 +25,7 @@ | |||
25 | #define MAX_XFER_SIZE 64 | 25 | #define MAX_XFER_SIZE 64 |
26 | 26 | ||
27 | struct af9033_dev { | 27 | struct af9033_dev { |
28 | struct i2c_adapter *i2c; | 28 | struct i2c_client *client; |
29 | struct dvb_frontend fe; | 29 | struct dvb_frontend fe; |
30 | struct af9033_config cfg; | 30 | struct af9033_config cfg; |
31 | 31 | ||
@@ -46,7 +46,7 @@ static int af9033_wr_regs(struct af9033_dev *dev, u32 reg, const u8 *val, | |||
46 | u8 buf[MAX_XFER_SIZE]; | 46 | u8 buf[MAX_XFER_SIZE]; |
47 | struct i2c_msg msg[1] = { | 47 | struct i2c_msg msg[1] = { |
48 | { | 48 | { |
49 | .addr = dev->cfg.i2c_addr, | 49 | .addr = dev->client->addr, |
50 | .flags = 0, | 50 | .flags = 0, |
51 | .len = 3 + len, | 51 | .len = 3 + len, |
52 | .buf = buf, | 52 | .buf = buf, |
@@ -54,7 +54,7 @@ static int af9033_wr_regs(struct af9033_dev *dev, u32 reg, const u8 *val, | |||
54 | }; | 54 | }; |
55 | 55 | ||
56 | if (3 + len > sizeof(buf)) { | 56 | if (3 + len > sizeof(buf)) { |
57 | dev_warn(&dev->i2c->dev, | 57 | dev_warn(&dev->client->dev, |
58 | "%s: i2c wr reg=%04x: len=%d is too big!\n", | 58 | "%s: i2c wr reg=%04x: len=%d is too big!\n", |
59 | KBUILD_MODNAME, reg, len); | 59 | KBUILD_MODNAME, reg, len); |
60 | return -EINVAL; | 60 | return -EINVAL; |
@@ -65,11 +65,11 @@ static int af9033_wr_regs(struct af9033_dev *dev, u32 reg, const u8 *val, | |||
65 | buf[2] = (reg >> 0) & 0xff; | 65 | buf[2] = (reg >> 0) & 0xff; |
66 | memcpy(&buf[3], val, len); | 66 | memcpy(&buf[3], val, len); |
67 | 67 | ||
68 | ret = i2c_transfer(dev->i2c, msg, 1); | 68 | ret = i2c_transfer(dev->client->adapter, msg, 1); |
69 | if (ret == 1) { | 69 | if (ret == 1) { |
70 | ret = 0; | 70 | ret = 0; |
71 | } else { | 71 | } else { |
72 | dev_warn(&dev->i2c->dev, | 72 | dev_warn(&dev->client->dev, |
73 | "%s: i2c wr failed=%d reg=%06x len=%d\n", | 73 | "%s: i2c wr failed=%d reg=%06x len=%d\n", |
74 | KBUILD_MODNAME, ret, reg, len); | 74 | KBUILD_MODNAME, ret, reg, len); |
75 | ret = -EREMOTEIO; | 75 | ret = -EREMOTEIO; |
@@ -86,23 +86,23 @@ static int af9033_rd_regs(struct af9033_dev *dev, u32 reg, u8 *val, int len) | |||
86 | (reg >> 0) & 0xff }; | 86 | (reg >> 0) & 0xff }; |
87 | struct i2c_msg msg[2] = { | 87 | struct i2c_msg msg[2] = { |
88 | { | 88 | { |
89 | .addr = dev->cfg.i2c_addr, | 89 | .addr = dev->client->addr, |
90 | .flags = 0, | 90 | .flags = 0, |
91 | .len = sizeof(buf), | 91 | .len = sizeof(buf), |
92 | .buf = buf | 92 | .buf = buf |
93 | }, { | 93 | }, { |
94 | .addr = dev->cfg.i2c_addr, | 94 | .addr = dev->client->addr, |
95 | .flags = I2C_M_RD, | 95 | .flags = I2C_M_RD, |
96 | .len = len, | 96 | .len = len, |
97 | .buf = val | 97 | .buf = val |
98 | } | 98 | } |
99 | }; | 99 | }; |
100 | 100 | ||
101 | ret = i2c_transfer(dev->i2c, msg, 2); | 101 | ret = i2c_transfer(dev->client->adapter, msg, 2); |
102 | if (ret == 2) { | 102 | if (ret == 2) { |
103 | ret = 0; | 103 | ret = 0; |
104 | } else { | 104 | } else { |
105 | dev_warn(&dev->i2c->dev, | 105 | dev_warn(&dev->client->dev, |
106 | "%s: i2c rd failed=%d reg=%06x len=%d\n", | 106 | "%s: i2c rd failed=%d reg=%06x len=%d\n", |
107 | KBUILD_MODNAME, ret, reg, len); | 107 | KBUILD_MODNAME, ret, reg, len); |
108 | ret = -EREMOTEIO; | 108 | ret = -EREMOTEIO; |
@@ -176,10 +176,10 @@ static int af9033_wr_reg_val_tab(struct af9033_dev *dev, | |||
176 | int ret, i, j; | 176 | int ret, i, j; |
177 | u8 buf[1 + MAX_TAB_LEN]; | 177 | u8 buf[1 + MAX_TAB_LEN]; |
178 | 178 | ||
179 | dev_dbg(&dev->i2c->dev, "%s: tab_len=%d\n", __func__, tab_len); | 179 | dev_dbg(&dev->client->dev, "%s: tab_len=%d\n", __func__, tab_len); |
180 | 180 | ||
181 | if (tab_len > sizeof(buf)) { | 181 | if (tab_len > sizeof(buf)) { |
182 | dev_warn(&dev->i2c->dev, "%s: tab len %d is too big\n", | 182 | dev_warn(&dev->client->dev, "%s: tab len %d is too big\n", |
183 | KBUILD_MODNAME, tab_len); | 183 | KBUILD_MODNAME, tab_len); |
184 | return -EINVAL; | 184 | return -EINVAL; |
185 | } | 185 | } |
@@ -201,7 +201,7 @@ static int af9033_wr_reg_val_tab(struct af9033_dev *dev, | |||
201 | return 0; | 201 | return 0; |
202 | 202 | ||
203 | err: | 203 | err: |
204 | dev_dbg(&dev->i2c->dev, "%s: failed=%d\n", __func__, ret); | 204 | dev_dbg(&dev->client->dev, "%s: failed=%d\n", __func__, ret); |
205 | 205 | ||
206 | return ret; | 206 | return ret; |
207 | } | 207 | } |
@@ -210,7 +210,7 @@ static u32 af9033_div(struct af9033_dev *dev, u32 a, u32 b, u32 x) | |||
210 | { | 210 | { |
211 | u32 r = 0, c = 0, i; | 211 | u32 r = 0, c = 0, i; |
212 | 212 | ||
213 | dev_dbg(&dev->i2c->dev, "%s: a=%d b=%d x=%d\n", __func__, a, b, x); | 213 | dev_dbg(&dev->client->dev, "%s: a=%d b=%d x=%d\n", __func__, a, b, x); |
214 | 214 | ||
215 | if (a > b) { | 215 | if (a > b) { |
216 | c = a / b; | 216 | c = a / b; |
@@ -227,19 +227,12 @@ static u32 af9033_div(struct af9033_dev *dev, u32 a, u32 b, u32 x) | |||
227 | } | 227 | } |
228 | r = (c << (u32)x) + r; | 228 | r = (c << (u32)x) + r; |
229 | 229 | ||
230 | dev_dbg(&dev->i2c->dev, "%s: a=%d b=%d x=%d r=%d r=%x\n", | 230 | dev_dbg(&dev->client->dev, "%s: a=%d b=%d x=%d r=%d r=%x\n", |
231 | __func__, a, b, x, r, r); | 231 | __func__, a, b, x, r, r); |
232 | 232 | ||
233 | return r; | 233 | return r; |
234 | } | 234 | } |
235 | 235 | ||
236 | static void af9033_release(struct dvb_frontend *fe) | ||
237 | { | ||
238 | struct af9033_dev *dev = fe->demodulator_priv; | ||
239 | |||
240 | kfree(dev); | ||
241 | } | ||
242 | |||
243 | static int af9033_init(struct dvb_frontend *fe) | 236 | static int af9033_init(struct dvb_frontend *fe) |
244 | { | 237 | { |
245 | struct af9033_dev *dev = fe->demodulator_priv; | 238 | struct af9033_dev *dev = fe->demodulator_priv; |
@@ -283,7 +276,7 @@ static int af9033_init(struct dvb_frontend *fe) | |||
283 | buf[2] = (clock_cw >> 16) & 0xff; | 276 | buf[2] = (clock_cw >> 16) & 0xff; |
284 | buf[3] = (clock_cw >> 24) & 0xff; | 277 | buf[3] = (clock_cw >> 24) & 0xff; |
285 | 278 | ||
286 | dev_dbg(&dev->i2c->dev, "%s: clock=%d clock_cw=%08x\n", | 279 | dev_dbg(&dev->client->dev, "%s: clock=%d clock_cw=%08x\n", |
287 | __func__, dev->cfg.clock, clock_cw); | 280 | __func__, dev->cfg.clock, clock_cw); |
288 | 281 | ||
289 | ret = af9033_wr_regs(dev, 0x800025, buf, 4); | 282 | ret = af9033_wr_regs(dev, 0x800025, buf, 4); |
@@ -301,7 +294,7 @@ static int af9033_init(struct dvb_frontend *fe) | |||
301 | buf[1] = (adc_cw >> 8) & 0xff; | 294 | buf[1] = (adc_cw >> 8) & 0xff; |
302 | buf[2] = (adc_cw >> 16) & 0xff; | 295 | buf[2] = (adc_cw >> 16) & 0xff; |
303 | 296 | ||
304 | dev_dbg(&dev->i2c->dev, "%s: adc=%d adc_cw=%06x\n", | 297 | dev_dbg(&dev->client->dev, "%s: adc=%d adc_cw=%06x\n", |
305 | __func__, clock_adc_lut[i].adc, adc_cw); | 298 | __func__, clock_adc_lut[i].adc, adc_cw); |
306 | 299 | ||
307 | ret = af9033_wr_regs(dev, 0x80f1cd, buf, 3); | 300 | ret = af9033_wr_regs(dev, 0x80f1cd, buf, 3); |
@@ -343,7 +336,7 @@ static int af9033_init(struct dvb_frontend *fe) | |||
343 | } | 336 | } |
344 | 337 | ||
345 | /* load OFSM settings */ | 338 | /* load OFSM settings */ |
346 | dev_dbg(&dev->i2c->dev, "%s: load ofsm settings\n", __func__); | 339 | dev_dbg(&dev->client->dev, "%s: load ofsm settings\n", __func__); |
347 | switch (dev->cfg.tuner) { | 340 | switch (dev->cfg.tuner) { |
348 | case AF9033_TUNER_IT9135_38: | 341 | case AF9033_TUNER_IT9135_38: |
349 | case AF9033_TUNER_IT9135_51: | 342 | case AF9033_TUNER_IT9135_51: |
@@ -368,7 +361,7 @@ static int af9033_init(struct dvb_frontend *fe) | |||
368 | goto err; | 361 | goto err; |
369 | 362 | ||
370 | /* load tuner specific settings */ | 363 | /* load tuner specific settings */ |
371 | dev_dbg(&dev->i2c->dev, "%s: load tuner specific settings\n", | 364 | dev_dbg(&dev->client->dev, "%s: load tuner specific settings\n", |
372 | __func__); | 365 | __func__); |
373 | switch (dev->cfg.tuner) { | 366 | switch (dev->cfg.tuner) { |
374 | case AF9033_TUNER_TUA9001: | 367 | case AF9033_TUNER_TUA9001: |
@@ -420,7 +413,7 @@ static int af9033_init(struct dvb_frontend *fe) | |||
420 | init = tuner_init_it9135_62; | 413 | init = tuner_init_it9135_62; |
421 | break; | 414 | break; |
422 | default: | 415 | default: |
423 | dev_dbg(&dev->i2c->dev, "%s: unsupported tuner ID=%d\n", | 416 | dev_dbg(&dev->client->dev, "%s: unsupported tuner ID=%d\n", |
424 | __func__, dev->cfg.tuner); | 417 | __func__, dev->cfg.tuner); |
425 | ret = -ENODEV; | 418 | ret = -ENODEV; |
426 | goto err; | 419 | goto err; |
@@ -458,7 +451,7 @@ static int af9033_init(struct dvb_frontend *fe) | |||
458 | return 0; | 451 | return 0; |
459 | 452 | ||
460 | err: | 453 | err: |
461 | dev_dbg(&dev->i2c->dev, "%s: failed=%d\n", __func__, ret); | 454 | dev_dbg(&dev->client->dev, "%s: failed=%d\n", __func__, ret); |
462 | 455 | ||
463 | return ret; | 456 | return ret; |
464 | } | 457 | } |
@@ -485,7 +478,7 @@ static int af9033_sleep(struct dvb_frontend *fe) | |||
485 | usleep_range(200, 10000); | 478 | usleep_range(200, 10000); |
486 | } | 479 | } |
487 | 480 | ||
488 | dev_dbg(&dev->i2c->dev, "%s: loop=%d\n", __func__, i); | 481 | dev_dbg(&dev->client->dev, "%s: loop=%d\n", __func__, i); |
489 | 482 | ||
490 | if (i == 0) { | 483 | if (i == 0) { |
491 | ret = -ETIMEDOUT; | 484 | ret = -ETIMEDOUT; |
@@ -511,7 +504,7 @@ static int af9033_sleep(struct dvb_frontend *fe) | |||
511 | return 0; | 504 | return 0; |
512 | 505 | ||
513 | err: | 506 | err: |
514 | dev_dbg(&dev->i2c->dev, "%s: failed=%d\n", __func__, ret); | 507 | dev_dbg(&dev->client->dev, "%s: failed=%d\n", __func__, ret); |
515 | 508 | ||
516 | return ret; | 509 | return ret; |
517 | } | 510 | } |
@@ -535,7 +528,7 @@ static int af9033_set_frontend(struct dvb_frontend *fe) | |||
535 | u8 tmp, buf[3], bandwidth_reg_val; | 528 | u8 tmp, buf[3], bandwidth_reg_val; |
536 | u32 if_frequency, freq_cw, adc_freq; | 529 | u32 if_frequency, freq_cw, adc_freq; |
537 | 530 | ||
538 | dev_dbg(&dev->i2c->dev, "%s: frequency=%d bandwidth_hz=%d\n", | 531 | dev_dbg(&dev->client->dev, "%s: frequency=%d bandwidth_hz=%d\n", |
539 | __func__, c->frequency, c->bandwidth_hz); | 532 | __func__, c->frequency, c->bandwidth_hz); |
540 | 533 | ||
541 | /* check bandwidth */ | 534 | /* check bandwidth */ |
@@ -550,7 +543,7 @@ static int af9033_set_frontend(struct dvb_frontend *fe) | |||
550 | bandwidth_reg_val = 0x02; | 543 | bandwidth_reg_val = 0x02; |
551 | break; | 544 | break; |
552 | default: | 545 | default: |
553 | dev_dbg(&dev->i2c->dev, "%s: invalid bandwidth_hz\n", | 546 | dev_dbg(&dev->client->dev, "%s: invalid bandwidth_hz\n", |
554 | __func__); | 547 | __func__); |
555 | ret = -EINVAL; | 548 | ret = -EINVAL; |
556 | goto err; | 549 | goto err; |
@@ -653,7 +646,7 @@ static int af9033_set_frontend(struct dvb_frontend *fe) | |||
653 | return 0; | 646 | return 0; |
654 | 647 | ||
655 | err: | 648 | err: |
656 | dev_dbg(&dev->i2c->dev, "%s: failed=%d\n", __func__, ret); | 649 | dev_dbg(&dev->client->dev, "%s: failed=%d\n", __func__, ret); |
657 | 650 | ||
658 | return ret; | 651 | return ret; |
659 | } | 652 | } |
@@ -665,7 +658,7 @@ static int af9033_get_frontend(struct dvb_frontend *fe) | |||
665 | int ret; | 658 | int ret; |
666 | u8 buf[8]; | 659 | u8 buf[8]; |
667 | 660 | ||
668 | dev_dbg(&dev->i2c->dev, "%s:\n", __func__); | 661 | dev_dbg(&dev->client->dev, "%s:\n", __func__); |
669 | 662 | ||
670 | /* read all needed registers */ | 663 | /* read all needed registers */ |
671 | ret = af9033_rd_regs(dev, 0x80f900, buf, sizeof(buf)); | 664 | ret = af9033_rd_regs(dev, 0x80f900, buf, sizeof(buf)); |
@@ -780,7 +773,7 @@ static int af9033_get_frontend(struct dvb_frontend *fe) | |||
780 | return 0; | 773 | return 0; |
781 | 774 | ||
782 | err: | 775 | err: |
783 | dev_dbg(&dev->i2c->dev, "%s: failed=%d\n", __func__, ret); | 776 | dev_dbg(&dev->client->dev, "%s: failed=%d\n", __func__, ret); |
784 | 777 | ||
785 | return ret; | 778 | return ret; |
786 | } | 779 | } |
@@ -826,7 +819,7 @@ static int af9033_read_status(struct dvb_frontend *fe, fe_status_t *status) | |||
826 | return 0; | 819 | return 0; |
827 | 820 | ||
828 | err: | 821 | err: |
829 | dev_dbg(&dev->i2c->dev, "%s: failed=%d\n", __func__, ret); | 822 | dev_dbg(&dev->client->dev, "%s: failed=%d\n", __func__, ret); |
830 | 823 | ||
831 | return ret; | 824 | return ret; |
832 | } | 825 | } |
@@ -880,7 +873,7 @@ static int af9033_read_snr(struct dvb_frontend *fe, u16 *snr) | |||
880 | return 0; | 873 | return 0; |
881 | 874 | ||
882 | err: | 875 | err: |
883 | dev_dbg(&dev->i2c->dev, "%s: failed=%d\n", __func__, ret); | 876 | dev_dbg(&dev->client->dev, "%s: failed=%d\n", __func__, ret); |
884 | 877 | ||
885 | return ret; | 878 | return ret; |
886 | } | 879 | } |
@@ -902,7 +895,7 @@ static int af9033_read_signal_strength(struct dvb_frontend *fe, u16 *strength) | |||
902 | return 0; | 895 | return 0; |
903 | 896 | ||
904 | err: | 897 | err: |
905 | dev_dbg(&dev->i2c->dev, "%s: failed=%d\n", __func__, ret); | 898 | dev_dbg(&dev->client->dev, "%s: failed=%d\n", __func__, ret); |
906 | 899 | ||
907 | return ret; | 900 | return ret; |
908 | } | 901 | } |
@@ -948,7 +941,7 @@ static int af9033_update_ch_stat(struct af9033_dev *dev) | |||
948 | 941 | ||
949 | return 0; | 942 | return 0; |
950 | err: | 943 | err: |
951 | dev_dbg(&dev->i2c->dev, "%s: failed=%d\n", __func__, ret); | 944 | dev_dbg(&dev->client->dev, "%s: failed=%d\n", __func__, ret); |
952 | 945 | ||
953 | return ret; | 946 | return ret; |
954 | } | 947 | } |
@@ -986,7 +979,7 @@ static int af9033_i2c_gate_ctrl(struct dvb_frontend *fe, int enable) | |||
986 | struct af9033_dev *dev = fe->demodulator_priv; | 979 | struct af9033_dev *dev = fe->demodulator_priv; |
987 | int ret; | 980 | int ret; |
988 | 981 | ||
989 | dev_dbg(&dev->i2c->dev, "%s: enable=%d\n", __func__, enable); | 982 | dev_dbg(&dev->client->dev, "%s: enable=%d\n", __func__, enable); |
990 | 983 | ||
991 | ret = af9033_wr_reg_mask(dev, 0x00fa04, enable, 0x01); | 984 | ret = af9033_wr_reg_mask(dev, 0x00fa04, enable, 0x01); |
992 | if (ret < 0) | 985 | if (ret < 0) |
@@ -995,7 +988,7 @@ static int af9033_i2c_gate_ctrl(struct dvb_frontend *fe, int enable) | |||
995 | return 0; | 988 | return 0; |
996 | 989 | ||
997 | err: | 990 | err: |
998 | dev_dbg(&dev->i2c->dev, "%s: failed=%d\n", __func__, ret); | 991 | dev_dbg(&dev->client->dev, "%s: failed=%d\n", __func__, ret); |
999 | 992 | ||
1000 | return ret; | 993 | return ret; |
1001 | } | 994 | } |
@@ -1005,7 +998,7 @@ static int af9033_pid_filter_ctrl(struct dvb_frontend *fe, int onoff) | |||
1005 | struct af9033_dev *dev = fe->demodulator_priv; | 998 | struct af9033_dev *dev = fe->demodulator_priv; |
1006 | int ret; | 999 | int ret; |
1007 | 1000 | ||
1008 | dev_dbg(&dev->i2c->dev, "%s: onoff=%d\n", __func__, onoff); | 1001 | dev_dbg(&dev->client->dev, "%s: onoff=%d\n", __func__, onoff); |
1009 | 1002 | ||
1010 | ret = af9033_wr_reg_mask(dev, 0x80f993, onoff, 0x01); | 1003 | ret = af9033_wr_reg_mask(dev, 0x80f993, onoff, 0x01); |
1011 | if (ret < 0) | 1004 | if (ret < 0) |
@@ -1014,7 +1007,7 @@ static int af9033_pid_filter_ctrl(struct dvb_frontend *fe, int onoff) | |||
1014 | return 0; | 1007 | return 0; |
1015 | 1008 | ||
1016 | err: | 1009 | err: |
1017 | dev_dbg(&dev->i2c->dev, "%s: failed=%d\n", __func__, ret); | 1010 | dev_dbg(&dev->client->dev, "%s: failed=%d\n", __func__, ret); |
1018 | 1011 | ||
1019 | return ret; | 1012 | return ret; |
1020 | } | 1013 | } |
@@ -1026,7 +1019,7 @@ static int af9033_pid_filter(struct dvb_frontend *fe, int index, u16 pid, | |||
1026 | int ret; | 1019 | int ret; |
1027 | u8 wbuf[2] = {(pid >> 0) & 0xff, (pid >> 8) & 0xff}; | 1020 | u8 wbuf[2] = {(pid >> 0) & 0xff, (pid >> 8) & 0xff}; |
1028 | 1021 | ||
1029 | dev_dbg(&dev->i2c->dev, "%s: index=%d pid=%04x onoff=%d\n", | 1022 | dev_dbg(&dev->client->dev, "%s: index=%d pid=%04x onoff=%d\n", |
1030 | __func__, index, pid, onoff); | 1023 | __func__, index, pid, onoff); |
1031 | 1024 | ||
1032 | if (pid > 0x1fff) | 1025 | if (pid > 0x1fff) |
@@ -1047,38 +1040,79 @@ static int af9033_pid_filter(struct dvb_frontend *fe, int index, u16 pid, | |||
1047 | return 0; | 1040 | return 0; |
1048 | 1041 | ||
1049 | err: | 1042 | err: |
1050 | dev_dbg(&dev->i2c->dev, "%s: failed=%d\n", __func__, ret); | 1043 | dev_dbg(&dev->client->dev, "%s: failed=%d\n", __func__, ret); |
1051 | 1044 | ||
1052 | return ret; | 1045 | return ret; |
1053 | } | 1046 | } |
1054 | 1047 | ||
1055 | static struct dvb_frontend_ops af9033_ops; | 1048 | static struct dvb_frontend_ops af9033_ops = { |
1049 | .delsys = { SYS_DVBT }, | ||
1050 | .info = { | ||
1051 | .name = "Afatech AF9033 (DVB-T)", | ||
1052 | .frequency_min = 174000000, | ||
1053 | .frequency_max = 862000000, | ||
1054 | .frequency_stepsize = 250000, | ||
1055 | .frequency_tolerance = 0, | ||
1056 | .caps = FE_CAN_FEC_1_2 | | ||
1057 | FE_CAN_FEC_2_3 | | ||
1058 | FE_CAN_FEC_3_4 | | ||
1059 | FE_CAN_FEC_5_6 | | ||
1060 | FE_CAN_FEC_7_8 | | ||
1061 | FE_CAN_FEC_AUTO | | ||
1062 | FE_CAN_QPSK | | ||
1063 | FE_CAN_QAM_16 | | ||
1064 | FE_CAN_QAM_64 | | ||
1065 | FE_CAN_QAM_AUTO | | ||
1066 | FE_CAN_TRANSMISSION_MODE_AUTO | | ||
1067 | FE_CAN_GUARD_INTERVAL_AUTO | | ||
1068 | FE_CAN_HIERARCHY_AUTO | | ||
1069 | FE_CAN_RECOVER | | ||
1070 | FE_CAN_MUTE_TS | ||
1071 | }, | ||
1072 | |||
1073 | .init = af9033_init, | ||
1074 | .sleep = af9033_sleep, | ||
1075 | |||
1076 | .get_tune_settings = af9033_get_tune_settings, | ||
1077 | .set_frontend = af9033_set_frontend, | ||
1078 | .get_frontend = af9033_get_frontend, | ||
1079 | |||
1080 | .read_status = af9033_read_status, | ||
1081 | .read_snr = af9033_read_snr, | ||
1082 | .read_signal_strength = af9033_read_signal_strength, | ||
1083 | .read_ber = af9033_read_ber, | ||
1084 | .read_ucblocks = af9033_read_ucblocks, | ||
1085 | |||
1086 | .i2c_gate_ctrl = af9033_i2c_gate_ctrl, | ||
1087 | }; | ||
1056 | 1088 | ||
1057 | struct dvb_frontend *af9033_attach(const struct af9033_config *config, | 1089 | static int af9033_probe(struct i2c_client *client, |
1058 | struct i2c_adapter *i2c, | 1090 | const struct i2c_device_id *id) |
1059 | struct af9033_ops *ops) | ||
1060 | { | 1091 | { |
1061 | int ret; | 1092 | struct af9033_config *cfg = client->dev.platform_data; |
1062 | struct af9033_dev *dev; | 1093 | struct af9033_dev *dev; |
1094 | int ret; | ||
1063 | u8 buf[8]; | 1095 | u8 buf[8]; |
1064 | u32 reg; | 1096 | u32 reg; |
1065 | 1097 | ||
1066 | dev_dbg(&i2c->dev, "%s:\n", __func__); | ||
1067 | |||
1068 | /* allocate memory for the internal state */ | 1098 | /* allocate memory for the internal state */ |
1069 | dev = kzalloc(sizeof(struct af9033_dev), GFP_KERNEL); | 1099 | dev = kzalloc(sizeof(struct af9033_dev), GFP_KERNEL); |
1070 | if (dev == NULL) | 1100 | if (dev == NULL) { |
1101 | ret = -ENOMEM; | ||
1102 | dev_err(&client->dev, "Could not allocate memory for state\n"); | ||
1071 | goto err; | 1103 | goto err; |
1104 | } | ||
1072 | 1105 | ||
1073 | /* setup the state */ | 1106 | /* setup the state */ |
1074 | dev->i2c = i2c; | 1107 | dev->client = client; |
1075 | memcpy(&dev->cfg, config, sizeof(struct af9033_config)); | 1108 | memcpy(&dev->cfg, cfg, sizeof(struct af9033_config)); |
1076 | 1109 | ||
1077 | if (dev->cfg.clock != 12000000) { | 1110 | if (dev->cfg.clock != 12000000) { |
1078 | dev_err(&dev->i2c->dev, | 1111 | ret = -ENODEV; |
1112 | dev_err(&dev->client->dev, | ||
1079 | "%s: af9033: unsupported clock=%d, only 12000000 Hz is supported currently\n", | 1113 | "%s: af9033: unsupported clock=%d, only 12000000 Hz is supported currently\n", |
1080 | KBUILD_MODNAME, dev->cfg.clock); | 1114 | KBUILD_MODNAME, dev->cfg.clock); |
1081 | goto err; | 1115 | goto err_kfree; |
1082 | } | 1116 | } |
1083 | 1117 | ||
1084 | /* firmware version */ | 1118 | /* firmware version */ |
@@ -1098,13 +1132,13 @@ struct dvb_frontend *af9033_attach(const struct af9033_config *config, | |||
1098 | 1132 | ||
1099 | ret = af9033_rd_regs(dev, reg, &buf[0], 4); | 1133 | ret = af9033_rd_regs(dev, reg, &buf[0], 4); |
1100 | if (ret < 0) | 1134 | if (ret < 0) |
1101 | goto err; | 1135 | goto err_kfree; |
1102 | 1136 | ||
1103 | ret = af9033_rd_regs(dev, 0x804191, &buf[4], 4); | 1137 | ret = af9033_rd_regs(dev, 0x804191, &buf[4], 4); |
1104 | if (ret < 0) | 1138 | if (ret < 0) |
1105 | goto err; | 1139 | goto err_kfree; |
1106 | 1140 | ||
1107 | dev_info(&dev->i2c->dev, | 1141 | dev_info(&dev->client->dev, |
1108 | "%s: firmware version: LINK=%d.%d.%d.%d OFDM=%d.%d.%d.%d\n", | 1142 | "%s: firmware version: LINK=%d.%d.%d.%d OFDM=%d.%d.%d.%d\n", |
1109 | KBUILD_MODNAME, buf[0], buf[1], buf[2], buf[3], buf[4], | 1143 | KBUILD_MODNAME, buf[0], buf[1], buf[2], buf[3], buf[4], |
1110 | buf[5], buf[6], buf[7]); | 1144 | buf[5], buf[6], buf[7]); |
@@ -1122,11 +1156,11 @@ struct dvb_frontend *af9033_attach(const struct af9033_config *config, | |||
1122 | default: | 1156 | default: |
1123 | ret = af9033_wr_reg(dev, 0x80004c, 1); | 1157 | ret = af9033_wr_reg(dev, 0x80004c, 1); |
1124 | if (ret < 0) | 1158 | if (ret < 0) |
1125 | goto err; | 1159 | goto err_kfree; |
1126 | 1160 | ||
1127 | ret = af9033_wr_reg(dev, 0x800000, 0); | 1161 | ret = af9033_wr_reg(dev, 0x800000, 0); |
1128 | if (ret < 0) | 1162 | if (ret < 0) |
1129 | goto err; | 1163 | goto err_kfree; |
1130 | } | 1164 | } |
1131 | 1165 | ||
1132 | /* configure internal TS mode */ | 1166 | /* configure internal TS mode */ |
@@ -1146,63 +1180,53 @@ struct dvb_frontend *af9033_attach(const struct af9033_config *config, | |||
1146 | /* create dvb_frontend */ | 1180 | /* create dvb_frontend */ |
1147 | memcpy(&dev->fe.ops, &af9033_ops, sizeof(struct dvb_frontend_ops)); | 1181 | memcpy(&dev->fe.ops, &af9033_ops, sizeof(struct dvb_frontend_ops)); |
1148 | dev->fe.demodulator_priv = dev; | 1182 | dev->fe.demodulator_priv = dev; |
1149 | 1183 | *cfg->fe = &dev->fe; | |
1150 | if (ops) { | 1184 | if (cfg->ops) { |
1151 | ops->pid_filter = af9033_pid_filter; | 1185 | cfg->ops->pid_filter = af9033_pid_filter; |
1152 | ops->pid_filter_ctrl = af9033_pid_filter_ctrl; | 1186 | cfg->ops->pid_filter_ctrl = af9033_pid_filter_ctrl; |
1153 | } | 1187 | } |
1188 | i2c_set_clientdata(client, dev); | ||
1154 | 1189 | ||
1155 | return &dev->fe; | 1190 | dev_info(&dev->client->dev, "Afatech AF9033 successfully attached\n"); |
1156 | 1191 | return 0; | |
1157 | err: | 1192 | err_kfree: |
1158 | kfree(dev); | 1193 | kfree(dev); |
1159 | return NULL; | 1194 | err: |
1195 | dev_dbg(&client->dev, "failed %d\n", ret); | ||
1196 | return ret; | ||
1160 | } | 1197 | } |
1161 | EXPORT_SYMBOL(af9033_attach); | ||
1162 | 1198 | ||
1163 | static struct dvb_frontend_ops af9033_ops = { | 1199 | static int af9033_remove(struct i2c_client *client) |
1164 | .delsys = { SYS_DVBT }, | 1200 | { |
1165 | .info = { | 1201 | struct af9033_dev *dev = i2c_get_clientdata(client); |
1166 | .name = "Afatech AF9033 (DVB-T)", | ||
1167 | .frequency_min = 174000000, | ||
1168 | .frequency_max = 862000000, | ||
1169 | .frequency_stepsize = 250000, | ||
1170 | .frequency_tolerance = 0, | ||
1171 | .caps = FE_CAN_FEC_1_2 | | ||
1172 | FE_CAN_FEC_2_3 | | ||
1173 | FE_CAN_FEC_3_4 | | ||
1174 | FE_CAN_FEC_5_6 | | ||
1175 | FE_CAN_FEC_7_8 | | ||
1176 | FE_CAN_FEC_AUTO | | ||
1177 | FE_CAN_QPSK | | ||
1178 | FE_CAN_QAM_16 | | ||
1179 | FE_CAN_QAM_64 | | ||
1180 | FE_CAN_QAM_AUTO | | ||
1181 | FE_CAN_TRANSMISSION_MODE_AUTO | | ||
1182 | FE_CAN_GUARD_INTERVAL_AUTO | | ||
1183 | FE_CAN_HIERARCHY_AUTO | | ||
1184 | FE_CAN_RECOVER | | ||
1185 | FE_CAN_MUTE_TS | ||
1186 | }, | ||
1187 | 1202 | ||
1188 | .release = af9033_release, | 1203 | dev_dbg(&client->dev, "%s\n", __func__); |
1189 | 1204 | ||
1190 | .init = af9033_init, | 1205 | dev->fe.ops.release = NULL; |
1191 | .sleep = af9033_sleep, | 1206 | dev->fe.demodulator_priv = NULL; |
1207 | kfree(dev); | ||
1192 | 1208 | ||
1193 | .get_tune_settings = af9033_get_tune_settings, | 1209 | return 0; |
1194 | .set_frontend = af9033_set_frontend, | 1210 | } |
1195 | .get_frontend = af9033_get_frontend, | ||
1196 | 1211 | ||
1197 | .read_status = af9033_read_status, | 1212 | static const struct i2c_device_id af9033_id_table[] = { |
1198 | .read_snr = af9033_read_snr, | 1213 | {"af9033", 0}, |
1199 | .read_signal_strength = af9033_read_signal_strength, | 1214 | {} |
1200 | .read_ber = af9033_read_ber, | 1215 | }; |
1201 | .read_ucblocks = af9033_read_ucblocks, | 1216 | MODULE_DEVICE_TABLE(i2c, af9033_id_table); |
1202 | 1217 | ||
1203 | .i2c_gate_ctrl = af9033_i2c_gate_ctrl, | 1218 | static struct i2c_driver af9033_driver = { |
1219 | .driver = { | ||
1220 | .owner = THIS_MODULE, | ||
1221 | .name = "af9033", | ||
1222 | }, | ||
1223 | .probe = af9033_probe, | ||
1224 | .remove = af9033_remove, | ||
1225 | .id_table = af9033_id_table, | ||
1204 | }; | 1226 | }; |
1205 | 1227 | ||
1228 | module_i2c_driver(af9033_driver); | ||
1229 | |||
1206 | MODULE_AUTHOR("Antti Palosaari <crope@iki.fi>"); | 1230 | MODULE_AUTHOR("Antti Palosaari <crope@iki.fi>"); |
1207 | MODULE_DESCRIPTION("Afatech AF9033 DVB-T demodulator driver"); | 1231 | MODULE_DESCRIPTION("Afatech AF9033 DVB-T demodulator driver"); |
1208 | MODULE_LICENSE("GPL"); | 1232 | MODULE_LICENSE("GPL"); |
diff --git a/drivers/media/dvb-frontends/af9033.h b/drivers/media/dvb-frontends/af9033.h index b95a6d438eca..1b968d0fcb17 100644 --- a/drivers/media/dvb-frontends/af9033.h +++ b/drivers/media/dvb-frontends/af9033.h | |||
@@ -80,8 +80,18 @@ struct af9033_config { | |||
80 | * | 80 | * |
81 | */ | 81 | */ |
82 | bool dyn0_clk; | 82 | bool dyn0_clk; |
83 | }; | ||
84 | 83 | ||
84 | /* | ||
85 | * PID filter ops | ||
86 | */ | ||
87 | struct af9033_ops *ops; | ||
88 | |||
89 | /* | ||
90 | * frontend | ||
91 | * returned by that driver | ||
92 | */ | ||
93 | struct dvb_frontend **fe; | ||
94 | }; | ||
85 | 95 | ||
86 | struct af9033_ops { | 96 | struct af9033_ops { |
87 | int (*pid_filter_ctrl)(struct dvb_frontend *fe, int onoff); | 97 | int (*pid_filter_ctrl)(struct dvb_frontend *fe, int onoff); |
@@ -89,36 +99,4 @@ struct af9033_ops { | |||
89 | int onoff); | 99 | int onoff); |
90 | }; | 100 | }; |
91 | 101 | ||
92 | |||
93 | #if IS_ENABLED(CONFIG_DVB_AF9033) | ||
94 | extern | ||
95 | struct dvb_frontend *af9033_attach(const struct af9033_config *config, | ||
96 | struct i2c_adapter *i2c, | ||
97 | struct af9033_ops *ops); | ||
98 | |||
99 | #else | ||
100 | static inline | ||
101 | struct dvb_frontend *af9033_attach(const struct af9033_config *config, | ||
102 | struct i2c_adapter *i2c, | ||
103 | struct af9033_ops *ops) | ||
104 | { | ||
105 | pr_warn("%s: driver disabled by Kconfig\n", __func__); | ||
106 | return NULL; | ||
107 | } | ||
108 | |||
109 | static inline int af9033_pid_filter_ctrl(struct dvb_frontend *fe, int onoff) | ||
110 | { | ||
111 | pr_warn("%s: driver disabled by Kconfig\n", __func__); | ||
112 | return -ENODEV; | ||
113 | } | ||
114 | |||
115 | static inline int af9033_pid_filter(struct dvb_frontend *fe, int index, u16 pid, | ||
116 | int onoff) | ||
117 | { | ||
118 | pr_warn("%s: driver disabled by Kconfig\n", __func__); | ||
119 | return -ENODEV; | ||
120 | } | ||
121 | |||
122 | #endif | ||
123 | |||
124 | #endif /* AF9033_H */ | 102 | #endif /* AF9033_H */ |
diff --git a/drivers/media/usb/dvb-usb-v2/af9035.c b/drivers/media/usb/dvb-usb-v2/af9035.c index 533c96e4fbb6..6534e44b42b6 100644 --- a/drivers/media/usb/dvb-usb-v2/af9035.c +++ b/drivers/media/usb/dvb-usb-v2/af9035.c | |||
@@ -305,6 +305,19 @@ static int af9035_i2c_master_xfer(struct i2c_adapter *adap, | |||
305 | * NOTE: As a firmware knows tuner type there is very small possibility | 305 | * NOTE: As a firmware knows tuner type there is very small possibility |
306 | * there could be some tuner I2C hacks done by firmware and this may | 306 | * there could be some tuner I2C hacks done by firmware and this may |
307 | * lead problems if firmware expects those bytes are used. | 307 | * lead problems if firmware expects those bytes are used. |
308 | * | ||
309 | * TODO: Here is few hacks. AF9035 chip integrates AF9033 demodulator. | ||
310 | * IT9135 chip integrates AF9033 demodulator and RF tuner. For dual | ||
311 | * tuner devices, there is also external AF9033 demodulator connected | ||
312 | * via external I2C bus. All AF9033 demod I2C traffic, both single and | ||
313 | * dual tuner configuration, is covered by firmware - actual USB IO | ||
314 | * looks just like a memory access. | ||
315 | * In case of IT913x chip, there is own tuner driver. It is implemented | ||
316 | * currently as a I2C driver, even tuner IP block is likely build | ||
317 | * directly into the demodulator memory space and there is no own I2C | ||
318 | * bus. I2C subsystem does not allow register multiple devices to same | ||
319 | * bus, having same slave address. Due to that we reuse demod address, | ||
320 | * shifted by one bit, on that case. | ||
308 | */ | 321 | */ |
309 | if (num == 2 && !(msg[0].flags & I2C_M_RD) && | 322 | if (num == 2 && !(msg[0].flags & I2C_M_RD) && |
310 | (msg[1].flags & I2C_M_RD)) { | 323 | (msg[1].flags & I2C_M_RD)) { |
@@ -312,12 +325,14 @@ static int af9035_i2c_master_xfer(struct i2c_adapter *adap, | |||
312 | /* TODO: correct limits > 40 */ | 325 | /* TODO: correct limits > 40 */ |
313 | ret = -EOPNOTSUPP; | 326 | ret = -EOPNOTSUPP; |
314 | } else if ((msg[0].addr == state->af9033_config[0].i2c_addr) || | 327 | } else if ((msg[0].addr == state->af9033_config[0].i2c_addr) || |
315 | (msg[0].addr == state->af9033_config[1].i2c_addr)) { | 328 | (msg[0].addr == state->af9033_config[1].i2c_addr) || |
329 | (state->chip_type == 0x9135)) { | ||
316 | /* demod access via firmware interface */ | 330 | /* demod access via firmware interface */ |
317 | u32 reg = msg[0].buf[0] << 16 | msg[0].buf[1] << 8 | | 331 | u32 reg = msg[0].buf[0] << 16 | msg[0].buf[1] << 8 | |
318 | msg[0].buf[2]; | 332 | msg[0].buf[2]; |
319 | 333 | ||
320 | if (msg[0].addr == state->af9033_config[1].i2c_addr) | 334 | if (msg[0].addr == state->af9033_config[1].i2c_addr || |
335 | msg[0].addr == (state->af9033_config[1].i2c_addr >> 1)) | ||
321 | reg |= 0x100000; | 336 | reg |= 0x100000; |
322 | 337 | ||
323 | ret = af9035_rd_regs(d, reg, &msg[1].buf[0], | 338 | ret = af9035_rd_regs(d, reg, &msg[1].buf[0], |
@@ -349,12 +364,14 @@ static int af9035_i2c_master_xfer(struct i2c_adapter *adap, | |||
349 | /* TODO: correct limits > 40 */ | 364 | /* TODO: correct limits > 40 */ |
350 | ret = -EOPNOTSUPP; | 365 | ret = -EOPNOTSUPP; |
351 | } else if ((msg[0].addr == state->af9033_config[0].i2c_addr) || | 366 | } else if ((msg[0].addr == state->af9033_config[0].i2c_addr) || |
352 | (msg[0].addr == state->af9033_config[1].i2c_addr)) { | 367 | (msg[0].addr == state->af9033_config[1].i2c_addr) || |
368 | (state->chip_type == 0x9135)) { | ||
353 | /* demod access via firmware interface */ | 369 | /* demod access via firmware interface */ |
354 | u32 reg = msg[0].buf[0] << 16 | msg[0].buf[1] << 8 | | 370 | u32 reg = msg[0].buf[0] << 16 | msg[0].buf[1] << 8 | |
355 | msg[0].buf[2]; | 371 | msg[0].buf[2]; |
356 | 372 | ||
357 | if (msg[0].addr == state->af9033_config[1].i2c_addr) | 373 | if (msg[0].addr == state->af9033_config[1].i2c_addr || |
374 | msg[0].addr == (state->af9033_config[1].i2c_addr >> 1)) | ||
358 | reg |= 0x100000; | 375 | reg |= 0x100000; |
359 | 376 | ||
360 | ret = af9035_wr_regs(d, reg, &msg[0].buf[3], | 377 | ret = af9035_wr_regs(d, reg, &msg[0].buf[3], |
@@ -1066,6 +1083,8 @@ static int af9035_get_adapter_count(struct dvb_usb_device *d) | |||
1066 | return state->dual_mode + 1; | 1083 | return state->dual_mode + 1; |
1067 | } | 1084 | } |
1068 | 1085 | ||
1086 | static void af9035_exit(struct dvb_usb_device *d); | ||
1087 | |||
1069 | static int af9035_frontend_attach(struct dvb_usb_adapter *adap) | 1088 | static int af9035_frontend_attach(struct dvb_usb_adapter *adap) |
1070 | { | 1089 | { |
1071 | struct state *state = adap_to_priv(adap); | 1090 | struct state *state = adap_to_priv(adap); |
@@ -1080,9 +1099,14 @@ static int af9035_frontend_attach(struct dvb_usb_adapter *adap) | |||
1080 | goto err; | 1099 | goto err; |
1081 | } | 1100 | } |
1082 | 1101 | ||
1083 | /* attach demodulator */ | 1102 | state->af9033_config[adap->id].fe = &adap->fe[0]; |
1084 | adap->fe[0] = dvb_attach(af9033_attach, &state->af9033_config[adap->id], | 1103 | state->af9033_config[adap->id].ops = &state->ops; |
1085 | &d->i2c_adap, &state->ops); | 1104 | ret = af9035_add_i2c_dev(d, "af9033", |
1105 | state->af9033_config[adap->id].i2c_addr, | ||
1106 | &state->af9033_config[adap->id]); | ||
1107 | if (ret) | ||
1108 | goto err; | ||
1109 | |||
1086 | if (adap->fe[0] == NULL) { | 1110 | if (adap->fe[0] == NULL) { |
1087 | ret = -ENODEV; | 1111 | ret = -ENODEV; |
1088 | goto err; | 1112 | goto err; |
@@ -1095,6 +1119,7 @@ static int af9035_frontend_attach(struct dvb_usb_adapter *adap) | |||
1095 | return 0; | 1119 | return 0; |
1096 | 1120 | ||
1097 | err: | 1121 | err: |
1122 | af9035_exit(d); /* remove I2C clients */ | ||
1098 | dev_dbg(&d->udev->dev, "%s: failed=%d\n", __func__, ret); | 1123 | dev_dbg(&d->udev->dev, "%s: failed=%d\n", __func__, ret); |
1099 | 1124 | ||
1100 | return ret; | 1125 | return ret; |
@@ -1332,7 +1357,7 @@ static int af9035_tuner_attach(struct dvb_usb_adapter *adap) | |||
1332 | } | 1357 | } |
1333 | 1358 | ||
1334 | ret = af9035_add_i2c_dev(d, "it913x", | 1359 | ret = af9035_add_i2c_dev(d, "it913x", |
1335 | state->af9033_config[adap->id].i2c_addr, | 1360 | state->af9033_config[adap->id].i2c_addr >> 1, |
1336 | &it913x_config); | 1361 | &it913x_config); |
1337 | if (ret) | 1362 | if (ret) |
1338 | goto err; | 1363 | goto err; |
@@ -1357,7 +1382,7 @@ static int af9035_tuner_attach(struct dvb_usb_adapter *adap) | |||
1357 | } | 1382 | } |
1358 | 1383 | ||
1359 | ret = af9035_add_i2c_dev(d, "it913x", | 1384 | ret = af9035_add_i2c_dev(d, "it913x", |
1360 | state->af9033_config[adap->id].i2c_addr, | 1385 | state->af9033_config[adap->id].i2c_addr >> 1, |
1361 | &it913x_config); | 1386 | &it913x_config); |
1362 | if (ret) | 1387 | if (ret) |
1363 | goto err; | 1388 | goto err; |
@@ -1377,6 +1402,7 @@ static int af9035_tuner_attach(struct dvb_usb_adapter *adap) | |||
1377 | return 0; | 1402 | return 0; |
1378 | 1403 | ||
1379 | err: | 1404 | err: |
1405 | af9035_exit(d); /* remove I2C clients */ | ||
1380 | dev_dbg(&d->udev->dev, "%s: failed=%d\n", __func__, ret); | 1406 | dev_dbg(&d->udev->dev, "%s: failed=%d\n", __func__, ret); |
1381 | 1407 | ||
1382 | return ret; | 1408 | return ret; |
@@ -1435,6 +1461,12 @@ static void af9035_exit(struct dvb_usb_device *d) | |||
1435 | 1461 | ||
1436 | dev_dbg(&d->udev->dev, "%s:\n", __func__); | 1462 | dev_dbg(&d->udev->dev, "%s:\n", __func__); |
1437 | 1463 | ||
1464 | if (state->i2c_client[3]) | ||
1465 | af9035_del_i2c_dev(d); | ||
1466 | |||
1467 | if (state->i2c_client[2]) | ||
1468 | af9035_del_i2c_dev(d); | ||
1469 | |||
1438 | if (state->i2c_client[1]) | 1470 | if (state->i2c_client[1]) |
1439 | af9035_del_i2c_dev(d); | 1471 | af9035_del_i2c_dev(d); |
1440 | 1472 | ||
diff --git a/drivers/media/usb/dvb-usb-v2/af9035.h b/drivers/media/usb/dvb-usb-v2/af9035.h index 0911c4fc860c..21960773df05 100644 --- a/drivers/media/usb/dvb-usb-v2/af9035.h +++ b/drivers/media/usb/dvb-usb-v2/af9035.h | |||
@@ -63,7 +63,7 @@ struct state { | |||
63 | u16 eeprom_addr; | 63 | u16 eeprom_addr; |
64 | struct af9033_config af9033_config[2]; | 64 | struct af9033_config af9033_config[2]; |
65 | struct af9033_ops ops; | 65 | struct af9033_ops ops; |
66 | #define AF9035_I2C_CLIENT_MAX 2 | 66 | #define AF9035_I2C_CLIENT_MAX 4 |
67 | struct i2c_client *i2c_client[AF9035_I2C_CLIENT_MAX]; | 67 | struct i2c_client *i2c_client[AF9035_I2C_CLIENT_MAX]; |
68 | }; | 68 | }; |
69 | 69 | ||