V4L/DVB (13107): tda18271: fix overflow in FM radio frequency calculation
authorMichael Krufky <mkrufky@kernellabs.com>
Sun, 27 Sep 2009 17:05:12 +0000 (14:05 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Sat, 7 Nov 2009 14:55:04 +0000 (12:55 -0200)
Multiplication by 62500 causes an overflow in the 32 bit freq variable,
which is later divided by 1000 when using FM radio.

This patch prevents the overflow by scaling the frequency value correctly
upfront.  Thanks to Henk Vergonet for spotting the problem and providing
a preliminary patch, which this changeset was based upon.

Cc: Henk Vergonet <Henk.Vergonet@gmail.com>
Signed-off-by: Michael Krufky <mkrufky@kernellabs.com>
CC: stable@kernel.org
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
drivers/media/common/tuners/tda18271-fe.c

index 64595112000dc2be16fabed97d0e41c38a2618b7..cccaf164a8f93a2ae9a3ac9340f80178699a43ba 100644 (file)
@@ -1000,12 +1000,12 @@ static int tda18271_set_analog_params(struct dvb_frontend *fe,
        struct tda18271_std_map_item *map;
        char *mode;
        int ret;
-       u32 freq = params->frequency * 62500;
+       u32 freq = params->frequency * 125 *
+               ((params->mode == V4L2_TUNER_RADIO) ? 1 : 1000) / 2;
 
        priv->mode = TDA18271_ANALOG;
 
        if (params->mode == V4L2_TUNER_RADIO) {
-               freq = freq / 1000;
                map = &std_map->fm_radio;
                mode = "fm";
        } else if (params->std & V4L2_STD_MN) {