]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
media: ccs-pll: Better validate VT PLL branch
authorSakari Ailus <sakari.ailus@linux.intel.com>
Wed, 26 Feb 2025 12:27:58 +0000 (14:27 +0200)
committerHans Verkuil <hverkuil@xs4all.nl>
Fri, 25 Apr 2025 08:15:18 +0000 (10:15 +0200)
Check that the VT PLL dividers are actually found, don't trust they always
are even though they should be.

Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: Hans Verkuil <hverkuil@xs4all.nl>
drivers/media/i2c/ccs-pll.c

index f4be4e9f6777ee07480d09691384f22585421ba4..8de8158a413bcbdfb28d0225bc7d5eb3a7621f47 100644 (file)
@@ -449,7 +449,7 @@ static int ccs_pll_calculate_vt_tree(struct device *dev,
        return -EINVAL;
 }
 
-static void
+static int
 ccs_pll_calculate_vt(struct device *dev, const struct ccs_pll_limits *lim,
                     const struct ccs_pll_branch_limits_bk *op_lim_bk,
                     struct ccs_pll *pll, struct ccs_pll_branch_fr *pll_fr,
@@ -572,6 +572,8 @@ ccs_pll_calculate_vt(struct device *dev, const struct ccs_pll_limits *lim,
                if (best_pix_div < SHRT_MAX >> 1)
                        break;
        }
+       if (best_pix_div == SHRT_MAX >> 1)
+               return -EINVAL;
 
        pll->vt_bk.sys_clk_div = DIV_ROUND_UP(vt_div, best_pix_div);
        pll->vt_bk.pix_clk_div = best_pix_div;
@@ -584,6 +586,8 @@ ccs_pll_calculate_vt(struct device *dev, const struct ccs_pll_limits *lim,
 out_calc_pixel_rate:
        pll->pixel_rate_pixel_array =
                pll->vt_bk.pix_clk_freq_hz * pll->vt_lanes;
+
+       return 0;
 }
 
 /*
@@ -863,8 +867,10 @@ int ccs_pll_calculate(struct device *dev, const struct ccs_pll_limits *lim,
                if (pll->flags & CCS_PLL_FLAG_DUAL_PLL)
                        break;
 
-               ccs_pll_calculate_vt(dev, lim, op_lim_bk, pll, op_pll_fr,
-                                    op_pll_bk, cphy, phy_const);
+               rval = ccs_pll_calculate_vt(dev, lim, op_lim_bk, pll, op_pll_fr,
+                                           op_pll_bk, cphy, phy_const);
+               if (rval)
+                       continue;
 
                rval = check_bk_bounds(dev, lim, pll, PLL_VT);
                if (rval)