OMAPDSS: DISPC: add check for scaling limits
authorTomi Valkeinen <tomi.valkeinen@ti.com>
Tue, 17 Mar 2015 13:31:10 +0000 (15:31 +0200)
committerTomi Valkeinen <tomi.valkeinen@ti.com>
Wed, 17 Jun 2015 12:38:44 +0000 (15:38 +0300)
On OMAP3/AM43xx some scaling factors cause underflows/synclosts. After
studying this, I found that sometimes the driver uses three-tap scaling
with downscaling factor smaller than x0.5. This causes issues, as x0.5
is the limit for three-tap scaling.

The driver has FEAT_PARAM_DOWNSCALE parameter, but that seems to be for
five-tap scaling, which allows scaling down to x0.25.

This patch adds checks for both horizontal and vertical scaling. For
horizontal the HW always uses 5 taps, so the limit is x0.25.

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

index cc61513afdb4e1c5a8b256abb7c70dd4a9124526..ddce8fcfc5c1dcebfb4d144476ce5cb9ef732160 100644 (file)
@@ -2326,6 +2326,21 @@ again:
                error = (error || in_width > maxsinglelinewidth * 2 ||
                        (in_width > maxsinglelinewidth && *five_taps) ||
                        !*core_clk || *core_clk > dispc_core_clk_rate());
+
+               if (!error) {
+                       /* verify that we're inside the limits of scaler */
+                       if (in_width / 4 > out_width)
+                                       error = 1;
+
+                       if (*five_taps) {
+                               if (in_height / 4 > out_height)
+                                       error = 1;
+                       } else {
+                               if (in_height / 2 > out_height)
+                                       error = 1;
+                       }
+               }
+
                if (error) {
                        if (*decim_x == *decim_y) {
                                *decim_x = min_factor;