| From be833cd69cac398978ea14f86a0c2e05839206fc Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Thu, 6 Sep 2018 15:49:05 -0700 |
| Subject: soc: qcom: geni: Don't ignore clk_round_rate() errors in |
| geni_se_clk_tbl_get() |
| |
| From: Douglas Anderson <dianders@chromium.org> |
| |
| [ Upstream commit e11bbcedecae85ce60a5d99ea03528c2d6f867e0 ] |
| |
| The function clk_round_rate() is defined to return a "long", not an |
| "unsigned long". That's because it might return a negative error |
| code. Change the call in geni_se_clk_tbl_get() to check for errors. |
| |
| While we're at it, get rid of a useless init of "freq". |
| |
| NOTE: overall the idea that we should iterate over clk_round_rate() to |
| try to reconstruct a table already present in the clock driver is |
| questionable. Specifically: |
| - This method relies on "clk_round_rate()" rounding up. |
| - This method only works if the table is sorted and has no duplicates. |
| ...this patch doesn't try to fix those problems, it just makes the |
| error handling more correct. |
| |
| Fixes: eddac5af0654 ("soc: qcom: Add GENI based QUP Wrapper driver") |
| Signed-off-by: Douglas Anderson <dianders@chromium.org> |
| Reviewed-by: Matthias Kaehlcke <mka@chromium.org> |
| Signed-off-by: Andy Gross <andy.gross@linaro.org> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/soc/qcom/qcom-geni-se.c | 4 ++-- |
| 1 file changed, 2 insertions(+), 2 deletions(-) |
| |
| diff --git a/drivers/soc/qcom/qcom-geni-se.c b/drivers/soc/qcom/qcom-geni-se.c |
| index feed3db21c108..1b19b8428c4ac 100644 |
| --- a/drivers/soc/qcom/qcom-geni-se.c |
| +++ b/drivers/soc/qcom/qcom-geni-se.c |
| @@ -513,7 +513,7 @@ EXPORT_SYMBOL(geni_se_resources_on); |
| */ |
| int geni_se_clk_tbl_get(struct geni_se *se, unsigned long **tbl) |
| { |
| - unsigned long freq = 0; |
| + long freq = 0; |
| int i; |
| |
| if (se->clk_perf_tbl) { |
| @@ -529,7 +529,7 @@ int geni_se_clk_tbl_get(struct geni_se *se, unsigned long **tbl) |
| |
| for (i = 0; i < MAX_CLK_PERF_LEVEL; i++) { |
| freq = clk_round_rate(se->clk, freq + 1); |
| - if (!freq || freq == se->clk_perf_tbl[i - 1]) |
| + if (freq <= 0 || freq == se->clk_perf_tbl[i - 1]) |
| break; |
| se->clk_perf_tbl[i] = freq; |
| } |
| -- |
| 2.20.1 |
| |