Patch "clk: bcm2835: Skip PLLC clocks when deciding on a new clock parent" has been added to the 4.8-stable tree
Subsystems (4)
This is a note to let you know that I've just added the patch titled
clk: bcm2835: Skip PLLC clocks when deciding on a new clock parent
to the 4.8-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
clk-bcm2835-skip-pllc-clocks-when-deciding-on-a-new-clock-parent.patch
and it can be found in the queue-4.8 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
67615c588a059b731df9d019edc3c561d8006ec9Mon Sep 17 00:00:00 2001
From: Eric Anholt <[email protected]>
Date: Wed, 1 Jun 2016 12:05:36 -0700
Subject: clk: bcm2835: Skip PLLC clocks when deciding on a new clock parent
From: Eric Anholt <[email protected]>
commit 67615c588a059b731df9d019edc3c561d8006ec9 upstream.
If the firmware had set up a clock to source from PLLC, go along with it. But if we're looking for a new parent, we don't want to switch it to PLLC because the firmware will force PLLC (and thus the AXI bus clock) to different frequencies during over-temp/under-voltage, without notification to Linux.
On my system, this moves the Linux-enabled HDMI state machine and DSI1 escape clock over to plld_per from pllc_per. EMMC still ends up on pllc_per, because the firmware had set it up to use that.
--- drivers/clk/bcm/clk-bcm2835.c | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+)
drivers/clk/bcm/clk-bcm2835.c +23 -0
@@ -1006,16 +1006,28 @@ static int bcm2835_clock_set_rate(structreturn 0 ; } +static bool +bcm2835_clk_is_pllc (struct clk_hw *hw) +{ +if (!hw) +return false; + +return strncmp (clk_hw_get_name (hw),"pllc" ,4 ) ==0 ; +} +static int bcm2835_clock_determine_rate (struct clk_hw *hw,struct clk_rate_request *req) {struct bcm2835_clock *clock =bcm2835_clock_from_hw (hw);struct clk_hw *parent, *best_parent =NULL ; +bool current_parent_is_pllc;unsigned long rate, best_rate =0 ;unsigned long prate, best_prate =0 ;size_t i;u32 div; + current_parent_is_pllc =bcm2835_clk_is_pllc (clk_hw_get_parent (hw)); +/* * Select parent clock that results in the closest but lower rate */
@@ -1023,6 +1035,17 @@ static int bcm2835_clock_determine_rate( parent =clk_hw_get_parent_by_index (hw, i);if (!parent)continue ; + +/* +* Don't choose a PLLC-derived clock as our parent +* unless it had been manually set that way. PLLC's +* frequency gets adjusted by the firmware due to +* over-temp or under-voltage conditions, without +* prior notification to our clock consumer. +*/ +if (bcm2835_clk_is_pllc (parent) && !current_parent_is_pllc) +continue ; + prate =clk_hw_get_rate (parent); div =bcm2835_clock_choose_div (hw, req->rate, prate, true); rate =bcm2835_clock_rate_from_divisor (clock, prate, div);
Patches currently in stable-queue which might be from [email protected] are
queue-4.8/drm-vc4-fix-races-when-the-cs-reads-from-render-targets.patch queue-4.8/clk-bcm2835-skip-pllc-clocks-when-deciding-on-a-new-clock-parent.patch