| From 96e6970275651af69c297b390da5e944a8fb132c Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Thu, 23 Jul 2020 18:02:27 +0100 |
| Subject: video: fbdev: vga16fb: fix setting of pixclock because a |
| pass-by-value error |
| |
| From: Colin Ian King <colin.king@canonical.com> |
| |
| [ Upstream commit c72fab81ceaa54408b827a2f0486d9a0f4be34cf ] |
| |
| The pixclock is being set locally because it is being passed as a |
| pass-by-value argument rather than pass-by-reference, so the computed |
| pixclock is never being set in var->pixclock. Fix this by passing |
| by reference. |
| |
| [This dates back to 2002, I found the offending commit from the git |
| history git://git.kernel.org/pub/scm/linux/kernel/git/tglx/history.git ] |
| |
| Addresses-Coverity: ("Unused value") |
| Signed-off-by: Colin Ian King <colin.king@canonical.com> |
| Cc: Daniel Vetter <daniel.vetter@ffwll.ch> |
| Cc: Jani Nikula <jani.nikula@intel.com> |
| [b.zolnierkie: minor patch summary fixup] |
| [b.zolnierkie: removed "Fixes:" tag (not in upstream tree)] |
| Signed-off-by: Bartlomiej Zolnierkiewicz <b.zolnierkie@samsung.com> |
| Link: https://patchwork.freedesktop.org/patch/msgid/20200723170227.996229-1-colin.king@canonical.com |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/video/fbdev/vga16fb.c | 14 +++++++------- |
| 1 file changed, 7 insertions(+), 7 deletions(-) |
| |
| diff --git a/drivers/video/fbdev/vga16fb.c b/drivers/video/fbdev/vga16fb.c |
| index 4b83109202b1c..3c4d20618de4c 100644 |
| --- a/drivers/video/fbdev/vga16fb.c |
| +++ b/drivers/video/fbdev/vga16fb.c |
| @@ -243,7 +243,7 @@ static void vga16fb_update_fix(struct fb_info *info) |
| } |
| |
| static void vga16fb_clock_chip(struct vga16fb_par *par, |
| - unsigned int pixclock, |
| + unsigned int *pixclock, |
| const struct fb_info *info, |
| int mul, int div) |
| { |
| @@ -259,14 +259,14 @@ static void vga16fb_clock_chip(struct vga16fb_par *par, |
| { 0 /* bad */, 0x00, 0x00}}; |
| int err; |
| |
| - pixclock = (pixclock * mul) / div; |
| + *pixclock = (*pixclock * mul) / div; |
| best = vgaclocks; |
| - err = pixclock - best->pixclock; |
| + err = *pixclock - best->pixclock; |
| if (err < 0) err = -err; |
| for (ptr = vgaclocks + 1; ptr->pixclock; ptr++) { |
| int tmp; |
| |
| - tmp = pixclock - ptr->pixclock; |
| + tmp = *pixclock - ptr->pixclock; |
| if (tmp < 0) tmp = -tmp; |
| if (tmp < err) { |
| err = tmp; |
| @@ -275,7 +275,7 @@ static void vga16fb_clock_chip(struct vga16fb_par *par, |
| } |
| par->misc |= best->misc; |
| par->clkdiv = best->seq_clock_mode; |
| - pixclock = (best->pixclock * div) / mul; |
| + *pixclock = (best->pixclock * div) / mul; |
| } |
| |
| #define FAIL(X) return -EINVAL |
| @@ -497,10 +497,10 @@ static int vga16fb_check_var(struct fb_var_screeninfo *var, |
| |
| if (mode & MODE_8BPP) |
| /* pixel clock == vga clock / 2 */ |
| - vga16fb_clock_chip(par, var->pixclock, info, 1, 2); |
| + vga16fb_clock_chip(par, &var->pixclock, info, 1, 2); |
| else |
| /* pixel clock == vga clock */ |
| - vga16fb_clock_chip(par, var->pixclock, info, 1, 1); |
| + vga16fb_clock_chip(par, &var->pixclock, info, 1, 1); |
| |
| var->red.offset = var->green.offset = var->blue.offset = |
| var->transp.offset = 0; |
| -- |
| 2.25.1 |
| |