当前位置 博文首页 > bigfish99:使用regulator_get时的一个小注意事项

    bigfish99:使用regulator_get时的一个小注意事项

    作者:bigfish99 时间:2021-06-12 18:27

    Linux kernel 使用 regulator 框架来管理电源,比如 PMIC 芯片上常见的LDO。

    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/

    公众号:大鱼嵌入式

    bk