aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAntti Palosaari <crope@iki.fi>2011-11-28 18:58:11 -0500
committerMauro Carvalho Chehab <mchehab@redhat.com>2011-12-30 12:31:33 -0500
commitf571e004c396c2ed8c2ba6bfc8a229b6bd5ab724 (patch)
tree7c5559319e97d66212ac1cf0ac5281bed75a8cdc
parente90ab840fb826621c8c01cc9e70ca3f0889fa416 (diff)
[media] af9013: rewrite whole driver
Rewrite whole af9013 demod driver in order to decrease I2C I/O. We need to decrease I2C load since AF9015 (I2C adapter / USB-bridge used) seems to have some problems under heavy I2C traffic. Signed-off-by: Antti Palosaari <crope@iki.fi> Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
-rw-r--r--drivers/media/dvb/dvb-usb/af9015.c82
-rw-r--r--drivers/media/dvb/frontends/af9013.c1700
-rw-r--r--drivers/media/dvb/frontends/af9013.h113
-rw-r--r--drivers/media/dvb/frontends/af9013_priv.h93
4 files changed, 989 insertions, 999 deletions
diff --git a/drivers/media/dvb/dvb-usb/af9015.c b/drivers/media/dvb/dvb-usb/af9015.c
index 033aa8affd8e..7b606b7834b3 100644
--- a/drivers/media/dvb/dvb-usb/af9015.c
+++ b/drivers/media/dvb/dvb-usb/af9015.c
@@ -50,14 +50,14 @@ static int af9015_properties_count = ARRAY_SIZE(af9015_properties);
50 50
51static struct af9013_config af9015_af9013_config[] = { 51static struct af9013_config af9015_af9013_config[] = {
52 { 52 {
53 .demod_address = AF9015_I2C_DEMOD, 53 .i2c_addr = AF9015_I2C_DEMOD,
54 .output_mode = AF9013_OUTPUT_MODE_USB, 54 .ts_mode = AF9013_TS_USB,
55 .api_version = { 0, 1, 9, 0 }, 55 .api_version = { 0, 1, 9, 0 },
56 .gpio[0] = AF9013_GPIO_HI, 56 .gpio[0] = AF9013_GPIO_HI,
57 .gpio[3] = AF9013_GPIO_TUNER_ON, 57 .gpio[3] = AF9013_GPIO_TUNER_ON,
58 58
59 }, { 59 }, {
60 .output_mode = AF9013_OUTPUT_MODE_SERIAL, 60 .ts_mode = AF9013_TS_SERIAL,
61 .api_version = { 0, 1, 9, 0 }, 61 .api_version = { 0, 1, 9, 0 },
62 .gpio[0] = AF9013_GPIO_TUNER_ON, 62 .gpio[0] = AF9013_GPIO_TUNER_ON,
63 .gpio[1] = AF9013_GPIO_LO, 63 .gpio[1] = AF9013_GPIO_LO,
@@ -216,8 +216,8 @@ static int af9015_write_reg_i2c(struct dvb_usb_device *d, u8 addr, u16 reg,
216{ 216{
217 struct req_t req = {WRITE_I2C, addr, reg, 1, 1, 1, &val}; 217 struct req_t req = {WRITE_I2C, addr, reg, 1, 1, 1, &val};
218 218
219 if (addr == af9015_af9013_config[0].demod_address || 219 if (addr == af9015_af9013_config[0].i2c_addr ||
220 addr == af9015_af9013_config[1].demod_address) 220 addr == af9015_af9013_config[1].i2c_addr)
221 req.addr_len = 3; 221 req.addr_len = 3;
222 222
223 return af9015_ctrl_msg(d, &req); 223 return af9015_ctrl_msg(d, &req);
@@ -228,8 +228,8 @@ static int af9015_read_reg_i2c(struct dvb_usb_device *d, u8 addr, u16 reg,
228{ 228{
229 struct req_t req = {READ_I2C, addr, reg, 0, 1, 1, val}; 229 struct req_t req = {READ_I2C, addr, reg, 0, 1, 1, val};
230 230
231 if (addr == af9015_af9013_config[0].demod_address || 231 if (addr == af9015_af9013_config[0].i2c_addr ||
232 addr == af9015_af9013_config[1].demod_address) 232 addr == af9015_af9013_config[1].i2c_addr)
233 req.addr_len = 3; 233 req.addr_len = 3;
234 234
235 return af9015_ctrl_msg(d, &req); 235 return af9015_ctrl_msg(d, &req);
@@ -271,8 +271,8 @@ Due to that the only way to select correct tuner is use demodulator I2C-gate.
271 return -EAGAIN; 271 return -EAGAIN;
272 272
273 while (i < num) { 273 while (i < num) {
274 if (msg[i].addr == af9015_af9013_config[0].demod_address || 274 if (msg[i].addr == af9015_af9013_config[0].i2c_addr ||
275 msg[i].addr == af9015_af9013_config[1].demod_address) { 275 msg[i].addr == af9015_af9013_config[1].i2c_addr) {
276 addr = msg[i].buf[0] << 8; 276 addr = msg[i].buf[0] << 8;
277 addr += msg[i].buf[1]; 277 addr += msg[i].buf[1];
278 mbox = msg[i].buf[2]; 278 mbox = msg[i].buf[2];
@@ -288,8 +288,7 @@ Due to that the only way to select correct tuner is use demodulator I2C-gate.
288 ret = -EOPNOTSUPP; 288 ret = -EOPNOTSUPP;
289 goto error; 289 goto error;
290 } 290 }
291 if (msg[i].addr == 291 if (msg[i].addr == af9015_af9013_config[0].i2c_addr)
292 af9015_af9013_config[0].demod_address)
293 req.cmd = READ_MEMORY; 292 req.cmd = READ_MEMORY;
294 else 293 else
295 req.cmd = READ_I2C; 294 req.cmd = READ_I2C;
@@ -307,7 +306,7 @@ Due to that the only way to select correct tuner is use demodulator I2C-gate.
307 goto error; 306 goto error;
308 } 307 }
309 if (msg[i].addr == 308 if (msg[i].addr ==
310 af9015_af9013_config[0].demod_address) { 309 af9015_af9013_config[0].i2c_addr) {
311 ret = -EINVAL; 310 ret = -EINVAL;
312 goto error; 311 goto error;
313 } 312 }
@@ -325,8 +324,7 @@ Due to that the only way to select correct tuner is use demodulator I2C-gate.
325 ret = -EOPNOTSUPP; 324 ret = -EOPNOTSUPP;
326 goto error; 325 goto error;
327 } 326 }
328 if (msg[i].addr == 327 if (msg[i].addr == af9015_af9013_config[0].i2c_addr)
329 af9015_af9013_config[0].demod_address)
330 req.cmd = WRITE_MEMORY; 328 req.cmd = WRITE_MEMORY;
331 else 329 else
332 req.cmd = WRITE_I2C; 330 req.cmd = WRITE_I2C;
@@ -508,7 +506,7 @@ static int af9015_copy_firmware(struct dvb_usb_device *d)
508 msleep(100); 506 msleep(100);
509 507
510 ret = af9015_read_reg_i2c(d, 508 ret = af9015_read_reg_i2c(d,
511 af9015_af9013_config[1].demod_address, 0x98be, &val); 509 af9015_af9013_config[1].i2c_addr, 0x98be, &val);
512 if (ret) 510 if (ret)
513 goto error; 511 goto error;
514 else 512 else
@@ -536,7 +534,7 @@ static int af9015_copy_firmware(struct dvb_usb_device *d)
536 goto error; 534 goto error;
537 535
538 /* request boot firmware */ 536 /* request boot firmware */
539 ret = af9015_write_reg_i2c(d, af9015_af9013_config[1].demod_address, 537 ret = af9015_write_reg_i2c(d, af9015_af9013_config[1].i2c_addr,
540 0xe205, 1); 538 0xe205, 1);
541 deb_info("%s: firmware boot cmd status:%d\n", __func__, ret); 539 deb_info("%s: firmware boot cmd status:%d\n", __func__, ret);
542 if (ret) 540 if (ret)
@@ -547,7 +545,7 @@ static int af9015_copy_firmware(struct dvb_usb_device *d)
547 545
548 /* check firmware status */ 546 /* check firmware status */
549 ret = af9015_read_reg_i2c(d, 547 ret = af9015_read_reg_i2c(d,
550 af9015_af9013_config[1].demod_address, 0x98be, &val); 548 af9015_af9013_config[1].i2c_addr, 0x98be, &val);
551 deb_info("%s: firmware status cmd status:%d fw status:%02x\n", 549 deb_info("%s: firmware status cmd status:%d fw status:%02x\n",
552 __func__, ret, val); 550 __func__, ret, val);
553 if (ret) 551 if (ret)
@@ -840,7 +838,7 @@ static int af9015_read_config(struct usb_device *udev)
840 if (ret) 838 if (ret)
841 goto error; 839 goto error;
842 840
843 deb_info("%s: IR mode:%d\n", __func__, val); 841 deb_info("%s: IR mode=%d\n", __func__, val);
844 for (i = 0; i < af9015_properties_count; i++) { 842 for (i = 0; i < af9015_properties_count; i++) {
845 if (val == AF9015_IR_MODE_DISABLED) 843 if (val == AF9015_IR_MODE_DISABLED)
846 af9015_properties[i].rc.core.rc_codes = NULL; 844 af9015_properties[i].rc.core.rc_codes = NULL;
@@ -854,7 +852,7 @@ static int af9015_read_config(struct usb_device *udev)
854 if (ret) 852 if (ret)
855 goto error; 853 goto error;
856 af9015_config.dual_mode = val; 854 af9015_config.dual_mode = val;
857 deb_info("%s: TS mode:%d\n", __func__, af9015_config.dual_mode); 855 deb_info("%s: TS mode=%d\n", __func__, af9015_config.dual_mode);
858 856
859 /* Set adapter0 buffer size according to USB port speed, adapter1 buffer 857 /* Set adapter0 buffer size according to USB port speed, adapter1 buffer
860 size can be static because it is enabled only USB2.0 */ 858 size can be static because it is enabled only USB2.0 */
@@ -878,7 +876,7 @@ static int af9015_read_config(struct usb_device *udev)
878 ret = af9015_rw_udev(udev, &req); 876 ret = af9015_rw_udev(udev, &req);
879 if (ret) 877 if (ret)
880 goto error; 878 goto error;
881 af9015_af9013_config[1].demod_address = val; 879 af9015_af9013_config[1].i2c_addr = val;
882 880
883 /* enable 2nd adapter */ 881 /* enable 2nd adapter */
884 for (i = 0; i < af9015_properties_count; i++) 882 for (i = 0; i < af9015_properties_count; i++)
@@ -900,34 +898,38 @@ static int af9015_read_config(struct usb_device *udev)
900 goto error; 898 goto error;
901 switch (val) { 899 switch (val) {
902 case 0: 900 case 0:
903 af9015_af9013_config[i].adc_clock = 28800; 901 af9015_af9013_config[i].clock = 28800000;
904 break; 902 break;
905 case 1: 903 case 1:
906 af9015_af9013_config[i].adc_clock = 20480; 904 af9015_af9013_config[i].clock = 20480000;
907 break; 905 break;
908 case 2: 906 case 2:
909 af9015_af9013_config[i].adc_clock = 28000; 907 af9015_af9013_config[i].clock = 28000000;
910 break; 908 break;
911 case 3: 909 case 3:
912 af9015_af9013_config[i].adc_clock = 25000; 910 af9015_af9013_config[i].clock = 25000000;
913 break; 911 break;
914 }; 912 };
915 deb_info("%s: [%d] xtal:%d set adc_clock:%d\n", __func__, i, 913 deb_info("%s: [%d] xtal=%d set clock=%d\n", __func__, i,
916 val, af9015_af9013_config[i].adc_clock); 914 val, af9015_af9013_config[i].clock);
917 915
918 /* tuner IF */ 916 /* IF frequency */
919 req.addr = AF9015_EEPROM_IF1H + offset; 917 req.addr = AF9015_EEPROM_IF1H + offset;
920 ret = af9015_rw_udev(udev, &req); 918 ret = af9015_rw_udev(udev, &req);
921 if (ret) 919 if (ret)
922 goto error; 920 goto error;
923 af9015_af9013_config[i].tuner_if = val << 8; 921
922 af9015_af9013_config[i].if_frequency = val << 8;
923
924 req.addr = AF9015_EEPROM_IF1L + offset; 924 req.addr = AF9015_EEPROM_IF1L + offset;
925 ret = af9015_rw_udev(udev, &req); 925 ret = af9015_rw_udev(udev, &req);
926 if (ret) 926 if (ret)
927 goto error; 927 goto error;
928 af9015_af9013_config[i].tuner_if += val; 928
929 deb_info("%s: [%d] IF1:%d\n", __func__, i, 929 af9015_af9013_config[i].if_frequency += val;
930 af9015_af9013_config[0].tuner_if); 930 af9015_af9013_config[i].if_frequency *= 1000;
931 deb_info("%s: [%d] IF frequency=%d\n", __func__, i,
932 af9015_af9013_config[0].if_frequency);
931 933
932 /* MT2060 IF1 */ 934 /* MT2060 IF1 */
933 req.addr = AF9015_EEPROM_MT2060_IF1H + offset; 935 req.addr = AF9015_EEPROM_MT2060_IF1H + offset;
@@ -940,7 +942,7 @@ static int af9015_read_config(struct usb_device *udev)
940 if (ret) 942 if (ret)
941 goto error; 943 goto error;
942 af9015_config.mt2060_if1[i] += val; 944 af9015_config.mt2060_if1[i] += val;
943 deb_info("%s: [%d] MT2060 IF1:%d\n", __func__, i, 945 deb_info("%s: [%d] MT2060 IF1=%d\n", __func__, i,
944 af9015_config.mt2060_if1[i]); 946 af9015_config.mt2060_if1[i]);
945 947
946 /* tuner */ 948 /* tuner */
@@ -957,30 +959,30 @@ static int af9015_read_config(struct usb_device *udev)
957 case AF9013_TUNER_TDA18271: 959 case AF9013_TUNER_TDA18271:
958 case AF9013_TUNER_QT1010A: 960 case AF9013_TUNER_QT1010A:
959 case AF9013_TUNER_TDA18218: 961 case AF9013_TUNER_TDA18218:
960 af9015_af9013_config[i].rf_spec_inv = 1; 962 af9015_af9013_config[i].spec_inv = 1;
961 break; 963 break;
962 case AF9013_TUNER_MXL5003D: 964 case AF9013_TUNER_MXL5003D:
963 case AF9013_TUNER_MXL5005D: 965 case AF9013_TUNER_MXL5005D:
964 case AF9013_TUNER_MXL5005R: 966 case AF9013_TUNER_MXL5005R:
965 case AF9013_TUNER_MXL5007T: 967 case AF9013_TUNER_MXL5007T:
966 af9015_af9013_config[i].rf_spec_inv = 0; 968 af9015_af9013_config[i].spec_inv = 0;
967 break; 969 break;
968 case AF9013_TUNER_MC44S803: 970 case AF9013_TUNER_MC44S803:
969 af9015_af9013_config[i].gpio[1] = AF9013_GPIO_LO; 971 af9015_af9013_config[i].gpio[1] = AF9013_GPIO_LO;
970 af9015_af9013_config[i].rf_spec_inv = 1; 972 af9015_af9013_config[i].spec_inv = 1;
971 break; 973 break;
972 default: 974 default:
973 warn("tuner id:%d not supported, please report!", val); 975 warn("tuner id=%d not supported, please report!", val);
974 return -ENODEV; 976 return -ENODEV;
975 }; 977 };
976 978
977 af9015_af9013_config[i].tuner = val; 979 af9015_af9013_config[i].tuner = val;
978 deb_info("%s: [%d] tuner id:%d\n", __func__, i, val); 980 deb_info("%s: [%d] tuner id=%d\n", __func__, i, val);
979 } 981 }
980 982
981error: 983error:
982 if (ret) 984 if (ret)
983 err("eeprom read failed:%d", ret); 985 err("eeprom read failed=%d", ret);
984 986
985 /* AverMedia AVerTV Volar Black HD (A850) device have bad EEPROM 987 /* AverMedia AVerTV Volar Black HD (A850) device have bad EEPROM
986 content :-( Override some wrong values here. Ditto for the 988 content :-( Override some wrong values here. Ditto for the
@@ -998,7 +1000,7 @@ error:
998 af9015_properties[i].num_adapters = 1; 1000 af9015_properties[i].num_adapters = 1;
999 1001
1000 /* set correct IF */ 1002 /* set correct IF */
1001 af9015_af9013_config[0].tuner_if = 4570; 1003 af9015_af9013_config[0].if_frequency = 4570000;
1002 } 1004 }
1003 1005
1004 return ret; 1006 return ret;
@@ -1156,7 +1158,7 @@ static int af9015_af9013_sleep(struct dvb_frontend *fe)
1156 if (mutex_lock_interruptible(&adap->dev->usb_mutex)) 1158 if (mutex_lock_interruptible(&adap->dev->usb_mutex))
1157 return -EAGAIN; 1159 return -EAGAIN;
1158 1160
1159 ret = priv->init[adap->id](fe); 1161 ret = priv->sleep[adap->id](fe);
1160 1162
1161 mutex_unlock(&adap->dev->usb_mutex); 1163 mutex_unlock(&adap->dev->usb_mutex);
1162 1164
diff --git a/drivers/media/dvb/frontends/af9013.c b/drivers/media/dvb/frontends/af9013.c
index f4276e471d38..77862fe2c65e 100644
--- a/drivers/media/dvb/frontends/af9013.c
+++ b/drivers/media/dvb/frontends/af9013.c
@@ -2,6 +2,7 @@
2 * Afatech AF9013 demodulator driver 2 * Afatech AF9013 demodulator driver
3 * 3 *
4 * Copyright (C) 2007 Antti Palosaari <crope@iki.fi> 4 * Copyright (C) 2007 Antti Palosaari <crope@iki.fi>
5 * Copyright (C) 2011 Antti Palosaari <crope@iki.fi>
5 * 6 *
6 * Thanks to Afatech who kindly provided information. 7 * Thanks to Afatech who kindly provided information.
7 * 8 *
@@ -21,25 +22,15 @@
21 * 22 *
22 */ 23 */
23 24
24#include <linux/kernel.h>
25#include <linux/module.h>
26#include <linux/moduleparam.h>
27#include <linux/init.h>
28#include <linux/delay.h>
29#include <linux/string.h>
30#include <linux/slab.h>
31#include <linux/firmware.h>
32
33#include "dvb_frontend.h"
34#include "af9013_priv.h" 25#include "af9013_priv.h"
35#include "af9013.h"
36 26
37int af9013_debug; 27int af9013_debug;
28module_param_named(debug, af9013_debug, int, 0644);
29MODULE_PARM_DESC(debug, "Turn on/off frontend debugging (default:off).");
38 30
39struct af9013_state { 31struct af9013_state {
40 struct i2c_adapter *i2c; 32 struct i2c_adapter *i2c;
41 struct dvb_frontend frontend; 33 struct dvb_frontend fe;
42
43 struct af9013_config config; 34 struct af9013_config config;
44 35
45 /* tuner/demod RF and IF AGC limits used for signal strength calc */ 36 /* tuner/demod RF and IF AGC limits used for signal strength calc */
@@ -48,107 +39,178 @@ struct af9013_state {
48 u32 ber; 39 u32 ber;
49 u32 ucblocks; 40 u32 ucblocks;
50 u16 snr; 41 u16 snr;
51 u32 frequency; 42 u32 bandwidth_hz;
52 unsigned long next_statistics_check; 43 fe_status_t fe_status;
44 unsigned long set_frontend_jiffies;
45 unsigned long read_status_jiffies;
46 bool first_tune;
47 bool i2c_gate_state;
48 unsigned int statistics_step:3;
49 struct delayed_work statistics_work;
53}; 50};
54 51
55static u8 regmask[8] = { 0x01, 0x03, 0x07, 0x0f, 0x1f, 0x3f, 0x7f, 0xff }; 52/* write multiple registers */
56 53static int af9013_wr_regs_i2c(struct af9013_state *priv, u8 mbox, u16 reg,
57static int af9013_write_regs(struct af9013_state *state, u8 mbox, u16 reg, 54 const u8 *val, int len)
58 u8 *val, u8 len)
59{ 55{
56 int ret;
60 u8 buf[3+len]; 57 u8 buf[3+len];
61 struct i2c_msg msg = { 58 struct i2c_msg msg[1] = {
62 .addr = state->config.demod_address, 59 {
63 .flags = 0, 60 .addr = priv->config.i2c_addr,
64 .len = sizeof(buf), 61 .flags = 0,
65 .buf = buf }; 62 .len = sizeof(buf),
66 63 .buf = buf,
67 buf[0] = reg >> 8; 64 }
68 buf[1] = reg & 0xff; 65 };
66
67 buf[0] = (reg >> 8) & 0xff;
68 buf[1] = (reg >> 0) & 0xff;
69 buf[2] = mbox; 69 buf[2] = mbox;
70 memcpy(&buf[3], val, len); 70 memcpy(&buf[3], val, len);
71 71
72 if (i2c_transfer(state->i2c, &msg, 1) != 1) { 72 ret = i2c_transfer(priv->i2c, msg, 1);
73 warn("I2C write failed reg:%04x len:%d", reg, len); 73 if (ret == 1) {
74 return -EREMOTEIO; 74 ret = 0;
75 } else {
76 warn("i2c wr failed=%d reg=%04x len=%d", ret, reg, len);
77 ret = -EREMOTEIO;
75 } 78 }
76 return 0; 79 return ret;
77} 80}
78 81
79static int af9013_write_ofdm_regs(struct af9013_state *state, u16 reg, u8 *val, 82/* read multiple registers */
80 u8 len) 83static int af9013_rd_regs_i2c(struct af9013_state *priv, u8 mbox, u16 reg,
84 u8 *val, int len)
81{ 85{
82 u8 mbox = (1 << 0)|(1 << 1)|((len - 1) << 2)|(0 << 6)|(0 << 7); 86 int ret;
83 return af9013_write_regs(state, mbox, reg, val, len); 87 u8 buf[3];
88 struct i2c_msg msg[2] = {
89 {
90 .addr = priv->config.i2c_addr,
91 .flags = 0,
92 .len = 3,
93 .buf = buf,
94 }, {
95 .addr = priv->config.i2c_addr,
96 .flags = I2C_M_RD,
97 .len = len,
98 .buf = val,
99 }
100 };
101
102 buf[0] = (reg >> 8) & 0xff;
103 buf[1] = (reg >> 0) & 0xff;
104 buf[2] = mbox;
105
106 ret = i2c_transfer(priv->i2c, msg, 2);
107 if (ret == 2) {
108 ret = 0;
109 } else {
110 warn("i2c rd failed=%d reg=%04x len=%d", ret, reg, len);
111 ret = -EREMOTEIO;
112 }
113 return ret;
84} 114}
85 115
86static int af9013_write_ofsm_regs(struct af9013_state *state, u16 reg, u8 *val, 116/* write multiple registers */
87 u8 len) 117static int af9013_wr_regs(struct af9013_state *priv, u16 reg, const u8 *val,
118 int len)
119{
120 int ret, i;
121 u8 mbox = (0 << 7)|(0 << 6)|(1 << 1)|(1 << 0);
122
123 if ((priv->config.ts_mode == AF9013_TS_USB) &
124 ((reg & 0xff00) != 0xff00) & ((reg & 0xff00) != 0xae00)) {
125 mbox |= ((len - 1) << 2);
126 ret = af9013_wr_regs_i2c(priv, mbox, reg, val, len);
127 } else {
128 for (i = 0; i < len; i++) {
129 ret = af9013_wr_regs_i2c(priv, mbox, reg+i, val+i, 1);
130 if (ret)
131 goto err;
132 }
133 }
134
135err:
136 return 0;
137}
138
139/* read multiple registers */
140static int af9013_rd_regs(struct af9013_state *priv, u16 reg, u8 *val, int len)
88{ 141{
89 u8 mbox = (1 << 0)|(1 << 1)|((len - 1) << 2)|(1 << 6)|(1 << 7); 142 int ret, i;
90 return af9013_write_regs(state, mbox, reg, val, len); 143 u8 mbox = (0 << 7)|(0 << 6)|(1 << 1)|(0 << 0);
144
145 if ((priv->config.ts_mode == AF9013_TS_USB) &
146 ((reg & 0xff00) != 0xff00) & ((reg & 0xff00) != 0xae00)) {
147 mbox |= ((len - 1) << 2);
148 ret = af9013_rd_regs_i2c(priv, mbox, reg, val, len);
149 } else {
150 for (i = 0; i < len; i++) {
151 ret = af9013_rd_regs_i2c(priv, mbox, reg+i, val+i, 1);
152 if (ret)
153 goto err;
154 }
155 }
156
157err:
158 return 0;
91} 159}
92 160
93/* write single register */ 161/* write single register */
94static int af9013_write_reg(struct af9013_state *state, u16 reg, u8 val) 162static int af9013_wr_reg(struct af9013_state *priv, u16 reg, u8 val)
95{ 163{
96 return af9013_write_ofdm_regs(state, reg, &val, 1); 164 return af9013_wr_regs(priv, reg, &val, 1);
97} 165}
98 166
99/* read single register */ 167/* read single register */
100static int af9013_read_reg(struct af9013_state *state, u16 reg, u8 *val) 168static int af9013_rd_reg(struct af9013_state *priv, u16 reg, u8 *val)
101{ 169{
102 u8 obuf[3] = { reg >> 8, reg & 0xff, 0 }; 170 return af9013_rd_regs(priv, reg, val, 1);
103 u8 ibuf[1]; 171}
104 struct i2c_msg msg[2] = {
105 {
106 .addr = state->config.demod_address,
107 .flags = 0,
108 .len = sizeof(obuf),
109 .buf = obuf
110 }, {
111 .addr = state->config.demod_address,
112 .flags = I2C_M_RD,
113 .len = sizeof(ibuf),
114 .buf = ibuf
115 }
116 };
117 172
118 if (i2c_transfer(state->i2c, msg, 2) != 2) { 173static int af9013_write_ofsm_regs(struct af9013_state *state, u16 reg, u8 *val,
119 warn("I2C read failed reg:%04x", reg); 174 u8 len)
120 return -EREMOTEIO; 175{
121 } 176 u8 mbox = (1 << 7)|(1 << 6)|((len - 1) << 2)|(1 << 1)|(1 << 0);
122 *val = ibuf[0]; 177 return af9013_wr_regs_i2c(state, mbox, reg, val, len);
123 return 0;
124} 178}
125 179
126static int af9013_write_reg_bits(struct af9013_state *state, u16 reg, u8 pos, 180static int af9013_wr_reg_bits(struct af9013_state *state, u16 reg, int pos,
127 u8 len, u8 val) 181 int len, u8 val)
128{ 182{
129 int ret; 183 int ret;
130 u8 tmp, mask; 184 u8 tmp, mask;
131 185
132 ret = af9013_read_reg(state, reg, &tmp); 186 /* no need for read if whole reg is written */
133 if (ret) 187 if (len != 8) {
134 return ret; 188 ret = af9013_rd_reg(state, reg, &tmp);
189 if (ret)
190 return ret;
135 191
136 mask = regmask[len - 1] << pos; 192 mask = (0xff >> (8 - len)) << pos;
137 tmp = (tmp & ~mask) | ((val << pos) & mask); 193 val <<= pos;
194 tmp &= ~mask;
195 val |= tmp;
196 }
138 197
139 return af9013_write_reg(state, reg, tmp); 198 return af9013_wr_reg(state, reg, val);
140} 199}
141 200
142static int af9013_read_reg_bits(struct af9013_state *state, u16 reg, u8 pos, 201static int af9013_rd_reg_bits(struct af9013_state *state, u16 reg, int pos,
143 u8 len, u8 *val) 202 int len, u8 *val)
144{ 203{
145 int ret; 204 int ret;
146 u8 tmp; 205 u8 tmp;
147 206
148 ret = af9013_read_reg(state, reg, &tmp); 207 ret = af9013_rd_reg(state, reg, &tmp);
149 if (ret) 208 if (ret)
150 return ret; 209 return ret;
151 *val = (tmp >> pos) & regmask[len - 1]; 210
211 *val = (tmp >> pos);
212 *val &= (0xff >> (8 - len));
213
152 return 0; 214 return 0;
153} 215}
154 216
@@ -157,10 +219,13 @@ static int af9013_set_gpio(struct af9013_state *state, u8 gpio, u8 gpioval)
157 int ret; 219 int ret;
158 u8 pos; 220 u8 pos;
159 u16 addr; 221 u16 addr;
160 deb_info("%s: gpio:%d gpioval:%02x\n", __func__, gpio, gpioval);
161 222
162/* GPIO0 & GPIO1 0xd735 223 dbg("%s: gpio=%d gpioval=%02x", __func__, gpio, gpioval);
163 GPIO2 & GPIO3 0xd736 */ 224
225 /*
226 * GPIO0 & GPIO1 0xd735
227 * GPIO2 & GPIO3 0xd736
228 */
164 229
165 switch (gpio) { 230 switch (gpio) {
166 case 0: 231 case 0:
@@ -175,7 +240,7 @@ static int af9013_set_gpio(struct af9013_state *state, u8 gpio, u8 gpioval)
175 default: 240 default:
176 err("invalid gpio:%d\n", gpio); 241 err("invalid gpio:%d\n", gpio);
177 ret = -EINVAL; 242 ret = -EINVAL;
178 goto error; 243 goto err;
179 }; 244 };
180 245
181 switch (gpio) { 246 switch (gpio) {
@@ -190,16 +255,21 @@ static int af9013_set_gpio(struct af9013_state *state, u8 gpio, u8 gpioval)
190 break; 255 break;
191 }; 256 };
192 257
193 ret = af9013_write_reg_bits(state, addr, pos, 4, gpioval); 258 ret = af9013_wr_reg_bits(state, addr, pos, 4, gpioval);
259 if (ret)
260 goto err;
194 261
195error: 262 return ret;
263err:
264 dbg("%s: failed=%d", __func__, ret);
196 return ret; 265 return ret;
197} 266}
198 267
199static u32 af913_div(u32 a, u32 b, u32 x) 268static u32 af913_div(u32 a, u32 b, u32 x)
200{ 269{
201 u32 r = 0, c = 0, i; 270 u32 r = 0, c = 0, i;
202 deb_info("%s: a:%d b:%d x:%d\n", __func__, a, b, x); 271
272 dbg("%s: a=%d b=%d x=%d", __func__, a, b, x);
203 273
204 if (a > b) { 274 if (a > b) {
205 c = a / b; 275 c = a / b;
@@ -216,182 +286,408 @@ static u32 af913_div(u32 a, u32 b, u32 x)
216 } 286 }
217 r = (c << (u32)x) + r; 287 r = (c << (u32)x) + r;
218 288
219 deb_info("%s: a:%d b:%d x:%d r:%d r:%x\n", __func__, a, b, x, r, r); 289 dbg("%s: a=%d b=%d x=%d r=%x", __func__, a, b, x, r);
220 return r; 290 return r;
221} 291}
222 292
223static int af9013_set_coeff(struct af9013_state *state, fe_bandwidth_t bw) 293static int af9013_power_ctrl(struct af9013_state *state, u8 onoff)
224{ 294{
225 int ret, i, j, found; 295 int ret, i;
226 deb_info("%s: adc_clock:%d bw:%d\n", __func__, 296 u8 tmp;
227 state->config.adc_clock, bw);
228
229 /* lookup coeff from table */
230 for (i = 0, found = 0; i < ARRAY_SIZE(coeff_table); i++) {
231 if (coeff_table[i].adc_clock == state->config.adc_clock &&
232 coeff_table[i].bw == bw) {
233 found = 1;
234 break;
235 }
236 }
237 297
238 if (!found) { 298 dbg("%s: onoff=%d", __func__, onoff);
239 err("invalid bw or clock"); 299
240 ret = -EINVAL; 300 /* enable reset */
241 goto error; 301 ret = af9013_wr_reg_bits(state, 0xd417, 4, 1, 1);
302 if (ret)
303 goto err;
304
305 /* start reset mechanism */
306 ret = af9013_wr_reg(state, 0xaeff, 1);
307 if (ret)
308 goto err;
309
310 /* wait reset performs */
311 for (i = 0; i < 150; i++) {
312 ret = af9013_rd_reg_bits(state, 0xd417, 1, 1, &tmp);
313 if (ret)
314 goto err;
315
316 if (tmp)
317 break; /* reset done */
318
319 usleep_range(5000, 25000);
242 } 320 }
243 321
244 deb_info("%s: coeff: ", __func__); 322 if (!tmp)
245 debug_dump(coeff_table[i].val, sizeof(coeff_table[i].val), deb_info); 323 return -ETIMEDOUT;
246 324
247 /* program */ 325 if (onoff) {
248 for (j = 0; j < sizeof(coeff_table[i].val); j++) { 326 /* clear reset */
249 ret = af9013_write_reg(state, 0xae00 + j, 327 ret = af9013_wr_reg_bits(state, 0xd417, 1, 1, 0);
250 coeff_table[i].val[j]);
251 if (ret) 328 if (ret)
252 break; 329 goto err;
330
331 /* disable reset */
332 ret = af9013_wr_reg_bits(state, 0xd417, 4, 1, 0);
333
334 /* power on */
335 ret = af9013_wr_reg_bits(state, 0xd73a, 3, 1, 0);
336 } else {
337 /* power off */
338 ret = af9013_wr_reg_bits(state, 0xd73a, 3, 1, 1);
253 } 339 }
254 340
255error: 341 return ret;
342err:
343 dbg("%s: failed=%d", __func__, ret);
344 return ret;
345}
346
347static int af9013_statistics_ber_unc_start(struct dvb_frontend *fe)
348{
349 struct af9013_state *state = fe->demodulator_priv;
350 int ret;
351
352 dbg("%s", __func__);
353
354 /* reset and start BER counter */
355 ret = af9013_wr_reg_bits(state, 0xd391, 4, 1, 1);
356 if (ret)
357 goto err;
358
359 return ret;
360err:
361 dbg("%s: failed=%d", __func__, ret);
256 return ret; 362 return ret;
257} 363}
258 364
259static int af9013_set_adc_ctrl(struct af9013_state *state) 365static int af9013_statistics_ber_unc_result(struct dvb_frontend *fe)
260{ 366{
367 struct af9013_state *state = fe->demodulator_priv;
261 int ret; 368 int ret;
262 u8 buf[3], tmp, i; 369 u8 buf[5];
263 u32 adc_cw;
264 370
265 deb_info("%s: adc_clock:%d\n", __func__, state->config.adc_clock); 371 dbg("%s", __func__);
266 372
267 /* adc frequency type */ 373 /* check if error bit count is ready */
268 switch (state->config.adc_clock) { 374 ret = af9013_rd_reg_bits(state, 0xd391, 4, 1, &buf[0]);
269 case 28800: /* 28.800 MHz */ 375 if (ret)
270 tmp = 0; 376 goto err;
271 break; 377
272 case 20480: /* 20.480 MHz */ 378 if (!buf[0]) {
273 tmp = 1; 379 dbg("%s: not ready", __func__);
380 return 0;
381 }
382
383 ret = af9013_rd_regs(state, 0xd387, buf, 5);
384 if (ret)
385 goto err;
386
387 state->ber = (buf[2] << 16) | (buf[1] << 8) | buf[0];
388 state->ucblocks += (buf[4] << 8) | buf[3];
389
390 return ret;
391err:
392 dbg("%s: failed=%d", __func__, ret);
393 return ret;
394}
395
396static int af9013_statistics_snr_start(struct dvb_frontend *fe)
397{
398 struct af9013_state *state = fe->demodulator_priv;
399 int ret;
400
401 dbg("%s", __func__);
402
403 /* start SNR meas */
404 ret = af9013_wr_reg_bits(state, 0xd2e1, 3, 1, 1);
405 if (ret)
406 goto err;
407
408 return ret;
409err:
410 dbg("%s: failed=%d", __func__, ret);
411 return ret;
412}
413
414static int af9013_statistics_snr_result(struct dvb_frontend *fe)
415{
416 struct af9013_state *state = fe->demodulator_priv;
417 int ret, i, len;
418 u8 buf[3], tmp;
419 u32 snr_val;
420 const struct af9013_snr *uninitialized_var(snr_lut);
421
422 dbg("%s", __func__);
423
424 /* check if SNR ready */
425 ret = af9013_rd_reg_bits(state, 0xd2e1, 3, 1, &tmp);
426 if (ret)
427 goto err;
428
429 if (!tmp) {
430 dbg("%s: not ready", __func__);
431 return 0;
432 }
433
434 /* read value */
435 ret = af9013_rd_regs(state, 0xd2e3, buf, 3);
436 if (ret)
437 goto err;
438
439 snr_val = (buf[2] << 16) | (buf[1] << 8) | buf[0];
440
441 /* read current modulation */
442 ret = af9013_rd_reg(state, 0xd3c1, &tmp);
443 if (ret)
444 goto err;
445
446 switch ((tmp >> 6) & 3) {
447 case 0:
448 len = ARRAY_SIZE(qpsk_snr_lut);
449 snr_lut = qpsk_snr_lut;
274 break; 450 break;
275 case 28000: /* 28.000 MHz */ 451 case 1:
276 tmp = 2; 452 len = ARRAY_SIZE(qam16_snr_lut);
453 snr_lut = qam16_snr_lut;
277 break; 454 break;
278 case 25000: /* 25.000 MHz */ 455 case 2:
279 tmp = 3; 456 len = ARRAY_SIZE(qam64_snr_lut);
457 snr_lut = qam64_snr_lut;
280 break; 458 break;
281 default: 459 default:
282 err("invalid xtal"); 460 goto err;
283 return -EINVAL; 461 break;
284 } 462 }
285 463
286 adc_cw = af913_div(state->config.adc_clock*1000, 1000000ul, 19ul); 464 for (i = 0; i < len; i++) {
465 tmp = snr_lut[i].snr;
287 466
288 buf[0] = (u8) ((adc_cw & 0x000000ff)); 467 if (snr_val < snr_lut[i].val)
289 buf[1] = (u8) ((adc_cw & 0x0000ff00) >> 8); 468 break;
290 buf[2] = (u8) ((adc_cw & 0x00ff0000) >> 16); 469 }
470 state->snr = tmp * 10; /* dB/10 */
291 471
292 deb_info("%s: adc_cw:", __func__); 472 return ret;
293 debug_dump(buf, sizeof(buf), deb_info); 473err:
474 dbg("%s: failed=%d", __func__, ret);
475 return ret;
476}
294 477
295 /* program */ 478static int af9013_statistics_signal_strength(struct dvb_frontend *fe)
296 for (i = 0; i < sizeof(buf); i++) { 479{
297 ret = af9013_write_reg(state, 0xd180 + i, buf[i]); 480 struct af9013_state *state = fe->demodulator_priv;
298 if (ret) 481 int ret = 0;
299 goto error; 482 u8 buf[2], rf_gain, if_gain;
300 } 483 int signal_strength;
301 ret = af9013_write_reg_bits(state, 0x9bd2, 0, 4, tmp); 484
302error: 485 dbg("%s", __func__);
486
487 if (!state->signal_strength_en)
488 return 0;
489
490 ret = af9013_rd_regs(state, 0xd07c, buf, 2);
491 if (ret)
492 goto err;
493
494 rf_gain = buf[0];
495 if_gain = buf[1];
496
497 signal_strength = (0xffff / \
498 (9 * (state->rf_50 + state->if_50) - \
499 11 * (state->rf_80 + state->if_80))) * \
500 (10 * (rf_gain + if_gain) - \
501 11 * (state->rf_80 + state->if_80));
502 if (signal_strength < 0)
503 signal_strength = 0;
504 else if (signal_strength > 0xffff)
505 signal_strength = 0xffff;
506
507 state->signal_strength = signal_strength;
508
509 return ret;
510err:
511 dbg("%s: failed=%d", __func__, ret);
303 return ret; 512 return ret;
304} 513}
305 514
306static int af9013_set_freq_ctrl(struct af9013_state *state, 515static void af9013_statistics_work(struct work_struct *work)
307 struct dvb_frontend *fe)
308{ 516{
309 int ret; 517 int ret;
310 u16 addr; 518 struct af9013_state *state = container_of(work,
311 u8 buf[3], i, j; 519 struct af9013_state, statistics_work.work);
312 u32 adc_freq, freq_cw; 520 unsigned int next_msec;
313 s8 bfs_spec_inv; 521
314 int if_sample_freq; 522 /* update only signal strength when demod is not locked */
315 523 if (!(state->fe_status & FE_HAS_LOCK)) {
316 for (j = 0; j < 3; j++) { 524 state->statistics_step = 0;
317 if (j == 0) { 525 state->ber = 0;
318 addr = 0xd140; /* fcw normal */ 526 state->snr = 0;
319 bfs_spec_inv = state->config.rf_spec_inv ? -1 : 1; 527 }
320 } else if (j == 1) { 528
321 addr = 0x9be7; /* fcw dummy ram */ 529 switch (state->statistics_step) {
322 bfs_spec_inv = state->config.rf_spec_inv ? -1 : 1; 530 default:
323 } else { 531 state->statistics_step = 0;
324 addr = 0x9bea; /* fcw inverted */ 532 case 0:
325 bfs_spec_inv = state->config.rf_spec_inv ? 1 : -1; 533 ret = af9013_statistics_signal_strength(&state->fe);
534 state->statistics_step++;
535 next_msec = 300;
536 break;
537 case 1:
538 ret = af9013_statistics_snr_start(&state->fe);
539 state->statistics_step++;
540 next_msec = 200;
541 break;
542 case 2:
543 ret = af9013_statistics_ber_unc_start(&state->fe);
544 state->statistics_step++;
545 next_msec = 1000;
546 break;
547 case 3:
548 ret = af9013_statistics_snr_result(&state->fe);
549 state->statistics_step++;
550 next_msec = 400;
551 break;
552 case 4:
553 ret = af9013_statistics_ber_unc_result(&state->fe);
554 state->statistics_step++;
555 next_msec = 100;
556 break;
557 }
558
559 schedule_delayed_work(&state->statistics_work,
560 msecs_to_jiffies(next_msec));
561
562 return;
563}
564
565static int af9013_get_tune_settings(struct dvb_frontend *fe,
566 struct dvb_frontend_tune_settings *fesettings)
567{
568 fesettings->min_delay_ms = 800;
569 fesettings->step_size = 0;
570 fesettings->max_drift = 0;
571
572 return 0;
573}
574
575static int af9013_set_frontend(struct dvb_frontend *fe,
576 struct dvb_frontend_parameters *p)
577{
578 struct af9013_state *state = fe->demodulator_priv;
579 struct dtv_frontend_properties *c = &fe->dtv_property_cache;
580 int ret, i, sampling_freq;
581 bool auto_mode, spec_inv;
582 u8 buf[6];
583 u32 if_frequency, freq_cw;
584
585 dbg("%s: frequency=%d bandwidth_hz=%d", __func__,
586 c->frequency, c->bandwidth_hz);
587
588 /* program tuner */
589 if (fe->ops.tuner_ops.set_params)
590 fe->ops.tuner_ops.set_params(fe, p);
591
592 /* program CFOE coefficients */
593 if (c->bandwidth_hz != state->bandwidth_hz) {
594 for (i = 0; i < ARRAY_SIZE(coeff_lut); i++) {
595 if (coeff_lut[i].clock == state->config.clock &&
596 coeff_lut[i].bandwidth_hz == c->bandwidth_hz) {
597 break;
598 }
326 } 599 }
327 600
328 adc_freq = state->config.adc_clock * 1000; 601 ret = af9013_wr_regs(state, 0xae00, coeff_lut[i].val,
602 sizeof(coeff_lut[i].val));
603 }
329 604
605 /* program frequency control */
606 if (c->bandwidth_hz != state->bandwidth_hz || state->first_tune) {
330 /* get used IF frequency */ 607 /* get used IF frequency */
331 if (fe->ops.tuner_ops.get_if_frequency) 608 if (fe->ops.tuner_ops.get_if_frequency)
332 fe->ops.tuner_ops.get_if_frequency(fe, &if_sample_freq); 609 fe->ops.tuner_ops.get_if_frequency(fe, &if_frequency);
333 else 610 else
334 if_sample_freq = state->config.tuner_if * 1000; 611 if_frequency = state->config.if_frequency;
335 612
336 while (if_sample_freq > (adc_freq / 2)) 613 sampling_freq = if_frequency;
337 if_sample_freq = if_sample_freq - adc_freq;
338 614
339 if (if_sample_freq >= 0) 615 while (sampling_freq > (state->config.clock / 2))
340 bfs_spec_inv = bfs_spec_inv * (-1); 616 sampling_freq -= state->config.clock;
341 else
342 if_sample_freq = if_sample_freq * (-1);
343 617
344 freq_cw = af913_div(if_sample_freq, adc_freq, 23ul); 618 if (sampling_freq < 0) {
619 sampling_freq *= -1;
620 spec_inv = state->config.spec_inv;
621 } else {
622 spec_inv = !state->config.spec_inv;
623 }
345 624
346 if (bfs_spec_inv == -1) 625 freq_cw = af913_div(sampling_freq, state->config.clock, 23);
347 freq_cw = 0x00800000 - freq_cw;
348 626
349 buf[0] = (u8) ((freq_cw & 0x000000ff)); 627 if (spec_inv)
350 buf[1] = (u8) ((freq_cw & 0x0000ff00) >> 8); 628 freq_cw = 0x800000 - freq_cw;
351 buf[2] = (u8) ((freq_cw & 0x007f0000) >> 16);
352 629
630 buf[0] = (freq_cw >> 0) & 0xff;
631 buf[1] = (freq_cw >> 8) & 0xff;
632 buf[2] = (freq_cw >> 16) & 0x7f;
353 633
354 deb_info("%s: freq_cw:", __func__); 634 freq_cw = 0x800000 - freq_cw;
355 debug_dump(buf, sizeof(buf), deb_info);
356 635
357 /* program */ 636 buf[3] = (freq_cw >> 0) & 0xff;
358 for (i = 0; i < sizeof(buf); i++) { 637 buf[4] = (freq_cw >> 8) & 0xff;
359 ret = af9013_write_reg(state, addr++, buf[i]); 638 buf[5] = (freq_cw >> 16) & 0x7f;
360 if (ret) 639
361 goto error; 640 ret = af9013_wr_regs(state, 0xd140, buf, 3);
362 } 641 if (ret)
642 goto err;
643
644 ret = af9013_wr_regs(state, 0x9be7, buf, 6);
645 if (ret)
646 goto err;
363 } 647 }
364error:
365 return ret;
366}
367 648
368static int af9013_set_ofdm_params(struct af9013_state *state, 649 /* clear TPS lock flag */
369 struct dvb_ofdm_parameters *params, u8 *auto_mode) 650 ret = af9013_wr_reg_bits(state, 0xd330, 3, 1, 1);
370{ 651 if (ret)
371 int ret; 652 goto err;
372 u8 i, buf[3] = {0, 0, 0}; 653
373 *auto_mode = 0; /* set if parameters are requested to auto set */ 654 /* clear MPEG2 lock flag */
655 ret = af9013_wr_reg_bits(state, 0xd507, 6, 1, 0);
656 if (ret)
657 goto err;
658
659 /* empty channel function */
660 ret = af9013_wr_reg_bits(state, 0x9bfe, 0, 1, 0);
661 if (ret)
662 goto err;
663
664 /* empty DVB-T channel function */
665 ret = af9013_wr_reg_bits(state, 0x9bc2, 0, 1, 0);
666 if (ret)
667 goto err;
374 668
375 /* Try auto-detect transmission parameters in case of AUTO requested or 669 /* transmission parameters */
376 garbage parameters given by application for compatibility. 670 auto_mode = false;
377 MPlayer seems to provide garbage parameters currently. */ 671 memset(buf, 0, 3);
378 672
379 switch (params->transmission_mode) { 673 switch (c->transmission_mode) {
380 case TRANSMISSION_MODE_AUTO: 674 case TRANSMISSION_MODE_AUTO:
381 *auto_mode = 1; 675 auto_mode = 1;
676 break;
382 case TRANSMISSION_MODE_2K: 677 case TRANSMISSION_MODE_2K:
383 break; 678 break;
384 case TRANSMISSION_MODE_8K: 679 case TRANSMISSION_MODE_8K:
385 buf[0] |= (1 << 0); 680 buf[0] |= (1 << 0);
386 break; 681 break;
387 default: 682 default:
388 deb_info("%s: invalid transmission_mode\n", __func__); 683 dbg("%s: invalid transmission_mode", __func__);
389 *auto_mode = 1; 684 auto_mode = 1;
390 } 685 }
391 686
392 switch (params->guard_interval) { 687 switch (c->guard_interval) {
393 case GUARD_INTERVAL_AUTO: 688 case GUARD_INTERVAL_AUTO:
394 *auto_mode = 1; 689 auto_mode = 1;
690 break;
395 case GUARD_INTERVAL_1_32: 691 case GUARD_INTERVAL_1_32:
396 break; 692 break;
397 case GUARD_INTERVAL_1_16: 693 case GUARD_INTERVAL_1_16:
@@ -404,13 +700,14 @@ static int af9013_set_ofdm_params(struct af9013_state *state,
404 buf[0] |= (3 << 2); 700 buf[0] |= (3 << 2);
405 break; 701 break;
406 default: 702 default:
407 deb_info("%s: invalid guard_interval\n", __func__); 703 dbg("%s: invalid guard_interval", __func__);
408 *auto_mode = 1; 704 auto_mode = 1;
409 } 705 }
410 706
411 switch (params->hierarchy_information) { 707 switch (c->hierarchy) {
412 case HIERARCHY_AUTO: 708 case HIERARCHY_AUTO:
413 *auto_mode = 1; 709 auto_mode = 1;
710 break;
414 case HIERARCHY_NONE: 711 case HIERARCHY_NONE:
415 break; 712 break;
416 case HIERARCHY_1: 713 case HIERARCHY_1:
@@ -423,13 +720,14 @@ static int af9013_set_ofdm_params(struct af9013_state *state,
423 buf[0] |= (3 << 4); 720 buf[0] |= (3 << 4);
424 break; 721 break;
425 default: 722 default:
426 deb_info("%s: invalid hierarchy_information\n", __func__); 723 dbg("%s: invalid hierarchy", __func__);
427 *auto_mode = 1; 724 auto_mode = 1;
428 }; 725 };
429 726
430 switch (params->constellation) { 727 switch (c->modulation) {
431 case QAM_AUTO: 728 case QAM_AUTO:
432 *auto_mode = 1; 729 auto_mode = 1;
730 break;
433 case QPSK: 731 case QPSK:
434 break; 732 break;
435 case QAM_16: 733 case QAM_16:
@@ -439,16 +737,17 @@ static int af9013_set_ofdm_params(struct af9013_state *state,
439 buf[1] |= (2 << 6); 737 buf[1] |= (2 << 6);
440 break; 738 break;
441 default: 739 default:
442 deb_info("%s: invalid constellation\n", __func__); 740 dbg("%s: invalid modulation", __func__);
443 *auto_mode = 1; 741 auto_mode = 1;
444 } 742 }
445 743
446 /* Use HP. How and which case we can switch to LP? */ 744 /* Use HP. How and which case we can switch to LP? */
447 buf[1] |= (1 << 4); 745 buf[1] |= (1 << 4);
448 746
449 switch (params->code_rate_HP) { 747 switch (c->code_rate_HP) {
450 case FEC_AUTO: 748 case FEC_AUTO:
451 *auto_mode = 1; 749 auto_mode = 1;
750 break;
452 case FEC_1_2: 751 case FEC_1_2:
453 break; 752 break;
454 case FEC_2_3: 753 case FEC_2_3:
@@ -464,16 +763,14 @@ static int af9013_set_ofdm_params(struct af9013_state *state,
464 buf[2] |= (4 << 0); 763 buf[2] |= (4 << 0);
465 break; 764 break;
466 default: 765 default:
467 deb_info("%s: invalid code_rate_HP\n", __func__); 766 dbg("%s: invalid code_rate_HP", __func__);
468 *auto_mode = 1; 767 auto_mode = 1;
469 } 768 }
470 769
471 switch (params->code_rate_LP) { 770 switch (c->code_rate_LP) {
472 case FEC_AUTO: 771 case FEC_AUTO:
473 /* if HIERARCHY_NONE and FEC_NONE then LP FEC is set to FEC_AUTO 772 auto_mode = 1;
474 by dvb_frontend.c for compatibility */ 773 break;
475 if (params->hierarchy_information != HIERARCHY_NONE)
476 *auto_mode = 1;
477 case FEC_1_2: 774 case FEC_1_2:
478 break; 775 break;
479 case FEC_2_3: 776 case FEC_2_3:
@@ -489,183 +786,63 @@ static int af9013_set_ofdm_params(struct af9013_state *state,
489 buf[2] |= (4 << 3); 786 buf[2] |= (4 << 3);
490 break; 787 break;
491 case FEC_NONE: 788 case FEC_NONE:
492 if (params->hierarchy_information == HIERARCHY_AUTO) 789 break;
493 break;
494 default: 790 default:
495 deb_info("%s: invalid code_rate_LP\n", __func__); 791 dbg("%s: invalid code_rate_LP", __func__);
496 *auto_mode = 1; 792 auto_mode = 1;
497 } 793 }
498 794
499 switch (params->bandwidth) { 795 switch (c->bandwidth_hz) {
500 case BANDWIDTH_6_MHZ: 796 case 6000000:
501 break; 797 break;
502 case BANDWIDTH_7_MHZ: 798 case 7000000:
503 buf[1] |= (1 << 2); 799 buf[1] |= (1 << 2);
504 break; 800 break;
505 case BANDWIDTH_8_MHZ: 801 case 8000000:
506 buf[1] |= (2 << 2); 802 buf[1] |= (2 << 2);
507 break; 803 break;
508 default: 804 default:
509 deb_info("%s: invalid bandwidth\n", __func__); 805 dbg("%s: invalid bandwidth_hz", __func__);
510 buf[1] |= (2 << 2); /* cannot auto-detect BW, try 8 MHz */ 806 ret = -EINVAL;
511 } 807 goto err;
512
513 /* program */
514 for (i = 0; i < sizeof(buf); i++) {
515 ret = af9013_write_reg(state, 0xd3c0 + i, buf[i]);
516 if (ret)
517 break;
518 } 808 }
519 809
520 return ret; 810 ret = af9013_wr_regs(state, 0xd3c0, buf, 3);
521}
522
523static int af9013_reset(struct af9013_state *state, u8 sleep)
524{
525 int ret;
526 u8 tmp, i;
527 deb_info("%s\n", __func__);
528
529 /* enable OFDM reset */
530 ret = af9013_write_reg_bits(state, 0xd417, 4, 1, 1);
531 if (ret) 811 if (ret)
532 goto error; 812 goto err;
533 813
534 /* start reset mechanism */ 814 if (auto_mode) {
535 ret = af9013_write_reg(state, 0xaeff, 1); 815 /* clear easy mode flag */
536 if (ret) 816 ret = af9013_wr_reg(state, 0xaefd, 0);
537 goto error;
538
539 /* reset is done when bit 1 is set */
540 for (i = 0; i < 150; i++) {
541 ret = af9013_read_reg_bits(state, 0xd417, 1, 1, &tmp);
542 if (ret)
543 goto error;
544 if (tmp)
545 break; /* reset done */
546 msleep(10);
547 }
548 if (!tmp)
549 return -ETIMEDOUT;
550
551 /* don't clear reset when going to sleep */
552 if (!sleep) {
553 /* clear OFDM reset */
554 ret = af9013_write_reg_bits(state, 0xd417, 1, 1, 0);
555 if (ret) 817 if (ret)
556 goto error; 818 goto err;
557
558 /* disable OFDM reset */
559 ret = af9013_write_reg_bits(state, 0xd417, 4, 1, 0);
560 }
561error:
562 return ret;
563}
564
565static int af9013_power_ctrl(struct af9013_state *state, u8 onoff)
566{
567 int ret;
568 deb_info("%s: onoff:%d\n", __func__, onoff);
569 819
570 if (onoff) { 820 dbg("%s: auto params", __func__);
571 /* power on */
572 ret = af9013_write_reg_bits(state, 0xd73a, 3, 1, 0);
573 if (ret)
574 goto error;
575 ret = af9013_write_reg_bits(state, 0xd417, 1, 1, 0);
576 if (ret)
577 goto error;
578 ret = af9013_write_reg_bits(state, 0xd417, 4, 1, 0);
579 } else { 821 } else {
580 /* power off */ 822 /* set easy mode flag */
581 ret = af9013_reset(state, 1); 823 ret = af9013_wr_reg(state, 0xaefd, 1);
582 if (ret) 824 if (ret)
583 goto error; 825 goto err;
584 ret = af9013_write_reg_bits(state, 0xd73a, 3, 1, 1);
585 }
586error:
587 return ret;
588}
589
590static int af9013_lock_led(struct af9013_state *state, u8 onoff)
591{
592 deb_info("%s: onoff:%d\n", __func__, onoff);
593
594 return af9013_write_reg_bits(state, 0xd730, 0, 1, onoff);
595}
596
597static int af9013_set_frontend(struct dvb_frontend *fe,
598 struct dvb_frontend_parameters *params)
599{
600 struct af9013_state *state = fe->demodulator_priv;
601 int ret;
602 u8 auto_mode; /* auto set TPS */
603
604 deb_info("%s: freq:%d bw:%d\n", __func__, params->frequency,
605 params->u.ofdm.bandwidth);
606
607 state->frequency = params->frequency;
608
609 /* program tuner */
610 if (fe->ops.tuner_ops.set_params)
611 fe->ops.tuner_ops.set_params(fe, params);
612
613 /* program CFOE coefficients */
614 ret = af9013_set_coeff(state, params->u.ofdm.bandwidth);
615 if (ret)
616 goto error;
617
618 /* program frequency control */
619 ret = af9013_set_freq_ctrl(state, fe);
620 if (ret)
621 goto error;
622
623 /* clear TPS lock flag (inverted flag) */
624 ret = af9013_write_reg_bits(state, 0xd330, 3, 1, 1);
625 if (ret)
626 goto error;
627
628 /* clear MPEG2 lock flag */
629 ret = af9013_write_reg_bits(state, 0xd507, 6, 1, 0);
630 if (ret)
631 goto error;
632
633 /* empty channel function */
634 ret = af9013_write_reg_bits(state, 0x9bfe, 0, 1, 0);
635 if (ret)
636 goto error;
637 826
638 /* empty DVB-T channel function */ 827 ret = af9013_wr_reg(state, 0xaefe, 0);
639 ret = af9013_write_reg_bits(state, 0x9bc2, 0, 1, 0);
640 if (ret)
641 goto error;
642
643 /* program TPS and bandwidth, check if auto mode needed */
644 ret = af9013_set_ofdm_params(state, &params->u.ofdm, &auto_mode);
645 if (ret)
646 goto error;
647
648 if (auto_mode) {
649 /* clear easy mode flag */
650 ret = af9013_write_reg(state, 0xaefd, 0);
651 deb_info("%s: auto TPS\n", __func__);
652 } else {
653 /* set easy mode flag */
654 ret = af9013_write_reg(state, 0xaefd, 1);
655 if (ret) 828 if (ret)
656 goto error; 829 goto err;
657 ret = af9013_write_reg(state, 0xaefe, 0); 830
658 deb_info("%s: manual TPS\n", __func__); 831 dbg("%s: manual params", __func__);
659 } 832 }
660 if (ret)
661 goto error;
662 833
663 /* everything is set, lets try to receive channel - OFSM GO! */ 834 /* tune */
664 ret = af9013_write_reg(state, 0xffff, 0); 835 ret = af9013_wr_reg(state, 0xffff, 0);
665 if (ret) 836 if (ret)
666 goto error; 837 goto err;
838
839 state->bandwidth_hz = c->bandwidth_hz;
840 state->set_frontend_jiffies = jiffies;
841 state->first_tune = false;
667 842
668error: 843 return ret;
844err:
845 dbg("%s: failed=%d", __func__, ret);
669 return ret; 846 return ret;
670} 847}
671 848
@@ -673,525 +850,310 @@ static int af9013_get_frontend(struct dvb_frontend *fe,
673 struct dvb_frontend_parameters *p) 850 struct dvb_frontend_parameters *p)
674{ 851{
675 struct af9013_state *state = fe->demodulator_priv; 852 struct af9013_state *state = fe->demodulator_priv;
853 struct dtv_frontend_properties *c = &fe->dtv_property_cache;
676 int ret; 854 int ret;
677 u8 i, buf[3]; 855 u8 buf[3];
678 deb_info("%s\n", __func__);
679 856
680 /* read TPS registers */ 857 dbg("%s", __func__);
681 for (i = 0; i < 3; i++) { 858
682 ret = af9013_read_reg(state, 0xd3c0 + i, &buf[i]); 859 ret = af9013_rd_regs(state, 0xd3c0, buf, 3);
683 if (ret) 860 if (ret)
684 goto error; 861 goto err;
685 }
686 862
687 switch ((buf[1] >> 6) & 3) { 863 switch ((buf[1] >> 6) & 3) {
688 case 0: 864 case 0:
689 p->u.ofdm.constellation = QPSK; 865 c->modulation = QPSK;
690 break; 866 break;
691 case 1: 867 case 1:
692 p->u.ofdm.constellation = QAM_16; 868 c->modulation = QAM_16;
693 break; 869 break;
694 case 2: 870 case 2:
695 p->u.ofdm.constellation = QAM_64; 871 c->modulation = QAM_64;
696 break; 872 break;
697 } 873 }
698 874
699 switch ((buf[0] >> 0) & 3) { 875 switch ((buf[0] >> 0) & 3) {
700 case 0: 876 case 0:
701 p->u.ofdm.transmission_mode = TRANSMISSION_MODE_2K; 877 c->transmission_mode = TRANSMISSION_MODE_2K;
702 break; 878 break;
703 case 1: 879 case 1:
704 p->u.ofdm.transmission_mode = TRANSMISSION_MODE_8K; 880 c->transmission_mode = TRANSMISSION_MODE_8K;
705 } 881 }
706 882
707 switch ((buf[0] >> 2) & 3) { 883 switch ((buf[0] >> 2) & 3) {
708 case 0: 884 case 0:
709 p->u.ofdm.guard_interval = GUARD_INTERVAL_1_32; 885 c->transmission_mode = GUARD_INTERVAL_1_32;
710 break; 886 break;
711 case 1: 887 case 1:
712 p->u.ofdm.guard_interval = GUARD_INTERVAL_1_16; 888 c->transmission_mode = GUARD_INTERVAL_1_16;
713 break; 889 break;
714 case 2: 890 case 2:
715 p->u.ofdm.guard_interval = GUARD_INTERVAL_1_8; 891 c->transmission_mode = GUARD_INTERVAL_1_8;
716 break; 892 break;
717 case 3: 893 case 3:
718 p->u.ofdm.guard_interval = GUARD_INTERVAL_1_4; 894 c->transmission_mode = GUARD_INTERVAL_1_4;
719 break; 895 break;
720 } 896 }
721 897
722 switch ((buf[0] >> 4) & 7) { 898 switch ((buf[0] >> 4) & 7) {
723 case 0: 899 case 0:
724 p->u.ofdm.hierarchy_information = HIERARCHY_NONE; 900 c->hierarchy = HIERARCHY_NONE;
725 break; 901 break;
726 case 1: 902 case 1:
727 p->u.ofdm.hierarchy_information = HIERARCHY_1; 903 c->hierarchy = HIERARCHY_1;
728 break; 904 break;
729 case 2: 905 case 2:
730 p->u.ofdm.hierarchy_information = HIERARCHY_2; 906 c->hierarchy = HIERARCHY_2;
731 break; 907 break;
732 case 3: 908 case 3:
733 p->u.ofdm.hierarchy_information = HIERARCHY_4; 909 c->hierarchy = HIERARCHY_4;
734 break; 910 break;
735 } 911 }
736 912
737 switch ((buf[2] >> 0) & 7) { 913 switch ((buf[2] >> 0) & 7) {
738 case 0: 914 case 0:
739 p->u.ofdm.code_rate_HP = FEC_1_2; 915 c->code_rate_HP = FEC_1_2;
740 break; 916 break;
741 case 1: 917 case 1:
742 p->u.ofdm.code_rate_HP = FEC_2_3; 918 c->code_rate_HP = FEC_2_3;
743 break; 919 break;
744 case 2: 920 case 2:
745 p->u.ofdm.code_rate_HP = FEC_3_4; 921 c->code_rate_HP = FEC_3_4;
746 break; 922 break;
747 case 3: 923 case 3:
748 p->u.ofdm.code_rate_HP = FEC_5_6; 924 c->code_rate_HP = FEC_5_6;
749 break; 925 break;
750 case 4: 926 case 4:
751 p->u.ofdm.code_rate_HP = FEC_7_8; 927 c->code_rate_HP = FEC_7_8;
752 break; 928 break;
753 } 929 }
754 930
755 switch ((buf[2] >> 3) & 7) { 931 switch ((buf[2] >> 3) & 7) {
756 case 0: 932 case 0:
757 p->u.ofdm.code_rate_LP = FEC_1_2; 933 c->code_rate_LP = FEC_1_2;
758 break; 934 break;
759 case 1: 935 case 1:
760 p->u.ofdm.code_rate_LP = FEC_2_3; 936 c->code_rate_LP = FEC_2_3;
761 break; 937 break;
762 case 2: 938 case 2:
763 p->u.ofdm.code_rate_LP = FEC_3_4; 939 c->code_rate_LP = FEC_3_4;
764 break; 940 break;
765 case 3: 941 case 3:
766 p->u.ofdm.code_rate_LP = FEC_5_6; 942 c->code_rate_LP = FEC_5_6;
767 break; 943 break;
768 case 4: 944 case 4:
769 p->u.ofdm.code_rate_LP = FEC_7_8; 945 c->code_rate_LP = FEC_7_8;
770 break; 946 break;
771 } 947 }
772 948
773 switch ((buf[1] >> 2) & 3) { 949 switch ((buf[1] >> 2) & 3) {
774 case 0: 950 case 0:
775 p->u.ofdm.bandwidth = BANDWIDTH_6_MHZ; 951 c->bandwidth_hz = 6000000;
776 break; 952 break;
777 case 1: 953 case 1:
778 p->u.ofdm.bandwidth = BANDWIDTH_7_MHZ; 954 c->bandwidth_hz = 7000000;
779 break; 955 break;
780 case 2: 956 case 2:
781 p->u.ofdm.bandwidth = BANDWIDTH_8_MHZ; 957 c->bandwidth_hz = 8000000;
782 break; 958 break;
783 } 959 }
784 960
785 p->inversion = INVERSION_AUTO;
786 p->frequency = state->frequency;
787
788error:
789 return ret; 961 return ret;
790} 962err:
791 963 dbg("%s: failed=%d", __func__, ret);
792static int af9013_update_ber_unc(struct dvb_frontend *fe)
793{
794 struct af9013_state *state = fe->demodulator_priv;
795 int ret;
796 u8 buf[3], i;
797 u32 error_bit_count = 0;
798 u32 total_bit_count = 0;
799 u32 abort_packet_count = 0;
800
801 state->ber = 0;
802
803 /* check if error bit count is ready */
804 ret = af9013_read_reg_bits(state, 0xd391, 4, 1, &buf[0]);
805 if (ret)
806 goto error;
807 if (!buf[0])
808 goto exit;
809
810 /* get RSD packet abort count */
811 for (i = 0; i < 2; i++) {
812 ret = af9013_read_reg(state, 0xd38a + i, &buf[i]);
813 if (ret)
814 goto error;
815 }
816 abort_packet_count = (buf[1] << 8) + buf[0];
817
818 /* get error bit count */
819 for (i = 0; i < 3; i++) {
820 ret = af9013_read_reg(state, 0xd387 + i, &buf[i]);
821 if (ret)
822 goto error;
823 }
824 error_bit_count = (buf[2] << 16) + (buf[1] << 8) + buf[0];
825 error_bit_count = error_bit_count - abort_packet_count * 8 * 8;
826
827 /* get used RSD counting period (10000 RSD packets used) */
828 for (i = 0; i < 2; i++) {
829 ret = af9013_read_reg(state, 0xd385 + i, &buf[i]);
830 if (ret)
831 goto error;
832 }
833 total_bit_count = (buf[1] << 8) + buf[0];
834 total_bit_count = total_bit_count - abort_packet_count;
835 total_bit_count = total_bit_count * 204 * 8;
836
837 if (total_bit_count)
838 state->ber = error_bit_count * 1000000000 / total_bit_count;
839
840 state->ucblocks += abort_packet_count;
841
842 deb_info("%s: err bits:%d total bits:%d abort count:%d\n", __func__,
843 error_bit_count, total_bit_count, abort_packet_count);
844
845 /* set BER counting range */
846 ret = af9013_write_reg(state, 0xd385, 10000 & 0xff);
847 if (ret)
848 goto error;
849 ret = af9013_write_reg(state, 0xd386, 10000 >> 8);
850 if (ret)
851 goto error;
852 /* reset and start BER counter */
853 ret = af9013_write_reg_bits(state, 0xd391, 4, 1, 1);
854 if (ret)
855 goto error;
856
857exit:
858error:
859 return ret; 964 return ret;
860} 965}
861 966
862static int af9013_update_snr(struct dvb_frontend *fe) 967static int af9013_read_status(struct dvb_frontend *fe, fe_status_t *status)
863{ 968{
864 struct af9013_state *state = fe->demodulator_priv; 969 struct af9013_state *state = fe->demodulator_priv;
865 int ret; 970 int ret;
866 u8 buf[3], i, len; 971 u8 tmp;
867 u32 quant = 0;
868 struct snr_table *uninitialized_var(snr_table);
869
870 /* check if quantizer ready (for snr) */
871 ret = af9013_read_reg_bits(state, 0xd2e1, 3, 1, &buf[0]);
872 if (ret)
873 goto error;
874 if (buf[0]) {
875 /* quantizer ready - read it */
876 for (i = 0; i < 3; i++) {
877 ret = af9013_read_reg(state, 0xd2e3 + i, &buf[i]);
878 if (ret)
879 goto error;
880 }
881 quant = (buf[2] << 16) + (buf[1] << 8) + buf[0];
882
883 /* read current constellation */
884 ret = af9013_read_reg(state, 0xd3c1, &buf[0]);
885 if (ret)
886 goto error;
887
888 switch ((buf[0] >> 6) & 3) {
889 case 0:
890 len = ARRAY_SIZE(qpsk_snr_table);
891 snr_table = qpsk_snr_table;
892 break;
893 case 1:
894 len = ARRAY_SIZE(qam16_snr_table);
895 snr_table = qam16_snr_table;
896 break;
897 case 2:
898 len = ARRAY_SIZE(qam64_snr_table);
899 snr_table = qam64_snr_table;
900 break;
901 default:
902 len = 0;
903 break;
904 }
905
906 if (len) {
907 for (i = 0; i < len; i++) {
908 if (quant < snr_table[i].val) {
909 state->snr = snr_table[i].snr * 10;
910 break;
911 }
912 }
913 }
914
915 /* set quantizer super frame count */
916 ret = af9013_write_reg(state, 0xd2e2, 1);
917 if (ret)
918 goto error;
919
920 /* check quantizer availability */
921 for (i = 0; i < 10; i++) {
922 msleep(10);
923 ret = af9013_read_reg_bits(state, 0xd2e6, 0, 1,
924 &buf[0]);
925 if (ret)
926 goto error;
927 if (!buf[0])
928 break;
929 }
930
931 /* reset quantizer */
932 ret = af9013_write_reg_bits(state, 0xd2e1, 3, 1, 1);
933 if (ret)
934 goto error;
935 }
936
937error:
938 return ret;
939}
940
941static int af9013_update_signal_strength(struct dvb_frontend *fe)
942{
943 struct af9013_state *state = fe->demodulator_priv;
944 int ret = 0;
945 u8 rf_gain, if_gain;
946 int signal_strength;
947
948 deb_info("%s\n", __func__);
949 972
950 if (state->signal_strength_en) { 973 /*
951 ret = af9013_read_reg(state, 0xd07c, &rf_gain); 974 * Return status from the cache if it is younger than 2000ms with the
952 if (ret) 975 * exception of last tune is done during 4000ms.
953 goto error; 976 */
954 ret = af9013_read_reg(state, 0xd07d, &if_gain); 977 if (time_is_after_jiffies(
955 if (ret) 978 state->read_status_jiffies + msecs_to_jiffies(2000)) &&
956 goto error; 979 time_is_before_jiffies(
957 signal_strength = (0xffff / \ 980 state->set_frontend_jiffies + msecs_to_jiffies(4000))
958 (9 * (state->rf_50 + state->if_50) - \ 981 ) {
959 11 * (state->rf_80 + state->if_80))) * \ 982 *status = state->fe_status;
960 (10 * (rf_gain + if_gain) - \ 983 return 0;
961 11 * (state->rf_80 + state->if_80));
962 if (signal_strength < 0)
963 signal_strength = 0;
964 else if (signal_strength > 0xffff)
965 signal_strength = 0xffff;
966
967 state->signal_strength = signal_strength;
968 } else { 984 } else {
969 state->signal_strength = 0; 985 *status = 0;
970 } 986 }
971 987
972error:
973 return ret;
974}
975
976static int af9013_update_statistics(struct dvb_frontend *fe)
977{
978 struct af9013_state *state = fe->demodulator_priv;
979 int ret;
980
981 if (time_before(jiffies, state->next_statistics_check))
982 return 0;
983
984 /* set minimum statistic update interval */
985 state->next_statistics_check = jiffies + msecs_to_jiffies(1200);
986
987 ret = af9013_update_signal_strength(fe);
988 if (ret)
989 goto error;
990 ret = af9013_update_snr(fe);
991 if (ret)
992 goto error;
993 ret = af9013_update_ber_unc(fe);
994 if (ret)
995 goto error;
996
997error:
998 return ret;
999}
1000
1001static int af9013_get_tune_settings(struct dvb_frontend *fe,
1002 struct dvb_frontend_tune_settings *fesettings)
1003{
1004 fesettings->min_delay_ms = 800;
1005 fesettings->step_size = 0;
1006 fesettings->max_drift = 0;
1007
1008 return 0;
1009}
1010
1011static int af9013_read_status(struct dvb_frontend *fe, fe_status_t *status)
1012{
1013 struct af9013_state *state = fe->demodulator_priv;
1014 int ret = 0;
1015 u8 tmp;
1016 *status = 0;
1017
1018 /* MPEG2 lock */ 988 /* MPEG2 lock */
1019 ret = af9013_read_reg_bits(state, 0xd507, 6, 1, &tmp); 989 ret = af9013_rd_reg_bits(state, 0xd507, 6, 1, &tmp);
1020 if (ret) 990 if (ret)
1021 goto error; 991 goto err;
992
1022 if (tmp) 993 if (tmp)
1023 *status |= FE_HAS_SIGNAL | FE_HAS_CARRIER | FE_HAS_VITERBI | 994 *status |= FE_HAS_SIGNAL | FE_HAS_CARRIER | FE_HAS_VITERBI |
1024 FE_HAS_SYNC | FE_HAS_LOCK; 995 FE_HAS_SYNC | FE_HAS_LOCK;
1025 996
1026 if (!*status) { 997 if (!*status) {
1027 /* TPS lock */ 998 /* TPS lock */
1028 ret = af9013_read_reg_bits(state, 0xd330, 3, 1, &tmp); 999 ret = af9013_rd_reg_bits(state, 0xd330, 3, 1, &tmp);
1029 if (ret) 1000 if (ret)
1030 goto error; 1001 goto err;
1002
1031 if (tmp) 1003 if (tmp)
1032 *status |= FE_HAS_SIGNAL | FE_HAS_CARRIER | 1004 *status |= FE_HAS_SIGNAL | FE_HAS_CARRIER |
1033 FE_HAS_VITERBI; 1005 FE_HAS_VITERBI;
1034 } 1006 }
1035 1007
1036 if (!*status) { 1008 state->fe_status = *status;
1037 /* CFO lock */ 1009 state->read_status_jiffies = jiffies;
1038 ret = af9013_read_reg_bits(state, 0xd333, 7, 1, &tmp);
1039 if (ret)
1040 goto error;
1041 if (tmp)
1042 *status |= FE_HAS_SIGNAL | FE_HAS_CARRIER;
1043 }
1044
1045 if (!*status) {
1046 /* SFOE lock */
1047 ret = af9013_read_reg_bits(state, 0xd334, 6, 1, &tmp);
1048 if (ret)
1049 goto error;
1050 if (tmp)
1051 *status |= FE_HAS_SIGNAL | FE_HAS_CARRIER;
1052 }
1053 1010
1054 if (!*status) { 1011 return ret;
1055 /* AGC lock */ 1012err:
1056 ret = af9013_read_reg_bits(state, 0xd1a0, 6, 1, &tmp); 1013 dbg("%s: failed=%d", __func__, ret);
1057 if (ret)
1058 goto error;
1059 if (tmp)
1060 *status |= FE_HAS_SIGNAL;
1061 }
1062
1063 ret = af9013_update_statistics(fe);
1064
1065error:
1066 return ret; 1014 return ret;
1067} 1015}
1068 1016
1069 1017static int af9013_read_snr(struct dvb_frontend *fe, u16 *snr)
1070static int af9013_read_ber(struct dvb_frontend *fe, u32 *ber)
1071{ 1018{
1072 struct af9013_state *state = fe->demodulator_priv; 1019 struct af9013_state *state = fe->demodulator_priv;
1073 int ret; 1020 *snr = state->snr;
1074 ret = af9013_update_statistics(fe); 1021 return 0;
1075 *ber = state->ber;
1076 return ret;
1077} 1022}
1078 1023
1079static int af9013_read_signal_strength(struct dvb_frontend *fe, u16 *strength) 1024static int af9013_read_signal_strength(struct dvb_frontend *fe, u16 *strength)
1080{ 1025{
1081 struct af9013_state *state = fe->demodulator_priv; 1026 struct af9013_state *state = fe->demodulator_priv;
1082 int ret;
1083 ret = af9013_update_statistics(fe);
1084 *strength = state->signal_strength; 1027 *strength = state->signal_strength;
1085 return ret; 1028 return 0;
1086} 1029}
1087 1030
1088static int af9013_read_snr(struct dvb_frontend *fe, u16 *snr) 1031static int af9013_read_ber(struct dvb_frontend *fe, u32 *ber)
1089{ 1032{
1090 struct af9013_state *state = fe->demodulator_priv; 1033 struct af9013_state *state = fe->demodulator_priv;
1091 int ret; 1034 *ber = state->ber;
1092 ret = af9013_update_statistics(fe); 1035 return 0;
1093 *snr = state->snr;
1094 return ret;
1095} 1036}
1096 1037
1097static int af9013_read_ucblocks(struct dvb_frontend *fe, u32 *ucblocks) 1038static int af9013_read_ucblocks(struct dvb_frontend *fe, u32 *ucblocks)
1098{ 1039{
1099 struct af9013_state *state = fe->demodulator_priv; 1040 struct af9013_state *state = fe->demodulator_priv;
1100 int ret;
1101 ret = af9013_update_statistics(fe);
1102 *ucblocks = state->ucblocks; 1041 *ucblocks = state->ucblocks;
1103 return ret; 1042 return 0;
1104}
1105
1106static int af9013_sleep(struct dvb_frontend *fe)
1107{
1108 struct af9013_state *state = fe->demodulator_priv;
1109 int ret;
1110 deb_info("%s\n", __func__);
1111
1112 ret = af9013_lock_led(state, 0);
1113 if (ret)
1114 goto error;
1115
1116 ret = af9013_power_ctrl(state, 0);
1117error:
1118 return ret;
1119} 1043}
1120 1044
1121static int af9013_init(struct dvb_frontend *fe) 1045static int af9013_init(struct dvb_frontend *fe)
1122{ 1046{
1123 struct af9013_state *state = fe->demodulator_priv; 1047 struct af9013_state *state = fe->demodulator_priv;
1124 int ret, i, len; 1048 int ret, i, len;
1125 u8 tmp0, tmp1; 1049 u8 buf[3], tmp;
1126 struct regdesc *init; 1050 u32 adc_cw;
1127 deb_info("%s\n", __func__); 1051 const struct af9013_reg_bit *init;
1128 1052
1129 /* reset OFDM */ 1053 dbg("%s", __func__);
1130 ret = af9013_reset(state, 0);
1131 if (ret)
1132 goto error;
1133 1054
1134 /* power on */ 1055 /* power on */
1135 ret = af9013_power_ctrl(state, 1); 1056 ret = af9013_power_ctrl(state, 1);
1136 if (ret) 1057 if (ret)
1137 goto error; 1058 goto err;
1138 1059
1139 /* enable ADC */ 1060 /* enable ADC */
1140 ret = af9013_write_reg(state, 0xd73a, 0xa4); 1061 ret = af9013_wr_reg(state, 0xd73a, 0xa4);
1141 if (ret) 1062 if (ret)
1142 goto error; 1063 goto err;
1143 1064
1144 /* write API version to firmware */ 1065 /* write API version to firmware */
1145 for (i = 0; i < sizeof(state->config.api_version); i++) { 1066 ret = af9013_wr_regs(state, 0x9bf2, state->config.api_version, 4);
1146 ret = af9013_write_reg(state, 0x9bf2 + i, 1067 if (ret)
1147 state->config.api_version[i]); 1068 goto err;
1148 if (ret)
1149 goto error;
1150 }
1151 1069
1152 /* program ADC control */ 1070 /* program ADC control */
1153 ret = af9013_set_adc_ctrl(state); 1071 switch (state->config.clock) {
1072 case 28800000: /* 28.800 MHz */
1073 tmp = 0;
1074 break;
1075 case 20480000: /* 20.480 MHz */
1076 tmp = 1;
1077 break;
1078 case 28000000: /* 28.000 MHz */
1079 tmp = 2;
1080 break;
1081 case 25000000: /* 25.000 MHz */
1082 tmp = 3;
1083 break;
1084 default:
1085 err("invalid clock");
1086 return -EINVAL;
1087 }
1088
1089 adc_cw = af913_div(state->config.clock, 1000000ul, 19);
1090 buf[0] = (adc_cw >> 0) & 0xff;
1091 buf[1] = (adc_cw >> 8) & 0xff;
1092 buf[2] = (adc_cw >> 16) & 0xff;
1093
1094 ret = af9013_wr_regs(state, 0xd180, buf, 3);
1095 if (ret)
1096 goto err;
1097
1098 ret = af9013_wr_reg_bits(state, 0x9bd2, 0, 4, tmp);
1154 if (ret) 1099 if (ret)
1155 goto error; 1100 goto err;
1156 1101
1157 /* set I2C master clock */ 1102 /* set I2C master clock */
1158 ret = af9013_write_reg(state, 0xd416, 0x14); 1103 ret = af9013_wr_reg(state, 0xd416, 0x14);
1159 if (ret) 1104 if (ret)
1160 goto error; 1105 goto err;
1161 1106
1162 /* set 16 embx */ 1107 /* set 16 embx */
1163 ret = af9013_write_reg_bits(state, 0xd700, 1, 1, 1); 1108 ret = af9013_wr_reg_bits(state, 0xd700, 1, 1, 1);
1164 if (ret) 1109 if (ret)
1165 goto error; 1110 goto err;
1166 1111
1167 /* set no trigger */ 1112 /* set no trigger */
1168 ret = af9013_write_reg_bits(state, 0xd700, 2, 1, 0); 1113 ret = af9013_wr_reg_bits(state, 0xd700, 2, 1, 0);
1169 if (ret) 1114 if (ret)
1170 goto error; 1115 goto err;
1171 1116
1172 /* set read-update bit for constellation */ 1117 /* set read-update bit for constellation */
1173 ret = af9013_write_reg_bits(state, 0xd371, 1, 1, 1); 1118 ret = af9013_wr_reg_bits(state, 0xd371, 1, 1, 1);
1174 if (ret) 1119 if (ret)
1175 goto error; 1120 goto err;
1176 1121
1177 /* enable FEC monitor */ 1122 /* settings for mp2if */
1178 ret = af9013_write_reg_bits(state, 0xd392, 1, 1, 1); 1123 if (state->config.ts_mode == AF9013_TS_USB) {
1124 /* AF9015 split PSB to 1.5k + 0.5k */
1125 ret = af9013_wr_reg_bits(state, 0xd50b, 2, 1, 1);
1126 if (ret)
1127 goto err;
1128 } else {
1129 /* AF9013 change the output bit to data7 */
1130 ret = af9013_wr_reg_bits(state, 0xd500, 3, 1, 1);
1131 if (ret)
1132 goto err;
1133
1134 /* AF9013 set mpeg to full speed */
1135 ret = af9013_wr_reg_bits(state, 0xd502, 4, 1, 1);
1136 if (ret)
1137 goto err;
1138 }
1139
1140 ret = af9013_wr_reg_bits(state, 0xd520, 4, 1, 1);
1179 if (ret) 1141 if (ret)
1180 goto error; 1142 goto err;
1181 1143
1182 /* load OFSM settings */ 1144 /* load OFSM settings */
1183 deb_info("%s: load ofsm settings\n", __func__); 1145 dbg("%s: load ofsm settings", __func__);
1184 len = ARRAY_SIZE(ofsm_init); 1146 len = ARRAY_SIZE(ofsm_init);
1185 init = ofsm_init; 1147 init = ofsm_init;
1186 for (i = 0; i < len; i++) { 1148 for (i = 0; i < len; i++) {
1187 ret = af9013_write_reg_bits(state, init[i].addr, init[i].pos, 1149 ret = af9013_wr_reg_bits(state, init[i].addr, init[i].pos,
1188 init[i].len, init[i].val); 1150 init[i].len, init[i].val);
1189 if (ret) 1151 if (ret)
1190 goto error; 1152 goto err;
1191 } 1153 }
1192 1154
1193 /* load tuner specific settings */ 1155 /* load tuner specific settings */
1194 deb_info("%s: load tuner specific settings\n", __func__); 1156 dbg("%s: load tuner specific settings", __func__);
1195 switch (state->config.tuner) { 1157 switch (state->config.tuner) {
1196 case AF9013_TUNER_MXL5003D: 1158 case AF9013_TUNER_MXL5003D:
1197 len = ARRAY_SIZE(tuner_init_mxl5003d); 1159 len = ARRAY_SIZE(tuner_init_mxl5003d);
@@ -1237,65 +1199,133 @@ static int af9013_init(struct dvb_frontend *fe)
1237 } 1199 }
1238 1200
1239 for (i = 0; i < len; i++) { 1201 for (i = 0; i < len; i++) {
1240 ret = af9013_write_reg_bits(state, init[i].addr, init[i].pos, 1202 ret = af9013_wr_reg_bits(state, init[i].addr, init[i].pos,
1241 init[i].len, init[i].val); 1203 init[i].len, init[i].val);
1242 if (ret) 1204 if (ret)
1243 goto error; 1205 goto err;
1244 } 1206 }
1245 1207
1246 /* set TS mode */ 1208 /* TS mode */
1247 deb_info("%s: setting ts mode\n", __func__); 1209 ret = af9013_wr_reg_bits(state, 0xd500, 1, 2, state->config.ts_mode);
1248 tmp0 = 0; /* parallel mode */
1249 tmp1 = 0; /* serial mode */
1250 switch (state->config.output_mode) {
1251 case AF9013_OUTPUT_MODE_PARALLEL:
1252 tmp0 = 1;
1253 break;
1254 case AF9013_OUTPUT_MODE_SERIAL:
1255 tmp1 = 1;
1256 break;
1257 case AF9013_OUTPUT_MODE_USB:
1258 /* usb mode for AF9015 */
1259 default:
1260 break;
1261 }
1262 ret = af9013_write_reg_bits(state, 0xd500, 1, 1, tmp0); /* parallel */
1263 if (ret) 1210 if (ret)
1264 goto error; 1211 goto err;
1265 ret = af9013_write_reg_bits(state, 0xd500, 2, 1, tmp1); /* serial */
1266 if (ret)
1267 goto error;
1268 1212
1269 /* enable lock led */ 1213 /* enable lock led */
1270 ret = af9013_lock_led(state, 1); 1214 ret = af9013_wr_reg_bits(state, 0xd730, 0, 1, 1);
1271 if (ret) 1215 if (ret)
1272 goto error; 1216 goto err;
1273 1217
1274 /* read values needed for signal strength calculation */ 1218 /* check if we support signal strength */
1275 ret = af9013_read_reg_bits(state, 0x9bee, 0, 1, 1219 if (!state->signal_strength_en) {
1276 &state->signal_strength_en); 1220 ret = af9013_rd_reg_bits(state, 0x9bee, 0, 1,
1277 if (ret) 1221 &state->signal_strength_en);
1278 goto error; 1222 if (ret)
1223 goto err;
1224 }
1279 1225
1280 if (state->signal_strength_en) { 1226 /* read values needed for signal strength calculation */
1281 ret = af9013_read_reg(state, 0x9bbd, &state->rf_50); 1227 if (state->signal_strength_en && !state->rf_50) {
1228 ret = af9013_rd_reg(state, 0x9bbd, &state->rf_50);
1282 if (ret) 1229 if (ret)
1283 goto error; 1230 goto err;
1284 ret = af9013_read_reg(state, 0x9bd0, &state->rf_80); 1231
1232 ret = af9013_rd_reg(state, 0x9bd0, &state->rf_80);
1285 if (ret) 1233 if (ret)
1286 goto error; 1234 goto err;
1287 ret = af9013_read_reg(state, 0x9be2, &state->if_50); 1235
1236 ret = af9013_rd_reg(state, 0x9be2, &state->if_50);
1288 if (ret) 1237 if (ret)
1289 goto error; 1238 goto err;
1290 ret = af9013_read_reg(state, 0x9be4, &state->if_80); 1239
1240 ret = af9013_rd_reg(state, 0x9be4, &state->if_80);
1291 if (ret) 1241 if (ret)
1292 goto error; 1242 goto err;
1293 } 1243 }
1294 1244
1295error: 1245 /* SNR */
1246 ret = af9013_wr_reg(state, 0xd2e2, 1);
1247 if (ret)
1248 goto err;
1249
1250 /* BER / UCB */
1251 buf[0] = (10000 >> 0) & 0xff;
1252 buf[1] = (10000 >> 8) & 0xff;
1253 ret = af9013_wr_regs(state, 0xd385, buf, 2);
1254 if (ret)
1255 goto err;
1256
1257 /* enable FEC monitor */
1258 ret = af9013_wr_reg_bits(state, 0xd392, 1, 1, 1);
1259 if (ret)
1260 goto err;
1261
1262 state->first_tune = true;
1263 schedule_delayed_work(&state->statistics_work, msecs_to_jiffies(400));
1264
1265 return ret;
1266err:
1267 dbg("%s: failed=%d", __func__, ret);
1296 return ret; 1268 return ret;
1297} 1269}
1298 1270
1271static int af9013_sleep(struct dvb_frontend *fe)
1272{
1273 struct af9013_state *state = fe->demodulator_priv;
1274 int ret;
1275
1276 dbg("%s", __func__);
1277
1278 /* stop statistics polling */
1279 cancel_delayed_work_sync(&state->statistics_work);
1280
1281 /* disable lock led */
1282 ret = af9013_wr_reg_bits(state, 0xd730, 0, 1, 0);
1283 if (ret)
1284 goto err;
1285
1286 /* power off */
1287 ret = af9013_power_ctrl(state, 0);
1288 if (ret)
1289 goto err;
1290
1291 return ret;
1292err:
1293 dbg("%s: failed=%d", __func__, ret);
1294 return ret;
1295}
1296
1297static int af9013_i2c_gate_ctrl(struct dvb_frontend *fe, int enable)
1298{
1299 int ret;
1300 struct af9013_state *state = fe->demodulator_priv;
1301
1302 dbg("%s: enable=%d", __func__, enable);
1303
1304 /* gate already open or close */
1305 if (state->i2c_gate_state == enable)
1306 return 0;
1307
1308 if (state->config.ts_mode == AF9013_TS_USB)
1309 ret = af9013_wr_reg_bits(state, 0xd417, 3, 1, enable);
1310 else
1311 ret = af9013_wr_reg_bits(state, 0xd607, 2, 1, enable);
1312 if (ret)
1313 goto err;
1314
1315 state->i2c_gate_state = enable;
1316
1317 return ret;
1318err:
1319 dbg("%s: failed=%d", __func__, ret);
1320 return ret;
1321}
1322
1323static void af9013_release(struct dvb_frontend *fe)
1324{
1325 struct af9013_state *state = fe->demodulator_priv;
1326 kfree(state);
1327}
1328
1299static struct dvb_frontend_ops af9013_ops; 1329static struct dvb_frontend_ops af9013_ops;
1300 1330
1301static int af9013_download_firmware(struct af9013_state *state) 1331static int af9013_download_firmware(struct af9013_state *state)
@@ -1309,11 +1339,11 @@ static int af9013_download_firmware(struct af9013_state *state)
1309 1339
1310 msleep(100); 1340 msleep(100);
1311 /* check whether firmware is already running */ 1341 /* check whether firmware is already running */
1312 ret = af9013_read_reg(state, 0x98be, &val); 1342 ret = af9013_rd_reg(state, 0x98be, &val);
1313 if (ret) 1343 if (ret)
1314 goto error; 1344 goto err;
1315 else 1345 else
1316 deb_info("%s: firmware status:%02x\n", __func__, val); 1346 dbg("%s: firmware status=%02x", __func__, val);
1317 1347
1318 if (val == 0x0c) /* fw is running, no need for download */ 1348 if (val == 0x0c) /* fw is running, no need for download */
1319 goto exit; 1349 goto exit;
@@ -1328,7 +1358,7 @@ static int af9013_download_firmware(struct af9013_state *state)
1328 "Please see linux/Documentation/dvb/ for more details" \ 1358 "Please see linux/Documentation/dvb/ for more details" \
1329 " on firmware-problems. (%d)", 1359 " on firmware-problems. (%d)",
1330 fw_file, ret); 1360 fw_file, ret);
1331 goto error; 1361 goto err;
1332 } 1362 }
1333 1363
1334 info("downloading firmware from file '%s'", fw_file); 1364 info("downloading firmware from file '%s'", fw_file);
@@ -1346,7 +1376,7 @@ static int af9013_download_firmware(struct af9013_state *state)
1346 ret = af9013_write_ofsm_regs(state, 0x50fc, 1376 ret = af9013_write_ofsm_regs(state, 0x50fc,
1347 fw_params, sizeof(fw_params)); 1377 fw_params, sizeof(fw_params));
1348 if (ret) 1378 if (ret)
1349 goto error_release; 1379 goto err_release;
1350 1380
1351 #define FW_ADDR 0x5100 /* firmware start address */ 1381 #define FW_ADDR 0x5100 /* firmware start address */
1352 #define LEN_MAX 16 /* max packet size */ 1382 #define LEN_MAX 16 /* max packet size */
@@ -1360,24 +1390,24 @@ static int af9013_download_firmware(struct af9013_state *state)
1360 (u8 *) &fw->data[fw->size - remaining], len); 1390 (u8 *) &fw->data[fw->size - remaining], len);
1361 if (ret) { 1391 if (ret) {
1362 err("firmware download failed:%d", ret); 1392 err("firmware download failed:%d", ret);
1363 goto error_release; 1393 goto err_release;
1364 } 1394 }
1365 } 1395 }
1366 1396
1367 /* request boot firmware */ 1397 /* request boot firmware */
1368 ret = af9013_write_reg(state, 0xe205, 1); 1398 ret = af9013_wr_reg(state, 0xe205, 1);
1369 if (ret) 1399 if (ret)
1370 goto error_release; 1400 goto err_release;
1371 1401
1372 for (i = 0; i < 15; i++) { 1402 for (i = 0; i < 15; i++) {
1373 msleep(100); 1403 msleep(100);
1374 1404
1375 /* check firmware status */ 1405 /* check firmware status */
1376 ret = af9013_read_reg(state, 0x98be, &val); 1406 ret = af9013_rd_reg(state, 0x98be, &val);
1377 if (ret) 1407 if (ret)
1378 goto error_release; 1408 goto err_release;
1379 1409
1380 deb_info("%s: firmware status:%02x\n", __func__, val); 1410 dbg("%s: firmware status=%02x", __func__, val);
1381 1411
1382 if (val == 0x0c || val == 0x04) /* success or fail */ 1412 if (val == 0x0c || val == 0x04) /* success or fail */
1383 break; 1413 break;
@@ -1385,43 +1415,21 @@ static int af9013_download_firmware(struct af9013_state *state)
1385 1415
1386 if (val == 0x04) { 1416 if (val == 0x04) {
1387 err("firmware did not run"); 1417 err("firmware did not run");
1388 ret = -1; 1418 ret = -ENODEV;
1389 } else if (val != 0x0c) { 1419 } else if (val != 0x0c) {
1390 err("firmware boot timeout"); 1420 err("firmware boot timeout");
1391 ret = -1; 1421 ret = -ENODEV;
1392 } 1422 }
1393 1423
1394error_release: 1424err_release:
1395 release_firmware(fw); 1425 release_firmware(fw);
1396error: 1426err:
1397exit: 1427exit:
1398 if (!ret) 1428 if (!ret)
1399 info("found a '%s' in warm state.", af9013_ops.info.name); 1429 info("found a '%s' in warm state.", af9013_ops.info.name);
1400 return ret; 1430 return ret;
1401} 1431}
1402 1432
1403static int af9013_i2c_gate_ctrl(struct dvb_frontend *fe, int enable)
1404{
1405 int ret;
1406 struct af9013_state *state = fe->demodulator_priv;
1407 deb_info("%s: enable:%d\n", __func__, enable);
1408
1409 if (state->config.output_mode == AF9013_OUTPUT_MODE_USB)
1410 ret = af9013_write_reg_bits(state, 0xd417, 3, 1, enable);
1411 else
1412 ret = af9013_write_reg_bits(state, 0xd607, 2, 1, enable);
1413
1414 return ret;
1415}
1416
1417static void af9013_release(struct dvb_frontend *fe)
1418{
1419 struct af9013_state *state = fe->demodulator_priv;
1420 kfree(state);
1421}
1422
1423static struct dvb_frontend_ops af9013_ops;
1424
1425struct dvb_frontend *af9013_attach(const struct af9013_config *config, 1433struct dvb_frontend *af9013_attach(const struct af9013_config *config,
1426 struct i2c_adapter *i2c) 1434 struct i2c_adapter *i2c)
1427{ 1435{
@@ -1432,73 +1440,42 @@ struct dvb_frontend *af9013_attach(const struct af9013_config *config,
1432 /* allocate memory for the internal state */ 1440 /* allocate memory for the internal state */
1433 state = kzalloc(sizeof(struct af9013_state), GFP_KERNEL); 1441 state = kzalloc(sizeof(struct af9013_state), GFP_KERNEL);
1434 if (state == NULL) 1442 if (state == NULL)
1435 goto error; 1443 goto err;
1436 1444
1437 /* setup the state */ 1445 /* setup the state */
1438 state->i2c = i2c; 1446 state->i2c = i2c;
1439 memcpy(&state->config, config, sizeof(struct af9013_config)); 1447 memcpy(&state->config, config, sizeof(struct af9013_config));
1440 1448
1441 /* download firmware */ 1449 /* download firmware */
1442 if (state->config.output_mode != AF9013_OUTPUT_MODE_USB) { 1450 if (state->config.ts_mode != AF9013_TS_USB) {
1443 ret = af9013_download_firmware(state); 1451 ret = af9013_download_firmware(state);
1444 if (ret) 1452 if (ret)
1445 goto error; 1453 goto err;
1446 } 1454 }
1447 1455
1448 /* firmware version */ 1456 /* firmware version */
1449 for (i = 0; i < 4; i++) { 1457 ret = af9013_rd_regs(state, 0x5103, buf, 4);
1450 ret = af9013_read_reg(state, 0x5103 + i, &buf[i]);
1451 if (ret)
1452 goto error;
1453 }
1454 info("firmware version:%d.%d.%d.%d", buf[0], buf[1], buf[2], buf[3]);
1455
1456 /* chip version */
1457 ret = af9013_read_reg_bits(state, 0xd733, 4, 4, &buf[2]);
1458 if (ret) 1458 if (ret)
1459 goto error; 1459 goto err;
1460 1460
1461 /* ROM version */ 1461 info("firmware version %d.%d.%d.%d", buf[0], buf[1], buf[2], buf[3]);
1462 for (i = 0; i < 2; i++) {
1463 ret = af9013_read_reg(state, 0x116b + i, &buf[i]);
1464 if (ret)
1465 goto error;
1466 }
1467 deb_info("%s: chip version:%d ROM version:%d.%d\n", __func__,
1468 buf[2], buf[0], buf[1]);
1469
1470 /* settings for mp2if */
1471 if (state->config.output_mode == AF9013_OUTPUT_MODE_USB) {
1472 /* AF9015 split PSB to 1.5k + 0.5k */
1473 ret = af9013_write_reg_bits(state, 0xd50b, 2, 1, 1);
1474 } else {
1475 /* AF9013 change the output bit to data7 */
1476 ret = af9013_write_reg_bits(state, 0xd500, 3, 1, 1);
1477 if (ret)
1478 goto error;
1479 /* AF9013 set mpeg to full speed */
1480 ret = af9013_write_reg_bits(state, 0xd502, 4, 1, 1);
1481 }
1482 if (ret)
1483 goto error;
1484 ret = af9013_write_reg_bits(state, 0xd520, 4, 1, 1);
1485 if (ret)
1486 goto error;
1487 1462
1488 /* set GPIOs */ 1463 /* set GPIOs */
1489 for (i = 0; i < sizeof(state->config.gpio); i++) { 1464 for (i = 0; i < sizeof(state->config.gpio); i++) {
1490 ret = af9013_set_gpio(state, i, state->config.gpio[i]); 1465 ret = af9013_set_gpio(state, i, state->config.gpio[i]);
1491 if (ret) 1466 if (ret)
1492 goto error; 1467 goto err;
1493 } 1468 }
1494 1469
1495 /* create dvb_frontend */ 1470 /* create dvb_frontend */
1496 memcpy(&state->frontend.ops, &af9013_ops, 1471 memcpy(&state->fe.ops, &af9013_ops,
1497 sizeof(struct dvb_frontend_ops)); 1472 sizeof(struct dvb_frontend_ops));
1498 state->frontend.demodulator_priv = state; 1473 state->fe.demodulator_priv = state;
1474
1475 INIT_DELAYED_WORK(&state->statistics_work, af9013_statistics_work);
1499 1476
1500 return &state->frontend; 1477 return &state->fe;
1501error: 1478err:
1502 kfree(state); 1479 kfree(state);
1503 return NULL; 1480 return NULL;
1504} 1481}
@@ -1506,17 +1483,22 @@ EXPORT_SYMBOL(af9013_attach);
1506 1483
1507static struct dvb_frontend_ops af9013_ops = { 1484static struct dvb_frontend_ops af9013_ops = {
1508 .info = { 1485 .info = {
1509 .name = "Afatech AF9013 DVB-T", 1486 .name = "Afatech AF9013",
1510 .type = FE_OFDM, 1487 .type = FE_OFDM,
1511 .frequency_min = 174000000, 1488 .frequency_min = 174000000,
1512 .frequency_max = 862000000, 1489 .frequency_max = 862000000,
1513 .frequency_stepsize = 250000, 1490 .frequency_stepsize = 250000,
1514 .frequency_tolerance = 0, 1491 .frequency_tolerance = 0,
1515 .caps = 1492 .caps = FE_CAN_FEC_1_2 |
1516 FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 | 1493 FE_CAN_FEC_2_3 |
1517 FE_CAN_FEC_5_6 | FE_CAN_FEC_7_8 | FE_CAN_FEC_AUTO | 1494 FE_CAN_FEC_3_4 |
1518 FE_CAN_QPSK | FE_CAN_QAM_16 | 1495 FE_CAN_FEC_5_6 |
1519 FE_CAN_QAM_64 | FE_CAN_QAM_AUTO | 1496 FE_CAN_FEC_7_8 |
1497 FE_CAN_FEC_AUTO |
1498 FE_CAN_QPSK |
1499 FE_CAN_QAM_16 |
1500 FE_CAN_QAM_64 |
1501 FE_CAN_QAM_AUTO |
1520 FE_CAN_TRANSMISSION_MODE_AUTO | 1502 FE_CAN_TRANSMISSION_MODE_AUTO |
1521 FE_CAN_GUARD_INTERVAL_AUTO | 1503 FE_CAN_GUARD_INTERVAL_AUTO |
1522 FE_CAN_HIERARCHY_AUTO | 1504 FE_CAN_HIERARCHY_AUTO |
@@ -1525,24 +1507,22 @@ static struct dvb_frontend_ops af9013_ops = {
1525 }, 1507 },
1526 1508
1527 .release = af9013_release, 1509 .release = af9013_release,
1510
1528 .init = af9013_init, 1511 .init = af9013_init,
1529 .sleep = af9013_sleep, 1512 .sleep = af9013_sleep,
1530 .i2c_gate_ctrl = af9013_i2c_gate_ctrl,
1531 1513
1514 .get_tune_settings = af9013_get_tune_settings,
1532 .set_frontend = af9013_set_frontend, 1515 .set_frontend = af9013_set_frontend,
1533 .get_frontend = af9013_get_frontend, 1516 .get_frontend = af9013_get_frontend,
1534 1517
1535 .get_tune_settings = af9013_get_tune_settings,
1536
1537 .read_status = af9013_read_status, 1518 .read_status = af9013_read_status,
1538 .read_ber = af9013_read_ber,
1539 .read_signal_strength = af9013_read_signal_strength,
1540 .read_snr = af9013_read_snr, 1519 .read_snr = af9013_read_snr,
1520 .read_signal_strength = af9013_read_signal_strength,
1521 .read_ber = af9013_read_ber,
1541 .read_ucblocks = af9013_read_ucblocks, 1522 .read_ucblocks = af9013_read_ucblocks,
1542};
1543 1523
1544module_param_named(debug, af9013_debug, int, 0644); 1524 .i2c_gate_ctrl = af9013_i2c_gate_ctrl,
1545MODULE_PARM_DESC(debug, "Turn on/off frontend debugging (default:off)."); 1525};
1546 1526
1547MODULE_AUTHOR("Antti Palosaari <crope@iki.fi>"); 1527MODULE_AUTHOR("Antti Palosaari <crope@iki.fi>");
1548MODULE_DESCRIPTION("Afatech AF9013 DVB-T demodulator driver"); 1528MODULE_DESCRIPTION("Afatech AF9013 DVB-T demodulator driver");
diff --git a/drivers/media/dvb/frontends/af9013.h b/drivers/media/dvb/frontends/af9013.h
index e53d873f7555..b973fc5a0384 100644
--- a/drivers/media/dvb/frontends/af9013.h
+++ b/drivers/media/dvb/frontends/af9013.h
@@ -2,6 +2,7 @@
2 * Afatech AF9013 demodulator driver 2 * Afatech AF9013 demodulator driver
3 * 3 *
4 * Copyright (C) 2007 Antti Palosaari <crope@iki.fi> 4 * Copyright (C) 2007 Antti Palosaari <crope@iki.fi>
5 * Copyright (C) 2011 Antti Palosaari <crope@iki.fi>
5 * 6 *
6 * Thanks to Afatech who kindly provided information. 7 * Thanks to Afatech who kindly provided information.
7 * 8 *
@@ -21,33 +22,11 @@
21 * 22 *
22 */ 23 */
23 24
24#ifndef _AF9013_H_ 25#ifndef AF9013_H
25#define _AF9013_H_ 26#define AF9013_H
26 27
27#include <linux/dvb/frontend.h> 28#include <linux/dvb/frontend.h>
28 29
29enum af9013_ts_mode {
30 AF9013_OUTPUT_MODE_PARALLEL,
31 AF9013_OUTPUT_MODE_SERIAL,
32 AF9013_OUTPUT_MODE_USB, /* only for AF9015 */
33};
34
35enum af9013_tuner {
36 AF9013_TUNER_MXL5003D = 3, /* MaxLinear */
37 AF9013_TUNER_MXL5005D = 13, /* MaxLinear */
38 AF9013_TUNER_MXL5005R = 30, /* MaxLinear */
39 AF9013_TUNER_ENV77H11D5 = 129, /* Panasonic */
40 AF9013_TUNER_MT2060 = 130, /* Microtune */
41 AF9013_TUNER_MC44S803 = 133, /* Freescale */
42 AF9013_TUNER_QT1010 = 134, /* Quantek */
43 AF9013_TUNER_UNKNOWN = 140, /* for can tuners ? */
44 AF9013_TUNER_MT2060_2 = 147, /* Microtune */
45 AF9013_TUNER_TDA18271 = 156, /* NXP */
46 AF9013_TUNER_QT1010A = 162, /* Quantek */
47 AF9013_TUNER_MXL5007T = 177, /* MaxLinear */
48 AF9013_TUNER_TDA18218 = 179, /* NXP */
49};
50
51/* AF9013/5 GPIOs (mostly guessed) 30/* AF9013/5 GPIOs (mostly guessed)
52 demod#1-gpio#0 - set demod#2 i2c-addr for dual devices 31 demod#1-gpio#0 - set demod#2 i2c-addr for dual devices
53 demod#1-gpio#1 - xtal setting (?) 32 demod#1-gpio#1 - xtal setting (?)
@@ -55,44 +34,74 @@ enum af9013_tuner {
55 demod#2-gpio#0 - tuner#2 34 demod#2-gpio#0 - tuner#2
56 demod#2-gpio#1 - xtal setting (?) 35 demod#2-gpio#1 - xtal setting (?)
57*/ 36*/
37
38struct af9013_config {
39 /*
40 * I2C address
41 */
42 u8 i2c_addr;
43
44 /*
45 * clock
46 * 20480000, 25000000, 28000000, 28800000
47 */
48 u32 clock;
49
50 /*
51 * tuner
52 */
53#define AF9013_TUNER_MXL5003D 3 /* MaxLinear */
54#define AF9013_TUNER_MXL5005D 13 /* MaxLinear */
55#define AF9013_TUNER_MXL5005R 30 /* MaxLinear */
56#define AF9013_TUNER_ENV77H11D5 129 /* Panasonic */
57#define AF9013_TUNER_MT2060 130 /* Microtune */
58#define AF9013_TUNER_MC44S803 133 /* Freescale */
59#define AF9013_TUNER_QT1010 134 /* Quantek */
60#define AF9013_TUNER_UNKNOWN 140 /* for can tuners ? */
61#define AF9013_TUNER_MT2060_2 147 /* Microtune */
62#define AF9013_TUNER_TDA18271 156 /* NXP */
63#define AF9013_TUNER_QT1010A 162 /* Quantek */
64#define AF9013_TUNER_MXL5007T 177 /* MaxLinear */
65#define AF9013_TUNER_TDA18218 179 /* NXP */
66 u8 tuner;
67
68 /*
69 * IF frequency
70 */
71 u32 if_frequency;
72
73 /*
74 * TS settings
75 */
76#define AF9013_TS_USB 0
77#define AF9013_TS_PARALLEL 1
78#define AF9013_TS_SERIAL 2
79 u8 ts_mode:2;
80
81 /*
82 * input spectrum inversion
83 */
84 bool spec_inv;
85
86 /*
87 * firmware API version
88 */
89 u8 api_version[4];
90
91 /*
92 * GPIOs
93 */
58#define AF9013_GPIO_ON (1 << 0) 94#define AF9013_GPIO_ON (1 << 0)
59#define AF9013_GPIO_EN (1 << 1) 95#define AF9013_GPIO_EN (1 << 1)
60#define AF9013_GPIO_O (1 << 2) 96#define AF9013_GPIO_O (1 << 2)
61#define AF9013_GPIO_I (1 << 3) 97#define AF9013_GPIO_I (1 << 3)
62
63#define AF9013_GPIO_LO (AF9013_GPIO_ON|AF9013_GPIO_EN) 98#define AF9013_GPIO_LO (AF9013_GPIO_ON|AF9013_GPIO_EN)
64#define AF9013_GPIO_HI (AF9013_GPIO_ON|AF9013_GPIO_EN|AF9013_GPIO_O) 99#define AF9013_GPIO_HI (AF9013_GPIO_ON|AF9013_GPIO_EN|AF9013_GPIO_O)
65
66#define AF9013_GPIO_TUNER_ON (AF9013_GPIO_ON|AF9013_GPIO_EN) 100#define AF9013_GPIO_TUNER_ON (AF9013_GPIO_ON|AF9013_GPIO_EN)
67#define AF9013_GPIO_TUNER_OFF (AF9013_GPIO_ON|AF9013_GPIO_EN|AF9013_GPIO_O) 101#define AF9013_GPIO_TUNER_OFF (AF9013_GPIO_ON|AF9013_GPIO_EN|AF9013_GPIO_O)
68
69struct af9013_config {
70 /* demodulator's I2C address */
71 u8 demod_address;
72
73 /* frequencies in kHz */
74 u32 adc_clock;
75
76 /* tuner ID */
77 u8 tuner;
78
79 /* tuner IF */
80 u16 tuner_if;
81
82 /* TS data output mode */
83 u8 output_mode:2;
84
85 /* RF spectrum inversion */
86 u8 rf_spec_inv:1;
87
88 /* API version */
89 u8 api_version[4];
90
91 /* GPIOs */
92 u8 gpio[4]; 102 u8 gpio[4];
93}; 103};
94 104
95
96#if defined(CONFIG_DVB_AF9013) || \ 105#if defined(CONFIG_DVB_AF9013) || \
97 (defined(CONFIG_DVB_AF9013_MODULE) && defined(MODULE)) 106 (defined(CONFIG_DVB_AF9013_MODULE) && defined(MODULE))
98extern struct dvb_frontend *af9013_attach(const struct af9013_config *config, 107extern struct dvb_frontend *af9013_attach(const struct af9013_config *config,
@@ -106,4 +115,4 @@ const struct af9013_config *config, struct i2c_adapter *i2c)
106} 115}
107#endif /* CONFIG_DVB_AF9013 */ 116#endif /* CONFIG_DVB_AF9013 */
108 117
109#endif /* _AF9013_H_ */ 118#endif /* AF9013_H */
diff --git a/drivers/media/dvb/frontends/af9013_priv.h b/drivers/media/dvb/frontends/af9013_priv.h
index e00b2a4a2db6..fa848af6e9b4 100644
--- a/drivers/media/dvb/frontends/af9013_priv.h
+++ b/drivers/media/dvb/frontends/af9013_priv.h
@@ -2,6 +2,7 @@
2 * Afatech AF9013 demodulator driver 2 * Afatech AF9013 demodulator driver
3 * 3 *
4 * Copyright (C) 2007 Antti Palosaari <crope@iki.fi> 4 * Copyright (C) 2007 Antti Palosaari <crope@iki.fi>
5 * Copyright (C) 2011 Antti Palosaari <crope@iki.fi>
5 * 6 *
6 * Thanks to Afatech who kindly provided information. 7 * Thanks to Afatech who kindly provided information.
7 * 8 *
@@ -21,24 +22,19 @@
21 * 22 *
22 */ 23 */
23 24
24#ifndef _AF9013_PRIV_ 25#ifndef AF9013_PRIV_H
25#define _AF9013_PRIV_ 26#define AF9013_PRIV_H
26 27
27#define LOG_PREFIX "af9013" 28#include "dvb_frontend.h"
28extern int af9013_debug; 29#include "af9013.h"
29 30#include <linux/firmware.h>
30#define dprintk(var, level, args...) \
31 do { if ((var & level)) printk(args); } while (0)
32 31
33#define debug_dump(b, l, func) {\ 32#define LOG_PREFIX "af9013"
34 int loop_; \
35 for (loop_ = 0; loop_ < l; loop_++) \
36 func("%02x ", b[loop_]); \
37 func("\n");\
38}
39
40#define deb_info(args...) dprintk(af9013_debug, 0x01, args)
41 33
34#undef dbg
35#define dbg(f, arg...) \
36 if (af9013_debug) \
37 printk(KERN_INFO LOG_PREFIX": " f "\n" , ## arg)
42#undef err 38#undef err
43#define err(f, arg...) printk(KERN_ERR LOG_PREFIX": " f "\n" , ## arg) 39#define err(f, arg...) printk(KERN_ERR LOG_PREFIX": " f "\n" , ## arg)
44#undef info 40#undef info
@@ -48,70 +44,71 @@ extern int af9013_debug;
48 44
49#define AF9013_DEFAULT_FIRMWARE "dvb-fe-af9013.fw" 45#define AF9013_DEFAULT_FIRMWARE "dvb-fe-af9013.fw"
50 46
51struct regdesc { 47struct af9013_reg_bit {
52 u16 addr; 48 u16 addr;
53 u8 pos:4; 49 u8 pos:4;
54 u8 len:4; 50 u8 len:4;
55 u8 val; 51 u8 val;
56}; 52};
57 53
58struct snr_table { 54struct af9013_snr {
59 u32 val; 55 u32 val;
60 u8 snr; 56 u8 snr;
61}; 57};
62 58
63struct coeff { 59struct af9013_coeff {
64 u32 adc_clock; 60 u32 clock;
65 fe_bandwidth_t bw; 61 u32 bandwidth_hz;
66 u8 val[24]; 62 u8 val[24];
67}; 63};
68 64
69/* pre-calculated coeff lookup table */ 65/* pre-calculated coeff lookup table */
70static struct coeff coeff_table[] = { 66static const struct af9013_coeff coeff_lut[] = {
71 /* 28.800 MHz */ 67 /* 28.800 MHz */
72 { 28800, BANDWIDTH_8_MHZ, { 0x02, 0x8a, 0x28, 0xa3, 0x05, 0x14, 68 { 28800000, 8000000, { 0x02, 0x8a, 0x28, 0xa3, 0x05, 0x14,
73 0x51, 0x11, 0x00, 0xa2, 0x8f, 0x3d, 0x00, 0xa2, 0x8a, 69 0x51, 0x11, 0x00, 0xa2, 0x8f, 0x3d, 0x00, 0xa2, 0x8a,
74 0x29, 0x00, 0xa2, 0x85, 0x14, 0x01, 0x45, 0x14, 0x14 } }, 70 0x29, 0x00, 0xa2, 0x85, 0x14, 0x01, 0x45, 0x14, 0x14 } },
75 { 28800, BANDWIDTH_7_MHZ, { 0x02, 0x38, 0xe3, 0x8e, 0x04, 0x71, 71 { 28800000, 7000000, { 0x02, 0x38, 0xe3, 0x8e, 0x04, 0x71,
76 0xc7, 0x07, 0x00, 0x8e, 0x3d, 0x55, 0x00, 0x8e, 0x38, 72 0xc7, 0x07, 0x00, 0x8e, 0x3d, 0x55, 0x00, 0x8e, 0x38,
77 0xe4, 0x00, 0x8e, 0x34, 0x72, 0x01, 0x1c, 0x71, 0x32 } }, 73 0xe4, 0x00, 0x8e, 0x34, 0x72, 0x01, 0x1c, 0x71, 0x32 } },
78 { 28800, BANDWIDTH_6_MHZ, { 0x01, 0xe7, 0x9e, 0x7a, 0x03, 0xcf, 74 { 28800000, 6000000, { 0x01, 0xe7, 0x9e, 0x7a, 0x03, 0xcf,
79 0x3c, 0x3d, 0x00, 0x79, 0xeb, 0x6e, 0x00, 0x79, 0xe7, 75 0x3c, 0x3d, 0x00, 0x79, 0xeb, 0x6e, 0x00, 0x79, 0xe7,
80 0x9e, 0x00, 0x79, 0xe3, 0xcf, 0x00, 0xf3, 0xcf, 0x0f } }, 76 0x9e, 0x00, 0x79, 0xe3, 0xcf, 0x00, 0xf3, 0xcf, 0x0f } },
81 /* 20.480 MHz */ 77 /* 20.480 MHz */
82 { 20480, BANDWIDTH_8_MHZ, { 0x03, 0x92, 0x49, 0x26, 0x07, 0x24, 78 { 20480000, 8000000, { 0x03, 0x92, 0x49, 0x26, 0x07, 0x24,
83 0x92, 0x13, 0x00, 0xe4, 0x99, 0x6e, 0x00, 0xe4, 0x92, 79 0x92, 0x13, 0x00, 0xe4, 0x99, 0x6e, 0x00, 0xe4, 0x92,
84 0x49, 0x00, 0xe4, 0x8b, 0x25, 0x01, 0xc9, 0x24, 0x25 } }, 80 0x49, 0x00, 0xe4, 0x8b, 0x25, 0x01, 0xc9, 0x24, 0x25 } },
85 { 20480, BANDWIDTH_7_MHZ, { 0x03, 0x20, 0x00, 0x01, 0x06, 0x40, 81 { 20480000, 7000000, { 0x03, 0x20, 0x00, 0x01, 0x06, 0x40,
86 0x00, 0x00, 0x00, 0xc8, 0x06, 0x40, 0x00, 0xc8, 0x00, 82 0x00, 0x00, 0x00, 0xc8, 0x06, 0x40, 0x00, 0xc8, 0x00,
87 0x00, 0x00, 0xc7, 0xf9, 0xc0, 0x01, 0x90, 0x00, 0x00 } }, 83 0x00, 0x00, 0xc7, 0xf9, 0xc0, 0x01, 0x90, 0x00, 0x00 } },
88 { 20480, BANDWIDTH_6_MHZ, { 0x02, 0xad, 0xb6, 0xdc, 0x05, 0x5b, 84 { 20480000, 6000000, { 0x02, 0xad, 0xb6, 0xdc, 0x05, 0x5b,
89 0x6d, 0x2e, 0x00, 0xab, 0x73, 0x13, 0x00, 0xab, 0x6d, 85 0x6d, 0x2e, 0x00, 0xab, 0x73, 0x13, 0x00, 0xab, 0x6d,
90 0xb7, 0x00, 0xab, 0x68, 0x5c, 0x01, 0x56, 0xdb, 0x1c } }, 86 0xb7, 0x00, 0xab, 0x68, 0x5c, 0x01, 0x56, 0xdb, 0x1c } },
91 /* 28.000 MHz */ 87 /* 28.000 MHz */
92 { 28000, BANDWIDTH_8_MHZ, { 0x02, 0x9c, 0xbc, 0x15, 0x05, 0x39, 88 { 28000000, 8000000, { 0x02, 0x9c, 0xbc, 0x15, 0x05, 0x39,
93 0x78, 0x0a, 0x00, 0xa7, 0x34, 0x3f, 0x00, 0xa7, 0x2f, 89 0x78, 0x0a, 0x00, 0xa7, 0x34, 0x3f, 0x00, 0xa7, 0x2f,
94 0x05, 0x00, 0xa7, 0x29, 0xcc, 0x01, 0x4e, 0x5e, 0x03 } }, 90 0x05, 0x00, 0xa7, 0x29, 0xcc, 0x01, 0x4e, 0x5e, 0x03 } },
95 { 28000, BANDWIDTH_7_MHZ, { 0x02, 0x49, 0x24, 0x92, 0x04, 0x92, 91 { 28000000, 7000000, { 0x02, 0x49, 0x24, 0x92, 0x04, 0x92,
96 0x49, 0x09, 0x00, 0x92, 0x4d, 0xb7, 0x00, 0x92, 0x49, 92 0x49, 0x09, 0x00, 0x92, 0x4d, 0xb7, 0x00, 0x92, 0x49,
97 0x25, 0x00, 0x92, 0x44, 0x92, 0x01, 0x24, 0x92, 0x12 } }, 93 0x25, 0x00, 0x92, 0x44, 0x92, 0x01, 0x24, 0x92, 0x12 } },
98 { 28000, BANDWIDTH_6_MHZ, { 0x01, 0xf5, 0x8d, 0x10, 0x03, 0xeb, 94 { 28000000, 6000000, { 0x01, 0xf5, 0x8d, 0x10, 0x03, 0xeb,
99 0x1a, 0x08, 0x00, 0x7d, 0x67, 0x2f, 0x00, 0x7d, 0x63, 95 0x1a, 0x08, 0x00, 0x7d, 0x67, 0x2f, 0x00, 0x7d, 0x63,
100 0x44, 0x00, 0x7d, 0x5f, 0x59, 0x00, 0xfa, 0xc6, 0x22 } }, 96 0x44, 0x00, 0x7d, 0x5f, 0x59, 0x00, 0xfa, 0xc6, 0x22 } },
101 /* 25.000 MHz */ 97 /* 25.000 MHz */
102 { 25000, BANDWIDTH_8_MHZ, { 0x02, 0xec, 0xfb, 0x9d, 0x05, 0xd9, 98 { 25000000, 8000000, { 0x02, 0xec, 0xfb, 0x9d, 0x05, 0xd9,
103 0xf7, 0x0e, 0x00, 0xbb, 0x44, 0xc1, 0x00, 0xbb, 0x3e, 99 0xf7, 0x0e, 0x00, 0xbb, 0x44, 0xc1, 0x00, 0xbb, 0x3e,
104 0xe7, 0x00, 0xbb, 0x39, 0x0d, 0x01, 0x76, 0x7d, 0x34 } }, 100 0xe7, 0x00, 0xbb, 0x39, 0x0d, 0x01, 0x76, 0x7d, 0x34 } },
105 { 25000, BANDWIDTH_7_MHZ, { 0x02, 0x8f, 0x5c, 0x29, 0x05, 0x1e, 101 { 25000000, 7000000, { 0x02, 0x8f, 0x5c, 0x29, 0x05, 0x1e,
106 0xb8, 0x14, 0x00, 0xa3, 0xdc, 0x29, 0x00, 0xa3, 0xd7, 102 0xb8, 0x14, 0x00, 0xa3, 0xdc, 0x29, 0x00, 0xa3, 0xd7,
107 0x0a, 0x00, 0xa3, 0xd1, 0xec, 0x01, 0x47, 0xae, 0x05 } }, 103 0x0a, 0x00, 0xa3, 0xd1, 0xec, 0x01, 0x47, 0xae, 0x05 } },
108 { 25000, BANDWIDTH_6_MHZ, { 0x02, 0x31, 0xbc, 0xb5, 0x04, 0x63, 104 { 25000000, 6000000, { 0x02, 0x31, 0xbc, 0xb5, 0x04, 0x63,
109 0x79, 0x1b, 0x00, 0x8c, 0x73, 0x91, 0x00, 0x8c, 0x6f, 105 0x79, 0x1b, 0x00, 0x8c, 0x73, 0x91, 0x00, 0x8c, 0x6f,
110 0x2d, 0x00, 0x8c, 0x6a, 0xca, 0x01, 0x18, 0xde, 0x17 } }, 106 0x2d, 0x00, 0x8c, 0x6a, 0xca, 0x01, 0x18, 0xde, 0x17 } },
111}; 107};
112 108
113/* QPSK SNR lookup table */ 109/* QPSK SNR lookup table */
114static struct snr_table qpsk_snr_table[] = { 110static const struct af9013_snr qpsk_snr_lut[] = {
111 { 0x000000, 0 },
115 { 0x0b4771, 0 }, 112 { 0x0b4771, 0 },
116 { 0x0c1aed, 1 }, 113 { 0x0c1aed, 1 },
117 { 0x0d0d27, 2 }, 114 { 0x0d0d27, 2 },
@@ -131,7 +128,8 @@ static struct snr_table qpsk_snr_table[] = {
131}; 128};
132 129
133/* QAM16 SNR lookup table */ 130/* QAM16 SNR lookup table */
134static struct snr_table qam16_snr_table[] = { 131static const struct af9013_snr qam16_snr_lut[] = {
132 { 0x000000, 0 },
135 { 0x05eb62, 5 }, 133 { 0x05eb62, 5 },
136 { 0x05fecf, 6 }, 134 { 0x05fecf, 6 },
137 { 0x060b80, 7 }, 135 { 0x060b80, 7 },
@@ -151,7 +149,8 @@ static struct snr_table qam16_snr_table[] = {
151}; 149};
152 150
153/* QAM64 SNR lookup table */ 151/* QAM64 SNR lookup table */
154static struct snr_table qam64_snr_table[] = { 152static const struct af9013_snr qam64_snr_lut[] = {
153 { 0x000000, 0 },
155 { 0x03109b, 12 }, 154 { 0x03109b, 12 },
156 { 0x0310d4, 13 }, 155 { 0x0310d4, 13 },
157 { 0x031920, 14 }, 156 { 0x031920, 14 },
@@ -170,7 +169,7 @@ static struct snr_table qam64_snr_table[] = {
170 { 0xffffff, 27 }, 169 { 0xffffff, 27 },
171}; 170};
172 171
173static struct regdesc ofsm_init[] = { 172static const struct af9013_reg_bit ofsm_init[] = {
174 { 0xd73a, 0, 8, 0xa1 }, 173 { 0xd73a, 0, 8, 0xa1 },
175 { 0xd73b, 0, 8, 0x1f }, 174 { 0xd73b, 0, 8, 0x1f },
176 { 0xd73c, 4, 4, 0x0a }, 175 { 0xd73c, 4, 4, 0x0a },
@@ -252,7 +251,7 @@ static struct regdesc ofsm_init[] = {
252 251
253/* Panasonic ENV77H11D5 tuner init 252/* Panasonic ENV77H11D5 tuner init
254 AF9013_TUNER_ENV77H11D5 = 129 */ 253 AF9013_TUNER_ENV77H11D5 = 129 */
255static struct regdesc tuner_init_env77h11d5[] = { 254static const struct af9013_reg_bit tuner_init_env77h11d5[] = {
256 { 0x9bd5, 0, 8, 0x01 }, 255 { 0x9bd5, 0, 8, 0x01 },
257 { 0x9bd6, 0, 8, 0x03 }, 256 { 0x9bd6, 0, 8, 0x03 },
258 { 0x9bbe, 0, 8, 0x01 }, 257 { 0x9bbe, 0, 8, 0x01 },
@@ -318,7 +317,7 @@ static struct regdesc tuner_init_env77h11d5[] = {
318 317
319/* Microtune MT2060 tuner init 318/* Microtune MT2060 tuner init
320 AF9013_TUNER_MT2060 = 130 */ 319 AF9013_TUNER_MT2060 = 130 */
321static struct regdesc tuner_init_mt2060[] = { 320static const struct af9013_reg_bit tuner_init_mt2060[] = {
322 { 0x9bd5, 0, 8, 0x01 }, 321 { 0x9bd5, 0, 8, 0x01 },
323 { 0x9bd6, 0, 8, 0x07 }, 322 { 0x9bd6, 0, 8, 0x07 },
324 { 0xd1a0, 1, 1, 0x01 }, 323 { 0xd1a0, 1, 1, 0x01 },
@@ -395,7 +394,7 @@ static struct regdesc tuner_init_mt2060[] = {
395 394
396/* Microtune MT2060 tuner init 395/* Microtune MT2060 tuner init
397 AF9013_TUNER_MT2060_2 = 147 */ 396 AF9013_TUNER_MT2060_2 = 147 */
398static struct regdesc tuner_init_mt2060_2[] = { 397static const struct af9013_reg_bit tuner_init_mt2060_2[] = {
399 { 0x9bd5, 0, 8, 0x01 }, 398 { 0x9bd5, 0, 8, 0x01 },
400 { 0x9bd6, 0, 8, 0x06 }, 399 { 0x9bd6, 0, 8, 0x06 },
401 { 0x9bbe, 0, 8, 0x01 }, 400 { 0x9bbe, 0, 8, 0x01 },
@@ -462,7 +461,7 @@ static struct regdesc tuner_init_mt2060_2[] = {
462 461
463/* MaxLinear MXL5003 tuner init 462/* MaxLinear MXL5003 tuner init
464 AF9013_TUNER_MXL5003D = 3 */ 463 AF9013_TUNER_MXL5003D = 3 */
465static struct regdesc tuner_init_mxl5003d[] = { 464static const struct af9013_reg_bit tuner_init_mxl5003d[] = {
466 { 0x9bd5, 0, 8, 0x01 }, 465 { 0x9bd5, 0, 8, 0x01 },
467 { 0x9bd6, 0, 8, 0x09 }, 466 { 0x9bd6, 0, 8, 0x09 },
468 { 0xd1a0, 1, 1, 0x01 }, 467 { 0xd1a0, 1, 1, 0x01 },
@@ -534,7 +533,7 @@ static struct regdesc tuner_init_mxl5003d[] = {
534 AF9013_TUNER_MXL5005D = 13 533 AF9013_TUNER_MXL5005D = 13
535 AF9013_TUNER_MXL5005R = 30 534 AF9013_TUNER_MXL5005R = 30
536 AF9013_TUNER_MXL5007T = 177 */ 535 AF9013_TUNER_MXL5007T = 177 */
537static struct regdesc tuner_init_mxl5005[] = { 536static const struct af9013_reg_bit tuner_init_mxl5005[] = {
538 { 0x9bd5, 0, 8, 0x01 }, 537 { 0x9bd5, 0, 8, 0x01 },
539 { 0x9bd6, 0, 8, 0x07 }, 538 { 0x9bd6, 0, 8, 0x07 },
540 { 0xd1a0, 1, 1, 0x01 }, 539 { 0xd1a0, 1, 1, 0x01 },
@@ -613,7 +612,7 @@ static struct regdesc tuner_init_mxl5005[] = {
613/* Quantek QT1010 tuner init 612/* Quantek QT1010 tuner init
614 AF9013_TUNER_QT1010 = 134 613 AF9013_TUNER_QT1010 = 134
615 AF9013_TUNER_QT1010A = 162 */ 614 AF9013_TUNER_QT1010A = 162 */
616static struct regdesc tuner_init_qt1010[] = { 615static const struct af9013_reg_bit tuner_init_qt1010[] = {
617 { 0x9bd5, 0, 8, 0x01 }, 616 { 0x9bd5, 0, 8, 0x01 },
618 { 0x9bd6, 0, 8, 0x09 }, 617 { 0x9bd6, 0, 8, 0x09 },
619 { 0xd1a0, 1, 1, 0x01 }, 618 { 0xd1a0, 1, 1, 0x01 },
@@ -690,7 +689,7 @@ static struct regdesc tuner_init_qt1010[] = {
690 689
691/* Freescale MC44S803 tuner init 690/* Freescale MC44S803 tuner init
692 AF9013_TUNER_MC44S803 = 133 */ 691 AF9013_TUNER_MC44S803 = 133 */
693static struct regdesc tuner_init_mc44s803[] = { 692static const struct af9013_reg_bit tuner_init_mc44s803[] = {
694 { 0x9bd5, 0, 8, 0x01 }, 693 { 0x9bd5, 0, 8, 0x01 },
695 { 0x9bd6, 0, 8, 0x06 }, 694 { 0x9bd6, 0, 8, 0x06 },
696 { 0xd1a0, 1, 1, 0x01 }, 695 { 0xd1a0, 1, 1, 0x01 },
@@ -772,7 +771,7 @@ static struct regdesc tuner_init_mc44s803[] = {
772 771
773/* unknown, probably for tin can tuner, tuner init 772/* unknown, probably for tin can tuner, tuner init
774 AF9013_TUNER_UNKNOWN = 140 */ 773 AF9013_TUNER_UNKNOWN = 140 */
775static struct regdesc tuner_init_unknown[] = { 774static const struct af9013_reg_bit tuner_init_unknown[] = {
776 { 0x9bd5, 0, 8, 0x01 }, 775 { 0x9bd5, 0, 8, 0x01 },
777 { 0x9bd6, 0, 8, 0x02 }, 776 { 0x9bd6, 0, 8, 0x02 },
778 { 0xd1a0, 1, 1, 0x01 }, 777 { 0xd1a0, 1, 1, 0x01 },
@@ -845,7 +844,7 @@ static struct regdesc tuner_init_unknown[] = {
845/* NXP TDA18271 & TDA18218 tuner init 844/* NXP TDA18271 & TDA18218 tuner init
846 AF9013_TUNER_TDA18271 = 156 845 AF9013_TUNER_TDA18271 = 156
847 AF9013_TUNER_TDA18218 = 179 */ 846 AF9013_TUNER_TDA18218 = 179 */
848static struct regdesc tuner_init_tda18271[] = { 847static const struct af9013_reg_bit tuner_init_tda18271[] = {
849 { 0x9bd5, 0, 8, 0x01 }, 848 { 0x9bd5, 0, 8, 0x01 },
850 { 0x9bd6, 0, 8, 0x04 }, 849 { 0x9bd6, 0, 8, 0x04 },
851 { 0xd1a0, 1, 1, 0x01 }, 850 { 0xd1a0, 1, 1, 0x01 },
@@ -920,4 +919,4 @@ static struct regdesc tuner_init_tda18271[] = {
920 { 0x9bee, 0, 1, 0x01 }, 919 { 0x9bee, 0, 1, 0x01 },
921}; 920};
922 921
923#endif /* _AF9013_PRIV_ */ 922#endif /* AF9013_PRIV_H */