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

相关文章

jdk21下载、安装详细教程(Windows、Linux、macOS)

《jdk21下载、安装详细教程(Windows、Linux、macOS)》本文介绍了OpenJDK21的下载地址和安装步骤,包括Windows、Linux和macOS平台,下载后解压并设置环境变量,最... 目录1、官网2、下载openjdk3、安装4、验证1、官网官网地址:OpenJDK下载地址:Ar

linux本机进程间通信之UDS详解

《linux本机进程间通信之UDS详解》文章介绍了Unix域套接字(UDS)的使用方法,这是一种在同一台主机上不同进程间通信的方式,UDS支持三种套接字类型:SOCK_STREAM、SOCK_DGRA... 目录基础概念本机进程间通信socket实现AF_INET数据收发示意图AF_Unix数据收发流程图A

linux环境openssl、openssh升级流程

《linux环境openssl、openssh升级流程》该文章详细介绍了在Ubuntu22.04系统上升级OpenSSL和OpenSSH的方法,首先,升级OpenSSL的步骤包括下载最新版本、安装编译... 目录一.升级openssl1.官网下载最新版openssl2.安装编译环境3.下载后解压安装4.备份

linux打包解压命令方式

《linux打包解压命令方式》文章介绍了Linux系统中常用的打包和解压命令,包括tar和zip,使用tar命令可以创建和解压tar格式的归档文件,使用zip命令可以创建和解压zip格式的压缩文件,每... 目录Lijavascriptnux 打包和解压命令打包命令解压命令总结linux 打包和解压命令打

linux如何复制文件夹并重命名

《linux如何复制文件夹并重命名》在Linux系统中,复制文件夹并重命名可以通过使用“cp”和“mv”命令来实现,使用“cp-r”命令可以递归复制整个文件夹及其子文件夹和文件,而使用“mv”命令可以... 目录linux复制文件夹并重命名我们需要使用“cp”命令来复制文件夹我们还可以结合使用“mv”命令总

Linux使用cut进行文本提取的操作方法

《Linux使用cut进行文本提取的操作方法》Linux中的cut命令是一个命令行实用程序,用于从文件或标准输入中提取文本行的部分,本文给大家介绍了Linux使用cut进行文本提取的操作方法,文中有详... 目录简介基础语法常用选项范围选择示例用法-f:字段选择-d:分隔符-c:字符选择-b:字节选择--c

Linux使用nload监控网络流量的方法

《Linux使用nload监控网络流量的方法》Linux中的nload命令是一个用于实时监控网络流量的工具,它提供了传入和传出流量的可视化表示,帮助用户一目了然地了解网络活动,本文给大家介绍了Linu... 目录简介安装示例用法基础用法指定网络接口限制显示特定流量类型指定刷新率设置流量速率的显示单位监控多个

ElasticSearch+Kibana通过Docker部署到Linux服务器中操作方法

《ElasticSearch+Kibana通过Docker部署到Linux服务器中操作方法》本文介绍了Elasticsearch的基本概念,包括文档和字段、索引和映射,还详细描述了如何通过Docker... 目录1、ElasticSearch概念2、ElasticSearch、Kibana和IK分词器部署

Linux流媒体服务器部署流程

《Linux流媒体服务器部署流程》文章详细介绍了流媒体服务器的部署步骤,包括更新系统、安装依赖组件、编译安装Nginx和RTMP模块、配置Nginx和FFmpeg,以及测试流媒体服务器的搭建... 目录流媒体服务器部署部署安装1.更新系统2.安装依赖组件3.解压4.编译安装(添加RTMP和openssl模块

linux下多个硬盘划分到同一挂载点问题

《linux下多个硬盘划分到同一挂载点问题》在Linux系统中,将多个硬盘划分到同一挂载点需要通过逻辑卷管理(LVM)来实现,首先,需要将物理存储设备(如硬盘分区)创建为物理卷,然后,将这些物理卷组成... 目录linux下多个硬盘划分到同一挂载点需要明确的几个概念硬盘插上默认的是非lvm总结Linux下多