OMAPDSS: DISPC: check if scaling setup failed
authorTomi Valkeinen <tomi.valkeinen@ti.com>
Fri, 10 Apr 2015 09:48:37 +0000 (12:48 +0300)
committerTomi Valkeinen <tomi.valkeinen@ti.com>
Wed, 17 Jun 2015 12:44:28 +0000 (15:44 +0300)
The DISPC's scaling code seems to presume that decimation always
succeeds, and so we always do find a suitable downscaling setup.
However, this is not the case, and the algorithm can fail.

When that happens, the code just proceeds with wrong results, causing
issues later.

Add the necessary checks to bail out if the scaling algorithm failed.

Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ti.com>
drivers/video/fbdev/omap2/dss/dispc.c

index 2db1c986e989f9f56fb62712c16a1ab9ae3a9972..0bdb587cb48c464b8393c95a5f061abc2fe49fb8 100644 (file)
@@ -2279,6 +2279,11 @@ static int dispc_ovl_calc_scaling_24xx(unsigned long pclk, unsigned long lclk,
                }
        } while (*decim_x <= *x_predecim && *decim_y <= *y_predecim && error);
 
+       if (error) {
+               DSSERR("failed to find scaling settings\n");
+               return -EINVAL;
+       }
+
        if (in_width > maxsinglelinewidth) {
                DSSERR("Cannot scale max input width exceeded");
                return -EINVAL;
@@ -2356,6 +2361,11 @@ again:
                }
        } while (*decim_x <= *x_predecim && *decim_y <= *y_predecim && error);
 
+       if (error) {
+               DSSERR("failed to find scaling settings\n");
+               return -EINVAL;
+       }
+
        if (check_horiz_timing_omap3(pclk, lclk, mgr_timings, pos_x, in_width,
                                in_height, out_width, out_height, *five_taps)) {
                        DSSERR("horizontal timing too tight\n");