56 static int diseqc_method;
58 MODULE_PARM_DESC(diseqc_method,
"Select DiSEqC method for subsystem id 13c2:1003, 0: default, 1: more reliable (for newer revisions only)");
65 dprintk(2,
"budget: %p\n", budget);
73 static void DiseqcSendBit (
struct budget *budget,
int data)
76 dprintk(2,
"budget: %p\n", budget);
84 static void DiseqcSendByte (
struct budget *budget,
int data)
88 dprintk(2,
"budget: %p\n", budget);
90 for (i=7; i>=0; i--) {
93 DiseqcSendBit(budget,
d);
96 DiseqcSendBit(budget, par);
99 static int SendDiSEqCMsg (
struct budget *budget,
int len,
u8 *
msg,
unsigned long burst)
104 dprintk(2,
"budget: %p\n", budget);
109 for (i=0; i<len; i++)
110 DiseqcSendByte(budget, msg[i]);
116 DiseqcSendByte(budget, 0xff);
135 static int SetVoltage_Activy (
struct budget *budget,
fe_sec_voltage_t voltage)
139 dprintk(2,
"budget: %p\n", budget);
162 struct budget* budget = (
struct budget*) fe->
dvb->priv;
164 return SetVoltage_Activy (budget, voltage);
169 struct budget* budget = (
struct budget*) fe->
dvb->priv;
189 struct budget* budget = (
struct budget*) fe->
dvb->priv;
191 SendDiSEqCMsg (budget, cmd->
msg_len, cmd->
msg, 0);
198 struct budget* budget = (
struct budget*) fe->
dvb->priv;
200 SendDiSEqCMsg (budget, 0,
NULL, minicmd);
205 static int alps_bsrv2_tuner_set_params(
struct dvb_frontend *fe)
208 struct budget* budget = (
struct budget*) fe->
dvb->priv;
211 struct i2c_msg msg = { .
addr = 0x61, .flags = 0, .buf =
buf, .len =
sizeof(
buf) };
212 u32 div = (
c->frequency + 479500) / 125;
214 if (
c->frequency > 2000000)
216 else if (
c->frequency > 1800000)
218 else if (
c->frequency > 1600000)
220 else if (
c->frequency > 1200000)
222 else if (
c->frequency >= 1100000)
226 buf[0] = (div >> 8) & 0x7f;
228 buf[2] = ((div & 0x18000) >> 10) | 0x95;
229 buf[3] = (pwr << 6) | 0x30;
234 if (fe->
ops.i2c_gate_ctrl)
235 fe->
ops.i2c_gate_ctrl(fe, 1);
242 .demod_address = 0x08,
247 static int alps_tdbe2_tuner_set_params(
struct dvb_frontend *fe)
250 struct budget* budget = (
struct budget*) fe->
dvb->priv;
253 struct i2c_msg msg = { .
addr = 0x62, .flags = 0, .buf = data, .len =
sizeof(data) };
255 div = (
c->frequency + 35937500 + 31250) / 62500;
257 data[0] = (div >> 8) & 0x7f;
258 data[1] = div & 0xff;
259 data[2] = 0x85 | ((div >> 10) & 0x60);
260 data[3] = (
c->frequency < 174000000 ? 0x88 :
c->frequency < 470000000 ? 0x84 : 0x81);
262 if (fe->
ops.i2c_gate_ctrl)
263 fe->
ops.i2c_gate_ctrl(fe, 1);
269 .demod_address = 0x09,
275 static int grundig_29504_401_tuner_set_params(
struct dvb_frontend *fe)
278 struct budget *budget = fe->
dvb->priv;
281 u8 cfg, cpump, band_select;
286 msg.
addr = *tuner_addr;
290 div = (36125000 + c->
frequency) / 166666;
312 data[0] = (div >> 8) & 0x7f;
313 data[1] = div & 0xff;
314 data[2] = ((div >> 10) & 0x60) |
cfg;
315 data[3] = (cpump << 6) | band_select;
317 if (fe->
ops.i2c_gate_ctrl)
318 fe->
ops.i2c_gate_ctrl(fe, 1);
324 .demod_address = 0x55,
327 static struct l64781_config grundig_29504_401_config_activy = {
328 .demod_address = 0x54,
331 static u8 tuner_address_grundig_29504_401_activy = 0x60;
333 static int grundig_29504_451_tuner_set_params(
struct dvb_frontend *fe)
336 struct budget* budget = (
struct budget*) fe->
dvb->priv;
339 struct i2c_msg msg = { .
addr = 0x61, .flags = 0, .buf = data, .len =
sizeof(data) };
342 data[0] = (div >> 8) & 0x7f;
343 data[1] = div & 0xff;
347 if (fe->
ops.i2c_gate_ctrl)
348 fe->
ops.i2c_gate_ctrl(fe, 1);
354 .demod_address = 0x68,
357 static int s5h1420_tuner_set_params(
struct dvb_frontend *fe)
360 struct budget* budget = (
struct budget*) fe->
dvb->priv;
363 struct i2c_msg msg = { .
addr = 0x61, .flags = 0, .buf = data, .len =
sizeof(data) };
366 data[0] = (div >> 8) & 0x7f;
367 data[1] = div & 0xff;
379 if (fe->
ops.i2c_gate_ctrl)
380 fe->
ops.i2c_gate_ctrl(fe, 1);
400 .demod_address = 0x68,
401 .inittab = alps_bsru6_inittab,
406 .set_symbol_rate = alps_bsru6_set_symbol_rate,
410 .demod_address = 0x68,
411 .inittab = alps_bsbe1_inittab,
416 .set_symbol_rate = alps_bsbe1_set_symbol_rate,
421 struct budget *budget = (
struct budget *)fe->
dvb->priv;
431 { .
addr = adr, .flags = 0, .buf = &
reg, .len = 1 },
432 { .addr = adr, .flags =
I2C_M_RD, .buf = &
val, .len = 1 }
438 static u8 read_pwm(
struct budget* budget)
442 struct i2c_msg msg[] = { { .
addr = 0x50,.flags = 0,.buf = &
b,.len = 1 },
443 { .addr = 0x50,.flags =
I2C_M_RD,.buf = &
pwm,.len = 1} };
466 .tuner_set_mode =
NULL,
467 .tuner_set_frequency =
NULL,
468 .tuner_get_frequency =
NULL,
469 .tuner_set_bandwidth =
NULL,
470 .tuner_get_bandwidth =
NULL,
471 .tuner_set_bbgain =
NULL,
472 .tuner_get_bbgain =
NULL,
473 .tuner_set_refclk =
NULL,
474 .tuner_get_status =
NULL,
490 static void frontend_init(
struct budget *budget)
492 (
void)alps_bsbe1_config;
494 switch(budget->
dev->pci->subsystem_device) {
500 budget->
dvb_frontend->ops.tuner_ops.set_params = alps_bsrv2_tuner_set_params;
501 budget->
dvb_frontend->ops.diseqc_send_master_cmd = budget_diseqc_send_master_cmd;
502 budget->
dvb_frontend->ops.diseqc_send_burst = budget_diseqc_send_burst;
510 budget->
dvb_frontend->ops.tuner_ops.set_params = alps_bsru6_tuner_set_params;
512 if (budget->
dev->pci->subsystem_device == 0x1003 && diseqc_method == 0) {
513 budget->
dvb_frontend->ops.diseqc_send_master_cmd = budget_diseqc_send_master_cmd;
514 budget->
dvb_frontend->ops.diseqc_send_burst = budget_diseqc_send_burst;
525 budget->
dvb_frontend->ops.tuner_ops.set_params = alps_tdbe2_tuner_set_params;
534 budget->
dvb_frontend->ops.tuner_ops.set_params = grundig_29504_401_tuner_set_params;
547 if (subtype < 0x36) {
552 budget->
dvb_frontend->ops.tuner_ops.set_params = alps_bsru6_tuner_set_params;
554 budget->
dvb_frontend->ops.set_voltage = siemens_budget_set_voltage;
568 budget->
dvb_frontend->ops.tuner_ops.set_params = alps_bsbe1_tuner_set_params;
570 budget->
dvb_frontend->ops.set_voltage = siemens_budget_set_voltage;
581 budget->
dvb_frontend->ops.tuner_ops.set_params = grundig_29504_451_tuner_set_params;
582 budget->
dvb_frontend->ops.set_voltage = siemens_budget_set_voltage;
590 budget->
dvb_frontend->ops.tuner_ops.set_params = alps_tdhd1_204a_tuner_set_params;
598 budget->
dvb_frontend->tuner_priv = &tuner_address_grundig_29504_401_activy;
599 budget->
dvb_frontend->ops.tuner_ops.set_params = grundig_29504_401_tuner_set_params;
606 budget->
dvb_frontend->ops.tuner_ops.set_params = s5h1420_tuner_set_params;
608 printk(
"%s: No LNBP21 found!\n", __func__);
624 printk(
"%s: No tda826x found!\n", __func__);
626 printk(
"%s: No LNBP21 found!\n", __func__);
640 &tt1600_stv090x_config,
648 &tt1600_stv6110x_config,
673 &tt1600_isl6423_config) ==
NULL) {
678 printk(
KERN_ERR "%s: No STV6110(A) Silicon Tuner found!\n", __func__);
693 &tt1600_stv090x_config,
702 &tt1600_stv6110x_config,
730 "No LNBH24 found!\n");
734 printk(
KERN_ERR "%s: No STV6110(A) Silicon Tuner found!\n", __func__);
743 printk(
"budget: A frontend driver was not found for device [%04x:%04x] subsystem [%04x:%04x]\n",
744 budget->
dev->pci->vendor,
745 budget->
dev->pci->device,
746 budget->
dev->pci->subsystem_vendor,
747 budget->
dev->pci->subsystem_device);
755 printk(
"budget: Frontend registration failed!\n");
763 struct budget *budget =
NULL;
767 if(
NULL == budget ) {
771 dprintk(2,
"dev:%p, info:%p, budget:%p\n", dev, info, budget);
783 frontend_init(budget);
792 struct budget *budget = (
struct budget*) dev->
ext_priv;
843 .name =
"budget dvb",
848 .attach = budget_attach,
849 .detach = budget_detach,
855 static int __init budget_init(
void)
860 static void __exit budget_exit(
void)
869 MODULE_AUTHOR(
"Ralph Metzler, Marcus Metzler, Michael Hunold, others");
871 "budget PCI DVB cards by Siemens, Technotrend, Hauppauge");