On Thu Jun 12 08:54:12 2025 +0200, Matthias Fend wrote:
> Add support for the powerdown pin (xSD), which can be used to put the VCM
> driver into power down mode. This is useful, for example, if the VCM
> driver's power supply cannot be controlled. The use of the powerdown pin is
> optional.
>
> Signed-off-by: Matthias Fend <[email protected]>
> Signed-off-by: Sakari Ailus <[email protected]>
> Signed-off-by: Hans Verkuil <[email protected]>
Patch committed.
Thanks,
Hans Verkuil
drivers/media/i2c/Kconfig | 2 +-
drivers/media/i2c/dw9714.c | 14 ++++++++++++++
2 files changed, 15 insertions(+), 1 deletion(-)
---
diff --git a/drivers/media/i2c/Kconfig b/drivers/media/i2c/Kconfig
index 43e39bf22b6b..4b4c199da6ea 100644
--- a/drivers/media/i2c/Kconfig
+++ b/drivers/media/i2c/Kconfig
@@ -792,7 +792,7 @@ config VIDEO_AK7375
config VIDEO_DW9714
tristate "DW9714 lens voice coil support"
- depends on I2C && VIDEO_DEV
+ depends on GPIOLIB && I2C && VIDEO_DEV
select MEDIA_CONTROLLER
select VIDEO_V4L2_SUBDEV_API
select V4L2_ASYNC
diff --git a/drivers/media/i2c/dw9714.c b/drivers/media/i2c/dw9714.c
index 2abd4fb5e7c0..1e7ad355a388 100644
--- a/drivers/media/i2c/dw9714.c
+++ b/drivers/media/i2c/dw9714.c
@@ -2,6 +2,7 @@
// Copyright (c) 2015--2017 Intel Corporation.
#include <linux/delay.h>
+#include <linux/gpio/consumer.h>
#include <linux/i2c.h>
#include <linux/module.h>
#include <linux/pm_runtime.h>
@@ -38,6 +39,7 @@ struct dw9714_device {
struct v4l2_subdev sd;
u16 current_val;
struct regulator *vcc;
+ struct gpio_desc *powerdown_gpio;
};
static inline struct dw9714_device *to_dw9714_vcm(struct v4l2_ctrl *ctrl)
@@ -145,6 +147,8 @@ static int dw9714_power_up(struct dw9714_device *dw9714_dev)
if (ret)
return ret;
+ gpiod_set_value_cansleep(dw9714_dev->powerdown_gpio, 0);
+
usleep_range(1000, 2000);
return 0;
@@ -152,6 +156,8 @@ static int dw9714_power_up(struct dw9714_device *dw9714_dev)
static int dw9714_power_down(struct dw9714_device *dw9714_dev)
{
+ gpiod_set_value_cansleep(dw9714_dev->powerdown_gpio, 1);
+
return regulator_disable(dw9714_dev->vcc);
}
@@ -169,6 +175,14 @@ static int dw9714_probe(struct i2c_client *client)
if (IS_ERR(dw9714_dev->vcc))
return PTR_ERR(dw9714_dev->vcc);
+ dw9714_dev->powerdown_gpio = devm_gpiod_get_optional(&client->dev,
+ "powerdown",
+ GPIOD_OUT_HIGH);
+ if (IS_ERR(dw9714_dev->powerdown_gpio))
+ return dev_err_probe(&client->dev,
+ PTR_ERR(dw9714_dev->powerdown_gpio),
+ "could not get powerdown gpio\n");
+
rval = dw9714_power_up(dw9714_dev);
if (rval)
return dev_err_probe(&client->dev, rval,