diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2012-01-15 15:49:56 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2012-01-15 15:49:56 -0500 |
commit | 122804ecb59493fbb4d31b3ba9ac59faaf45276f (patch) | |
tree | cff4d8a158c412e4a8d3abc8d91bb0eb52b01c9a /drivers/media/dvb/ttusb-budget | |
parent | 16008d641670571ff4cd750b416c7caf2d89f467 (diff) | |
parent | 126400033940afb658123517a2e80eb68259fbd7 (diff) |
Merge branch 'v4l_for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media
* 'v4l_for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media: (655 commits)
[media] revert patch: HDIC HD29L2 DMB-TH USB2.0 reference design driver
mb86a20s: Add a few more register settings at the init seq
mb86a20s: Group registers into the same line
[media] [PATCH] don't reset the delivery system on DTV_CLEAR
[media] [BUG] it913x-fe fix typo error making SNR levels unstable
[media] cx23885: Query the CX25840 during enum_input for status
[media] cx25840: Add support for g_input_status
[media] rc-videomate-m1f.c Rename to match remote controler name
[media] drivers: media: au0828: Fix dependency for VIDEO_AU0828
[media] convert drivers/media/* to use module_platform_driver()
[media] drivers: video: cx231xx: Fix dependency for VIDEO_CX231XX_DVB
[media] Exynos4 JPEG codec v4l2 driver
[media] doc: v4l: selection: choose pixels as units for selection rectangles
[media] v4l: s5p-tv: mixer: fix setup of VP scaling
[media] v4l: s5p-tv: mixer: add support for selection API
[media] v4l: emulate old crop API using extended crop/compose API
[media] doc: v4l: add documentation for selection API
[media] doc: v4l: add binary images for selection API
[media] v4l: add support for selection api
[media] hd29l2: fix review findings
...
Diffstat (limited to 'drivers/media/dvb/ttusb-budget')
-rw-r--r-- | drivers/media/dvb/ttusb-budget/dvb-ttusb-budget.c | 102 |
1 files changed, 58 insertions, 44 deletions
diff --git a/drivers/media/dvb/ttusb-budget/dvb-ttusb-budget.c b/drivers/media/dvb/ttusb-budget/dvb-ttusb-budget.c index e90192fdde11..5b682cc4c814 100644 --- a/drivers/media/dvb/ttusb-budget/dvb-ttusb-budget.c +++ b/drivers/media/dvb/ttusb-budget/dvb-ttusb-budget.c | |||
@@ -1017,19 +1017,20 @@ static u32 functionality(struct i2c_adapter *adapter) | |||
1017 | 1017 | ||
1018 | 1018 | ||
1019 | 1019 | ||
1020 | static int alps_tdmb7_tuner_set_params(struct dvb_frontend* fe, struct dvb_frontend_parameters* params) | 1020 | static int alps_tdmb7_tuner_set_params(struct dvb_frontend *fe) |
1021 | { | 1021 | { |
1022 | struct dtv_frontend_properties *p = &fe->dtv_property_cache; | ||
1022 | struct ttusb* ttusb = (struct ttusb*) fe->dvb->priv; | 1023 | struct ttusb* ttusb = (struct ttusb*) fe->dvb->priv; |
1023 | u8 data[4]; | 1024 | u8 data[4]; |
1024 | struct i2c_msg msg = {.addr=0x61, .flags=0, .buf=data, .len=sizeof(data) }; | 1025 | struct i2c_msg msg = {.addr=0x61, .flags=0, .buf=data, .len=sizeof(data) }; |
1025 | u32 div; | 1026 | u32 div; |
1026 | 1027 | ||
1027 | div = (params->frequency + 36166667) / 166667; | 1028 | div = (p->frequency + 36166667) / 166667; |
1028 | 1029 | ||
1029 | data[0] = (div >> 8) & 0x7f; | 1030 | data[0] = (div >> 8) & 0x7f; |
1030 | data[1] = div & 0xff; | 1031 | data[1] = div & 0xff; |
1031 | data[2] = ((div >> 10) & 0x60) | 0x85; | 1032 | data[2] = ((div >> 10) & 0x60) | 0x85; |
1032 | data[3] = params->frequency < 592000000 ? 0x40 : 0x80; | 1033 | data[3] = p->frequency < 592000000 ? 0x40 : 0x80; |
1033 | 1034 | ||
1034 | if (fe->ops.i2c_gate_ctrl) | 1035 | if (fe->ops.i2c_gate_ctrl) |
1035 | fe->ops.i2c_gate_ctrl(fe, 1); | 1036 | fe->ops.i2c_gate_ctrl(fe, 1); |
@@ -1071,8 +1072,9 @@ static int philips_tdm1316l_tuner_init(struct dvb_frontend* fe) | |||
1071 | return 0; | 1072 | return 0; |
1072 | } | 1073 | } |
1073 | 1074 | ||
1074 | static int philips_tdm1316l_tuner_set_params(struct dvb_frontend* fe, struct dvb_frontend_parameters* params) | 1075 | static int philips_tdm1316l_tuner_set_params(struct dvb_frontend *fe) |
1075 | { | 1076 | { |
1077 | struct dtv_frontend_properties *p = &fe->dtv_property_cache; | ||
1076 | struct ttusb* ttusb = (struct ttusb*) fe->dvb->priv; | 1078 | struct ttusb* ttusb = (struct ttusb*) fe->dvb->priv; |
1077 | u8 tuner_buf[4]; | 1079 | u8 tuner_buf[4]; |
1078 | struct i2c_msg tuner_msg = {.addr=0x60, .flags=0, .buf=tuner_buf, .len=sizeof(tuner_buf) }; | 1080 | struct i2c_msg tuner_msg = {.addr=0x60, .flags=0, .buf=tuner_buf, .len=sizeof(tuner_buf) }; |
@@ -1080,7 +1082,7 @@ static int philips_tdm1316l_tuner_set_params(struct dvb_frontend* fe, struct dvb | |||
1080 | u8 band, cp, filter; | 1082 | u8 band, cp, filter; |
1081 | 1083 | ||
1082 | // determine charge pump | 1084 | // determine charge pump |
1083 | tuner_frequency = params->frequency + 36130000; | 1085 | tuner_frequency = p->frequency + 36130000; |
1084 | if (tuner_frequency < 87000000) return -EINVAL; | 1086 | if (tuner_frequency < 87000000) return -EINVAL; |
1085 | else if (tuner_frequency < 130000000) cp = 3; | 1087 | else if (tuner_frequency < 130000000) cp = 3; |
1086 | else if (tuner_frequency < 160000000) cp = 5; | 1088 | else if (tuner_frequency < 160000000) cp = 5; |
@@ -1094,25 +1096,29 @@ static int philips_tdm1316l_tuner_set_params(struct dvb_frontend* fe, struct dvb | |||
1094 | else return -EINVAL; | 1096 | else return -EINVAL; |
1095 | 1097 | ||
1096 | // determine band | 1098 | // determine band |
1097 | if (params->frequency < 49000000) return -EINVAL; | 1099 | if (p->frequency < 49000000) |
1098 | else if (params->frequency < 159000000) band = 1; | 1100 | return -EINVAL; |
1099 | else if (params->frequency < 444000000) band = 2; | 1101 | else if (p->frequency < 159000000) |
1100 | else if (params->frequency < 861000000) band = 4; | 1102 | band = 1; |
1103 | else if (p->frequency < 444000000) | ||
1104 | band = 2; | ||
1105 | else if (p->frequency < 861000000) | ||
1106 | band = 4; | ||
1101 | else return -EINVAL; | 1107 | else return -EINVAL; |
1102 | 1108 | ||
1103 | // setup PLL filter | 1109 | // setup PLL filter |
1104 | switch (params->u.ofdm.bandwidth) { | 1110 | switch (p->bandwidth_hz) { |
1105 | case BANDWIDTH_6_MHZ: | 1111 | case 6000000: |
1106 | tda1004x_writereg(fe, 0x0C, 0); | 1112 | tda1004x_writereg(fe, 0x0C, 0); |
1107 | filter = 0; | 1113 | filter = 0; |
1108 | break; | 1114 | break; |
1109 | 1115 | ||
1110 | case BANDWIDTH_7_MHZ: | 1116 | case 7000000: |
1111 | tda1004x_writereg(fe, 0x0C, 0); | 1117 | tda1004x_writereg(fe, 0x0C, 0); |
1112 | filter = 0; | 1118 | filter = 0; |
1113 | break; | 1119 | break; |
1114 | 1120 | ||
1115 | case BANDWIDTH_8_MHZ: | 1121 | case 8000000: |
1116 | tda1004x_writereg(fe, 0x0C, 0xFF); | 1122 | tda1004x_writereg(fe, 0x0C, 0xFF); |
1117 | filter = 1; | 1123 | filter = 1; |
1118 | break; | 1124 | break; |
@@ -1123,7 +1129,7 @@ static int philips_tdm1316l_tuner_set_params(struct dvb_frontend* fe, struct dvb | |||
1123 | 1129 | ||
1124 | // calculate divisor | 1130 | // calculate divisor |
1125 | // ((36130000+((1000000/6)/2)) + Finput)/(1000000/6) | 1131 | // ((36130000+((1000000/6)/2)) + Finput)/(1000000/6) |
1126 | tuner_frequency = (((params->frequency / 1000) * 6) + 217280) / 1000; | 1132 | tuner_frequency = (((p->frequency / 1000) * 6) + 217280) / 1000; |
1127 | 1133 | ||
1128 | // setup tuner buffer | 1134 | // setup tuner buffer |
1129 | tuner_buf[0] = tuner_frequency >> 8; | 1135 | tuner_buf[0] = tuner_frequency >> 8; |
@@ -1273,23 +1279,24 @@ static int alps_stv0299_set_symbol_rate(struct dvb_frontend *fe, u32 srate, u32 | |||
1273 | return 0; | 1279 | return 0; |
1274 | } | 1280 | } |
1275 | 1281 | ||
1276 | static int philips_tsa5059_tuner_set_params(struct dvb_frontend *fe, struct dvb_frontend_parameters *params) | 1282 | static int philips_tsa5059_tuner_set_params(struct dvb_frontend *fe) |
1277 | { | 1283 | { |
1284 | struct dtv_frontend_properties *p = &fe->dtv_property_cache; | ||
1278 | struct ttusb* ttusb = (struct ttusb*) fe->dvb->priv; | 1285 | struct ttusb* ttusb = (struct ttusb*) fe->dvb->priv; |
1279 | u8 buf[4]; | 1286 | u8 buf[4]; |
1280 | u32 div; | 1287 | u32 div; |
1281 | struct i2c_msg msg = {.addr = 0x61,.flags = 0,.buf = buf,.len = sizeof(buf) }; | 1288 | struct i2c_msg msg = {.addr = 0x61,.flags = 0,.buf = buf,.len = sizeof(buf) }; |
1282 | 1289 | ||
1283 | if ((params->frequency < 950000) || (params->frequency > 2150000)) | 1290 | if ((p->frequency < 950000) || (p->frequency > 2150000)) |
1284 | return -EINVAL; | 1291 | return -EINVAL; |
1285 | 1292 | ||
1286 | div = (params->frequency + (125 - 1)) / 125; // round correctly | 1293 | div = (p->frequency + (125 - 1)) / 125; /* round correctly */ |
1287 | buf[0] = (div >> 8) & 0x7f; | 1294 | buf[0] = (div >> 8) & 0x7f; |
1288 | buf[1] = div & 0xff; | 1295 | buf[1] = div & 0xff; |
1289 | buf[2] = 0x80 | ((div & 0x18000) >> 10) | 4; | 1296 | buf[2] = 0x80 | ((div & 0x18000) >> 10) | 4; |
1290 | buf[3] = 0xC4; | 1297 | buf[3] = 0xC4; |
1291 | 1298 | ||
1292 | if (params->frequency > 1530000) | 1299 | if (p->frequency > 1530000) |
1293 | buf[3] = 0xC0; | 1300 | buf[3] = 0xC0; |
1294 | 1301 | ||
1295 | /* BSBE1 wants XCE bit set */ | 1302 | /* BSBE1 wants XCE bit set */ |
@@ -1316,14 +1323,15 @@ static struct stv0299_config alps_stv0299_config = { | |||
1316 | .set_symbol_rate = alps_stv0299_set_symbol_rate, | 1323 | .set_symbol_rate = alps_stv0299_set_symbol_rate, |
1317 | }; | 1324 | }; |
1318 | 1325 | ||
1319 | static int ttusb_novas_grundig_29504_491_tuner_set_params(struct dvb_frontend *fe, struct dvb_frontend_parameters *params) | 1326 | static int ttusb_novas_grundig_29504_491_tuner_set_params(struct dvb_frontend *fe) |
1320 | { | 1327 | { |
1328 | struct dtv_frontend_properties *p = &fe->dtv_property_cache; | ||
1321 | struct ttusb* ttusb = (struct ttusb*) fe->dvb->priv; | 1329 | struct ttusb* ttusb = (struct ttusb*) fe->dvb->priv; |
1322 | u8 buf[4]; | 1330 | u8 buf[4]; |
1323 | u32 div; | 1331 | u32 div; |
1324 | struct i2c_msg msg = {.addr = 0x61,.flags = 0,.buf = buf,.len = sizeof(buf) }; | 1332 | struct i2c_msg msg = {.addr = 0x61,.flags = 0,.buf = buf,.len = sizeof(buf) }; |
1325 | 1333 | ||
1326 | div = params->frequency / 125; | 1334 | div = p->frequency / 125; |
1327 | 1335 | ||
1328 | buf[0] = (div >> 8) & 0x7f; | 1336 | buf[0] = (div >> 8) & 0x7f; |
1329 | buf[1] = div & 0xff; | 1337 | buf[1] = div & 0xff; |
@@ -1343,19 +1351,20 @@ static struct tda8083_config ttusb_novas_grundig_29504_491_config = { | |||
1343 | .demod_address = 0x68, | 1351 | .demod_address = 0x68, |
1344 | }; | 1352 | }; |
1345 | 1353 | ||
1346 | static int alps_tdbe2_tuner_set_params(struct dvb_frontend* fe, struct dvb_frontend_parameters* params) | 1354 | static int alps_tdbe2_tuner_set_params(struct dvb_frontend *fe) |
1347 | { | 1355 | { |
1356 | struct dtv_frontend_properties *p = &fe->dtv_property_cache; | ||
1348 | struct ttusb* ttusb = fe->dvb->priv; | 1357 | struct ttusb* ttusb = fe->dvb->priv; |
1349 | u32 div; | 1358 | u32 div; |
1350 | u8 data[4]; | 1359 | u8 data[4]; |
1351 | struct i2c_msg msg = { .addr = 0x62, .flags = 0, .buf = data, .len = sizeof(data) }; | 1360 | struct i2c_msg msg = { .addr = 0x62, .flags = 0, .buf = data, .len = sizeof(data) }; |
1352 | 1361 | ||
1353 | div = (params->frequency + 35937500 + 31250) / 62500; | 1362 | div = (p->frequency + 35937500 + 31250) / 62500; |
1354 | 1363 | ||
1355 | data[0] = (div >> 8) & 0x7f; | 1364 | data[0] = (div >> 8) & 0x7f; |
1356 | data[1] = div & 0xff; | 1365 | data[1] = div & 0xff; |
1357 | data[2] = 0x85 | ((div >> 10) & 0x60); | 1366 | data[2] = 0x85 | ((div >> 10) & 0x60); |
1358 | data[3] = (params->frequency < 174000000 ? 0x88 : params->frequency < 470000000 ? 0x84 : 0x81); | 1367 | data[3] = (p->frequency < 174000000 ? 0x88 : p->frequency < 470000000 ? 0x84 : 0x81); |
1359 | 1368 | ||
1360 | if (fe->ops.i2c_gate_ctrl) | 1369 | if (fe->ops.i2c_gate_ctrl) |
1361 | fe->ops.i2c_gate_ctrl(fe, 1); | 1370 | fe->ops.i2c_gate_ctrl(fe, 1); |
@@ -1387,8 +1396,9 @@ static u8 read_pwm(struct ttusb* ttusb) | |||
1387 | } | 1396 | } |
1388 | 1397 | ||
1389 | 1398 | ||
1390 | static int dvbc_philips_tdm1316l_tuner_set_params(struct dvb_frontend *fe, struct dvb_frontend_parameters *params) | 1399 | static int dvbc_philips_tdm1316l_tuner_set_params(struct dvb_frontend *fe) |
1391 | { | 1400 | { |
1401 | struct dtv_frontend_properties *p = &fe->dtv_property_cache; | ||
1392 | struct ttusb *ttusb = (struct ttusb *) fe->dvb->priv; | 1402 | struct ttusb *ttusb = (struct ttusb *) fe->dvb->priv; |
1393 | u8 tuner_buf[5]; | 1403 | u8 tuner_buf[5]; |
1394 | struct i2c_msg tuner_msg = {.addr = 0x60, | 1404 | struct i2c_msg tuner_msg = {.addr = 0x60, |
@@ -1399,7 +1409,7 @@ static int dvbc_philips_tdm1316l_tuner_set_params(struct dvb_frontend *fe, struc | |||
1399 | u8 band, cp, filter; | 1409 | u8 band, cp, filter; |
1400 | 1410 | ||
1401 | // determine charge pump | 1411 | // determine charge pump |
1402 | tuner_frequency = params->frequency; | 1412 | tuner_frequency = p->frequency; |
1403 | if (tuner_frequency < 87000000) {return -EINVAL;} | 1413 | if (tuner_frequency < 87000000) {return -EINVAL;} |
1404 | else if (tuner_frequency < 130000000) {cp = 3; band = 1;} | 1414 | else if (tuner_frequency < 130000000) {cp = 3; band = 1;} |
1405 | else if (tuner_frequency < 160000000) {cp = 5; band = 1;} | 1415 | else if (tuner_frequency < 160000000) {cp = 5; band = 1;} |
@@ -1417,7 +1427,7 @@ static int dvbc_philips_tdm1316l_tuner_set_params(struct dvb_frontend *fe, struc | |||
1417 | 1427 | ||
1418 | // calculate divisor | 1428 | // calculate divisor |
1419 | // (Finput + Fif)/Fref; Fif = 36125000 Hz, Fref = 62500 Hz | 1429 | // (Finput + Fif)/Fref; Fif = 36125000 Hz, Fref = 62500 Hz |
1420 | tuner_frequency = ((params->frequency + 36125000) / 62500); | 1430 | tuner_frequency = ((p->frequency + 36125000) / 62500); |
1421 | 1431 | ||
1422 | // setup tuner buffer | 1432 | // setup tuner buffer |
1423 | tuner_buf[0] = tuner_frequency >> 8; | 1433 | tuner_buf[0] = tuner_frequency >> 8; |
@@ -1694,10 +1704,8 @@ static int ttusb_probe(struct usb_interface *intf, const struct usb_device_id *i | |||
1694 | ttusb->i2c_adap.dev.parent = &udev->dev; | 1704 | ttusb->i2c_adap.dev.parent = &udev->dev; |
1695 | 1705 | ||
1696 | result = i2c_add_adapter(&ttusb->i2c_adap); | 1706 | result = i2c_add_adapter(&ttusb->i2c_adap); |
1697 | if (result) { | 1707 | if (result) |
1698 | dvb_unregister_adapter (&ttusb->adapter); | 1708 | goto err_unregister_adapter; |
1699 | return result; | ||
1700 | } | ||
1701 | 1709 | ||
1702 | memset(&ttusb->dvb_demux, 0, sizeof(ttusb->dvb_demux)); | 1710 | memset(&ttusb->dvb_demux, 0, sizeof(ttusb->dvb_demux)); |
1703 | 1711 | ||
@@ -1714,33 +1722,29 @@ static int ttusb_probe(struct usb_interface *intf, const struct usb_device_id *i | |||
1714 | ttusb->dvb_demux.stop_feed = ttusb_stop_feed; | 1722 | ttusb->dvb_demux.stop_feed = ttusb_stop_feed; |
1715 | ttusb->dvb_demux.write_to_decoder = NULL; | 1723 | ttusb->dvb_demux.write_to_decoder = NULL; |
1716 | 1724 | ||
1717 | if ((result = dvb_dmx_init(&ttusb->dvb_demux)) < 0) { | 1725 | result = dvb_dmx_init(&ttusb->dvb_demux); |
1726 | if (result < 0) { | ||
1718 | printk("ttusb_dvb: dvb_dmx_init failed (errno = %d)\n", result); | 1727 | printk("ttusb_dvb: dvb_dmx_init failed (errno = %d)\n", result); |
1719 | i2c_del_adapter(&ttusb->i2c_adap); | 1728 | result = -ENODEV; |
1720 | dvb_unregister_adapter (&ttusb->adapter); | 1729 | goto err_i2c_del_adapter; |
1721 | return -ENODEV; | ||
1722 | } | 1730 | } |
1723 | //FIXME dmxdev (nur WAS?) | 1731 | //FIXME dmxdev (nur WAS?) |
1724 | ttusb->dmxdev.filternum = ttusb->dvb_demux.filternum; | 1732 | ttusb->dmxdev.filternum = ttusb->dvb_demux.filternum; |
1725 | ttusb->dmxdev.demux = &ttusb->dvb_demux.dmx; | 1733 | ttusb->dmxdev.demux = &ttusb->dvb_demux.dmx; |
1726 | ttusb->dmxdev.capabilities = 0; | 1734 | ttusb->dmxdev.capabilities = 0; |
1727 | 1735 | ||
1728 | if ((result = dvb_dmxdev_init(&ttusb->dmxdev, &ttusb->adapter)) < 0) { | 1736 | result = dvb_dmxdev_init(&ttusb->dmxdev, &ttusb->adapter); |
1737 | if (result < 0) { | ||
1729 | printk("ttusb_dvb: dvb_dmxdev_init failed (errno = %d)\n", | 1738 | printk("ttusb_dvb: dvb_dmxdev_init failed (errno = %d)\n", |
1730 | result); | 1739 | result); |
1731 | dvb_dmx_release(&ttusb->dvb_demux); | 1740 | result = -ENODEV; |
1732 | i2c_del_adapter(&ttusb->i2c_adap); | 1741 | goto err_release_dmx; |
1733 | dvb_unregister_adapter (&ttusb->adapter); | ||
1734 | return -ENODEV; | ||
1735 | } | 1742 | } |
1736 | 1743 | ||
1737 | if (dvb_net_init(&ttusb->adapter, &ttusb->dvbnet, &ttusb->dvb_demux.dmx)) { | 1744 | if (dvb_net_init(&ttusb->adapter, &ttusb->dvbnet, &ttusb->dvb_demux.dmx)) { |
1738 | printk("ttusb_dvb: dvb_net_init failed!\n"); | 1745 | printk("ttusb_dvb: dvb_net_init failed!\n"); |
1739 | dvb_dmxdev_release(&ttusb->dmxdev); | 1746 | result = -ENODEV; |
1740 | dvb_dmx_release(&ttusb->dvb_demux); | 1747 | goto err_release_dmxdev; |
1741 | i2c_del_adapter(&ttusb->i2c_adap); | ||
1742 | dvb_unregister_adapter (&ttusb->adapter); | ||
1743 | return -ENODEV; | ||
1744 | } | 1748 | } |
1745 | 1749 | ||
1746 | usb_set_intfdata(intf, (void *) ttusb); | 1750 | usb_set_intfdata(intf, (void *) ttusb); |
@@ -1748,6 +1752,16 @@ static int ttusb_probe(struct usb_interface *intf, const struct usb_device_id *i | |||
1748 | frontend_init(ttusb); | 1752 | frontend_init(ttusb); |
1749 | 1753 | ||
1750 | return 0; | 1754 | return 0; |
1755 | |||
1756 | err_release_dmxdev: | ||
1757 | dvb_dmxdev_release(&ttusb->dmxdev); | ||
1758 | err_release_dmx: | ||
1759 | dvb_dmx_release(&ttusb->dvb_demux); | ||
1760 | err_i2c_del_adapter: | ||
1761 | i2c_del_adapter(&ttusb->i2c_adap); | ||
1762 | err_unregister_adapter: | ||
1763 | dvb_unregister_adapter (&ttusb->adapter); | ||
1764 | return result; | ||
1751 | } | 1765 | } |
1752 | 1766 | ||
1753 | static void ttusb_disconnect(struct usb_interface *intf) | 1767 | static void ttusb_disconnect(struct usb_interface *intf) |