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 Bossartvoid 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 Bossartstatic 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 Bossartbool 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