02 Dec, 2011

1 commit

  • Make the runtime PM core use device PM QoS constraints to check if
    it is allowed to suspend a given device, so that an error code is
    returned if the device's own PM QoS constraint is negative or one of
    its children has already been suspended for too long. If this is
    not the case, the maximum estimated time the device is allowed to be
    suspended, computed as the minimum of the device's PM QoS constraint
    and the PM QoS constraints of its children (reduced by the difference
    between the current time and their suspend times) is stored in a new
    device's PM field power.max_time_suspended_ns that can be used by
    the device's subsystem or PM domain to decide whether or not to put
    the device into lower-power (and presumably higher-latency) states
    later (if the constraint is 0, which means "no constraint", the
    power.max_time_suspended_ns is set to -1).

    Additionally, the time of execution of the subsystem-level
    .runtime_suspend() callback for the device is recorded in the new
    power.suspend_time field for later use by the device's subsystem or
    PM domain along with power.max_time_suspended_ns (it also is used
    by the core code when the device's parent is suspended).

    Introduce a new helper function,
    pm_runtime_update_max_time_suspended(), allowing subsystems and PM
    domains (or device drivers) to update the power.max_time_suspended_ns
    field, for example after changing the power state of a suspended
    device.

    Signed-off-by: Rafael J. Wysocki

    Rafael J. Wysocki
     

18 Nov, 2011

1 commit

  • Commit 4ca46ff3e0d8c234cb40ebb6457653b59584426c (PM / Sleep: Mark
    devices involved in wakeup signaling during suspend) introduced
    the power.wakeup_path field in struct dev_pm_info to mark devices
    whose children are enabled to wake up the system from sleep states,
    so that power domains containing the parents that provide their
    children with wakeup power and/or relay their wakeup signals are not
    turned off. Unfortunately, that introduced a PM regression on SH7372
    whose power consumption in the system "memory sleep" state increased
    as a result of it, because it prevented the power domain containing
    the I2C controller from being turned off when some children of that
    controller were enabled to wake up the system, although the
    controller was not necessary for them to signal wakeup.

    To fix this issue use the observation that devices whose
    power.ignore_children flag is set for runtime PM should be treated
    analogously during system suspend. Namely, they shouldn't be
    included in wakeup paths going through their children. Since the
    SH7372 I2C controller's power.ignore_children flag is set, doing so
    will restore the previous behavior of that SOC.

    Signed-off-by: Rafael J. Wysocki
    Acked-by: Greg Kroah-Hartman

    Rafael J. Wysocki
     

01 Nov, 2011

1 commit


25 Aug, 2011

3 commits

  • Since the PM clock management code in drivers/base/power/clock_ops.c
    is used for both runtime PM and system suspend/hibernation, the
    definitions of data structures and headers related to it should not
    be located in include/linux/pm_rumtime.h. Move them to a separate
    header file.

    Signed-off-by: Rafael J. Wysocki

    Rafael J. Wysocki
     
  • Currently pm_genpd_runtime_resume() has to walk the list of devices
    from the device's PM domain to find the corresponding device list
    object containing the need_restore field to check if the driver's
    .runtime_resume() callback should be executed for the device.
    This is suboptimal and can be simplified by using power.sybsys_data
    to store device information used by the generic PM domains code.

    Signed-off-by: Rafael J. Wysocki

    Rafael J. Wysocki
     
  • Introduce struct pm_subsys_data that may be subclassed by subsystems
    to store subsystem-specific information related to the device. Move
    the clock management fields accessed through the power.subsys_data
    pointer in struct device to the new strucutre.

    Signed-off-by: Rafael J. Wysocki

    Rafael J. Wysocki
     

12 Jul, 2011

1 commit


02 Jul, 2011

3 commits

  • The common PM clock management functions may be used for system
    suspend/resume as well as for runtime PM, so rename them
    accordingly. Modify kerneldoc comments describing these functions
    and kernel messages printed by them, so that they refer to power
    management in general rather that to runtime PM.

    Signed-off-by: Rafael J. Wysocki
    Reviewed-by: Kevin Hilman

    Rafael J. Wysocki
     
  • The common clocks management code in drivers/base/power/clock_ops.c
    is going to be used during system-wide power transitions as well as
    for runtime PM, so it shouldn't depend on CONFIG_PM_RUNTIME.
    However, the suspend/resume functions provided by it for
    CONFIG_PM_RUNTIME unset, to be used during system-wide power
    transitions, should not behave in the same way as their counterparts
    defined for CONFIG_PM_RUNTIME set, because in that case the clocks
    are managed differently at run time.

    The names of the functions still contain the word "runtime" after
    this change, but that is going to be modified by a separate patch
    later.

    Signed-off-by: Rafael J. Wysocki
    Reviewed-by: Kevin Hilman

    Rafael J. Wysocki
     
  • The naming convention used by commit 7538e3db6e015e890825fbd9f86599b
    (PM: Add support for device power domains), which introduced the
    struct dev_power_domain type for representing device power domains,
    evidently confuses some developers who tend to think that objects
    of this type must correspond to "power domains" as defined by
    hardware, which is not the case. Namely, at the kernel level, a
    struct dev_power_domain object can represent arbitrary set of devices
    that are mutually dependent power management-wise and need not belong
    to one hardware power domain. To avoid that confusion, rename struct
    dev_power_domain to struct dev_pm_domain and rename the related
    pointers in struct device and struct pm_clk_notifier_block from
    pwr_domain to pm_domain.

    Signed-off-by: Rafael J. Wysocki
    Acked-by: Kevin Hilman

    Rafael J. Wysocki
     

30 Apr, 2011

1 commit

  • Many different platforms and subsystems may want to disable device
    clocks during suspend and enable them during resume which is going to
    be done in a very similar way in all those cases. For this reason,
    provide generic routines for the manipulation of device clocks during
    suspend and resume.

    Convert the ARM shmobile platform to using the new routines.

    Signed-off-by: Rafael J. Wysocki

    Rafael J. Wysocki
     

15 Mar, 2011

1 commit

  • Currently, wakeup sysfs attributes are created for all devices,
    regardless of whether or not they are wakeup-capable. This is
    excessive and complicates wakeup device identification from user
    space (i.e. to identify wakeup-capable devices user space has to read
    /sys/devices/.../power/wakeup for all devices and see if they are not
    empty).

    Fix this issue by avoiding to create wakeup sysfs files for devices
    that cannot wake up the system from sleep states (i.e. whose
    power.can_wakeup flags are unset during registration) and modify
    device_set_wakeup_capable() so that it adds (or removes) the relevant
    sysfs attributes if a device's wakeup capability status is changed.

    Signed-off-by: Rafael J. Wysocki

    Rafael J. Wysocki
     

24 Dec, 2010

2 commits

  • The __pm_generic_resume() function changes the given device's runtime
    PM status to RPM_ACTIVE if its driver's callback returns 0, but it
    only should do that if the rumtime PM is enabled for the device.

    Signed-off-by: Rafael J. Wysocki

    Rafael J. Wysocki
     
  • This patch (as1431c) makes the synchronous runtime-PM interface
    suitable for use in interrupt handlers. Subsystems can call the new
    pm_runtime_irq_safe() function to tell the PM core that a device's
    runtime_suspend and runtime_resume callbacks should be invoked with
    interrupts disabled and the spinlock held. This permits the
    pm_runtime_get_sync() and the new pm_runtime_put_sync_suspend()
    routines to be called from within interrupt handlers.

    When a device is declared irq-safe in this way, the PM core increments
    the parent's usage count, so the parent will never be runtime
    suspended. This prevents difficult situations in which an irq-safe
    device can't resume because it is forced to wait for its non-irq-safe
    parent.

    Signed-off-by: Alan Stern
    Signed-off-by: Rafael J. Wysocki

    Alan Stern
     

17 Dec, 2010

1 commit

  • There are some situations (e.g. in __pm_generic_call()), where
    pm_runtime_suspended() is used to decide whether or not to execute
    a device's (system) ->suspend() callback. The callback is not
    executed if pm_runtime_suspended() returns true, but it does so
    for devices that don't even support runtime PM, because the
    power.disable_depth device field is ignored by it. This leads to
    problems (i.e. devices are not suspened when they should), so rework
    pm_runtime_suspended() so that it returns false if the device's
    power.disable_depth field is different from zero.

    Signed-off-by: Rafael J. Wysocki
    Cc: stable@kernel.org

    Rafael J. Wysocki
     

17 Oct, 2010

5 commits

  • The patch "PM / Runtime: Implement autosuspend support" introduces
    "autosuspend" facility for runtime PM, but misses helper function
    of pm_request_autosuspend, so add it.

    Signed-off-by: Ming Lei
    Signed-off-by: Rafael J. Wysocki

    Ming Lei
     
  • This patch (as1427) implements the "autosuspend" facility for runtime
    PM. A few new fields are added to the dev_pm_info structure and
    several new PM helper functions are defined, for telling the PM core
    whether or not a device uses autosuspend, for setting the autosuspend
    delay, and for marking periods of device activity.

    Drivers that do not want to use autosuspend can continue using the
    same helper functions as before; their behavior will not change. In
    addition, drivers supporting autosuspend can also call the old helper
    functions to get the old behavior.

    The details are all explained in Documentation/power/runtime_pm.txt
    and Documentation/ABI/testing/sysfs-devices-power.

    Signed-off-by: Alan Stern
    Signed-off-by: Rafael J. Wysocki

    Alan Stern
     
  • Some devices, such as USB interfaces, cannot be power-managed
    independently of their parents, i.e., they cannot be put in low power
    while the parent remains at full power. This patch (as1425) creates a
    new "no_callbacks" flag, which tells the PM core not to invoke the
    runtime-PM callback routines for the such devices but instead to
    assume that the callbacks always succeed. In addition, the
    non-debugging runtime-PM sysfs attributes for the devices are removed,
    since they are pretty much meaningless.

    The advantage of this scheme comes not so much from avoiding the
    callbacks themselves, but rather from the fact that without the need
    for a process context in which to run the callbacks, more work can be
    done in interrupt context.

    Signed-off-by: Alan Stern
    Signed-off-by: Rafael J. Wysocki

    Alan Stern
     
  • This patch (as1424) combines the various public entry points for the
    runtime PM routines into three simple functions: one for idle, one for
    suspend, and one for resume. A new bitflag specifies whether or not
    to increment or decrement the usage_count field.

    The new entry points are named __pm_runtime_idle,
    __pm_runtime_suspend, and __pm_runtime_resume, to reflect that they
    are trampolines. Simultaneously, the corresponding internal routines
    are renamed to rpm_idle, rpm_suspend, and rpm_resume.

    Signed-off-by: Alan Stern
    Signed-off-by: Rafael J. Wysocki

    Alan Stern
     
  • The "from_wq" argument in __pm_runtime_suspend() and
    __pm_runtime_resume() supposedly indicates whether or not the function
    was called by the PM workqueue thread, but in fact it isn't always
    used this way. It really indicates whether or not the function should
    return early if the requested operation is already in progress.

    Along with this badly-named boolean argument, later patches in this
    series will add several other boolean arguments to these functions and
    others. Therefore this patch (as1422) begins the conversion process
    by replacing from_wq with a bitflag argument. The same bitflags are
    also used in __pm_runtime_get() and __pm_runtime_put(), where they
    indicate whether or not the operation should be asynchronous.

    Signed-off-by: Alan Stern
    Signed-off-by: Rafael J. Wysocki

    Alan Stern
     

11 May, 2010

1 commit

  • There are three issues with the i2c bus type's power management
    callbacks at the moment. First, they don't include any hibernate
    callbacks, although they should at least include the .restore()
    callback (there's no guarantee that the driver will be present in
    memory before loading the image kernel and we must restore the
    pre-hibernation state of the device). Second, the "legacy"
    callbacks are not going to be invoked by the PM core since the bus
    type's pm object is not NULL. Finally, the system sleep PM
    (ie. suspend/resume) callbacks don't check if the device has been
    already suspended at run time, in which case they should skip
    suspending it. Also, it looks like the i2c bus type can use the
    generic subsystem-level runtime PM callbacks.

    For these reasons, rework the system sleep PM callbacks provided by
    the i2c bus type to handle hibernation correctly and to invoke the
    "legacy" callbacks for drivers that provide them. In addition to
    that make the i2c bus type use the generic subsystem-level runtime
    PM callbacks.

    Signed-off-by: Rafael J. Wysocki
    Acked-by: Mark Brown
    Acked-by: Jean Delvare

    Rafael J. Wysocki
     

07 Mar, 2010

1 commit

  • There are subsystems whose power management callbacks only need to
    invoke the callbacks provided by device drivers. Still, their system
    sleep PM callbacks should play well with the runtime PM callbacks,
    so that devices suspended at run time can be left in that state for
    a system sleep transition.

    Provide a set of generic PM callbacks for such subsystems and
    define convenience macros for populating dev_pm_ops structures.

    Signed-off-by: Rafael J. Wysocki

    Rafael J. Wysocki
     

27 Feb, 2010

1 commit

  • Add new device sysfs attribute, power/control, allowing the user
    space to block the run-time power management of the devices. If this
    attribute is set to "on", the driver of the device won't be able to power
    manage it at run time (without breaking the rules) and the device will
    always be in the full power state (except when the entire system goes
    into a sleep state).

    Signed-off-by: Rafael J. Wysocki
    Acked-by: Alan Stern

    Rafael J. Wysocki
     

06 Dec, 2009

1 commit


23 Aug, 2009

1 commit

  • Introduce a core framework for run-time power management of I/O
    devices. Add device run-time PM fields to 'struct dev_pm_info'
    and device run-time PM callbacks to 'struct dev_pm_ops'. Introduce
    a run-time PM workqueue and define some device run-time PM helper
    functions at the core level. Document all these things.

    Special thanks to Alan Stern for his help with the design and
    multiple detailed reviews of the pereceding versions of this patch
    and to Magnus Damm for testing feedback.

    Signed-off-by: Rafael J. Wysocki
    Acked-by: Magnus Damm

    Rafael J. Wysocki