From: Eric Anholt Date: Tue, 10 May 2016 00:28:18 +0000 (-0700) Subject: clk: bcm2835: Mark GPIO clocks enabled at boot as critical. X-Git-Tag: archive/raspbian/4.9.13-1+rpi1~9^2~181 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=08d826625dd8a1e51414787f4e2a5c7ba0cf1a80;p=linux-4.9.git clk: bcm2835: Mark GPIO clocks enabled at boot as critical. These divide off of PLLD_PER and are used for the ethernet and wifi PHYs source PLLs. Neither of them is currently represented by a phy device that would grab the clock for us. This keeps other drivers from killing the networking PHYs when they disable their own clocks and trigger PLLD_PER's refcount going to 0. v2: Skip marking as critical if they aren't on at boot. Signed-off-by: Eric Anholt --- diff --git a/drivers/clk/bcm/clk-bcm2835.c b/drivers/clk/bcm/clk-bcm2835.c index 3bbd2a58db47..7040c6426e35 100644 --- a/drivers/clk/bcm/clk-bcm2835.c +++ b/drivers/clk/bcm/clk-bcm2835.c @@ -1262,6 +1262,15 @@ static struct clk_hw *bcm2835_register_clock(struct bcm2835_cprman *cprman, init.name = data->name; init.flags = data->flags | CLK_IGNORE_UNUSED; + /* + * Some GPIO clocks for ethernet/wifi PLLs are marked as + * critical (since some platforms use them), but if the + * firmware didn't have them turned on then they clearly + * aren't actually critical. + */ + if ((cprman_read(cprman, data->ctl_reg) & CM_ENABLE) == 0) + init.flags &= ~CLK_IS_CRITICAL; + if (data->is_vpu_clock) { init.ops = &bcm2835_vpu_clock_clk_ops; } else {