Lines Matching +full:mpeg +full:- +full:clk
1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * budget-av.ko: driver for the SAA7146 based Budget DVB cards
13 * Copyright (C) 1999-2002 Ralph Metzler
30 #include "dvb-pll.h"
31 #include <media/drv-intf/saa7146_vv.h>
68 * 0 - Vcc/Reset (Reset is controlled by capacitor). Resets the frontend *AS WELL*!
69 * 1 - CI memory select 0=>IO memory, 1=>Attribute Memory
70 * 2 - CI Card Enable (Active Low)
71 * 3 - CI Card Detect
107 return -EIO; in i2c_readregs()
126 struct budget_av *budget_av = ca->data; in ciintf_read_attribute_mem()
130 return -EINVAL; in ciintf_read_attribute_mem()
132 saa7146_setgpio(budget_av->budget.dev, 1, SAA7146_GPIO_OUTHI); in ciintf_read_attribute_mem()
135 result = ttpci_budget_debiread(&budget_av->budget, DEBICICAM, address & 0xfff, 1, 0, 1); in ciintf_read_attribute_mem()
136 if (result == -ETIMEDOUT) { in ciintf_read_attribute_mem()
145 struct budget_av *budget_av = ca->data; in ciintf_write_attribute_mem()
149 return -EINVAL; in ciintf_write_attribute_mem()
151 saa7146_setgpio(budget_av->budget.dev, 1, SAA7146_GPIO_OUTHI); in ciintf_write_attribute_mem()
154 result = ttpci_budget_debiwrite(&budget_av->budget, DEBICICAM, address & 0xfff, 1, value, 0, 1); in ciintf_write_attribute_mem()
155 if (result == -ETIMEDOUT) { in ciintf_write_attribute_mem()
164 struct budget_av *budget_av = ca->data; in ciintf_read_cam_control()
168 return -EINVAL; in ciintf_read_cam_control()
170 saa7146_setgpio(budget_av->budget.dev, 1, SAA7146_GPIO_OUTLO); in ciintf_read_cam_control()
173 result = ttpci_budget_debiread(&budget_av->budget, DEBICICAM, address & 3, 1, 0, 0); in ciintf_read_cam_control()
174 if (result == -ETIMEDOUT) { in ciintf_read_cam_control()
177 return -ETIMEDOUT; in ciintf_read_cam_control()
184 struct budget_av *budget_av = ca->data; in ciintf_write_cam_control()
188 return -EINVAL; in ciintf_write_cam_control()
190 saa7146_setgpio(budget_av->budget.dev, 1, SAA7146_GPIO_OUTLO); in ciintf_write_cam_control()
193 result = ttpci_budget_debiwrite(&budget_av->budget, DEBICICAM, address & 3, 1, value, 0, 0); in ciintf_write_cam_control()
194 if (result == -ETIMEDOUT) { in ciintf_write_cam_control()
203 struct budget_av *budget_av = ca->data; in ciintf_slot_reset()
204 struct saa7146_dev *saa = budget_av->budget.dev; in ciintf_slot_reset()
207 return -EINVAL; in ciintf_slot_reset()
210 budget_av->slot_status = SLOTSTATUS_RESET; in ciintf_slot_reset()
224 if (budget_av->reinitialise_demod) in ciintf_slot_reset()
225 dvb_frontend_reinitialise(budget_av->budget.dvb_frontend); in ciintf_slot_reset()
232 struct budget_av *budget_av = ca->data; in ciintf_slot_shutdown()
233 struct saa7146_dev *saa = budget_av->budget.dev; in ciintf_slot_shutdown()
236 return -EINVAL; in ciintf_slot_shutdown()
241 budget_av->slot_status = SLOTSTATUS_NONE; in ciintf_slot_shutdown()
248 struct budget_av *budget_av = ca->data; in ciintf_slot_ts_enable()
249 struct saa7146_dev *saa = budget_av->budget.dev; in ciintf_slot_ts_enable()
252 return -EINVAL; in ciintf_slot_ts_enable()
254 dprintk(1, "ci slot status: %d\n", budget_av->slot_status); in ciintf_slot_ts_enable()
263 struct budget_av *budget_av = ca->data; in ciintf_poll_slot_status()
264 struct saa7146_dev *saa = budget_av->budget.dev; in ciintf_poll_slot_status()
268 return -EINVAL; in ciintf_poll_slot_status()
271 * test the card detect line - needs to be done carefully in ciintf_poll_slot_status()
274 if (budget_av->slot_status == SLOTSTATUS_NONE) { in ciintf_poll_slot_status()
278 if (budget_av->slot_status == SLOTSTATUS_NONE) { in ciintf_poll_slot_status()
279 budget_av->slot_status = SLOTSTATUS_PRESENT; in ciintf_poll_slot_status()
292 * don't care if the cam has problems - we'll be resetting it on open() anyway in ciintf_poll_slot_status()
294 if ((budget_av->slot_status == SLOTSTATUS_NONE) || (!open)) { in ciintf_poll_slot_status()
295 saa7146_setgpio(budget_av->budget.dev, 1, SAA7146_GPIO_OUTLO); in ciintf_poll_slot_status()
296 result = ttpci_budget_debiread(&budget_av->budget, DEBICICAM, 0, 1, 0, 1); in ciintf_poll_slot_status()
297 if ((result >= 0) && (budget_av->slot_status == SLOTSTATUS_NONE)) { in ciintf_poll_slot_status()
298 budget_av->slot_status = SLOTSTATUS_PRESENT; in ciintf_poll_slot_status()
301 if (budget_av->slot_status != SLOTSTATUS_NONE) { in ciintf_poll_slot_status()
310 if (budget_av->slot_status == SLOTSTATUS_RESET) { in ciintf_poll_slot_status()
313 budget_av->slot_status = SLOTSTATUS_READY; in ciintf_poll_slot_status()
317 if (budget_av->slot_status != SLOTSTATUS_NONE) { in ciintf_poll_slot_status()
318 if (budget_av->slot_status & SLOTSTATUS_READY) in ciintf_poll_slot_status()
327 struct saa7146_dev *saa = budget_av->budget.dev; in ciintf_init()
330 memset(&budget_av->ca, 0, sizeof(struct dvb_ca_en50221)); in ciintf_init()
341 budget_av->ca.owner = THIS_MODULE; in ciintf_init()
342 budget_av->ca.read_attribute_mem = ciintf_read_attribute_mem; in ciintf_init()
343 budget_av->ca.write_attribute_mem = ciintf_write_attribute_mem; in ciintf_init()
344 budget_av->ca.read_cam_control = ciintf_read_cam_control; in ciintf_init()
345 budget_av->ca.write_cam_control = ciintf_write_cam_control; in ciintf_init()
346 budget_av->ca.slot_reset = ciintf_slot_reset; in ciintf_init()
347 budget_av->ca.slot_shutdown = ciintf_slot_shutdown; in ciintf_init()
348 budget_av->ca.slot_ts_enable = ciintf_slot_ts_enable; in ciintf_init()
349 budget_av->ca.poll_slot_status = ciintf_poll_slot_status; in ciintf_init()
350 budget_av->ca.data = budget_av; in ciintf_init()
351 budget_av->budget.ci_present = 1; in ciintf_init()
352 budget_av->slot_status = SLOTSTATUS_NONE; in ciintf_init()
354 result = dvb_ca_en50221_init(&budget_av->budget.dvb_adapter, in ciintf_init()
355 &budget_av->ca, 0, 1); in ciintf_init()
371 struct saa7146_dev *saa = budget_av->budget.dev; in ciintf_deinit()
379 dvb_ca_en50221_release(&budget_av->ca); in ciintf_deinit()
417 struct budget *budget = &budget_av->budget; in saa7113_init()
418 struct saa7146_dev *saa = budget->dev; in saa7113_init()
424 if (i2c_writereg(&budget->i2c_adap, 0x4a, 0x01, 0x08) != 1) { in saa7113_init()
426 return -ENODEV; in saa7113_init()
432 i2c_writereg(&budget->i2c_adap, 0x4a, *data, *(data + 1)); in saa7113_init()
436 dprintk(1, "saa7113 status=%02x\n", i2c_readreg(&budget->i2c_adap, 0x4a, 0x1f)); in saa7113_init()
443 struct budget *budget = &budget_av->budget; in saa7113_setinput()
445 if (budget_av->has_saa7113 != 1) in saa7113_setinput()
446 return -ENODEV; in saa7113_setinput()
449 i2c_writereg(&budget->i2c_adap, 0x4a, 0x02, 0xc7); in saa7113_setinput()
450 i2c_writereg(&budget->i2c_adap, 0x4a, 0x09, 0x80); in saa7113_setinput()
452 i2c_writereg(&budget->i2c_adap, 0x4a, 0x02, 0xc0); in saa7113_setinput()
453 i2c_writereg(&budget->i2c_adap, 0x4a, 0x09, 0x00); in saa7113_setinput()
455 return -EINVAL; in saa7113_setinput()
458 budget_av->cur_input = input; in saa7113_setinput()
495 struct dtv_frontend_properties *c = &fe->dtv_property_cache; in philips_su1278_ty_ci_tuner_set_params()
498 struct budget *budget = fe->dvb->priv; in philips_su1278_ty_ci_tuner_set_params()
501 if ((c->frequency < 950000) || (c->frequency > 2150000)) in philips_su1278_ty_ci_tuner_set_params()
502 return -EINVAL; in philips_su1278_ty_ci_tuner_set_params()
504 div = (c->frequency + (125 - 1)) / 125; /* round correctly */ in philips_su1278_ty_ci_tuner_set_params()
510 if (c->symbol_rate < 4000000) in philips_su1278_ty_ci_tuner_set_params()
513 if (c->frequency < 1250000) in philips_su1278_ty_ci_tuner_set_params()
515 else if (c->frequency < 1550000) in philips_su1278_ty_ci_tuner_set_params()
517 else if (c->frequency < 2050000) in philips_su1278_ty_ci_tuner_set_params()
519 else if (c->frequency < 2150000) in philips_su1278_ty_ci_tuner_set_params()
522 if (fe->ops.i2c_gate_ctrl) in philips_su1278_ty_ci_tuner_set_params()
523 fe->ops.i2c_gate_ctrl(fe, 1); in philips_su1278_ty_ci_tuner_set_params()
524 if (i2c_transfer(&budget->i2c_adap, &msg, 1) != 1) in philips_su1278_ty_ci_tuner_set_params()
525 return -EIO; in philips_su1278_ty_ci_tuner_set_params()
610 struct dtv_frontend_properties *c = &fe->dtv_property_cache; in philips_cu1216_tuner_set_params()
611 struct budget *budget = fe->dvb->priv; in philips_cu1216_tuner_set_params()
619 u32 div = (c->frequency + CU1216_IF + TUNER_MUL / 2) / TUNER_MUL; in philips_cu1216_tuner_set_params()
624 buf[3] = (c->frequency < 150000000 ? 0x01 : in philips_cu1216_tuner_set_params()
625 c->frequency < 445000000 ? 0x02 : 0x04); in philips_cu1216_tuner_set_params()
629 if (fe->ops.i2c_gate_ctrl) in philips_cu1216_tuner_set_params()
630 fe->ops.i2c_gate_ctrl(fe, 1); in philips_cu1216_tuner_set_params()
631 if (i2c_transfer(&budget->i2c_adap, &msg, 1) != 1) in philips_cu1216_tuner_set_params()
632 return -EIO; in philips_cu1216_tuner_set_params()
638 if (fe->ops.i2c_gate_ctrl) in philips_cu1216_tuner_set_params()
639 fe->ops.i2c_gate_ctrl(fe, 1); in philips_cu1216_tuner_set_params()
640 if (i2c_transfer(&budget->i2c_adap, &msg, 1) == 1 && (buf[0] & 0x40)) in philips_cu1216_tuner_set_params()
650 if (fe->ops.i2c_gate_ctrl) in philips_cu1216_tuner_set_params()
651 fe->ops.i2c_gate_ctrl(fe, 1); in philips_cu1216_tuner_set_params()
652 if (i2c_transfer(&budget->i2c_adap, &msg, 1) != 1) in philips_cu1216_tuner_set_params()
653 return -EIO; in philips_cu1216_tuner_set_params()
675 struct budget *budget = fe->dvb->priv; in philips_tu1216_tuner_init()
680 if (fe->ops.i2c_gate_ctrl) in philips_tu1216_tuner_init()
681 fe->ops.i2c_gate_ctrl(fe, 1); in philips_tu1216_tuner_init()
682 if (i2c_transfer(&budget->i2c_adap, &tuner_msg, 1) != 1) in philips_tu1216_tuner_init()
683 return -EIO; in philips_tu1216_tuner_init()
691 struct dtv_frontend_properties *c = &fe->dtv_property_cache; in philips_tu1216_tuner_set_params()
692 struct budget *budget = fe->dvb->priv; in philips_tu1216_tuner_set_params()
700 tuner_frequency = c->frequency + 36166000; in philips_tu1216_tuner_set_params()
702 return -EINVAL; in philips_tu1216_tuner_set_params()
722 return -EINVAL; in philips_tu1216_tuner_set_params()
725 if (c->frequency < 49000000) in philips_tu1216_tuner_set_params()
726 return -EINVAL; in philips_tu1216_tuner_set_params()
727 else if (c->frequency < 161000000) in philips_tu1216_tuner_set_params()
729 else if (c->frequency < 444000000) in philips_tu1216_tuner_set_params()
731 else if (c->frequency < 861000000) in philips_tu1216_tuner_set_params()
734 return -EINVAL; in philips_tu1216_tuner_set_params()
737 switch (c->bandwidth_hz) { in philips_tu1216_tuner_set_params()
751 return -EINVAL; in philips_tu1216_tuner_set_params()
756 tuner_frequency = (((c->frequency / 1000) * 6) + 217496) / 1000; in philips_tu1216_tuner_set_params()
764 if (fe->ops.i2c_gate_ctrl) in philips_tu1216_tuner_set_params()
765 fe->ops.i2c_gate_ctrl(fe, 1); in philips_tu1216_tuner_set_params()
766 if (i2c_transfer(&budget->i2c_adap, &tuner_msg, 1) != 1) in philips_tu1216_tuner_set_params()
767 return -EIO; in philips_tu1216_tuner_set_params()
776 struct budget *budget = fe->dvb->priv; in philips_tu1216_request_firmware()
778 return request_firmware(fw, name, &budget->dev->pci->dev); in philips_tu1216_request_firmware()
882 /* KNC1 DVB-S (STB0899) Inittab */
960 { STB0899_SYNTCTRL, 0x02 }, /* 0x00 = CLK from CLKI, 0x02 = CLK from XTALI */
1116 // .ts_pfbit_toggle = STB0899_MPEG_NORMAL, /* DirecTV, MPEG toggling seq */
1164 if ((i2c_transfer(&budget_av->budget.i2c_adap, msg, 2) != 2) in read_pwm()
1203 struct saa7146_dev *saa = budget_av->budget.dev; in frontend_init()
1213 switch (saa->pci->subsystem_device) { in frontend_init()
1226 switch (saa->pci->subsystem_device) { in frontend_init()
1230 * maybe that setting is needed for other dvb-s cards as well, in frontend_init()
1233 budget_av->reinitialise_demod = 1; in frontend_init()
1237 if (saa->pci->subsystem_vendor == 0x1894) { in frontend_init()
1239 &budget_av->budget.i2c_adap); in frontend_init()
1241 dvb_attach(tua6100_attach, fe, 0x60, &budget_av->budget.i2c_adap); in frontend_init()
1244 &budget_av->budget.i2c_adap); in frontend_init()
1246 fe->ops.tuner_ops.set_params = philips_su1278_ty_ci_tuner_set_params; in frontend_init()
1257 &budget_av->budget.i2c_adap); in frontend_init()
1260 &budget_av->budget.i2c_adap, in frontend_init()
1266 &budget_av->budget.i2c_adap); in frontend_init()
1268 fe->ops.tuner_ops.set_params = philips_su1278_ty_ci_tuner_set_params; in frontend_init()
1273 budget_av->reinitialise_demod = 1; in frontend_init()
1274 fe = dvb_attach(stb0899_attach, &knc1_dvbs2_config, &budget_av->budget.i2c_adap); in frontend_init()
1276 dvb_attach(tda8261_attach, fe, &sd1878c_config, &budget_av->budget.i2c_adap); in frontend_init()
1281 &budget_av->budget.i2c_adap); in frontend_init()
1283 fe->ops.tuner_ops.set_params = philips_su1278_ty_ci_tuner_set_params; in frontend_init()
1290 budget_av->reinitialise_demod = 1; in frontend_init()
1291 budget_av->budget.dev->i2c_bitrate = SAA7146_I2C_BUS_BIT_RATE_240; in frontend_init()
1293 &budget_av->budget.i2c_adap, in frontend_init()
1297 &budget_av->budget.i2c_adap, in frontend_init()
1300 fe->ops.tuner_ops.set_params = philips_cu1216_tuner_set_params; in frontend_init()
1308 budget_av->reinitialise_demod = 1; in frontend_init()
1309 budget_av->budget.dev->i2c_bitrate = SAA7146_I2C_BUS_BIT_RATE_240; in frontend_init()
1312 &budget_av->budget.i2c_adap, in frontend_init()
1315 fe->ops.tuner_ops.set_params = philips_cu1216_tuner_set_params; in frontend_init()
1322 budget_av->reinitialise_demod = 1; in frontend_init()
1324 &budget_av->budget.i2c_adap); in frontend_init()
1326 fe->ops.tuner_ops.init = philips_tu1216_tuner_init; in frontend_init()
1327 fe->ops.tuner_ops.set_params = philips_tu1216_tuner_set_params; in frontend_init()
1334 saa->pci->vendor, in frontend_init()
1335 saa->pci->device, in frontend_init()
1336 saa->pci->subsystem_vendor, in frontend_init()
1337 saa->pci->subsystem_device); in frontend_init()
1341 budget_av->budget.dvb_frontend = fe; in frontend_init()
1343 if (dvb_register_frontend(&budget_av->budget.dvb_adapter, in frontend_init()
1344 budget_av->budget.dvb_frontend)) { in frontend_init()
1346 dvb_frontend_detach(budget_av->budget.dvb_frontend); in frontend_init()
1347 budget_av->budget.dvb_frontend = NULL; in frontend_init()
1354 struct budget_av *budget_av = dev->ext_priv; in budget_av_irq()
1364 struct budget_av *budget_av = dev->ext_priv; in budget_av_detach()
1369 if (budget_av->has_saa7113 == 1) { in budget_av_detach()
1374 saa7146_unregister_device(&budget_av->vd, dev); in budget_av_detach()
1379 if (budget_av->budget.ci_present) in budget_av_detach()
1382 if (budget_av->budget.dvb_frontend != NULL) { in budget_av_detach()
1383 dvb_unregister_frontend(budget_av->budget.dvb_frontend); in budget_av_detach()
1384 dvb_frontend_detach(budget_av->budget.dvb_frontend); in budget_av_detach()
1386 err = ttpci_budget_deinit(&budget_av->budget); in budget_av_detach()
1397 { 1, "S-Video", V4L2_INPUT_TYPE_CAMERA, 2, 0,
1403 dprintk(1, "VIDIOC_ENUMINPUT %d\n", i->index); in vidioc_enum_input()
1404 if (i->index >= KNC1_INPUTS) in vidioc_enum_input()
1405 return -EINVAL; in vidioc_enum_input()
1406 memcpy(i, &knc1_inputs[i->index], sizeof(struct v4l2_input)); in vidioc_enum_input()
1413 struct budget_av *budget_av = dev->ext_priv; in vidioc_g_input()
1415 *i = budget_av->cur_input; in vidioc_g_input()
1424 struct budget_av *budget_av = dev->ext_priv; in vidioc_s_input()
1442 return -ENOMEM; in budget_av_attach()
1444 budget_av->has_saa7113 = 0; in budget_av_attach()
1445 budget_av->budget.ci_present = 0; in budget_av_attach()
1447 dev->ext_priv = budget_av; in budget_av_attach()
1449 err = ttpci_budget_init(&budget_av->budget, dev, info, THIS_MODULE, in budget_av_attach()
1462 budget_av->has_saa7113 = 1; in budget_av_attach()
1465 ttpci_budget_deinit(&budget_av->budget); in budget_av_attach()
1474 err = saa7146_register_device(&budget_av->vd, dev, "knc1", VFL_TYPE_VIDEO); in budget_av_attach()
1477 ttpci_budget_deinit(&budget_av->budget); in budget_av_attach()
1483 /* beware: this modifies dev->vv ... */ in budget_av_attach()
1493 mac = budget_av->budget.dvb_adapter.proposed_mac; in budget_av_attach()
1494 if (i2c_readregs(&budget_av->budget.i2c_adap, 0xa0, 0x30, mac, 6)) { in budget_av_attach()
1495 pr_err("KNC1-%d: Could not read MAC from KNC1 card\n", in budget_av_attach()
1496 budget_av->budget.dvb_adapter.num); in budget_av_attach()
1499 pr_info("KNC1-%d: MAC addr = %pM\n", in budget_av_attach()
1500 budget_av->budget.dvb_adapter.num, mac); in budget_av_attach()
1503 budget_av->budget.dvb_adapter.priv = budget_av; in budget_av_attach()
1507 ttpci_budget_init_hooks(&budget_av->budget); in budget_av_attach()
1534 MAKE_BUDGET_INFO(knc1s, "KNC1 DVB-S", BUDGET_KNC1S);
1535 MAKE_BUDGET_INFO(knc1s2, "KNC1 DVB-S2", BUDGET_KNC1S2);
1536 MAKE_BUDGET_INFO(sates2, "Satelco EasyWatch DVB-S2", BUDGET_KNC1S2);
1537 MAKE_BUDGET_INFO(knc1c, "KNC1 DVB-C", BUDGET_KNC1C);
1538 MAKE_BUDGET_INFO(knc1t, "KNC1 DVB-T", BUDGET_KNC1T);
1539 MAKE_BUDGET_INFO(kncxs, "KNC TV STAR DVB-S", BUDGET_TVSTAR);
1540 MAKE_BUDGET_INFO(satewpls, "Satelco EasyWatch DVB-S light", BUDGET_TVSTAR);
1541 MAKE_BUDGET_INFO(satewpls1, "Satelco EasyWatch DVB-S light", BUDGET_KNC1S);
1542 MAKE_BUDGET_INFO(satewps, "Satelco EasyWatch DVB-S", BUDGET_KNC1S);
1543 MAKE_BUDGET_INFO(satewplc, "Satelco EasyWatch DVB-C", BUDGET_KNC1CP);
1544 MAKE_BUDGET_INFO(satewcmk3, "Satelco EasyWatch DVB-C MK3", BUDGET_KNC1C_MK3);
1545 MAKE_BUDGET_INFO(satewt, "Satelco EasyWatch DVB-T", BUDGET_KNC1T);
1546 MAKE_BUDGET_INFO(knc1sp, "KNC1 DVB-S Plus", BUDGET_KNC1SP);
1547 MAKE_BUDGET_INFO(knc1spx4, "KNC1 DVB-S Plus X4", BUDGET_KNC1SP);
1548 MAKE_BUDGET_INFO(knc1cp, "KNC1 DVB-C Plus", BUDGET_KNC1CP);
1549 MAKE_BUDGET_INFO(knc1cmk3, "KNC1 DVB-C MK3", BUDGET_KNC1C_MK3);
1550 MAKE_BUDGET_INFO(knc1ctda10024, "KNC1 DVB-C TDA10024", BUDGET_KNC1C_TDA10024);
1551 MAKE_BUDGET_INFO(knc1cpmk3, "KNC1 DVB-C Plus MK3", BUDGET_KNC1CP_MK3);
1552 MAKE_BUDGET_INFO(knc1tp, "KNC1 DVB-T Plus", BUDGET_KNC1TP);
1553 MAKE_BUDGET_INFO(cin1200s, "TerraTec Cinergy 1200 DVB-S", BUDGET_CIN1200S);
1554 MAKE_BUDGET_INFO(cin1200sn, "TerraTec Cinergy 1200 DVB-S", BUDGET_CIN1200S);
1555 MAKE_BUDGET_INFO(cin1200c, "Terratec Cinergy 1200 DVB-C", BUDGET_CIN1200C);
1556 MAKE_BUDGET_INFO(cin1200cmk3, "Terratec Cinergy 1200 DVB-C MK3", BUDGET_CIN1200C_MK3);
1557 MAKE_BUDGET_INFO(cin1200t, "Terratec Cinergy 1200 DVB-T", BUDGET_CIN1200T);
1625 MODULE_DESCRIPTION("driver for the SAA7146 based so-called budget PCI DVB w/ analog input and CI-mo…