使用regulator_get时的一个小注意事项
Linux kernel 使用 regulator 框架来管理电源,比如 PMIC 芯片上常见的LDO。使用 regulator 的常规流程如以下代码所示:
void set_vbus_voltage(struct device *dev)
{
struct regulator *vbus;
vbus = regulator_get(dev, "vbus");
if (IS_ERR(vbus)) {
ret = PTR_ERR(vbus);
goto reg_put;
}
regulator_set_voltage(vbus, 5000000, 5000000);
regulator_enable(vbus); reg_put:
regulator_put(vbus);
}
IS_ERR宏用来判断 regulator_get 的返回值是否有错误,如果没有错误,表示成功 get 到这个 regulator,那么就可以进行后续的 set 和 enable 操作了。这个设计符合我们的思维习惯。
那么对于上例,当 IS_ERR(vbus) 返回假时,也就是成功 get 到了名为 vbus 的 regulator,是否代表 vbus 这个 regulator 一定会起作用,输出 5V 呢?答案是不一定。
假设我们并没有在设备树中定义或者代码中创建“vbus”这个 regulator,比如我们一不小心搞错了regulator的名字,这个 regulator 的正确名字应该是 “vusbhost”,而不是 “vbus”,那么IS_ERR宏能判定出来吗?按我们的思维习惯应该是会返回真,也就是判定 get regulator 出错了;但是实际情况恰恰相反,IS_ERR宏仍然返回假,也就是判定 get regulator 成功。为什么会发生这种情况呢,这就需要看一下 regulator_get 函数的具体实现。

如上图,regulator_get 最终会调用到 _regulator_get。结合红色箭头1和2所指向的代码,可以看出代码逻辑是:如果找不到对应名字的 regulator,那么就返回 dummy regulator,并且在 kernel log 中输出相关 warning 信息。比如上例中如果找不到 “vbus”,则会输出如下 warning:
supply vbus not found, using dummy regulator
同时作者还在注释中给出了理由:“假设某个 regulator 是物理硬件上存在并已经使能了的,如果软件中找不到,那么就提供一个 dummy regulator 设备”。
所以当我们在调试驱动时,如果发现某个 regulator 没有按预期输出,且跟踪代码流程也没有发现中途出错返回,那么不妨考虑一下上述情况,仔细看看 kernel log 中有没有相关的 warning。
作者:bigfish99
博客:https://www.cnblogs.com/bigfish0506/
公众号:大鱼嵌入式

使用regulator_get时的一个小注意事项的更多相关文章
- QT:窗口最小化时显示一个小浮标
有些窗口在自身最小化时要在桌面上显示一个小浮标,让用户利用这个小浮标进行各种操作(例如迅雷的悬浮窗一样),我试着用QT实现一下这个功能. PS:本来以为这个功能很简单,却搞了我两个晚上,泪奔... 思 ...
- Python list遍历remove()时的一个小BUG
有这样一个列表: s=list('abcdefg') 现在因为某种原因我们需要从s中踢出一些不需要的元素,方便起见这里直接以踢出所有元素的循环代替: for e in s: s.remove(e) 结 ...
- Java中用Scanner扫描控制台输入时的一个小问题
package com.hxl; import java.util.Scanner; public class Test { public static void main(String[] args ...
- 两个宝藏|关于我在github上冲浪时的一个小技巧。
你好呀,我是歪歪. 前几天在 github 上冲浪的时候,发现了两个宝藏东西. 我也不藏着掖着了,拿出来给大家分享一下. 这两个宝藏是关于 arthas 和 SOFARegistry 的,这两个东西都 ...
- Ubuntu格式化分区时的一个小错误
admin@gpc:/$ sudo mkfs -t ext3 -c /dev/sdb1 mkfs.ext3: inode_size (128) * inodes_count (0) too big ...
- activiti设置customSessionFactories时的一个小坑
现象:activiti设置customSessionFactories不起作用,流程还是走原来的查询方法原因:新实现的XXXEntityManagerFactory的getSessionType方法返 ...
- 关于一个小bug的修正
python初学者,非常喜欢虫师的文章. 练习时发现一个小bug,http://www.cnblogs.com/fnng/p/3782515.html 验证邮箱格式一题中,第三个x不允许有数字,但是测 ...
- autium designer smart pdf一个小问题
今天在使用ad的smart pdf时遇到一个小问题 就是 使用的是AD17,生成PDF,PDF没有把芯片的引脚标号显示出来(还有其它的芯片也是一样的,但是奇怪的是:只有在原理图元器件右边的没有显示 ...
- 在STM32F401上移植uC/OS的一个小问题 [原创]
STM32F401xx是意法半导体新推出的Cortex-M4内核的MCU,相较于已经非常流行的STM32F407xx和STM32F427xx等相同内核的MCU而言,其特点是功耗仅为128uA/MHz, ...
随机推荐
- Google Hacking的用法
目录 Google Hacking 基本搜索 高级搜索 Index of inurl Google Hacking Google Hacking 是利用谷歌搜索的强大,来在浩瀚的互联网中搜索到我们需要 ...
- 每天一道面试题LeetCode 26--删除排序数组中的重复项(python实现)
题目1:给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度. 不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成. ...
- layui中的视频上传(PHP )
1.html中: <div class="layui-form-item"> <label class="layui-form-label"& ...
- Etcd中Raft日志复制的实现
Raft state of log commitIndex : A log entry is committed once the leader that created the entry has ...
- 云空调来自 GitHub 的冷气——GitHub 热点速览 v.21.20
作者:HelloGitHub-小鱼干 万物皆可上云,air-conditioner 是上周火爆小鱼干朋友圈和公众号信息流的云空调项目.第一眼的时候,你会觉得和这个云空调还挺别致的,第二眼,si~~感到 ...
- Kafka万亿级消息实战
一.Kafka应用 本文主要总结当Kafka集群流量达到 万亿级记录/天或者十万亿级记录/天 甚至更高后,我们需要具备哪些能力才能保障集群高可用.高可靠.高性能.高吞吐.安全的运行. 这里总结内容主 ...
- 『居善地』接口测试 — 4、Requests库发送GET请求
目录 1.使用Requests库发送带参数的GET请求 2.查看GET请求的内容 3.带请求头.参数的Get请求 Requests库GET请求是使用HTTP协议中的GET请求方式对目标网站发起请求. ...
- margin (子元素远离父元素边框)
如果父盒子没有设置border框着,那么他的子元素无法利用margin-top 来远离父元素的上边框 如果使用了margin-top会使子元素和父元素一起往下移 (子想离,父不设置border边框 则 ...
- jQuery的入口和jQurey的对象切换
jQuery jQuery的导入 通过script标签的src属性,link标签是导入层叠样式表 jQuery和原生JS的入口函数 1.jQ在页面结构加载完毕就会执行 原生JS的入口函数是等图片.层叠 ...
- [bug] org.yaml.snakeyaml.error.YAMLException: java.nio.charset.MalformedInputException: Input length = 2
原因 SpringBoot启动加载yml配置文件出现编码格式错误 参考 https://www.pianshen.com/article/2431144034/