xref: /linux/sound/soc/sdca/sdca_device.c (revision 2c1ed907520c50326b8f604907a8478b27881a2e)
13a513da1SPierre-Louis Bossart // SPDX-License-Identifier: (GPL-2.0 OR BSD-3-Clause)
23a513da1SPierre-Louis Bossart // Copyright(c) 2024 Intel Corporation
33a513da1SPierre-Louis Bossart 
43a513da1SPierre-Louis Bossart /*
53a513da1SPierre-Louis Bossart  * The MIPI SDCA specification is available for public downloads at
63a513da1SPierre-Louis Bossart  * https://www.mipi.org/mipi-sdca-v1-0-download
73a513da1SPierre-Louis Bossart  */
83a513da1SPierre-Louis Bossart 
93a513da1SPierre-Louis Bossart #include <linux/acpi.h>
103a513da1SPierre-Louis Bossart #include <linux/module.h>
113a513da1SPierre-Louis Bossart #include <linux/property.h>
12fdb22039SPierre-Louis Bossart #include <linux/soundwire/sdw.h>
133a513da1SPierre-Louis Bossart #include <sound/sdca.h>
143a513da1SPierre-Louis Bossart #include <sound/sdca_function.h>
153a513da1SPierre-Louis Bossart 
sdca_lookup_interface_revision(struct sdw_slave * slave)163a513da1SPierre-Louis Bossart void sdca_lookup_interface_revision(struct sdw_slave *slave)
173a513da1SPierre-Louis Bossart {
183a513da1SPierre-Louis Bossart 	struct fwnode_handle *fwnode = slave->dev.fwnode;
193a513da1SPierre-Louis Bossart 
203a513da1SPierre-Louis Bossart 	/*
213a513da1SPierre-Louis Bossart 	 * if this property is not present, then the sdca_interface_revision will
223a513da1SPierre-Louis Bossart 	 * remain zero, which will be considered as 'not defined' or 'invalid'.
233a513da1SPierre-Louis Bossart 	 */
243a513da1SPierre-Louis Bossart 	fwnode_property_read_u32(fwnode, "mipi-sdw-sdca-interface-revision",
25*cdd30ebbSPeter Zijlstra 				 &slave->sdca_data.interface_revision);
26fdb22039SPierre-Louis Bossart }
27fdb22039SPierre-Louis Bossart EXPORT_SYMBOL_NS(sdca_lookup_interface_revision, "SND_SOC_SDCA");
28fdb22039SPierre-Louis Bossart 
sdca_device_quirk_rt712_vb(struct sdw_slave * slave)29fdb22039SPierre-Louis Bossart static bool sdca_device_quirk_rt712_vb(struct sdw_slave *slave)
30fdb22039SPierre-Louis Bossart {
31fdb22039SPierre-Louis Bossart 	struct sdw_slave_id *id = &slave->id;
32fdb22039SPierre-Louis Bossart 	int i;
33fdb22039SPierre-Louis Bossart 
34fdb22039SPierre-Louis Bossart 	/*
35fdb22039SPierre-Louis Bossart 	 * The RT712_VA relies on the v06r04 draft, and the
36fdb22039SPierre-Louis Bossart 	 * RT712_VB on a more recent v08r01 draft.
37fdb22039SPierre-Louis Bossart 	 */
38fdb22039SPierre-Louis Bossart 	if (slave->sdca_data.interface_revision < 0x0801)
39fdb22039SPierre-Louis Bossart 		return false;
40fdb22039SPierre-Louis Bossart 
41fdb22039SPierre-Louis Bossart 	if (id->mfg_id != 0x025d)
42fdb22039SPierre-Louis Bossart 		return false;
43fdb22039SPierre-Louis Bossart 
44fdb22039SPierre-Louis Bossart 	if (id->part_id != 0x712 &&
45fdb22039SPierre-Louis Bossart 	    id->part_id != 0x713 &&
46fdb22039SPierre-Louis Bossart 	    id->part_id != 0x716 &&
47fdb22039SPierre-Louis Bossart 	    id->part_id != 0x717)
48fdb22039SPierre-Louis Bossart 		return false;
49fdb22039SPierre-Louis Bossart 
50fdb22039SPierre-Louis Bossart 	for (i = 0; i < slave->sdca_data.num_functions; i++) {
51fdb22039SPierre-Louis Bossart 		if (slave->sdca_data.sdca_func[i].type ==
52fdb22039SPierre-Louis Bossart 		    SDCA_FUNCTION_TYPE_SMART_MIC)
53fdb22039SPierre-Louis Bossart 			return true;
54fdb22039SPierre-Louis Bossart 	}
55fdb22039SPierre-Louis Bossart 
56fdb22039SPierre-Louis Bossart 	return false;
57fdb22039SPierre-Louis Bossart }
58fdb22039SPierre-Louis Bossart 
sdca_device_quirk_match(struct sdw_slave * slave,enum sdca_quirk quirk)59fdb22039SPierre-Louis Bossart bool sdca_device_quirk_match(struct sdw_slave *slave, enum sdca_quirk quirk)
60fdb22039SPierre-Louis Bossart {
61fdb22039SPierre-Louis Bossart 	switch (quirk) {
62fdb22039SPierre-Louis Bossart 	case SDCA_QUIRKS_RT712_VB:
63fdb22039SPierre-Louis Bossart 		return sdca_device_quirk_rt712_vb(slave);
64fdb22039SPierre-Louis Bossart 	default:
65fdb22039SPierre-Louis Bossart 		break;
66fdb22039SPierre-Louis Bossart 	}
67*cdd30ebbSPeter Zijlstra 	return false;
68 }
69 EXPORT_SYMBOL_NS(sdca_device_quirk_match, "SND_SOC_SDCA");
70