对于一般的驱动开发(非clock驱动),我们只需要在dts中配置时钟,然后在驱动调用通用的时钟API接口即可。
1、设备树中配置时钟
mmc0:mmc0@0x12345678{
compatible = "xx,xx-mmc0";
......
clocks = < &peri PERI_MCI0 >;//指定mmc0的时钟来自PERI_MCI0,PERI_MCI0的父时钟是peri
clocks-names = "mmc0"; //时钟名,调用devm_clk_get获取时钟时,可以传入该名字
......
};
以mmc的设备节点为例,上述mmc0指定了时钟来自PERI_MCI0,PERI_MCI0的父时钟是peri,并将所指定的时钟给它命名为"mmc0"。
2、驱动中使用API接口
简单的使用:
/* 1、获取时钟 */
host- >clk = devm_clk_get(&pdev- >dev, NULL); //或者devm_clk_get(&pdev- >dev, "mmc0")
if (IS_ERR(host- >clk)) {
dev_err(dev, "failed to find clock sourcen");
ret = PTR_ERR(host- >clk);
goto probe_out_free_dev;
}
/* 2、使能时钟 */
ret = clk_prepare_enable(host- >clk);
if (ret) {
dev_err(dev, "failed to enable clock source.n");
goto probe_out_free_dev;
}
probe_out_free_dev:
kfree(host);
在驱动中操作时钟,第一步需要获取struct clk
指针句柄,后续都通过该指针进行操作,例如:设置频率:
ret = clk_set_rate(host- >clk, 300000);
获得频率:
ret = clk_get_rate(host- >clk);
注意:devm_clk_get()的两个参数是二选一,可以都传入,也可以只传入一个参数。
像i2c、mmc等这些外设驱动,通常只需要使能门控即可,因为这些外设并不是时钟源,它们只有开关。如果直接调用clk_ser_rate
函数设置频率,clk_set_rate
会向上传递,即设置它的父时钟频率。例如在该例子中直接调用clk_set_rate
函数,最终设置的是时钟源peri
的频率。
全部0条评论
快来发表一下你的评论吧 !