diff options
author | Andrzej Hajda <a.hajda@samsung.com> | 2013-09-03 16:35:08 +0200 |
---|---|---|
committer | Chanho Park <chanho61.park@samsung.com> | 2014-11-18 11:44:37 +0900 |
commit | d0545cc53edf4cb4b1d250f6103bb4b3a6ac1f2d (patch) | |
tree | 6c1fc8a0fce916c9773bcd06440e8d7d2dcfe674 /drivers | |
parent | 971ac4710ae5d5ffd39f4c3b2a5ad14dc5457b20 (diff) | |
download | linux-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.h | 1 | ||||
-rw-r--r-- | drivers/media/i2c/m5mols/m5mols_core.c | 11 |
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)); |