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)
committerpopcornmix <popcornmix@gmail.com>
Mon, 13 May 2019 23:07:52 +0000 (00:07 +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 12dd417..a142253 100644 (file)
@@ -1454,6 +1454,15 @@ static struct clk_hw *bcm2835_register_clock(struct bcm2835_cprman *cprman,
        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;
+
+       /*
         * Pass the CLK_SET_RATE_PARENT flag if we are allowed to propagate
         * rate changes on at least of the parents.
         */