linux 内核regulator

问题

  在sys文件系统下没有生成cpu 调频的相关节点。

日志对比

[    3.588745] cpu cpu4: Looking up cpu-supply from device tree
[    3.588753] cpu cpu4: Failed to get reg
[    3.588791] cpu cpu4: Looking up cpu-supply from device tree
[    3.588808] Failed to initialize dvfs info cpu4

代码流程

  cpufreq

kernel\drivers\soc\rockchip\rockchip_opp_select.c

static int rockchip_get_pvtm_pvtpll(struct device *dev, struct device_node *np,
				    char *reg_name)
{
	struct regulator *reg;
	struct clk *clk;
	struct pvtm_config *pvtm;
	unsigned long old_freq;
	unsigned int old_volt;
	int cur_temp, diff_temp, prop_temp, diff_value;
	int pvtm_value = 0;
	int ret = 0;

	pvtm = kzalloc(sizeof(*pvtm), GFP_KERNEL);
	if (!pvtm)
		return -ENOMEM;

	ret = rockchip_parse_pvtm_config(np, pvtm);
	if (ret)
		goto out;

	clk = clk_get(dev, NULL);
	if (IS_ERR_OR_NULL(clk)) {
		dev_warn(dev, "Failed to get clk\n");
		goto out;
	}
    //如下这行打印出的失败信息
	reg = regulator_get_optional(dev, reg_name);
	if (IS_ERR_OR_NULL(reg)) {
		dev_warn(dev, "Failed to get reg\n");
		clk_put(clk);
		goto out;
	}

I:\rk3588\kernel\drivers\cpufreq\rockchip-cpufreq.c

static int rockchip_cpufreq_cluster_init(int cpu, struct cluster_info *cluster)
{
	struct rockchip_opp_info *opp_info = &cluster->opp_info;
	struct opp_table *pname_table = NULL;
	struct opp_table *reg_table = NULL;

   if (opp_info->data && opp_info->data->get_soc_info)
		opp_info->data->get_soc_info(dev, np, &bin, &process);
	rockchip_get_scale_volt_sel(dev, "cpu_leakage", reg_name, bin, process,
				    &cluster->scale, &volt_sel); //入口函数
static int __init rockchip_cpufreq_driver_init(void)
{
	struct cluster_info *cluster, *pos;
	struct cpufreq_dt_platform_data pdata = {0};
	int cpu, ret;

	for_each_possible_cpu(cpu) {
		cluster = rockchip_cluster_info_lookup(cpu);
		if (cluster)
			continue;

		cluster = kzalloc(sizeof(*cluster), GFP_KERNEL);
		if (!cluster) {
			ret = -ENOMEM;
			goto release_cluster_info;
		}

		ret = rockchip_cpufreq_cluster_init(cpu, cluster);
		if (ret) {
			pr_err("Failed to initialize dvfs info cpu%d\n", cpu);
			goto release_cluster_info;
		}
		list_add(&cluster->list_head, &cluster_info_list);
	}

regulator

_regulator_get

I:\rk3588\kernel\drivers\regulator\core.c

根据此函数,猜测由于regulator设备没有被发现,没有被注册到系统中,导致cpufreq没有找到相应的regulator节点。

rk806

I:\rk3588\kernel\drivers\regulator\rk806-regulator.c

rk860

I:\rk3588\kernel\drivers\regulator\rk860x-regulator.c

DTS配置
&i2c0 {
	status = "okay";
	pinctrl-names = "default";
	pinctrl-0 = <&i2c0m2_xfer>;

	vdd_cpu_big0_s0: vdd_cpu_big0_mem_s0: rk8602@42 {
		compatible = "rockchip,rk8602";
		reg = <0x42>;
		vin-supply = <&vcc5v0_sys>;
		vsel-gpios = <&gpio0 RK_PA3 GPIO_ACTIVE_HIGH>;
		regulator-compatible = "rk860x-reg";
		regulator-name = "vdd_cpu_big0_s0";
		regulator-min-microvolt = <550000>;
		regulator-max-microvolt = <1050000>;
		regulator-ramp-delay = <2300>;
		rockchip,suspend-voltage-selector = <1>;
		regulator-boot-on;
		regulator-always-on;
		regulator-state-mem {
			regulator-off-in-suspend;
		};
	};
sys节点创建

rk860x_regulator_register--》devm_regulator_register->regulator_register

-->rdev_init_debugfs-->

此处没有创建设备节点,也就是前面初始化部分出现问题了。

初始化代码

/* Get chip ID */
	ret = regmap_read(di->regmap, RK860X_ID1, &val);
	if (ret < 0) {
		dev_err(&client->dev, "Failed to get chip ID!\n");
		return ret;
	}

	switch (di->chip_id) {
	case RK860X_CHIP_ID_00:
	case RK860X_CHIP_ID_01:
		if ((val & DIE_ID) != 0x8) {
			dev_err(&client->dev, "Failed to match chip ID!\n");
			return -EINVAL;
		}
		break;
	case RK860X_CHIP_ID_02:
	case RK860X_CHIP_ID_03:
		if ((val & DIE_ID) != 0xa) {
			dev_err(&client->dev, "Failed to match chip ID!\n");
			return -EINVAL;
		}
		break;
	default:
		return -EINVAL;
	}

	/* Device init */
	ret = rk860x_device_setup(di, pdata);
	if (ret < 0) {
		dev_err(&client->dev, "Failed to setup device!\n");
		return ret;
	}
	/* Register regulator */
	config.dev = di->dev;
	config.init_data = di->regulator;
	config.regmap = di->regmap;
	config.driver_data = di;
	config.of_node = np;

	ret = rk860x_regulator_register(di, &config);
	if (ret < 0)
		dev_err(&client->dev, "Failed to register regulator!\n");
回看dmesg日志
[    3.509295] i2c /dev entries driver
[    3.510437] rk860-regulator 0-0042: Failed to match chip ID!
[    3.510478] rk860-regulator: probe of 0-0042 failed with error -22
[    3.511089] rk860-regulator 0-0043: Failed to match chip ID!
[    3.511120] rk860-regulator: probe of 0-0043 failed with error -22
[    3.514659] rk860-regulator 1-0042: Looking up vin-supply from device tree

对比正常日志

也就是从I2C读取的ID 信息不对。

读取偏移量为0x3

sys文件系统调试信息

regulator summary

查看只有 vdd_cpu_lit_s0   没有两个大核的信息,可以确认两个大核对应的regulator没有生成

cat /sys/kernel/debug/regulator/regulator_summary
 regulator                      use open bypass  opmode voltage current     min     max
---------------------------------------------------------------------------------------
 regulator-dummy                  4    4      0 unknown     0mV     0mA     0mV     0mV
    fe210000.sata-target          1                                 0mA     0mV     0mV
    fe210000.sata-phy             1                                 0mA     0mV     0mV
    fe210000.sata-ahci            1                                 0mA     0mV     0mV
    regulator-dummy               0                                 0mA     0mV     0mV
 vcc12v_dcin                      3    3      0 unknown 12000mV     0mA 12000mV 12000mV
    vcc12v_dcin                   0                                 0mA     0mV     0mV
    vcc5v0_sys                   16   16      0 unknown  5000mV     0mA  5000mV  5000mV
       vcc5v0_sys                 0                                 0mA     0mV     0mV
       vcc_1v1_nldo_s3            6    6      0 unknown  1100mV     0mA  1100mV  1100mV
          vcc_1v1_nldo_s3         0                                 0mA     0mV     0mV
          vdd_0v75_s3             1    1      0 unknown   750mV     0mA   750mV   750mV
             vdd_0v75_s3          0                                 0mA     0mV     0mV
          vdd_ddr_pll_s0          1    1      0 unknown   850mV     0mA   850mV   850mV
             vdd_ddr_pll_s0       0                                 0mA     0mV     0mV
          avdd_0v75_s0            2    2      0 unknown   750mV     0mA   750mV   750mV
             avdd_0v75_s0         0                                 0mA     0mV     0mV
             pcie30_avdd0v75      1    1      0 unknown   750mV     0mA   750mV   750mV
                pcie30_avdd0v75   0                                 0mA     0mV     0mV
          vdd_0v85_s0             2    2      0 unknown   850mV     0mA   850mV   850mV
             vdd_0v85_s0          0                                 0mA     0mV     0mV
             pcie20_avdd0v85      1    1      0 unknown   850mV     0mA   850mV   850mV
                pcie20_avdd0v85   0                                 0mA     0mV     0mV
          vdd_0v75_s0             1    1      0 unknown   750mV     0mA   750mV   750mV
             vdd_0v75_s0          0                                 0mA     0mV     0mV
       vdd_gpu_s0                 0    5      0  normal   675mV     0mA   550mV   950mV
          fb000000.gpu-mem        0                                 0mA   675mV   950mV
          fb000000.gpu-mali       0                                 0mA   675mV   950mV
          fb000000.gpu-mem        0                                 0mA     0mV     0mV
          fb000000.gpu-mali       0                                 0mA     0mV     0mV
          vdd_gpu_s0              0                                 0mA     0mV     0mV
       vdd_cpu_lit_s0             1    3      0  normal   750mV     0mA   550mV   950mV
          cpu0-mem                0                                 0mA     0mV     0mV
          cpu0-cpu                0                                 0mA     0mV     0mV
          vdd_cpu_lit_s0          0                                 0mA     0mV     0mV
       vdd_log_s0                 1    1      0  normal   750mV     0mA   675mV   750mV
          vdd_log_s0              0                                 0mA     0mV     0mV
       vdd_vdenc_s0               1    1      0  normal   750mV     0mA   550mV   950mV
          vdd_vdenc_s0            0                                 0mA     0mV     0mV
       vdd_ddr_s0                 1    1      0  normal   850mV     0mA   675mV   900mV
          vdd_ddr_s0              0                                 0mA     0mV     0mV
       vdd2_ddr_s3                1    1      0  normal   500mV     0mA     0mV     0mV
          vdd2_ddr_s3             0                                 0mA     0mV     0mV
       vdd_2v0_pldo_s3            4    4      0  normal  2000mV     0mA  2000mV  2000mV
          vdd_2v0_pldo_s3         0                                 0mA     0mV     0mV
          avcc_1v8_s0             3    3      0 unknown  1800mV     0mA  1800mV  1800mV
             avcc_1v8_s0          0                                 0mA     0mV     0mV
             pcie30_avdd1v8       1    1      0 unknown  1800mV     0mA  1800mV  1800mV
                pcie30_avdd1v8    0                                 0mA     0mV     0mV
             pcie20_avdd1v8       1    1      0 unknown  1800mV     0mA  1800mV  1800mV
                pcie20_avdd1v8    0                                 0mA     0mV     0mV
          vcc_1v8_s0              2    2      0 unknown  1800mV     0mA  1800mV  1800mV
             fec10000.saradc-vref   1                                 0mA     0mV     0mV
             vcc_1v8_s0           0                                 0mA     0mV     0mV
          avdd_1v2_s0             1    1      0 unknown  1200mV     0mA  1200mV  1200mV
             avdd_1v2_s0          0                                 0mA     0mV     0mV
       vcc_3v3_s3                 1    1      0  normal  3300mV     0mA  3300mV  3300mV
          vcc_3v3_s3              0                                 0mA     0mV     0mV
       vddq_ddr_s0                1    1      0  normal   500mV     0mA     0mV     0mV
          vddq_ddr_s0             0                                 0mA     0mV     0mV
       vcc_1v8_s3                 1    1      0  normal  1800mV     0mA  1800mV  1800mV
          vcc_1v8_s3              0                                 0mA     0mV     0mV
       vcc_3v3_s0                 1    1      0 unknown  3300mV     0mA  3300mV  3300mV
          vcc_3v3_s0              0                                 0mA     0mV     0mV
       vccio_sd_s0                1    1      0 unknown  3300mV     0mA  1800mV  3300mV
          vccio_sd_s0             0                                 0mA     0mV     0mV
       pldo6_s3                   1    1      0 unknown  1800mV     0mA  1800mV  1800mV
          pldo6_s3                0                                 0mA     0mV     0mV
       vdd_npu_s0                 1    5      0  normal   825mV     0mA   550mV   950mV
          fdab0000.npu-mem        0                                 0mA   825mV   950mV
          fdab0000.npu-rknpu      0                                 0mA   825mV   950mV
          fdab0000.npu-mem        0                                 0mA     0mV     0mV
          fdab0000.npu-rknpu      0                                 0mA     0mV     0mV
          vdd_npu_s0              0                                 0mA     0mV     0mV
    vcc5v0_usbdcin                2    2      0 unknown  5000mV     0mA  5000mV  5000mV
       vcc5v0_usbdcin             0                                 0mA     0mV     0mV
       vcc5v0_usb                 1    2      0 unknown  5000mV     0mA  5000mV  5000mV
          vcc5v0_usb              0                                 0mA     0mV     0mV
          vbus5v0_typec           0    2      0 unknown  5000mV     0mA  5000mV  5000mV
             6-0022-vbus          0                                 0mA     0mV     0mV
             vbus5v0_typec        0                                 0mA     0mV     0mV

总结

至此,我们找到了sys  cpufreq没有生成的根因。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/212935.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【数电笔记】18-卡诺图化简

目录 说明&#xff1a; 用卡诺图化简逻辑函数 1. 公式法化简与卡诺图化简对比 2. 化简依据 3. 化简规律 3.1 两个小方块相邻 3.2 四个小方块相邻 3.3 八个小方块相邻 4. 卡诺图化简法步骤 4.1 例1 4.2 例2 5. 画卡诺圈规则 5.1 例1 6. 特殊情况 6.1 例1 6.2 例…

【LeetCode刷题笔记】103. 二叉树的锯齿形层序遍历

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; 更多算法知识专栏&#xff1a;算法分析&#x1f525; 给大家跳段街舞感谢…

linux安装镜像cento7

点击创建新的虚拟机 点击典型&#xff0c;下一步 浏览&#xff0c;centos7下载文件的位置 找到位置后&#xff0c;效果如下图所示 下一步&#xff0c;填写用户名和密码&#xff0c;再点击下一步 给虚拟机起名字&#xff0c;默认就行&#xff1b;虚拟机安装路径&#xff0c;默认…

JavaSE自定义验证码图片生成器

设计项目的时候打算在原有的功能上补充验证码功能&#xff0c;在实现了邮箱验证码之后想着顺便把一个简单的图片验证码生成器也实现一下&#xff0c;用作分享。 注意&#xff0c;实际开发中验证码往往采用各种组件&#xff0c;通过导入依赖来在后端开发时使用相关功能&#xf…

组件的props属性

目录 1&#xff1a;使用props的作用&#xff1a; 2&#xff1a;props自定义属性的用法&#xff1a; 3&#xff1a;集合v-bind使用自定义属性&#xff1a; 4&#xff1a;props自定义属性是只读的&#xff1a; 5&#xff1a;default默认值&#xff1a; 6&#xff1a;type值类…

Unity版本使用情况统计(更新至2023年10月)

本期UWA发布的内容是第十三期Unity版本使用统计&#xff0c;统计周期为2023年5月至2023年10月&#xff0c;数据来源于UWA网站&#xff08;www.uwa4d.com&#xff09;性能诊断提测的项目。希望给Unity开发者提供相关的行业趋势&#xff0c;了解近半年来哪些Unity版本的使用概率更…

C/C++,树算法——Ukkonen的“后缀树“构造算法的源程序

1 文本格式 // A C program to implement Ukkonens Suffix Tree Construction // And then build generalized suffix tree #include <stdio.h> #include <string.h> #include <stdlib.h> #define MAX_CHAR 256 struct SuffixTreeNode { struct Suffix…

Python Locals:引领代码风潮,变量管理新尝试

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 在Python中&#xff0c;locals()函数是一个强大的工具&#xff0c;它使程序员能够访问和操作当前作用域内的局部变量。本文将深入探讨locals()函数的功能、应用和重要性。 动态变量赋值和操作 locals()函数让我…

[数据结构]HashSet与LinkedHashSet的底层原理学习心得

我们区分list和set集合的标准是三个&#xff1a;有无顺序&#xff0c;可否重复&#xff0c;有无索引。 list的答案是&#xff1a;有顺序&#xff0c;可重复&#xff0c;有索引。这也就是ArrayList和LinkedList的共性 set的答案是&#xff1a;顺序内部再区分,不可以重复&#xf…

分享几个国内免费使用的 gpt 网站

可放心阅读点击&#xff0c;无邀请链接、邀请码等 今天主要分享几个个免费的GPT网站。 1、思默问答&#xff08;SiteSMO&#xff09; AI写作生成器_智能写作_问答助手 - 思默问答 算是国内比较早的AI应用网站&#xff0c;支持问答&#xff0c;画图等&#xff0c;所有的问答…

visual Studio MFC 平台实现图像增强中的线性变换(负变换)和非线性变换(对数与幂律)

MFC 实现数字图像处理中的图像增强操作 本文使用visual Studio MFC 平台实现图像增强中典型的三种图像增强的方法中的两大类&#xff0c;包括线性变换–>负变换&#xff0c;非线性变换–>对数变换和幂律变换&#xff1b;其中第三大类分段式变换可以参考MFC实现图像增强–…

Presto基础学习--学习笔记

1&#xff0c;Presto背景 2011年&#xff0c;FaceBook的数据仓库存储在少量大型hadoop/hdfs集群&#xff0c;在这之前&#xff0c;FaceBook的科学家和分析师一直靠hive进行数据分析&#xff0c;但hive使用MR作为底层计算框架&#xff0c;是专为批处理设计的&#xff0c;但是随…

孩子都能学会的FPGA:第十九课——FPGA实现流水线操作

&#xff08;原创声明&#xff1a;该文是作者的原创&#xff0c;面向对象是FPGA入门者&#xff0c;后续会有进阶的高级教程。宗旨是让每个想做FPGA的人轻松入门&#xff0c;作者不光让大家知其然&#xff0c;还要让大家知其所以然&#xff01;每个工程作者都搭建了全自动化的仿…

Rust国内sparse镜像源配置

文章目录 1. 遇到问题1.1 问题现象1.2 解决办法 2. 重新设置最新 sparse源3. 更多参考资料3.1 字节源3.2 ustc 源3.3 清华源3.4 其他人的总结 1. 遇到问题 有好一阵子没有更新源和安装软件了&#xff0c; 使用ustc的源&#xff0c; 更新了好一阵子&#xff0c; 最后安装居然还出…

养身馆推拿会员管理系统,佳易王推拿会员管理软件短信设置教程

养身馆推拿会员管理系统&#xff0c;佳易王推拿会员管理软件短信设置教程 一、佳易王会员管理软件大众版 部分功能简介&#xff1a; 1、会员信息登记 &#xff1a;可以直接使用手机号登记&#xff0c;也可以使用实体卡片&#xff0c;推荐用手机号即可。 2、会员卡类型 &…

压缩docker在主机的虚拟磁盘容量

我们在windows里使用docker时会发现&#xff0c;即使我们已经删除了无用的镜像和容器&#xff0c;主机里挂在docker虚拟磁盘的那个盘&#xff0c;可用空间也没有增加&#xff0c;这是因为虚拟磁盘不会自动缩小&#xff0c;这里我分享一个可用的解决方案。 1.先通过docker回收空…

大小堆的实现(C语言)

目录 前言 一种完全二叉树&#xff1a;堆 堆的概念 堆的性质 建堆的时间复杂度 建堆的空间复杂度&#xff1a; 小堆的实现 必要补充 堆的初始化 堆的销毁 向上调整算法 堆的插入 向下调整算法 堆的删除 获取堆顶元素 获取堆中元素个数 堆的判空 最终代码 He…

保育员个人简历精选7篇

想要在保育员职位的求职过程中脱颖而出吗&#xff0c;参考这7篇精选的保育员简历案例&#xff01;无论您的经验如何&#xff0c;都能找到适合自己的简历样式及参考内容。 保育员个人简历模板下载&#xff08;可在线编辑制作&#xff09;&#xff1a;来幻主简历&#xff0c;做好…

免费HTTPS证书

什么是HTTPS呢&#xff1f;HTTPS全称为Hyper Text Transfer Protocol Secure&#xff0c;即超文本传输安全协议。它是在HTTP的基础上加入了SSL/TLS协议&#xff0c;可以对传输的数据进行加密&#xff0c;有效防止数据被第三方截取或篡改&#xff0c;从而保障了用户的信息安全。…

Docker Compose简单入门

Docker Compose 简介 Docker Compose 是一个编排多容器发布式部署的工具&#xff0c;提供命令集管理容器化应用的完整开发周期&#xff0c;包括服务构建&#xff0c;启动和停止。 Docker Compose 真正的作用是在一个文件&#xff08;docker-compose.yml&#xff09;中定义并运…