clk: bcm2835: Mark GPIO clocks enabled at boot as critical.
authorEric Anholt <eric@anholt.net>
Tue, 10 May 2016 00:28:18 +0000 (17:28 -0700)
committerRaspbian kernel package updater <root@raspbian.org>
Sat, 31 Mar 2018 14:44:49 +0000 (15:44 +0100)
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 <eric@anholt.net>
drivers/clk/bcm/clk-bcm2835.c

index 2acaa77ad482a99f28ea64ea43c891501125304c..d13cbbf5bbe06314bfdf103ff85d5cd73cbf7f7a 100644 (file)
@@ -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 {