27 Oct, 2020

1 commit


16 Sep, 2020

4 commits

  • The DT bindings don't put such a constraint, nor should the kernel. It
    is perfectly fine for opp-level to be set to 0, if we need to put the
    performance state votes for a domain for a particular OPP.

    Reported-by: Stephan Gerhold
    Tested-by: Stephan Gerhold
    Signed-off-by: Viresh Kumar

    Viresh Kumar
     
  • The bindings allow multiple versions to be passed to "opp-supported-hw"
    property, either of which can result in enabling of the OPP.

    Update code to allow that.

    Tested-by: Stephan Gerhold
    Tested-by: Dmitry Osipenko
    Signed-off-by: Viresh Kumar

    Viresh Kumar
     
  • Viresh Kumar
     
  • Until now for V1 OPP bindings we used to call
    dev_pm_opp_of_cpumask_add_table() first and then
    dev_pm_opp_set_sharing_cpus() in the cpufreq-dt driver.

    A later patch will though update the cpufreq-dt driver to optimize the
    code a bit and we will call dev_pm_opp_set_sharing_cpus() first followed
    by dev_pm_opp_of_cpumask_add_table(), which doesn't work well today as
    it tries to re parse the OPP entries. This should work nevertheless for
    V1 bindings as the same works for V2 bindings.

    Adapt the same approach from V2 bindings and fix this.

    Reported-by: Marek Szyprowski
    Tested-by: Marek Szyprowski
    Signed-off-by: Viresh Kumar

    Viresh Kumar
     

25 Aug, 2020

1 commit

  • The OPP core manages various resources, e.g. clocks or interconnect paths.
    These resources are looked up when the OPP table is allocated once
    dev_pm_opp_get_opp_table() is called the first time (either directly
    or indirectly through one of the many helper functions).

    At this point, the resources may not be available yet, i.e. looking them
    up will result in -EPROBE_DEFER. Unfortunately, dev_pm_opp_get_opp_table()
    is currently unable to propagate this error code since it only returns
    the allocated OPP table or NULL.

    This means that all consumers of the OPP core are required to make sure
    that all necessary resources are available. Usually this happens by
    requesting them, checking the result and releasing them immediately after.

    For example, we have added "dev_pm_opp_of_find_icc_paths(dev, NULL)" to
    several drivers now just to make sure the interconnect providers are
    ready before the OPP table is allocated. If this call is missing,
    the OPP core will only warn about this and then attempt to continue
    without interconnect. This will eventually fail horribly, e.g.:

    cpu cpu0: _allocate_opp_table: Error finding interconnect paths: -517
    ... later ...
    of: _read_bw: Mismatch between opp-peak-kBps and paths (1 0)
    cpu cpu0: _opp_add_static_v2: opp key field not found
    cpu cpu0: _of_add_opp_table_v2: Failed to add OPP, -22

    This example happens when trying to use interconnects for a CPU OPP
    table together with qcom-cpufreq-nvmem.c. qcom-cpufreq-nvmem calls
    dev_pm_opp_set_supported_hw(), which ends up allocating the OPP table
    early. To fix the problem with the current approach we would need to add
    yet another call to dev_pm_opp_of_find_icc_paths(dev, NULL).
    But actually qcom-cpufreq-nvmem.c has nothing to do with interconnects...

    This commit attempts to make this more robust by allowing
    dev_pm_opp_get_opp_table() to return an error pointer. Fixing all
    the usages is trivial because the function is usually used indirectly
    through another helper (e.g. dev_pm_opp_set_supported_hw() above).
    These other helpers already return an error pointer.

    The example above then works correctly because set_supported_hw() will
    return -EPROBE_DEFER, and qcom-cpufreq-nvmem.c already propagates that
    error. It should also be possible to remove the remaining usages of
    "dev_pm_opp_of_find_icc_paths(dev, NULL)" from other drivers as well.

    Note that this commit currently only handles -EPROBE_DEFER for the
    clock/interconnects within _allocate_opp_table(). Other errors are just
    ignored as before. Eventually those should be propagated as well.

    Signed-off-by: Stephan Gerhold
    Acked-by: Krzysztof Kozlowski
    Reviewed-by: Ulf Hansson
    [ Viresh: skip checking return value of dev_pm_opp_get_opp_table() for
    EPROBE_DEFER in domain.c, fix NULL return value and reorder
    code a bit in core.c, and update exynos-asv.c ]
    Signed-off-by: Viresh Kumar

    Stephan Gerhold
     

