Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

soundwire: intel_auxdevice: add kernel parameter for mclk divider

Add a kernel parameter to work-around discrepancies between hardware
and platform firmware, it's not unusual to see e.g. 38.4MHz listed in
_DSD properties as the SoundWire clock source, but the hardware may be
based on a 19.2 MHz mclk source.

Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Signed-off-by: Bard Liao <yung-chuan.liao@linux.intel.com>
Link: https://lore.kernel.org/r/20241004021850.9758-1-yung-chuan.liao@linux.intel.com
Signed-off-by: Vinod Koul <vkoul@kernel.org>

authored by

Pierre-Louis Bossart and committed by
Vinod Koul
cbcb7edd 71b405b1

+15 -2
+1
Documentation/admin-guide/kernel-parameters.rst
··· 159 159 SCSI Appropriate SCSI support is enabled. 160 160 A lot of drivers have their options described inside 161 161 the Documentation/scsi/ sub-directory. 162 + SDW SoundWire support is enabled. 162 163 SECURITY Different security models are enabled. 163 164 SELINUX SELinux support is enabled. 164 165 SERIAL Serial support is enabled.
+4
Documentation/admin-guide/kernel-parameters.txt
··· 6060 6060 non-zero "wait" parameter. See weight_single 6061 6061 and weight_many. 6062 6062 6063 + sdw_mclk_divider=[SDW] 6064 + Specify the MCLK divider for Intel SoundWire buses in 6065 + case the BIOS does not provide the clock rate properly. 6066 + 6063 6067 skew_tick= [KNL,EARLY] Offset the periodic timer tick per cpu to mitigate 6064 6068 xtime_lock contention on larger systems, and/or RCU lock 6065 6069 contention on all systems with CONFIG_MAXSMP set.
+10 -2
drivers/soundwire/intel_auxdevice.c
··· 41 41 module_param_named(sdw_md_flags, md_flags, int, 0444); 42 42 MODULE_PARM_DESC(sdw_md_flags, "SoundWire Intel Master device flags (0x0 all off)"); 43 43 44 + static int mclk_divider; 45 + module_param_named(sdw_mclk_divider, mclk_divider, int, 0444); 46 + MODULE_PARM_DESC(sdw_mclk_divider, "SoundWire Intel mclk divider"); 47 + 44 48 struct wake_capable_part { 45 49 const u16 mfg_id; 46 50 const u16 part_id; ··· 146 142 "intel-sdw-ip-clock", 147 143 &prop->mclk_freq); 148 144 149 - /* the values reported by BIOS are the 2x clock, not the bus clock */ 150 - prop->mclk_freq /= 2; 145 + if (mclk_divider) 146 + /* use kernel parameter for BIOS or board work-arounds */ 147 + prop->mclk_freq /= mclk_divider; 148 + else 149 + /* the values reported by BIOS are the 2x clock, not the bus clock */ 150 + prop->mclk_freq /= 2; 151 151 152 152 fwnode_property_read_u32(link, 153 153 "intel-quirk-mask",