Linux 内核clk 添加clk provider
2017-03-27 08:02
176 查看
内核把所有的clk provider管理维护起来,这些存放在of_clk_providers链表当中,
这个provider定义如下:
struct of_clk_provider {
struct list_head link;
struct device_node *node;
struct clk *(*get)(struct of_phandle_args *clkspec, void *data);
struct clk_hw *(*get_hw)(struct of_phandle_args *clkspec, void *data);
void *data;
};
static LIST_HEAD(of_clk_providers); static DEFINE_MUTEX(of_clk_lock);
添加函数:
/**
* of_clk_add_provider() - Register a clock provider for a node
* @np: Device node pointer associated with clock provider
* @clk_src_get: callback for decoding clock
* @data: context pointer for @clk_src_get callback.
*/
int of_clk_add_provider(struct device_node *np,
struct clk *(*clk_src_get)(struct of_phandle_args *clkspec,
void *data),
void *data)
{
struct of_clk_provider *cp;
cp = kzalloc(sizeof(struct of_clk_provider), GFP_KERNEL);
if (!cp)
return -ENOMEM;
cp->node = of_node_get(np);
cp->data = data;
cp->get = clk_src_get;
mutex_lock(&of_clk_lock);
list_add(&cp->link, &of_clk_providers);
mutex_unlock(&of_clk_lock);
pr_debug("Added clock from %s\n", np->full_name);
return 0;
}
删除操作
/**
* of_clk_del_provider() - Remove a previously registered clock provider
* @np: Device node pointer associated with clock provider
*/
void of_clk_del_provider(struct device_node *np)
{
struct of_clk_provider *cp;
mutex_lock(&of_clk_lock);
list_for_each_entry(cp, &of_clk_providers, link) {
if (cp->node == np) {
list_del(&cp->link);
of_node_put(cp->node);
kfree(cp);
break;
}
}
mutex_unlock(&of_clk_lock);
}
获取clk:
struct clk *of_clk_get_from_provider(struct of_phandle_args *clkspec)
{
struct of_clk_provider *provider;
struct clk *clk = ERR_PTR(-ENOENT);
/* Check if we have such a provider in our array */
mutex_lock(&of_clk_lock);
list_for_each_entry(provider, &of_clk_providers, link) {
if (provider->node == clkspec->np)
clk = provider->get(clkspec, provider->data);
if (!IS_ERR(clk))
break;
}
mutex_unlock(&of_clk_lock);
return clk;
}
相关文章推荐
- 在LINUX中添加按键的驱动并编译进入内核
- linux 添加内核模块
- Linux 2.6.35内核配置和网卡驱动添加
- linux-2.6.35内核移植—USB驱动的添加
- linux-2.6.35内核移植—LCD驱动的添加
- Linux启动添加内核参数简介
- Linux-2.6.32.2内核在mini2440上的移植(八)---添加ADC驱动
- linux-2.6.35内核配置和网卡驱动添加
- Linux内核实践 - 如何添加网络协议[一]:目的
- Linux-2.6.32.2内核在mini2440上的移植(五)---添加LCD背光驱动
- linux2.6内核中如何添加新的文件系统
- Linux添加内核系统调用报告
- Linux内核开发之将驱动程序添加到内核
- Linux-2.6.22.6 内核移植--添加USB设备驱动
- 如何将自己的模块添加到Linux 2.6内核的配置系统中
- 【内核】Linux添加系统调用(静态,非动态加载模块)
- (转载) 使用 Linux 系统调用的内核命令, 探究 SCI(systen call interface) 并添加自己的调用.
- Linux内核开发之将驱动程序添加到内核
- linux-2.6.35内核移植—网卡驱动的添加
- Linux-2.6.32.2内核在mini2440上的移植(七)---添加ADC驱动