24 Aug, 2020

1 commit


03 Aug, 2020

1 commit

  • * pm-em:
    OPP: refactor dev_pm_opp_of_register_em() and update related drivers
    Documentation: power: update Energy Model description
    PM / EM: change name of em_pd_energy to em_cpu_energy
    PM / EM: remove em_register_perf_domain
    PM / EM: add support for other devices than CPUs in Energy Model
    PM / EM: update callback structure and add device pointer
    PM / EM: introduce em_dev_register_perf_domain function
    PM / EM: change naming convention from 'capacity' to 'performance'

    * pm-core:
    mmc: jz4740: Use pm_ptr() macro
    PM: Make *_DEV_PM_OPS macros use __maybe_unused
    PM: core: introduce pm_ptr() macro

    Rafael J. Wysocki
     

16 Jul, 2020

1 commit

  • Currently, when using _of_add_opp_table_v2 parsed_static_opps is
    increased and this value is used in _opp_remove_all_static() to
    check if there are static opp entries that need to be freed.
    Unfortunately this does not happen when using _of_add_opp_table_v1(),
    which leads to warnings.

    This patch increases parsed_static_opps in _of_add_opp_table_v1() in a
    similar way as in _of_add_opp_table_v2().

    Fixes: 03758d60265c ("opp: Replace list_kref with a local counter")
    Cc: v5.6+ # v5.6+
    Signed-off-by: Walter Lozano
    [ Viresh: Do the operation with lock held and set the value to 1 instead
    of incrementing it ]
    Signed-off-by: Viresh Kumar

    Walter Lozano
     

24 Jun, 2020

2 commits

  • The Energy Model framework supports not only CPU devices. Drop the CPU
    specific interface with cpumask and add struct device. Add also a return
    value, user might use it. This new interface provides easy way to create
    a simple Energy Model, which then might be used by e.g. thermal subsystem.

    Acked-by: Daniel Lezcano
    Signed-off-by: Lukasz Luba
    Signed-off-by: Rafael J. Wysocki

    Lukasz Luba
     
  • The Energy Model framework is going to support devices other that CPUs. In
    order to make this happen change the callback function and add pointer to
    a device as an argument.

    Update the related users to use new function and new callback from the
    Energy Model.

    Acked-by: Quentin Perret
    Signed-off-by: Lukasz Luba
    Acked-by: Daniel Lezcano
    Signed-off-by: Rafael J. Wysocki

    Lukasz Luba
     

01 Jun, 2020

1 commit

  • The DT node of the device may contain interconnect paths while the OPP
    table doesn't have the bandwidth values. There is no need to parse the
    paths in such cases.

    Signed-off-by: Sibi Sankar
    Tested-by: Sibi Sankar
    Reviewed-by: Sibi Sankar
    [ Viresh: Support the case of !opp_table and massaged changelog ]
    Signed-off-by: Viresh Kumar

    Sibi Sankar
     

29 May, 2020

