]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
soundwire: bus: use quirk to filter out invalid parity errors
authorPierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Tue, 8 Sep 2020 13:45:18 +0000 (21:45 +0800)
committerVinod Koul <vkoul@kernel.org>
Thu, 10 Sep 2020 05:51:04 +0000 (11:21 +0530)
If a Slave device reports with a quirk that its initial parity check
may be incorrect, filter it but keep the parity checks active in
steady state.

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: Kai Vehmanen <kai.vehmanen@linux.intel.com>
Reviewed-by: Guennadi Liakhovetski <guennadi.liakhovetski@linux.intel.com>
Link: https://lore.kernel.org/r/20200908134521.6781-5-yung-chuan.liao@linux.intel.com
Signed-off-by: Vinod Koul <vkoul@kernel.org>
drivers/soundwire/bus.c
include/linux/soundwire/sdw.h

index 30b0bed1663064c41766154ed655043f9195875c..09185e5cfd709448ec6109faff7a13ceebb0124d 100644 (file)
@@ -1362,6 +1362,8 @@ static int sdw_handle_slave_alerts(struct sdw_slave *slave)
        unsigned long port;
        bool slave_notify = false;
        u8 buf, buf2[2], _buf, _buf2[2];
+       bool parity_check;
+       bool parity_quirk;
 
        sdw_modify_slave_status(slave, SDW_SLAVE_ALERT);
 
@@ -1394,7 +1396,11 @@ static int sdw_handle_slave_alerts(struct sdw_slave *slave)
                 * interrupt
                 */
                if (buf & SDW_SCP_INT1_PARITY) {
-                       if (slave->prop.scp_int1_mask & SDW_SCP_INT1_PARITY)
+                       parity_check = slave->prop.scp_int1_mask & SDW_SCP_INT1_PARITY;
+                       parity_quirk = !slave->first_interrupt_done &&
+                               (slave->prop.quirks & SDW_SLAVE_QUIRKS_INVALID_INITIAL_PARITY);
+
+                       if (parity_check && !parity_quirk)
                                dev_err(&slave->dev, "Parity error detected\n");
                        clear |= SDW_SCP_INT1_PARITY;
                }
index 2b93a8ef7fad4f8eb6cbc99b97b2f7a84034c003..790823d2d33b6d6ba0449cd7663305a12680ee79 100644 (file)
@@ -358,6 +358,7 @@ struct sdw_dpn_prop {
  * @src_dpn_prop: Source Data Port N properties
  * @sink_dpn_prop: Sink Data Port N properties
  * @scp_int1_mask: SCP_INT1_MASK desired settings
+ * @quirks: bitmask identifying deltas from the MIPI specification
  */
 struct sdw_slave_prop {
        u32 mipi_revision;
@@ -380,8 +381,11 @@ struct sdw_slave_prop {
        struct sdw_dpn_prop *src_dpn_prop;
        struct sdw_dpn_prop *sink_dpn_prop;
        u8 scp_int1_mask;
+       u32 quirks;
 };
 
+#define SDW_SLAVE_QUIRKS_INVALID_INITIAL_PARITY        BIT(0)
+
 /**
  * struct sdw_master_prop - Master properties
  * @revision: MIPI spec version of the implementation