summaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
authorAndrzej Hajda <a.hajda@samsung.com>2013-09-03 16:35:08 +0200
committerChanho Park <chanho61.park@samsung.com>2014-11-18 11:44:37 +0900
commitd0545cc53edf4cb4b1d250f6103bb4b3a6ac1f2d (patch)
tree6c1fc8a0fce916c9773bcd06440e8d7d2dcfe674 /drivers
parent971ac4710ae5d5ffd39f4c3b2a5ad14dc5457b20 (diff)
downloadlinux-3.10-d0545cc53edf4cb4b1d250f6103bb4b3a6ac1f2d.tar.gz
linux-3.10-d0545cc53edf4cb4b1d250f6103bb4b3a6ac1f2d.tar.bz2
linux-3.10-d0545cc53edf4cb4b1d250f6103bb4b3a6ac1f2d.zip
m5mols: add clock support
Signed-off-by: Andrzej Hajda <a.hajda@samsung.com>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/media/i2c/m5mols/m5mols.h1
-rw-r--r--drivers/media/i2c/m5mols/m5mols_core.c11
2 files changed, 12 insertions, 0 deletions
diff --git a/drivers/media/i2c/m5mols/m5mols.h b/drivers/media/i2c/m5mols/m5mols.h
index d06e7fb7006..403d5e1848b 100644
--- a/drivers/media/i2c/m5mols/m5mols.h
+++ b/drivers/media/i2c/m5mols/m5mols.h
@@ -207,6 +207,7 @@ struct m5mols_info {
atomic_t irq_done;
struct m5mols_gpio reset_gpio;
+ struct clk *clock;
struct v4l2_ctrl_handler handle;
struct {
/* exposure/exposure bias/auto exposure cluster */
diff --git a/drivers/media/i2c/m5mols/m5mols_core.c b/drivers/media/i2c/m5mols/m5mols_core.c
index 5adc6fbbd24..c0d3551ecdb 100644
--- a/drivers/media/i2c/m5mols/m5mols_core.c
+++ b/drivers/media/i2c/m5mols/m5mols_core.c
@@ -13,6 +13,7 @@
* (at your option) any later version.
*/
+#include <linux/clk.h>
#include <linux/i2c.h>
#include <linux/slab.h>
#include <linux/irq.h>
@@ -36,6 +37,7 @@ module_param(m5mols_debug, int, 0644);
#define MODULE_NAME "m5mols"
#define M5MOLS_I2C_CHECK_RETRY 500
+#define M5MOLS_CLK_NAME "clkin"
/* The regulator consumer names for external voltage regulators */
static struct regulator_bulk_data supplies[] = {
@@ -777,6 +779,9 @@ static int m5mols_sensor_power(struct m5mols_info *info, bool enable)
ret = regulator_bulk_enable_sync(ARRAY_SIZE(supplies),
supplies);
+ if (!ret)
+ ret = clk_prepare_enable(info->clock);
+
if (ret < 0) {
regulator_bulk_disable(ARRAY_SIZE(supplies), supplies);
info->set_power(dev, 0);
@@ -790,6 +795,8 @@ static int m5mols_sensor_power(struct m5mols_info *info, bool enable)
return ret;
}
+ clk_disable_unprepare(info->clock);
+
ret = regulator_bulk_disable(ARRAY_SIZE(supplies), supplies);
if (ret) {
v4l2_err(&info->sd, "error disabling regulators: %d\n", ret);
@@ -1019,6 +1026,10 @@ static int m5mols_probe(struct i2c_client *client,
return ret;
}
+ info->clock = devm_clk_get(&client->dev, M5MOLS_CLK_NAME);
+ if (IS_ERR(info->clock))
+ return -EPROBE_DEFER;
+
sd = &info->sd;
v4l2_i2c_subdev_init(sd, client, &m5mols_ops);
strlcpy(sd->name, "M5MOLS", sizeof(sd->name));