2 * ITE IT913X silicon tuner driver
4 * Copyright (C) 2011 Malcolm Priestley (tvboxspy@gmail.com)
5 * IT9137 Copyright (C) ITE Tech Inc.
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
20 #include <linux/platform_device.h>
21 #include <linux/regmap.h>
24 struct platform_device
*pdev
;
25 struct regmap
*regmap
;
26 struct dvb_frontend
*fe
;
36 static int it913x_init(struct dvb_frontend
*fe
)
38 struct it913x_dev
*dev
= fe
->tuner_priv
;
39 struct platform_device
*pdev
= dev
->pdev
;
42 u8 iqik_m_cal
, nv_val
, buf
[2];
43 static const u8 nv
[] = {48, 32, 24, 16, 12, 8, 6, 4, 2};
44 unsigned long timeout
;
46 dev_dbg(&pdev
->dev
, "role %u\n", dev
->role
);
48 ret
= regmap_write(dev
->regmap
, 0x80ec4c, 0x68);
52 usleep_range(10000, 100000);
54 ret
= regmap_read(dev
->regmap
, 0x80ec86, &utmp
);
74 dev_err(&pdev
->dev
, "unknown clock identifier %d\n", utmp
);
78 ret
= regmap_read(dev
->regmap
, 0x80ed03, &utmp
);
82 else if (utmp
< ARRAY_SIZE(nv
))
88 timeout
= jiffies
+ msecs_to_jiffies(TIMEOUT
);
89 while (!time_after(jiffies
, timeout
)) {
90 ret
= regmap_bulk_read(dev
->regmap
, 0x80ed23, buf
, 2);
94 utmp
= (buf
[1] << 8) | (buf
[0] << 0);
99 dev_dbg(&pdev
->dev
, "r_fbc_m_bdry took %u ms, val %u\n",
100 jiffies_to_msecs(jiffies
) -
101 (jiffies_to_msecs(timeout
) - TIMEOUT
), utmp
);
103 dev
->fn_min
= dev
->xtal
* utmp
;
104 dev
->fn_min
/= (dev
->fdiv
* nv_val
);
106 dev_dbg(&pdev
->dev
, "fn_min %u\n", dev
->fn_min
);
109 * Chip version BX never sets that flag so we just wait 50ms in that
110 * case. It is possible poll BX similarly than AX and then timeout in
111 * order to get 50ms delay, but that causes about 120 extra I2C
112 * messages. As for now, we just wait and reduce IO.
114 if (dev
->chip_ver
== 1) {
116 timeout
= jiffies
+ msecs_to_jiffies(TIMEOUT
);
117 while (!time_after(jiffies
, timeout
)) {
118 ret
= regmap_read(dev
->regmap
, 0x80ec82, &utmp
);
126 dev_dbg(&pdev
->dev
, "p_tsm_init_mode took %u ms, val %u\n",
127 jiffies_to_msecs(jiffies
) -
128 (jiffies_to_msecs(timeout
) - TIMEOUT
), utmp
);
133 ret
= regmap_write(dev
->regmap
, 0x80ed81, iqik_m_cal
);
137 ret
= regmap_write(dev
->regmap
, 0x80ec57, 0x00);
141 ret
= regmap_write(dev
->regmap
, 0x80ec58, 0x00);
145 ret
= regmap_write(dev
->regmap
, 0x80ec40, 0x01);
153 dev_dbg(&pdev
->dev
, "failed %d\n", ret
);
157 static int it913x_sleep(struct dvb_frontend
*fe
)
159 struct it913x_dev
*dev
= fe
->tuner_priv
;
160 struct platform_device
*pdev
= dev
->pdev
;
163 dev_dbg(&pdev
->dev
, "role %u\n", dev
->role
);
167 ret
= regmap_bulk_write(dev
->regmap
, 0x80ec40, "\x00", 1);
172 * Writing '0x00' to master tuner register '0x80ec08' causes slave tuner
173 * communication lost. Due to that, we cannot put master full sleep.
175 if (dev
->role
== IT913X_ROLE_DUAL_MASTER
)
180 dev_dbg(&pdev
->dev
, "role %u, len %d\n", dev
->role
, len
);
182 ret
= regmap_bulk_write(dev
->regmap
, 0x80ec02,
183 "\x3f\x1f\x3f\x3e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
188 ret
= regmap_bulk_write(dev
->regmap
, 0x80ec12, "\x00\x00\x00\x00", 4);
192 ret
= regmap_bulk_write(dev
->regmap
, 0x80ec17,
193 "\x00\x00\x00\x00\x00\x00\x00\x00\x00", 9);
197 ret
= regmap_bulk_write(dev
->regmap
, 0x80ec22,
198 "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 10);
202 ret
= regmap_bulk_write(dev
->regmap
, 0x80ec20, "\x00", 1);
206 ret
= regmap_bulk_write(dev
->regmap
, 0x80ec3f, "\x01", 1);
212 dev_dbg(&pdev
->dev
, "failed %d\n", ret
);
216 static int it913x_set_params(struct dvb_frontend
*fe
)
218 struct it913x_dev
*dev
= fe
->tuner_priv
;
219 struct platform_device
*pdev
= dev
->pdev
;
220 struct dtv_frontend_properties
*c
= &fe
->dtv_property_cache
;
223 u32 pre_lo_freq
, t_cal_freq
;
224 u16 iqik_m_cal
, n_div
;
225 u8 u8tmp
, n
, l_band
, lna_band
;
227 dev_dbg(&pdev
->dev
, "role=%u, frequency %u, bandwidth_hz %u\n",
228 dev
->role
, c
->frequency
, c
->bandwidth_hz
);
235 if (c
->frequency
<= 74000000) {
238 } else if (c
->frequency
<= 111000000) {
241 } else if (c
->frequency
<= 148000000) {
244 } else if (c
->frequency
<= 222000000) {
247 } else if (c
->frequency
<= 296000000) {
250 } else if (c
->frequency
<= 445000000) {
253 } else if (c
->frequency
<= dev
->fn_min
) {
256 } else if (c
->frequency
<= 950000000) {
264 ret
= regmap_read(dev
->regmap
, 0x80ed81, &utmp
);
268 iqik_m_cal
= utmp
* n_div
;
271 if (dev
->clk_mode
== 0)
272 iqik_m_cal
= (iqik_m_cal
* 9) >> 5;
276 iqik_m_cal
= 0x40 - iqik_m_cal
;
277 if (dev
->clk_mode
== 0)
278 iqik_m_cal
= ~((iqik_m_cal
* 9) >> 5);
280 iqik_m_cal
= ~(iqik_m_cal
>> 1);
283 t_cal_freq
= (c
->frequency
/ 1000) * n_div
* dev
->fdiv
;
284 pre_lo_freq
= t_cal_freq
/ dev
->xtal
;
285 utmp
= pre_lo_freq
* dev
->xtal
;
287 if ((t_cal_freq
- utmp
) >= (dev
->xtal
>> 1))
290 pre_lo_freq
+= (u32
) n
<< 13;
291 /* Frequency OMEGA_IQIK_M_CAL_MID*/
292 t_cal_freq
= pre_lo_freq
+ (u32
)iqik_m_cal
;
293 dev_dbg(&pdev
->dev
, "t_cal_freq %u, pre_lo_freq %u\n",
294 t_cal_freq
, pre_lo_freq
);
296 if (c
->frequency
<= 440000000) {
299 } else if (c
->frequency
<= 484000000) {
302 } else if (c
->frequency
<= 533000000) {
305 } else if (c
->frequency
<= 587000000) {
308 } else if (c
->frequency
<= 645000000) {
311 } else if (c
->frequency
<= 710000000) {
314 } else if (c
->frequency
<= 782000000) {
317 } else if (c
->frequency
<= 860000000) {
320 } else if (c
->frequency
<= 1492000000) {
323 } else if (c
->frequency
<= 1685000000) {
331 /* XXX: latest windows driver does not set that at all */
332 ret
= regmap_write(dev
->regmap
, 0x80ee06, lna_band
);
336 if (c
->bandwidth_hz
<= 5000000)
338 else if (c
->bandwidth_hz
<= 6000000)
340 else if (c
->bandwidth_hz
<= 7000000)
343 u8tmp
= 6; /* 8000000 */
345 ret
= regmap_write(dev
->regmap
, 0x80ec56, u8tmp
);
349 /* XXX: latest windows driver sets different value (a8 != 68) */
350 ret
= regmap_write(dev
->regmap
, 0x80ec4c, 0xa0 | (l_band
<< 3));
354 ret
= regmap_write(dev
->regmap
, 0x80ec4d, (t_cal_freq
>> 0) & 0xff);
358 ret
= regmap_write(dev
->regmap
, 0x80ec4e, (t_cal_freq
>> 8) & 0xff);
362 ret
= regmap_write(dev
->regmap
, 0x80011e, (pre_lo_freq
>> 0) & 0xff);
366 ret
= regmap_write(dev
->regmap
, 0x80011f, (pre_lo_freq
>> 8) & 0xff);
372 dev_dbg(&pdev
->dev
, "failed %d\n", ret
);
376 static const struct dvb_tuner_ops it913x_tuner_ops
= {
378 .name
= "ITE IT913X",
379 .frequency_min_hz
= 174 * MHz
,
380 .frequency_max_hz
= 862 * MHz
,
384 .sleep
= it913x_sleep
,
385 .set_params
= it913x_set_params
,
388 static int it913x_probe(struct platform_device
*pdev
)
390 struct it913x_platform_data
*pdata
= pdev
->dev
.platform_data
;
391 struct dvb_frontend
*fe
= pdata
->fe
;
392 struct it913x_dev
*dev
;
393 const struct platform_device_id
*id
= platform_get_device_id(pdev
);
397 dev
= kzalloc(sizeof(struct it913x_dev
), GFP_KERNEL
);
400 dev_err(&pdev
->dev
, "kzalloc() failed\n");
405 dev
->regmap
= pdata
->regmap
;
407 dev
->chip_ver
= id
->driver_data
;
408 dev
->role
= pdata
->role
;
410 fe
->tuner_priv
= dev
;
411 memcpy(&fe
->ops
.tuner_ops
, &it913x_tuner_ops
,
412 sizeof(struct dvb_tuner_ops
));
413 platform_set_drvdata(pdev
, dev
);
415 if (dev
->chip_ver
== 1)
417 else if (dev
->chip_ver
== 2)
422 dev_info(&pdev
->dev
, "ITE IT913X %s successfully attached\n",
424 dev_dbg(&pdev
->dev
, "chip_ver %u, role %u\n", dev
->chip_ver
, dev
->role
);
427 dev_dbg(&pdev
->dev
, "failed %d\n", ret
);
431 static int it913x_remove(struct platform_device
*pdev
)
433 struct it913x_dev
*dev
= platform_get_drvdata(pdev
);
434 struct dvb_frontend
*fe
= dev
->fe
;
436 dev_dbg(&pdev
->dev
, "\n");
438 memset(&fe
->ops
.tuner_ops
, 0, sizeof(struct dvb_tuner_ops
));
439 fe
->tuner_priv
= NULL
;
445 static const struct platform_device_id it913x_id_table
[] = {
446 {"it9133ax-tuner", 1},
447 {"it9133bx-tuner", 2},
450 MODULE_DEVICE_TABLE(platform
, it913x_id_table
);
452 static struct platform_driver it913x_driver
= {
455 .suppress_bind_attrs
= true,
457 .probe
= it913x_probe
,
458 .remove
= it913x_remove
,
459 .id_table
= it913x_id_table
,
462 module_platform_driver(it913x_driver
);
464 MODULE_DESCRIPTION("ITE IT913X silicon tuner driver");
465 MODULE_AUTHOR("Antti Palosaari <crope@iki.fi>");
466 MODULE_LICENSE("GPL");