diff options
author | Alexander Usyskin <alexander.usyskin@intel.com> | 2014-12-24 17:37:46 -0500 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2015-01-09 17:53:13 -0500 |
commit | b13a65ef190e488e2761d65bdd2e1fe8a3a125f5 (patch) | |
tree | f9fa8f9375c5f422089ce5e21f3c1b590da1e1b6 /drivers/misc | |
parent | b7392d2247cfe6771f95d256374f1a8e6a6f48d6 (diff) |
mei: clean reset bit before reset
H_RST bit in H_CSR register may be found lit before reset is started,
for example if preceding reset flow hasn't completed.
In that case asserting H_RST will be ignored, therefore we need to clean
H_RST bit to start a successful reset sequence.
Cc: <stable@vger.kernel.org> #3.10+
Signed-off-by: Alexander Usyskin <alexander.usyskin@intel.com>
Signed-off-by: Tomas Winkler <tomas.winkler@intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/misc')
-rw-r--r-- | drivers/misc/mei/hw-me.c | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/drivers/misc/mei/hw-me.c b/drivers/misc/mei/hw-me.c index ff2755062b44..06ff0a2ec960 100644 --- a/drivers/misc/mei/hw-me.c +++ b/drivers/misc/mei/hw-me.c | |||
@@ -234,6 +234,18 @@ static int mei_me_hw_reset(struct mei_device *dev, bool intr_enable) | |||
234 | struct mei_me_hw *hw = to_me_hw(dev); | 234 | struct mei_me_hw *hw = to_me_hw(dev); |
235 | u32 hcsr = mei_hcsr_read(hw); | 235 | u32 hcsr = mei_hcsr_read(hw); |
236 | 236 | ||
237 | /* H_RST may be found lit before reset is started, | ||
238 | * for example if preceding reset flow hasn't completed. | ||
239 | * In that case asserting H_RST will be ignored, therefore | ||
240 | * we need to clean H_RST bit to start a successful reset sequence. | ||
241 | */ | ||
242 | if ((hcsr & H_RST) == H_RST) { | ||
243 | dev_warn(dev->dev, "H_RST is set = 0x%08X", hcsr); | ||
244 | hcsr &= ~H_RST; | ||
245 | mei_me_reg_write(hw, H_CSR, hcsr); | ||
246 | hcsr = mei_hcsr_read(hw); | ||
247 | } | ||
248 | |||
237 | hcsr |= H_RST | H_IG | H_IS; | 249 | hcsr |= H_RST | H_IG | H_IS; |
238 | 250 | ||
239 | if (intr_enable) | 251 | if (intr_enable) |