2 commits

  • When we read the OPP keys, it would be nice to do some sanity checks
    of the values we get from DT and see if they match with the information
    that is populated in the OPP table. Let's pass a pointer of the table,
    so that we can do some validation.

    Signed-off-by: Georgi Djakov
    Reviewed-by: Matthias Kaehlcke
    Reviewed-by: Sibi Sankar
    [ Viresh: Fix rebase conflicts ]
    Signed-off-by: Viresh Kumar

    Georgi Djakov
     
  • The OPP bindings now support bandwidth values, so add support to parse it
    from device tree and store it into the new dev_pm_opp_icc_bw struct, which
    is part of the dev_pm_opp.

    Signed-off-by: Georgi Djakov
    Reviewed-by: Matthias Kaehlcke
    [ Viresh: Create _read_bw() and use it, renamed _of_find_icc_paths() to
    dev_pm_opp_of_find_icc_paths(), exported it and made opp_table
    argument optional. Also drop the depends on from Kconfig. ]
    Signed-off-by: Viresh Kumar

    Georgi Djakov
     

13 May, 2020

1 commit

  • The opp-hz DT property is not mandatory and we may use another property
    as a key in the OPP table. Add helper functions to simplify the reading
    and comparing the keys.

    Signed-off-by: Saravana Kannan
    Signed-off-by: Georgi Djakov
    Reviewed-by: Matthias Kaehlcke
    Reviewed-by: Sibi Sankar
    [ Viresh: Removed an unnecessary comment ]
    Signed-off-by: Viresh Kumar

    Saravana Kannan
     

10 Dec, 2019

2 commits

  • A kref or refcount isn't the right tool to be used here for counting
    number of devices that are sharing the static OPPs created for the OPP
    table. For example, we are reinitializing the kref again, after it
    reaches a value of 0 and frees the resources, if the static OPPs get
    added for the same OPP table structure (as the OPP table structure was
    never freed). That is messy and very unclear.

    This patch makes parsed_static_opps an unsigned integer and uses it to
    count the number of users of the static OPPs. The increment and
    decrement to parsed_static_opps is done under opp_table->lock now to
    make sure no races are possible if the OPP table is getting added and
    removed in parallel (which doesn't happen in practice, but can in
    theory).

    Signed-off-by: Viresh Kumar

    Viresh Kumar
     
  • The static OPPs aren't getting freed properly, if errors occur while
    adding them. Fix that by calling _put_opp_list_kref() and putting their
    reference on failures.

    Fixes: 11e1a1648298 ("opp: Don't decrement uninitialized list_kref")
    Signed-off-by: Viresh Kumar

    Viresh Kumar
     

23 Oct, 2019

1 commit

  • The list_kref reaches a count of 0 when all the static OPPs are removed,
    for example when dev_pm_opp_of_cpumask_remove_table() is called, though
    the actual OPP table may not get freed as it may still be referenced by
    other parts of the kernel, like from a call to
    dev_pm_opp_set_supported_hw(). And if we call
    dev_pm_opp_of_cpumask_add_table() again at this point, we must
    reinitialize the list_kref otherwise the kernel will hit a WARN() in
    kref infrastructure for incrementing a kref with value 0.

    Fixes: 11e1a1648298 ("opp: Don't decrement uninitialized list_kref")
    Reported-by: Dmitry Osipenko
    Tested-by: Dmitry Osipenko
    Signed-off-by: Viresh Kumar

    Viresh Kumar
     

10 Oct, 2019

1 commit

  • _find_opp_of_np() doesn't traverse the list of OPP tables but instead
    just the entries within an OPP table and so only requires to lock the
    OPP table itself.

    The lockdep_assert_held() was added there by mistake and isn't really
    required.

    Fixes: 5d6d106fa455 ("OPP: Populate required opp tables from "required-opps" property")
    Cc: v5.0+ # v5.0+
    Reported-by: Niklas Cassel
    Signed-off-by: Viresh Kumar

    Viresh Kumar
     

26 Jul, 2019

