diff options
author | Michael Krufky <mkrufky@linuxtv.org> | 2007-12-29 21:46:01 -0300 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@infradead.org> | 2008-01-25 19:04:34 -0200 |
commit | 33f25b42753f464c5927e8b828352333780c14bd (patch) | |
tree | ccd92d6a0e2996e6f553d6def330ec77fb81593b | |
parent | 0be4375410f1ecc917f3c0caf8f98908d357c93f (diff) |
V4L/DVB (6957): tda18271: fail table lookups if frequency is out of range
Signed-off-by: Michael Krufky <mkrufky@linuxtv.org>
Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
-rw-r--r-- | drivers/media/dvb/frontends/tda18271-fe.c | 5 | ||||
-rw-r--r-- | drivers/media/dvb/frontends/tda18271-tables.c | 28 |
2 files changed, 20 insertions, 13 deletions
diff --git a/drivers/media/dvb/frontends/tda18271-fe.c b/drivers/media/dvb/frontends/tda18271-fe.c index d5807c98afc..739ecfe0438 100644 --- a/drivers/media/dvb/frontends/tda18271-fe.c +++ b/drivers/media/dvb/frontends/tda18271-fe.c @@ -502,11 +502,6 @@ static int tda18271_calc_rf_cal(struct dvb_frontend *fe, u32 *freq) if (ret < 0) goto fail; - /* VHF_Low band only */ - if (0 == val) { - ret = -ERANGE; - goto fail; - } regs[R_EB14] = val; fail: return ret; diff --git a/drivers/media/dvb/frontends/tda18271-tables.c b/drivers/media/dvb/frontends/tda18271-tables.c index e10a93bf12c..f8202c40b04 100644 --- a/drivers/media/dvb/frontends/tda18271-tables.c +++ b/drivers/media/dvb/frontends/tda18271-tables.c @@ -273,6 +273,7 @@ int tda18271_lookup_pll_map(enum tda18271_map_type map_type, struct tda18271_pll_map *map = NULL; unsigned int i = 0; char *map_name; + int ret = 0; switch (map_type) { case MAIN_PLL: @@ -291,12 +292,17 @@ int tda18271_lookup_pll_map(enum tda18271_map_type map_type, if (!map) { tda_warn("%s map is not set!\n", map_name); - return -EINVAL; + ret = -EINVAL; + goto fail; } while ((map[i].lomax * 1000) < *freq) { - if (map[i + 1].lomax == 0) + if (map[i].lomax == 0) { + tda_map("%s: frequency (%d) out of range\n", + map_name, *freq); + ret = -ERANGE; break; + } i++; } *post_div = map[i].pd; @@ -304,8 +310,8 @@ int tda18271_lookup_pll_map(enum tda18271_map_type map_type, tda_map("%s: post div = 0x%02x, div = 0x%02x\n", map_name, *post_div, *div); - - return 0; +fail: + return ret; } int tda18271_lookup_map(enum tda18271_map_type map_type, u32 *freq, u8 *val) @@ -313,6 +319,7 @@ int tda18271_lookup_map(enum tda18271_map_type map_type, u32 *freq, u8 *val) struct tda18271_map *map = NULL; unsigned int i = 0; char *map_name; + int ret = 0; switch (map_type) { case BP_FILTER: @@ -347,19 +354,24 @@ int tda18271_lookup_map(enum tda18271_map_type map_type, u32 *freq, u8 *val) if (!map) { tda_warn("%s map is not set!\n", map_name); - return -EINVAL; + ret = -EINVAL; + goto fail; } while ((map[i].rfmax * 1000) < *freq) { - if (map[i + 1].rfmax == 0) + if (map[i].rfmax == 0) { + tda_map("%s: frequency (%d) out of range\n", + map_name, *freq); + ret = -ERANGE; break; + } i++; } *val = map[i].val; tda_map("%s: 0x%02x\n", map_name, *val); - - return 0; +fail: + return ret; } /* |