dpm_list链表




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

  1. // 设备创建时都会调用的函数,将设备加入dpm_list链表  
  2. void device_pm_add(struct device *dev)  
  3. {  
  4.     pr_debug("PM: Adding info for %s:%s\n",  
  5.          dev->bus ? dev->bus->name : "No Bus",  
  6.          kobject_name(&dev->kobj));  
  7.     mutex_lock(&dpm_list_mtx);  
  8.     if (dev->parent) {  
  9.         if (dev->parent->power.status >= DPM_SUSPENDING)  
  10.             dev_warn(dev, "parent %s should not be sleeping\n",  
  11.                  dev_name(dev->parent));  
  12.     } else if (transition_started) {  
  13.         /* 
  14.          * We refuse to register parentless devices while a PM 
  15.          * transition is in progress in order to avoid leaving them 
  16.          * unhandled down the road 
  17.          */  
  18.         dev_WARN(dev, "Parentless device registered during a PM transaction\n");  
  19.     }  
  20.     // 将设备节点添加到链表尾部,即设备按注册的先后顺序从链表头部到尾部  
  21.     list_add_tail(&dev->power.entry, &dpm_list);  
  22.     mutex_unlock(&dpm_list_mtx);  
  23. }  
// 设备创建时都会调用的函数,将设备加入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链表中移除:

  1. // 设备注销时都会调用的函数,将设备从dpm_list链表中移除  
  2. void device_pm_remove(struct device *dev)  
  3. {  
  4.     pr_debug("PM: Removing info for %s:%s\n",  
  5.          dev->bus ? dev->bus->name : "No Bus",  
  6.          kobject_name(&dev->kobj));  
  7.     mutex_lock(&dpm_list_mtx);  
  8.     list_del_init(&dev->power.entry);  
  9.     mutex_unlock(&dpm_list_mtx);  
  10.     pm_runtime_remove(dev);  
  11. }  
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值