2 commits

  • With property "opp-supported-hw" introduced, the OPP table
    in DT could be a large OPP table and ONLY a subset of OPPs
    are available, based on the version of the hardware running
    on. That introduces restriction of using "opp-suspend"
    property to define the suspend OPP, as we are NOT sure if the
    OPP containing "opp-suspend" property is available for the
    hardware running on, and the of opp core does NOT allow multiple
    suspend OPPs defined in DT OPP table.

    To eliminate this restrition, make of opp core allow multiple
    suspend OPPs defined in DT, and pick the OPP with highest rate
    and with "opp-suspend" property present to be suspend OPP, it
    can speed up the suspend/resume process.

    Signed-off-by: Anson Huang
    Signed-off-by: Viresh Kumar

    Anson Huang
     
  • The list_kref was added for static OPPs and to track their users. The
    kref is initialized while the static OPPs are added, but removed
    unconditionally even if the static OPPs were never added. This causes
    refcount mismatch warnings currently.

    Fix that by always initializing the kref when the OPP table is first
    initialized. The refcount is later incremented only for the second user
    onwards.

    Fixes: d0e8ae6c26da ("OPP: Create separate kref for static OPPs list")
    Reported-by: Rajendra Nayak
    Signed-off-by: Viresh Kumar

    Viresh Kumar
     

26 Jun, 2019

1 commit

  • Pull operating performance points (OPP) framework changes for v5.3
    from Viresh Kumar:

    "This pull request contains:

    - OPP core changes to support a wider range of devices, like IO
    devices (Rajendra Nayak and Stehpen Boyd).
    - Fixes around genpd_virt_devs (Viresh Kumar).
    - Fix for platform with set_opp() callback (Dmitry Osipenko)."

    * 'opp/linux-next' of git://git.kernel.org/pub/scm/linux/kernel/git/vireshk/pm:
    opp: Don't use IS_ERR on invalid supplies
    opp: Make dev_pm_opp_set_rate() handle freq = 0 to drop performance votes
    opp: Don't overwrite rounded clk rate
    opp: Allocate genpd_virt_devs from dev_pm_opp_attach_genpd()
    opp: Attach genpds to devices from within OPP core

    Rafael J. Wysocki
     

19 Jun, 2019

1 commit

  • Based on 2 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 version 2 as
    published by the free software foundation

    this program is free software you can redistribute it and or modify
    it under the terms of the gnu general public license version 2 as
    published by the free software foundation #

    extracted by the scancode license scanner the SPDX license identifier

    GPL-2.0-only

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

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

    Thomas Gleixner
     

20 May, 2019

1 commit

  • Currently the space for the array of virtual devices is allocated along
    with the OPP table, but that isn't going to work well from now onwards.
    For single power domain case, a driver can either use the original
    device structure for setting the performance state (if genpd attached
    with dev_pm_domain_attach()) or use the virtual device structure (if
    genpd attached with dev_pm_domain_attach_by_name(), which returns the
    virtual device) and so we can't know in advance if we are going to need
    genpd_virt_devs array or not.

    Lets delay the allocation a bit and do it along with
    dev_pm_opp_attach_genpd() rather. The deallocation is done from
    dev_pm_opp_detach_genpd().

    Tested-by: Niklas Cassel
    Signed-off-by: Viresh Kumar

    Viresh Kumar
     

11 Mar, 2019

1 commit

  • We seem to rely on the number of phandles specified in the
    'required-opps' property to identify cases where a device is
    associated with multiple power domains and hence would have
    multiple virtual devices that have to be dealt with.

    In cases where we do have devices with multiple power domains
    but with only one of them being scalable, this logic seems to
    fail.

    Instead read the number of power domains from DT to identify
    such cases.

    Signed-off-by: Rajendra Nayak
    Reviewed-by: Stephen Boyd
    Acked-by: Viresh Kumar
    Signed-off-by: Rafael J. Wysocki

    Rajendra Nayak
     

07 Mar, 2019

