diff options
author | Antti Palosaari <crope@iki.fi> | 2014-08-26 16:14:16 -0400 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@osg.samsung.com> | 2014-09-21 16:48:23 -0400 |
commit | 3b2a5e8c080da37be6135f44d236fe6b796666d9 (patch) | |
tree | 7e299163b51e52afae4717eabc6fef86adfc41d8 | |
parent | c2ba9726c342d113bdc36cfd8e984e30498037c6 (diff) |
[media] it913x: convert to I2C driver
Change the it913x driver to use the I2C high lever tuner
binding model. As af9035 depends on it, add a code there
to do the binding.
[mchehab@osg.samsung.com: Merge 3 patches into one, because
we don't want to break bisect due to the conversion]
Signed-off-by: Antti Palosaari <crope@iki.fi>
Signed-off-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
-rw-r--r-- | drivers/media/tuners/it913x.c | 133 | ||||
-rw-r--r-- | drivers/media/tuners/it913x.h | 33 | ||||
-rw-r--r-- | drivers/media/tuners/it913x_priv.h | 1 | ||||
-rw-r--r-- | drivers/media/usb/dvb-usb-v2/af9035.c | 132 | ||||
-rw-r--r-- | drivers/media/usb/dvb-usb-v2/af9035.h | 3 |
5 files changed, 221 insertions, 81 deletions
diff --git a/drivers/media/tuners/it913x.c b/drivers/media/tuners/it913x.c index 4627925ed117..72fefb753af1 100644 --- a/drivers/media/tuners/it913x.c +++ b/drivers/media/tuners/it913x.c | |||
@@ -23,10 +23,9 @@ | |||
23 | #include "it913x_priv.h" | 23 | #include "it913x_priv.h" |
24 | 24 | ||
25 | struct it913x_state { | 25 | struct it913x_state { |
26 | struct i2c_adapter *i2c_adap; | 26 | struct i2c_client *client; |
27 | u8 i2c_addr; | 27 | struct dvb_frontend *fe; |
28 | u8 chip_ver; | 28 | u8 chip_ver; |
29 | u8 tuner_type; | ||
30 | u8 firmware_ver; | 29 | u8 firmware_ver; |
31 | u16 tun_xtal; | 30 | u16 tun_xtal; |
32 | u8 tun_fdiv; | 31 | u8 tun_fdiv; |
@@ -41,9 +40,9 @@ static int it913x_rd_regs(struct it913x_state *state, | |||
41 | int ret; | 40 | int ret; |
42 | u8 b[3]; | 41 | u8 b[3]; |
43 | struct i2c_msg msg[2] = { | 42 | struct i2c_msg msg[2] = { |
44 | { .addr = state->i2c_addr, .flags = 0, | 43 | { .addr = state->client->addr, .flags = 0, |
45 | .buf = b, .len = sizeof(b) }, | 44 | .buf = b, .len = sizeof(b) }, |
46 | { .addr = state->i2c_addr, .flags = I2C_M_RD, | 45 | { .addr = state->client->addr, .flags = I2C_M_RD, |
47 | .buf = data, .len = count } | 46 | .buf = data, .len = count } |
48 | }; | 47 | }; |
49 | 48 | ||
@@ -52,7 +51,7 @@ static int it913x_rd_regs(struct it913x_state *state, | |||
52 | b[2] = (u8) reg & 0xff; | 51 | b[2] = (u8) reg & 0xff; |
53 | b[0] |= 0x80; /* All reads from demodulator */ | 52 | b[0] |= 0x80; /* All reads from demodulator */ |
54 | 53 | ||
55 | ret = i2c_transfer(state->i2c_adap, msg, 2); | 54 | ret = i2c_transfer(state->client->adapter, msg, 2); |
56 | 55 | ||
57 | return ret; | 56 | return ret; |
58 | } | 57 | } |
@@ -73,7 +72,7 @@ static int it913x_wr_regs(struct it913x_state *state, | |||
73 | { | 72 | { |
74 | u8 b[256]; | 73 | u8 b[256]; |
75 | struct i2c_msg msg[1] = { | 74 | struct i2c_msg msg[1] = { |
76 | { .addr = state->i2c_addr, .flags = 0, | 75 | { .addr = state->client->addr, .flags = 0, |
77 | .buf = b, .len = 3 + count } | 76 | .buf = b, .len = 3 + count } |
78 | }; | 77 | }; |
79 | int ret; | 78 | int ret; |
@@ -86,7 +85,7 @@ static int it913x_wr_regs(struct it913x_state *state, | |||
86 | if (pro == PRO_DMOD) | 85 | if (pro == PRO_DMOD) |
87 | b[0] |= 0x80; | 86 | b[0] |= 0x80; |
88 | 87 | ||
89 | ret = i2c_transfer(state->i2c_adap, msg, 1); | 88 | ret = i2c_transfer(state->client->adapter, msg, 1); |
90 | 89 | ||
91 | if (ret < 0) | 90 | if (ret < 0) |
92 | return -EIO; | 91 | return -EIO; |
@@ -191,8 +190,7 @@ static int it913x_init(struct dvb_frontend *fe) | |||
191 | } | 190 | } |
192 | state->tun_fn_min = state->tun_xtal * reg; | 191 | state->tun_fn_min = state->tun_xtal * reg; |
193 | state->tun_fn_min /= (state->tun_fdiv * nv_val); | 192 | state->tun_fn_min /= (state->tun_fdiv * nv_val); |
194 | dev_dbg(&state->i2c_adap->dev, "%s: Tuner fn_min %d\n", __func__, | 193 | dev_dbg(&state->client->dev, "Tuner fn_min %d\n", state->tun_fn_min); |
195 | state->tun_fn_min); | ||
196 | 194 | ||
197 | if (state->chip_ver > 1) | 195 | if (state->chip_ver > 1) |
198 | msleep(50); | 196 | msleep(50); |
@@ -237,8 +235,8 @@ static int it9137_set_params(struct dvb_frontend *fe) | |||
237 | else | 235 | else |
238 | set_tuner = set_it9137_template; | 236 | set_tuner = set_it9137_template; |
239 | 237 | ||
240 | dev_dbg(&state->i2c_adap->dev, "%s: Tuner Frequency %d Bandwidth %d\n", | 238 | dev_dbg(&state->client->dev, "Tuner Frequency %d Bandwidth %d\n", |
241 | __func__, frequency, bandwidth); | 239 | frequency, bandwidth); |
242 | 240 | ||
243 | if (frequency >= 51000 && frequency <= 440000) { | 241 | if (frequency >= 51000 && frequency <= 440000) { |
244 | l_band = 0; | 242 | l_band = 0; |
@@ -353,15 +351,13 @@ static int it9137_set_params(struct dvb_frontend *fe) | |||
353 | set_tuner[3].reg[0] = temp_f & 0xff; | 351 | set_tuner[3].reg[0] = temp_f & 0xff; |
354 | set_tuner[4].reg[0] = (temp_f >> 8) & 0xff; | 352 | set_tuner[4].reg[0] = (temp_f >> 8) & 0xff; |
355 | 353 | ||
356 | dev_dbg(&state->i2c_adap->dev, "%s: High Frequency = %04x\n", | 354 | dev_dbg(&state->client->dev, "High Frequency = %04x\n", temp_f); |
357 | __func__, temp_f); | ||
358 | 355 | ||
359 | /* Lower frequency */ | 356 | /* Lower frequency */ |
360 | set_tuner[5].reg[0] = freq & 0xff; | 357 | set_tuner[5].reg[0] = freq & 0xff; |
361 | set_tuner[6].reg[0] = (freq >> 8) & 0xff; | 358 | set_tuner[6].reg[0] = (freq >> 8) & 0xff; |
362 | 359 | ||
363 | dev_dbg(&state->i2c_adap->dev, "%s: low Frequency = %04x\n", | 360 | dev_dbg(&state->client->dev, "low Frequency = %04x\n", freq); |
364 | __func__, freq); | ||
365 | 361 | ||
366 | ret = it913x_script_loader(state, set_tuner); | 362 | ret = it913x_script_loader(state, set_tuner); |
367 | 363 | ||
@@ -382,12 +378,6 @@ static int it913x_sleep(struct dvb_frontend *fe) | |||
382 | return it913x_script_loader(state, it9137_tuner_off); | 378 | return it913x_script_loader(state, it9137_tuner_off); |
383 | } | 379 | } |
384 | 380 | ||
385 | static int it913x_release(struct dvb_frontend *fe) | ||
386 | { | ||
387 | kfree(fe->tuner_priv); | ||
388 | return 0; | ||
389 | } | ||
390 | |||
391 | static const struct dvb_tuner_ops it913x_tuner_ops = { | 381 | static const struct dvb_tuner_ops it913x_tuner_ops = { |
392 | .info = { | 382 | .info = { |
393 | .name = "ITE Tech IT913X", | 383 | .name = "ITE Tech IT913X", |
@@ -395,68 +385,91 @@ static const struct dvb_tuner_ops it913x_tuner_ops = { | |||
395 | .frequency_max = 862000000, | 385 | .frequency_max = 862000000, |
396 | }, | 386 | }, |
397 | 387 | ||
398 | .release = it913x_release, | ||
399 | |||
400 | .init = it913x_init, | 388 | .init = it913x_init, |
401 | .sleep = it913x_sleep, | 389 | .sleep = it913x_sleep, |
402 | .set_params = it9137_set_params, | 390 | .set_params = it9137_set_params, |
403 | }; | 391 | }; |
404 | 392 | ||
405 | struct dvb_frontend *it913x_attach(struct dvb_frontend *fe, | 393 | static int it913x_probe(struct i2c_client *client, |
406 | struct i2c_adapter *i2c_adap, u8 i2c_addr, u8 config) | 394 | const struct i2c_device_id *id) |
407 | { | 395 | { |
408 | struct it913x_state *state = NULL; | 396 | struct it913x_config *cfg = client->dev.platform_data; |
397 | struct dvb_frontend *fe = cfg->fe; | ||
398 | struct it913x_state *state; | ||
409 | int ret; | 399 | int ret; |
400 | char *chip_ver_str; | ||
410 | 401 | ||
411 | /* allocate memory for the internal state */ | ||
412 | state = kzalloc(sizeof(struct it913x_state), GFP_KERNEL); | 402 | state = kzalloc(sizeof(struct it913x_state), GFP_KERNEL); |
413 | if (state == NULL) | 403 | if (state == NULL) { |
414 | return NULL; | 404 | ret = -ENOMEM; |
415 | 405 | dev_err(&client->dev, "kzalloc() failed\n"); | |
416 | state->i2c_adap = i2c_adap; | 406 | goto err; |
417 | state->i2c_addr = i2c_addr; | ||
418 | |||
419 | switch (config) { | ||
420 | case AF9033_TUNER_IT9135_38: | ||
421 | case AF9033_TUNER_IT9135_51: | ||
422 | case AF9033_TUNER_IT9135_52: | ||
423 | state->chip_ver = 0x01; | ||
424 | break; | ||
425 | case AF9033_TUNER_IT9135_60: | ||
426 | case AF9033_TUNER_IT9135_61: | ||
427 | case AF9033_TUNER_IT9135_62: | ||
428 | state->chip_ver = 0x02; | ||
429 | break; | ||
430 | default: | ||
431 | dev_dbg(&i2c_adap->dev, | ||
432 | "%s: invalid config=%02x\n", __func__, config); | ||
433 | goto error; | ||
434 | } | 407 | } |
435 | 408 | ||
436 | state->tuner_type = config; | 409 | state->client = client; |
410 | state->fe = cfg->fe; | ||
411 | state->chip_ver = cfg->chip_ver; | ||
437 | state->firmware_ver = 1; | 412 | state->firmware_ver = 1; |
438 | 413 | ||
439 | /* tuner RF initial */ | 414 | /* tuner RF initial */ |
440 | ret = it913x_wr_reg(state, PRO_DMOD, 0xec4c, 0x68); | 415 | ret = it913x_wr_reg(state, PRO_DMOD, 0xec4c, 0x68); |
441 | if (ret < 0) | 416 | if (ret < 0) |
442 | goto error; | 417 | goto err; |
443 | 418 | ||
444 | fe->tuner_priv = state; | 419 | fe->tuner_priv = state; |
445 | memcpy(&fe->ops.tuner_ops, &it913x_tuner_ops, | 420 | memcpy(&fe->ops.tuner_ops, &it913x_tuner_ops, |
446 | sizeof(struct dvb_tuner_ops)); | 421 | sizeof(struct dvb_tuner_ops)); |
422 | i2c_set_clientdata(client, state); | ||
423 | |||
424 | if (state->chip_ver == 1) | ||
425 | chip_ver_str = "AX"; | ||
426 | else if (state->chip_ver == 2) | ||
427 | chip_ver_str = "BX"; | ||
428 | else | ||
429 | chip_ver_str = "??"; | ||
430 | |||
431 | dev_info(&state->client->dev, "ITE IT913X %s successfully attached\n", | ||
432 | chip_ver_str); | ||
433 | dev_dbg(&state->client->dev, "chip_ver=%02x\n", state->chip_ver); | ||
434 | return 0; | ||
435 | err: | ||
436 | dev_dbg(&client->dev, "failed %d\n", ret); | ||
437 | kfree(state); | ||
447 | 438 | ||
448 | dev_info(&i2c_adap->dev, | 439 | return ret; |
449 | "%s: ITE Tech IT913X successfully attached\n", | 440 | } |
450 | KBUILD_MODNAME); | ||
451 | dev_dbg(&i2c_adap->dev, "%s: config=%02x chip_ver=%02x\n", | ||
452 | __func__, config, state->chip_ver); | ||
453 | 441 | ||
454 | return fe; | 442 | static int it913x_remove(struct i2c_client *client) |
455 | error: | 443 | { |
444 | struct it913x_state *state = i2c_get_clientdata(client); | ||
445 | struct dvb_frontend *fe = state->fe; | ||
446 | |||
447 | dev_dbg(&client->dev, "\n"); | ||
448 | |||
449 | memset(&fe->ops.tuner_ops, 0, sizeof(struct dvb_tuner_ops)); | ||
450 | fe->tuner_priv = NULL; | ||
456 | kfree(state); | 451 | kfree(state); |
457 | return NULL; | 452 | |
453 | return 0; | ||
458 | } | 454 | } |
459 | EXPORT_SYMBOL(it913x_attach); | 455 | |
456 | static const struct i2c_device_id it913x_id_table[] = { | ||
457 | {"it913x", 0}, | ||
458 | {} | ||
459 | }; | ||
460 | MODULE_DEVICE_TABLE(i2c, it913x_id_table); | ||
461 | |||
462 | static struct i2c_driver it913x_driver = { | ||
463 | .driver = { | ||
464 | .owner = THIS_MODULE, | ||
465 | .name = "it913x", | ||
466 | }, | ||
467 | .probe = it913x_probe, | ||
468 | .remove = it913x_remove, | ||
469 | .id_table = it913x_id_table, | ||
470 | }; | ||
471 | |||
472 | module_i2c_driver(it913x_driver); | ||
460 | 473 | ||
461 | MODULE_DESCRIPTION("ITE Tech IT913X silicon tuner driver"); | 474 | MODULE_DESCRIPTION("ITE Tech IT913X silicon tuner driver"); |
462 | MODULE_AUTHOR("Antti Palosaari <crope@iki.fi>"); | 475 | MODULE_AUTHOR("Antti Palosaari <crope@iki.fi>"); |
diff --git a/drivers/media/tuners/it913x.h b/drivers/media/tuners/it913x.h index 12dd36bd9e79..9789c4d2a6ea 100644 --- a/drivers/media/tuners/it913x.h +++ b/drivers/media/tuners/it913x.h | |||
@@ -25,21 +25,22 @@ | |||
25 | 25 | ||
26 | #include "dvb_frontend.h" | 26 | #include "dvb_frontend.h" |
27 | 27 | ||
28 | #if defined(CONFIG_MEDIA_TUNER_IT913X) || \ | 28 | /* |
29 | (defined(CONFIG_MEDIA_TUNER_IT913X_MODULE) && defined(MODULE)) | 29 | * I2C address |
30 | extern struct dvb_frontend *it913x_attach(struct dvb_frontend *fe, | 30 | * 0x38, 0x3a, 0x3c, 0x3e |
31 | struct i2c_adapter *i2c_adap, | 31 | */ |
32 | u8 i2c_addr, | 32 | struct it913x_config { |
33 | u8 config); | 33 | /* |
34 | #else | 34 | * pointer to DVB frontend |
35 | static inline struct dvb_frontend *it913x_attach(struct dvb_frontend *fe, | 35 | */ |
36 | struct i2c_adapter *i2c_adap, | 36 | struct dvb_frontend *fe; |
37 | u8 i2c_addr, | 37 | |
38 | u8 config) | 38 | /* |
39 | { | 39 | * chip version |
40 | pr_warn("%s: driver disabled by Kconfig\n", __func__); | 40 | * 1 = IT9135 AX |
41 | return NULL; | 41 | * 2 = IT9135 BX |
42 | } | 42 | */ |
43 | #endif | 43 | u8 chip_ver:2; |
44 | }; | ||
44 | 45 | ||
45 | #endif | 46 | #endif |
diff --git a/drivers/media/tuners/it913x_priv.h b/drivers/media/tuners/it913x_priv.h index 781c98ecf5b6..d624efde80aa 100644 --- a/drivers/media/tuners/it913x_priv.h +++ b/drivers/media/tuners/it913x_priv.h | |||
@@ -24,7 +24,6 @@ | |||
24 | #define IT913X_PRIV_H | 24 | #define IT913X_PRIV_H |
25 | 25 | ||
26 | #include "it913x.h" | 26 | #include "it913x.h" |
27 | #include "af9033.h" | ||
28 | 27 | ||
29 | #define PRO_LINK 0x0 | 28 | #define PRO_LINK 0x0 |
30 | #define PRO_DMOD 0x1 | 29 | #define PRO_DMOD 0x1 |
diff --git a/drivers/media/usb/dvb-usb-v2/af9035.c b/drivers/media/usb/dvb-usb-v2/af9035.c index f37cf7da8c1d..1a5b600dc349 100644 --- a/drivers/media/usb/dvb-usb-v2/af9035.c +++ b/drivers/media/usb/dvb-usb-v2/af9035.c | |||
@@ -193,6 +193,93 @@ static int af9035_wr_reg_mask(struct dvb_usb_device *d, u32 reg, u8 val, | |||
193 | return af9035_wr_regs(d, reg, &val, 1); | 193 | return af9035_wr_regs(d, reg, &val, 1); |
194 | } | 194 | } |
195 | 195 | ||
196 | static int af9035_add_i2c_dev(struct dvb_usb_device *d, char *type, u8 addr, | ||
197 | void *platform_data) | ||
198 | { | ||
199 | int ret, num; | ||
200 | struct state *state = d_to_priv(d); | ||
201 | struct i2c_client *client; | ||
202 | struct i2c_adapter *adapter = &d->i2c_adap; | ||
203 | struct i2c_board_info board_info = { | ||
204 | .addr = addr, | ||
205 | .platform_data = platform_data, | ||
206 | }; | ||
207 | |||
208 | strlcpy(board_info.type, type, I2C_NAME_SIZE); | ||
209 | |||
210 | /* find first free client */ | ||
211 | for (num = 0; num < AF9035_I2C_CLIENT_MAX; num++) { | ||
212 | if (state->i2c_client[num] == NULL) | ||
213 | break; | ||
214 | } | ||
215 | |||
216 | dev_dbg(&d->udev->dev, "%s: num=%d\n", __func__, num); | ||
217 | |||
218 | if (num == AF9035_I2C_CLIENT_MAX) { | ||
219 | dev_err(&d->udev->dev, "%s: I2C client out of index\n", | ||
220 | KBUILD_MODNAME); | ||
221 | ret = -ENODEV; | ||
222 | goto err; | ||
223 | } | ||
224 | |||
225 | request_module(board_info.type); | ||
226 | |||
227 | /* register I2C device */ | ||
228 | client = i2c_new_device(adapter, &board_info); | ||
229 | if (client == NULL || client->dev.driver == NULL) { | ||
230 | ret = -ENODEV; | ||
231 | goto err; | ||
232 | } | ||
233 | |||
234 | /* increase I2C driver usage count */ | ||
235 | if (!try_module_get(client->dev.driver->owner)) { | ||
236 | i2c_unregister_device(client); | ||
237 | ret = -ENODEV; | ||
238 | goto err; | ||
239 | } | ||
240 | |||
241 | state->i2c_client[num] = client; | ||
242 | return 0; | ||
243 | err: | ||
244 | dev_dbg(&d->udev->dev, "%s: failed=%d\n", __func__, ret); | ||
245 | return ret; | ||
246 | } | ||
247 | |||
248 | static void af9035_del_i2c_dev(struct dvb_usb_device *d) | ||
249 | { | ||
250 | int num; | ||
251 | struct state *state = d_to_priv(d); | ||
252 | struct i2c_client *client; | ||
253 | |||
254 | /* find last used client */ | ||
255 | num = AF9035_I2C_CLIENT_MAX; | ||
256 | while (num--) { | ||
257 | if (state->i2c_client[num] != NULL) | ||
258 | break; | ||
259 | } | ||
260 | |||
261 | dev_dbg(&d->udev->dev, "%s: num=%d\n", __func__, num); | ||
262 | |||
263 | if (num == -1) { | ||
264 | dev_err(&d->udev->dev, "%s: I2C client out of index\n", | ||
265 | KBUILD_MODNAME); | ||
266 | goto err; | ||
267 | } | ||
268 | |||
269 | client = state->i2c_client[num]; | ||
270 | |||
271 | /* decrease I2C driver usage count */ | ||
272 | module_put(client->dev.driver->owner); | ||
273 | |||
274 | /* unregister I2C device */ | ||
275 | i2c_unregister_device(client); | ||
276 | |||
277 | state->i2c_client[num] = NULL; | ||
278 | return; | ||
279 | err: | ||
280 | dev_dbg(&d->udev->dev, "%s: failed\n", __func__); | ||
281 | } | ||
282 | |||
196 | static int af9035_i2c_master_xfer(struct i2c_adapter *adap, | 283 | static int af9035_i2c_master_xfer(struct i2c_adapter *adap, |
197 | struct i2c_msg msg[], int num) | 284 | struct i2c_msg msg[], int num) |
198 | { | 285 | { |
@@ -1231,14 +1318,39 @@ static int af9035_tuner_attach(struct dvb_usb_adapter *adap) | |||
1231 | case AF9033_TUNER_IT9135_38: | 1318 | case AF9033_TUNER_IT9135_38: |
1232 | case AF9033_TUNER_IT9135_51: | 1319 | case AF9033_TUNER_IT9135_51: |
1233 | case AF9033_TUNER_IT9135_52: | 1320 | case AF9033_TUNER_IT9135_52: |
1321 | { | ||
1322 | struct it913x_config it913x_config = { | ||
1323 | .fe = adap->fe[0], | ||
1324 | .chip_ver = 1, | ||
1325 | }; | ||
1326 | |||
1327 | ret = af9035_add_i2c_dev(d, "it913x", | ||
1328 | state->af9033_config[adap->id].i2c_addr, | ||
1329 | &it913x_config); | ||
1330 | if (ret) | ||
1331 | goto err; | ||
1332 | |||
1333 | fe = adap->fe[0]; | ||
1334 | break; | ||
1335 | } | ||
1234 | case AF9033_TUNER_IT9135_60: | 1336 | case AF9033_TUNER_IT9135_60: |
1235 | case AF9033_TUNER_IT9135_61: | 1337 | case AF9033_TUNER_IT9135_61: |
1236 | case AF9033_TUNER_IT9135_62: | 1338 | case AF9033_TUNER_IT9135_62: |
1237 | /* attach tuner */ | 1339 | { |
1238 | fe = dvb_attach(it913x_attach, adap->fe[0], &d->i2c_adap, | 1340 | struct it913x_config it913x_config = { |
1341 | .fe = adap->fe[0], | ||
1342 | .chip_ver = 2, | ||
1343 | }; | ||
1344 | |||
1345 | ret = af9035_add_i2c_dev(d, "it913x", | ||
1239 | state->af9033_config[adap->id].i2c_addr, | 1346 | state->af9033_config[adap->id].i2c_addr, |
1240 | state->af9033_config[0].tuner); | 1347 | &it913x_config); |
1348 | if (ret) | ||
1349 | goto err; | ||
1350 | |||
1351 | fe = adap->fe[0]; | ||
1241 | break; | 1352 | break; |
1353 | } | ||
1242 | default: | 1354 | default: |
1243 | fe = NULL; | 1355 | fe = NULL; |
1244 | } | 1356 | } |
@@ -1303,6 +1415,19 @@ err: | |||
1303 | return ret; | 1415 | return ret; |
1304 | } | 1416 | } |
1305 | 1417 | ||
1418 | static void af9035_exit(struct dvb_usb_device *d) | ||
1419 | { | ||
1420 | struct state *state = d_to_priv(d); | ||
1421 | |||
1422 | dev_dbg(&d->udev->dev, "%s:\n", __func__); | ||
1423 | |||
1424 | if (state->i2c_client[1]) | ||
1425 | af9035_del_i2c_dev(d); | ||
1426 | |||
1427 | if (state->i2c_client[0]) | ||
1428 | af9035_del_i2c_dev(d); | ||
1429 | } | ||
1430 | |||
1306 | #if IS_ENABLED(CONFIG_RC_CORE) | 1431 | #if IS_ENABLED(CONFIG_RC_CORE) |
1307 | static int af9035_rc_query(struct dvb_usb_device *d) | 1432 | static int af9035_rc_query(struct dvb_usb_device *d) |
1308 | { | 1433 | { |
@@ -1479,6 +1604,7 @@ static const struct dvb_usb_device_properties af9035_props = { | |||
1479 | .init = af9035_init, | 1604 | .init = af9035_init, |
1480 | .get_rc_config = af9035_get_rc_config, | 1605 | .get_rc_config = af9035_get_rc_config, |
1481 | .get_stream_config = af9035_get_stream_config, | 1606 | .get_stream_config = af9035_get_stream_config, |
1607 | .exit = af9035_exit, | ||
1482 | 1608 | ||
1483 | .get_adapter_count = af9035_get_adapter_count, | 1609 | .get_adapter_count = af9035_get_adapter_count, |
1484 | .adapter = { | 1610 | .adapter = { |
diff --git a/drivers/media/usb/dvb-usb-v2/af9035.h b/drivers/media/usb/dvb-usb-v2/af9035.h index 70ec9c9aeb54..0911c4fc860c 100644 --- a/drivers/media/usb/dvb-usb-v2/af9035.h +++ b/drivers/media/usb/dvb-usb-v2/af9035.h | |||
@@ -62,8 +62,9 @@ struct state { | |||
62 | u8 dual_mode:1; | 62 | u8 dual_mode:1; |
63 | u16 eeprom_addr; | 63 | u16 eeprom_addr; |
64 | struct af9033_config af9033_config[2]; | 64 | struct af9033_config af9033_config[2]; |
65 | |||
66 | struct af9033_ops ops; | 65 | struct af9033_ops ops; |
66 | #define AF9035_I2C_CLIENT_MAX 2 | ||
67 | struct i2c_client *i2c_client[AF9035_I2C_CLIENT_MAX]; | ||
67 | }; | 68 | }; |
68 | 69 | ||
69 | static const u32 clock_lut_af9035[] = { | 70 | static const u32 clock_lut_af9035[] = { |