Message ID | 20210302082720.12322-2-yung-chuan.liao@linux.intel.com |
---|---|
State | Accepted |
Commit | 5bb643c39b97c440b2981c69f05596c7ea868b73 |
Headers | show |
Series | soundwire: clear bus clash/parity interrupt before the mask is enabled | expand |
On 02-03-21, 16:27, Bard Liao wrote: > Currently quirks are only allowed for Slave devices. This patch > describes the need for two quirks at the Master level. > > a) bus clash > The SoundWire specification allows a Slave device to report a bus clash > with the in-band interrupt mechanism when it detects a conflict while > driving a bitSlot it owns. This can be a symptom of an electrical conflict > or a programming error, and it's vital to detect reliably. > > Unfortunately, on some platforms, bus clashes are randomly reported by > Slave devices after a bus reset, with an interrupt status set even before > the bus clash interrupt is enabled. These initial spurious interrupts are > not relevant and should optionally be filtered out, while leaving the > interrupt mechanism enabled to detect 'true' issues. > > This patch suggests the addition of a Master level quirk to discard such > interrupts. The quirk should in theory have been added at the Slave level, > but since the problem was detected with different generations of Slave > devices it's hard to point to a specific IP. The problem might also be > board-dependent and hence dealing with a Master quirk is simpler. > > b) parity > > Additional tests on a new platform with the Maxim 98373 amplifier > showed a rare case where the parity interrupt is also thrown on > startup, at the same time as bus clashes. This issue only seems to > happen infrequently and was only observed during suspend-resume stress > tests while audio is streaming. We could make the problem go away by > adding a Slave-level quirk, but there is no evidence that the issue is > actually a Slave problem: the parity is provided by the Master, which > could also set an invalid parity in corner cases. > > BugLink: https://github.com/thesofproject/linux/issues/2578 > BugLink: https://github.com/thesofproject/linux/issues/2533 > Please do not add blank lines here > Co-developed-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> > Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> > Signed-off-by: Bard Liao <yung-chuan.liao@linux.intel.com> > Reviewed-by: Guennadi Liakhovetski <guennadi.liakhovetski@linux.intel.com> > --- > include/linux/soundwire/sdw.h | 22 ++++++++++++++++++++++ > 1 file changed, 22 insertions(+) > > diff --git a/include/linux/soundwire/sdw.h b/include/linux/soundwire/sdw.h > index d08039d65825..25f2a14e2e83 100644 > --- a/include/linux/soundwire/sdw.h > +++ b/include/linux/soundwire/sdw.h > @@ -405,6 +405,7 @@ struct sdw_slave_prop { > * command > * @mclk_freq: clock reference passed to SoundWire Master, in Hz. > * @hw_disabled: if true, the Master is not functional, typically due to pin-mux > + * @quirks: bitmask identifying optional behavior beyond the scope of the MIPI specification > */ > struct sdw_master_prop { > u32 revision; > @@ -421,8 +422,29 @@ struct sdw_master_prop { > u32 err_threshold; > u32 mclk_freq; > bool hw_disabled; > + u64 quirks; > }; > > +/* Definitions for Master quirks */ > + > +/* > + * In a number of platforms bus clashes are reported after a hardware > + * reset but without any explanations or evidence of a real problem. > + * The following quirk will discard all initial bus clash interrupts > + * but will leave the detection on should real bus clashes happen > + */ > +#define SDW_MASTER_QUIRKS_CLEAR_INITIAL_CLASH BIT(0) > + > +/* > + * Some Slave devices have known issues with incorrect parity errors > + * reported after a hardware reset. However during integration unexplained > + * parity errors can be reported by Slave devices, possibly due to electrical > + * issues at the Master level. > + * The following quirk will discard all initial parity errors but will leave > + * the detection on should real parity errors happen. > + */ > +#define SDW_MASTER_QUIRKS_CLEAR_INITIAL_PARITY BIT(1) > + > int sdw_master_read_prop(struct sdw_bus *bus); > int sdw_slave_read_prop(struct sdw_slave *slave); > > -- > 2.17.1
diff --git a/include/linux/soundwire/sdw.h b/include/linux/soundwire/sdw.h index d08039d65825..25f2a14e2e83 100644 --- a/include/linux/soundwire/sdw.h +++ b/include/linux/soundwire/sdw.h @@ -405,6 +405,7 @@ struct sdw_slave_prop { * command * @mclk_freq: clock reference passed to SoundWire Master, in Hz. * @hw_disabled: if true, the Master is not functional, typically due to pin-mux + * @quirks: bitmask identifying optional behavior beyond the scope of the MIPI specification */ struct sdw_master_prop { u32 revision; @@ -421,8 +422,29 @@ struct sdw_master_prop { u32 err_threshold; u32 mclk_freq; bool hw_disabled; + u64 quirks; }; +/* Definitions for Master quirks */ + +/* + * In a number of platforms bus clashes are reported after a hardware + * reset but without any explanations or evidence of a real problem. + * The following quirk will discard all initial bus clash interrupts + * but will leave the detection on should real bus clashes happen + */ +#define SDW_MASTER_QUIRKS_CLEAR_INITIAL_CLASH BIT(0) + +/* + * Some Slave devices have known issues with incorrect parity errors + * reported after a hardware reset. However during integration unexplained + * parity errors can be reported by Slave devices, possibly due to electrical + * issues at the Master level. + * The following quirk will discard all initial parity errors but will leave + * the detection on should real parity errors happen. + */ +#define SDW_MASTER_QUIRKS_CLEAR_INITIAL_PARITY BIT(1) + int sdw_master_read_prop(struct sdw_bus *bus); int sdw_slave_read_prop(struct sdw_slave *slave);