1 commit

  • Pull power management updates from Rafael Wysocki:
    "These are PM-runtime framework changes to use ktime instead of jiffies
    for accounting, new PM core flag to mark devices that don't need any
    form of power management, cpuidle updates including driver API
    documentation and a new governor, cpufreq updates including a new
    driver for Armada 8K, thermal cleanups and more, some energy-aware
    scheduling (EAS) enabling changes, new chips support in the intel_idle
    and RAPL drivers and assorted cleanups in some other places.

    Specifics:

    - Update the PM-runtime framework to use ktime instead of jiffies for
    accounting (Thara Gopinath, Vincent Guittot)

    - Optimize the autosuspend code in the PM-runtime framework somewhat
    (Ladislav Michl)

    - Add a PM core flag to mark devices that don't need any form of
    power management (Sudeep Holla)

    - Introduce driver API documentation for cpuidle and add a new
    cpuidle governor for tickless systems (Rafael Wysocki)

    - Add Jacobsville support to the intel_idle driver (Zhang Rui)

    - Clean up a cpuidle core header file and the cpuidle-dt and ACPI
    processor-idle drivers (Yangtao Li, Joseph Lo, Yazen Ghannam)

    - Add new cpufreq driver for Armada 8K (Gregory Clement)

    - Fix and clean up cpufreq core (Rafael Wysocki, Viresh Kumar, Amit
    Kucheria)

    - Add support for light-weight tear-down and bring-up of CPUs to the
    cpufreq core and use it in the cpufreq-dt driver (Viresh Kumar)

    - Fix cpu_cooling Kconfig dependencies, add support for CPU cooling
    auto-registration to the cpufreq core and use it in multiple
    cpufreq drivers (Amit Kucheria)

    - Fix some minor issues and do some cleanups in the davinci,
    e_powersaver, ap806, s5pv210, qcom and kryo cpufreq drivers
    (Bartosz Golaszewski, Gustavo Silva, Julia Lawall, Paweł Chmiel,
    Taniya Das, Viresh Kumar)

    - Add a Hisilicon CPPC quirk to the cppc_cpufreq driver (Xiongfeng
    Wang)

    - Clean up the intel_pstate and acpi-cpufreq drivers (Erwan Velu,
    Rafael Wysocki)

    - Clean up multiple cpufreq drivers (Yangtao Li)

    - Update cpufreq-related MAINTAINERS entries (Baruch Siach, Lukas
    Bulwahn)

    - Add support for exposing the Energy Model via debugfs and make
    multiple cpufreq drivers register an Energy Model to support
    energy-aware scheduling (Quentin Perret, Dietmar Eggemann, Matthias
    Kaehlcke)

    - Add Ice Lake mobile and Jacobsville support to the Intel RAPL
    power-capping driver (Gayatri Kammela, Zhang Rui)

    - Add a power estimation helper to the operating performance points
    (OPP) framework and clean up a core function in it (Quentin Perret,
    Viresh Kumar)

    - Make minor improvements in the generic power domains (genpd), OPP
    and system suspend frameworks and in the PM core (Aditya Pakki,
    Douglas Anderson, Greg Kroah-Hartman, Rafael Wysocki, Yangtao Li)"

    * tag 'pm-5.1-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm: (80 commits)
    cpufreq: kryo: Release OPP tables on module removal
    cpufreq: ap806: add missing of_node_put after of_device_is_available
    cpufreq: acpi-cpufreq: Report if CPU doesn't support boost technologies
    cpufreq: Pass updated policy to driver ->setpolicy() callback
    cpufreq: Fix two debug messages in cpufreq_set_policy()
    cpufreq: Reorder and simplify cpufreq_update_policy()
    cpufreq: Add kerneldoc comments for two core functions
    PM / core: Add support to skip power management in device/driver model
    cpufreq: intel_pstate: Rework iowait boosting to be less aggressive
    cpufreq: intel_pstate: Eliminate intel_pstate_get_base_pstate()
    cpufreq: intel_pstate: Avoid redundant initialization of local vars
    powercap/intel_rapl: add Ice Lake mobile
    ACPI / processor: Set P_LVL{2,3} idle state descriptions
    cpufreq / cppc: Work around for Hisilicon CPPC cpufreq
    ACPI / CPPC: Add a helper to get desired performance
    cpufreq: davinci: move configuration to include/linux/platform_data
    cpufreq: speedstep: convert BUG() to BUG_ON()
    cpufreq: powernv: fix missing check of return value in init_powernv_pstates()
    cpufreq: longhaul: remove unneeded semicolon
    cpufreq: pcc-cpufreq: remove unneeded semicolon
    ..

    Linus Torvalds
     

07 Feb, 2019

1 commit

  • The Energy Model (EM) framework provides an API to let drivers register
    the active power of CPUs. The drivers are expected to provide a callback
    method which estimates the power consumed by a CPU at each available
    performance levels. How exactly this should be implemented, however,
    depends on the platform.

    On some systems, PM_OPP knows the voltage and frequency at which CPUs
    can run. When coupled with the CPU 'capacitance' (as provided by the
    'dynamic-power-coefficient' devicetree binding), it is possible to
    estimate the dynamic power consumption of a CPU as P = C * V^2 * f, with
    C its capacitance and V and f respectively the voltage and frequency of
    the OPP. The Intelligent Power Allocator (IPA) thermal governor already
    implements that estimation method, in the thermal framework.

    However, this power estimation method can be applied to any platform
    where all the parameters are known (C, V and f), and not only those
    suffering thermal issues. As such, the code implementing this feature
    can be re-used to also populate the EM framework now used by EAS.

    As a first step, introduce in PM_OPP a helper function which CPUFreq
    drivers can use to register into the EM framework. This duplicates the
    power estimation done in IPA until it can be migrated to using the EM
    framework. This will be done later, once the EM framework has support
    for at least all platforms currently supported by IPA.

    Signed-off-by: Quentin Perret
    Tested-by: Matthias Kaehlcke
    Reviewed-by: Matthias Kaehlcke
    Signed-off-by: Viresh Kumar

    Quentin Perret
     

23 Jan, 2019

1 commit

  • Now that the OPP bindings are updated to include an optional
    'opp-level' property, add support to parse it from device tree
    and store it as part of dev_pm_opp structure.
    Also add and export an helper 'dev_pm_opp_get_level()' that can be
    used to get the level value read from device tree when present.

    Reviewed-by: Stephen Boyd
    Acked-by: Viresh Kumar
    Signed-off-by: Rajendra Nayak
    Signed-off-by: Bjorn Andersson
    Signed-off-by: Andy Gross

    Rajendra Nayak
     

14 Dec, 2018

3 commits


11 Dec, 2018

1 commit

  • There is one case where we may end up with no "supply" directory for the
    OPPs in debugfs. That happens when the OPP core isn't managing the
    regulators for the device and the device's OPP do have microvolt
    property. It happens because the opp_table->regulator_count remains set
    to 0 and the debugfs routines don't add any supply directory in such a
    case.

    This commit fixes that by setting opp_table->regulator_count to 1 in
    that particular case. But to make everything work nicely and not break
    other parts of the core, regulator_count is defined as "int" now instead
    of "unsigned int" and it can have different special values now. It is
    set to -1 initially to mark it "uninitialized" and later only we set it
    to 0 or positive values after checking how many supplies are there.

    This also helps in finding the bugs where only few of the OPPs have the
    "opp-microvolt" property set and not all.

    Fixes: 1fae788ed640 ("PM / OPP: Don't create debugfs "supply-0" directory unnecessarily")
    Reported-by: Quentin Perret
    Signed-off-by: Viresh Kumar

    Viresh Kumar
     

23 Nov, 2018

1 commit


05 Nov, 2018

