您的位置:首页 > 产品设计 > 产品经理

dpm_list链表

2016-09-24 21:50 99 查看


dpm_list是内核中用于设备电源管理的链表,设备注册时通过一系列的调用 device_register() -> device_add() -> device_pm_add() 最后在device_pm_add()中将设备加入dpm_list链表中:

[cpp]
view plain
copy
print?

// 设备创建时都会调用的函数,将设备加入dpm_list链表  
void device_pm_add(struct device *dev)  
{  
    pr_debug("PM: Adding info for %s:%s\n",  
         dev->bus ? dev->bus->name : "No Bus",  
         kobject_name(&dev->kobj));  
    mutex_lock(&dpm_list_mtx);  
    if (dev->parent) {  
        if (dev->parent->power.status >= DPM_SUSPENDING)  
            dev_warn(dev, "parent %s should not be sleeping\n",  
                 dev_name(dev->parent));  
    } else if (transition_started) {  
        /* 
         * We refuse to register parentless devices while a PM 
         * transition is in progress in order to avoid leaving them 
         * unhandled down the road 
         */  
        dev_WARN(dev, "Parentless device registered during a PM transaction\n");  
    }  
    // 将设备节点添加到链表尾部,即设备按注册的先后顺序从链表头部到尾部  
    list_add_tail(&dev->power.entry, &dpm_list);  
    mutex_unlock(&dpm_list_mtx);  
}  



// 设备创建时都会调用的函数,将设备加入dpm_list链表
void device_pm_add(struct device *dev)
{
pr_debug("PM: Adding info for %s:%s\n",
dev->bus ? dev->bus->name : "No Bus",
kobject_name(&dev->kobj));
mutex_lock(&dpm_list_mtx);
if (dev->parent) {
if (dev->parent->power.status >= DPM_SUSPENDING)
dev_warn(dev, "parent %s should not be sleeping\n",
dev_name(dev->parent));
} else if (transition_started) {
/*
* We refuse to register parentless devices while a PM
* transition is in progress in order to avoid leaving them
* unhandled down the road
*/
dev_WARN(dev, "Parentless device registered during a PM transaction\n");
}
// 将设备节点添加到链表尾部,即设备按注册的先后顺序从链表头部到尾部
list_add_tail(&dev->power.entry, &dpm_list);
mutex_unlock(&dpm_list_mtx);
}

而设备注销的时候会调用device_pm_remove()将设备从dpm_list链表中移除:

[cpp]
view plain
copy
print?

// 设备注销时都会调用的函数,将设备从dpm_list链表中移除  
void device_pm_remove(struct device *dev)  
{  
    pr_debug("PM: Removing info for %s:%s\n",  
         dev->bus ? dev->bus->name : "No Bus",  
         kobject_name(&dev->kobj));  
    mutex_lock(&dpm_list_mtx);  
    list_del_init(&dev->power.entry);  
    mutex_unlock(&dpm_list_mtx);  
    pm_runtime_remove(dev);  
}  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: