linux驱动-CCF-2 of_clk_provider

2024-04-25 08:44
文章标签 linux ccf 驱动 clk provider

本文主要是介绍linux驱动-CCF-2 of_clk_provider,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

CCF: common clock frameword

of_clk_provider 总结

1. provider 注册时钟

         hws[i] = desc->clk_register(cprman, desc->data);

        参考https://mp.csdn.net/mp_blog/creation/editor/138153040

2. provider 注册 of_clk_provider

        1. provider 创建了of_clk_provider 结构体,并且存放在全局变量of_clk_providers 中

        2. of_clk_provider 提供了data, 和get/get_hw 函数

参考

bcm2835_clk_probe(struct platform_device *pdev)

{         for (i = 0; i < asize; i++) {
                desc = &clk_desc_array[i];
                if (desc->clk_register && desc->data &&
                    (desc->supported & pdata->soc)) {
                    hws[i] = desc->clk_register(cprman, desc->data);
                }
            }

            ret = of_clk_add_hw_provider(dev->of_node, of_clk_hw_onecell_get,
                      &cprman->onecell);

}

3. consumer 获取 of_clk_provider

      假设consumer 设备树节点中存在 clocks = <0x03 0x2d>;

        a. 根据0x03 获取 provider 的struct device_node A,

        b. 遍历of_clk_providers列表中,of_clk_provier->node 与  A 相等,

            则找到provider 的of_clk_provier。

4. consumer 获取时钟

         调用of_clk_provier 的get函数, 从of_clk_provier的 data树组中,提取到第0x2d个时钟

参考:

devm_clk_get
    clk_get
        __of_clk_get_by_name
            __of_clk_get
                __of_clk_get_from_provider
                {

                        list_for_each_entry(provider, &of_clk_providers, link) {
                                if (provider->node == clkspec->np) {
                                    hw = __of_clk_get_hw_from_provider(provider, clkspec);
                                    clk = __clk_create_clk(hw, dev_id, con_id);
                        }
                 }

 1. of_clk_provier 结构体

struct of_clk_provider {
    struct list_head link;

    struct device_node *node;  //provider 的设备节点
    struct clk *(*get)(struct of_phandle_args *clkspec, void *data);       

                   //a. data 包含了已经注册的时钟数组
                  //b. clkspec->args[0]来自于 consumer节点的clocks属性的时钟说明符,
                  //c. provider 根据 clkspec 查找data 数据,获取指定的时钟 
    struct clk_hw *(*get_hw)(struct of_phandle_args *clkspec, void *data);
    void *data;
};

 2. of_clk_provier 初始化并添加


int of_clk_add_hw_provider(struct device_node *np,struct clk_hw *(*get)(struct of_phandle_args *clkspec,void *data),void *data)
{struct of_clk_provider *cp;int ret;cp = kzalloc(sizeof(*cp), GFP_KERNEL);if (!cp)return -ENOMEM;cp->node = of_node_get(np);cp->data = data;cp->get_hw = get;mutex_lock(&of_clk_mutex);list_add(&cp->link, &of_clk_providers);   //添加到of_clk_providers 全局链表中mutex_unlock(&of_clk_mutex);pr_debug("Added clk_hw provider from %pOF\n", np);ret = of_clk_set_defaults(np, true);if (ret < 0)of_clk_del_provider(np);return ret;
}

 3. 实例- of_clk_provier 的 get/get_hw

=============================================================
ret = of_clk_add_hw_provider(dev->of_node, of_clk_hw_onecell_get, &cprman->onecell);struct clk_hw * of_clk_hw_onecell_get(struct of_phandle_args *clkspec, void *data)
{struct clk_hw_onecell_data *hw_data = data;unsigned int idx = clkspec->args[0];if (idx >= hw_data->num) {pr_err("%s: invalid index %u\n", __func__, idx);return ERR_PTR(-EINVAL);}return hw_data->hws[idx];
}

这篇关于linux驱动-CCF-2 of_clk_provider的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/934206

相关文章

linux hostname设置全过程

《linuxhostname设置全过程》:本文主要介绍linuxhostname设置全过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录查询hostname设置步骤其它相关点hostid/etc/hostsEDChina编程A工具license破解注意事项总结以RHE

Linux中压缩、网络传输与系统监控工具的使用完整指南

《Linux中压缩、网络传输与系统监控工具的使用完整指南》在Linux系统管理中,压缩与传输工具是数据备份和远程协作的桥梁,而系统监控工具则是保障服务器稳定运行的眼睛,下面小编就来和大家详细介绍一下它... 目录引言一、压缩与解压:数据存储与传输的优化核心1. zip/unzip:通用压缩格式的便捷操作2.

Linux中SSH服务配置的全面指南

《Linux中SSH服务配置的全面指南》作为网络安全工程师,SSH(SecureShell)服务的安全配置是我们日常工作中不可忽视的重要环节,本文将从基础配置到高级安全加固,全面解析SSH服务的各项参... 目录概述基础配置详解端口与监听设置主机密钥配置认证机制强化禁用密码认证禁止root直接登录实现双因素

在Linux终端中统计非二进制文件行数的实现方法

《在Linux终端中统计非二进制文件行数的实现方法》在Linux系统中,有时需要统计非二进制文件(如CSV、TXT文件)的行数,而不希望手动打开文件进行查看,例如,在处理大型日志文件、数据文件时,了解... 目录在linux终端中统计非二进制文件的行数技术背景实现步骤1. 使用wc命令2. 使用grep命令

Linux如何快速检查服务器的硬件配置和性能指标

《Linux如何快速检查服务器的硬件配置和性能指标》在运维和开发工作中,我们经常需要快速检查Linux服务器的硬件配置和性能指标,本文将以CentOS为例,介绍如何通过命令行快速获取这些关键信息,... 目录引言一、查询CPU核心数编程(几C?)1. 使用 nproc(最简单)2. 使用 lscpu(详细信

linux重启命令有哪些? 7个实用的Linux系统重启命令汇总

《linux重启命令有哪些?7个实用的Linux系统重启命令汇总》Linux系统提供了多种重启命令,常用的包括shutdown-r、reboot、init6等,不同命令适用于不同场景,本文将详细... 在管理和维护 linux 服务器时,完成系统更新、故障排查或日常维护后,重启系统往往是必不可少的步骤。本文

基于Linux的ffmpeg python的关键帧抽取

《基于Linux的ffmpegpython的关键帧抽取》本文主要介绍了基于Linux的ffmpegpython的关键帧抽取,实现以按帧或时间间隔抽取关键帧,文中通过示例代码介绍的非常详细,对大家的学... 目录1.FFmpeg的环境配置1) 创建一个虚拟环境envjavascript2) ffmpeg-py

Linux脚本(shell)的使用方式

《Linux脚本(shell)的使用方式》:本文主要介绍Linux脚本(shell)的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录概述语法详解数学运算表达式Shell变量变量分类环境变量Shell内部变量自定义变量:定义、赋值自定义变量:引用、修改、删

Linux链表操作方式

《Linux链表操作方式》:本文主要介绍Linux链表操作方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、链表基础概念与内核链表优势二、内核链表结构与宏解析三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势六、典型应用场景七、调试技巧与

详解Linux中常见环境变量的特点与设置

《详解Linux中常见环境变量的特点与设置》环境变量是操作系统和用户设置的一些动态键值对,为运行的程序提供配置信息,理解环境变量对于系统管理、软件开发都很重要,下面小编就为大家详细介绍一下吧... 目录前言一、环境变量的概念二、常见的环境变量三、环境变量特点及其相关指令3.1 环境变量的全局性3.2、环境变