linux 内核regulator

news2024/11/18 21:31:12

问题

  在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没有生成的根因。由于I2C的问题,导致regulator未生成,进而导致cpufreq在初始化时,查找对应的regulator失败。导致cpufreq相关节点没有生成。

   进一步的问题

    如果cpufreq没有初始化成功,那么CPU的工作频率是多少?

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

React 笔记 jsx

严格约定&#xff1a;React 组件必须以大写字母开头&#xff0c;而 HTML 标签则必须是小写字母。 React JSX JSX 是由 React 推广的 JavaScript 语法扩展。 用于表达组件的 特殊语法的 js 函数 要求标签必须闭合&#xff1b;返回的组件必须包裹在一个父标签内&#xff1b; …

Python使用cURL库下载文件

Python使用cURL库下载文件 cURL库是一个功能强大的工具&#xff0c;可以用于在Python中下载文件。以下是一个简单的Python程序&#xff0c;使用cURL库实现文件下载功能&#xff1a; import subprocess def download_file(url, output_path): command [curl, -o, …

开启全新消费革命——消费增值,让每一笔消费变成财富!

你是否厌倦了仅仅购买物品或享受服务后便一无所有的消费方式&#xff1f;现在&#xff0c;消费增值的概念将彻底改变你的消费观念&#xff01;通过参与消费增值&#xff0c;你的每一笔消费都将变得更有价值&#xff01; 消费增值是一种全新的消费理念&#xff0c;它让你在购物的…

前后端验证码分析(字母计算)

样式&#xff1a; 前端&#xff1a; login.vue <template> <view class"normal-login-container"> <view class"login-form-content"> <view class"input-item flex align-center"> <view class"iconfont ic…

SpringBootApplication注解保姆级带你如何应对面试官

SpringBootApplication注解保姆级带你如何应对面试官 一介绍 在Java Spring Boot框架中&#xff0c;SpringBootApplication注解是一个组合注解&#xff0c;它由以下三个注解组成&#xff1a;SpringBootConfiguration&#xff0c;EnableAutoConfiguration和ComponentScan。 这…

绿色建筑革新,气膜球馆成为城市锻炼新热点

近年来&#xff0c;全民健身设施蓬勃发展&#xff0c;个性化球场设计逐渐取代了传统模式&#xff0c;其中备受欢迎的是新潮的绿色建筑——气膜室内球馆。这种创新的建筑形式不仅适用于传统的篮球、足球、羽毛球等常规运动&#xff0c;还可以容纳冰壶、滑雪等更为复杂的活动&…

MySQL入门实战:安装与配置基础

MySQL是一个开源的关系型数据库管理系统&#xff0c;由瑞典MySQL AB公司开发&#xff0c;目前已经被Sun Microsystems公司收购。MySQL是一个非常流行的数据库管理系统&#xff0c;它的特点是轻量级、高性能、易于使用和高度可扩展。 MySQL是一个基于客户端/服务器的系统&#…

浅谈基于能耗评价指标的医院智能配电能效管理分析

摘要&#xff1a;目的&#xff1a;为了更好地推进医院能源管理工作&#xff0c;主要利用空调系统分项能耗对上海7所三甲医院能源管理工作存在的问题进行分析。方法&#xff1a;Pearson系数被用作分析影响因素与医院总能耗的关联程度&#xff0c;再利用单位面积总能耗和空调系统…

基于Gradio的快速搭建AI算法可视化Web界面部署教程

基于Gradio的快速搭建AI算法可视化Web界面部署教程 1 Gradio简介1.1 视图框架1.2 Gradio介绍 2 功能模块2.1 概述2.2 模块介绍2.2.1 gradio.File() 上传文件2.2.2 gradio.Slider() 配置滑动条2.2.3 gr.Textbox() 文本框2.2.4 gradio.Dropdown() 建立下拉列表2.2.5 gradio.inter…

分享80个菜单导航JS特效,总有一款适合您

分享80个菜单导航JS特效&#xff0c;总有一款适合您 80个菜单导航JS特效下载链接&#xff1a;https://pan.baidu.com/s/1NgNc759Kg1of_8vR7kaj6A?pwd6666 提取码&#xff1a;6666 Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 学习知识费力气&#xff0c;…

面向对象及编程

C语言是一门面向过程的编程语言&#xff0c; C、Java这些编程语言都是面向对象。 分门别类&#xff1a;抽取事物的共性&#xff0c;将相似事物归纳为一个类别 面向的对象的核心概念&#xff1a; 类&#xff1a;就是一个事物的类别 |--属性 …

数据结构和算法专题---1、数据结构和算法概述

本文会系统性的介绍算法的概念、复杂度&#xff0c;后续会更新算法思想以及常见的失效算法、限流算法、调度算法、定时算法等&#xff0c;辅助大家快速学习算法和数据结构知识。 概念 数据结构 概述 数据结构是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或…

Ubuntu之Sim2Real环境配置(坑居多)

不要一上来就复制哦&#xff0c;因为很多下面的步骤让我走了很多弯路&#xff0c;如果可能的话&#xff0c;我会重新整理再发出来 前提&#xff1a; 参考教程 Docs 创建工作空间(不用跟着操作&#xff0c;无用&#xff09; 1.创建sim2real server container 1.尝试创建sim2r…

Python 解析JSON实现主机管理

JSON&#xff08;JavaScript Object Notation&#xff09;是一种轻量级的数据交换格式&#xff0c;它以易于阅读和编写的文本形式表示数据。JSON 是一种独立于编程语言的数据格式&#xff0c;因此在不同的编程语言中都有对应的解析器和生成器。JSON 格式的设计目标是易于理解、…

防火墙规则保存及自定义链

目录 防火墙规则保存 备份工具 iptables services 自定义链 自定义链实现方式 删除自定义链 重命名自定义链 防火墙规则保存 命令&#xff1a;iptables -save 工具&#xff1a;iptables services [rootlocalhost ~]# iptables-save > /opt/iptables.bak #将文件保存…

科普类软文怎么写才能提高用户接受度?媒介盒子分享

科普类软文以干货为主&#xff0c;可以给用户带来实用价值&#xff0c;但是相应会比较枯燥。如何才能把科普内容讲得专业又有趣&#xff0c;从而提高用户接受度呢&#xff1f;媒介盒子接下来就分享三大技巧&#xff1a; 一、 联系产品选题 科普类软文想要写好就需要做好选题&…

【数据结构】手撕排序NO.1

&#x1f525;博客主页&#xff1a; 小羊失眠啦. &#x1f3a5;系列专栏&#xff1a;《C语言》 《数据结构》 《Linux》《Cpolar》 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 文章目录 一、排序的概念及其运用1.1 排序的概念1.2 常见的算法排序 二、 冒泡排序三、直接插入排…

2023年「全球化新品牌」与品牌出海路径洞察分析

观点&#xff1a;全球化品牌是未来品牌发展的最优选择 什么是全球化品牌&#xff1f; •多市场:在全球多个市场均有业务布局&#xff0c;既包括传统市场&#xff0c;也包括新兴市场。 •全渠道:线上第三方平台品牌独立站社交网络线下实体店&#xff0c;从2C扩展到2B。 •本土…

SSM项目实战-前端-在Index.vue中展示第一页数据

1、util/request.js import axios from "axios";let request axios.create({baseURL: "http://localhost:8080",timeout: 50000 });export default request 2、api/schedule.js import request from "../util/request.js";export let getSchedu…