Commit 621214c3 authored by Sakari Ailus's avatar Sakari Ailus Committed by Mauro Carvalho Chehab

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: default avatarSakari Ailus <sakari.ailus@linux.intel.com>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab+huawei@kernel.org>
parent 6904d4a9
...@@ -65,6 +65,8 @@ struct ccs_device { ...@@ -65,6 +65,8 @@ struct ccs_device {
unsigned char flags; unsigned char flags;
}; };
static const char * const ccs_regulators[] = { "vcore", "vio", "vana" };
/* /*
* *
* Dynamic Capability Identification * Dynamic Capability Identification
...@@ -1304,7 +1306,8 @@ static int ccs_power_on(struct device *dev) ...@@ -1304,7 +1306,8 @@ static int ccs_power_on(struct device *dev)
unsigned int sleep; unsigned int sleep;
int rval; int rval;
rval = regulator_enable(sensor->vana); rval = regulator_bulk_enable(ARRAY_SIZE(ccs_regulators),
sensor->regulators);
if (rval) { if (rval) {
dev_err(dev, "failed to enable vana regulator\n"); dev_err(dev, "failed to enable vana regulator\n");
return rval; return rval;
...@@ -1416,7 +1419,8 @@ static int ccs_power_on(struct device *dev) ...@@ -1416,7 +1419,8 @@ static int ccs_power_on(struct device *dev)
clk_disable_unprepare(sensor->ext_clk); clk_disable_unprepare(sensor->ext_clk);
out_xclk_fail: out_xclk_fail:
regulator_disable(sensor->vana); regulator_bulk_disable(ARRAY_SIZE(ccs_regulators),
sensor->regulators);
return rval; return rval;
} }
...@@ -1442,7 +1446,8 @@ static int ccs_power_off(struct device *dev) ...@@ -1442,7 +1446,8 @@ static int ccs_power_off(struct device *dev)
gpiod_set_value(sensor->xshutdown, 0); gpiod_set_value(sensor->xshutdown, 0);
clk_disable_unprepare(sensor->ext_clk); clk_disable_unprepare(sensor->ext_clk);
usleep_range(5000, 5000); usleep_range(5000, 5000);
regulator_disable(sensor->vana); regulator_bulk_disable(ARRAY_SIZE(ccs_regulators),
sensor->regulators);
sensor->streaming = false; sensor->streaming = false;
return 0; return 0;
...@@ -2981,10 +2986,21 @@ static int ccs_probe(struct i2c_client *client) ...@@ -2981,10 +2986,21 @@ static int ccs_probe(struct i2c_client *client)
v4l2_i2c_subdev_init(&sensor->src->sd, client, &ccs_ops); v4l2_i2c_subdev_init(&sensor->src->sd, client, &ccs_ops);
sensor->src->sd.internal_ops = &ccs_internal_src_ops; sensor->src->sd.internal_ops = &ccs_internal_src_ops;
sensor->vana = devm_regulator_get(&client->dev, "vana"); sensor->regulators = devm_kcalloc(&client->dev,
if (IS_ERR(sensor->vana)) { ARRAY_SIZE(ccs_regulators),
dev_err(&client->dev, "could not get regulator for vana\n"); sizeof(*sensor->regulators),
return PTR_ERR(sensor->vana); 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); sensor->ext_clk = devm_clk_get(&client->dev, NULL);
......
...@@ -223,7 +223,7 @@ struct ccs_sensor { ...@@ -223,7 +223,7 @@ struct ccs_sensor {
struct ccs_subdev *scaler; struct ccs_subdev *scaler;
struct ccs_subdev *pixel_array; struct ccs_subdev *pixel_array;
struct ccs_hwconfig hwcfg; struct ccs_hwconfig hwcfg;
struct regulator *vana; struct regulator_bulk_data *regulators;
struct clk *ext_clk; struct clk *ext_clk;
struct gpio_desc *xshutdown; struct gpio_desc *xshutdown;
struct gpio_desc *reset; struct gpio_desc *reset;
......
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