soundwire: bus: test read status
authorPierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Tue, 2 Mar 2021 09:11:13 +0000 (17:11 +0800)
committerVinod Koul <vkoul@kernel.org>
Tue, 30 Mar 2021 06:21:43 +0000 (11:51 +0530)
In the existing code we may read a negative error value but still mask
it and write it back.

Make sure all reads are tested and errors not propagated further.

Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Reviewed-by: Guennadi Liakhovetski <guennadi.liakhovetski@intel.com>
Reviewed-by: Kai Vehmanen <kai.vehmanen@linux.intel.com>
Reviewed-by: Guennadi Liakhovetski <guennadi.liakhovetski@linux.intel.com>
Signed-off-by: Bard Liao <yung-chuan.liao@linux.intel.com>
Link: https://lore.kernel.org/r/20210302091122.13952-3-yung-chuan.liao@linux.intel.com
Signed-off-by: Vinod Koul <vkoul@kernel.org>
drivers/soundwire/bus.c

index 04eb879..1c01cc1 100644 (file)
@@ -875,8 +875,12 @@ static int sdw_slave_clk_stop_prepare(struct sdw_slave *slave,
                if (wake_en)
                        val |= SDW_SCP_SYSTEMCTRL_WAKE_UP_EN;
        } else {
-               val = sdw_read_no_pm(slave, SDW_SCP_SYSTEMCTRL);
-
+               ret = sdw_read_no_pm(slave, SDW_SCP_SYSTEMCTRL);
+               if (ret < 0) {
+                       dev_err(&slave->dev, "SDW_SCP_SYSTEMCTRL read failed:%d\n", ret);
+                       return ret;
+               }
+               val = ret;
                val &= ~(SDW_SCP_SYSTEMCTRL_CLK_STP_PREP);
        }
 
@@ -895,8 +899,12 @@ static int sdw_bus_wait_for_clk_prep_deprep(struct sdw_bus *bus, u16 dev_num)
        int val;
 
        do {
-               val = sdw_bread_no_pm(bus, dev_num, SDW_SCP_STAT) &
-                       SDW_SCP_STAT_CLK_STP_NF;
+               val = sdw_bread_no_pm(bus, dev_num, SDW_SCP_STAT);
+               if (val < 0) {
+                       dev_err(bus->dev, "SDW_SCP_STAT bread failed:%d\n", val);
+                       return val;
+               }
+               val &= SDW_SCP_STAT_CLK_STP_NF;
                if (!val) {
                        dev_info(bus->dev, "clock stop prep/de-prep done slave:%d",
                                 dev_num);