* [PATCH 1/2] clk: bcm2835: Mark the VPU clock as critical @ 2016-04-26 19:39 Eric Anholt 2016-04-26 19:39 ` [PATCH 2/2] clk: bcm2835: Skip PLLC clocks when deciding on a new clock parent Eric Anholt 0 siblings, 1 reply; 7+ messages in thread From: Eric Anholt @ 2016-04-26 19:39 UTC (permalink / raw) To: linux-arm-kernel The VPU clock is also the clock for our AXI bus, so we really can't disable it. This might have happened during boot if, for example, uart1 (aux_uart clock) probed and was then disabled before the other consumers of the VPU clock had probed. Signed-off-by: Eric Anholt <eric@anholt.net> --- drivers/clk/bcm/clk-bcm2835.c | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/clk/bcm/clk-bcm2835.c b/drivers/clk/bcm/clk-bcm2835.c index 5a7e3eca5d12..14f3066194ac 100644 --- a/drivers/clk/bcm/clk-bcm2835.c +++ b/drivers/clk/bcm/clk-bcm2835.c @@ -1267,6 +1267,7 @@ static struct clk *bcm2835_register_clock(struct bcm2835_cprman *cprman, if (data->is_vpu_clock) { init.ops = &bcm2835_vpu_clock_clk_ops; + init.flags |= CLK_IS_CRITICAL; } else { init.ops = &bcm2835_clock_clk_ops; init.flags |= CLK_SET_RATE_GATE | CLK_SET_PARENT_GATE; -- 2.8.0.rc3 ^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH 2/2] clk: bcm2835: Skip PLLC clocks when deciding on a new clock parent 2016-04-26 19:39 [PATCH 1/2] clk: bcm2835: Mark the VPU clock as critical Eric Anholt @ 2016-04-26 19:39 ` Eric Anholt 2016-04-30 9:28 ` Martin Sperl 0 siblings, 1 reply; 7+ messages in thread From: Eric Anholt @ 2016-04-26 19:39 UTC (permalink / raw) To: linux-arm-kernel 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. Signed-off-by: Eric Anholt <eric@anholt.net> Fixes: 41691b8862e2 ("clk: bcm2835: Add support for programming the audio domain clocks") --- drivers/clk/bcm/clk-bcm2835.c | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/drivers/clk/bcm/clk-bcm2835.c b/drivers/clk/bcm/clk-bcm2835.c index 14f3066194ac..870c5745d649 100644 --- a/drivers/clk/bcm/clk-bcm2835.c +++ b/drivers/clk/bcm/clk-bcm2835.c @@ -1035,16 +1035,28 @@ static int bcm2835_clock_set_rate(struct clk_hw *hw, return 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 */ @@ -1052,6 +1064,17 @@ static int bcm2835_clock_determine_rate(struct clk_hw *hw, 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); -- 2.8.0.rc3 ^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH 2/2] clk: bcm2835: Skip PLLC clocks when deciding on a new clock parent 2016-04-26 19:39 ` [PATCH 2/2] clk: bcm2835: Skip PLLC clocks when deciding on a new clock parent Eric Anholt @ 2016-04-30 9:28 ` Martin Sperl 2016-05-02 8:54 ` Martin Sperl 2016-05-02 15:29 ` Eric Anholt 0 siblings, 2 replies; 7+ messages in thread From: Martin Sperl @ 2016-04-30 9:28 UTC (permalink / raw) To: linux-arm-kernel > On 26.04.2016, at 21:39, Eric Anholt <eric@anholt.net> wrote: > > 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. > > Signed-off-by: Eric Anholt <eric@anholt.net> > Fixes: 41691b8862e2 ("clk: bcm2835: Add support for programming the audio domain clocks") > ? I guess this patch looks to me as if it is a policy inside the kernel, which is AFAIK frowned upon. I am looking into making "assigned-clock-parents? inside the dt work with the driver. Could look something like this: i2s: i2s at 7e203000 { assigned-clock-parents = <&cprman BCM2835_PLLD_PER>, <&clk_osc>; assigned-clocks = <&cprman BCM2835_CLOCK_PCM>, <&cprman BCM2835_CLOCK_PCM>; }; (not sure if that works really - the same clock in assigned-clocks looks suspicious) This would move the policy out of the kernel into the device-tree, which - i guess is a better solution. Martin ^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH 2/2] clk: bcm2835: Skip PLLC clocks when deciding on a new clock parent 2016-04-30 9:28 ` Martin Sperl @ 2016-05-02 8:54 ` Martin Sperl 2016-05-02 15:29 ` Eric Anholt 1 sibling, 0 replies; 7+ messages in thread From: Martin Sperl @ 2016-05-02 8:54 UTC (permalink / raw) To: linux-arm-kernel On 30.04.2016 11:28, Martin Sperl wrote: >> On 26.04.2016, at 21:39, Eric Anholt <eric@anholt.net> wrote: >> >> 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. >> >> Signed-off-by: Eric Anholt <eric@anholt.net> >> Fixes: 41691b8862e2 ("clk: bcm2835: Add support for programming the audio domain clocks") >> ? > I guess this patch looks to me as if it is a policy inside the kernel, > which is AFAIK frowned upon. > > I am looking into making "assigned-clock-parents? inside the dt > work with the driver. > > Could look something like this: > i2s: i2s at 7e203000 { > assigned-clock-parents = <&cprman BCM2835_PLLD_PER>, <&clk_osc>; > assigned-clocks = <&cprman BCM2835_CLOCK_PCM>, <&cprman BCM2835_CLOCK_PCM>; > }; > (not sure if that works really - the same clock in assigned-clocks looks suspicious) > > This would move the policy out of the kernel into the device-tree, > which - i guess is a better solution. So after some more investigation it seems that we can not really use those assigned-clock-parents properties for our purpose of filtering the parent clocks, as it: a) requires also assigned-clocks to be set (this may be OK) b) it does not allow to define a list of clocks to get used - it will just set the parent of the assigned-clock - if we take the example shown above, it would call clk_set_parent 2 times for the PCM clock - once with PLLD_PER and once with clk_osc. So I start to wonder if it would not be better to use an approach like this: cprman: cprman at 7e101000 { ... brcm,clock-flags = <flags for PCM>, <flags for PWM>; brcm,clock-index = <BCM2835_CLOCK_PCM>, <BCM2835_CLOCK_PWM>; } the flags would be a bitfield that select the parent clocks. So it could look like this: cprman: cprman at 7e101000 { ... brcm,clock-flags = (BIT(BCM2835_PER_PARENT_OSC) | BIT(BCM2835_PER_PARENT_PLLD_PER)), ...; brcm,clock-index = <BCM2835_CLOCK_PCM>, <BCM2835_CLOCK_PWM>; } BCM2835_PER_PARENT_PLLD_PER and BCM2835_PER_PARENT_OSC would then be defined in include/dt-bindings/clock/bcm2835.h In addition this would also allow us to add other flags to enable higher order MASH clock dividers - we currently only allow simple fractional dividers - we could even force the use of integer dividers if there comes a need. This would really allow us to define the parents freely and if the firmware ever changes its behavior with regards to PLLC, then we can easily change the device-tree. Is this approach acceptable - maybe in a variation? Thanks, Martin ^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH 2/2] clk: bcm2835: Skip PLLC clocks when deciding on a new clock parent 2016-04-30 9:28 ` Martin Sperl 2016-05-02 8:54 ` Martin Sperl @ 2016-05-02 15:29 ` Eric Anholt 2016-05-02 16:36 ` Martin Sperl 1 sibling, 1 reply; 7+ messages in thread From: Eric Anholt @ 2016-05-02 15:29 UTC (permalink / raw) To: linux-arm-kernel Martin Sperl <kernel@martin.sperl.org> writes: >> On 26.04.2016, at 21:39, Eric Anholt <eric@anholt.net> wrote: >> >> 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. >> >> Signed-off-by: Eric Anholt <eric@anholt.net> >> Fixes: 41691b8862e2 ("clk: bcm2835: Add support for programming the audio domain clocks") >> ? > > I guess this patch looks to me as if it is a policy inside the kernel, > which is AFAIK frowned upon. Can you come up with a use for putting peripherals on PLLC ever, such that we need choice? -------------- next part -------------- A non-text attachment was scrubbed... Name: signature.asc Type: application/pgp-signature Size: 818 bytes Desc: not available URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20160502/32cf10a4/attachment.sig> ^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH 2/2] clk: bcm2835: Skip PLLC clocks when deciding on a new clock parent 2016-05-02 15:29 ` Eric Anholt @ 2016-05-02 16:36 ` Martin Sperl 2016-05-03 1:09 ` Eric Anholt 0 siblings, 1 reply; 7+ messages in thread From: Martin Sperl @ 2016-05-02 16:36 UTC (permalink / raw) To: linux-arm-kernel > On 02.05.2016, at 17:29, Eric Anholt <eric@anholt.net> wrote: > > Martin Sperl <kernel@martin.sperl.org> writes: > >>> On 26.04.2016, at 21:39, Eric Anholt <eric@anholt.net> wrote: >>> >>> 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. >>> >>> Signed-off-by: Eric Anholt <eric@anholt.net> >>> Fixes: 41691b8862e2 ("clk: bcm2835: Add support for programming the audio domain clocks") >>> ? >> >> I guess this patch looks to me as if it is a policy inside the kernel, >> which is AFAIK frowned upon. > > Can you come up with a use for putting peripherals on PLLC ever, such > that we need choice? For PLLC not right now, but with clk_notifier_register drivers could work around those clock changes (assuming we get that information from the firmware somehow - or if we could move this decision into the kernel: even better). But I can come up with a scenario that would make use of the pllh_aux under some circumstances - e.g when requesting 290039Hz on clock gp0/1/2. Similarly: if we ever enable the testdebugX clocks these become immediate candidates for parent-clocks as well which can result in more headache. Being able to define which clocks to use at least give the dts author a means also to control clock selection if he wants to enable the testdebug clocks. Another similar situation can occur with plla_per - under some circumstances it may get used unexpectedly. Martin ^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH 2/2] clk: bcm2835: Skip PLLC clocks when deciding on a new clock parent 2016-05-02 16:36 ` Martin Sperl @ 2016-05-03 1:09 ` Eric Anholt 0 siblings, 0 replies; 7+ messages in thread From: Eric Anholt @ 2016-05-03 1:09 UTC (permalink / raw) To: linux-arm-kernel Martin Sperl <kernel@martin.sperl.org> writes: >> On 02.05.2016, at 17:29, Eric Anholt <eric@anholt.net> wrote: >> >> Martin Sperl <kernel@martin.sperl.org> writes: >> >>>> On 26.04.2016, at 21:39, Eric Anholt <eric@anholt.net> wrote: >>>> >>>> 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. >>>> >>>> Signed-off-by: Eric Anholt <eric@anholt.net> >>>> Fixes: 41691b8862e2 ("clk: bcm2835: Add support for programming the audio domain clocks") >>>> ? >>> >>> I guess this patch looks to me as if it is a policy inside the kernel, >>> which is AFAIK frowned upon. >> >> Can you come up with a use for putting peripherals on PLLC ever, such >> that we need choice? > > For PLLC not right now, but with clk_notifier_register drivers could > work around those clock changes (assuming we get that information > from the firmware somehow - or if we could move this decision into the > kernel: even better). Why would you want to automatically choose an unstable clock instead of the stable clock we have available? > But I can come up with a scenario that would make use of the pllh_aux > under some circumstances - e.g when requesting 290039Hz on clock gp0/1/2. > > Similarly: if we ever enable the testdebugX clocks these become immediate > candidates for parent-clocks as well which can result in more headache. How are you planning to make use of the testdebug inputs? As far as I know, those are for bit-banging your clocks during hardware bringup debugging. They wouldn't be clocks you'd automatically choose. > Being able to define which clocks to use at least give the dts author > a means also to control clock selection if he wants to enable the > testdebug clocks. If you were to clock-assigned-parents something to PLLC, this code won't override that. -------------- next part -------------- A non-text attachment was scrubbed... Name: signature.asc Type: application/pgp-signature Size: 818 bytes Desc: not available URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20160502/6df893d2/attachment.sig> ^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2016-05-03 1:09 UTC | newest] Thread overview: 7+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2016-04-26 19:39 [PATCH 1/2] clk: bcm2835: Mark the VPU clock as critical Eric Anholt 2016-04-26 19:39 ` [PATCH 2/2] clk: bcm2835: Skip PLLC clocks when deciding on a new clock parent Eric Anholt 2016-04-30 9:28 ` Martin Sperl 2016-05-02 8:54 ` Martin Sperl 2016-05-02 15:29 ` Eric Anholt 2016-05-02 16:36 ` Martin Sperl 2016-05-03 1:09 ` Eric Anholt
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).