Skip to content

Commit

Permalink
[media] mt9p031: Add support for regulators
Browse files Browse the repository at this point in the history
Enable the regulators when powering the sensor up, and disable them when
powering it down.
The regulators are mandatory. Boards that don't allow controlling the
sensor power lines must provide fixed voltage regulators.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
  • Loading branch information
Laurent Pinchart authored and Mauro Carvalho Chehab committed Apr 14, 2013
1 parent 37b9f21 commit 97f2127
Showing 1 changed file with 24 additions and 0 deletions.
24 changes: 24 additions & 0 deletions drivers/media/i2c/mt9p031.c
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
#include <linux/i2c.h>
#include <linux/log2.h>
#include <linux/pm.h>
#include <linux/regulator/consumer.h>
#include <linux/slab.h>
#include <linux/videodev2.h>

Expand Down Expand Up @@ -121,6 +122,10 @@ struct mt9p031 {
struct mutex power_lock; /* lock to protect power_count */
int power_count;

struct regulator *vaa;
struct regulator *vdd;
struct regulator *vdd_io;

enum mt9p031_model model;
struct aptina_pll pll;
int reset;
Expand Down Expand Up @@ -264,6 +269,11 @@ static int mt9p031_power_on(struct mt9p031 *mt9p031)
usleep_range(1000, 2000);
}

/* Bring up the supplies */
regulator_enable(mt9p031->vdd);
regulator_enable(mt9p031->vdd_io);
regulator_enable(mt9p031->vaa);

/* Emable clock */
if (mt9p031->pdata->set_xclk)
mt9p031->pdata->set_xclk(&mt9p031->subdev,
Expand All @@ -285,6 +295,10 @@ static void mt9p031_power_off(struct mt9p031 *mt9p031)
usleep_range(1000, 2000);
}

regulator_disable(mt9p031->vaa);
regulator_disable(mt9p031->vdd_io);
regulator_disable(mt9p031->vdd);

if (mt9p031->pdata->set_xclk)
mt9p031->pdata->set_xclk(&mt9p031->subdev, 0);
}
Expand Down Expand Up @@ -937,6 +951,16 @@ static int mt9p031_probe(struct i2c_client *client,
mt9p031->model = did->driver_data;
mt9p031->reset = -1;

mt9p031->vaa = devm_regulator_get(&client->dev, "vaa");
mt9p031->vdd = devm_regulator_get(&client->dev, "vdd");
mt9p031->vdd_io = devm_regulator_get(&client->dev, "vdd_io");

if (IS_ERR(mt9p031->vaa) || IS_ERR(mt9p031->vdd) ||
IS_ERR(mt9p031->vdd_io)) {
dev_err(&client->dev, "Unable to get regulators\n");
return -ENODEV;
}

v4l2_ctrl_handler_init(&mt9p031->ctrls, ARRAY_SIZE(mt9p031_ctrls) + 6);

v4l2_ctrl_new_std(&mt9p031->ctrls, &mt9p031_ctrl_ops,
Expand Down

0 comments on commit 97f2127

Please sign in to comment.