RK3399教程:linux clk使用

linux clk使用

在linux的clk的设备模型中,clk分为生产者和消费者,生产者是soc的厂商编写的clk驱动,注册到clk管理框架中。消费者就是具体的设备驱动,设备驱动根据标准的函数获取到clk的句柄,然后设置和配置产生clk。为何这么设计?其实也很简单,芯片产商最清楚clk的锁相环怎么设置,所以这部分驱动由芯片产商去编写,我们设备驱动只要使用标准的api就可以使用时钟了,所以这个框架将很底层的芯片clk的管理抽象出来做了一套通用的架构,好处就是将耦合性降到最低比如芯片厂商有MTK,ROCKCHIP,我们的设备驱动调用统一的API就可以跑在MTK,ROCKCHIP各个芯片上,所以这么做写出的设备驱动的代码通用性就更强了。

驱动中使用clk函数

设备驱动作为消费者,调用标准的API对clk进行配置。

  es7243->mclk = devm_clk_get(codec->dev, "mclk");  //获取clk资源
  ret = clk_prepare_enable(es7243->mclk);          //使能输出clk

驱动中使用clk dts配置

  //clock的使用者es7243_10,即设备驱动,在我们这里是一个ADC芯片,需要SOC输出MCLK。
  es7243_10: es7243@10 {
		status = "okay";
		compatible = "everest,es7243";
		reg = <0x10>;
		#sound-dai-cells = <0>;
		clocks = <&cru SCLK_I2S_8CH_OUT>;       //调用clock的生产者cru,传入参数SCLK_I2S_8CH_OUT,表示你要使用SCLK_I2S_8CH_OUT这个clk
        /*clock-names = "mclk"; 用于设置别名方便用于统一使用,例如es7243->mclk = devm_clk_get(codec->dev, "mclk"); 获取mclk进行使用。如果设备节点没有
         clocks = <&cru SCLK_I2S_8CH_OUT>;和clock-names = "mclk"; 驱动中获取devm_clk_get(codec->dev, "mclk"); 将会失败*/
		clock-names = "mclk";                 
		pinctrl-names = "default";
		pinctrl-0 = <&i2s_8ch_mclk>;
	};


//clock的生产者 cru
cru: clock-controller@ff760000 {
		compatible = "rockchip,rk3399-cru";   //搜索这个可以找到clk生产者的驱动
		reg = <0x0 0xff760000 0x0 0x1000>;
		#clock-cells = <1>;
		#reset-cells = <1>;
		assigned-clocks =
			<&cru ACLK_VOP0>, <&cru HCLK_VOP0>,
			<&cru ACLK_VOP1>, <&cru HCLK_VOP1>,
			<&cru ARMCLKL>, <&cru ARMCLKB>,
			<&cru PLL_GPLL>, <&cru PLL_CPLL>,
			<&cru ACLK_GPU>, <&cru PLL_NPLL>,
			<&cru ACLK_PERIHP>, <&cru HCLK_PERIHP>,
			<&cru PCLK_PERIHP>,
			<&cru ACLK_PERILP0>, <&cru HCLK_PERILP0>,
			<&cru PCLK_PERILP0>, <&cru ACLK_CCI>,
			<&cru HCLK_PERILP1>, <&cru PCLK_PERILP1>,
			<&cru ACLK_VIO>, <&cru ACLK_HDCP>,
			<&cru ACLK_GIC_PRE>,
			<&cru PCLK_DDR>;
		assigned-clock-rates =
			 <400000000>,  <200000000>,
			 <400000000>,  <200000000>,
			 <816000000>, <816000000>,
			 <594000000>,  <800000000>,
			 <200000000>, <1000000000>,
			 <150000000>,   <75000000>,
			  <37500000>,
			 <100000000>,  <100000000>,
			  <50000000>, <600000000>,
			 <100000000>,   <50000000>,
			 <400000000>, <400000000>,
			 <200000000>,
			 <200000000>;
	};

猜你喜欢

转载自blog.csdn.net/qq_27809619/article/details/118545962