25 Aug, 2016

1 commit

  • Tegra114 has a HW bug that the PLLD/PLLD2 lock bit cannot be asserted when
    the DIS power domain is during up-powergating process but the clamp to this
    domain is not removed yet. That causes a timeout and aborts the power
    sequence, although the PLLD/PLLD2 has already locked. To remove the false
    alarm, we don't use the lock for PLLD/PLLD2. Just wait 1ms and treat the
    clocks as locked.

    Signed-off-by: Vince Hsu
    Tested-by: Jonathan Hunter
    Signed-off-by: Thierry Reding
    Signed-off-by: Stephen Boyd

    Vince Hsu
     

30 Jun, 2016

1 commit

  • Move the UTMI PLL initialization code form clk-tegra.c files into
    clk-pll.c. UTMI PLL was being configured and set in HW control right
    after registration. However, when the clock init_table is processed and
    child clks of PLLU are enabled, it will call in and enable PLLU as
    well, and initiate SW enabling sequence even though PLLU is already in
    HW control. This leads to getting UTMIPLL stuck with a SEQ_BUSY status.

    Doing the initialization once during pllu_enable means we configure it
    properly into HW control.

    A side effect of the commonization/localization of the UTMI PLL init
    code, is that it corrects some errors that were present for earlier
    generations. For instance, in clk-tegra124.c, it used to have:

    #define UTMIP_PLL_CFG1_ENABLE_DLY_COUNT(x) (((x) & 0x1f) << 6)

    when the correct shift to use is present in the new version:

    #define UTMIP_PLL_CFG1_ENABLE_DLY_COUNT(x) (((x) & 0x1f) << 27)

    which matches the Tegra124 TRM register definition.

    Signed-off-by: Andrew Bresticker
    [rklein: Merged in some later fixes for potential deadlocks]
    Signed-off-by: Rhyland Klein
    [treding: coding style bike-shedding, remove unused variable]
    Signed-off-by: Thierry Reding

    Andrew Bresticker
     

23 Jun, 2016

2 commits


22 Jun, 2016

1 commit

  • The timer clock feeds the timer block, which, among other things, is
    used to drive the SOR lane sequencer. Since the Tegra timer driver is
    not enabled on 64-bit ARM, nothing currently claims that clock and it
    gets disabled by the common clock framework at late_init time.

    Given the non-obvious dependencies, the timer clock can be considered
    a critical part of the SoC infrastructure, requiring its clock source
    to be always on.

    Acked-by: Rhyland Klein
    Acked-by: Peter De Schrijver
    Signed-off-by: Thierry Reding

    Thierry Reding
     

17 Jun, 2016

3 commits

  • Make the sor1 and sor1_src clocks available on Tegra210. They will be
    used by the display driver to support HDMI and DP.

    Signed-off-by: Thierry Reding

    Thierry Reding
     
  • The sor1 clock on Tegra210 is structured in the following way:

    +-------+
    | pllp |---+
    +-------+ | +--------------+ +-----------+
    +----| | | sor_safe |
    +-------+ | | +-----------+
    | plld |--------| | |
    +-------+ | | +-----------+
    | sor1_src |-------| |
    +-------+ | | +-----------+
    | plld2 |--------| | |
    +-------+ | | |
    +----| | |
    +-------+ | +--------------+ |
    | clkm |---+ +-----------+
    +-------+ +--------------+ | |
    | sor1_brick |-------| sor1 |
    +--------------+ | |
    +-----------+

    This is impractical to represent in a clock tree, though, because there
    is no name for the mux that has sor_safe and sor1_src as parents. It is
    also much more cumbersome to deal with the additional mux because users
    of these clocks (the display driver) would have to juggle with an extra
    mux for no real reason.

    To simply things, the above is squashed into two muxes instead, so that
    it looks like this:

    +-------+
    | pllp |---+
    +-------+ | +--------------+ +-----------+
    +----| | | sor_safe |
    +-------+ | | +-----------+
    | plld |--------| | |
    +-------+ | | +-----------+
    | sor1_src |-------| sor1 |
    +-------+ | | +-----------+
    | plld2 |--------| | | |
    +-------+ | | | |
    +----| | | |
    +-------+ | +--------------+ | |
    | clkm |---+ | |
    +-------+ +--------------+ | |
    | sor1_brick |-----------+---+
    +--------------+

    This still very accurately represents the hardware. Note that sor1 has
    sor1_brick as input twice, that's because bit 1 in the mux selects the
    sor1_brick irrespective of bit 0.

    Signed-off-by: Thierry Reding

    Thierry Reding
     
  • Enabling spread spectrum on pll_d2 can lead to issues with display
    modes. HDMI monitors, for example, would report "Signal Error" and
    some modes driven over DisplayPort would generate fuzzy horizontal
    bands.

    Signed-off-by: Thierry Reding

    Thierry Reding
     

