Commit 360d15d6 authored by Krzysztof Kozlowski's avatar Krzysztof Kozlowski Committed by Lee Jones

mfd: sec-core: Fix IRQ handling after resume if this is not a wakeup source

During suspend the IRQ should be disabled even if this is not a wakeup
source. This is a proper way of fixing the IRQ handling issue during
resume (IRQ handler fails because I2C bus did not resume yet).

When device is suspended and sec-core interrupt is signaled the irq chip
will try to handle it regardless of wakeup source. Device could be woken
up by different IRQ but still the IRQ handler will try to read the
registers over I2C bus and fail because I2C bus won't be ready yet.
Signed-off-by: default avatarKrzysztof Kozlowski <k.kozlowski@samsung.com>
Signed-off-by: default avatarLee Jones <lee.jones@linaro.org>
parent 9549b5ff
...@@ -374,19 +374,18 @@ static int sec_pmic_suspend(struct device *dev) ...@@ -374,19 +374,18 @@ static int sec_pmic_suspend(struct device *dev)
struct i2c_client *i2c = container_of(dev, struct i2c_client, dev); struct i2c_client *i2c = container_of(dev, struct i2c_client, dev);
struct sec_pmic_dev *sec_pmic = i2c_get_clientdata(i2c); struct sec_pmic_dev *sec_pmic = i2c_get_clientdata(i2c);
if (device_may_wakeup(dev)) { if (device_may_wakeup(dev))
enable_irq_wake(sec_pmic->irq); enable_irq_wake(sec_pmic->irq);
/* /*
* PMIC IRQ must be disabled during suspend for RTC alarm * PMIC IRQ must be disabled during suspend for RTC alarm
* to work properly. * to work properly.
* When device is woken up from suspend by RTC Alarm, an * When device is woken up from suspend, an
* interrupt occurs before resuming I2C bus controller. * interrupt occurs before resuming I2C bus controller.
* The interrupt is handled by regmap_irq_thread which tries * The interrupt is handled by regmap_irq_thread which tries
* to read RTC registers. This read fails (I2C is still * to read RTC registers. This read fails (I2C is still
* suspended) and RTC Alarm interrupt is disabled. * suspended) and RTC Alarm interrupt is disabled.
*/ */
disable_irq(sec_pmic->irq); disable_irq(sec_pmic->irq);
}
return 0; return 0;
} }
...@@ -396,10 +395,9 @@ static int sec_pmic_resume(struct device *dev) ...@@ -396,10 +395,9 @@ static int sec_pmic_resume(struct device *dev)
struct i2c_client *i2c = container_of(dev, struct i2c_client, dev); struct i2c_client *i2c = container_of(dev, struct i2c_client, dev);
struct sec_pmic_dev *sec_pmic = i2c_get_clientdata(i2c); struct sec_pmic_dev *sec_pmic = i2c_get_clientdata(i2c);
if (device_may_wakeup(dev)) { if (device_may_wakeup(dev))
disable_irq_wake(sec_pmic->irq); disable_irq_wake(sec_pmic->irq);
enable_irq(sec_pmic->irq); enable_irq(sec_pmic->irq);
}
return 0; return 0;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment