• Dmitry Osipenko's avatar
    clk: tegra: Support runtime PM and power domain · b1bc04a2
    Dmitry Osipenko authored
    The Clock-and-Reset controller resides in a core power domain on NVIDIA
    Tegra SoCs.  In order to support voltage scaling of the core power domain,
    we hook up DVFS-capable clocks to the core GENPD for managing of the
    GENPD's performance state based on the clock changes.
    
    Some clocks don't have any specific physical hardware unit that backs
    them, like root PLLs and system clock and they have theirs own voltage
    requirements.  This patch adds new clk-device driver that backs the clocks
    and provides runtime PM functionality for them.  A virtual clk-device is
    created for each such DVFS-capable clock at the clock's registration time
    by the new tegra_clk_register() helper.  Driver changes clock's device
    GENPD performance state based on clk-rate notifications.
    
    In result we have this sequence of events:
    
      1. Clock driver creates virtual device for selective clocks, enables
         runtime PM for the created device and registers the clock.
      2. Clk-device driver starts to listen to clock rate changes.
      3. Something changes clk rate or enables/disables clk.
      4. CCF core propagates the change through the clk tree.
      5. Clk-device driver gets clock rate-change notification or GENPD core
         handles prepare/unprepare of the clock.
      6. Clk-device driver changes GENPD performance state on clock rate
         change.
      7. GENPD driver changes voltage regulator state change.
      8. The regulator state is committed to hardware via I2C.
    
    We rely on fact that DVFS is not needed for Tegra I2C and that Tegra I2C
    driver already keeps clock always-prepared.  Hence I2C subsystem stays
    independent from the clk power management and there are no deadlock spots
    in the sequence.
    
    Currently all clocks are registered very early during kernel boot when the
    device driver core isn't available yet.  The clk-device can't be created
    at that time.  This patch splits the registration of the clocks in two
    phases:
    
      1. Register all essential clocks which don't use RPM and are needed
         during early boot.
    
      2. Register at a later boot time the rest of clocks.
    
    This patch adds power management support for Tegra20 and Tegra30 clocks.
    Reviewed-by: default avatarUlf Hansson <ulf.hansson@linaro.org>
    Tested-by: Peter Geis <pgwipeout@gmail.com> # Ouya T30
    Tested-by: Paul Fertser <fercerpav@gmail.com> # PAZ00 T20
    Tested-by: Nicolas Chauvet <kwizart@gmail.com> # PAZ00 T20 and TK1 T124
    Tested-by: Matt Merhar <mattmerhar@protonmail.com> # Ouya T30
    Signed-off-by: default avatarDmitry Osipenko <digetx@gmail.com>
    Signed-off-by: default avatarThierry Reding <treding@nvidia.com>
    b1bc04a2
clk-device.c 5.1 KB