10 Jun, 2016

1 commit

  • Commit 86c679a52294 ("clk: tegra: pll: Fix _pll_ramp_calc_pll logic and
    _calc_dynamic_ramp_rate") changed the PLL divider computation logic to
    consistently use P-divider values from tables as real dividers rather
    than the hardware values. Unfortunately for some reason many of the
    Tegra210 clocks didn't have their tables updated (most likely an over-
    sight by me when applying the patches). This commit fixes them all up.

    Cc: Jon Hunter
    Cc: Rhyland Klein
    Acked-by: Rhyland Klein
    Signed-off-by: Thierry Reding

    Thierry Reding
     

28 May, 2016

1 commit

  • Most users of IS_ERR_VALUE() in the kernel are wrong, as they
    pass an 'int' into a function that takes an 'unsigned long'
    argument. This happens to work because the type is sign-extended
    on 64-bit architectures before it gets converted into an
    unsigned type.

    However, anything that passes an 'unsigned short' or 'unsigned int'
    argument into IS_ERR_VALUE() is guaranteed to be broken, as are
    8-bit integers and types that are wider than 'unsigned long'.

    Andrzej Hajda has already fixed a lot of the worst abusers that
    were causing actual bugs, but it would be nice to prevent any
    users that are not passing 'unsigned long' arguments.

    This patch changes all users of IS_ERR_VALUE() that I could find
    on 32-bit ARM randconfig builds and x86 allmodconfig. For the
    moment, this doesn't change the definition of IS_ERR_VALUE()
    because there are probably still architecture specific users
    elsewhere.

    Almost all the warnings I got are for files that are better off
    using 'if (err)' or 'if (err < 0)'.
    The only legitimate user I could find that we get a warning for
    is the (32-bit only) freescale fman driver, so I did not remove
    the IS_ERR_VALUE() there but changed the type to 'unsigned long'.
    For 9pfs, I just worked around one user whose calling conventions
    are so obscure that I did not dare change the behavior.

    I was using this definition for testing:

    #define IS_ERR_VALUE(x) ((unsigned long*)NULL == (typeof (x)*)NULL && \
    unlikely((unsigned long long)(x) >= (unsigned long long)(typeof(x))-MAX_ERRNO))

    which ends up making all 16-bit or wider types work correctly with
    the most plausible interpretation of what IS_ERR_VALUE() was supposed
    to return according to its users, but also causes a compile-time
    warning for any users that do not pass an 'unsigned long' argument.

    I suggested this approach earlier this year, but back then we ended
    up deciding to just fix the users that are obviously broken. After
    the initial warning that caused me to get involved in the discussion
    (fs/gfs2/dir.c) showed up again in the mainline kernel, Linus
    asked me to send the whole thing again.

    [ Updated the 9p parts as per Al Viro - Linus ]

    Signed-off-by: Arnd Bergmann
    Cc: Andrzej Hajda
    Cc: Andrew Morton
    Link: https://lkml.org/lkml/2016/1/7/363
    Link: https://lkml.org/lkml/2016/5/27/486
    Acked-by: Srinivas Kandagatla # For nvmem part
    Signed-off-by: Linus Torvalds

    Arnd Bergmann
     

