发布时间:2026/7/10 8:01:18
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

相关新闻

FitGirl游戏启动器终极指南:5分钟打造你的专属游戏库
2026/7/10 8:01:18

FitGirl游戏启动器终极指南:5分钟打造你的专属游戏库

FitGirl游戏启动器终极指南:5分钟打造你的专属游戏库 【免费下载链接】Fitgirl-Repack-Launcher An Electron launcher designed specifically for FitGirl Repacks, utilizing pure vanilla JavaScript, HTML, and CSS for optimal performance and customization …

阅读更多
Unity WebGL输入法支持:WebGLInput插件原理与实战指南
2026/7/10 7:01:18

Unity WebGL输入法支持:WebGLInput插件原理与实战指南

1. 项目概述:WebGLInput 是什么,以及它为何如此重要如果你是一名Unity开发者,并且你的项目需要发布到WebGL平台,那么你大概率遇到过那个令人头疼的问题:在网页里,Unity的输入框(InputField&…

阅读更多
PyCharm专业版下载、安装教程,附详细图文
2026/7/10 7:01:18

PyCharm专业版下载、安装教程,附详细图文

今天给大家带来 JetBrains PyCharm 2025.1 专业版的详细下载与安装教程。PyCharm 是目前最强大的 Python 集成开发环境(IDE)之一。本教程基于 Windows 系统,包含完整的安装步骤,有需要的同学建议收藏! 一、下载 PyCh…

阅读更多
2026年Windows笔记本替代MacBook全攻略:选型、配置与迁移避坑指南
2026/7/10 10:01:18

2026年Windows笔记本替代MacBook全攻略:选型、配置与迁移避坑指南

🚀 30款热门AI模型一站整合,DeepSeek/GLM/Qwen 随心用,限时 5 折。 👉 点击领海量免费额度 如果你正在寻找一台能在 2026 年替代 MacBook 的 Windows 笔记本,无论是出于预算、软件兼容性、硬件可扩展性,…

阅读更多
Unity打包后Timeline动画引用丢失:从原理到修复的完整指南
2026/7/10 10:01:18

Unity打包后Timeline动画引用丢失:从原理到修复的完整指南

1. 项目概述:当Timeline遇上AssetBundle,一场预谋已久的“失踪案”如果你是一名Unity开发者,尤其是负责过项目资源管理和最终发布的同学,那么“打包后Timeline动画引用丢失”这个问题,大概率是你职业生涯中一场令人印象…

阅读更多
3分钟掌握NCM音乐解密:终极免费工具ncmdump使用完全指南
2026/7/10 10:01:18

3分钟掌握NCM音乐解密:终极免费工具ncmdump使用完全指南

3分钟掌握NCM音乐解密:终极免费工具ncmdump使用完全指南 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式无法在其他设备播放而烦恼吗?ncmdump是一款专为NCM音乐格式解密设计的开…

阅读更多
为什么你的seed总“跑偏”?Midjourney 2024 Q2模型更新后seed稳定性断崖式下降的3个技术根源
2026/7/10 10:01:18

为什么你的seed总“跑偏”?Midjourney 2024 Q2模型更新后seed稳定性断崖式下降的3个技术根源

更多请点击: https://codechina.net 第一章:Midjourney Seed机制的本质与设计初衷 Midjourney 的 Seed 机制并非简单的随机数种子复用工具,而是一种**确定性图像生成锚点系统**——它将扩散过程中的噪声初始状态、潜在空间采样路径及模型内部…

阅读更多
Claude Fable 5系统提示词缩减80%:大模型工程化效率变革
2026/7/10 10:01:18

Claude Fable 5系统提示词缩减80%:大模型工程化效率变革

🚀 30款热门AI模型一站整合,DeepSeek/GLM/Qwen 随心用,限时 5 折。 👉 点击领海量免费额度 那天下午,我正调试一个需要调用 Claude 的自动化脚本,突然收到一连串报错: unable to connect to…

阅读更多
Citra模拟器终极指南:在电脑上重温3DS经典游戏
2026/7/10 9:01:18

Citra模拟器终极指南:在电脑上重温3DS经典游戏

Citra模拟器终极指南:在电脑上重温3DS经典游戏 【免费下载链接】citra A Nintendo 3DS Emulator 项目地址: https://gitcode.com/GitHub_Trending/ci/citra 想象一下,你正坐在电脑前,想要重温那些让你童年充满欢乐的任天堂3DS游戏。但…

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

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

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

阅读更多
3步彻底解决Windows右键菜单混乱问题:ContextMenuManager使用全攻略
2026/7/9 0:51:16

3步彻底解决Windows右键菜单混乱问题:ContextMenuManager使用全攻略

3步彻底解决Windows右键菜单混乱问题:ContextMenuManager使用全攻略 【免费下载链接】ContextMenuManager 🖱️ 纯粹的Windows右键菜单管理程序 项目地址: https://gitcode.com/gh_mirrors/co/ContextMenuManager 你是否曾为Windows右键菜单中那些…

阅读更多
GXDE OS下Wayland兼容性实战:从deepin-mutter原理到VMware Tools修复
2026/7/8 22:48:04

GXDE OS下Wayland兼容性实战:从deepin-mutter原理到VMware Tools修复

如果你正在用 GXDE OS 或者任何基于 Deepin 的发行版,并且遇到了“检测到窗口系统采用 Wayland 协议,程序即将退出”这类弹窗,或者发现 VMware Tools 在 Ubuntu 24.04 这类默认 Wayland 的系统上启动失败,那这篇文章就是为你准备的…

阅读更多
Hive 倾斜 Join 实战:大表关联小表为什么也会慢
2026/7/10 0:01:17

Hive 倾斜 Join 实战:大表关联小表为什么也会慢

Hive 倾斜 Join 实战:大表关联小表为什么也会慢 一、一个反直觉的性能问题 "这不可能!小表才 5 万行,大表 5 亿行,Join 一下怎么会跑两个小时?" 上个月同事小王盯着 Yarn 上快跑炸的 MapReduce 任务&#xf…

阅读更多
无需安装 Office,用 Python 轻松替换 Excel 数据
2026/7/10 0:01:17

无需安装 Office,用 Python 轻松替换 Excel 数据

核心对象模型 库的核心操作围绕两个对象展开: Workbook:代表整个 Excel 工作簿,负责文件的加载与保存 Worksheet:代表单个工作表,提供单元格访问与查找替换能力 导入方式: from spire.xls import * from …

阅读更多
WindowResizer:终极免费窗口强制调整工具,轻松突破Windows尺寸限制
2026/7/10 0:01:17

WindowResizer:终极免费窗口强制调整工具,轻松突破Windows尺寸限制

WindowResizer:终极免费窗口强制调整工具,轻松突破Windows尺寸限制 【免费下载链接】WindowResizer 一个可以强制调整应用程序窗口大小的工具 项目地址: https://gitcode.com/gh_mirrors/wi/WindowResizer 还在为那些无法拖拽的"顽固窗口&qu…

阅读更多
基于Dify与DeepSeek构建私有知识库问答系统实战指南
2026/7/8 18:15:39

基于Dify与DeepSeek构建私有知识库问答系统实战指南

在业务中快速构建一个能理解私有文档、准确回答专业问题的智能助手,是很多开发团队面临的共同挑战。传统方案往往需要从零开始搭建复杂的 RAG(检索增强生成)系统,涉及文档解析、向量化、检索、大模型调用等多个环节,整…

阅读更多
FAE放射组学分析工具:医学影像特征探索的完整解决方案
2026/7/8 10:11:21

FAE放射组学分析工具:医学影像特征探索的完整解决方案

FAE放射组学分析工具:医学影像特征探索的完整解决方案 【免费下载链接】FAE FeAture Explorer 项目地址: https://gitcode.com/gh_mirrors/fae/FAE 你是否曾经面对海量医学影像数据感到无从下手?想要从CT、MRI等影像中提取有价值的定量特征&#…

阅读更多
DesktopNaotu:你的终极离线思维导图解决方案,告别网络依赖!
2026/7/9 3:17:42

DesktopNaotu:你的终极离线思维导图解决方案,告别网络依赖!

DesktopNaotu:你的终极离线思维导图解决方案,告别网络依赖! 【免费下载链接】DesktopNaotu 桌面版脑图 (百度脑图离线版,思维导图) 跨平台支持 Windows/Linux/Mac OS. (A cross-platform multilingual Mind Map Tool) 项目地址:…

阅读更多