|
@@ -1084,6 +1084,21 @@ static int rt5514_parse_dt(struct rt5514_priv *rt5514, struct device *dev)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+static __maybe_unused int rt5514_i2c_resume(struct device *dev)
|
|
|
+{
|
|
|
+ struct rt5514_priv *rt5514 = dev_get_drvdata(dev);
|
|
|
+ unsigned int val;
|
|
|
+
|
|
|
+ /*
|
|
|
+ * Add a bogus read to avoid rt5514's confusion after s2r in case it
|
|
|
+ * saw glitches on the i2c lines and thought the other side sent a
|
|
|
+ * start bit.
|
|
|
+ */
|
|
|
+ regmap_read(rt5514->regmap, RT5514_VENDOR_ID2, &val);
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
static int rt5514_i2c_probe(struct i2c_client *i2c,
|
|
|
const struct i2c_device_id *id)
|
|
|
{
|
|
@@ -1120,7 +1135,15 @@ static int rt5514_i2c_probe(struct i2c_client *i2c,
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
+ /*
|
|
|
+ * The rt5514 can get confused if the i2c lines glitch together, as
|
|
|
+ * can happen at bootup as regulators are turned off and on. If it's
|
|
|
+ * in this glitched state the first i2c read will fail, so we'll give
|
|
|
+ * it one change to retry.
|
|
|
+ */
|
|
|
ret = regmap_read(rt5514->regmap, RT5514_VENDOR_ID2, &val);
|
|
|
+ if (ret || val != RT5514_DEVICE_ID)
|
|
|
+ ret = regmap_read(rt5514->regmap, RT5514_VENDOR_ID2, &val);
|
|
|
if (ret || val != RT5514_DEVICE_ID) {
|
|
|
dev_err(&i2c->dev,
|
|
|
"Device with ID register %x is not rt5514\n", val);
|
|
@@ -1149,10 +1172,15 @@ static int rt5514_i2c_remove(struct i2c_client *i2c)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+static const struct dev_pm_ops rt5514_i2_pm_ops = {
|
|
|
+ SET_SYSTEM_SLEEP_PM_OPS(NULL, rt5514_i2c_resume)
|
|
|
+};
|
|
|
+
|
|
|
static struct i2c_driver rt5514_i2c_driver = {
|
|
|
.driver = {
|
|
|
.name = "rt5514",
|
|
|
.of_match_table = of_match_ptr(rt5514_of_match),
|
|
|
+ .pm = &rt5514_i2_pm_ops,
|
|
|
},
|
|
|
.probe = rt5514_i2c_probe,
|
|
|
.remove = rt5514_i2c_remove,
|