21 May, 2016

1 commit

  • Pull clk updates from Stephen Boyd:
    "It's the usual big pile of driver updates and additions, but we do
    have a couple core changes in here as well.

    Core:

    - CLK_IS_CRITICAL support has been added. This should allow drivers
    to properly express that a certain clk should stay on even if their
    prepare/enable count drops to 0 (and in turn the parents of these
    clks should stay enabled).

    - A clk registration API has been added, clk_hw_register(), and an OF
    clk provider API has been added, of_clk_add_hw_provider(). These
    APIs have been put in place to further split clk providers from clk
    consumers, with the goal being to have clk providers never deal
    with struct clk pointers at all. Conversion of provider drivers is
    on going. clkdev has also gained support for registering clk_hw
    pointers directly so we can convert drivers that don't use
    devicetree.

    New Drivers:

    - Marvell ap806 and cp110 system controllers (with clks inside!)
    - Hisilicon Hi3519 clock and reset controller
    - Axis ARTPEC-6 clock controllers
    - Oxford Semiconductor OXNAS clock controllers
    - AXS10X I2S PLL
    - Rockchip RK3399 clock and reset controller

    Updates:

    - MMC2 and UART2 clks on Samsung Exynos 3250, ACLK on Samsung Exynos
    542x SoCs, and some more clk ID exporting for bus frequency scaling
    - Proper BCM2835 PCM clk support and various other clks
    - i.MX clk updates for i.MX6SX, i.MX7, and VF610
    - Renesas updates for R-Car H3
    - Tegra210 got updates for DisplayPort and HDMI 2.0
    - Rockchip driver refactorings and fixes due to adding RK3399 support"

    * tag 'clk-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/clk/linux: (139 commits)
    clk: fix critical clock locking
    clk: qcom: mmcc-8996: Remove clocks that should be controlled by RPM
    clk: ingenic: Allow divider value to be divided
    clk: sunxi: Add display and TCON0 clocks driver
    clk: rockchip: drop old_rate calculation on pll rate changes
    clk: rockchip: simplify GRF handling in pll clocks
    clk: rockchip: lookup General Register Files in rockchip_clk_init
    clk: rockchip: fix the rk3399 sdmmc sample / drv name
    clk: mvebu: new driver for Armada CP110 system controller
    dt-bindings: arm: add DT binding for Marvell CP110 system controller
    clk: mvebu: new driver for Armada AP806 system controller
    clk: hisilicon: add CRG driver for hi3519 soc
    clk: hisilicon: export some hisilicon APIs to modules
    reset: hisilicon: add reset controller driver for hisilicon SOCs
    clk: bcm/kona: Do not use sizeof on pointer type
    clk: qcom: msm8916: Fix crypto clock flags
    clk: nxp: lpc18xx: Initialize clk_init_data::flags to 0
    clk/axs10x: Add I2S PLL clock driver
    clk: imx7d: fix ahb clock mux 1
    clk: fix comment of devm_clk_hw_register()
    ...

    Linus Torvalds
     

19 May, 2016

