【subsys_interface_register】【subsys_interface_unregister】子系统接口注册和注销

转自:https://blog.csdn.net/tiantao2012/article/details/52222462

在看cpufreq驱动的时候有遇到

这行code是啥意思呢? 

subsys_interface_register(&cpufreq_interface);
1576 static struct subsys_interface cpufreq_interface = {
1577         .name           = "cpufreq",
1578         .subsys         = &cpu_subsys,
1579         .add_dev        = cpufreq_add_dev,
1580         .remove_dev     = cpufreq_remove_dev,
1581 };
我们看看subsys_interface_register的实现。
1125 int subsys_interface_register(struct subsys_interface *sif)
1126 {
1127         struct bus_type *subsys;
1128         struct subsys_dev_iter iter;
1129         struct device *dev;
1130 
1131         if (!sif || !sif->subsys)
1132                 return -ENODEV;
1133 
1134         subsys = bus_get(sif->subsys);
1135         if (!subsys)
1136                 return -EINVAL;
1137 
1138         mutex_lock(&subsys->p->mutex);
1139         list_add_tail(&sif->node, &subsys->p->interfaces);
1140         if (sif->add_dev) {
1141                 subsys_dev_iter_init(&iter, subsys, NULL, NULL);
1142                 while ((dev = subsys_dev_iter_next(&iter)))
1143                         sif->add_dev(dev, sif);
1144                 subsys_dev_iter_exit(&iter);
1145         }
1146         mutex_unlock(&subsys->p->mutex);
1147 
1148         return 0;
1149 }


1134行subsys就等于1578行的cpu_sybsys.
1140行的sif->add_dev 就等1579行的cpufreq_add_dev,所以肯定不为NULL。
1142行会遍历cpu_sybsys,为每一个cpu调用cpufreq_add_dev 方法。也就是有几个cpu,cpufreq_add_dev 方法就没调用几次。

 

 

然后是子系统的注销:

 

同理注销的接口如下:

1157 void subsys_interface_unregister(struct subsys_interface *sif)
1158 {  
1159     struct bus_type *subsys;
1160     struct subsys_dev_iter iter;
1161     struct device *dev;
1162    
1163     if (!sif || !sif->subsys)
1164         return;
1165    
1166     subsys = sif->subsys;
1167    
1168     mutex_lock(&subsys->p->mutex);
1169     list_del_init(&sif->node);
1170     if (sif->remove_dev) {
1171         subsys_dev_iter_init(&iter, subsys, NULL, NULL);
1172         while ((dev = subsys_dev_iter_next(&iter)))
1173             sif->remove_dev(dev, sif);
1174         subsys_dev_iter_exit(&iter);
1175     }
1176     mutex_unlock(&subsys->p->mutex);
1177    
1178     bus_put(subsys);
1179 }

1180 EXPORT_SYMBOL_GPL(subsys_interface_unregister);

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值