30 Dec, 2020

1 commit

  • [ Upstream commit 4b003f5fcadfa2d0e087e907b0c65d023f6e29fb ]

    Commit 45c940184b501fc6 ("dt-bindings: clk: versaclock5: convert to
    yaml") accidentally changed "idt,voltage-microvolts" to
    "idt,voltage-microvolt" in the DT bindings, while the driver still used
    the former.

    Update the driver to match the bindings, as
    Documentation/devicetree/bindings/property-units.txt actually recommends
    using "microvolt".

    Fixes: 260249f929e81d3d ("clk: vc5: Enable addition output configurations of the Versaclock")
    Signed-off-by: Geert Uytterhoeven
    Link: https://lore.kernel.org/r/20201218125253.3815567-1-geert+renesas@glider.be
    Reviewed-by: Luca Ceresoli
    Signed-off-by: Stephen Boyd
    Signed-off-by: Sasha Levin

    Geert Uytterhoeven
     

24 Jul, 2020

1 commit

  • Reusing the generic struct vc5_hw_data for all blocks is handy. However it
    implies we allocate space the div_int and div_frc fields even for the
    output drivers where they are unused, and the clk_output_cfg0 and
    clk_output_cfg0_mask fields for all components even though they are used
    only for the output drivers.

    Use a dedicated struct for the output drivers so that each block uses
    exactly the fields it needs, not more.

    Signed-off-by: Luca Ceresoli
    Link: https://lore.kernel.org/r/20200723072603.1795-1-luca@lucaceresoli.net
    Signed-off-by: Stephen Boyd

    Luca Ceresoli
     

23 Jul, 2020

2 commits

  • When getting the names of the child nodes, kasprintf is used to
    allocate memory which is used to create the string for the node
    name. Unfortunately, there is no memory check to determine
    if this allocation fails, it may cause an error when trying
    to get child node name.

    This patch will check if the memory allocation fails, and returns
    and -ENOMEM error instead of blindly moving on.

    Fixes: 260249f929e8 ("clk: vc5: Enable addition output configurations of the Versaclock")

    Suggested-by: Dan Carpenter
    Signed-off-by: Adam Ford
    Reviewed-by: Luca Ceresoli
    Link: https://lore.kernel.org/r/20200716122620.4538-1-aford173@gmail.com
    Signed-off-by: Stephen Boyd

    Adam Ford
     
  • There are a several places where printing an error message of
    init.name occurs after init.name has been kfree'd. Also the failure
    message is duplicated each time in the code. Fix this by adding
    a registration error failure path for these cases, moving the
    duplicated error messages to one common point and kfree'ing init.name
    only after it has been used.

    Changes also shrink the object code size by 171 bytes (x86-64, gcc 9.3):

    Before:
    text data bss dec hex filename
    21057 3960 64 25081 61f9 drivers/clk/clk-versaclock5.o

    After:
    text data bss dec hex filename
    20886 3960 64 24910 614e drivers/clk/clk-versaclock5.o

    Addresses-Coverity: ("Use after free")
    Fixes: f491276a5168 ("clk: vc5: Allow Versaclock driver to support multiple instances")

    Signed-off-by: Colin Ian King
    Link: https://lore.kernel.org/r/20200625132736.88832-1-colin.king@canonical.com
    Reviewed-by: Luca Ceresoli
    [sboyd@kernel.org: Drop stray newline]
    Signed-off-by: Stephen Boyd

    Colin Ian King
     

23 Jun, 2020

2 commits

  • The existing driver is expecting the Versaclock to be pre-programmed,
    and only sets the output frequency. Unfortunately, not all devices
    are pre-programmed, and the Versaclock chip has more options beyond
    just the frequency.

    This patch enables the following additional features:

    - Programmable voltage: 1.8V, 2.5V, or 3.3V​
    - Slew Percentage of normal: 85%, 90%, or 100%
    - Output Type: LVPECL, CMOS, HCSL, or LVDS

    Signed-off-by: Adam Ford
    Link: https://lore.kernel.org/r/20200603154329.31579-3-aford173@gmail.com
    Signed-off-by: Stephen Boyd

    Adam Ford
     
  • Currently, the Versaclock driver is only expecting one instance and
    uses hard-coded names for the various clock names. Unfortunately,
    this is a problem when there is more than one instance of the driver,
    because the subsequent instantiations of the driver use the identical
    name. Each clock after the fist fails to load, because the clock
    subsystem cannot handle two clocks with identical name.

    This patch removes the hard-coded name arrays and uses kasprintf to
    assign clock names based on names of their respective node and parent
    node which gives each clock a unique identifying name.

    For a verasaclock node with a name like:
    versaclock5: versaclock_som@6a

    The updated clock names would appear like:
    versaclock_som.mux
    versaclock_som.out0_sel_i2cb
    versaclock_som.pfd
    versaclock_som.pll
    versaclock_som.fod3
    versaclock_som.out4
    versaclock_som.fod2
    versaclock_som.out3
    versaclock_som.fod1
    versaclock_som.out2
    versaclock_som.fod0
    versaclock_som.out1

    Signed-off-by: Adam Ford
    Link: https://lore.kernel.org/r/20200603154329.31579-1-aford173@gmail.com
    Signed-off-by: Stephen Boyd

    Adam Ford
     

31 May, 2020

1 commit


31 May, 2019

1 commit

  • Based on 3 normalized pattern(s):

    this program is free software you can redistribute it and or modify
    it under the terms of the gnu general public license as published by
    the free software foundation either version 2 of the license or at
    your option any later version this program is distributed in the
    hope that it will be useful but without any warranty without even
    the implied warranty of merchantability or fitness for a particular
    purpose see the gnu general public license for more details

    this program is free software you can redistribute it and or modify
    it under the terms of the gnu general public license as published by
    the free software foundation either version 2 of the license or at
    your option any later version [author] [kishon] [vijay] [abraham]
    [i] [kishon]@[ti] [com] this program is distributed in the hope that
    it will be useful but without any warranty without even the implied
    warranty of merchantability or fitness for a particular purpose see
    the gnu general public license for more details

    this program is free software you can redistribute it and or modify
    it under the terms of the gnu general public license as published by
    the free software foundation either version 2 of the license or at
    your option any later version [author] [graeme] [gregory]
    [gg]@[slimlogic] [co] [uk] [author] [kishon] [vijay] [abraham] [i]
    [kishon]@[ti] [com] [based] [on] [twl6030]_[usb] [c] [author] [hema]
    [hk] [hemahk]@[ti] [com] this program is distributed in the hope
    that it will be useful but without any warranty without even the
    implied warranty of merchantability or fitness for a particular
    purpose see the gnu general public license for more details

    extracted by the scancode license scanner the SPDX license identifier

    GPL-2.0-or-later

    has been chosen to replace the boilerplate/reference in 1105 file(s).

    Signed-off-by: Thomas Gleixner
    Reviewed-by: Allison Randal
    Reviewed-by: Richard Fontana
    Reviewed-by: Kate Stewart
    Cc: linux-spdx@vger.kernel.org
    Link: https://lkml.kernel.org/r/20190527070033.202006027@linutronix.de
    Signed-off-by: Greg Kroah-Hartman

    Thomas Gleixner
     

10 Jan, 2019

1 commit

  • In case the upstream clock are not set, which can happen in case the
    VC5 has no valid upstream clock, the $src variable is used uninited
    by regmap_update_bits(). Check for this condition and return -EINVAL
    in such case.

    Note that in case the VC5 has no valid upstream clock, the VC5 can
    not operate correctly. That is a hardware property of the VC5. The
    internal oscilator present in some VC5 models is also considered
    upstream clock.

    Signed-off-by: Marek Vasut
    Cc: Alexey Firago
    Cc: Laurent Pinchart
    Cc: Stephen Boyd
    Cc: linux-renesas-soc@vger.kernel.org
    [sboyd@kernel.org: Added comment about probe preventing this from
    happening in the first place]
    Signed-off-by: Stephen Boyd

    Marek Vasut
     

15 Dec, 2018

1 commit

  • Add simple suspend/resume handlers to the driver to restore the chip
    configuration after resume. It is possible that the chip was configured
    with non-default values before suspend-resume cycle and that the chip
    is powered down during this cycle, so the configuration could get lost.

    Signed-off-by: Marek Vasut
    Cc: Alexey Firago
    Cc: Laurent Pinchart
    Cc: Michael Turquette
    Cc: Stephen Boyd
    Cc: linux-renesas-soc@vger.kernel.org
    Reviewed-by: Laurent Pinchart
    Tested-by: Laurent Pinchart
    Signed-off-by: Stephen Boyd

    Marek Vasut
     

18 Jul, 2017

8 commits

  • Update IDT VersaClock 5 driver to support 5P49V5925. This chip has only
    external clock input, four fractional dividers (FODs) and five clock
    outputs (four universal clock outputs and one reference clock output at
    OUT0_SELB_I2C).

    Signed-off-by: Vladimir Barinov
    Reviewed-by: Marek Vasut
    Signed-off-by: Stephen Boyd

    Vladimir Barinov
     
  • Update IDT VersaClock 5 driver to support IDT VersaClock 6 5P49V6901.
    This chip has two clock inputs (external XTAL or external CLKIN), four
    fractional dividers (FODs) and five clock outputs (four universal clock
    outputs and one reference clock output at OUT0_SELB_I2C).

    Signed-off-by: Marek Vasut
    Cc: Alexey Firago
    Cc: Stephen Boyd
    Cc: Michael Turquette
    Cc: Laurent Pinchart
    Cc: linux-renesas-soc@vger.kernel.org
    Tested-by: Laurent Pinchart
    on Salvator-XS with the display LVDS output.
    Signed-off-by: Stephen Boyd

    Marek Vasut
     
  • The VersaClock 6 has an input frequency doubler between the input
    clock mux and the predivider. Add new capability flag and support
    for this frequency doubler block into the driver.

    Signed-off-by: Marek Vasut
    Cc: Stephen Boyd
    Cc: Alexey Firago
    Cc: Michael Turquette
    Cc: Laurent Pinchart
    Cc: linux-renesas-soc@vger.kernel.org
    Tested-by: Laurent Pinchart
    on Salvator-XS with the display LVDS output.
    Signed-off-by: Stephen Boyd

    Marek Vasut
     
  • Split the VC5 clock input mux and the predivider to more accurately
    model the hardware and fix the previously incorrect assumption that
    both the OUT_SEL_I2CB and the PLL are fed from the predivider.

    It is in fact the clock input mux output which is directly feeding
    the clock into the OUT_SEL_I2CB output, while the clock input mux
    output first passes through the predivider before it is fed into
    the PLL.

    Signed-off-by: Marek Vasut
    Cc: Stephen Boyd
    Cc: Alexey Firago
    Cc: Michael Turquette
    Cc: Laurent Pinchart
    Cc: linux-renesas-soc@vger.kernel.org
    Tested-by: Laurent Pinchart
    on Salvator-XS with the display LVDS output.
    Signed-off-by: Stephen Boyd

    Marek Vasut
     
  • The output buffer input mux can be configured in either of three
    states -- disabled, input from FOD, input from previous output.
    Once the .prepare() callback of the output buffer is called, the
    output buffer input mux must be set to either input from FOD or
    input from previous output, it cannot be set to Disabled anymore
    or the output won't work.

    Default to the input from FOD if the output buffer input mux was
    Disabled and the .prepare() was called on it.

    Note that we do not set the output buffer input mux back to Disabled
    in the .unprepare() callback as there is no obvious benefit of doing
    so. We disable the entire output buffer in the .unprepare() callback
    already.

    Signed-off-by: Marek Vasut
    Cc: Stephen Boyd
    Cc: Alexey Firago
    Cc: Michael Turquette
    Cc: Laurent Pinchart
    Cc: linux-renesas-soc@vger.kernel.org
    Tested-by: Laurent Pinchart # Salvator-XS with the display LVDS output.
    Signed-off-by: Stephen Boyd

    Marek Vasut
     
  • The output buffer input mux can be configured in either of three
    states -- disabled, input from FOD, input from previous output.
    If the output buffer input mux is set to disabled, the code in
    vc5_clk_out_get_parent() would consider this an invalid setting
    and warn about it, which is not necessarily the case.

    In case the output buffer input mux is disabled, default to input
    from FOD to have some parent and don't print the warning.

    Signed-off-by: Marek Vasut
    Cc: Stephen Boyd
    Cc: Alexey Firago
    Cc: Michael Turquette
    Cc: Laurent Pinchart
    Cc: linux-renesas-soc@vger.kernel.org
    Tested-by: Laurent Pinchart # Salvator-XS with the display LVDS output.
    Signed-off-by: Stephen Boyd

    Marek Vasut
     
  • Fix trivial typo in vc5_clk_out_unprepare() , s/Enable/Disable/ .

    Signed-off-by: Marek Vasut
    Cc: Stephen Boyd
    Cc: Alexey Firago
    Cc: Michael Turquette
    Cc: Laurent Pinchart
    Cc: linux-renesas-soc@vger.kernel.org
    Tested-by: Laurent Pinchart # Salvator-XS with the display LVDS output.
    Signed-off-by: Stephen Boyd

    Marek Vasut
     
  • In case the initial values of the FOD registers are not configured in
    the OTP or by the bootloader, it is possible that the FOD registers
    will contain zeroes. The code in vc5_fod_recalc_rate() immediately
    feeds the FOD divider value obtained from the FOD registers into the
    div64_u64() and if the FOD divider value is zero, triggers division
    by zero exception.

    Check if the FOD divider value is zero and return the frequency of
    the FOD output as 0 Hz if it is so. This prevents the division by
    zero exception.

    Signed-off-by: Marek Vasut
    Cc: Stephen Boyd
    Cc: Alexey Firago
    Cc: Michael Turquette
    Cc: Laurent Pinchart
    Cc: linux-renesas-soc@vger.kernel.org
    Tested-by: Laurent Pinchart # Salvator-XS with the display LVDS output.
    Signed-off-by: Stephen Boyd

    Marek Vasut
     

20 Apr, 2017

2 commits

  • Update IDT VersaClock 5 driver to support 5P49V5935. This chip has
    two clock inputs (internal XTAL or external CLKIN), four fractional
    dividers (FODs) and five clock outputs (four universal clock outputs
    and one reference clock output at OUT0_SELB_I2C).

    Current driver supports up to 2 FODs and up to 3 clock outputs. This
    patch sets max number of supported FODs to 4 and max number of supported
    clock outputs to 5.

    Signed-off-by: Alexey Firago
    Reviewed-by: Marek Vasut
    Signed-off-by: Stephen Boyd

    Alexey Firago
     
  • Introduce vc5_chip_info structure to describe features of a particular
    VC5 chip (id, number of FODs, number of outputs, flags).
    For now flags are only used to indicate if chip has internal XTAL.
    vc5_chip_info is set on probe from the matched of_device_id->data.

    Also add defines to specify maximum number of FODs and clock outputs
    supported by the driver.

    With these changes it should be easier to extend driver to support
    more VC5 models.

    Signed-off-by: Alexey Firago
    Reviewed-by: Marek Vasut
    Signed-off-by: Stephen Boyd

    Alexey Firago
     

21 Jan, 2017

1 commit

  • Add driver for IDT VersaClock 5 5P49V5923 and 5P49V5933 chips. These
    chips have two clock inputs, XTAL or CLK, which are muxed into single
    PLL/VCO input. In case of 5P49V5923, the XTAL in built into the chip
    while the 5P49V5923 requires external XTAL.

    The PLL feeds two fractional dividers. Each fractional divider feeds
    output mux, which allows selecting between clock from the fractional
    divider itself or from output mux on output N-1. In case of output
    mux 0, the output N-1 is instead connected to the output from the mux
    feeding the PLL.

    The driver thus far supports only the 5P49V5923 and 5P49V5933, while
    it should be easily extensible to the whole 5P49V59xx family of chips
    as they are all pretty similar.

    Signed-off-by: Marek Vasut
    Cc: Michael Turquette
    Reviewed-by: Laurent Pinchart
    Tested-by: Laurent Pinchart
    Cc: linux-renesas-soc@vger.kernel.org
    Signed-off-by: Stephen Boyd

    Marek Vasut