1 commit

  • Pull ARM SoC driver updates from Arnd Bergmann:
    "Driver updates for ARM SoCs, these contain various things that touch
    the drivers/ directory but got merged through arm-soc for practical
    reasons.

    For the most part, this is now related to power management
    controllers, which have not yet been abstracted into a separate
    subsystem, and typically require some code in drivers/soc or arch/arm
    to control the power domains.

    Another large chunk here is a rework of the NVIDIA Tegra USB3.0
    support, which was surprisingly tricky and took a long time to get
    done.

    Finally, reset controller handling as always gets merged through here
    as well"

    * tag 'armsoc-drivers' of git://git.kernel.org/pub/scm/linux/kernel/git/arm/arm-soc: (97 commits)
    arm-ccn: Enable building as module
    soc/tegra: pmc: Add generic PM domain support
    usb: xhci: tegra: Add Tegra210 support
    usb: xhci: Add NVIDIA Tegra XUSB controller driver
    dt-bindings: usb: xhci-tegra: Add Tegra210 XUSB controller support
    dt-bindings: usb: Add NVIDIA Tegra XUSB controller binding
    PCI: tegra: Support per-lane PHYs
    dt-bindings: pci: tegra: Update for per-lane PHYs
    phy: tegra: Add Tegra210 support
    phy: Add Tegra XUSB pad controller support
    dt-bindings: phy: tegra-xusb-padctl: Add Tegra210 support
    dt-bindings: phy: Add NVIDIA Tegra XUSB pad controller binding
    phy: core: Allow children node to be overridden
    clk: tegra: Add interface to enable hardware control of SATA/XUSB PLLs
    drivers: firmware: psci: make two helper functions inline
    soc: renesas: rcar-sysc: Add support for R-Car H3 power areas
    soc: renesas: rcar-sysc: Add support for R-Car E2 power areas
    soc: renesas: rcar-sysc: Add support for R-Car M2-N power areas
    soc: renesas: rcar-sysc: Add support for R-Car M2-W power areas
    soc: renesas: rcar-sysc: Add support for R-Car H2 power areas
    ...

    Linus Torvalds
     

09 May, 2016

1 commit

  • …egra/linux into next/drivers

    Merge "phy: tegra: Changes for v4.7-rc1" from Thierry Reding:

    This set of patches adds support for the Tegra XUSB pad controller. The
    controller provides a set of pads (lanes) that are used for I/O by other
    IP blocks within Tegra SoCs (PCIe, SATA and XUSB).

    * tag 'tegra-for-4.7-phy' of git://git.kernel.org/pub/scm/linux/kernel/git/tegra/linux:
    phy: tegra: Add Tegra210 support
    phy: Add Tegra XUSB pad controller support
    dt-bindings: phy: tegra-xusb-padctl: Add Tegra210 support
    dt-bindings: phy: Add NVIDIA Tegra XUSB pad controller binding
    phy: core: Allow children node to be overridden
    clk: tegra: Add interface to enable hardware control of SATA/XUSB PLLs

    Arnd Bergmann
     

03 May, 2016

1 commit

  • …egra/linux into clk-next

    Pull tegra clk driver changes from Thierry Reding:

    This set of changes contains a bunch of cleanups and minor fixes along
    with some new clocks, mainly on Tegra210, in preparation for supporting
    DisplayPort and HDMI 2.0.

    * tag 'tegra-for-4.7-clk' of git://git.kernel.org/pub/scm/linux/kernel/git/tegra/linux:
    clk: tegra: dfll: Reformat CVB frequency table
    clk: tegra: dfll: Properly clean up on failure and removal
    clk: tegra: dfll: Make code more comprehensible
    clk: tegra: dfll: Reference CVB table instead of copying data
    clk: tegra: dfll: Update kerneldoc
    clk: tegra: Fix PLL_U post divider and initial rate on Tegra30
    clk: tegra: Initialize PLL_C to sane rate on Tegra30
    clk: tegra: Fix pllre Tegra210 and add pll_re_out1
    clk: tegra: Add sor_safe clock
    clk: tegra: dpaux and dpaux1 are fixed factor clocks
    clk: tegra: Add dpaux1 clock
    clk: tegra: Use correct parent for dpaux clock
    clk: tegra: Add fixed factor peripheral clock type
    clk: tegra: Special-case mipi-cal parent on Tegra114
    clk: tegra: Remove trailing blank line
    clk: tegra: Constify peripheral clock registers
    clk: tegra: Add interface to enable hardware control of SATA/XUSB PLLs

    Stephen Boyd
     

28 Apr, 2016

18 commits


30 Mar, 2016

1 commit


03 Mar, 2016

1 commit


02 Feb, 2016

