diff options
author | Antti Palosaari <crope@iki.fi> | 2011-11-28 18:58:11 -0500 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@redhat.com> | 2011-12-30 12:31:33 -0500 |
commit | f571e004c396c2ed8c2ba6bfc8a229b6bd5ab724 (patch) | |
tree | 7c5559319e97d66212ac1cf0ac5281bed75a8cdc | |
parent | e90ab840fb826621c8c01cc9e70ca3f0889fa416 (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.c | 82 | ||||
-rw-r--r-- | drivers/media/dvb/frontends/af9013.c | 1700 | ||||
-rw-r--r-- | drivers/media/dvb/frontends/af9013.h | 113 | ||||
-rw-r--r-- | drivers/media/dvb/frontends/af9013_priv.h | 93 |
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 | ||
51 | static struct af9013_config af9015_af9013_config[] = { | 51 | static 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 | ||
981 | error: | 983 | error: |
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 | ||
37 | int af9013_debug; | 27 | int af9013_debug; |
28 | module_param_named(debug, af9013_debug, int, 0644); | ||
29 | MODULE_PARM_DESC(debug, "Turn on/off frontend debugging (default:off)."); | ||
38 | 30 | ||
39 | struct af9013_state { | 31 | struct 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 | ||
55 | static u8 regmask[8] = { 0x01, 0x03, 0x07, 0x0f, 0x1f, 0x3f, 0x7f, 0xff }; | 52 | /* write multiple registers */ |
56 | 53 | static int af9013_wr_regs_i2c(struct af9013_state *priv, u8 mbox, u16 reg, | |
57 | static 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 | ||
79 | static int af9013_write_ofdm_regs(struct af9013_state *state, u16 reg, u8 *val, | 82 | /* read multiple registers */ |
80 | u8 len) | 83 | static 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 | ||
86 | static int af9013_write_ofsm_regs(struct af9013_state *state, u16 reg, u8 *val, | 116 | /* write multiple registers */ |
87 | u8 len) | 117 | static 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 | |||
135 | err: | ||
136 | return 0; | ||
137 | } | ||
138 | |||
139 | /* read multiple registers */ | ||
140 | static 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 | |||
157 | err: | ||
158 | return 0; | ||
91 | } | 159 | } |
92 | 160 | ||
93 | /* write single register */ | 161 | /* write single register */ |
94 | static int af9013_write_reg(struct af9013_state *state, u16 reg, u8 val) | 162 | static 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 */ |
100 | static int af9013_read_reg(struct af9013_state *state, u16 reg, u8 *val) | 168 | static 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) { | 173 | static 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 | ||
126 | static int af9013_write_reg_bits(struct af9013_state *state, u16 reg, u8 pos, | 180 | static 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 | ||
142 | static int af9013_read_reg_bits(struct af9013_state *state, u16 reg, u8 pos, | 201 | static 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 | ||
195 | error: | 262 | return ret; |
263 | err: | ||
264 | dbg("%s: failed=%d", __func__, ret); | ||
196 | return ret; | 265 | return ret; |
197 | } | 266 | } |
198 | 267 | ||
199 | static u32 af913_div(u32 a, u32 b, u32 x) | 268 | static 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 | ||
223 | static int af9013_set_coeff(struct af9013_state *state, fe_bandwidth_t bw) | 293 | static 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 | ||
255 | error: | 341 | return ret; |
342 | err: | ||
343 | dbg("%s: failed=%d", __func__, ret); | ||
344 | return ret; | ||
345 | } | ||
346 | |||
347 | static 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; | ||
360 | err: | ||
361 | dbg("%s: failed=%d", __func__, ret); | ||
256 | return ret; | 362 | return ret; |
257 | } | 363 | } |
258 | 364 | ||
259 | static int af9013_set_adc_ctrl(struct af9013_state *state) | 365 | static 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; | ||
391 | err: | ||
392 | dbg("%s: failed=%d", __func__, ret); | ||
393 | return ret; | ||
394 | } | ||
395 | |||
396 | static 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; | ||
409 | err: | ||
410 | dbg("%s: failed=%d", __func__, ret); | ||
411 | return ret; | ||
412 | } | ||
413 | |||
414 | static 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); | 473 | err: |
474 | dbg("%s: failed=%d", __func__, ret); | ||
475 | return ret; | ||
476 | } | ||
294 | 477 | ||
295 | /* program */ | 478 | static 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 | |
302 | error: | 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; | ||
510 | err: | ||
511 | dbg("%s: failed=%d", __func__, ret); | ||
303 | return ret; | 512 | return ret; |
304 | } | 513 | } |
305 | 514 | ||
306 | static int af9013_set_freq_ctrl(struct af9013_state *state, | 515 | static 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 | |||
565 | static 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 | |||
575 | static 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 | } |
364 | error: | ||
365 | return ret; | ||
366 | } | ||
367 | 648 | ||
368 | static 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 | |||
523 | static 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 | } | ||
561 | error: | ||
562 | return ret; | ||
563 | } | ||
564 | |||
565 | static 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 | } | ||
586 | error: | ||
587 | return ret; | ||
588 | } | ||
589 | |||
590 | static 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 | |||
597 | static 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, ¶ms->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 | ||
668 | error: | 843 | return ret; |
844 | err: | ||
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 | |||
788 | error: | ||
789 | return ret; | 961 | return ret; |
790 | } | 962 | err: |
791 | 963 | dbg("%s: failed=%d", __func__, ret); | |
792 | static 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 | |||
857 | exit: | ||
858 | error: | ||
859 | return ret; | 964 | return ret; |
860 | } | 965 | } |
861 | 966 | ||
862 | static int af9013_update_snr(struct dvb_frontend *fe) | 967 | static 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 | |||
937 | error: | ||
938 | return ret; | ||
939 | } | ||
940 | |||
941 | static 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 | ||
972 | error: | ||
973 | return ret; | ||
974 | } | ||
975 | |||
976 | static 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 | |||
997 | error: | ||
998 | return ret; | ||
999 | } | ||
1000 | |||
1001 | static 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 | |||
1011 | static 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 */ | 1012 | err: |
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 | |||
1065 | error: | ||
1066 | return ret; | 1014 | return ret; |
1067 | } | 1015 | } |
1068 | 1016 | ||
1069 | 1017 | static int af9013_read_snr(struct dvb_frontend *fe, u16 *snr) | |
1070 | static 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 | ||
1079 | static int af9013_read_signal_strength(struct dvb_frontend *fe, u16 *strength) | 1024 | static 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 | ||
1088 | static int af9013_read_snr(struct dvb_frontend *fe, u16 *snr) | 1031 | static 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 | ||
1097 | static int af9013_read_ucblocks(struct dvb_frontend *fe, u32 *ucblocks) | 1038 | static 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 | |||
1106 | static 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); | ||
1117 | error: | ||
1118 | return ret; | ||
1119 | } | 1043 | } |
1120 | 1044 | ||
1121 | static int af9013_init(struct dvb_frontend *fe) | 1045 | static 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 | ||
1295 | error: | 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; | ||
1266 | err: | ||
1267 | dbg("%s: failed=%d", __func__, ret); | ||
1296 | return ret; | 1268 | return ret; |
1297 | } | 1269 | } |
1298 | 1270 | ||
1271 | static 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; | ||
1292 | err: | ||
1293 | dbg("%s: failed=%d", __func__, ret); | ||
1294 | return ret; | ||
1295 | } | ||
1296 | |||
1297 | static 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; | ||
1318 | err: | ||
1319 | dbg("%s: failed=%d", __func__, ret); | ||
1320 | return ret; | ||
1321 | } | ||
1322 | |||
1323 | static void af9013_release(struct dvb_frontend *fe) | ||
1324 | { | ||
1325 | struct af9013_state *state = fe->demodulator_priv; | ||
1326 | kfree(state); | ||
1327 | } | ||
1328 | |||
1299 | static struct dvb_frontend_ops af9013_ops; | 1329 | static struct dvb_frontend_ops af9013_ops; |
1300 | 1330 | ||
1301 | static int af9013_download_firmware(struct af9013_state *state) | 1331 | static 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 | ||
1394 | error_release: | 1424 | err_release: |
1395 | release_firmware(fw); | 1425 | release_firmware(fw); |
1396 | error: | 1426 | err: |
1397 | exit: | 1427 | exit: |
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 | ||
1403 | static 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 | |||
1417 | static void af9013_release(struct dvb_frontend *fe) | ||
1418 | { | ||
1419 | struct af9013_state *state = fe->demodulator_priv; | ||
1420 | kfree(state); | ||
1421 | } | ||
1422 | |||
1423 | static struct dvb_frontend_ops af9013_ops; | ||
1424 | |||
1425 | struct dvb_frontend *af9013_attach(const struct af9013_config *config, | 1433 | struct 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; |
1501 | error: | 1478 | err: |
1502 | kfree(state); | 1479 | kfree(state); |
1503 | return NULL; | 1480 | return NULL; |
1504 | } | 1481 | } |
@@ -1506,17 +1483,22 @@ EXPORT_SYMBOL(af9013_attach); | |||
1506 | 1483 | ||
1507 | static struct dvb_frontend_ops af9013_ops = { | 1484 | static 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 | ||
1544 | module_param_named(debug, af9013_debug, int, 0644); | 1524 | .i2c_gate_ctrl = af9013_i2c_gate_ctrl, |
1545 | MODULE_PARM_DESC(debug, "Turn on/off frontend debugging (default:off)."); | 1525 | }; |
1546 | 1526 | ||
1547 | MODULE_AUTHOR("Antti Palosaari <crope@iki.fi>"); | 1527 | MODULE_AUTHOR("Antti Palosaari <crope@iki.fi>"); |
1548 | MODULE_DESCRIPTION("Afatech AF9013 DVB-T demodulator driver"); | 1528 | MODULE_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 | ||
29 | enum af9013_ts_mode { | ||
30 | AF9013_OUTPUT_MODE_PARALLEL, | ||
31 | AF9013_OUTPUT_MODE_SERIAL, | ||
32 | AF9013_OUTPUT_MODE_USB, /* only for AF9015 */ | ||
33 | }; | ||
34 | |||
35 | enum 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 | |||
38 | struct 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 | |||
69 | struct 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)) |
98 | extern struct dvb_frontend *af9013_attach(const struct af9013_config *config, | 107 | extern 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" |
28 | extern 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 | ||
51 | struct regdesc { | 47 | struct 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 | ||
58 | struct snr_table { | 54 | struct af9013_snr { |
59 | u32 val; | 55 | u32 val; |
60 | u8 snr; | 56 | u8 snr; |
61 | }; | 57 | }; |
62 | 58 | ||
63 | struct coeff { | 59 | struct 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 */ |
70 | static struct coeff coeff_table[] = { | 66 | static 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 */ |
114 | static struct snr_table qpsk_snr_table[] = { | 110 | static 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 */ |
134 | static struct snr_table qam16_snr_table[] = { | 131 | static 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 */ |
154 | static struct snr_table qam64_snr_table[] = { | 152 | static 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 | ||
173 | static struct regdesc ofsm_init[] = { | 172 | static 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 */ |
255 | static struct regdesc tuner_init_env77h11d5[] = { | 254 | static 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 */ |
321 | static struct regdesc tuner_init_mt2060[] = { | 320 | static 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 */ |
398 | static struct regdesc tuner_init_mt2060_2[] = { | 397 | static 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 */ |
465 | static struct regdesc tuner_init_mxl5003d[] = { | 464 | static 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 */ |
537 | static struct regdesc tuner_init_mxl5005[] = { | 536 | static 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 */ |
616 | static struct regdesc tuner_init_qt1010[] = { | 615 | static 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 */ |
693 | static struct regdesc tuner_init_mc44s803[] = { | 692 | static 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 */ |
775 | static struct regdesc tuner_init_unknown[] = { | 774 | static 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 */ |
848 | static struct regdesc tuner_init_tda18271[] = { | 847 | static 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 */ |