Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

V4L/DVB: dvb: l64781.ko broken with gcc 4.5

I'm trying to fix it on the GCC side (PR43007), but the module is
quite stupid in using ULL constants to operate on u32 values:

static int apply_frontend_param (struct dvb_frontend* fe, struct
dvb_frontend_parameters *param)
{
...
static const u32 ppm = 8000;
u32 spi_bias;
...

spi_bias *= 1000ULL;
spi_bias /= 1000ULL + ppm/1000;

which causes current GCC 4.5 to emit calls to __udivdi3 for i?86 again.

This patch fixes this issue.

Signed-off-by: Richard Guenther <rguenther@suse.de>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
CC: stable@kernel.org
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>

authored by

Richard Guenther and committed by
Mauro Carvalho Chehab
c1db53b3 f8b55f25

+2 -2
+2 -2
drivers/media/dvb/frontends/l64781.c
··· 192 192 spi_bias *= qam_tab[p->constellation]; 193 193 spi_bias /= p->code_rate_HP + 1; 194 194 spi_bias /= (guard_tab[p->guard_interval] + 32); 195 - spi_bias *= 1000ULL; 196 - spi_bias /= 1000ULL + ppm/1000; 195 + spi_bias *= 1000; 196 + spi_bias /= 1000 + ppm/1000; 197 197 spi_bias *= p->code_rate_HP; 198 198 199 199 val0x04 = (p->transmission_mode << 2) | p->guard_interval;