设备树配置

qca,bt-vdd-rfa1-supply = <&pm8150_s5>;
        qca,bt-vdd-rfa2-supply = <&pm8150a_s8>;
        qca,bt-vdd-asd-supply = <&pm8150_l16>;

qca,bt-vdd-aon-voltage-level = <950000 950000>;
        qca,bt-vdd-dig-voltage-level = <950000 952000>;
        qca,bt-vdd-rfa1-voltage-level = <1900000 1900000>;
        qca,bt-vdd-rfa2-voltage-level = <1350000 1350000>;
        qca,bt-vdd-asd-voltage-level = <3024000 3304000>;

内核自带的bt驱动电源部分如下

static int bt_dt_parse_vreg_info(struct device *dev,struct bt_power_vreg_data **vreg_data, const char *vreg_name)
{int len, ret = 0;const __be32 *prop;char prop_name[MAX_PROP_SIZE];struct bt_power_vreg_data *vreg;struct device_node *np = dev->of_node;BT_PWR_DBG("vreg dev tree parse for %s", vreg_name);*vreg_data = NULL;snprintf(prop_name, MAX_PROP_SIZE, "%s-supply", vreg_name);if (of_parse_phandle(np, prop_name, 0)) {vreg = devm_kzalloc(dev, sizeof(*vreg), GFP_KERNEL);if (!vreg) {BT_PWR_ERR("No memory for vreg: %s", vreg_name);ret = -ENOMEM;goto err;}vreg->name = vreg_name;/* Parse voltage-level from each node */snprintf(prop_name, MAX_PROP_SIZE,"%s-voltage-level", vreg_name);prop = of_get_property(np, prop_name, &len);if (!prop || (len != (2 * sizeof(__be32)))) {dev_warn(dev, "%s %s property\n",prop ? "invalid format" : "no", prop_name);} else {vreg->low_vol_level = be32_to_cpup(&prop[0]);vreg->high_vol_level = be32_to_cpup(&prop[1]);}/* Parse current-level from each node */snprintf(prop_name, MAX_PROP_SIZE,"%s-current-level", vreg_name);ret = of_property_read_u32(np, prop_name, &vreg->load_uA);if (ret < 0) {BT_PWR_DBG("%s property is not valid\n", prop_name);vreg->load_uA = -1;ret = 0;}*vreg_data = vreg;BT_PWR_DBG("%s: vol=[%d %d]uV, current=[%d]uA\n",vreg->name, vreg->low_vol_level,vreg->high_vol_level,vreg->load_uA);} elseBT_PWR_INFO("%s: is not provided in device tree", vreg_name);err:return ret;
}static int bt_vreg_init(struct bt_power_vreg_data *vreg)
{int rc = 0;struct device *dev = &btpdev->dev;BT_PWR_DBG("vreg_get for : %s", vreg->name);/* Get the regulator handle */vreg->reg = regulator_get(dev, vreg->name);if (IS_ERR(vreg->reg)) {rc = PTR_ERR(vreg->reg);vreg->reg = NULL;pr_err("%s: regulator_get(%s) failed. rc=%d\n",__func__, vreg->name, rc);goto out;}if ((regulator_count_voltages(vreg->reg) > 0)&& (vreg->low_vol_level) && (vreg->high_vol_level))vreg->set_voltage_sup = 1;out:return rc;
}static int bt_vreg_enable(struct bt_power_vreg_data *vreg)
{int rc = 0;if (!vreg->is_enabled) {if (vreg->set_voltage_sup) {rc = regulator_set_voltage(vreg->reg,vreg->low_vol_level,vreg->high_vol_level);if (rc < 0) {BT_PWR_ERR("vreg_set_vol(%s) failed rc=%d\n",vreg->name, rc);goto out;}}if (vreg->load_uA >= 0) {rc = regulator_set_load(vreg->reg,vreg->load_uA);if (rc < 0) {BT_PWR_ERR("vreg_set_mode(%s) failed rc=%d\n",vreg->name, rc);goto out;}}rc = regulator_enable(vreg->reg);if (rc < 0) {BT_PWR_ERR("regulator_enable(%s) failed. rc=%d\n",vreg->name, rc);goto out;}vreg->is_enabled = true;}BT_PWR_ERR("vreg_en successful for : %s", vreg->name);
out:return rc;
}static int bt_vreg_disable(struct bt_power_vreg_data *vreg)
{int rc = 0;if (!vreg)return rc;if (vreg->is_enabled) {rc = regulator_disable(vreg->reg);if (rc < 0) {BT_PWR_ERR("regulator_disable(%s) failed. rc=%d\n",vreg->name, rc);goto out;}vreg->is_enabled = false;if (vreg->set_voltage_sup) {/* Set the min voltage to 0 */rc = regulator_set_voltage(vreg->reg, 0,vreg->high_vol_level);if (rc < 0) {BT_PWR_ERR("vreg_set_vol(%s) failed rc=%d\n",vreg->name, rc);goto out;}}if (vreg->load_uA >= 0) {rc = regulator_set_load(vreg->reg, 0);if (rc < 0) {BT_PWR_ERR("vreg_set_mode(%s) failed rc=%d\n",vreg->name, rc);goto out;}}}BT_PWR_ERR("vreg_disable successful for : %s", vreg->name);
out:return rc;
}

