diff options
| -rw-r--r-- | drivers/media/dvb/frontends/Kconfig | 10 | ||||
| -rw-r--r-- | drivers/media/dvb/frontends/Makefile | 1 | ||||
| -rw-r--r-- | drivers/media/dvb/frontends/lnbp21.c | 145 | ||||
| -rw-r--r-- | drivers/media/dvb/frontends/lnbp21.h | 102 | ||||
| -rw-r--r-- | drivers/media/dvb/ttpci/Kconfig | 3 | ||||
| -rw-r--r-- | drivers/media/dvb/ttpci/av7110.c | 2 | ||||
| -rw-r--r-- | drivers/media/dvb/ttpci/budget-ci.c | 2 | ||||
| -rw-r--r-- | drivers/media/dvb/ttpci/budget.c | 2 | ||||
| -rw-r--r-- | drivers/media/dvb/ttusb-budget/Kconfig | 1 | ||||
| -rw-r--r-- | drivers/media/dvb/ttusb-budget/dvb-ttusb-budget.c | 28 |
10 files changed, 169 insertions, 127 deletions
diff --git a/drivers/media/dvb/frontends/Kconfig b/drivers/media/dvb/frontends/Kconfig index 6d90ff3f71ec..64cd63623b0b 100644 --- a/drivers/media/dvb/frontends/Kconfig +++ b/drivers/media/dvb/frontends/Kconfig | |||
| @@ -216,4 +216,14 @@ config DVB_LGDT330X | |||
| 216 | An ATSC 8VSB and QAM64/256 tuner module. Say Y when you want | 216 | An ATSC 8VSB and QAM64/256 tuner module. Say Y when you want |
| 217 | to support this frontend. | 217 | to support this frontend. |
| 218 | 218 | ||
| 219 | |||
| 220 | comment "Miscellaneous devices" | ||
| 221 | depends on DVB_CORE | ||
| 222 | |||
| 223 | config DVB_LNBP21 | ||
| 224 | tristate "LNBP21 SEC controller" | ||
| 225 | depends on DVB_CORE | ||
| 226 | help | ||
| 227 | An SEC control chip. | ||
| 228 | |||
| 219 | endmenu | 229 | endmenu |
diff --git a/drivers/media/dvb/frontends/Makefile b/drivers/media/dvb/frontends/Makefile index d09b6071fbaf..7238e6ef2f22 100644 --- a/drivers/media/dvb/frontends/Makefile +++ b/drivers/media/dvb/frontends/Makefile | |||
| @@ -31,3 +31,4 @@ obj-$(CONFIG_DVB_BCM3510) += bcm3510.o | |||
| 31 | obj-$(CONFIG_DVB_S5H1420) += s5h1420.o | 31 | obj-$(CONFIG_DVB_S5H1420) += s5h1420.o |
| 32 | obj-$(CONFIG_DVB_LGDT330X) += lgdt330x.o | 32 | obj-$(CONFIG_DVB_LGDT330X) += lgdt330x.o |
| 33 | obj-$(CONFIG_DVB_CX24123) += cx24123.o | 33 | obj-$(CONFIG_DVB_CX24123) += cx24123.o |
| 34 | obj-$(CONFIG_DVB_LNBP21) += lnbp21.o | ||
diff --git a/drivers/media/dvb/frontends/lnbp21.c b/drivers/media/dvb/frontends/lnbp21.c new file mode 100644 index 000000000000..c9152c1fbc3f --- /dev/null +++ b/drivers/media/dvb/frontends/lnbp21.c | |||
| @@ -0,0 +1,145 @@ | |||
| 1 | /* | ||
| 2 | * lnbp21.h - driver for lnb supply and control ic lnbp21 | ||
| 3 | * | ||
| 4 | * Copyright (C) 2006 Oliver Endriss | ||
| 5 | * | ||
| 6 | * This program is free software; you can redistribute it and/or | ||
| 7 | * modify it under the terms of the GNU General Public License | ||
| 8 | * as published by the Free Software Foundation; either version 2 | ||
| 9 | * of the License, or (at your option) any later version. | ||
| 10 | * | ||
| 11 | * | ||
| 12 | * This program is distributed in the hope that it will be useful, | ||
| 13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 15 | * GNU General Public License for more details. | ||
| 16 | * | ||
| 17 | * | ||
| 18 | * You should have received a copy of the GNU General Public License | ||
| 19 | * along with this program; if not, write to the Free Software | ||
| 20 | * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | ||
| 21 | * Or, point your browser to http://www.gnu.org/copyleft/gpl.html | ||
| 22 | * | ||
| 23 | * | ||
| 24 | * the project's page is at http://www.linuxtv.org | ||
| 25 | */ | ||
| 26 | #include <linux/delay.h> | ||
| 27 | #include <linux/errno.h> | ||
| 28 | #include <linux/init.h> | ||
| 29 | #include <linux/kernel.h> | ||
| 30 | #include <linux/module.h> | ||
| 31 | #include <linux/moduleparam.h> | ||
| 32 | #include <linux/string.h> | ||
| 33 | #include <linux/slab.h> | ||
| 34 | |||
| 35 | #include "dvb_frontend.h" | ||
| 36 | #include "lnbp21.h" | ||
| 37 | |||
| 38 | struct lnbp21 { | ||
| 39 | u8 config; | ||
| 40 | u8 override_or; | ||
| 41 | u8 override_and; | ||
| 42 | struct i2c_adapter *i2c; | ||
| 43 | void (*release_chain)(struct dvb_frontend* fe); | ||
| 44 | }; | ||
| 45 | |||
| 46 | static int lnbp21_set_voltage(struct dvb_frontend *fe, fe_sec_voltage_t voltage) | ||
| 47 | { | ||
| 48 | struct lnbp21 *lnbp21 = (struct lnbp21 *) fe->misc_priv; | ||
| 49 | struct i2c_msg msg = { .addr = 0x08, .flags = 0, | ||
| 50 | .buf = &lnbp21->config, | ||
| 51 | .len = sizeof(lnbp21->config) }; | ||
| 52 | |||
| 53 | lnbp21->config &= ~(LNBP21_VSEL | LNBP21_EN); | ||
| 54 | |||
| 55 | switch(voltage) { | ||
| 56 | case SEC_VOLTAGE_OFF: | ||
| 57 | break; | ||
| 58 | case SEC_VOLTAGE_13: | ||
| 59 | lnbp21->config |= LNBP21_EN; | ||
| 60 | break; | ||
| 61 | case SEC_VOLTAGE_18: | ||
| 62 | lnbp21->config |= (LNBP21_EN | LNBP21_VSEL); | ||
| 63 | break; | ||
| 64 | default: | ||
| 65 | return -EINVAL; | ||
| 66 | }; | ||
| 67 | |||
| 68 | lnbp21->config |= lnbp21->override_or; | ||
| 69 | lnbp21->config &= lnbp21->override_and; | ||
| 70 | |||
| 71 | return (i2c_transfer(lnbp21->i2c, &msg, 1) == 1) ? 0 : -EIO; | ||
| 72 | } | ||
| 73 | |||
| 74 | static int lnbp21_enable_high_lnb_voltage(struct dvb_frontend *fe, long arg) | ||
| 75 | { | ||
| 76 | struct lnbp21 *lnbp21 = (struct lnbp21 *) fe->misc_priv; | ||
| 77 | struct i2c_msg msg = { .addr = 0x08, .flags = 0, | ||
| 78 | .buf = &lnbp21->config, | ||
| 79 | .len = sizeof(lnbp21->config) }; | ||
| 80 | |||
| 81 | if (arg) | ||
| 82 | lnbp21->config |= LNBP21_LLC; | ||
| 83 | else | ||
| 84 | lnbp21->config &= ~LNBP21_LLC; | ||
| 85 | |||
| 86 | lnbp21->config |= lnbp21->override_or; | ||
| 87 | lnbp21->config &= lnbp21->override_and; | ||
| 88 | |||
| 89 | return (i2c_transfer(lnbp21->i2c, &msg, 1) == 1) ? 0 : -EIO; | ||
| 90 | } | ||
| 91 | |||
| 92 | static void lnbp21_release(struct dvb_frontend *fe) | ||
| 93 | { | ||
| 94 | struct lnbp21 *lnbp21 = (struct lnbp21 *) fe->misc_priv; | ||
| 95 | |||
| 96 | /* LNBP power off */ | ||
| 97 | lnbp21_set_voltage(fe, SEC_VOLTAGE_OFF); | ||
| 98 | |||
| 99 | /* free data & call next release routine */ | ||
| 100 | fe->ops->release = lnbp21->release_chain; | ||
| 101 | kfree(fe->misc_priv); | ||
| 102 | fe->misc_priv = NULL; | ||
| 103 | if (fe->ops->release) | ||
| 104 | fe->ops->release(fe); | ||
| 105 | } | ||
| 106 | |||
| 107 | int lnbp21_attach(struct dvb_frontend *fe, struct i2c_adapter *i2c, u8 override_set, u8 override_clear) | ||
| 108 | { | ||
| 109 | struct lnbp21 *lnbp21 = kmalloc(sizeof(struct lnbp21), GFP_KERNEL); | ||
| 110 | if (!lnbp21) | ||
| 111 | return -ENOMEM; | ||
| 112 | |||
| 113 | /* default configuration */ | ||
| 114 | lnbp21->config = LNBP21_ISEL; | ||
| 115 | lnbp21->i2c = i2c; | ||
| 116 | fe->misc_priv = lnbp21; | ||
| 117 | |||
| 118 | /* bits which should be forced to '1' */ | ||
| 119 | lnbp21->override_or = override_set; | ||
| 120 | |||
| 121 | /* bits which should be forced to '0' */ | ||
| 122 | lnbp21->override_and = ~override_clear; | ||
| 123 | |||
| 124 | /* detect if it is present or not */ | ||
| 125 | if (lnbp21_set_voltage(fe, SEC_VOLTAGE_OFF)) { | ||
| 126 | kfree(lnbp21); | ||
| 127 | fe->misc_priv = NULL; | ||
| 128 | return -EIO; | ||
| 129 | } | ||
| 130 | |||
| 131 | /* install release callback */ | ||
| 132 | lnbp21->release_chain = fe->ops->release; | ||
| 133 | fe->ops->release = lnbp21_release; | ||
| 134 | |||
| 135 | /* override frontend ops */ | ||
| 136 | fe->ops->set_voltage = lnbp21_set_voltage; | ||
| 137 | fe->ops->enable_high_lnb_voltage = lnbp21_enable_high_lnb_voltage; | ||
| 138 | |||
| 139 | return 0; | ||
| 140 | } | ||
| 141 | EXPORT_SYMBOL(lnbp21_attach); | ||
| 142 | |||
| 143 | MODULE_DESCRIPTION("Driver for lnb supply and control ic lnbp21"); | ||
| 144 | MODULE_AUTHOR("Oliver Endriss"); | ||
| 145 | MODULE_LICENSE("GPL"); | ||
diff --git a/drivers/media/dvb/frontends/lnbp21.h b/drivers/media/dvb/frontends/lnbp21.h index 0dcbe61b61b1..047a4ab68c01 100644 --- a/drivers/media/dvb/frontends/lnbp21.h +++ b/drivers/media/dvb/frontends/lnbp21.h | |||
| @@ -27,7 +27,7 @@ | |||
| 27 | #ifndef _LNBP21_H | 27 | #ifndef _LNBP21_H |
| 28 | #define _LNBP21_H | 28 | #define _LNBP21_H |
| 29 | 29 | ||
| 30 | /* system register */ | 30 | /* system register bits */ |
| 31 | #define LNBP21_OLF 0x01 | 31 | #define LNBP21_OLF 0x01 |
| 32 | #define LNBP21_OTF 0x02 | 32 | #define LNBP21_OTF 0x02 |
| 33 | #define LNBP21_EN 0x04 | 33 | #define LNBP21_EN 0x04 |
| @@ -37,103 +37,9 @@ | |||
| 37 | #define LNBP21_ISEL 0x40 | 37 | #define LNBP21_ISEL 0x40 |
| 38 | #define LNBP21_PCL 0x80 | 38 | #define LNBP21_PCL 0x80 |
| 39 | 39 | ||
| 40 | struct lnbp21 { | 40 | #include <linux/dvb/frontend.h> |
| 41 | u8 config; | ||
| 42 | u8 override_or; | ||
| 43 | u8 override_and; | ||
| 44 | struct i2c_adapter *i2c; | ||
| 45 | void (*release_chain)(struct dvb_frontend* fe); | ||
| 46 | }; | ||
| 47 | 41 | ||
| 48 | static int lnbp21_set_voltage(struct dvb_frontend *fe, fe_sec_voltage_t voltage) | 42 | /* override_set and override_clear control which system register bits (above) to always set & clear */ |
| 49 | { | 43 | extern int lnbp21_attach(struct dvb_frontend *fe, struct i2c_adapter *i2c, u8 override_set, u8 override_clear); |
| 50 | struct lnbp21 *lnbp21 = (struct lnbp21 *) fe->misc_priv; | ||
| 51 | struct i2c_msg msg = { .addr = 0x08, .flags = 0, | ||
| 52 | .buf = &lnbp21->config, | ||
| 53 | .len = sizeof(lnbp21->config) }; | ||
| 54 | |||
| 55 | lnbp21->config &= ~(LNBP21_VSEL | LNBP21_EN); | ||
| 56 | |||
| 57 | switch(voltage) { | ||
| 58 | case SEC_VOLTAGE_OFF: | ||
| 59 | break; | ||
| 60 | case SEC_VOLTAGE_13: | ||
| 61 | lnbp21->config |= LNBP21_EN; | ||
| 62 | break; | ||
| 63 | case SEC_VOLTAGE_18: | ||
| 64 | lnbp21->config |= (LNBP21_EN | LNBP21_VSEL); | ||
| 65 | break; | ||
| 66 | default: | ||
| 67 | return -EINVAL; | ||
| 68 | }; | ||
| 69 | |||
| 70 | lnbp21->config |= lnbp21->override_or; | ||
| 71 | lnbp21->config &= lnbp21->override_and; | ||
| 72 | |||
| 73 | return (i2c_transfer(lnbp21->i2c, &msg, 1) == 1) ? 0 : -EIO; | ||
| 74 | } | ||
| 75 | |||
| 76 | static int lnbp21_enable_high_lnb_voltage(struct dvb_frontend *fe, long arg) | ||
| 77 | { | ||
| 78 | struct lnbp21 *lnbp21 = (struct lnbp21 *) fe->misc_priv; | ||
| 79 | struct i2c_msg msg = { .addr = 0x08, .flags = 0, | ||
| 80 | .buf = &lnbp21->config, | ||
| 81 | .len = sizeof(lnbp21->config) }; | ||
| 82 | |||
| 83 | if (arg) | ||
| 84 | lnbp21->config |= LNBP21_LLC; | ||
| 85 | else | ||
| 86 | lnbp21->config &= ~LNBP21_LLC; | ||
| 87 | |||
| 88 | lnbp21->config |= lnbp21->override_or; | ||
| 89 | lnbp21->config &= lnbp21->override_and; | ||
| 90 | |||
| 91 | return (i2c_transfer(lnbp21->i2c, &msg, 1) == 1) ? 0 : -EIO; | ||
| 92 | } | ||
| 93 | |||
| 94 | static void lnbp21_exit(struct dvb_frontend *fe) | ||
| 95 | { | ||
| 96 | struct lnbp21 *lnbp21 = (struct lnbp21 *) fe->misc_priv; | ||
| 97 | |||
| 98 | /* LNBP power off */ | ||
| 99 | lnbp21_set_voltage(fe, SEC_VOLTAGE_OFF); | ||
| 100 | |||
| 101 | /* free data & call next release routine */ | ||
| 102 | fe->ops->release = lnbp21->release_chain; | ||
| 103 | kfree(fe->misc_priv); | ||
| 104 | fe->misc_priv = NULL; | ||
| 105 | if (fe->ops->release) | ||
| 106 | fe->ops->release(fe); | ||
| 107 | } | ||
| 108 | |||
| 109 | static int lnbp21_init(struct dvb_frontend *fe, struct i2c_adapter *i2c, u8 override_set, u8 override_clear) | ||
| 110 | { | ||
| 111 | struct lnbp21 *lnbp21 = kmalloc(sizeof(struct lnbp21), GFP_KERNEL); | ||
| 112 | |||
| 113 | if (!lnbp21) | ||
| 114 | return -ENOMEM; | ||
| 115 | |||
| 116 | /* default configuration */ | ||
| 117 | lnbp21->config = LNBP21_ISEL; | ||
| 118 | |||
| 119 | /* bits which should be forced to '1' */ | ||
| 120 | lnbp21->override_or = override_set; | ||
| 121 | |||
| 122 | /* bits which should be forced to '0' */ | ||
| 123 | lnbp21->override_and = ~override_clear; | ||
| 124 | |||
| 125 | /* install release callback */ | ||
| 126 | lnbp21->release_chain = fe->ops->release; | ||
| 127 | fe->ops->release = lnbp21_exit; | ||
| 128 | |||
| 129 | /* override frontend ops */ | ||
| 130 | fe->ops->set_voltage = lnbp21_set_voltage; | ||
| 131 | fe->ops->enable_high_lnb_voltage = lnbp21_enable_high_lnb_voltage; | ||
| 132 | |||
| 133 | lnbp21->i2c = i2c; | ||
| 134 | fe->misc_priv = lnbp21; | ||
| 135 | |||
| 136 | return lnbp21_set_voltage(fe, SEC_VOLTAGE_OFF); | ||
| 137 | } | ||
| 138 | 44 | ||
| 139 | #endif | 45 | #endif |
diff --git a/drivers/media/dvb/ttpci/Kconfig b/drivers/media/dvb/ttpci/Kconfig index b5ac7dfde52f..987881fa988c 100644 --- a/drivers/media/dvb/ttpci/Kconfig +++ b/drivers/media/dvb/ttpci/Kconfig | |||
| @@ -10,6 +10,7 @@ config DVB_AV7110 | |||
| 10 | select DVB_SP8870 | 10 | select DVB_SP8870 |
| 11 | select DVB_STV0297 | 11 | select DVB_STV0297 |
| 12 | select DVB_L64781 | 12 | select DVB_L64781 |
| 13 | select DVB_LNBP21 | ||
| 13 | help | 14 | help |
| 14 | Support for SAA7146 and AV7110 based DVB cards as produced | 15 | Support for SAA7146 and AV7110 based DVB cards as produced |
| 15 | by Fujitsu-Siemens, Technotrend, Hauppauge and others. | 16 | by Fujitsu-Siemens, Technotrend, Hauppauge and others. |
| @@ -67,6 +68,7 @@ config DVB_BUDGET | |||
| 67 | select DVB_TDA8083 | 68 | select DVB_TDA8083 |
| 68 | select DVB_TDA10021 | 69 | select DVB_TDA10021 |
| 69 | select DVB_S5H1420 | 70 | select DVB_S5H1420 |
| 71 | select DVB_LNBP21 | ||
| 70 | help | 72 | help |
| 71 | Support for simple SAA7146 based DVB cards | 73 | Support for simple SAA7146 based DVB cards |
| 72 | (so called Budget- or Nova-PCI cards) without onboard | 74 | (so called Budget- or Nova-PCI cards) without onboard |
| @@ -84,6 +86,7 @@ config DVB_BUDGET_CI | |||
| 84 | select DVB_STV0297 | 86 | select DVB_STV0297 |
| 85 | select DVB_STV0299 | 87 | select DVB_STV0299 |
| 86 | select DVB_TDA1004X | 88 | select DVB_TDA1004X |
| 89 | select DVB_LNBP21 | ||
| 87 | help | 90 | help |
| 88 | Support for simple SAA7146 based DVB cards | 91 | Support for simple SAA7146 based DVB cards |
| 89 | (so called Budget- or Nova-PCI cards) without onboard | 92 | (so called Budget- or Nova-PCI cards) without onboard |
diff --git a/drivers/media/dvb/ttpci/av7110.c b/drivers/media/dvb/ttpci/av7110.c index 5f976d5eda42..1a6d7a3bf459 100644 --- a/drivers/media/dvb/ttpci/av7110.c +++ b/drivers/media/dvb/ttpci/av7110.c | |||
| @@ -2223,7 +2223,7 @@ static int frontend_init(struct av7110 *av7110) | |||
| 2223 | av7110->fe->ops->tuner_ops.set_params = alps_bsbe1_tuner_set_params; | 2223 | av7110->fe->ops->tuner_ops.set_params = alps_bsbe1_tuner_set_params; |
| 2224 | av7110->fe->tuner_priv = &av7110->i2c_adap; | 2224 | av7110->fe->tuner_priv = &av7110->i2c_adap; |
| 2225 | 2225 | ||
| 2226 | if (lnbp21_init(av7110->fe, &av7110->i2c_adap, 0, 0)) { | 2226 | if (lnbp21_attach(av7110->fe, &av7110->i2c_adap, 0, 0)) { |
| 2227 | printk("dvb-ttpci: LNBP21 not found!\n"); | 2227 | printk("dvb-ttpci: LNBP21 not found!\n"); |
| 2228 | if (av7110->fe->ops->release) | 2228 | if (av7110->fe->ops->release) |
| 2229 | av7110->fe->ops->release(av7110->fe); | 2229 | av7110->fe->ops->release(av7110->fe); |
diff --git a/drivers/media/dvb/ttpci/budget-ci.c b/drivers/media/dvb/ttpci/budget-ci.c index ed610e56b91e..145e12f9a7f6 100644 --- a/drivers/media/dvb/ttpci/budget-ci.c +++ b/drivers/media/dvb/ttpci/budget-ci.c | |||
| @@ -1043,7 +1043,7 @@ static void frontend_init(struct budget_ci *budget_ci) | |||
| 1043 | budget_ci->budget.dvb_frontend->tuner_priv = &budget_ci->budget.i2c_adap; | 1043 | budget_ci->budget.dvb_frontend->tuner_priv = &budget_ci->budget.i2c_adap; |
| 1044 | 1044 | ||
| 1045 | budget_ci->budget.dvb_frontend->ops->dishnetwork_send_legacy_command = NULL; | 1045 | budget_ci->budget.dvb_frontend->ops->dishnetwork_send_legacy_command = NULL; |
| 1046 | if (lnbp21_init(budget_ci->budget.dvb_frontend, &budget_ci->budget.i2c_adap, LNBP21_LLC, 0)) { | 1046 | if (lnbp21_attach(budget_ci->budget.dvb_frontend, &budget_ci->budget.i2c_adap, LNBP21_LLC, 0)) { |
| 1047 | printk("%s: No LNBP21 found!\n", __FUNCTION__); | 1047 | printk("%s: No LNBP21 found!\n", __FUNCTION__); |
| 1048 | if (budget_ci->budget.dvb_frontend->ops->release) | 1048 | if (budget_ci->budget.dvb_frontend->ops->release) |
| 1049 | budget_ci->budget.dvb_frontend->ops->release(budget_ci->budget.dvb_frontend); | 1049 | budget_ci->budget.dvb_frontend->ops->release(budget_ci->budget.dvb_frontend); |
diff --git a/drivers/media/dvb/ttpci/budget.c b/drivers/media/dvb/ttpci/budget.c index a231975cbe3c..d98395fefc95 100644 --- a/drivers/media/dvb/ttpci/budget.c +++ b/drivers/media/dvb/ttpci/budget.c | |||
| @@ -423,7 +423,7 @@ static void frontend_init(struct budget *budget) | |||
| 423 | budget->dvb_frontend = s5h1420_attach(&s5h1420_config, &budget->i2c_adap); | 423 | budget->dvb_frontend = s5h1420_attach(&s5h1420_config, &budget->i2c_adap); |
| 424 | if (budget->dvb_frontend) { | 424 | if (budget->dvb_frontend) { |
| 425 | budget->dvb_frontend->ops->tuner_ops.set_params = s5h1420_tuner_set_params; | 425 | budget->dvb_frontend->ops->tuner_ops.set_params = s5h1420_tuner_set_params; |
| 426 | if (lnbp21_init(budget->dvb_frontend, &budget->i2c_adap, 0, 0)) { | 426 | if (lnbp21_attach(budget->dvb_frontend, &budget->i2c_adap, 0, 0)) { |
| 427 | printk("%s: No LNBP21 found!\n", __FUNCTION__); | 427 | printk("%s: No LNBP21 found!\n", __FUNCTION__); |
| 428 | goto error_out; | 428 | goto error_out; |
| 429 | } | 429 | } |
diff --git a/drivers/media/dvb/ttusb-budget/Kconfig b/drivers/media/dvb/ttusb-budget/Kconfig index 914587d52b57..d1004e863290 100644 --- a/drivers/media/dvb/ttusb-budget/Kconfig +++ b/drivers/media/dvb/ttusb-budget/Kconfig | |||
| @@ -6,6 +6,7 @@ config DVB_TTUSB_BUDGET | |||
| 6 | select DVB_VES1820 | 6 | select DVB_VES1820 |
| 7 | select DVB_TDA8083 | 7 | select DVB_TDA8083 |
| 8 | select DVB_STV0299 | 8 | select DVB_STV0299 |
| 9 | select DVB_LNBP21 | ||
| 9 | help | 10 | help |
| 10 | Support for external USB adapters designed by Technotrend and | 11 | Support for external USB adapters designed by Technotrend and |
| 11 | produced by Hauppauge, shipped under the brand name 'Nova-USB'. | 12 | produced by Hauppauge, shipped under the brand name 'Nova-USB'. |
diff --git a/drivers/media/dvb/ttusb-budget/dvb-ttusb-budget.c b/drivers/media/dvb/ttusb-budget/dvb-ttusb-budget.c index cd19ba628101..71581303b0ea 100644 --- a/drivers/media/dvb/ttusb-budget/dvb-ttusb-budget.c +++ b/drivers/media/dvb/ttusb-budget/dvb-ttusb-budget.c | |||
| @@ -30,6 +30,7 @@ | |||
| 30 | #include "tda1004x.h" | 30 | #include "tda1004x.h" |
| 31 | #include "stv0299.h" | 31 | #include "stv0299.h" |
| 32 | #include "tda8083.h" | 32 | #include "tda8083.h" |
| 33 | #include "lnbp21.h" | ||
| 33 | 34 | ||
| 34 | #include <linux/dvb/frontend.h> | 35 | #include <linux/dvb/frontend.h> |
| 35 | #include <linux/dvb/dmx.h> | 36 | #include <linux/dvb/dmx.h> |
| @@ -486,31 +487,6 @@ static int ttusb_send_diseqc(struct dvb_frontend* fe, | |||
| 486 | } | 487 | } |
| 487 | #endif | 488 | #endif |
| 488 | 489 | ||
| 489 | static int lnbp21_set_voltage(struct dvb_frontend* fe, fe_sec_voltage_t voltage) | ||
| 490 | { | ||
| 491 | struct ttusb* ttusb = (struct ttusb*) fe->dvb->priv; | ||
| 492 | int ret; | ||
| 493 | u8 data[1]; | ||
| 494 | struct i2c_msg msg = { .addr = 0x08, .flags = 0, .buf = data, .len = sizeof(data) }; | ||
| 495 | |||
| 496 | switch(voltage) { | ||
| 497 | case SEC_VOLTAGE_OFF: | ||
| 498 | data[0] = 0x00; | ||
| 499 | break; | ||
| 500 | case SEC_VOLTAGE_13: | ||
| 501 | data[0] = 0x44; | ||
| 502 | break; | ||
| 503 | case SEC_VOLTAGE_18: | ||
| 504 | data[0] = 0x4c; | ||
| 505 | break; | ||
| 506 | default: | ||
| 507 | return -EINVAL; | ||
| 508 | }; | ||
| 509 | |||
| 510 | ret = i2c_transfer(&ttusb->i2c_adap, &msg, 1); | ||
| 511 | return (ret != 1) ? -EIO : 0; | ||
| 512 | } | ||
| 513 | |||
| 514 | static int ttusb_update_lnb(struct ttusb *ttusb) | 490 | static int ttusb_update_lnb(struct ttusb *ttusb) |
| 515 | { | 491 | { |
| 516 | u8 b[] = { 0xaa, ++ttusb->c, 0x16, 5, /*power: */ 1, | 492 | u8 b[] = { 0xaa, ++ttusb->c, 0x16, 5, /*power: */ 1, |
| @@ -1415,7 +1391,7 @@ static void frontend_init(struct ttusb* ttusb) | |||
| 1415 | 1391 | ||
| 1416 | if(ttusb->revision == TTUSB_REV_2_2) { // ALPS BSBE1 | 1392 | if(ttusb->revision == TTUSB_REV_2_2) { // ALPS BSBE1 |
| 1417 | alps_stv0299_config.inittab = alps_bsbe1_inittab; | 1393 | alps_stv0299_config.inittab = alps_bsbe1_inittab; |
| 1418 | ttusb->fe->ops->set_voltage = lnbp21_set_voltage; | 1394 | lnbp21_attach(ttusb->fe, &ttusb->i2c_adap, 0, 0); |
| 1419 | } else { // ALPS BSRU6 | 1395 | } else { // ALPS BSRU6 |
| 1420 | ttusb->fe->ops->set_voltage = ttusb_set_voltage; | 1396 | ttusb->fe->ops->set_voltage = ttusb_set_voltage; |
| 1421 | } | 1397 | } |
