02 Nov, 2016

1 commit

  • The boot-time frequency of a CPU is considered its rated maximum, as we
    have no other source of such information. However, this was previously
    only used for chips with 80% restrictions on secondary PLLs. This
    usually wasn't a problem because most chips/configs boot with a divider
    of /1, with other dividers being used only for dynamic frequency
    reduction. However, at least one config (LS1021A at less than 1 GHz)
    uses a different divider for top speed. This was causing cpufreq to set
    a frequency beyond the chip's rated speed.

    This is fixed by applying a 100%-of-initial-speed limit to all CPU PLLs,
    similar to the existing 80% limit that only applied to some.

    Signed-off-by: Scott Wood
    Cc: stable@vger.kernel.org
    Signed-off-by: Stephen Boyd

    Scott Wood
     

19 Aug, 2016

1 commit

  • The offset of Core Cluster clock control/status register
    on cluster group V3 version is different from others, and
    should be plus 0x70000.

    Signed-off-by: Tang Yuantian
    Reviewed-by: Scott Wood
    Fixes: 9e19ca2f627e ("clk: qoriq: Add ls2080a support.")
    Signed-off-by: Stephen Boyd

    Tang Yuantian
     

20 Apr, 2016

1 commit

  • Add __init attribute on a function that is only called from other __init
    functions and that is not inlined, at least with gcc version 4.8.4 on an
    x86 machine with allyesconfig. Currently, the function is put in the
    .text.unlikely segment. Declaring it as __init will cause it to be put in
    the .init.text and to disappear after initialization.

    The result of objdump -x on the function before the change is as follows:

    0000000000000000 l F .text.unlikely 0000000000000071 sysclk_from_fixed.constprop.5

    And after the change it is as follows:

    0000000000000480 l F .init.text 000000000000006c sysclk_from_fixed.constprop.5

    Done with the help of Coccinelle. The semantic patch checks for local
    static non-init functions that are called from an __init function and are
    not called from any other function.

    Signed-off-by: Julia Lawall
    Signed-off-by: Stephen Boyd

    Julia Lawall
     

16 Apr, 2016

1 commit


01 Dec, 2015

1 commit

  • If get_pll_div() fails we exited by returning NULL but we missed
    releasing hwc.

    Signed-off-by: Sudip Mukherjee
    Fixes: 0dfc86b3173f ("clk: qoriq: Move chip-specific knowledge into driver")
    Signed-off-by: Stephen Boyd

    Sudip Mukherjee
     

27 Oct, 2015

1 commit


23 Oct, 2015

1 commit


22 Oct, 2015

2 commits

  • LS2080A is the first implementation of the chassis 3 clockgen, which
    has a different register layout than previous chips. It is also little
    endian, unlike previous chips.

    Signed-off-by: Scott Wood
    Acked-by: Stephen Boyd

    Scott Wood
     
  • The device tree should describe the chips (or chip-like subblocks) in
    the system, but it generally does not describe individual registers --
    it should identify, rather than describe, a programming interface.

    This has not been the case with the QorIQ clockgen nodes. The
    knowledge of what each bit setting of CLKCnCSR means is encoded in
    three places (binding, pll node, and mux node), and the last also needs
    to know which options are valid on a particular chip. All three of
    these locations are considered stable ABI, making it difficult to fix
    mistakes (of which I have found several), much less refactor the
    abstraction to be able to address problems, limitations, or new chips.

    Under the current binding, a pll clock specifier of 2 means that the
    PLL is divided by 4 -- and the driver implements this, unless there
    happen to be four clock-output-names rather than 3, in which case it
    interprets it as PLL divided by 3. This does not appear in the binding
    documentation at all. That hack is now considered stable ABI.

    The current device tree nodes contain errors, such as saying that
    T1040 can set a core clock to PLL/4 when only PLL and PLL/2 are options.
    The current binding also ignores some restrictions on clock selection,
    such as p5020's requirement that if a core uses the "wrong" PLL, that
    PLL must be clocked lower than the "correct" PLL and be at most 80% of
    the rated CPU frequency.

    Possibly because of the lack of the ability to express such nuance in
    the binding, some valid options are omitted from the device trees, such
    as the ability on p4080 to run cores 0-3 from PLL3 and cores 4-7 from
    PLL1 (again, only if they are at most 80% of rated CPU frequency).
    This omission, combined with excessive caution in the cpufreq driver
    (addressed in a subsequent patch), means that currently on a 1500 MHz
    p4080 with typical PLL configuration, cpufreq can lower the frequency
    to 1200 MHz on half the CPUs and do nothing on the others. With this
    patchset, all CPUs can be lowered to 1200 MHz on a rev2 p4080, and on a
    rev3 p4080 half can be lowered to 750 MHz and the other half to 600
    MHz.

    The current binding only deals with CPU clocks. To describe FMan in
    the device tree, we need to describe its clock. Some chips have
    additional muxes that work like the CPU muxes, but are not described in
    the device tree. Others require inspecting the Reset Control Word to
    determine which PLL is used. Rather than continue to extend this mess,
    replace it. Have the driver bind to the chip-specific clockgen
    compatible, and keep the detailed description of quirky chip variations
    in the driver, where it can be easily fixed, refactored, and extended.

    Older device trees will continue to work (including a workaround for
    old ls1021a device trees that are missing compatible and reg in the
    clockgen node, which even the old binding required). The pll/mux
    details in old device trees will be ignored, but "clocks" properties
    pointing at the old nodes will still work, and be directed at the
    corresponding new clock.

    Signed-off-by: Scott Wood
    Acked-by: Stephen Boyd

    Scott Wood
     

19 Feb, 2015

1 commit


29 Jan, 2015

7 commits

  • Currently a mix of clk-qoriq/qoriq-clk and no prefix is used

    Signed-off-by: Emil Medve
    Signed-off-by: Michael Turquette

    Emil Medve
     
  • Where the memset() is not necessary

    Signed-off-by: Emil Medve
    Signed-off-by: Michael Turquette

    Emil Medve
     
  • drivers/clk/clk-qoriq.c:59:22: warning: symbol 'cmux_ops' was not declared. Should it be static?

    Signed-off-by: Emil Medve
    Signed-off-by: Michael Turquette

    Emil Medve
     
  • WARNING:OOM_MESSAGE: Possible unnecessary 'out of memory' message
    + if (!parent_names) {
    + pr_err("%s: could not allocate parent_names\n", __func__);

    WARNING:OOM_MESSAGE: Possible unnecessary 'out of memory' message
    + if (!cmux_clk) {
    + pr_err("%s: could not allocate cmux_clk\n", __func__);

    WARNING:OOM_MESSAGE: Possible unnecessary 'out of memory' message
    + if (!subclks) {
    + pr_err("%s: could not allocate subclks\n", __func__);

    WARNING:OOM_MESSAGE: Possible unnecessary 'out of memory' message
    + if (!onecell_data) {
    + pr_err("%s: could not allocate onecell_data\n", __func__);

    Signed-off-by: Emil Medve
    Signed-off-by: Michael Turquette

    Emil Medve
     
  • CHECK:ALLOC_SIZEOF_STRUCT: Prefer kzalloc(sizeof(*cmux_clk)...) over kzalloc(sizeof(struct cmux_clk)...)
    + cmux_clk = kzalloc(sizeof(struct cmux_clk), GFP_KERNEL);

    CHECK:ALLOC_SIZEOF_STRUCT: Prefer kzalloc(sizeof(*onecell_data)...) over kzalloc(sizeof(struct clk_onecell_data)...)
    + onecell_data = kzalloc(sizeof(struct clk_onecell_data), GFP_KERNEL);

    Signed-off-by: Emil Medve
    Signed-off-by: Michael Turquette

    Emil Medve
     
  • WARNING:ALLOC_WITH_MULTIPLY: Prefer kcalloc over kzalloc with multiply
    + subclks = kzalloc(sizeof(struct clk *) * count, GFP_KERNEL);

    Signed-off-by: Emil Medve
    Signed-off-by: Michael Turquette

    Emil Medve
     
  • CHECK:PARENTHESIS_ALIGNMENT: Alignment should match open parenthesis
    + rc = of_property_read_string_index(np, "clock-output-names",
    + 0, &clk_name);

    CHECK:PARENTHESIS_ALIGNMENT: Alignment should match open parenthesis
    + pr_err("Could not register clock provider for node:%s\n",
    + np->name);

    CHECK:PARENTHESIS_ALIGNMENT: Alignment should match open parenthesis
    + rc = of_property_read_string_index(np, "clock-output-names",
    + i, &clk_name);

    CHECK:PARENTHESIS_ALIGNMENT: Alignment should match open parenthesis
    + pr_err("Could not register clk provider for node:%s\n",
    + np->name);

    Signed-off-by: Emil Medve
    Signed-off-by: Michael Turquette

    Emil Medve
     

21 Jan, 2015

1 commit

  • Freescale introduced new ARM-based socs which using the compatible
    clock IP block with PowerPC-based socs'. So this driver can be used
    on both platforms.
    Updated relevant descriptions and renamed this driver to better
    represent its meaning and keep the function of driver untouched.

    Signed-off-by: Tang Yuantian
    Signed-off-by: Michael Turquette

    Tang Yuantian