6 commits

  • Sparse reports the following warnings for structures and functions that
    should be declared static:

    drivers/clk/tegra/clk-tegra-super-gen4.c:70:35: warning: symbol
    'tegra_super_gen_info_gen4' was not declared. Should it be static?
    drivers/clk/tegra/clk-tegra-super-gen4.c:96:35: warning: symbol
    'tegra_super_gen_info_gen5' was not declared. Should it be static?
    drivers/clk/tegra/clk-tegra-super-gen4.c:174:13: warning: symbol
    'tegra_super_clk_init' was not declared. Should it be static?

    Fix this by making the above static.

    Signed-off-by: Jon Hunter
    Acked-by: Rhyland Klein
    Signed-off-by: Thierry Reding

    Jon Hunter
     
  • Sparse reports the following warnings for functions in clk-tegra210.c
    that should be declared as static:

    drivers/clk/tegra/clk-tegra210.c:460:6: warning: symbol
    'tegra210_pllcx_set_defaults' was not declared. Should it be static?
    drivers/clk/tegra/clk-tegra210.c:485:6: warning: symbol
    '_pllc_set_defaults' was not declared. Should it be static?
    drivers/clk/tegra/clk-tegra210.c:490:6: warning: symbol
    '_pllc2_set_defaults' was not declared. Should it be static?
    drivers/clk/tegra/clk-tegra210.c:495:6: warning: symbol
    '_pllc3_set_defaults' was not declared. Should it be static?
    drivers/clk/tegra/clk-tegra210.c:500:6: warning: symbol
    '_plla1_set_defaults' was not declared. Should it be static?
    drivers/clk/tegra/clk-tegra210.c:510:6: warning: symbol
    'tegra210_plla_set_defaults' was not declared. Should it be static?
    drivers/clk/tegra/clk-tegra210.c:562:6: warning: symbol
    'tegra210_plld_set_defaults' was not declared. Should it be static?
    drivers/clk/tegra/clk-tegra210.c:701:6: warning: symbol
    'tegra210_plld2_set_defaults' was not declared. Should it be static?
    drivers/clk/tegra/clk-tegra210.c:709:6: warning: symbol
    'tegra210_plldp_set_defaults' was not declared. Should it be static?
    drivers/clk/tegra/clk-tegra210.c:722:6: warning: symbol
    'tegra210_pllc4_set_defaults' was not declared. Should it be static?
    drivers/clk/tegra/clk-tegra210.c:731:6: warning: symbol
    'tegra210_pllre_set_defaults' was not declared. Should it be static?
    drivers/clk/tegra/clk-tegra210.c:844:6: warning: symbol
    'tegra210_pllx_set_defaults' was not declared. Should it be static?
    drivers/clk/tegra/clk-tegra210.c:904:6: warning: symbol
    'tegra210_pllmb_set_defaults' was not declared. Should it be static?
    drivers/clk/tegra/clk-tegra210.c:963:6: warning: symbol
    'tegra210_pllp_set_defaults' was not declared. Should it be static?
    drivers/clk/tegra/clk-tegra210.c:1025:6: warning: symbol
    'tegra210_pllu_set_defaults' was not declared. Should it be static?
    drivers/clk/tegra/clk-tegra210.c:1215:15: warning: symbol
    'tegra210_clk_adjust_vco_min' was not declared. Should it be static?

    Fix this by declaring the above as static.

    Signed-off-by: Jon Hunter
    Acked-by: Rhyland Klein
    Signed-off-by: Thierry Reding

    Jon Hunter
     
  • Sparse generates the following warning for the pll_m params structure:

    drivers/clk/tegra/clk-tegra210.c:1569:10: warning: Initializer entry
    defined twice
    drivers/clk/tegra/clk-tegra210.c:1570:10: also defined here

    Fix this by correcting the index for the MISC1 register.

    Fixes: b31eba5ff3f7 ("clk: tegra: Add support for Tegra210 clocks")

    Signed-off-by: Jon Hunter
    Acked-by: Rhyland Klein
    Signed-off-by: Thierry Reding

    Jon Hunter
     
  • The definition, PLLU_BASE_OVERRIDE, for the pll_u OVERRIDE bit is defined
    but not used and when the OVERRIDE bit is cleared in tegra210_pll_init()
    the code directly uses the bit number. Therefore, use the definition,
    PLLU_BASE_OVERRIDE when clearing the OVERRIDE bit.

    Signed-off-by: Jon Hunter
    Acked-by: Rhyland Klein
    Signed-off-by: Thierry Reding

    Jon Hunter
     
  • If the pll_u is not configured by the bootloader, then on kernel boot the
    following warning is seen:

    clk_pll_wait_for_lock: Timed out waiting for pll pll_u_vco lock
    tegra_init_from_table: Failed to enable pll_u_out1
    ------------[ cut here ]------------
    WARNING: at drivers/clk/tegra/clk.c:269
    Modules linked in:

    CPU: 0 PID: 1 Comm: swapper/0 Not tainted 4.4.0-rc4-next-20151214+ #1
    Hardware name: NVIDIA Tegra210 P2371 reference board (E.1) (DT)
    task: ffffffc0bc0a0000 ti: ffffffc0bc0a8000 task.ti: ffffffc0bc0a8000
    PC is at tegra_init_from_table+0x140/0x164
    LR is at tegra_init_from_table+0x140/0x164
    pc : [] lr : [] pstate: 80000045
    sp : ffffffc0bc0abd50
    x29: ffffffc0bc0abd50 x28: ffffffc00090b8a8
    x27: ffffffc000a06000 x26: ffffffc0bc019780
    x25: ffffffc00086a708 x24: ffffffc00086a790
    x23: ffffffc0006d7188 x22: ffffffc0bc010000
    x21: 000000000000016e x20: ffffffc0bc00d100
    x19: ffffffc000944178 x18: 0000000000000007
    x17: 000000000000000e x16: 0000000000000001
    x15: 0000000000000007 x14: 000000000000000e
    x13: 0000000000000013 x12: 000000000000001a
    x11: 000000000000004d x10: 0000000000000750
    x9 : ffffffc0bc0a8000 x8 : ffffffc0bc0a07b0
    x7 : 0000000000000001 x6 : 0000000002d5f0f8
    x5 : 0000000000000000 x4 : 0000000000000000
    x3 : 0000000000000002 x2 : ffffffc000996724
    x1 : 0000000000000000 x0 : 0000000000000032

    ---[ end trace cbd20ae519e92ced ]---
    Call trace:
    [] tegra_init_from_table+0x140/0x164
    [] tegra210_clock_apply_init_table+0x20/0x28
    [] tegra_clocks_apply_init_table+0x18/0x24
    [] do_one_initcall+0x90/0x194
    [] kernel_init_freeable+0x148/0x1e8
    [] kernel_init+0x10/0xdc
    [] ret_from_fork+0x10/0x40
    clk_pll_wait_for_lock: Timed out waiting for pll pll_u_vco lock
    tegra_init_from_table: Failed to enable pll_u_out2
    ------------[ cut here ]------------

    pll_u can be either controlled by software or hardware and this is
    selected via the OVERRIDE bit in the pll_u base register. In the function
    tegra210_pll_init(), the OVERRIDE bit for pll_u is cleared, which selects
    hardware control of the pll. However, at the same time the pll_u clocks
    are populated in the init_table for tegra210 and so software will try to
    configure the pll_u if it is not already configured and hence, the above
    warning is seen when the pll fails to lock. Remove the pll_u clocks from
    the init_table so that software does not try to configure this pll on
    boot.

    Signed-off-by: Jon Hunter
    Acked-by: Rhyland Klein
    Signed-off-by: Thierry Reding

    Jon Hunter
     
  • The EMC clock sources for Tegra210 currently incorrectly include pll_c2
    and pll_c3. However, both of these should have been pll_mb as shown in
    the TRM. If Tegra210 happens to be configured such that the pll_mb is the
    default clock for the EMC, as configured by the bootloader, then this will
    cause a system hang on boot. This is because the kernel will disable the
    pll_mb when disabling unused clock as it appears to be unused when it is
    not.

    Also add the additional pll_p clock source for the EMC.

    Signed-off-by: Jon Hunter
    Acked-by: Rhyland Klein
    Signed-off-by: Thierry Reding

    Jon Hunter