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