多个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接口进行初始化

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值