驱动里面如何操作regulator相关推荐

  1. 31-32 python mysql-connector创建数据、crud,where,排序,删除等。PyMSQL驱动,插入操作、查询操作、更新操作、删除操作、执行

    31Python MysSQL - mysql-connector驱动 使用pip命令安装mysql-connector: python -m pip install mysql-connector ...

  2. 【驱动】使用结构体 file_operations封装驱动设备的操作 | 结构体初始化

    -----第一部分----- 最近学习到了Linux驱动章节的课程,对设备的对应驱动的注册有些困惑,看了下发现是把设备的所有操作方法封装到结构体 file_operations 中,这个结构体为所有的 ...

  3. mysql驱动maven_IDEA用Maven连接MySQL的jdbc驱动,并操作数据库

    1.在IDEA里创建Maven项目 1.1.点击Create New Project 1.2.选择Maven,JDK这里用的是1.8,点击Next 1.3.填入"组织名".&quo ...

  4. X64驱动:内核操作进线程/模块

    内核枚举进线程/模块 内核枚举进程: 进程就是活动起来的程序,每一个进程在内核里,都有一个名为 EPROCESS 的结构记录它的详细信息,其中就包括进程名,PID,PPID,进程路径等,通常在应用层枚 ...

  5. android定制化软件修改或添加按键驱动的核心操作步骤讲解

    最近在Amlogic方案的定制化android软件上,做了添加按键的驱动工作,也熟悉了按键的基本流程,现在把核心步骤给总结如下: 1.基本流程: ./表示android源代码目录,按键属于输入设备,支 ...

  6. 嵌入式驱动之阻塞操作、非阻塞操作

    阻塞 阻塞操作     是指在执行设备操作时若不能获得资源则挂起进程,直到满足可操作的条件后再进行操作. 被挂起的进程进入休眠状态,被从调度器的运行队列移走,直到等待的条件被满足. 非阻塞操作   进 ...

  7. java 通过jdbc驱动连接hive操作实例

    http://blog.csdn.net/ghychina/article/details/7429577 转自:http://blog.csdn.net/a221133/article/detail ...

  8. 关于ESP8266-01使用机智云SOC方案驱动IO2控制继电器操作

    关于ESP8266-01使用机智云SOC方案控制IO2驱动继电器 首先创建机智云账号,创建产品, 添加数据点 创建SOC方案,选好各项参数 下载 安装二次开发环境,不会的可以自行百度,教程比较详细 下 ...

  9. win驱动下线程操作相关函数封装

    线程创建 #include <ntifs.h>KEVENT g_kEvent;VOID DriverUnload(PDRIVER_OBJECT pDriver);VOID ThreadPr ...

  10. X1 carbon 2015安装win7、win10后触控板驱动安装失败(双指滑动无效、多指操作无效)的另类解决之道

    我的X1 carbon 2015安装win10系统之后,触控板驱动安装不成功,单指可以操作,但是双指滑动.多指操作等win10十分实用的功能无法使用,而且在控制面板的鼠标和触控板设置选项中,连触控板设 ...

最新文章

  1. YOLO-Z | 记录修改YOLOv5以适应小目标检测的实验过程
  2. ceph 集群 健康状态 监管
  3. (转)Silverlight数据校验之INotifyDataErrorInfo
  4. std::map 反向遍历
  5. 分布式锁的几种实现原理
  6. c语言写天气预报程序,微信小程序实现天气预报功能
  7. python 初始化一个4维向量_看图学NumPy:掌握n维数组基础知识点,看这一篇就够了...
  8. v-if、v-for、v-model、v-on
  9. Bootstrap 标签和徽章
  10. spring 源码深度解析_spring源码解析之SpringIOC源码解析(下)
  11. qemu模拟器下编译运行基于riscv指令集的Linux操作系统
  12. python3-pwntools教程_CTF PWN工具篇1
  13. 中科大开源数据集CCPD 2019详细介绍
  14. ARCore从零到一 (2) 运行HelloAR 案例
  15. 给曾经爱过、正在爱着、将要爱的人们!
  16. Smart3D系列教程1之《浅谈无人机倾斜摄影建模的原理与方法》
  17. 服务器不能读取无线网卡,无线网卡无法获得IP地址的解决方案
  18. hdu 5435 A serious math problem 数位dp
  19. Visual Studio开发MFC项目OCX控件添加使用控件方法
  20. Map训练(三国武力值)

热门文章

  1. 如何成为一个牛逼的程序员?
  2. 使用WinRadius服务器软件 搭建 radius 认证
  3. nc361t支持的服务器,使用5760/3850 WLC的外部RADIUS服务器EAP身份验证配置示例
  4. hazy的leetcode刷题笔记(三)
  5. 如何避免对话冲突-《关键对话》笔记与心得
  6. driver nvidia web_NVIDIA WebDriver
  7. Appium + IOS 自动化环境搭建教程(实践+总结+踩坑)
  8. 树莓派4B:智能植物管家
  9. 如何一下清空微信好友_微信清理好友方法|微信如何正确清理已删除你的微信好友 微信清理好友方法介绍_东坡下载...
  10. 【高数】交换二次积分次序时,为什么要观察上下限大小关系?