aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/drivers/media/dvb-core
diff options
context:
space:
mode:
authorMauro Carvalho Chehab <mchehab+samsung@kernel.org>2018-07-05 18:59:35 -0400
committerMauro Carvalho Chehab <mchehab+samsung@kernel.org>2018-08-02 16:14:50 -0400
commita3f90c75b833caeff123499e13e0e31cbecf7d5b (patch)
tree556af7a0bba42d51bf70c0d3e151bd440416f63b /drivers/media/dvb-core
parentmedia: dvb_ca_en50221: off by one in dvb_ca_en50221_io_do_ioctl() (diff)
downloadwireguard-linux-a3f90c75b833caeff123499e13e0e31cbecf7d5b.tar.xz
wireguard-linux-a3f90c75b833caeff123499e13e0e31cbecf7d5b.zip
media: dvb: convert tuner_info frequencies to Hz
Right now, satellite tuner drivers specify frequencies in kHz, while terrestrial/cable ones specify in Hz. That's confusing for developers. However, the main problem is that universal tuners capable of handling both satellite and non-satelite delivery systems are appearing. We end by needing to hack the drivers in order to support such hybrid tuners. So, convert everything to specify tuner frequencies in Hz. Plese notice that a similar patch is also needed for frontends. Tested-by: Katsuhiro Suzuki <suzuki.katsuhiro@socionext.com> Acked-by: Michael Büsch <m@bues.ch> Signed-off-by: Mauro Carvalho Chehab <mchehab+samsung@kernel.org>
Diffstat (limited to 'drivers/media/dvb-core')
-rw-r--r--drivers/media/dvb-core/dvb_frontend.c25
1 files changed, 21 insertions, 4 deletions
diff --git a/drivers/media/dvb-core/dvb_frontend.c b/drivers/media/dvb-core/dvb_frontend.c
index ce25aef39008..75e95b56f8b3 100644
--- a/drivers/media/dvb-core/dvb_frontend.c
+++ b/drivers/media/dvb-core/dvb_frontend.c
@@ -896,14 +896,31 @@ static int dvb_frontend_start(struct dvb_frontend *fe)
static void dvb_frontend_get_frequency_limits(struct dvb_frontend *fe,
u32 *freq_min, u32 *freq_max)
{
- *freq_min = max(fe->ops.info.frequency_min, fe->ops.tuner_ops.info.frequency_min);
+ struct dtv_frontend_properties *c = &fe->dtv_property_cache;
+ __u32 tuner_min = fe->ops.tuner_ops.info.frequency_min_hz;
+ __u32 tuner_max = fe->ops.tuner_ops.info.frequency_max_hz;
+
+ /* If the standard is for satellite, convert frequencies to kHz */
+ switch (c->delivery_system) {
+ case SYS_DVBS:
+ case SYS_DVBS2:
+ case SYS_TURBO:
+ case SYS_ISDBS:
+ tuner_max /= kHz;
+ tuner_min /= kHz;
+ break;
+ default:
+ break;
+ }
+
+ *freq_min = max(fe->ops.info.frequency_min, tuner_min);
if (fe->ops.info.frequency_max == 0)
- *freq_max = fe->ops.tuner_ops.info.frequency_max;
- else if (fe->ops.tuner_ops.info.frequency_max == 0)
+ *freq_max = tuner_max;
+ else if (tuner_max == 0)
*freq_max = fe->ops.info.frequency_max;
else
- *freq_max = min(fe->ops.info.frequency_max, fe->ops.tuner_ops.info.frequency_max);
+ *freq_max = min(fe->ops.info.frequency_max, tuner_max);
if (*freq_min == 0 || *freq_max == 0)
dev_warn(fe->dvb->device,