多個codec使用同一份驅動

一般來說,消費電子產品比如智能電視和音箱只有立體聲兩個喇叭,硬件上只需要一個codec芯片即能滿足要求,有時需要做多聲道,這時候可能就用到多個codec芯片了,如果是不同的codec芯片,則分別編寫對應的驅動即可,如果用的都是同一款芯片,那麼就只需要一份驅動即可,方法也簡單。

在dts設備數裏i2c的的模塊添加板子對應的codec,當然i2c地址肯定也是不同的。比如添加3個ti的tas5805 dac:

	tas5805m_2c: tas5805m_2c@2c {
		compatible = "ti,tas5805m_2c";
 		#sound-dai-cells = <0>;
		codec_name = "tas5805m_2c";
		reset_pin = <&gpio GPIOC_13 GPIO_ACTIVE_HIGH>;
		reg = <0x2c>;
		status = "okay";
	};

	tas5805m_2d: tas5805m_2d@2d {
		compatible = "ti,tas5805m_2d";
		#sound-dai-cells = <0>;
		codec_name = "tas5805m_2d";
		reset_pin = <&gpio GPIOC_13 GPIO_ACTIVE_HIGH>;
 		reg = <0x2d>;
		status = "okay";
	};

	tas5805m_2e: tas5805m_2e@2e {
		compatible = "ti,tas5805m_2e";
		#sound-dai-cells = <0>;
		codec_name = "tas5805m_2e";
		reset_pin = <&gpio GPIOC_13 GPIO_ACTIVE_HIGH>;
		reg = <0x2e>;
		status = "okay";
	};

在系統啓動時,I2C總線會在dts設備樹種尋找和of_match_table匹配的設備,如果匹配成功,將會調用codec驅動中註冊的i2c的probe接口,做設備的初始化工作。

所以在dts裏添加的codec 設備裏compatible 和要與驅動中註冊的i2c_device_id與of_device_id中的compatible字段一致,否則會導致註冊失敗,接着來看codec驅動中要添加的部分

static const struct i2c_device_id tas5805m_i2c_id[] = {
-	{"tas5805",},
+	{"tas5805m_2c",},
+	{"tas5805m_2d",},
+	{"tas5805m_2e",},
 	{}
 };
 
@@ -660,7 +662,9 @@ MODULE_DEVICE_TABLE(i2c, tas5805m_i2c_id);
 
 #ifdef CONFIG_OF
 static const struct of_device_id tas5805m_of_match[] = {
-	{.compatible = "ti,tas5805",},
+	{.compatible = "ti,tas5805m_2c",},
+	{.compatible = "ti,tas5805m_2d",},
+	{.compatible = "ti,tas5805m_2e",},
 	{}
 };

這樣也就等於3個設備將分別調用一次驅動中的probe接口進行初始化

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章