build/patch/kernel/archive/sunxi-6.4/patches.megous/iio-light-stk3310-Add-support-for-I2C-regulator.patch

99 lines
2.9 KiB
Diff

From b071bd22ecd496285ab8ceffc285279731434d85 Mon Sep 17 00:00:00 2001
From: Ondrej Jirman <megi@xff.cz>
Date: Sun, 21 May 2023 01:28:14 +0200
Subject: [PATCH 115/469] iio: light: stk3310: Add support for I2C regulator
I2C bus power is needed for communication with the device, but it's
not critical to keep the internal state of the sensor. Handle it
appropriately.
Signed-off-by: Ondrej Jirman <megi@xff.cz>
---
drivers/iio/light/stk3310.c | 26 +++++++++++++++++++++++++-
1 file changed, 25 insertions(+), 1 deletion(-)
diff --git a/drivers/iio/light/stk3310.c b/drivers/iio/light/stk3310.c
index df5bf148ffe5..2d28bcebf28c 100644
--- a/drivers/iio/light/stk3310.c
+++ b/drivers/iio/light/stk3310.c
@@ -119,6 +119,7 @@ struct stk3310_data {
struct regmap_field *reg_flag_psint;
struct regmap_field *reg_flag_nf;
struct regulator *vdd_reg;
+ struct regulator *i2c_reg;
};
static const struct iio_event_spec stk3310_events[] = {
@@ -614,6 +615,11 @@ static int stk3310_probe(struct i2c_client *client)
return dev_err_probe(&client->dev, PTR_ERR(data->vdd_reg),
"get regulator vdd failed\n");
+ data->i2c_reg = devm_regulator_get(&client->dev, "i2c");
+ if (IS_ERR(data->i2c_reg))
+ return dev_err_probe(&client->dev, PTR_ERR(data->i2c_reg),
+ "get regulator i2c failed\n");
+
ret = stk3310_regmap_init(data);
if (ret < 0)
return ret;
@@ -631,9 +637,15 @@ static int stk3310_probe(struct i2c_client *client)
"regulator vdd enable failed\n");
}
+ ret = regulator_enable(data->i2c_reg);
+ if (ret) {
+ dev_err_probe(&client->dev, ret, "regulator i2c enable failed\n");
+ goto err_vdd_disable;
+ }
+
ret = stk3310_init(indio_dev);
if (ret < 0)
- goto err_vdd_disable;
+ goto err_i2c_disable;
if (client->irq > 0) {
ret = devm_request_threaded_irq(&client->dev, client->irq,
@@ -659,6 +671,8 @@ static int stk3310_probe(struct i2c_client *client)
err_standby:
stk3310_set_state(data, STK3310_STATE_STANDBY);
+err_i2c_disable:
+ regulator_disable(data->i2c_reg);
err_vdd_disable:
if (data->vdd_reg)
regulator_disable(data->vdd_reg);
@@ -672,6 +686,7 @@ static void stk3310_remove(struct i2c_client *client)
iio_device_unregister(indio_dev);
stk3310_set_state(iio_priv(indio_dev), STK3310_STATE_STANDBY);
+ regulator_disable(data->i2c_reg);
if (data->vdd_reg)
regulator_disable(data->vdd_reg);
}
@@ -692,6 +707,8 @@ static int stk3310_suspend(struct device *dev)
regulator_disable(data->vdd_reg);
}
+ regulator_disable(data->i2c_reg);
+
return 0;
}
@@ -713,6 +730,13 @@ static int stk3310_resume(struct device *dev)
regcache_sync(data->regmap);
}
+ ret = regulator_enable(data->i2c_reg);
+ if (ret) {
+ dev_err(dev, "Failed to re-enable regulator i2c\n");
+ regulator_disable(data->vdd_reg);
+ return ret;
+ }
+
if (data->ps_enabled)
state |= STK3310_STATE_EN_PS;
if (data->als_enabled)
--
2.34.1