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