设为首页 加入收藏

TOP

Power Management(三)
2014-11-23 21:37:42 来源: 作者: 【 】 浏览:62
Tags:Power Management


int pm_wake_lock(const char *buf)
{
    const char *str = buf;
    struct wakelock *wl;
    u64 timeout_ns = 0;
    size_t len;
    int ret = 0;

    while (*str && !isspace(*str))
        str++;

    len = str - buf;
    if (!len)
        return -EINVAL;

    if (*str && *str != '
') {
        /* Find out if there's a valid timeout string appended. */
        ret = kstrtou64(skip_spaces(str), 10, &timeout_ns);
        if (ret)
            return -EINVAL;
    }

    mutex_lock(&wakelocks_lock);

    wl = wakelock_lookup_add(buf, len, true);
    if (IS_ERR(wl)) {
        ret = PTR_ERR(wl);
        goto out;
    }
    if (timeout_ns) {
        u64 timeout_ms = timeout_ns + NSEC_PER_MSEC - 1;

        do_div(timeout_ms, NSEC_PER_MSEC);
        __pm_wakeup_event(&wl->ws, timeout_ms);
    } else {
        __pm_stay_awake(&wl->ws);
    }

    wakelocks_lru_most_recent(wl);

 out:
    mutex_unlock(&wakelocks_lock);
    return ret;
}


上面的函数主要讲解wakelock_lookup_add
会调用到void wakeup_source_add(struct wakeup_source *ws)函数将我们申请的wake_lock 添加到
list_add_rcu(&ws->entry, &wakeup_sources); wakeup_sources 链表中去,我们在suspend 的时候会去遍历wakeup_sources 这个链表里面的wake source 的状态。
并根据 timeout_ns 的时间进行调用不同的函数,最终都是将对应的wake_source 设置为true. ws->active = true;

if (timeout_ns) { u64 timeout_ms = timeout_ns + NSEC_PER_MSEC - 1;

do_div(timeout_ms, NSEC_PER_MSEC);
__pm_wakeup_event(&wl->ws, timeout_ms);
} else {
__pm_stay_awake(&wl->ws);
}

现在我们再回到上面讲解的pm_wakep_autosleep_enabled 这个函数里面:
void pm_wakep_autosleep_enabled(bool set)
{
    struct wakeup_source *ws;
    ktime_t now = ktime_get();

    rcu_read_lock();
    list_for_each_entry_rcu(ws, &wakeup_sources, entry) {
        spin_lock_irq(&ws->lock);
        if (ws->autosleep_enabled != set) {
            ws->autosleep_enabled = set;
            if (ws->active) {
                if (set)
                    ws->start_prevent_time = now;
                else
                    update_prevent_sleep_time(ws, now);
            }
        }
        spin_unlock_irq(&ws->lock);
    }
    rcu_read_unlock();
}
#endif /* CONFIG_PM_AUTOSLEEP *

/


上面在进入suspend 的时候会判断ws->active ,如果为true 就不会进入suspend .


首页 上一页 1 2 3 4 5 下一页 尾页 3/5/5
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇C语言 十进制转换成二进制转换方.. 下一篇数组nice to see you again

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: