linux 电源管理子系统驱动范例
pm子系统控制器范例如下// SPDX-License-Identifier: GPL-2.0//#define DEBUG#includelinux/slab.h#includelinux/io.h#includelinux/spinlock.h#includelinux/pm_domain.h#includelinux/delay.h#includedt-bindings/clock/cru_temp_dts.h#includetemp_clk.h#defineSYS_PWR_CTL_OFF0x8#defineSYS_PWR_STATUS_OFF0xcstructpower_desc{constchar*constname;uint8_tbit;unsignedintflags;};structtemp_power_dev{structtemp_power*power;structgeneric_pm_domaingenpd;//表示需要初始化的电源域对象uint32_tmask;};structtemp_power{void__iomem*base;spinlock_tlock;structtemp_power_dev*dev;structgenpd_onecell_datagenpd_data;structgeneric_pm_domain**genpd;};#definePOWER_DESC_ITEM(NAME,BIT,FLAGS){\.name(NAME),\.bit(BIT),\.flags(FLAGS),\}staticstructpower_descpower_desc_table[]{POWER_DESC_ITEM(cpu0,PWR_CPU0,GENPD_FLAG_ALWAYS_ON),POWER_DESC_ITEM(cpu1,PWR_CPU1,GENPD_FLAG_ALWAYS_ON),POWER_DESC_ITEM(cpu2,PWR_CPU2,GENPD_FLAG_ALWAYS_ON),POWER_DESC_ITEM(cpu3,PWR_CPU3,GENPD_FLAG_ALWAYS_ON),POWER_DESC_ITEM(epp0,PWR_EPP0,0),POWER_DESC_ITEM(epp1,PWR_EPP1,0),POWER_DESC_ITEM(epp2,PWR_EPP2,0),POWER_DESC_ITEM(epp3,PWR_EPP3,0),POWER_DESC_ITEM(vpu0,PWR_VPU0,0),POWER_DESC_ITEM(vpu1,PWR_VPU1,0),POWER_DESC_ITEM(vpu2,PWR_VPU2,0),POWER_DESC_ITEM(npu,PWR_NPU,0),POWER_DESC_ITEM(pcie,PWR_PCIE,0),};staticinttemp_power_get_state(structtemp_power_dev*pmd,bool*is_on){structtemp_power*powerpmd-power;if(!pmd-mask){*is_onfalse;pr_err(%s: mask is a invalid parameter\n,__func__);return-EINVAL;}/* * System Power Status SYS_PWR_STATUS * 1: power on * 0: power off * */*is_onreadl(power-baseSYS_PWR_STATUS_OFF)pmd-mask;pr_debug(%s: [%-4s] get power is %d, val0x%08x, mask0x%08x\n,__func__,pmd-genpd.name,*is_on,readl(power-baseSYS_PWR_STATUS_OFF),pmd-mask);return0;}staticinttemp_power_set_state(structtemp_power_dev*pmd,bool on){structtemp_power*powerpmd-power;uint32_tval,retry0,max_retry20;bool status;if(!pmd-mask){pr_err(%s: mask is a invalid parameter\n,__func__);return-EINVAL;}/* * System Power Control SYS_PWR_CTRL * 1: power off; * 0: power on * */spin_lock(power-lock);valreadl(power-baseSYS_PWR_CTL_OFF);if(on)val~pmd-mask;elseval|pmd-mask;writel(val,power-baseSYS_PWR_CTL_OFF);do{statusreadl(power-baseSYS_PWR_STATUS_OFF)pmd-mask;udelay(1);retry;}while(on!statusretrymax_retry);pr_debug(%s: [%-4s] set power is %d, ctl val0x%x, status val0x%x, retry%d\n,__func__,pmd-genpd.name,on,readl(power-baseSYS_PWR_CTL_OFF),readl(power-baseSYS_PWR_STATUS_OFF),retry);spin_unlock(power-lock);if(retrymax_retry){pr_err(%s: [%s] set failed, on%d\n,__func__,pmd-genpd.name,on);return-1;}return0;}staticinttemp_power_on(structgeneric_pm_domain*genpd){structtemp_power_dev*pmdcontainer_of(genpd,structtemp_power_dev,genpd);returntemp_power_set_state(pmd,true);}staticinttemp_power_off(structgeneric_pm_domain*genpd){structtemp_power_dev*pmdcontainer_of(genpd,structtemp_power_dev,genpd);returntemp_power_set_state(pmd,false);}int__inittemp_register_power(structdevice_node*np,void__iomem*base){structtemp_power*power;structpower_desc*entry,*tablepower_desc_table;unsignedintidx0;intret;powerkzalloc(sizeof(*power),GFP_KERNEL);if(!power){pr_err(%s: failed to alloc power\n,__func__);return-ENOMEM;}power-basebase;spin_lock_init(power-lock);power-genpd_data.num_domainsPWR_MAX_NR;power-devkcalloc(power-genpd_data.num_domains,sizeof(structtemp_power_dev),GFP_KERNEL);if(!power-dev){pr_err(%s: failed to alloc power_dev.\n,__func__);return-ENOMEM;}power-genpdkcalloc(power-genpd_data.num_domains,sizeof(structgeneric_pm_domain*),GFP_KERNEL);if(!power-genpd){pr_err(%s: failed to alloc genpd.\n,__func__);return-ENOMEM;}power-genpd_data.domainspower-genpd;for(entrytable;entry-name;entry){structtemp_power_dev*pmdpower-dev[idx];bool is_on;pmd-powerpower;pmd-maskBIT(entry-bit);pmd-genpd.nameentry-name;pmd-genpd.flagsentry-flags;rettemp_power_get_state(pmd,is_on);if(ret)pr_warn(%s: unable to get current state for %s\n,__func__,pmd-genpd.name);//重点实现的两个函数pmd-genpd.power_ontemp_power_on;pmd-genpd.power_offtemp_power_off;/* 初始化一个通用I/O电源域对象 genpd: 指向需要初始化的PM域对象 gov: 与该域关联的 PM 域管理器可为 NULL is_off: 指定域的初始电源状态开或关 */retpm_genpd_init(pmd-genpd,NULL,!is_on);if(ret)pr_warn(%s: [%s] pm genpd init err. is_on%d, ret%d,__func__,pmd-genpd.name,is_on,ret);power-genpd[entry-bit]pmd-genpd;idx;}//完成power domain的注册retof_genpd_add_provider_onecell(np,power-genpd_data);if(ret){pr_err(%s: failed to register genpd driver: %d\n,__func__,ret);returnret;}pr_notice(%s: registered %u power domains\n,__func__,idx);return0;}在设备树里主要实现power-domains属性例如power-domainscru PWR_PCIE;参考http://www.wowotech.net/pm_subsystem/pm_architecture.html

相关新闻

AI原生应用开发实战:从Spring AI集成到RAG与Agent架构演进

AI原生应用开发实战:从Spring AI集成到RAG与Agent架构演进

🚀 30款热门AI模型一站整合,DeepSeek/GLM/Qwen 随心用,限时 5 折。 👉 点击领海量免费额度 在实际技术团队中,我们常常听到“AI正在改变一切”的宏大叙事,但具体到日常开发、项目管理、技术选型乃至个人…

2026/7/10 7:56:15阅读更多 →
Typeoff v1.0.63 更新|Mac 用户重点升级!权限、稳定性、降噪全面优化

Typeoff v1.0.63 更新|Mac 用户重点升级!权限、稳定性、降噪全面优化

长期使用 Typeoff 的 macOS 用户应该深有体会:之前初次安装,经常要手动开启系统自带语音识别权限;蓝牙耳机断开后录音直接失效、录音状态指示灯偶尔消失、软件更新后启动异常…… 本次 v1.0.63 版本针对性解决大量 Mac 生态痛点,同…

2026/7/10 7:56:15阅读更多 →
3种74系列芯片在自动售货机电路中的核心应用:Multisim仿真对比

3种74系列芯片在自动售货机电路中的核心应用:Multisim仿真对比

74系列芯片在自动售货机电路中的核心应用与Multisim仿真实战自动售货机的电路设计是数字逻辑课程的经典实践项目,它完美融合了译码器、锁存器和加法器等基础数字集成电路的应用。本文将聚焦74LS138、74LS273和74LS283这三款核心芯片,通过Multisim仿真平台…

2026/7/10 7:56:15阅读更多 →
AD5593R与TM4C1294KCPDT的硬件设计与应用解析

AD5593R与TM4C1294KCPDT的硬件设计与应用解析

1. AD5593R与TM4C1294KCPDT的硬件组合解析AD5593R是ADI公司推出的一款12位可配置ADC/DAC芯片,具有8个可独立配置的I/O引脚。这些引脚可以灵活设置为DAC输出、ADC输入、数字输出或数字输入。这种高度可配置性使其成为嵌入式系统中模拟信号处理的理想选择。TM4C1294KC…

2026/7/10 9:11:20阅读更多 →
Windows苹果触控板终极指南:mac-precision-touchpad驱动全面解析

Windows苹果触控板终极指南:mac-precision-touchpad驱动全面解析

Windows苹果触控板终极指南:mac-precision-touchpad驱动全面解析 【免费下载链接】mac-precision-touchpad Windows Precision Touchpad Driver Implementation for Apple MacBook / Magic Trackpad 项目地址: https://gitcode.com/gh_mirrors/ma/mac-precision-t…

2026/7/10 9:11:20阅读更多 →
基于大模型与自动化工作流实现AI Agent自构建的工程实践

基于大模型与自动化工作流实现AI Agent自构建的工程实践

🚀 30款热门AI模型一站整合,DeepSeek/GLM/Qwen 随心用,限时 5 折。 👉 点击领海量免费额度 在探索AI Agent开发的路上,你是否曾想过,能否让一个AI Agent去自动构建另一个AI Agent?这听起来像…

2026/7/10 9:11:20阅读更多 →
Python手机号查QQ号终极指南:3分钟掌握高效查询技术

Python手机号查QQ号终极指南:3分钟掌握高效查询技术

Python手机号查QQ号终极指南:3分钟掌握高效查询技术 【免费下载链接】phone2qq 项目地址: https://gitcode.com/gh_mirrors/ph/phone2qq 在数字身份管理日益重要的今天,快速查询手机号关联的QQ号成为许多开发者和技术爱好者的实际需求。phone2qq…

2026/7/10 9:11:20阅读更多 →
Dify实战指南:从零构建智能客服工单处理自动化工作流

Dify实战指南:从零构建智能客服工单处理自动化工作流

🚀 30款热门AI模型一站整合,DeepSeek/GLM/Qwen 随心用,限时 5 折。 👉 点击领海量免费额度 如果你是一名开发者,最近一定被“AI应用开发”和“智能体”这两个词频繁刷屏。从ChatGPT的爆火到各类AI Agent平台的涌现&…

2026/7/10 9:11:20阅读更多 →
广州吟颂调研:职称评审的“可控性”博弈:实力之外,拼的是信息与细节

广州吟颂调研:职称评审的“可控性”博弈:实力之外,拼的是信息与细节

职称评审是许多职场人职业生涯中的一道“硬门槛”。每到申报季,总有人感叹“明明条件都够,为什么没过”,也有人看似“擦边”却顺利通过。抛开运气成分,评审本质上是一场**“材料合规性价值证明力”**的比拼。下面这5个策略&#x…

2026/7/10 9:06:19阅读更多 →
从GitHub安全案例解析常见漏洞与防护实践

从GitHub安全案例解析常见漏洞与防护实践

1. 项目概述:从GitHub Trending看安全实战 最近在GitHub Trending上看到一个项目,叫 skills4/skills ,它因为一些安全漏洞案例被大家讨论。这其实是一个挺典型的场景:一个旨在展示或教授某种技能的仓库,本身却成了安…

2026/7/9 5:56:19阅读更多 →
MLT 2026启示:因果推理与概率建模驱动下一代LLM应用

MLT 2026启示:因果推理与概率建模驱动下一代LLM应用

# MLT 2026启示:因果推理与概率建模驱动下一代LLM应用## 一、背景与挑战:从“黑箱预测”到“可信推理”2026年6月,第7届机器学习与趋势国际会议(MLT 2026)将在悉尼召开。会议议程中,“因果与可解释机器学习…

2026/7/9 9:45:20阅读更多 →
通达OA SQL注入漏洞深度剖析:从手工注入到自动化利用与防御

通达OA SQL注入漏洞深度剖析:从手工注入到自动化利用与防御

1. 项目概述与漏洞背景最近在梳理一些历史OA系统的安全风险时,通达OA v11.6版本中的一个老漏洞又进入了我的视线。这个漏洞位于/general/bi_design/appcenter/report_bi.func.php文件中,是一个典型的SQL注入点。虽然这个漏洞的利用方式看起来并不复杂&am…

2026/7/10 4:59:05阅读更多 →
浏览器缓存行为深度解析:Chrome/Firefox/Safari 对 304 响应的 5 种触发场景对比

浏览器缓存行为深度解析:Chrome/Firefox/Safari 对 304 响应的 5 种触发场景对比

浏览器缓存行为深度解析:Chrome/Firefox/Safari 对 304 响应的 5 种触发场景对比当你在浏览器地址栏敲入一个网址时,背后可能隐藏着一场关于"要不要重新下载资源"的精密博弈。这场博弈的裁判是HTTP缓存机制,而304状态码则是这场博弈…

2026/7/10 0:00:01阅读更多 →
RoboWits:面向创造性问题求解的双臂机器人认知推理基准

RoboWits:面向创造性问题求解的双臂机器人认知推理基准

1. 项目概述:这不是又一个机器人抓取数据集,而是一次对“思考力”的压力测试 RoboWits——这个名字里藏着两个关键信号:“Robo”直指物理世界中的具身智能体,“Wits”则毫不掩饰地指向人类最核心的认知能力:机敏、判断…

2026/7/10 0:00:01阅读更多 →
5分钟完全指南:如何使用TegraRcmGUI图形化工具解锁Switch无限可能

5分钟完全指南:如何使用TegraRcmGUI图形化工具解锁Switch无限可能

5分钟完全指南:如何使用TegraRcmGUI图形化工具解锁Switch无限可能 【免费下载链接】TegraRcmGUI C GUI for TegraRcmSmash (Fuse Gele exploit for Nintendo Switch) 项目地址: https://gitcode.com/gh_mirrors/te/TegraRcmGUI TegraRcmGUI是一款专为Windows…

2026/7/10 0:00:01阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/9 9:45:20阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/9 15:50:44阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/9 14:14:17阅读更多 →