diff options
Diffstat (limited to 'drivers/media/dvb/frontends/cx24116.c')
-rw-r--r-- | drivers/media/dvb/frontends/cx24116.c | 105 |
1 files changed, 65 insertions, 40 deletions
diff --git a/drivers/media/dvb/frontends/cx24116.c b/drivers/media/dvb/frontends/cx24116.c index 751792a092e2..8afdfbec551b 100644 --- a/drivers/media/dvb/frontends/cx24116.c +++ b/drivers/media/dvb/frontends/cx24116.c | |||
@@ -48,7 +48,7 @@ MODULE_PARM_DESC(debug, "Activates frontend debugging (default:0)"); | |||
48 | #define dprintk(args...) \ | 48 | #define dprintk(args...) \ |
49 | do { \ | 49 | do { \ |
50 | if (debug) \ | 50 | if (debug) \ |
51 | printk("cx24116: " args); \ | 51 | printk(KERN_INFO "cx24116: " args); \ |
52 | } while (0) | 52 | } while (0) |
53 | 53 | ||
54 | #define CX24116_DEFAULT_FIRMWARE "dvb-fe-cx24116.fw" | 54 | #define CX24116_DEFAULT_FIRMWARE "dvb-fe-cx24116.fw" |
@@ -72,13 +72,20 @@ MODULE_PARM_DESC(debug, "Activates frontend debugging (default:0)"); | |||
72 | #define CX24116_REG_UCB8 (0xca) | 72 | #define CX24116_REG_UCB8 (0xca) |
73 | #define CX24116_REG_CLKDIV (0xf3) | 73 | #define CX24116_REG_CLKDIV (0xf3) |
74 | #define CX24116_REG_RATEDIV (0xf9) | 74 | #define CX24116_REG_RATEDIV (0xf9) |
75 | #define CX24116_REG_FECSTATUS (0x9c) /* configured fec (not tuned) or actual FEC (tuned) 1=1/2 2=2/3 etc */ | 75 | |
76 | /* configured fec (not tuned) or actual FEC (tuned) 1=1/2 2=2/3 etc */ | ||
77 | #define CX24116_REG_FECSTATUS (0x9c) | ||
76 | 78 | ||
77 | /* FECSTATUS bits */ | 79 | /* FECSTATUS bits */ |
78 | #define CX24116_FEC_FECMASK (0x1f) /* mask to determine configured fec (not tuned) or actual fec (tuned) */ | 80 | /* mask to determine configured fec (not tuned) or actual fec (tuned) */ |
79 | #define CX24116_FEC_DVBS (0x20) /* Select DVB-S demodulator, else DVB-S2 */ | 81 | #define CX24116_FEC_FECMASK (0x1f) |
82 | |||
83 | /* Select DVB-S demodulator, else DVB-S2 */ | ||
84 | #define CX24116_FEC_DVBS (0x20) | ||
80 | #define CX24116_FEC_UNKNOWN (0x40) /* Unknown/unused */ | 85 | #define CX24116_FEC_UNKNOWN (0x40) /* Unknown/unused */ |
81 | #define CX24116_FEC_PILOT (0x80) /* Pilot mode requested when tuning else always reset when tuned */ | 86 | |
87 | /* Pilot mode requested when tuning else always reset when tuned */ | ||
88 | #define CX24116_FEC_PILOT (0x80) | ||
82 | 89 | ||
83 | /* arg buffer size */ | 90 | /* arg buffer size */ |
84 | #define CX24116_ARGLEN (0x1e) | 91 | #define CX24116_ARGLEN (0x1e) |
@@ -121,12 +128,14 @@ MODULE_PARM_DESC(debug, "Activates frontend debugging (default:0)"); | |||
121 | /* DiSEqC tone burst */ | 128 | /* DiSEqC tone burst */ |
122 | static int toneburst = 1; | 129 | static int toneburst = 1; |
123 | module_param(toneburst, int, 0644); | 130 | module_param(toneburst, int, 0644); |
124 | MODULE_PARM_DESC(toneburst, "DiSEqC toneburst 0=OFF, 1=TONE CACHE, 2=MESSAGE CACHE (default:1)"); | 131 | MODULE_PARM_DESC(toneburst, "DiSEqC toneburst 0=OFF, 1=TONE CACHE, "\ |
132 | "2=MESSAGE CACHE (default:1)"); | ||
125 | 133 | ||
126 | /* SNR measurements */ | 134 | /* SNR measurements */ |
127 | static int esno_snr; | 135 | static int esno_snr; |
128 | module_param(esno_snr, int, 0644); | 136 | module_param(esno_snr, int, 0644); |
129 | MODULE_PARM_DESC(debug, "SNR return units, 0=PERCENTAGE 0-100, 1=ESNO(db * 10) (default:0)"); | 137 | MODULE_PARM_DESC(debug, "SNR return units, 0=PERCENTAGE 0-100, "\ |
138 | "1=ESNO(db * 10) (default:0)"); | ||
130 | 139 | ||
131 | enum cmds { | 140 | enum cmds { |
132 | CMD_SET_VCO = 0x10, | 141 | CMD_SET_VCO = 0x10, |
@@ -196,7 +205,7 @@ static int cx24116_writereg(struct cx24116_state *state, int reg, int data) | |||
196 | 205 | ||
197 | err = i2c_transfer(state->i2c, &msg, 1); | 206 | err = i2c_transfer(state->i2c, &msg, 1); |
198 | if (err != 1) { | 207 | if (err != 1) { |
199 | printk("%s: writereg error(err == %i, reg == 0x%02x," | 208 | printk(KERN_ERR "%s: writereg error(err == %i, reg == 0x%02x," |
200 | " value == 0x%02x)\n", __func__, err, reg, data); | 209 | " value == 0x%02x)\n", __func__, err, reg, data); |
201 | return -EREMOTEIO; | 210 | return -EREMOTEIO; |
202 | } | 211 | } |
@@ -228,12 +237,12 @@ static int cx24116_writeregN(struct cx24116_state *state, int reg, | |||
228 | msg.len = len + 1; | 237 | msg.len = len + 1; |
229 | 238 | ||
230 | if (debug > 1) | 239 | if (debug > 1) |
231 | printk("cx24116: %s: write regN 0x%02x, len = %d\n", | 240 | printk(KERN_INFO "cx24116: %s: write regN 0x%02x, len = %d\n", |
232 | __func__, reg, len); | 241 | __func__, reg, len); |
233 | 242 | ||
234 | ret = i2c_transfer(state->i2c, &msg, 1); | 243 | ret = i2c_transfer(state->i2c, &msg, 1); |
235 | if (ret != 1) { | 244 | if (ret != 1) { |
236 | printk("%s: writereg error(err == %i, reg == 0x%02x\n", | 245 | printk(KERN_ERR "%s: writereg error(err == %i, reg == 0x%02x\n", |
237 | __func__, ret, reg); | 246 | __func__, ret, reg); |
238 | ret = -EREMOTEIO; | 247 | ret = -EREMOTEIO; |
239 | } | 248 | } |
@@ -259,18 +268,20 @@ static int cx24116_readreg(struct cx24116_state *state, u8 reg) | |||
259 | ret = i2c_transfer(state->i2c, msg, 2); | 268 | ret = i2c_transfer(state->i2c, msg, 2); |
260 | 269 | ||
261 | if (ret != 2) { | 270 | if (ret != 2) { |
262 | printk("%s: reg=0x%x (error=%d)\n", __func__, reg, ret); | 271 | printk(KERN_ERR "%s: reg=0x%x (error=%d)\n", |
272 | __func__, reg, ret); | ||
263 | return ret; | 273 | return ret; |
264 | } | 274 | } |
265 | 275 | ||
266 | if (debug > 1) | 276 | if (debug > 1) |
267 | printk("cx24116: read reg 0x%02x, value 0x%02x\n", | 277 | printk(KERN_INFO "cx24116: read reg 0x%02x, value 0x%02x\n", |
268 | reg, b1[0]); | 278 | reg, b1[0]); |
269 | 279 | ||
270 | return b1[0]; | 280 | return b1[0]; |
271 | } | 281 | } |
272 | 282 | ||
273 | static int cx24116_set_inversion(struct cx24116_state *state, fe_spectral_inversion_t inversion) | 283 | static int cx24116_set_inversion(struct cx24116_state *state, |
284 | fe_spectral_inversion_t inversion) | ||
274 | { | 285 | { |
275 | dprintk("%s(%d)\n", __func__, inversion); | 286 | dprintk("%s(%d)\n", __func__, inversion); |
276 | 287 | ||
@@ -318,10 +329,10 @@ static int cx24116_set_inversion(struct cx24116_state *state, fe_spectral_invers | |||
318 | * Eg.(2/3) szap "Zone Horror" | 329 | * Eg.(2/3) szap "Zone Horror" |
319 | * | 330 | * |
320 | * mask/val = 0x04, 0x20 | 331 | * mask/val = 0x04, 0x20 |
321 | * status 1f | signal c3c0 | snr a333 | ber 00000098 | unc 00000000 | FE_HAS_LOCK | 332 | * status 1f | signal c3c0 | snr a333 | ber 00000098 | unc 0 | FE_HAS_LOCK |
322 | * | 333 | * |
323 | * mask/val = 0x04, 0x30 | 334 | * mask/val = 0x04, 0x30 |
324 | * status 1f | signal c3c0 | snr a333 | ber 00000000 | unc 00000000 | FE_HAS_LOCK | 335 | * status 1f | signal c3c0 | snr a333 | ber 00000000 | unc 0 | FE_HAS_LOCK |
325 | * | 336 | * |
326 | * After tuning FECSTATUS contains actual FEC | 337 | * After tuning FECSTATUS contains actual FEC |
327 | * in use numbered 1 through to 8 for 1/2 .. 2/3 etc | 338 | * in use numbered 1 through to 8 for 1/2 .. 2/3 etc |
@@ -417,7 +428,8 @@ static int cx24116_lookup_fecmod(struct cx24116_state *state, | |||
417 | return ret; | 428 | return ret; |
418 | } | 429 | } |
419 | 430 | ||
420 | static int cx24116_set_fec(struct cx24116_state *state, fe_modulation_t mod, fe_code_rate_t fec) | 431 | static int cx24116_set_fec(struct cx24116_state *state, |
432 | fe_modulation_t mod, fe_code_rate_t fec) | ||
421 | { | 433 | { |
422 | int ret = 0; | 434 | int ret = 0; |
423 | 435 | ||
@@ -471,25 +483,32 @@ static int cx24116_firmware_ondemand(struct dvb_frontend *fe) | |||
471 | return 0; | 483 | return 0; |
472 | 484 | ||
473 | /* Load firmware */ | 485 | /* Load firmware */ |
474 | /* request the firmware, this will block until someone uploads it */ | 486 | /* request the firmware, this will block until loaded */ |
475 | printk("%s: Waiting for firmware upload (%s)...\n", __func__, CX24116_DEFAULT_FIRMWARE); | 487 | printk(KERN_INFO "%s: Waiting for firmware upload (%s)...\n", |
476 | ret = request_firmware(&fw, CX24116_DEFAULT_FIRMWARE, &state->i2c->dev); | 488 | __func__, CX24116_DEFAULT_FIRMWARE); |
477 | printk("%s: Waiting for firmware upload(2)...\n", __func__); | 489 | ret = request_firmware(&fw, CX24116_DEFAULT_FIRMWARE, |
490 | &state->i2c->dev); | ||
491 | printk(KERN_INFO "%s: Waiting for firmware upload(2)...\n", | ||
492 | __func__); | ||
478 | if (ret) { | 493 | if (ret) { |
479 | printk("%s: No firmware uploaded (timeout or file not found?)\n", __func__); | 494 | printk(KERN_ERR "%s: No firmware uploaded " |
495 | "(timeout or file not found?)\n", __func__); | ||
480 | return ret; | 496 | return ret; |
481 | } | 497 | } |
482 | 498 | ||
483 | /* Make sure we don't recurse back through here during loading */ | 499 | /* Make sure we don't recurse back through here |
500 | * during loading */ | ||
484 | state->skip_fw_load = 1; | 501 | state->skip_fw_load = 1; |
485 | 502 | ||
486 | ret = cx24116_load_firmware(fe, fw); | 503 | ret = cx24116_load_firmware(fe, fw); |
487 | if (ret) | 504 | if (ret) |
488 | printk("%s: Writing firmware to device failed\n", __func__); | 505 | printk(KERN_ERR "%s: Writing firmware to device failed\n", |
506 | __func__); | ||
489 | 507 | ||
490 | release_firmware(fw); | 508 | release_firmware(fw); |
491 | 509 | ||
492 | printk("%s: Firmware upload %s\n", __func__, ret == 0 ? "complete" : "failed"); | 510 | printk(KERN_INFO "%s: Firmware upload %s\n", __func__, |
511 | ret == 0 ? "complete" : "failed"); | ||
493 | 512 | ||
494 | /* Ensure firmware is always loaded if required */ | 513 | /* Ensure firmware is always loaded if required */ |
495 | state->skip_fw_load = 0; | 514 | state->skip_fw_load = 0; |
@@ -498,7 +517,9 @@ static int cx24116_firmware_ondemand(struct dvb_frontend *fe) | |||
498 | return ret; | 517 | return ret; |
499 | } | 518 | } |
500 | 519 | ||
501 | /* Take a basic firmware command structure, format it and forward it for processing */ | 520 | /* Take a basic firmware command structure, format it |
521 | * and forward it for processing | ||
522 | */ | ||
502 | static int cx24116_cmd_execute(struct dvb_frontend *fe, struct cx24116_cmd *cmd) | 523 | static int cx24116_cmd_execute(struct dvb_frontend *fe, struct cx24116_cmd *cmd) |
503 | { | 524 | { |
504 | struct cx24116_state *state = fe->demodulator_priv; | 525 | struct cx24116_state *state = fe->demodulator_priv; |
@@ -509,7 +530,8 @@ static int cx24116_cmd_execute(struct dvb_frontend *fe, struct cx24116_cmd *cmd) | |||
509 | /* Load the firmware if required */ | 530 | /* Load the firmware if required */ |
510 | ret = cx24116_firmware_ondemand(fe); | 531 | ret = cx24116_firmware_ondemand(fe); |
511 | if (ret != 0) { | 532 | if (ret != 0) { |
512 | printk("%s(): Unable initialise the firmware\n", __func__); | 533 | printk(KERN_ERR "%s(): Unable initialise the firmware\n", |
534 | __func__); | ||
513 | return ret; | 535 | return ret; |
514 | } | 536 | } |
515 | 537 | ||
@@ -524,8 +546,10 @@ static int cx24116_cmd_execute(struct dvb_frontend *fe, struct cx24116_cmd *cmd) | |||
524 | while (cx24116_readreg(state, CX24116_REG_EXECUTE)) { | 546 | while (cx24116_readreg(state, CX24116_REG_EXECUTE)) { |
525 | msleep(10); | 547 | msleep(10); |
526 | if (i++ > 64) { | 548 | if (i++ > 64) { |
527 | /* Avoid looping forever if the firmware does no respond */ | 549 | /* Avoid looping forever if the firmware does |
528 | printk("%s() Firmware not responding\n", __func__); | 550 | not respond */ |
551 | printk(KERN_WARNING "%s() Firmware not responding\n", | ||
552 | __func__); | ||
529 | return -EREMOTEIO; | 553 | return -EREMOTEIO; |
530 | } | 554 | } |
531 | } | 555 | } |
@@ -635,7 +659,7 @@ static int cx24116_load_firmware(struct dvb_frontend *fe, | |||
635 | return ret; | 659 | return ret; |
636 | vers[i] = cx24116_readreg(state, CX24116_REG_MAILBOX); | 660 | vers[i] = cx24116_readreg(state, CX24116_REG_MAILBOX); |
637 | } | 661 | } |
638 | printk("%s: FW version %i.%i.%i.%i\n", __func__, | 662 | printk(KERN_INFO "%s: FW version %i.%i.%i.%i\n", __func__, |
639 | vers[0], vers[1], vers[2], vers[3]); | 663 | vers[0], vers[1], vers[2], vers[3]); |
640 | 664 | ||
641 | return 0; | 665 | return 0; |
@@ -818,7 +842,7 @@ static int cx24116_set_tone(struct dvb_frontend *fe, | |||
818 | 842 | ||
819 | dprintk("%s(%d)\n", __func__, tone); | 843 | dprintk("%s(%d)\n", __func__, tone); |
820 | if ((tone != SEC_TONE_ON) && (tone != SEC_TONE_OFF)) { | 844 | if ((tone != SEC_TONE_ON) && (tone != SEC_TONE_OFF)) { |
821 | printk("%s: Invalid, tone=%d\n", __func__, tone); | 845 | printk(KERN_ERR "%s: Invalid, tone=%d\n", __func__, tone); |
822 | return -EINVAL; | 846 | return -EINVAL; |
823 | } | 847 | } |
824 | 848 | ||
@@ -891,7 +915,8 @@ static int cx24116_diseqc_init(struct dvb_frontend *fe) | |||
891 | /* Unknown */ | 915 | /* Unknown */ |
892 | state->dsec_cmd.args[CX24116_DISEQC_ARG2_2] = 0x02; | 916 | state->dsec_cmd.args[CX24116_DISEQC_ARG2_2] = 0x02; |
893 | state->dsec_cmd.args[CX24116_DISEQC_ARG3_0] = 0x00; | 917 | state->dsec_cmd.args[CX24116_DISEQC_ARG3_0] = 0x00; |
894 | state->dsec_cmd.args[CX24116_DISEQC_ARG4_0] = 0x00; /* Continuation flag? */ | 918 | /* Continuation flag? */ |
919 | state->dsec_cmd.args[CX24116_DISEQC_ARG4_0] = 0x00; | ||
895 | 920 | ||
896 | /* DiSEqC message length */ | 921 | /* DiSEqC message length */ |
897 | state->dsec_cmd.args[CX24116_DISEQC_MSGLEN] = 0x00; | 922 | state->dsec_cmd.args[CX24116_DISEQC_MSGLEN] = 0x00; |
@@ -911,11 +936,11 @@ static int cx24116_send_diseqc_msg(struct dvb_frontend *fe, | |||
911 | 936 | ||
912 | /* Dump DiSEqC message */ | 937 | /* Dump DiSEqC message */ |
913 | if (debug) { | 938 | if (debug) { |
914 | printk("cx24116: %s(", __func__); | 939 | printk(KERN_INFO "cx24116: %s(", __func__); |
915 | for (i = 0 ; i < d->msg_len ;) { | 940 | for (i = 0 ; i < d->msg_len ;) { |
916 | printk("0x%02x", d->msg[i]); | 941 | printk(KERN_INFO "0x%02x", d->msg[i]); |
917 | if (++i < d->msg_len) | 942 | if (++i < d->msg_len) |
918 | printk(", "); | 943 | printk(KERN_INFO ", "); |
919 | } | 944 | } |
920 | printk(") toneburst=%d\n", toneburst); | 945 | printk(") toneburst=%d\n", toneburst); |
921 | } | 946 | } |
@@ -1072,10 +1097,8 @@ struct dvb_frontend *cx24116_attach(const struct cx24116_config *config, | |||
1072 | 1097 | ||
1073 | /* allocate memory for the internal state */ | 1098 | /* allocate memory for the internal state */ |
1074 | state = kmalloc(sizeof(struct cx24116_state), GFP_KERNEL); | 1099 | state = kmalloc(sizeof(struct cx24116_state), GFP_KERNEL); |
1075 | if (state == NULL) { | 1100 | if (state == NULL) |
1076 | printk("Unable to kmalloc\n"); | ||
1077 | goto error1; | 1101 | goto error1; |
1078 | } | ||
1079 | 1102 | ||
1080 | /* setup the state */ | 1103 | /* setup the state */ |
1081 | memset(state, 0, sizeof(struct cx24116_state)); | 1104 | memset(state, 0, sizeof(struct cx24116_state)); |
@@ -1084,14 +1107,16 @@ struct dvb_frontend *cx24116_attach(const struct cx24116_config *config, | |||
1084 | state->i2c = i2c; | 1107 | state->i2c = i2c; |
1085 | 1108 | ||
1086 | /* check if the demod is present */ | 1109 | /* check if the demod is present */ |
1087 | ret = (cx24116_readreg(state, 0xFF) << 8) | cx24116_readreg(state, 0xFE); | 1110 | ret = (cx24116_readreg(state, 0xFF) << 8) | |
1111 | cx24116_readreg(state, 0xFE); | ||
1088 | if (ret != 0x0501) { | 1112 | if (ret != 0x0501) { |
1089 | printk("Invalid probe, probably not a CX24116 device\n"); | 1113 | printk(KERN_INFO "Invalid probe, probably not a CX24116 device\n"); |
1090 | goto error2; | 1114 | goto error2; |
1091 | } | 1115 | } |
1092 | 1116 | ||
1093 | /* create dvb_frontend */ | 1117 | /* create dvb_frontend */ |
1094 | memcpy(&state->frontend.ops, &cx24116_ops, sizeof(struct dvb_frontend_ops)); | 1118 | memcpy(&state->frontend.ops, &cx24116_ops, |
1119 | sizeof(struct dvb_frontend_ops)); | ||
1095 | state->frontend.demodulator_priv = state; | 1120 | state->frontend.demodulator_priv = state; |
1096 | return &state->frontend; | 1121 | return &state->frontend; |
1097 | 1122 | ||