summaryrefslogtreecommitdiff
path: root/drivers/media/i2c/ccs
diff options
context:
space:
mode:
authorSakari Ailus <sakari.ailus@linux.intel.com>2020-10-06 15:05:25 +0200
committerMauro Carvalho Chehab <mchehab+huawei@kernel.org>2020-12-03 12:27:32 +0100
commit621214c36e84643bc104e030ef1e1422ff45156c (patch)
tree6b08f5cf05646cc41d57227757e9fc0948de91d0 /drivers/media/i2c/ccs
parent6904d4a988d65d1bc373740cda0940fb1a2f665e (diff)
media: ccs: Use all regulators
Use regulators vio and vcore besides vana. The regulators were always there but on many boards they've been hard wired. Control them explicitly now. Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com> Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
Diffstat (limited to 'drivers/media/i2c/ccs')
-rw-r--r--drivers/media/i2c/ccs/ccs-core.c30
-rw-r--r--drivers/media/i2c/ccs/ccs.h2
2 files changed, 24 insertions, 8 deletions
diff --git a/drivers/media/i2c/ccs/ccs-core.c b/drivers/media/i2c/ccs/ccs-core.c
index 89dc09587211..4447ca367a84 100644
--- a/drivers/media/i2c/ccs/ccs-core.c
+++ b/drivers/media/i2c/ccs/ccs-core.c
@@ -65,6 +65,8 @@ struct ccs_device {
unsigned char flags;
};
+static const char * const ccs_regulators[] = { "vcore", "vio", "vana" };
+
/*
*
* Dynamic Capability Identification
@@ -1304,7 +1306,8 @@ static int ccs_power_on(struct device *dev)
unsigned int sleep;
int rval;
- rval = regulator_enable(sensor->vana);
+ rval = regulator_bulk_enable(ARRAY_SIZE(ccs_regulators),
+ sensor->regulators);
if (rval) {
dev_err(dev, "failed to enable vana regulator\n");
return rval;
@@ -1416,7 +1419,8 @@ out_cci_addr_fail:
clk_disable_unprepare(sensor->ext_clk);
out_xclk_fail:
- regulator_disable(sensor->vana);
+ regulator_bulk_disable(ARRAY_SIZE(ccs_regulators),
+ sensor->regulators);
return rval;
}
@@ -1442,7 +1446,8 @@ static int ccs_power_off(struct device *dev)
gpiod_set_value(sensor->xshutdown, 0);
clk_disable_unprepare(sensor->ext_clk);
usleep_range(5000, 5000);
- regulator_disable(sensor->vana);
+ regulator_bulk_disable(ARRAY_SIZE(ccs_regulators),
+ sensor->regulators);
sensor->streaming = false;
return 0;
@@ -2981,10 +2986,21 @@ static int ccs_probe(struct i2c_client *client)
v4l2_i2c_subdev_init(&sensor->src->sd, client, &ccs_ops);
sensor->src->sd.internal_ops = &ccs_internal_src_ops;
- sensor->vana = devm_regulator_get(&client->dev, "vana");
- if (IS_ERR(sensor->vana)) {
- dev_err(&client->dev, "could not get regulator for vana\n");
- return PTR_ERR(sensor->vana);
+ sensor->regulators = devm_kcalloc(&client->dev,
+ ARRAY_SIZE(ccs_regulators),
+ sizeof(*sensor->regulators),
+ GFP_KERNEL);
+ if (!sensor->regulators)
+ return -ENOMEM;
+
+ for (i = 0; i < ARRAY_SIZE(ccs_regulators); i++)
+ sensor->regulators[i].supply = ccs_regulators[i];
+
+ rval = devm_regulator_bulk_get(&client->dev, ARRAY_SIZE(ccs_regulators),
+ sensor->regulators);
+ if (rval) {
+ dev_err(&client->dev, "could not get regulators\n");
+ return rval;
}
sensor->ext_clk = devm_clk_get(&client->dev, NULL);
diff --git a/drivers/media/i2c/ccs/ccs.h b/drivers/media/i2c/ccs/ccs.h
index 6b07e4143ff0..356b87c33405 100644
--- a/drivers/media/i2c/ccs/ccs.h
+++ b/drivers/media/i2c/ccs/ccs.h
@@ -223,7 +223,7 @@ struct ccs_sensor {
struct ccs_subdev *scaler;
struct ccs_subdev *pixel_array;
struct ccs_hwconfig hwcfg;
- struct regulator *vana;
+ struct regulator_bulk_data *regulators;
struct clk *ext_clk;
struct gpio_desc *xshutdown;
struct gpio_desc *reset;