05 Oct, 2011

1 commit

  • To read the current PM QoS value for a given device we need to
    make sure that the device's power.constraints object won't be
    removed while we're doing that. For this reason, put the
    operation under dev->power.lock and acquire the lock
    around the initialization and removal of power.constraints.

    Moreover, since we're using the value of power.constraints to
    determine whether or not the object is present, the
    power.constraints_state field isn't necessary any more and may be
    removed. However, dev_pm_qos_add_request() needs to check if the
    device is being removed from the system before allocating a new
    PM QoS constraints object for it, so make it use the
    power.power_state field of struct device for this purpose.

    Signed-off-by: Rafael J. Wysocki

    Rafael J. Wysocki
     

25 Aug, 2011

20 commits

  • Add a global notification chain that gets called upon changes to the
    aggregated constraint value for any device.
    The notification callbacks are passing the full constraint request data
    in order for the callees to have access to it. The current use is for the
    platform low-level code to access the target device of the constraint.

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

    Jean Pihet
     
  • Implement the per-device PM QoS constraints by creating a device
    PM QoS API, which calls the PM QoS constraints management core code.

    The per-device latency constraints data strctures are stored
    in the device dev_pm_info struct.

    The device PM code calls the init and destroy of the per-device constraints
    data struct in order to support the dynamic insertion and removal of the
    devices in the system.

    To minimize the data usage by the per-device constraints, the data struct
    is only allocated at the first call to dev_pm_qos_add_request.
    The data is later free'd when the device is removed from the system.
    A global mutex protects the constraints users from the data being
    allocated and free'd.

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

    Jean Pihet
     
  • - Misc fixes to improve code readability:
    * rename struct pm_qos_request_list to struct pm_qos_request,
    * rename pm_qos_req parameter to req in internal code,
    consistenly use req in the API parameters,
    * update the in-kernel API callers to the new parameters names,
    * rename of fields names (requests, list, node, constraints)

    Signed-off-by: Jean Pihet
    Acked-by: markgross
    Reviewed-by: Kevin Hilman
    Signed-off-by: Rafael J. Wysocki

    Jean Pihet
     
  • The PM QoS implementation files are better named
    kernel/power/qos.c and include/linux/pm_qos.h.

    The PM QoS support is compiled under the CONFIG_PM option.

    Signed-off-by: Jean Pihet
    Acked-by: markgross
    Reviewed-by: Kevin Hilman
    Signed-off-by: Rafael J. Wysocki

    Jean Pihet
     
  • 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
     
  • Since the power.subsys_data device field will be used by multiple
    filesystems, introduce a reference counting mechanism for it to avoid
    freeing it prematurely or changing its value at a wrong time.

    Make the PM clocks management code that currently is the only user of
    power.subsys_data use the new reference counting.

    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
     
  • Change the name of the second argument of pm_genpd_add_subdomain()
    so that it is (a) shorter and (b) in agreement with the name of
    the second argument of pm_genpd_add_subdomain().

    Signed-off-by: Rafael J. Wysocki

    Rafael J. Wysocki
     
  • Since it is now possible for a PM domain to have multiple masters
    instead of one parent, rename the "wait for parent" status to reflect
    the new situation.

    Signed-off-by: Rafael J. Wysocki

    Rafael J. Wysocki
     
  • Currently, for a given generic PM domain there may be only one parent
    domain (i.e. a PM domain it depends on). However, there is at least
    one real-life case in which there should be two parents (masters) for
    one PM domain (the A3RV domain on SH7372 turns out to depend on the
    A4LC domain and it depends on the A4R domain and the same time). For
    this reason, allow a PM domain to have multiple parents (masters) by
    introducing objects representing links between PM domains.

    The (logical) links between PM domains represent relationships in
    which one domain is a master (i.e. it is depended on) and another
    domain is a slave (i.e. it depends on the master) with the rule that
    the slave cannot be powered on if the master is not powered on and
    the master cannot be powered off if the slave is not powered off.
    Each struct generic_pm_domain object representing a PM domain has
    two lists of links, a list of links in which it is a master and
    a list of links in which it is a slave. The first of these lists
    replaces the list of subdomains and the second one is used in place
    of the parent pointer.

    Each link is represented by struct gpd_link object containing
    pointers to the master and the slave and two struct list_head
    members allowing it to hook into two lists (the master's list
    of "master" links and the slave's list of "slave" links). This
    allows the code to get to the link from each side (either from
    the master or from the slave) and follow it in each direction.

    Signed-off-by: Rafael J. Wysocki

    Rafael J. Wysocki
     
  • The next patch will make it possible for a generic PM domain to have
    multiple parents (i.e. multiple PM domains it depends on). To
    prepare for that change it is necessary to change pm_genpd_poweron()
    so that it doesn't jump to the start label after running itself
    recursively for the parent domain. For this purpose, introduce a new
    PM domain status value GPD_STATE_WAIT_PARENT that will be set by
    pm_genpd_poweron() before calling itself recursively for the parent
    domain and modify the code in drivers/base/power/domain.c so that
    the GPD_STATE_WAIT_PARENT status is guaranteed to be preserved during
    the execution of pm_genpd_poweron() for the parent.

    This change also causes pm_genpd_add_subdomain() and
    pm_genpd_remove_subdomain() to wait for started pm_genpd_poweron() to
    complete and allows pm_genpd_runtime_resume() to avoid dropping the
    lock after powering on the PM domain.

    Signed-off-by: Rafael J. Wysocki

    Rafael J. Wysocki
     
  • If pm_genpd_remove_subdomain() is called to remove a PM domain's
    subdomain and pm_genpd_poweron() is called for that subdomain at
    the same time, and the pm_genpd_poweron() called by it recursively
    for the parent returns an error, the first pm_genpd_poweron()'s
    error code path will attempt to decrement the subdomain counter of
    a PM domain that it's not a subdomain of any more.

    Rearrange the code in pm_genpd_poweron() to prevent this from
    happening.

    Signed-off-by: Rafael J. Wysocki

    Rafael J. Wysocki
     
  • After the subdomain counter in struct generic_pm_domain has been
    changed into an atomic_t field, it is possible to modify
    pm_genpd_poweron() and pm_genpd_poweroff() so that they don't take
    the parents locks. This requires pm_genpd_poweron() to increment
    the parent's subdomain counter before calling itself recursively
    for the parent and to decrement it if an error is to be returned.

    Signed-off-by: Rafael J. Wysocki

    Rafael J. Wysocki
     
  • Currently, pm_genpd_poweron() and pm_genpd_poweroff() need to take
    the parent PM domain's lock in order to modify the parent's counter
    of active subdomains in a nonracy way. This causes the locking to be
    considerably complex and in fact is not necessary, because the
    subdomain counters may be implemented as atomic fields and they
    won't have to be modified under a lock.

    Replace the unsigned in sd_count field in struct generic_pm_domain
    by an atomic_t one and modify the code in drivers/base/power/domain.c
    to take this change into account.

    This patch doesn't change the locking yet, that is going to be done
    in a separate subsequent patch.

    Signed-off-by: Rafael J. Wysocki

    Rafael J. Wysocki
     
  • Since sci_port_enable() and sci_port_disable() may be run with
    interrupts off and they execute pm_runtime_get_sync() and
    pm_runtime_put_sync(), respectively, the SCI device's
    power.irq_safe flag has to be set to indicate that it is safe
    to execute runtime PM callbacks for this device with interrupts off.

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

    Rafael J. Wysocki
     
  • The lock member of struct pm_clk_data is of type struct mutex,
    which is a problem, because the suspend and resume routines
    defined in drivers/base/power/clock_ops.c cannot be executed
    with interrupts disabled for this reason. Modify
    struct pm_clk_data so that its lock member is a spinlock.

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

    Rafael J. Wysocki
     
  • * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jikos/hid:
    HID: wiimote: Add status and return request handlers
    HID: wiimote: Add drm request
    HID: wiimote: Register led class devices
    HID: wiimote: Correctly call HID open/close callbacks
    HID: wiimote: Simplify synchronization
    HID: usbhid: Add support for SiGma Micro chip
    HID: add support for new revision of Apple aluminum keyboard

    Linus Torvalds
     
  • * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input:
    Input: ad714x - read the interrupt status registers in a row
    Input: ad714x - use DMA-safe buffers for spi_write()
    Input: ad714x - fix endianness issues
    Input: ad714xx-spi - force SPI bus into the default 8-bit mode
    Input: ep93xx_keypad - add missing include of linux/module.h
    Input: tnetv107x-ts - add missing include of linux/module.h
    Input: max11801_ts - correct license statement
    Input: atmel_mxt_ts - report pressure information from the driver
    Input: bcm5974 - Add support for newer MacBookPro8,2
    Input: wacom - report id 3 returns 4 bytes of data
    Input: wacom - add WAC_MSG_RETRIES define
    Input: wacom - add support for the Wacom Bamboo Pen (CTL-660/K)
    Input: tegra-kbc - correct call to input_free_device
    Input: mpu3050 - correct call to input_free_device
    Input: bcm5974 - add support for touchpads found in MacBookAir4,2
    Input: mma8450 - fix module device table type
    Input: remove CLOCK_TICK_RATE from analog joystick driver

    Linus Torvalds
     
  • * git://git.kernel.org/pub/scm/linux/kernel/git/davem/net: (29 commits)
    bridge: fix a possible net_device leak
    net: Documentation: RFC 2553bis is now RFC 3493
    atm: br2684: Fix oops due to skb->dev being NULL
    ipv6: Fix ipv6_getsockopt for IPV6_2292PKTOPTIONS
    net: netdev-features.txt update to Documentation/networking/00-INDEX
    vlan: reset headers on accel emulation path
    forcedeth: call vlan_mode only if hw supports vlans
    via-velocity: remove non-tagged packet filtering
    bonding:reset backup and inactive flag of slave
    net_sched: fix port mirror/redirect stats reporting
    sit tunnels: propagate IPv6 transport class to IPv4 Type of Service
    gianfar: reduce stack usage in gianfar_ethtool.c
    net: minor update to Documentation/networking/scaling.txt
    net: add missing entries to Documentation/networking/00-INDEX
    gianfar: prevent buggy hw rx vlan tagging
    net: sh_eth: Fix build by forgot including linux/interrupt.h
    drivers/net/can/sja1000/plx_pci.c: eliminate double free
    usbnet/cdc_ncm: Don't use stack variables for DMA
    vmxnet3: Don't enable vlan filters in promiscuous mode.
    iwlagn: sysfs couldn't find the priv pointer
    ...

    Linus Torvalds
     

24 Aug, 2011

2 commits


23 Aug, 2011

15 commits


22 Aug, 2011

2 commits