clk: tegra: bpmp: Don't crash when a clock fails to register
authorMikko Perttunen <mperttunen@nvidia.com>
Fri, 29 Jun 2018 14:38:14 +0000 (17:38 +0300)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 26 Sep 2018 06:38:13 +0000 (08:38 +0200)
[ Upstream commit f7b3182232c82bb9769e2d5471d702bae2972d2b ]

When registering clocks, we just skip any that fail to register
(leaving a NULL hole in the clock table). However, our of_xlate
function still tries to dereference each entry while looking for
the clock with the requested id, causing a crash if any clocks
failed to register. Add a check to of_xlate to skip any NULL
clocks.

Signed-off-by: Mikko Perttunen <mperttunen@nvidia.com>
Acked-by: Jon Hunter <jonathanh@nvidia.com>
Signed-off-by: Stephen Boyd <sboyd@kernel.org>
Signed-off-by: Sasha Levin <alexander.levin@microsoft.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/clk/tegra/clk-bpmp.c

index 638ace64033b92a54b930c4bdf1be65550241099..6c933b0e29a3bfb384a9fb24c369d0ff1ef7fbd4 100644 (file)
@@ -581,9 +581,15 @@ static struct clk_hw *tegra_bpmp_clk_of_xlate(struct of_phandle_args *clkspec,
        unsigned int id = clkspec->args[0], i;
        struct tegra_bpmp *bpmp = data;
 
-       for (i = 0; i < bpmp->num_clocks; i++)
-               if (bpmp->clocks[i]->id == id)
-                       return &bpmp->clocks[i]->hw;
+       for (i = 0; i < bpmp->num_clocks; i++) {
+               struct tegra_bpmp_clk *clk = bpmp->clocks[i];
+
+               if (!clk)
+                       continue;
+
+               if (clk->id == id)
+                       return &clk->hw;
+       }
 
        return NULL;
 }