7 commits

  • This isn't used anymore, remove it.

    Reviewed-by: Ulf Hansson
    Signed-off-by: Viresh Kumar

    Viresh Kumar
     
  • The OPP core already has the performance state values for each of the
    genpd's OPPs and there is no need to call the genpd callback again to
    get the performance state for the case where the end device doesn't have
    an OPP table and has the "required-opps" property directly in its node.

    This commit renames of_genpd_opp_to_performance_state() as
    of_get_required_opp_performance_state() and moves it to the OPP core, as
    it is all about OPP stuff now.

    Reviewed-by: Ulf Hansson
    Signed-off-by: Viresh Kumar

    Viresh Kumar
     
  • Now that all the infrastructure is in place to support multiple required
    OPPs, lets switch over to using it.

    A new internal routine _set_required_opps() takes care of updating
    performance state for all the required OPPs. With this the performance
    state updates are supported even when the end device needs to configure
    regulators as well, that wasn't the case earlier.

    The pstates were earlier stored in the end device's OPP structures, that
    also changes now as those values are stored in the genpd's OPP
    structures. And so we switch over to using
    pm_genpd_opp_to_performance_state() instead of
    of_genpd_opp_to_performance_state() to get performance state for the
    genpd OPPs.

    The routine _generic_set_opp_domain() is not required anymore and is
    removed.

    On errors we don't try to recover by reverting to old settings as things
    are really complex now and the calls here should never really fail
    unless there is a bug. There is no point increasing the complexity, for
    code which will never be executed.

    Reviewed-by: Ulf Hansson
    Signed-off-by: Viresh Kumar

    Viresh Kumar
     
  • Multiple generic power domains for a consumer device are supported with
    the help of virtual devices, which are created for each consumer device
    - genpd pair. These are the device structures which are attached to the
    power domain and are required by the OPP core to set the performance
    state of the genpd.

    The helpers added by this commit are required to be called once for each
    of these virtual devices. These are required only if multiple domains
    are available for a device, otherwise the actual device structure will
    be used instead by the OPP core.

    The new helpers also support the complex cases where the consumer device
    wouldn't always require all the domains. For example, a camera may
    require only one power domain during normal operations but two during
    high resolution operations. The consumer driver can call
    dev_pm_opp_put_genpd_virt_dev(high_resolution_genpd_virt_dev) if it is
    currently operating in the normal mode and doesn't have any performance
    requirements from the genpd which manages high resolution power
    requirements. The consumer driver can later call
    dev_pm_opp_set_genpd_virt_dev(high_resolution_genpd_virt_dev) once it
    switches back to the high resolution mode.

    The new helpers differ from other OPP set/put helpers as the new ones
    can be called with OPPs initialized for the table as we may need to call
    them on the fly because of the complex case explained above. For this
    reason it is possible that the genpd virt_dev structure may be used in
    parallel while the new helpers are running and a new mutex is added to
    protect against that. We didn't use the existing opp_table->lock mutex
    as that is widely used in the OPP core and we will need this lock in the
    dev_pm_opp_set_rate() helper while changing OPP and we need to make sure
    there is not much contention while doing that as that's the hotpath.

    Reviewed-by: Ulf Hansson
    Signed-off-by: Viresh Kumar

    Viresh Kumar
     
  • An earlier commit populated the OPP tables from the "required-opps"
    property, this commit populates the individual OPPs. This is repeated
    for each OPP in the OPP table and these populated OPPs will be used by
    later commits.

    Reviewed-by: Ulf Hansson
    Signed-off-by: Viresh Kumar

    Viresh Kumar
     
  • The current implementation works only for the case where a single
    phandle is present in the "required-opps" property, while DT allows
    multiple phandles to be present there.

    This patch adds new infrastructure to parse all the phandles present in
    "required-opps" property and save pointers of the required OPP's OPP
    tables. These will be used by later commits.

    Reviewed-by: Ulf Hansson
    Signed-off-by: Viresh Kumar

    Viresh Kumar
     
  • We need to handle genpd OPP tables differently, this is already the case
    at one location and will be extended going forward. Add another field to
    the OPP table to check if the table belongs to a genpd or not.

    Reviewed-by: Ulf Hansson
    Signed-off-by: Viresh Kumar

    Viresh Kumar