aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAntti Palosaari <crope@iki.fi>2014-08-26 16:14:16 -0400
committerMauro Carvalho Chehab <mchehab@osg.samsung.com>2014-09-21 16:48:23 -0400
commit3b2a5e8c080da37be6135f44d236fe6b796666d9 (patch)
tree7e299163b51e52afae4717eabc6fef86adfc41d8
parentc2ba9726c342d113bdc36cfd8e984e30498037c6 (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.c133
-rw-r--r--drivers/media/tuners/it913x.h33
-rw-r--r--drivers/media/tuners/it913x_priv.h1
-rw-r--r--drivers/media/usb/dvb-usb-v2/af9035.c132
-rw-r--r--drivers/media/usb/dvb-usb-v2/af9035.h3
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
25struct it913x_state { 25struct 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
385static int it913x_release(struct dvb_frontend *fe)
386{
387 kfree(fe->tuner_priv);
388 return 0;
389}
390
391static const struct dvb_tuner_ops it913x_tuner_ops = { 381static 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
405struct dvb_frontend *it913x_attach(struct dvb_frontend *fe, 393static 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;
435err:
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; 442static int it913x_remove(struct i2c_client *client)
455error: 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}
459EXPORT_SYMBOL(it913x_attach); 455
456static const struct i2c_device_id it913x_id_table[] = {
457 {"it913x", 0},
458 {}
459};
460MODULE_DEVICE_TABLE(i2c, it913x_id_table);
461
462static 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
472module_i2c_driver(it913x_driver);
460 473
461MODULE_DESCRIPTION("ITE Tech IT913X silicon tuner driver"); 474MODULE_DESCRIPTION("ITE Tech IT913X silicon tuner driver");
462MODULE_AUTHOR("Antti Palosaari <crope@iki.fi>"); 475MODULE_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
30extern 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, 32struct it913x_config {
33 u8 config); 33 /*
34#else 34 * pointer to DVB frontend
35static 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
196static 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;
243err:
244 dev_dbg(&d->udev->dev, "%s: failed=%d\n", __func__, ret);
245 return ret;
246}
247
248static 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;
279err:
280 dev_dbg(&d->udev->dev, "%s: failed\n", __func__);
281}
282
196static int af9035_i2c_master_xfer(struct i2c_adapter *adap, 283static 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
1418static 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)
1307static int af9035_rc_query(struct dvb_usb_device *d) 1432static 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
69static const u32 clock_lut_af9035[] = { 70static const u32 clock_lut_af9035[] = {