fimc-is: Add code from arch/arm/mach-exynos and missing headers
authorMarek Szyprowski <m.szyprowski@samsung.com>
Thu, 6 Aug 2015 13:24:20 +0000 (15:24 +0200)
committerInki Dae <inki.dae@samsung.com>
Mon, 3 Dec 2018 00:56:49 +0000 (09:56 +0900)
Change-Id: I15d16161f1d1f036bd4a0f359f40b94b4cf08e99
Signed-off-by: Marek Szyprowski <m.szyprowski@samsung.com>
17 files changed:
drivers/media/platform/exynos/fimc-is/Makefile
drivers/media/platform/exynos/fimc-is/exynos-fimc-is-sensor.h [new file with mode: 0644]
drivers/media/platform/exynos/fimc-is/exynos-fimc-is.h [new file with mode: 0644]
drivers/media/platform/exynos/fimc-is/fimc-is-companion-dt.c
drivers/media/platform/exynos/fimc-is/fimc-is-core.h
drivers/media/platform/exynos/fimc-is/fimc-is-device-companion.h
drivers/media/platform/exynos/fimc-is/fimc-is-device-ois.c
drivers/media/platform/exynos/fimc-is/fimc-is-device-sensor.h
drivers/media/platform/exynos/fimc-is/fimc-is-dt.c
drivers/media/platform/exynos/fimc-is/fimc-is-dt.h
drivers/media/platform/exynos/fimc-is/sensor/fimc-is-device-6d1.c
drivers/media/platform/exynos/fimc-is/sensor/fimc-is-device-imx240.c
drivers/media/platform/exynos/fimc-is/setup-fimc-is-companion.c [new file with mode: 0644]
drivers/media/platform/exynos/fimc-is/setup-fimc-is-sensor.c [new file with mode: 0644]
drivers/media/platform/exynos/fimc-is/setup-fimc-is.c [new file with mode: 0644]
drivers/media/platform/exynos/fimc-is/smc.h [new file with mode: 0644]
include/uapi/linux/videodev2_exynos_camera.h [new file with mode: 0644]

index efe18a5c3777bafdbc9a6fa2aa8bb739debbc684..f2ab2a37e1504ada20cddac106376d846554f2d5 100644 (file)
@@ -36,6 +36,10 @@ obj-$(CONFIG_COMPANION_USE)  += fimc-is-companion.o \
                                fimc-is-device-companion.o \
                                fimc-is-video-companion.o
 
+obj-$(CONFIG_VIDEO_EXYNOS_FIMC_IS)    += setup-fimc-is.o
+obj-$(CONFIG_VIDEO_EXYNOS_FIMC_IS)    += setup-fimc-is-sensor.o
+obj-$(CONFIG_VIDEO_EXYNOS_FIMC_IS)    += setup-fimc-is-companion.o
+
 obj-$(CONFIG_VIDEO_EXYNOS_FIMC_IS) += fimc-is.o
 obj-$(CONFIG_OIS_USE)  += fimc-is-device-ois.o
 obj-$(CONFIG_AF_HOST_CONTROL)  += fimc-is-device-af.o
diff --git a/drivers/media/platform/exynos/fimc-is/exynos-fimc-is-sensor.h b/drivers/media/platform/exynos/fimc-is/exynos-fimc-is-sensor.h
new file mode 100644 (file)
index 0000000..2e1ffda
--- /dev/null
@@ -0,0 +1,326 @@
+/*
+ * /include/media/exynos_fimc_is_sensor.h
+ *
+ * Copyright (C) 2012 Samsung Electronics, Co. Ltd
+ *
+ * Exynos series exynos_fimc_is_sensor device support
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#ifndef MEDIA_EXYNOS_SENSOR_H
+#define MEDIA_EXYNOS_SENSOR_H
+
+#include "exynos-fimc-is.h"
+
+#define FIMC_IS_SENSOR_DEV_NAME "exynos-fimc-is-sensor"
+#define FIMC_IS_PINNAME_LEN 32
+#define FIMC_IS_MAX_NAME_LEN 32
+
+enum exynos_csi_id {
+       CSI_ID_A = 0,
+       CSI_ID_B = 1,
+       CSI_ID_C = 2,
+       CSI_ID_MAX
+};
+
+enum exynos_flite_id {
+       FLITE_ID_A = 0,
+       FLITE_ID_B = 1,
+       FLITE_ID_C = 2,
+       FLITE_ID_D = 3,
+       FLITE_ID_END,
+       FLITE_ID_NOTHING = 100,
+};
+
+enum exynos_sensor_channel {
+       SENSOR_CONTROL_I2C0      = 0,
+       SENSOR_CONTROL_I2C1      = 1,
+       SENSOR_CONTROL_I2C2      = 2
+};
+
+enum exynos_sensor_position {
+       SENSOR_POSITION_REAR = 0,
+       SENSOR_POSITION_FRONT
+};
+
+enum exynos_sensor_id {
+       SENSOR_NAME_NOTHING              = 0,
+       SENSOR_NAME_S5K3H2               = 1,
+       SENSOR_NAME_S5K6A3               = 2,
+       SENSOR_NAME_S5K3H5               = 3,
+       SENSOR_NAME_S5K3H7               = 4,
+       SENSOR_NAME_S5K3H7_SUNNY         = 5,
+       SENSOR_NAME_S5K3H7_SUNNY_2M      = 6,
+       SENSOR_NAME_S5K6B2               = 7,
+       SENSOR_NAME_S5K3L2               = 8,
+       SENSOR_NAME_S5K4E5               = 9,
+       SENSOR_NAME_S5K2P2               = 10,
+       SENSOR_NAME_S5K8B1               = 11,
+       SENSOR_NAME_S5K1P2               = 12,
+       SENSOR_NAME_S5K4H5               = 13,
+       SENSOR_NAME_S5K2P2_12M           = 15,
+       SENSOR_NAME_S5K6D1               = 16,
+       SENSOR_NAME_S5K2P3               = 19,
+       SENSOR_NAME_S5K4EC               = 57,
+       SENSOR_NAME_SR352                = 57,
+       SENSOR_NAME_SR030                = 57,
+
+       SENSOR_NAME_IMX135               = 101, /* 101 ~ 200 Sony sensors */
+       SENSOR_NAME_IMX134               = 102,
+       SENSOR_NAME_IMX175               = 103,
+       SENSOR_NAME_IMX240               = 104,
+       SENSOR_NAME_IMX219               = 107,
+
+       SENSOR_NAME_SR261                = 201, /* 201 ~ 300 Other vendor sensors */
+
+       SENSOR_NAME_END,
+       SENSOR_NAME_CUSTOM               = 301,
+};
+
+enum actuator_name {
+       ACTUATOR_NAME_AD5823    = 1,
+       ACTUATOR_NAME_DWXXXX    = 2,
+       ACTUATOR_NAME_AK7343    = 3,
+       ACTUATOR_NAME_HYBRIDVCA = 4,
+       ACTUATOR_NAME_LC898212  = 5,
+       ACTUATOR_NAME_WV560     = 6,
+       ACTUATOR_NAME_AK7345    = 7,
+       ACTUATOR_NAME_DW9804    = 8,
+       ACTUATOR_NAME_AK7348    = 9,
+       ACTUATOR_NAME_END,
+       ACTUATOR_NAME_NOTHING   = 100,
+};
+
+enum flash_drv_name {
+       FLADRV_NAME_KTD267      = 1,    /* Gpio type(Flash mode, Movie/torch mode) */
+       FLADRV_NAME_AAT1290A    = 2,
+       FLADRV_NAME_MAX77693    = 3,
+       FLADRV_NAME_AS3643      = 4,
+       FLADRV_NAME_KTD2692     = 5,
+       FLADRV_NAME_LM3560      = 6,
+       FLADRV_NAME_SKY81296    = 7,
+       FLADRV_NAME_RT5033      = 8,
+       FLADRV_NAME_END,
+       FLADRV_NAME_NOTHING     = 100,
+};
+
+enum from_name {
+       FROMDRV_NAME_W25Q80BW   = 1,    /* Spi type */
+       FROMDRV_NAME_FM25M16A   = 2,    /* Spi type */
+       FROMDRV_NAME_FM25M32A   = 3,
+       FROMDRV_NAME_NOTHING    = 100,
+};
+
+enum companion_name {
+       COMPANION_NAME_73C1     = 1,    /* SPI, I2C, FIMC Lite */
+       COMPANION_NAME_END,
+       COMPANION_NAME_NOTHING  = 100,
+};
+
+enum ois_name {
+       OIS_NAME_IDG2030        = 1,
+       OIS_NAME_END,
+       OIS_NAME_NOTHING        = 100,
+};
+
+enum sensor_peri_type {
+       SE_NULL         = 0,
+       SE_I2C          = 1,
+       SE_SPI          = 2,
+       SE_GPIO         = 3,
+       SE_MPWM         = 4,
+       SE_ADC          = 5,
+       SE_FIMC_LITE    = 6,
+};
+
+struct i2c_type {
+       u32 channel;
+       u32 slave_address;
+       u32 speed;
+};
+
+struct spi_type {
+       u32 channel;
+};
+
+struct gpio_type {
+       u32 first_gpio_port_no;
+       u32 second_gpio_port_no;
+};
+
+struct fimc_lite_type {
+       u32 channel;
+};
+
+union sensor_peri_format {
+       struct i2c_type i2c;
+       struct spi_type spi;
+       struct gpio_type gpio;
+       struct fimc_lite_type fimc_lite;
+};
+
+struct sensor_protocol {
+       u32 product_name;
+       enum sensor_peri_type peri_type;
+       union sensor_peri_format peri_setting;
+       u32 csi_ch;
+       u32 cal_address;
+       u32 reserved[2];
+};
+
+struct sensor_peri_info {
+       bool valid;
+       enum sensor_peri_type peri_type;
+       union sensor_peri_format peri_setting;
+};
+
+struct sensor_companion {
+       u32 product_name;       /* enum companion_name */
+       struct sensor_peri_info peri_info0;
+       struct sensor_peri_info peri_info1;
+       struct sensor_peri_info peri_info2;
+       struct sensor_peri_info reserved[2];
+};
+
+struct sensor_open_extended {
+       struct sensor_protocol sensor_con;
+       struct sensor_protocol actuator_con;
+       struct sensor_protocol flash_con;
+       struct sensor_protocol from_con;
+       struct sensor_companion companion_con;
+       struct sensor_protocol ois_con;
+
+       u32 mclk;
+       u32 mipi_lane_num;
+       u32 mipi_settle_line;
+       u32 mipi_speed;
+       /* Skip setfile loading when fast_open_sensor is not 0 */
+       u32 fast_open_sensor;
+       /* Activatiing sensor self calibration mode (6A3) */
+       u32 self_calibration_mode;
+       /* This field is to adjust I2c clock based on ACLK200 */
+       /* This value is varied in case of rev 0.2 */
+       u32 I2CSclk;
+};
+
+#define GPIO_SCENARIO_ON               0
+#define GPIO_SCENARIO_OFF              1
+#define GPIO_SCENARIO_MAX              2
+#define GPIO_CTRL_MAX                  32
+
+#define SENSOR_SCENARIO_NORMAL         0
+#define SENSOR_SCENARIO_VISION         1
+#define SENSOR_SCENARIO_EXTERNAL       2
+#define SENSOR_SCENARIO_OIS_FACTORY            3
+#define SENSOR_SCENARIO_MAX            10
+
+enum pin_act {
+       PIN_PULL_NONE = 0,
+       PIN_OUTPUT_HIGH,
+       PIN_OUTPUT_LOW,
+       PIN_OUTPUT,
+       PIN_INPUT,
+       PIN_RESET,
+       PIN_FUNCTION,
+       PIN_REGULATOR_ON,
+       PIN_REGULATOR_OFF,
+       PIN_REGULATOR,
+       PIN_DELAY,
+       PIN_END
+};
+
+struct exynos_sensor_pin {
+       unsigned long pin;
+       int delay;
+       u32 value;
+       char *name;
+       enum pin_act act;
+       int voltage;
+};
+
+#ifdef CONFIG_USE_VENDER_FEATURE
+#define SET_PIN(p, id1, id2, n, _pin, _value, _name, _time, _act) \
+               (p)->pin_ctrls[id1][id2][n].pin = _pin; \
+               (p)->pin_ctrls[id1][id2][n].delay = _time; \
+               (p)->pin_ctrls[id1][id2][n].value = _value; \
+               (p)->pin_ctrls[id1][id2][n].name = _name; \
+               (p)->pin_ctrls[id1][id2][n].act = _act; \
+               (p)->pin_ctrls[id1][id2][n].voltage = 0;
+#else
+#define SET_PIN(d, s, c, i, p , v, n, a) \
+               (d)->pin_ctrls[s][c][i].pin     = p; \
+               (d)->pin_ctrls[s][c][i].value   = v; \
+               (d)->pin_ctrls[s][c][i].name    = n; \
+               (d)->pin_ctrls[s][c][i].act     = a;
+#endif
+
+/*
+ * struct exynos_platform_fimc_is_sensor - platform data for exynos_sensor driver
+ */
+struct exynos_platform_fimc_is_sensor {
+       int (*gpio_cfg)(struct platform_device *pdev, u32 scenario, u32 enable);
+       int (*iclk_cfg)(struct platform_device *pdev, u32 scenario, u32 channel);
+       int (*iclk_on)(struct platform_device *pdev,u32 scenario, u32 channel);
+       int (*iclk_off)(struct platform_device *pdev, u32 scenario, u32 channel);
+       int (*mclk_on)(struct platform_device *pdev, u32 scenario, u32 channel);
+       int (*mclk_off)(struct platform_device *pdev, u32 scenario, u32 channel);
+       struct exynos_sensor_pin pin_ctrls[SENSOR_SCENARIO_MAX][GPIO_SCENARIO_MAX][GPIO_CTRL_MAX];
+       char sensor_name[FIMC_IS_MAX_NAME_LEN];
+       u32 scenario;
+       u32 id;
+       u32 mclk_ch;
+       u32 csi_ch;
+       u32 flite_ch;
+       u32 i2c_ch;
+       u32 i2c_addr;
+       u32 is_bns;
+       u32 flash_first_gpio;
+       u32 flash_second_gpio;
+       u32 is_softlanding;
+       u32 sensor_id;
+       bool companion_use_pmic;
+#ifdef CONFIG_OIS_USE
+       int pin_ois_en;
+#endif
+       struct pinctrl *pinctrl;
+};
+
+extern int exynos_fimc_is_sensor_pins_cfg(struct platform_device *pdev,
+       u32 scenario,
+       u32 enable);
+extern int exynos_fimc_is_sensor_iclk_cfg(struct platform_device *pdev,
+       u32 scenario,
+       u32 channel);
+extern int exynos_fimc_is_sensor_iclk_on(struct platform_device *pdev,
+       u32 scenario,
+       u32 channel);
+extern int exynos_fimc_is_sensor_iclk_off(struct platform_device *pdev,
+       u32 scenario,
+       u32 channel);
+extern int exynos_fimc_is_sensor_mclk_on(struct platform_device *pdev,
+       u32 scenario,
+       u32 channel);
+extern int exynos_fimc_is_sensor_mclk_off(struct platform_device *pdev,
+       u32 scenario,
+       u32 channel);
+
+extern int exynos_fimc_is_companion_iclk_cfg(struct platform_device *pdev,
+       u32 scenario,
+       u32 channel);
+extern int exynos_fimc_is_companion_iclk_on(struct platform_device *pdev,
+       u32 scenario,
+       u32 channel);
+extern int exynos_fimc_is_companion_iclk_off(struct platform_device *pdev,
+       u32 scenario,
+       u32 channel);
+extern int exynos_fimc_is_companion_mclk_on(struct platform_device *pdev,
+       u32 scenario,
+       u32 channel);
+extern int exynos_fimc_is_companion_mclk_off(struct platform_device *pdev,
+       u32 scenario,
+       u32 channel);
+
+#endif /* MEDIA_EXYNOS_SENSOR_H */
diff --git a/drivers/media/platform/exynos/fimc-is/exynos-fimc-is.h b/drivers/media/platform/exynos/fimc-is/exynos-fimc-is.h
new file mode 100644 (file)
index 0000000..3d095df
--- /dev/null
@@ -0,0 +1,290 @@
+/* linux/arch/arm/plat-s5p/include/plat/fimc_is.h
+ *
+ * Copyright (C) 2011 Samsung Electronics, Co. Ltd
+ *
+ * Exynos 4 series FIMC-IS slave device support
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+#ifndef EXYNOS_FIMC_IS_H_
+#define EXYNOS_FIMC_IS_H_ __FILE__
+
+#define FIMC_IS_MAKE_QOS_IDX_NM(__LV) __LV ## _IDX
+#define FIMC_IS_DECLARE_QOS_ENUM(__TYPE) enum FIMC_IS_DVFS_ ## __TYPE ## _LV_IDX
+
+#include <linux/videodev2.h>
+#if defined(CONFIG_ARCH_EXYNOS4)
+#include <media/s5p_fimc.h>
+#endif
+
+#define FIMC_IS_DEV_NAME                       "exynos-fimc-is"
+#include <linux/platform_device.h>
+
+/* FIMC-IS DVFS LEVEL enum (INT, MIF, I2C) */
+enum FIMC_IS_INT_LV {
+       FIMC_IS_INT_L0,
+       FIMC_IS_INT_L1,
+       FIMC_IS_INT_L1_1,
+       FIMC_IS_INT_L1_2,
+       FIMC_IS_INT_L1_3,
+};
+
+enum FIMC_IS_MIF_LV {
+       FIMC_IS_MIF_L0,
+       FIMC_IS_MIF_L1,
+       FIMC_IS_MIF_L2,
+       FIMC_IS_MIF_L3,
+       FIMC_IS_MIF_L4,
+};
+
+/*
+ * On some soc, It needs to notify change of INT clock to F/W.
+ * Because I2C clock can be take affect from other clock change(like INT)
+ */
+enum FIMC_IS_I2C_LV {
+       FIMC_IS_I2C_L0,
+       FIMC_IS_I2C_L1,
+       FIMC_IS_I2C_L1_1,
+       FIMC_IS_I2C_L1_3,
+};
+
+/* FIMC-IS DVFS SCENARIO enum */
+enum FIMC_IS_SCENARIO_ID {
+       FIMC_IS_SN_DEFAULT,
+       FIMC_IS_SN_FRONT_PREVIEW,
+       FIMC_IS_SN_FRONT_CAPTURE,
+       FIMC_IS_SN_FRONT_CAMCORDING,
+       FIMC_IS_SN_FRONT_VT1,
+       FIMC_IS_SN_FRONT_VT2,
+       FIMC_IS_SN_REAR_PREVIEW_FHD,
+       FIMC_IS_SN_REAR_PREVIEW_FHD_BNS_OFF,
+       FIMC_IS_SN_REAR_PREVIEW_WHD,
+       FIMC_IS_SN_REAR_PREVIEW_UHD,
+       FIMC_IS_SN_REAR_CAPTURE,
+       FIMC_IS_SN_REAR_CAMCORDING_FHD,
+       FIMC_IS_SN_REAR_CAMCORDING_FHD_BNS_OFF,
+       FIMC_IS_SN_REAR_CAMCORDING_WHD,
+       FIMC_IS_SN_REAR_CAMCORDING_UHD,
+       FIMC_IS_SN_DUAL_PREVIEW,
+       FIMC_IS_SN_DUAL_CAPTURE,
+       FIMC_IS_SN_DUAL_CAMCORDING,
+       FIMC_IS_SN_HIGH_SPEED_FPS,
+       FIMC_IS_SN_DIS_ENABLE,
+       FIMC_IS_SN_MAX,
+       FIMC_IS_SN_END,
+};
+
+enum FIMC_IS_DVFS_QOS_TYPE {
+       FIMC_IS_DVFS_CPU_MIN,
+       FIMC_IS_DVFS_CPU_MAX,
+       FIMC_IS_DVFS_INT,
+       FIMC_IS_DVFS_MIF,
+       FIMC_IS_DVFS_I2C,
+       FIMC_IS_DVFS_CAM,
+       FIMC_IS_DVFS_DISP,
+       FIMC_IS_DVFS_PWM,
+       FIMC_IS_DVFS_END,
+};
+
+#define SET_QOS_WITH_CPU(t, s, i, m, _i, c, d, p, cmin, cmax)  \
+       (t)[s][FIMC_IS_DVFS_INT]        = i;    \
+       (t)[s][FIMC_IS_DVFS_MIF]        = m;    \
+       (t)[s][FIMC_IS_DVFS_I2C]        = _i;   \
+       (t)[s][FIMC_IS_DVFS_CAM]        = c;    \
+       (t)[s][FIMC_IS_DVFS_DISP]       = d;    \
+       (t)[s][FIMC_IS_DVFS_PWM]        = p;    \
+       (t)[s][FIMC_IS_DVFS_CPU_MIN]    = cmin; \
+       (t)[s][FIMC_IS_DVFS_CPU_MAX]    = cmax;
+
+#define SET_QOS(t, s, i, m, _i, c, d, p)       \
+       (t)[s][FIMC_IS_DVFS_INT]        = i;    \
+       (t)[s][FIMC_IS_DVFS_MIF]        = m;    \
+       (t)[s][FIMC_IS_DVFS_I2C]        = _i;   \
+       (t)[s][FIMC_IS_DVFS_CAM]        = c;    \
+       (t)[s][FIMC_IS_DVFS_DISP]       = d;    \
+       (t)[s][FIMC_IS_DVFS_PWM]        = p;    \
+       (t)[s][FIMC_IS_DVFS_CPU_MIN]    = 0;    \
+       (t)[s][FIMC_IS_DVFS_CPU_MAX]    = 0;
+
+enum FIMC_IS_CLK_GATE {
+       FIMC_IS_GATE_3AA1_IP,
+       FIMC_IS_GATE_ISP_IP,
+       FIMC_IS_GATE_DRC_IP,
+       FIMC_IS_GATE_SCC_IP,
+       FIMC_IS_GATE_ODC_IP,
+       FIMC_IS_GATE_DIS_IP,
+       FIMC_IS_GATE_3DNR_IP,
+       FIMC_IS_GATE_SCP_IP,
+       FIMC_IS_GATE_FD_IP,
+       FIMC_IS_GATE_3AA0_IP,
+       FIMC_IS_CLK_GATE_MAX,
+};
+
+enum FIMC_IS_GRP {
+       FIMC_IS_GRP_3A0,
+       FIMC_IS_GRP_3A1,
+       FIMC_IS_GRP_ISP,
+       FIMC_IS_GRP_DIS,
+       FIMC_IS_GRP_MAX,
+};
+
+enum FIMC_IS_CLK_GATE_USR_SCENARIO {
+       CLK_GATE_NOT_FULL_BYPASS_SN = 1,
+       CLK_GATE_FULL_BYPASS_SN,
+       CLK_GATE_DIS_SN,
+};
+
+/*
+ * struct exynos_fimc_is_subip_info
+ *   This info describes what and how many subip fimc-is has.
+ *   In machine data, this info should be defined.
+ */
+struct exynos_fimc_is_subip_ext {
+       bool valid;
+       bool full_bypass;
+       u32 version;
+       u32 base_addr;
+};
+
+struct exynos_fimc_is_subip_info {
+       /* You can add more new subip */
+       struct exynos_fimc_is_subip_ext _mcuctl;
+       struct exynos_fimc_is_subip_ext _3a0;
+       struct exynos_fimc_is_subip_ext _3a1;
+       struct exynos_fimc_is_subip_ext _isp;
+       struct exynos_fimc_is_subip_ext _drc;
+       struct exynos_fimc_is_subip_ext _scc;
+       struct exynos_fimc_is_subip_ext _odc;
+       struct exynos_fimc_is_subip_ext _dis;
+       struct exynos_fimc_is_subip_ext _dnr;
+       struct exynos_fimc_is_subip_ext _scp;
+       struct exynos_fimc_is_subip_ext _fd;
+       struct exynos_fimc_is_subip_ext _pwm;
+};
+
+/*
+ * struct exynos_fimc_is_clk_gate_group
+ *     This struct is for host clock gating.
+ *     It decsribes register, masking bit info and other control for each group.
+ *     If you uses host clock gating, You must define this struct in exynos_fimc_is_clk_gate_info.
+ */
+struct exynos_fimc_is_clk_gate_group {
+       u32     mask_clk_on_org;        /* masking value in clk on */
+       u32     mask_clk_on_mod;        /* masking value in clk on */
+       u32     mask_clk_off_self_org;  /* masking value in clk off(not depend) original */
+       u32     mask_clk_off_self_mod;  /* masking value in clk off(not depend) final */
+       u32     mask_clk_off_depend;    /* masking value in clk off(depend on other grp) */
+       u32     mask_cond_for_depend;   /* masking group having dependancy for other */
+};
+
+/*
+ * struct exynos_fimc_is_clk_gate_info
+ *     This struct is for host clock gating.
+ *     It has exynos_fimc_is_clk_gate_group to control each group's clk gating.
+ *     And it has function pointer to include user scenario masking
+ */
+struct exynos_fimc_is_clk_gate_info {
+       const char *gate_str[FIMC_IS_CLK_GATE_MAX];                     /* register adr for gating */
+       struct exynos_fimc_is_clk_gate_group groups[FIMC_IS_GRP_MAX];
+       /* You must set this function pointer (on/off) */
+       int (*clk_on_off)(u32 clk_gate_id, bool is_on);
+       /*
+        * if there are specific scenarios for clock gating,
+        * You can define user function.
+        * user_scenario_id will be in
+        */
+       int (*user_clk_gate)(u32 group_id,
+                       bool is_on,
+                       u32 user_scenario_id,
+                       unsigned long msk_state,
+                       struct exynos_fimc_is_clk_gate_info *gate_info);
+};
+
+/**
+* struct exynos_platform_fimc_is - camera host interface platform data
+*
+* @isp_info: properties of camera sensor required for host interface setup
+*/
+struct exynos_platform_fimc_is {
+       int     hw_ver;
+       struct exynos_fimc_is_subip_info *subip_info;
+       int     (*cfg_gpio)(struct platform_device *pdev, int channel, bool flag_on);
+       int     (*clk_cfg)(struct platform_device *pdev);
+       int     (*clk_on)(struct platform_device *pdev);
+       int     (*clk_off)(struct platform_device *pdev);
+       int     (*print_clk)(struct platform_device *pdev);
+       int     (*print_cfg)(struct platform_device *pdev, u32 channel);
+       int     (*print_pwr)(struct platform_device *pdev);
+
+       /* These fields are to return qos value for dvfs scenario */
+       u32     *int_qos_table;
+       u32     *mif_qos_table;
+       u32     *i2c_qos_table;
+       int     (*get_int_qos)(int scenario_id);
+       int     (*get_mif_qos)(int scenario_id);
+       int     (*get_i2c_qos)(int scenario_id);
+       u32     dvfs_data[FIMC_IS_SN_END][FIMC_IS_DVFS_END];
+
+       /* For host clock gating */
+       struct exynos_fimc_is_clk_gate_info *gate_info;
+#ifdef CONFIG_COMPANION_USE
+       u32     companion_spi_channel;
+       bool    use_two_spi_line;
+#endif
+       u32     use_sensor_dynamic_voltage_mode;
+#ifdef CONFIG_OIS_USE
+       bool use_ois;
+#endif /* CONFIG_OIS_USE */
+       bool use_ois_hsi2c;
+       bool use_module_check;
+};
+
+extern struct device *fimc_is_dev;
+
+extern void exynos_fimc_is_set_platdata(struct exynos_platform_fimc_is *pd);
+
+int fimc_is_set_parent_dt(struct platform_device *pdev,
+       const char *child, const char *parent);
+struct clk *fimc_is_get_parent_dt(struct platform_device *pdev,
+       const char *child);
+int fimc_is_set_rate_dt(struct platform_device *pdev,
+       const char *conid, unsigned int rate);
+unsigned int  fimc_is_get_rate_dt(struct platform_device *pdev,
+       const char *conid);
+unsigned int  fimc_is_enable_dt(struct platform_device *pdev,
+       const char *conid);
+void  fimc_is_disable_dt(struct platform_device *pdev,
+       const char *conid);
+
+/* platform specific clock functions */
+#if defined(CONFIG_ARCH_EXYNOS4)
+/* exynos 4 */
+extern int exynos4_fimc_is_cfg_clk(struct platform_device *pdev);
+extern int exynos4_fimc_is_clk_on(struct platform_device *pdev);
+extern int exynos4_fimc_is_clk_off(struct platform_device *pdev);
+extern int exynos4_fimc_is_sensor_clock_on(struct platform_device *pdev, u32 source);
+extern int exynos4_fimc_is_sensor_clock_off(struct platform_device *pdev, u32 source);
+extern int exynos4_fimc_is_sensor_power_on(struct platform_device *pdev, int sensor_id);
+extern int exynos4_fimc_is_sensor_power_off(struct platform_device *pdev, int sensor_id);
+extern int exynos4_fimc_is_print_cfg(struct platform_device *pdev, u32 channel);
+extern int exynos4_fimc_is_cfg_gpio(struct platform_device *pdev, int channel, bool flag_on);
+#else /* exynos 4 */
+/* exynos 5 */
+extern int exynos_fimc_is_cfg_clk(struct platform_device *pdev);
+extern int exynos_fimc_is_cfg_cam_clk(struct platform_device *pdev);
+extern int exynos_fimc_is_clk_on(struct platform_device *pdev);
+extern int exynos_fimc_is_clk_off(struct platform_device *pdev);
+extern int exynos_fimc_is_print_clk(struct platform_device *pdev);
+extern int exynos_fimc_is_set_user_clk_gate(u32 group_id, bool is_on, u32 user_scenario_id,
+                                                                                       unsigned long msk_state,
+                                                                                       struct exynos_fimc_is_clk_gate_info *gate_info);
+extern int exynos_fimc_is_clk_gate(u32 clk_gate_id, bool is_on);
+
+extern int exynos_fimc_is_sensor_power_on(struct platform_device *pdev, int sensor_id);
+extern int exynos_fimc_is_sensor_power_off(struct platform_device *pdev, int sensor_id);
+extern int exynos_fimc_is_print_cfg(struct platform_device *pdev, u32 channel);
+extern int exynos_fimc_is_print_pwr(struct platform_device *pdev);
+#endif /* exynos 5*/
+#endif /* EXYNOS_FIMC_IS_H_ */
index d52c9d4f8f0afd550f24220d042a2fb7de4b1958..34ab6d5617f0df2f71edcdbe90eea5a57cb92b8d 100644 (file)
@@ -11,9 +11,9 @@
  */
 
 #include <linux/sched.h>
-#include <mach/exynos-fimc-is-sensor.h>
-#include <mach/exynos-fimc-is.h>
-#include <media/exynos_mc.h>
+#include "exynos-fimc-is-sensor.h"
+#include "exynos-fimc-is.h"
+#include "media/exynos_mc.h"
 #ifdef CONFIG_OF
 #include <linux/of_gpio.h>
 #endif
index 9f22844755a72919b0521cf0d73947022f7d9181..543983ffdce08d27641f62e6f054d54b09c364bf 100644 (file)
@@ -24,7 +24,7 @@
 #include <linux/delay.h>
 #include <linux/interrupt.h>
 #include <linux/pm_runtime.h>
-#include <mach/exynos-fimc-is.h>
+#include "exynos-fimc-is.h"
 #include <media/v4l2-device.h>
 #include <media/v4l2-mediabus.h>
 #include <media/v4l2-ioctl.h>
index ee20321c5ee6edbb4a1d9cd56b46c6281c9575fb..37bfb95f7fa5f72fb2660594e210d7e51f32484a 100644 (file)
@@ -12,7 +12,7 @@
 #ifndef fimc_is_device_companion_H
 #define fimc_is_device_companion_H
 
-#include <mach/exynos-fimc-is-sensor.h>
+#include "exynos-fimc-is-sensor.h"
 #include <linux/interrupt.h>
 #include "fimc-is-video.h"
 
index f1bbe3fa9141add27f3d8be7049352af1307d0a5..7dd1eec03fc879e53307a275a850d598da1d4f4b 100644 (file)
@@ -28,7 +28,7 @@
 #include <linux/platform_device.h>
 #include <linux/regulator/consumer.h>
 #include <linux/delay.h>
-#include <mach/exynos-fimc-is-sensor.h>
+#include "exynos-fimc-is-sensor.h"
 #include <mach/pinctrl-samsung.h>
 #ifdef CONFIG_OIS_FW_UPDATE_THREAD_USE
 #include <linux/kthread.h>
index a0ae8a1b75c4d6085c3fb55a4d6b89683120b020..d4a0ed505048f87cac5ab14f0290f28dfb995fee 100644 (file)
@@ -12,7 +12,7 @@
 #ifndef fimc_is_device_sensor_H
 #define fimc_is_device_sensor_H
 
-#include <mach/exynos-fimc-is-sensor.h>
+#include "exynos-fimc-is-sensor.h"
 #include "fimc-is-mem.h"
 #include "fimc-is-video.h"
 #include "fimc-is-resourcemgr.h"
index d14e8d26007a40e5cc2679bb76630a5496fab08d..2b8deacf86aaafcff674465db24c0c7ec7933963 100644 (file)
@@ -11,8 +11,8 @@
  */
 
 #include <linux/sched.h>
-#include <mach/exynos-fimc-is-sensor.h>
-#include <mach/exynos-fimc-is.h>
+#include "exynos-fimc-is-sensor.h"
+#include "exynos-fimc-is.h"
 #include <media/exynos_mc.h>
 #ifdef CONFIG_OF
 #include <linux/of.h>
index 81b4591d12eff4dc00b10fef63b82acb998df89e..d3d18d55afea18f2066027aa678bd88d0c2977f9 100644 (file)
@@ -9,7 +9,7 @@
  * published by the Free Software Foundation.
  */
 
-#include <mach/exynos-fimc-is-sensor.h>
+#include "exynos-fimc-is-sensor.h"
 
 #ifndef FIMC_IS_DT_H
 #define FIMC_IS_DT_H
index 82ba5400c2254ba848ec73ec22b5ad98c940891b..c8e2e6e3b2660e0fdf674cecbb592edd9f92e6c2 100644 (file)
@@ -33,7 +33,7 @@
 #include <media/v4l2-ctrls.h>
 #include <media/v4l2-device.h>
 #include <media/v4l2-subdev.h>
-#include <mach/exynos-fimc-is-sensor.h>
+#include "../exynos-fimc-is-sensor.h"
 
 #include "../fimc-is-core.h"
 #include "../fimc-is-device-sensor.h"
index 872885898bef8cdcfbed9517385a30ea5d28034d..f457223fce19966b2acfb1f067fac4c38d6d2bc2 100644 (file)
@@ -33,7 +33,7 @@
 #include <media/v4l2-ctrls.h>
 #include <media/v4l2-device.h>
 #include <media/v4l2-subdev.h>
-#include <mach/exynos-fimc-is-sensor.h>
+#include "../exynos-fimc-is-sensor.h"
 
 #include "../fimc-is-core.h"
 #include "../fimc-is-device-sensor.h"
diff --git a/drivers/media/platform/exynos/fimc-is/setup-fimc-is-companion.c b/drivers/media/platform/exynos/fimc-is/setup-fimc-is-companion.c
new file mode 100644 (file)
index 0000000..c0b9f99
--- /dev/null
@@ -0,0 +1,294 @@
+/* linux/arch/arm/mach-exynos/setup-fimc-sensor.c
+ *
+ * Copyright (c) 2014 Samsung Electronics Co., Ltd.
+ *             http://www.samsung.com/
+ *
+ * FIMC-IS-COMPANION gpio and clock configuration
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#include <linux/kernel.h>
+#include <linux/types.h>
+#include <linux/gpio.h>
+#include <linux/clk.h>
+#include <linux/err.h>
+#include <linux/platform_device.h>
+#include <linux/io.h>
+#include <linux/regulator/consumer.h>
+#include <linux/delay.h>
+#include <linux/clk-provider.h>
+#include <linux/clkdev.h>
+#include <mach/regs-gpio.h>
+#include <mach/map.h>
+#include <mach/regs-clock.h>
+#include <plat/gpio-cfg.h>
+#include <plat/map-s5p.h>
+#include <plat/cpu.h>
+#ifdef CONFIG_OF
+#include <linux/of_gpio.h>
+#endif
+#if defined(CONFIG_SOC_EXYNOS5422)
+#include <mach/regs-clock-exynos5422.h>
+#elif defined(CONFIG_SOC_EXYNOS5430)
+#include <mach/regs-clock-exynos5430.h>
+#elif defined(CONFIG_SOC_EXYNOS5433)
+#include <mach/regs-clock-exynos5433.h>
+#endif
+
+#include "exynos-fimc-is.h"
+#include "exynos-fimc-is-sensor.h"
+
+#if defined(CONFIG_SOC_EXYNOS5422)
+int exynos5422_fimc_is_companion_iclk_cfg(struct platform_device *pdev,
+       u32 scenario,
+       u32 channel)
+{
+       int ret = 0;
+
+       pr_info("clk_cfg:(ch%d),scenario(%d)\n", channel, scenario);
+
+       /* SCLK_SPI0_ISP */
+       fimc_is_set_parent_dt(pdev, "mout_spi0_isp", "mout_spll_ctrl");
+       fimc_is_set_rate_dt(pdev, "dout_spi0_isp", 200 * 1000000);
+       fimc_is_set_rate_dt(pdev, "dout_spi0_isp_pre", 100 * 1000000);
+       /* SCLK_SPI1_ISP */
+       fimc_is_set_parent_dt(pdev, "mout_spi1_isp", "mout_spll_ctrl");
+       fimc_is_set_rate_dt(pdev, "dout_spi1_isp", 200 * 1000000);
+       fimc_is_set_rate_dt(pdev, "dout_spi1_isp_pre", 100 * 1000000);
+
+       /* I2C */
+       /* CMU TOP */
+       /* 333_432_ISP */
+       fimc_is_set_parent_dt(pdev, "mout_aclk_333_432_isp", "mout_ipll_ctrl");
+       fimc_is_set_rate_dt(pdev, "dout_aclk_333_432_isp", (432 * 1000000));
+       fimc_is_set_parent_dt(pdev, "mout_aclk_333_432_isp_sw", "dout_aclk_333_432_isp");
+       fimc_is_set_parent_dt(pdev, "mout_aclk_333_432_isp_user", "mout_aclk_333_432_isp_sw");
+
+       /* CMU ISP */
+       /* ACLK_DIV0 */
+       fimc_is_set_rate_dt(pdev, "dout_ispdiv0", (216 * 1000000));
+       /* ACLK_DIV1 */
+       fimc_is_set_rate_dt(pdev, "dout_ispdiv1", (108 * 1000000));
+       /* ACLK_DIV2 */
+       fimc_is_set_rate_dt(pdev, "dout_ispdiv2", (54 * 1000000));
+
+       return ret;
+}
+
+int exynos5422_fimc_is_companion_iclk_on(struct platform_device *pdev,
+       u32 scenario,
+       u32 channel)
+{
+       return 0;
+}
+
+int exynos5422_fimc_is_companion_iclk_off(struct platform_device *pdev,
+       u32 scenario,
+       u32 channel)
+{
+       return 0;
+}
+
+int exynos5422_fimc_is_companion_mclk_on(struct platform_device *pdev,
+       u32 scenario,
+       u32 channel)
+{
+       u32 frequency;
+       char div_name[30];
+       char sclk_name[30];
+
+       pr_info("%s:ch(%d)\n", __func__, channel);
+
+       snprintf(div_name, sizeof(div_name), "dout_isp_sensor%d", channel);
+       snprintf(sclk_name, sizeof(sclk_name), "sclk_isp_sensor%d", channel);
+
+       fimc_is_set_parent_dt(pdev, "mout_isp_sensor", "fin_pll");
+       fimc_is_set_rate_dt(pdev, div_name, (24 * 1000000));
+       fimc_is_enable_dt(pdev, sclk_name);
+       frequency = fimc_is_get_rate_dt(pdev, div_name);
+
+       pr_info("%s(%d, mclk : %d)\n", __func__, channel, frequency);
+
+       return 0;
+}
+
+int exynos5422_fimc_is_companion_mclk_off(struct platform_device *pdev,
+       u32 scenario,
+       u32 channel)
+{
+       pr_debug("%s\n", __func__);
+
+       fimc_is_disable_dt(pdev, "sclk_isp_sensor0");
+
+       return 0;
+}
+#elif defined(CONFIG_SOC_EXYNOS5430) || defined(CONFIG_SOC_EXYNOS5433)
+int exynos5430_fimc_is_companion_iclk_div_max(struct platform_device *pdev)
+{
+       /* SCLK */
+       /* SCLK_SPI0 */
+       fimc_is_set_parent_dt(pdev, "mout_sclk_isp_spi0", "oscclk");
+       fimc_is_set_rate_dt(pdev, "dout_sclk_isp_spi0_a", 1);
+       fimc_is_set_rate_dt(pdev, "dout_sclk_isp_spi0_b", 1);
+       fimc_is_set_parent_dt(pdev, "mout_sclk_isp_spi0_user", "oscclk");
+
+       return 0;
+}
+
+int exynos5430_fimc_is_companion_iclk_cfg(struct platform_device *pdev,
+       u32 scenario,
+       u32 channel)
+{
+       int ret = 0;
+
+       pr_info("clk_cfg:(ch%d),scenario(%d)\n", channel, scenario);
+
+       /* SCLK_SPI0_ISP */
+       fimc_is_set_parent_dt(pdev, "mout_sclk_isp_spi0", "mout_bus_pll_user");
+       fimc_is_set_rate_dt(pdev, "dout_sclk_isp_spi0_a", 200 * 1000000);
+       fimc_is_set_rate_dt(pdev, "dout_sclk_isp_spi0_b", 100 * 1000000);
+       fimc_is_set_parent_dt(pdev, "mout_sclk_isp_spi0_user", "sclk_isp_spi0_top");
+#if 0
+       /* SCLK_SPI1_ISP */
+       fimc_is_set_parent_dt(pdev, "mout_sclk_isp_spi1", "mout_bus_pll_user");
+       fimc_is_set_rate_dt(pdev, "dout_sclk_isp_spi1_a", 275 * 1000000);
+       fimc_is_set_rate_dt(pdev, "dout_sclk_isp_spi1_b", 46 * 1000000);
+       fimc_is_set_parent_dt(pdev, "mout_sclk_isp_spi1_user", "sclk_isp_spi1_top");
+#endif
+
+       /* I2C */
+       /* CMU TOP */
+       fimc_is_set_rate_dt(pdev, "dout_aclk_cam1_333", 333 * 1000000);
+
+       /* USER_MUX_SEL */
+       fimc_is_set_parent_dt(pdev, "mout_aclk_cam1_333_user", "aclk_cam1_333");
+       /* MPWM */
+       fimc_is_set_rate_dt(pdev, "dout_pclk_cam1_166", 167 * 1000000);
+       fimc_is_set_rate_dt(pdev, "dout_pclk_cam1_83", 84 * 1000000);
+       fimc_is_set_rate_dt(pdev, "dout_sclk_isp_mpwm", 84 * 1000000);
+
+       return ret;
+}
+
+int exynos5430_fimc_is_companion_iclk_on(struct platform_device *pdev,
+       u32 scenario,
+       u32 channel)
+{
+       /* SCLK clock enable */
+       fimc_is_enable_dt(pdev, "gate_isp_spi0");
+
+       return 0;
+}
+
+int exynos5430_fimc_is_companion_iclk_off(struct platform_device *pdev,
+       u32 scenario,
+       u32 channel)
+{
+       exynos5430_fimc_is_companion_iclk_div_max(pdev);
+
+       /* SCLK clock disable */
+       fimc_is_disable_dt(pdev, "gate_isp_spi0");
+
+       return 0;
+}
+
+int exynos5430_fimc_is_companion_mclk_on(struct platform_device *pdev,
+       u32 scenario,
+       u32 channel)
+{
+       u32 frequency;
+       char mux_name[30];
+       char div_a_name[30];
+       char div_b_name[30];
+       char sclk_name[30];
+
+       pr_debug("%s\n", __func__);
+
+       snprintf(mux_name, sizeof(mux_name), "mout_sclk_isp_sensor%d", channel);
+       snprintf(div_a_name, sizeof(div_a_name), "dout_sclk_isp_sensor%d_a", channel);
+       snprintf(div_b_name, sizeof(div_b_name), "dout_sclk_isp_sensor%d_b", channel);
+       snprintf(sclk_name, sizeof(sclk_name), "sclk_isp_sensor%d", channel);
+
+       fimc_is_set_parent_dt(pdev, mux_name, "oscclk");
+       fimc_is_set_rate_dt(pdev, div_a_name, 24 * 1000000);
+       fimc_is_set_rate_dt(pdev, div_b_name, 24 * 1000000);
+       frequency = fimc_is_get_rate_dt(pdev, sclk_name);
+
+       pr_info("%s(%d, mclk : %d)\n", __func__, channel, frequency);
+
+       return 0;
+}
+
+int exynos5430_fimc_is_companion_mclk_off(struct platform_device *pdev,
+       u32 scenario,
+       u32 channel)
+{
+       pr_debug("%s\n", __func__);
+
+       return 0;
+}
+#endif
+
+/* Wrapper functions */
+int exynos_fimc_is_companion_iclk_cfg(struct platform_device *pdev,
+       u32 scenario,
+       u32 channel)
+{
+#if defined(CONFIG_SOC_EXYNOS5422)
+       exynos5422_fimc_is_companion_iclk_cfg(pdev, scenario, channel);
+#elif defined(CONFIG_SOC_EXYNOS5430) || defined(CONFIG_SOC_EXYNOS5433)
+       exynos5430_fimc_is_companion_iclk_cfg(pdev, scenario, channel);
+#endif
+       return 0;
+}
+
+int exynos_fimc_is_companion_iclk_on(struct platform_device *pdev,
+       u32 scenario,
+       u32 channel)
+{
+#if defined(CONFIG_SOC_EXYNOS5422)
+       exynos5422_fimc_is_companion_iclk_on(pdev, scenario, channel);
+#elif defined(CONFIG_SOC_EXYNOS5430) || defined(CONFIG_SOC_EXYNOS5433)
+       exynos5430_fimc_is_companion_iclk_on(pdev, scenario, channel);
+#endif
+       return 0;
+}
+
+int exynos_fimc_is_companion_iclk_off(struct platform_device *pdev,
+       u32 scenario,
+       u32 channel)
+{
+#if defined(CONFIG_SOC_EXYNOS5422)
+       exynos5422_fimc_is_companion_iclk_off(pdev, scenario, channel);
+#elif defined(CONFIG_SOC_EXYNOS5430) || defined(CONFIG_SOC_EXYNOS5433)
+       exynos5430_fimc_is_companion_iclk_off(pdev, scenario, channel);
+#endif
+       return 0;
+}
+
+int exynos_fimc_is_companion_mclk_on(struct platform_device *pdev,
+       u32 scenario,
+       u32 channel)
+{
+#if defined(CONFIG_SOC_EXYNOS5422)
+       exynos5422_fimc_is_companion_mclk_on(pdev, scenario, channel);
+#elif defined(CONFIG_SOC_EXYNOS5430) || defined(CONFIG_SOC_EXYNOS5433)
+       exynos5430_fimc_is_companion_mclk_on(pdev, scenario, channel);
+#endif
+       return 0;
+}
+
+int exynos_fimc_is_companion_mclk_off(struct platform_device *pdev,
+       u32 scenario,
+       u32 channel)
+{
+#if defined(CONFIG_SOC_EXYNOS5422)
+       exynos5422_fimc_is_companion_mclk_off(pdev, scenario, channel);
+#elif defined(CONFIG_SOC_EXYNOS5430) || defined(CONFIG_SOC_EXYNOS5433)
+       exynos5430_fimc_is_companion_mclk_off(pdev, scenario, channel);
+#endif
+       return 0;
+}
diff --git a/drivers/media/platform/exynos/fimc-is/setup-fimc-is-sensor.c b/drivers/media/platform/exynos/fimc-is/setup-fimc-is-sensor.c
new file mode 100644 (file)
index 0000000..d425a1f
--- /dev/null
@@ -0,0 +1,672 @@
+/* linux/arch/arm/mach-exynos/setup-fimc-sensor.c
+ *
+ * Copyright (c) 2011 Samsung Electronics Co., Ltd.
+ *             http://www.samsung.com/
+ *
+ * FIMC-IS gpio and clock configuration
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#include <linux/kernel.h>
+#include <linux/types.h>
+#include <linux/gpio.h>
+#include <linux/clk.h>
+#include <linux/err.h>
+#include <linux/platform_device.h>
+#include <linux/io.h>
+#include <linux/regulator/consumer.h>
+#include <linux/delay.h>
+#include <linux/clk-provider.h>
+#include <linux/clkdev.h>
+#include <mach/regs-gpio.h>
+#include <mach/map.h>
+#include <mach/regs-clock.h>
+#include <plat/gpio-cfg.h>
+#include <plat/map-s5p.h>
+#include <plat/cpu.h>
+#ifdef CONFIG_OF
+#include <linux/of_gpio.h>
+#endif
+#if defined(CONFIG_SOC_EXYNOS5422)
+#include <mach/regs-clock-exynos5422.h>
+#elif defined(CONFIG_SOC_EXYNOS5430)
+#include <mach/regs-clock-exynos5430.h>
+#elif defined(CONFIG_SOC_EXYNOS5433)
+#include <mach/regs-clock-exynos5433.h>
+#endif
+
+#include "exynos-fimc-is.h"
+#include "exynos-fimc-is-sensor.h"
+
+static int exynos_fimc_is_sensor_pin_control(struct platform_device *pdev,
+       struct pinctrl *pinctrl, struct exynos_sensor_pin *pin_ctrls, int channel)
+{
+       int ret = 0;
+       char ch_name[30];
+
+       int pin = pin_ctrls->pin;
+       int delay = pin_ctrls->delay;
+       char* name = pin_ctrls->name;
+       enum pin_act act = pin_ctrls->act;
+       int voltage = pin_ctrls->voltage;
+       struct pinctrl_state *s;
+
+       snprintf(ch_name, sizeof(ch_name), "%s%d", name, channel);
+       pr_info("%s(pin(%d), act(%d), ch(%s), delay(%d), voltage(%d))\n", __func__, pin, act, ch_name, delay, voltage);
+
+       switch (act) {
+       case PIN_PULL_NONE:
+               break;
+       case PIN_OUTPUT_HIGH:
+               if (gpio_is_valid(pin)) {
+                       gpio_request_one(pin, GPIOF_OUT_INIT_HIGH, "CAM_GPIO_OUTPUT_HIGH");
+                       usleep_range(delay, delay);
+                       gpio_free(pin);
+               }
+               break;
+       case PIN_OUTPUT_LOW:
+               if (gpio_is_valid(pin)) {
+                       gpio_request_one(pin, GPIOF_OUT_INIT_LOW, "CAM_GPIO_OUTPUT_LOW");
+                       usleep_range(delay, delay);
+                       gpio_free(pin);
+               }
+               break;
+       case PIN_INPUT:
+               if (gpio_is_valid(pin)) {
+                       gpio_request_one(pin, GPIOF_IN, "CAM_GPIO_INPUT");
+                       gpio_free(pin);
+               }
+               break;
+       case PIN_RESET:
+               if (gpio_is_valid(pin)) {
+                       gpio_request_one(pin, GPIOF_OUT_INIT_HIGH, "CAM_GPIO_RESET");
+                       usleep_range(1000, 1000);
+                       __gpio_set_value(pin, 0);
+                       usleep_range(1000, 1000);
+                       __gpio_set_value(pin, 1);
+                       usleep_range(1000, 1000);
+                       gpio_free(pin);
+               }
+               break;
+       case PIN_FUNCTION:
+               s = (struct pinctrl_state *)pin_ctrls->pin;
+               ret = pinctrl_select_state(pinctrl, s);
+               if (ret < 0) {
+                       pr_err("%s: cam %s, state %p pinctrl_select_statee is failed\n", __func__, ch_name, s);
+                       return ret;
+               }
+
+               usleep_range(1000, 1000);
+               break;
+       case PIN_REGULATOR_ON:
+               {
+                       struct regulator *regulator = NULL;
+
+                       regulator = regulator_get(&pdev->dev, name);
+                       if (IS_ERR_OR_NULL(regulator)) {
+                               pr_err("%s : regulator_get(%s) fail\n", __func__, name);
+                               return PTR_ERR(regulator);
+                       }
+
+                       if(voltage > 0) {
+                               pr_info("%s : regulator_set_voltage(%d)\n",__func__, voltage);
+                               ret = regulator_set_voltage(regulator, voltage, voltage);
+                               if(ret) {
+                                       pr_err("%s : regulator_set_voltage(%d) fail\n", __func__, ret);
+                               }
+                       }
+
+                       if (regulator_is_enabled(regulator)) {
+                               pr_warning("%s regulator is already enabled\n", name);
+                               regulator_put(regulator);
+                               return 0;
+                       }
+
+                       ret = regulator_enable(regulator);
+                       if (ret) {
+                               pr_err("%s : regulator_enable(%s) fail\n", __func__, name);
+                               regulator_put(regulator);
+                               return ret;
+                       }
+                       usleep_range(delay, delay);
+                       regulator_put(regulator);
+               }
+               break;
+       case PIN_REGULATOR_OFF:
+               {
+                       struct regulator *regulator = NULL;
+
+                       regulator = regulator_get(&pdev->dev, name);
+                       if (IS_ERR_OR_NULL(regulator)) {
+                               pr_err("%s : regulator_get(%s) fail\n", __func__, name);
+                               return PTR_ERR(regulator);
+                       }
+
+                       if (!regulator_is_enabled(regulator)) {
+                               pr_warning("%s regulator is already disabled\n", name);
+                               regulator_put(regulator);
+                               return 0;
+                       }
+
+                       ret = regulator_disable(regulator);
+                       if (ret) {
+                               pr_err("%s : regulator_disable(%s) fail\n", __func__, name);
+                               regulator_put(regulator);
+                               return ret;
+                       }
+                       usleep_range(delay, delay);
+                       regulator_put(regulator);
+               }
+               break;
+       default:
+               pr_err("unknown act for pin\n");
+               break;
+       }
+
+       return ret;
+}
+
+int exynos_fimc_is_sensor_pins_cfg(struct platform_device *pdev,
+       u32 scenario,
+       u32 enable)
+{
+       int ret = 0;
+       u32 i = 0;
+       struct exynos_sensor_pin (*pin_ctrls)[2][GPIO_CTRL_MAX];
+       struct exynos_platform_fimc_is_sensor *pdata;
+
+       BUG_ON(!pdev);
+       BUG_ON(!pdev->dev.platform_data);
+       BUG_ON(enable > 1);
+       BUG_ON(scenario > SENSOR_SCENARIO_MAX);
+
+       pdata = pdev->dev.platform_data;
+       pin_ctrls = pdata->pin_ctrls;
+
+       for (i = 0; i < GPIO_CTRL_MAX; ++i) {
+               if (pin_ctrls[scenario][enable][i].act == PIN_END) {
+                       pr_info("gpio cfg is end(%d)\n", i);
+                       break;
+               }
+
+               ret = exynos_fimc_is_sensor_pin_control(pdev,
+                       pdata->pinctrl,
+                       &pin_ctrls[scenario][enable][i],
+                       pdata->csi_ch);
+               if (ret) {
+                       pr_err("exynos5_fimc_is_sensor_gpio(%lu, %s, %d, %d) is fail(%d)",
+                               pin_ctrls[scenario][enable][i].pin,
+                               pin_ctrls[scenario][enable][i].name,
+                               pin_ctrls[scenario][enable][i].act,
+                               pdata->csi_ch,
+                               ret);
+                       goto p_err;
+               }
+       }
+
+p_err:
+       return ret;
+
+}
+
+#if defined(CONFIG_SOC_EXYNOS5422)
+int exynos5422_fimc_is_sensor_iclk_cfg(struct platform_device *pdev,
+       u32 scenario,
+       u32 channel)
+{
+       int ret = 0;
+
+       pr_info("clk_cfg:(ch%d),scenario(%d)\n", channel, scenario);
+
+       switch (channel) {
+       case 0:
+               /* MIPI-CSIS0 */
+               fimc_is_set_parent_dt(pdev, "mout_gscl_wrap_a", "mout_mpll_ctrl");
+               fimc_is_set_rate_dt(pdev, "dout_gscl_wrap_a", (532 * 1000000));
+               fimc_is_get_rate_dt(pdev, "dout_gscl_wrap_a");
+               break;
+       case 1:
+               /* FL1_550_CAM */
+               fimc_is_set_parent_dt(pdev, "mout_aclk_fl1_550_cam", "mout_mpll_ctrl");
+               fimc_is_set_rate_dt(pdev, "dout_aclk_fl1_550_cam", (76 * 1000000));
+               fimc_is_set_parent_dt(pdev, "mout_aclk_fl1_550_cam_sw", "dout_aclk_fl1_550_cam");
+               fimc_is_set_parent_dt(pdev, "mout_aclk_fl1_550_cam_user", "mout_aclk_fl1_550_cam_sw");
+               fimc_is_set_rate_dt(pdev, "dout2_cam_blk_550", (38 * 1000000));
+
+               /* MIPI-CSIS1 */
+               fimc_is_set_parent_dt(pdev, "mout_gscl_wrap_b", "mout_mpll_ctrl");
+               fimc_is_set_rate_dt(pdev, "dout_gscl_wrap_b", (76 * 1000000));
+               fimc_is_get_rate_dt(pdev, "dout_gscl_wrap_b");
+               break;
+       default:
+               pr_err("channel is invalid(%d)\n", channel);
+               break;
+       }
+
+       return ret;
+}
+
+int exynos5422_fimc_is_sensor_iclk_on(struct platform_device *pdev,
+       u32 scenario,
+       u32 channel)
+{
+       return 0;
+}
+
+int exynos5422_fimc_is_sensor_iclk_off(struct platform_device *pdev,
+       u32 scenario,
+       u32 channel)
+{
+       return 0;
+}
+
+int exynos5422_fimc_is_sensor_mclk_on(struct platform_device *pdev,
+       u32 scenario,
+       u32 channel)
+{
+       u32 frequency;
+       char div_name[30];
+       char sclk_name[30];
+
+       pr_info("%s:ch(%d)\n", __func__, channel);
+
+       snprintf(div_name, sizeof(div_name), "dout_isp_sensor%d", channel);
+       snprintf(sclk_name, sizeof(sclk_name), "sclk_isp_sensor%d", channel);
+
+       fimc_is_set_parent_dt(pdev, "mout_isp_sensor", "fin_pll");
+       fimc_is_set_rate_dt(pdev, div_name, (24 * 1000000));
+       fimc_is_enable_dt(pdev, sclk_name);
+       frequency = fimc_is_get_rate_dt(pdev, div_name);
+
+       switch (channel) {
+       case SENSOR_CONTROL_I2C0:
+               fimc_is_enable_dt(pdev, "sclk_gscl_wrap_a");
+               fimc_is_enable_dt(pdev, "clk_camif_top_fimcl0");
+               fimc_is_enable_dt(pdev, "clk_camif_top_fimcl3");
+               fimc_is_enable_dt(pdev, "gscl_fimc_lite0");
+               fimc_is_enable_dt(pdev, "gscl_fimc_lite3");
+               fimc_is_enable_dt(pdev, "clk_gscl_wrap_a");
+               break;
+       case SENSOR_CONTROL_I2C1:
+       case SENSOR_CONTROL_I2C2:
+               fimc_is_enable_dt(pdev, "sclk_gscl_wrap_b");
+               fimc_is_enable_dt(pdev, "clk_camif_top_fimcl1");
+               fimc_is_enable_dt(pdev, "gscl_fimc_lite1");
+               fimc_is_enable_dt(pdev, "clk_gscl_wrap_b");
+               break;
+       default:
+               pr_err("channel is invalid(%d)\n", channel);
+               break;
+       }
+
+       fimc_is_enable_dt(pdev, "clk_camif_top_csis0");
+       fimc_is_enable_dt(pdev, "clk_xiu_si_gscl_cam");
+       fimc_is_enable_dt(pdev, "clk_noc_p_rstop_fimcl");
+
+       pr_info("%s(%d, mclk : %d)\n", __func__, channel, frequency);
+
+       return 0;
+}
+
+int exynos5422_fimc_is_sensor_mclk_off(struct platform_device *pdev,
+       u32 scenario,
+       u32 channel)
+{
+       char sclk_name[30];
+
+       pr_debug("%s\n", __func__);
+
+       snprintf(sclk_name, sizeof(sclk_name), "sclk_isp_sensor%d", channel);
+
+       fimc_is_disable_dt(pdev, sclk_name);
+
+       switch (channel) {
+       case SENSOR_CONTROL_I2C0:
+               fimc_is_disable_dt(pdev, "sclk_gscl_wrap_a");
+               fimc_is_disable_dt(pdev, "clk_camif_top_fimcl0");
+               fimc_is_disable_dt(pdev, "clk_camif_top_fimcl3");
+               fimc_is_disable_dt(pdev, "gscl_fimc_lite0");
+               fimc_is_disable_dt(pdev, "gscl_fimc_lite3");
+               fimc_is_disable_dt(pdev, "clk_gscl_wrap_a");
+               break;
+       case SENSOR_CONTROL_I2C2:
+               fimc_is_disable_dt(pdev, "sclk_gscl_wrap_b");
+               fimc_is_disable_dt(pdev, "clk_camif_top_fimcl1");
+               fimc_is_disable_dt(pdev, "gscl_fimc_lite1");
+               fimc_is_disable_dt(pdev, "clk_gscl_wrap_b");
+               break;
+       default:
+               pr_err("channel is invalid(%d)\n", channel);
+               break;
+       }
+
+       return 0;
+}
+#elif defined(CONFIG_SOC_EXYNOS5430) || defined(CONFIG_SOC_EXYNOS5433)
+int exynos5430_fimc_is_sensor_iclk_cfg(struct platform_device *pdev,
+       u32 scenario,
+       u32 channel)
+{
+       int ret = 0;
+
+       if (scenario != SENSOR_SCENARIO_VISION)
+               return ret;
+
+       pr_info("clk_cfg(ch%d)\n", channel);
+
+       switch (channel) {
+       case 0:
+               /* USER_MUX_SEL */
+               fimc_is_set_parent_dt(pdev, "mout_aclk_cam0_552_user", "oscclk");
+               fimc_is_set_parent_dt(pdev, "mout_aclk_cam0_400_user", "oscclk");
+               fimc_is_set_parent_dt(pdev, "mout_aclk_cam0_333_user", "oscclk");
+
+               /* MIPI-CSIS PHY */
+               fimc_is_set_parent_dt(pdev, "mout_phyclk_rxbyteclkhs0_s4", "oscclk");
+
+               /* MIPI-CSIS0 */
+               fimc_is_set_rate_dt(pdev, "dout_aclk_csis0", 1);
+
+               /* FIMC-LITE0 */
+               fimc_is_set_rate_dt(pdev, "dout_aclk_lite_a", 1);
+               fimc_is_set_rate_dt(pdev, "dout_pclk_lite_a", 1);
+
+               /* FIMC-LITE3 */
+               fimc_is_set_rate_dt(pdev, "dout_aclk_lite_d", 1);
+               fimc_is_set_rate_dt(pdev, "dout_pclk_lite_d", 1);
+
+               /* ASYNC, FLITE, 3AA, SMMU, QE ... */
+               fimc_is_set_rate_dt(pdev, "dout_aclk_cam0_400", 1);
+               fimc_is_set_rate_dt(pdev, "dout_aclk_cam0_200", 1);
+               fimc_is_set_rate_dt(pdev, "dout_pclk_cam0_50", 1);
+
+               /* USER_MUX_SEL */
+               fimc_is_set_parent_dt(pdev, "mout_aclk_cam0_552_user", "aclk_cam0_552");
+               fimc_is_set_parent_dt(pdev, "mout_aclk_cam0_400_user", "aclk_cam0_400");
+               fimc_is_set_parent_dt(pdev, "mout_aclk_cam0_333_user", "aclk_cam0_333");
+
+               /* MIPI-CSIS PHY */
+               fimc_is_set_parent_dt(pdev, "mout_phyclk_rxbyteclkhs0_s4", "phyclk_rxbyteclkhs0_s4");
+
+               /* MIPI-CSIS0 */
+               fimc_is_set_parent_dt(pdev, "mout_aclk_csis0_a", "mout_aclk_cam0_552_user");
+               fimc_is_set_parent_dt(pdev, "mout_aclk_csis0_b", "mout_aclk_csis0_a");
+               fimc_is_set_rate_dt(pdev, "dout_aclk_csis0", 552 * 1000000);
+
+               /* FIMC-LITE0 */
+               fimc_is_set_parent_dt(pdev, "mout_aclk_lite_a_a", "mout_aclk_cam0_552_user");
+               fimc_is_set_parent_dt(pdev, "mout_aclk_lite_a_b", "mout_aclk_lite_a_a");
+               fimc_is_set_rate_dt(pdev, "dout_aclk_lite_a", 552 * 1000000);
+               fimc_is_set_rate_dt(pdev, "dout_pclk_lite_a", 276 * 1000000);
+
+               /* FIMC-LITE3 */
+               fimc_is_set_parent_dt(pdev, "mout_aclk_lite_d_a", "mout_aclk_cam0_552_user");
+               fimc_is_set_parent_dt(pdev, "mout_aclk_lite_d_b", "mout_aclk_lite_d_a");
+               fimc_is_set_rate_dt(pdev, "dout_aclk_lite_d", 552 * 1000000);
+               fimc_is_set_rate_dt(pdev, "dout_pclk_lite_d", 276 * 1000000);
+
+               /* ASYNC, FLITE, 3AA, SMMU, QE ... */
+               fimc_is_set_parent_dt(pdev, "mout_aclk_cam0_400", "mout_aclk_cam0_400_user");
+               fimc_is_set_rate_dt(pdev, "dout_aclk_cam0_400", 400 * 1000000);
+               fimc_is_set_rate_dt(pdev, "dout_aclk_cam0_200", 200 * 1000000);
+               fimc_is_set_rate_dt(pdev, "dout_pclk_cam0_50", 50 * 1000000);
+
+               /* FIMC-LITE2 PIXELASYNC */
+               fimc_is_set_rate_dt(pdev, "dout_sclk_pixelasync_lite_c_init", 1);
+               fimc_is_set_rate_dt(pdev, "dout_pclk_pixelasync_lite_c", 1);
+               fimc_is_set_rate_dt(pdev, "dout_sclk_pixelasync_lite_c", 1);
+
+               /* FIMC-LITE2 PIXELASYNC */
+               fimc_is_set_parent_dt(pdev, "mout_sclk_pixelasync_lite_c_init_a", "mout_aclk_cam0_552_user");
+               fimc_is_set_parent_dt(pdev, "mout_sclk_pixelasync_lite_c_init_b", "mout_sclk_pixelasync_lite_c_init_a");
+               fimc_is_set_rate_dt(pdev, "dout_sclk_pixelasync_lite_c_init", 552 * 1000000);
+               fimc_is_set_rate_dt(pdev, "dout_pclk_pixelasync_lite_c", 276 * 1000000);
+
+               fimc_is_set_parent_dt(pdev, "mout_sclk_pixelasync_lite_c_a", "mout_aclk_cam0_552_user");
+               fimc_is_set_parent_dt(pdev, "mout_sclk_pixelasync_lite_c_b", "mout_aclk_cam0_333_user");
+               fimc_is_set_rate_dt(pdev, "dout_sclk_pixelasync_lite_c", 333 * 1000000);
+
+               break;
+       case 1:
+               /* USER_MUX_SEL */
+               fimc_is_set_parent_dt(pdev, "mout_aclk_cam0_552_user", "oscclk");
+               fimc_is_set_parent_dt(pdev, "mout_aclk_cam0_400_user", "oscclk");
+               fimc_is_set_parent_dt(pdev, "mout_aclk_cam0_333_user", "oscclk");
+
+               /* MIPI-CSIS PHY */
+               fimc_is_set_parent_dt(pdev, "mout_phyclk_rxbyteclkhs0_s2a", "oscclk");
+
+               /* MIPI-CSIS1 */
+               fimc_is_set_rate_dt(pdev, "dout_aclk_csis1", 1);
+
+               /* FIMC-LITE1 */
+               fimc_is_set_rate_dt(pdev, "dout_aclk_lite_b", 1);
+               fimc_is_set_rate_dt(pdev, "dout_pclk_lite_b", 1);
+
+               /* USER_MUX_SEL */
+               fimc_is_set_parent_dt(pdev, "mout_aclk_cam0_552_user", "aclk_cam0_552");
+               fimc_is_set_parent_dt(pdev, "mout_aclk_cam0_400_user", "aclk_cam0_400");
+               fimc_is_set_parent_dt(pdev, "mout_aclk_cam0_333_user", "aclk_cam0_333");
+
+               /* MIPI-CSIS PHY */
+               fimc_is_set_parent_dt(pdev, "mout_phyclk_rxbyteclkhs0_s2a", "phyclk_rxbyteclkhs0_s2a");
+
+               /* MIPI-CSIS1 */
+               fimc_is_set_parent_dt(pdev, "mout_aclk_csis1_a", "mout_aclk_cam0_400_user");
+               fimc_is_set_parent_dt(pdev, "mout_aclk_csis1_b", "mout_aclk_csis1_a");
+               fimc_is_set_rate_dt(pdev, "dout_aclk_csis1", 552 * 1000000);
+
+               /* FIMC-LITE1 */
+               fimc_is_set_parent_dt(pdev, "mout_aclk_lite_b_a", "mout_aclk_cam0_400_user");
+               fimc_is_set_parent_dt(pdev, "mout_aclk_lite_b_b", "mout_aclk_lite_b_a");
+               fimc_is_set_rate_dt(pdev, "dout_aclk_lite_b", 552 * 1000000);
+               fimc_is_set_rate_dt(pdev, "dout_pclk_lite_b", 276 * 1000000);
+               break;
+       case 2:
+               /* USER_MUX_SEL */
+               fimc_is_set_parent_dt(pdev, "mout_aclk_cam1_552_user", "oscclk");
+               fimc_is_set_parent_dt(pdev, "mout_aclk_cam1_400_user", "oscclk");
+               fimc_is_set_parent_dt(pdev, "mout_aclk_cam1_333_user", "oscclk");
+
+               /* MIPI-CSIS PHY */
+               fimc_is_set_parent_dt(pdev, "mout_phyclk_rxbyteclkhs0_s2b", "oscclk");
+
+               /*  MIPI-CSIS2 */
+               fimc_is_set_rate_dt(pdev, "dout_aclk_csis2_a", 1);
+
+               /* FIMC-LITE2 */
+               fimc_is_set_rate_dt(pdev, "dout_aclk_lite_c", 1);
+               fimc_is_set_rate_dt(pdev, "dout_pclk_lite_c", 1);
+
+               /* USER_MUX_SEL */
+               fimc_is_set_parent_dt(pdev, "mout_aclk_cam1_552_user", "aclk_cam1_552");
+               fimc_is_set_parent_dt(pdev, "mout_aclk_cam1_400_user", "aclk_cam1_400");
+               fimc_is_set_parent_dt(pdev, "mout_aclk_cam1_333_user", "aclk_cam1_333");
+
+               /* MIPI-CSIS PHY */
+               fimc_is_set_parent_dt(pdev, "mout_phyclk_rxbyteclkhs0_s2b", "phyclk_rxbyteclkhs0_s2b");
+
+               /*  MIPI-CSIS2 */
+               fimc_is_set_parent_dt(pdev, "mout_aclk_csis2_a", "mout_aclk_cam1_400_user");
+               fimc_is_set_parent_dt(pdev, "mout_aclk_csis2_b", "mout_aclk_cam1_333_user");
+               fimc_is_set_rate_dt(pdev, "dout_aclk_csis2_a", 333 * 1000000);
+               break;
+       default:
+               pr_err("channel is invalid(%d)\n", channel);
+               break;
+       }
+
+       return ret;
+}
+
+int exynos5430_fimc_is_sensor_iclk_on(struct platform_device *pdev,
+       u32 scenario,
+       u32 channel)
+{
+       switch (channel) {
+       case 0:
+               fimc_is_enable_dt(pdev, "aclk_csis0");
+               fimc_is_enable_dt(pdev, "pclk_csis0");
+               fimc_is_enable_dt(pdev, "gate_lite_a");
+               fimc_is_enable_dt(pdev, "gate_lite_d");
+               break;
+       case 1:
+               fimc_is_enable_dt(pdev, "aclk_csis1");
+               fimc_is_enable_dt(pdev, "pclk_csis1");
+               fimc_is_enable_dt(pdev, "gate_lite_b");
+               break;
+       case 2:
+               fimc_is_enable_dt(pdev, "gate_csis2");
+               fimc_is_enable_dt(pdev, "gate_lite_c");
+               break;
+       default:
+               pr_err("channel is invalid(%d)\n", channel);
+               break;
+       }
+
+       return 0;
+}
+
+int exynos5430_fimc_is_sensor_iclk_off(struct platform_device *pdev,
+       u32 scenario,
+       u32 channel)
+{
+       switch (channel) {
+       case 0:
+               fimc_is_disable_dt(pdev, "aclk_csis0");
+               fimc_is_disable_dt(pdev, "pclk_csis0");
+               fimc_is_disable_dt(pdev, "gate_lite_a");
+               fimc_is_disable_dt(pdev, "gate_lite_d");
+               break;
+       case 1:
+               fimc_is_disable_dt(pdev, "aclk_csis1");
+               fimc_is_disable_dt(pdev, "pclk_csis1");
+               fimc_is_disable_dt(pdev, "gate_lite_b");
+               break;
+       case 2:
+               fimc_is_disable_dt(pdev, "gate_csis2");
+               fimc_is_disable_dt(pdev, "gate_lite_c");
+               break;
+       default:
+               pr_err("channel is invalid(%d)\n", channel);
+               break;
+       }
+
+       return 0;
+}
+
+int exynos5430_fimc_is_sensor_mclk_on(struct platform_device *pdev,
+       u32 scenario,
+       u32 channel)
+{
+       u32 frequency;
+       char mux_name[30];
+       char div_a_name[30];
+       char div_b_name[30];
+       char sclk_name[30];
+
+       pr_debug("%s\n", __func__);
+
+       snprintf(mux_name, sizeof(mux_name), "mout_sclk_isp_sensor%d", channel);
+       snprintf(div_a_name, sizeof(div_a_name), "dout_sclk_isp_sensor%d_a", channel);
+       snprintf(div_b_name, sizeof(div_b_name), "dout_sclk_isp_sensor%d_b", channel);
+       snprintf(sclk_name, sizeof(sclk_name), "sclk_isp_sensor%d", channel);
+
+       fimc_is_set_parent_dt(pdev, mux_name, "oscclk");
+       fimc_is_set_rate_dt(pdev, div_a_name, 24 * 1000000);
+       fimc_is_set_rate_dt(pdev, div_b_name, 24 * 1000000);
+       frequency = fimc_is_get_rate_dt(pdev, sclk_name);
+
+       pr_info("%s(%d, mclk : %d)\n", __func__, channel, frequency);
+
+       return 0;
+}
+
+int exynos5430_fimc_is_sensor_mclk_off(struct platform_device *pdev,
+       u32 scenario,
+       u32 channel)
+{
+       char mux_name[30];
+       char div_a_name[30];
+       char div_b_name[30];
+       char sclk_name[30];
+
+       pr_debug("%s\n", __func__);
+
+       snprintf(mux_name, sizeof(mux_name), "mout_sclk_isp_sensor%d", channel);
+       snprintf(div_a_name, sizeof(div_a_name), "dout_sclk_isp_sensor%d_a", channel);
+       snprintf(div_b_name, sizeof(div_b_name), "dout_sclk_isp_sensor%d_b", channel);
+       snprintf(sclk_name, sizeof(sclk_name), "sclk_isp_sensor%d", channel);
+
+       fimc_is_set_parent_dt(pdev, mux_name, "oscclk");
+       fimc_is_set_rate_dt(pdev, div_a_name, 24 * 1000000);
+       fimc_is_set_rate_dt(pdev, div_b_name, 24 * 1000000);
+       fimc_is_get_rate_dt(pdev, sclk_name);
+
+       return 0;
+}
+#endif
+
+/* Wrapper functions */
+int exynos_fimc_is_sensor_iclk_cfg(struct platform_device *pdev,
+       u32 scenario,
+       u32 channel)
+{
+#if defined(CONFIG_SOC_EXYNOS5422)
+       exynos5422_fimc_is_sensor_iclk_cfg(pdev, scenario, channel);
+#elif defined(CONFIG_SOC_EXYNOS5430) || defined(CONFIG_SOC_EXYNOS5433)
+       exynos5430_fimc_is_sensor_iclk_cfg(pdev, scenario, channel);
+#endif
+       return 0;
+}
+
+int exynos_fimc_is_sensor_iclk_on(struct platform_device *pdev,
+       u32 scenario,
+       u32 channel)
+{
+#if defined(CONFIG_SOC_EXYNOS5422)
+       exynos5422_fimc_is_sensor_iclk_on(pdev, scenario, channel);
+#elif defined(CONFIG_SOC_EXYNOS5430) || defined(CONFIG_SOC_EXYNOS5433)
+       exynos5430_fimc_is_sensor_iclk_on(pdev, scenario, channel);
+#endif
+       return 0;
+}
+
+int exynos_fimc_is_sensor_iclk_off(struct platform_device *pdev,
+       u32 scenario,
+       u32 channel)
+{
+#if defined(CONFIG_SOC_EXYNOS5422)
+       exynos5422_fimc_is_sensor_iclk_off(pdev, scenario, channel);
+#elif defined(CONFIG_SOC_EXYNOS5430) || defined(CONFIG_SOC_EXYNOS5433)
+       exynos5430_fimc_is_sensor_iclk_off(pdev, scenario, channel);
+#endif
+       return 0;
+}
+
+int exynos_fimc_is_sensor_mclk_on(struct platform_device *pdev,
+       u32 scenario,
+       u32 channel)
+{
+#if defined(CONFIG_SOC_EXYNOS5422)
+       exynos5422_fimc_is_sensor_mclk_on(pdev, scenario, channel);
+#elif defined(CONFIG_SOC_EXYNOS5430) || defined(CONFIG_SOC_EXYNOS5433)
+       exynos5430_fimc_is_sensor_mclk_on(pdev, scenario, channel);
+#endif
+       return 0;
+}
+
+int exynos_fimc_is_sensor_mclk_off(struct platform_device *pdev,
+       u32 scenario,
+       u32 channel)
+{
+#if defined(CONFIG_SOC_EXYNOS5422)
+       exynos5422_fimc_is_sensor_mclk_off(pdev, scenario, channel);
+#elif defined(CONFIG_SOC_EXYNOS5430) || defined(CONFIG_SOC_EXYNOS5433)
+       exynos5430_fimc_is_sensor_mclk_off(pdev, scenario, channel);
+#endif
+       return 0;
+}
diff --git a/drivers/media/platform/exynos/fimc-is/setup-fimc-is.c b/drivers/media/platform/exynos/fimc-is/setup-fimc-is.c
new file mode 100644 (file)
index 0000000..fdc8861
--- /dev/null
@@ -0,0 +1,1233 @@
+/* linux/arch/arm/mach-exynos/setup-fimc-is.c
+ *
+ * Copyright (c) 2011 Samsung Electronics Co., Ltd.
+ *             http://www.samsung.com/
+ *
+ * FIMC-IS gpio and clock configuration
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+*/
+
+#include <linux/kernel.h>
+#include <linux/types.h>
+#include <linux/gpio.h>
+#include <linux/clk.h>
+#include <linux/err.h>
+#include <linux/platform_device.h>
+#include <linux/io.h>
+#include <linux/regulator/consumer.h>
+#include <linux/delay.h>
+#include <linux/clk-provider.h>
+#include <linux/clkdev.h>
+#include <mach/regs-gpio.h>
+#include <mach/map.h>
+#include <mach/regs-clock.h>
+#include <plat/gpio-cfg.h>
+#include <plat/map-s5p.h>
+#include <plat/cpu.h>
+#include "exynos-fimc-is.h"
+#ifdef CONFIG_OF
+#include <linux/of_gpio.h>
+#endif
+#if defined(CONFIG_SOC_EXYNOS5422)
+#include <mach/regs-clock-exynos5422.h>
+#elif defined(CONFIG_SOC_EXYNOS5430)
+#include <mach/regs-clock-exynos5430.h>
+#elif defined(CONFIG_SOC_EXYNOS5433)
+#include <mach/regs-clock-exynos5433.h>
+#endif
+
+struct platform_device; /* don't need the contents */
+
+/*------------------------------------------------------*/
+/*             Common control                                                                  */
+/*------------------------------------------------------*/
+int exynos_fimc_is_print_cfg(struct platform_device *pdev, u32 channel)
+{
+       pr_debug("%s\n", __func__);
+
+       return 0;
+}
+
+/* utility function to set parent with DT */
+int fimc_is_set_parent_dt(struct platform_device *pdev,
+       const char *child, const char *parent)
+{
+       struct clk *p;
+       struct clk *c;
+
+       p = clk_get(&pdev->dev, parent);
+       if (IS_ERR(p)) {
+               pr_err("%s: could not lookup clock : %s\n", __func__, parent);
+               return -EINVAL;
+       }
+
+       c = clk_get(&pdev->dev, child);
+       if (IS_ERR(c)) {
+               pr_err("%s: could not lookup clock : %s\n", __func__, child);
+               return -EINVAL;
+       }
+
+       return clk_set_parent(c, p);
+}
+
+/* utility function to get parent with DT */
+struct clk *fimc_is_get_parent_dt(struct platform_device *pdev,
+       const char *child)
+{
+       struct clk *c;
+
+       c = clk_get(&pdev->dev, child);
+       if (IS_ERR(c)) {
+               pr_err("%s: could not lookup clock : %s\n", __func__, child);
+               return NULL;
+       }
+
+       return clk_get_parent(c);
+}
+
+/* utility function to set rate with DT */
+int fimc_is_set_rate_dt(struct platform_device *pdev,
+       const char *conid, unsigned int rate)
+{
+       struct clk *target;
+
+       target = clk_get(&pdev->dev, conid);
+       if (IS_ERR(target)) {
+               pr_err("%s: could not lookup clock : %s\n", __func__, conid);
+               return -EINVAL;
+       }
+
+       return clk_set_rate(target, rate);
+}
+
+/* utility function to get rate with DT */
+unsigned int  fimc_is_get_rate_dt(struct platform_device *pdev,
+       const char *conid)
+{
+       struct clk *target;
+       unsigned int rate_target;
+
+       target = clk_get(&pdev->dev, conid);
+       if (IS_ERR(target)) {
+               pr_err("%s: could not lookup clock : %s\n", __func__, conid);
+               return -EINVAL;
+       }
+
+       rate_target = clk_get_rate(target);
+       pr_info("%s : %d\n", conid, rate_target);
+
+       return rate_target;
+}
+
+/* utility function to eable with DT */
+unsigned int  fimc_is_enable_dt(struct platform_device *pdev,
+               const char *conid)
+{
+       struct clk *target;
+
+       target = clk_get(&pdev->dev, conid);
+       if (IS_ERR(target)) {
+               pr_err("%s: could not lookup clock : %s\n", __func__, conid);
+               return -EINVAL;
+       }
+
+       clk_prepare(target);
+
+       return clk_enable(target);
+}
+
+/* utility function to disable with DT */
+void  fimc_is_disable_dt(struct platform_device *pdev,
+               const char *conid)
+{
+       struct clk *target;
+
+       target = clk_get(&pdev->dev, conid);
+       if (IS_ERR(target)) {
+               pr_err("%s: could not lookup clock : %s\n", __func__, conid);
+       }
+
+       clk_disable(target);
+       clk_unprepare(target);
+}
+
+#if defined(CONFIG_SOC_EXYNOS5422)
+int exynos5422_fimc_is_clk_gate(u32 clk_gate_id, bool is_on)
+{
+       int cfg = 0;
+       u32 value = 0;
+
+       if (clk_gate_id == 0)
+               return 0;
+
+       /* CAM block */
+       /* 3AA 0*/
+       if (clk_gate_id & (1 << FIMC_IS_GATE_3AA0_IP)) {
+               value |= ((1 << 31) | (1 << 27));
+               cfg = readl(EXYNOS5_CLK_GATE_IP_CAM);
+               if (is_on)
+                       writel(cfg | value, EXYNOS5_CLK_GATE_IP_CAM);
+               else
+                       writel(cfg & ~(value), EXYNOS5_CLK_GATE_IP_CAM);
+               pr_debug("%s :1 [%s] gate(%d) (0x%x) * (0x%x)\n", __func__,
+                               is_on ? "ON" : "OFF",
+                               clk_gate_id,
+                               cfg,
+                               value);
+       }
+
+       /* 3AA 1*/
+       value = 0;
+       if (clk_gate_id & (1 << FIMC_IS_GATE_3AA1_IP)) {
+               value |= ((1 << 9) | (1 << 4));
+               cfg = readl(EXYNOS5_CLK_GATE_IP_GSCL0);
+               if (is_on)
+                       writel(cfg | value, EXYNOS5_CLK_GATE_IP_GSCL0);
+               else
+                       writel(cfg & ~(value), EXYNOS5_CLK_GATE_IP_GSCL0);
+               pr_debug("%s :1 [%s] gate(%d) (0x%x) * (0x%x)\n", __func__,
+                               is_on ? "ON" : "OFF",
+                               clk_gate_id,
+                               cfg,
+                               value);
+       }
+
+       /* ISP block */
+       value = 0;
+       if (clk_gate_id & (1 << FIMC_IS_GATE_ISP_IP))
+               value |= (1 << 0);
+       if (clk_gate_id & (1 << FIMC_IS_GATE_DRC_IP))
+               value |= (1 << 1);
+       if (clk_gate_id & (1 << FIMC_IS_GATE_FD_IP))
+               value |= (1 << 2);
+       if (clk_gate_id & (1 << FIMC_IS_GATE_SCC_IP))
+               value |= (1 << 3);
+       if (clk_gate_id & (1 << FIMC_IS_GATE_SCP_IP))
+               value |= (1 << 4);
+       if (value > 0) {
+               cfg = readl(EXYNOS5_CLK_GATE_IP_ISP0);
+               if (is_on)
+                       writel(cfg | value, EXYNOS5_CLK_GATE_IP_ISP0);
+               else
+                       writel(cfg & ~(value), EXYNOS5_CLK_GATE_IP_ISP0);
+               pr_debug("%s :1 [%s] gate(%d) (0x%x) * (0x%x)\n", __func__,
+                               is_on ? "ON" : "OFF",
+                               clk_gate_id,
+                               cfg,
+                               value);
+       }
+
+       value = 0;
+       if (clk_gate_id & (1 << FIMC_IS_GATE_3DNR_IP))
+               value |= (1 << 2);
+       if (value > 0) {
+               cfg = readl(EXYNOS5_CLK_GATE_IP_ISP1);
+               if (is_on)
+                       writel(cfg | value, EXYNOS5_CLK_GATE_IP_ISP1);
+               else
+                       writel(cfg & ~(value), EXYNOS5_CLK_GATE_IP_ISP1);
+               pr_debug("%s :1 [%s] gate(%d) (0x%x) * (0x%x)\n", __func__,
+                               is_on ? "ON" : "OFF",
+                               clk_gate_id,
+                               cfg,
+                               value);
+       }
+
+/*
+       pr_info("%s : [%s] gate(%d) (0x%x)\n", __func__,
+                       is_on ? "ON" : "OFF",
+                       clk_gate_id,
+                       cfg);
+*/
+       return 0;
+}
+
+int exynos5422_cfg_clk_div_max(struct platform_device *pdev)
+{
+       pr_info("%s\n", __func__);
+       /* CMU TOP */
+       /* 333_432_ISP0 */
+       fimc_is_set_rate_dt(pdev, "dout_aclk_333_432_isp0", 1);
+       /* 333_432_ISP */
+       fimc_is_set_rate_dt(pdev, "dout_aclk_333_432_isp", 1);
+       /* 400_ISP */
+       fimc_is_set_rate_dt(pdev, "dout_aclk_400_isp", 1);
+       /* 266_ISP */
+       fimc_is_set_rate_dt(pdev, "dout_aclk_266_isp", 1);
+
+       /* 333_432_GSCL */
+       fimc_is_set_rate_dt(pdev, "dout_aclk_333_432_gscl", 1);
+       /* 432_CAM */
+       fimc_is_set_rate_dt(pdev, "dout_aclk_432_cam", 1);
+       /* FL1_550_CAM */
+       fimc_is_set_rate_dt(pdev, "dout_aclk_fl1_550_cam", 1);
+       /* 550_CAM */
+       fimc_is_set_rate_dt(pdev, "dout_aclk_550_cam", 1);
+
+       return 0;
+}
+
+int exynos5422_cfg_clk_sclk(struct platform_device *pdev)
+{
+       pr_info("%s\n", __func__);
+#ifndef CONFIG_COMPANION_USE
+       /* SCLK_SPI0_ISP */
+       fimc_is_set_parent_dt(pdev, "mout_spi0_isp", "mout_spll_ctrl");
+       fimc_is_set_rate_dt(pdev, "dout_spi0_isp", 200 * 1000000);
+       fimc_is_set_rate_dt(pdev, "dout_spi0_isp_pre", 100 * 1000000);
+       /* SCLK_SPI1_ISP */
+       fimc_is_set_parent_dt(pdev, "mout_spi1_isp", "mout_spll_ctrl");
+       fimc_is_set_rate_dt(pdev, "dout_spi1_isp", 200 * 1000000);
+       fimc_is_set_rate_dt(pdev, "dout_spi1_isp_pre", 100 * 1000000);
+#endif
+       /* SCLK_UART_ISP */
+       fimc_is_set_parent_dt(pdev, "mout_uart_isp", "fin_pll");
+       fimc_is_set_rate_dt(pdev, "dout_uart_isp", (24* 1000000));
+       /* SCLK_PWM_ISP */
+       fimc_is_set_parent_dt(pdev, "mout_pwm_isp", "fin_pll");
+       fimc_is_set_rate_dt(pdev, "dout_pwm_isp", (2 * 1000000));
+
+       return 0;
+}
+
+int exynos5422_cfg_clk_cam(struct platform_device *pdev)
+{
+       pr_info("%s\n", __func__);
+       /* CMU TOP */
+       /* 333_432_GSCL */
+       fimc_is_set_parent_dt(pdev, "mout_aclk_333_432_gscl", "mout_ipll_ctrl");
+       fimc_is_set_rate_dt(pdev, "dout_aclk_333_432_gscl", (432 * 1000000));
+       fimc_is_set_parent_dt(pdev, "mout_aclk_333_432_gscl_sw", "dout_aclk_333_432_gscl");
+       fimc_is_set_parent_dt(pdev, "mout_aclk_333_432_gscl_user", "mout_aclk_333_432_gscl_sw");
+       /* 432_CAM */
+       fimc_is_set_parent_dt(pdev, "mout_aclk_432_cam", "mout_ipll_ctrl");
+       fimc_is_set_rate_dt(pdev, "dout_aclk_432_cam", (432 * 1000000));
+       fimc_is_set_parent_dt(pdev, "mout_aclk_432_cam_sw", "dout_aclk_432_cam");
+       fimc_is_set_parent_dt(pdev, "mout_aclk_432_cam_user", "mout_aclk_432_cam_sw");
+       /* 550_CAM */
+       fimc_is_set_parent_dt(pdev, "mout_aclk_550_cam", "mout_mpll_ctrl");
+       fimc_is_set_rate_dt(pdev, "dout_aclk_550_cam", (532 * 1000000));
+       fimc_is_set_parent_dt(pdev, "mout_aclk_550_cam_sw", "dout_aclk_550_cam");
+       fimc_is_set_parent_dt(pdev, "mout_aclk_550_cam_user", "mout_aclk_550_cam_sw");
+
+       /* CMU CAM */
+       /* CLKDIV2_GSCL_BLK_333 */
+       fimc_is_set_rate_dt(pdev, "dout2_gscl_blk_333", (217 * 1000000));
+       /* CLKDIV2_CAM_BLK_432 */
+       fimc_is_set_rate_dt(pdev, "dout2_cam_blk_432", (217 * 1000000));
+
+       return 0;
+}
+
+int exynos5422_cfg_clk_isp(struct platform_device *pdev)
+{
+
+       /* CMU TOP */
+       /* 333_432_ISP0 */
+       fimc_is_set_parent_dt(pdev, "mout_aclk_333_432_isp0", "mout_ipll_ctrl");
+       fimc_is_set_rate_dt(pdev, "dout_aclk_333_432_isp0", (432 * 1000000));
+       fimc_is_set_parent_dt(pdev, "mout_aclk_333_432_isp0_sw", "dout_aclk_333_432_isp0");
+       fimc_is_set_parent_dt(pdev, "mout_aclk_333_432_isp0_user", "mout_aclk_333_432_isp0_sw");
+       /* 333_432_ISP */
+       fimc_is_set_parent_dt(pdev, "mout_aclk_333_432_isp", "mout_ipll_ctrl");
+       fimc_is_set_rate_dt(pdev, "dout_aclk_333_432_isp", (432 * 1000000));
+       fimc_is_set_parent_dt(pdev, "mout_aclk_333_432_isp_sw", "dout_aclk_333_432_isp");
+       fimc_is_set_parent_dt(pdev, "mout_aclk_333_432_isp_user", "mout_aclk_333_432_isp_sw");
+       /* 400_ISP */
+       fimc_is_set_parent_dt(pdev, "mout_aclk_400_isp", "mout_mpll_ctrl");
+       fimc_is_set_rate_dt(pdev, "dout_aclk_400_isp", (532 * 1000000));
+       fimc_is_set_parent_dt(pdev, "mout_aclk_400_isp_sw", "dout_aclk_400_isp");
+       fimc_is_set_parent_dt(pdev, "mout_aclk_400_isp_user", "mout_aclk_400_isp_sw");
+       /* 266_ISP */
+       fimc_is_set_parent_dt(pdev, "mout_aclk_266_isp", "mout_ipll_ctrl");
+       fimc_is_set_rate_dt(pdev, "dout_aclk_266_isp", (432 * 1000000));
+       fimc_is_set_parent_dt(pdev, "mout_aclk_266_isp_sw", "dout_aclk_266_isp");
+       fimc_is_set_parent_dt(pdev, "mout_aclk_266_isp_user", "mout_aclk_266_isp_sw");
+
+       /* CMU ISP */
+       /* ACLK_MCUISP_DIV0 */
+       fimc_is_set_rate_dt(pdev, "dout_mcuispdiv0", (267 * 1000000));
+       /* ACLK_MCUISP_DIV1 */
+       fimc_is_set_rate_dt(pdev, "dout_mcuispdiv1", (134 * 1000000));
+       /* ACLK_DIV0 */
+       fimc_is_set_rate_dt(pdev, "dout_ispdiv0", (216 * 1000000));
+       /* ACLK_DIV1 */
+       fimc_is_set_rate_dt(pdev, "dout_ispdiv1", (108 * 1000000));
+       /* ACLK_DIV2 */
+       fimc_is_set_rate_dt(pdev, "dout_ispdiv2", (54 * 1000000));
+
+       return 0;
+}
+
+int exynos5422_fimc_is_print_clk(struct platform_device *pdev)
+{
+       pr_debug("%s\n", __func__);
+
+       fimc_is_get_rate_dt(pdev, "mout_aclk_550_cam_user");
+       fimc_is_get_rate_dt(pdev, "mout_aclk_fl1_550_cam_user");
+       fimc_is_get_rate_dt(pdev, "mout_aclk_432_cam_user");
+       fimc_is_get_rate_dt(pdev, "mout_aclk_333_432_gscl_user");
+       fimc_is_get_rate_dt(pdev, "mout_aclk_333_432_isp0_user");
+       fimc_is_get_rate_dt(pdev, "mout_aclk_333_432_isp_user");
+       fimc_is_get_rate_dt(pdev, "mout_aclk_400_isp_user");
+       fimc_is_get_rate_dt(pdev, "mout_aclk_266_isp_user");
+
+       fimc_is_get_rate_dt(pdev, "dout_mcuispdiv0");
+       fimc_is_get_rate_dt(pdev, "dout_mcuispdiv1");
+       fimc_is_get_rate_dt(pdev, "dout_ispdiv0");
+       fimc_is_get_rate_dt(pdev, "dout_ispdiv1");
+       fimc_is_get_rate_dt(pdev, "dout_ispdiv2");
+
+       fimc_is_get_rate_dt(pdev, "dout2_gscl_blk_333");
+       fimc_is_get_rate_dt(pdev, "dout2_cam_blk_432");
+       fimc_is_get_rate_dt(pdev, "dout2_cam_blk_550");
+
+       fimc_is_get_rate_dt(pdev, "dout_pwm_isp");
+       fimc_is_get_rate_dt(pdev, "dout_uart_isp");
+       fimc_is_get_rate_dt(pdev, "dout_spi0_isp_pre");
+       fimc_is_get_rate_dt(pdev, "dout_spi1_isp_pre");
+
+       /* CMU_TOP_DUMP */
+       pr_info("EXYNOS5_CLK_SRC_TOP0(0x%08X)\n", readl(EXYNOS5_CLK_SRC_TOP0));
+       pr_info("EXYNOS5_CLK_SRC_TOP1(0x%08X)\n", readl(EXYNOS5_CLK_SRC_TOP1));
+       pr_info("EXYNOS5_CLK_SRC_TOP3(0x%08X)\n", readl(EXYNOS5_CLK_SRC_TOP3));
+       pr_info("EXYNOS5_CLK_SRC_TOP4(0x%08X)\n", readl(EXYNOS5_CLK_SRC_TOP4));
+       pr_info("EXYNOS5_CLK_SRC_TOP8(0x%08X)\n", readl(EXYNOS5_CLK_SRC_TOP8));
+       pr_info("EXYNOS5_CLK_SRC_TOP9(0x%08X)\n", readl(EXYNOS5_CLK_SRC_TOP9));
+       pr_info("EXYNOS5_CLK_SRC_TOP11(0x%08X)\n", readl(EXYNOS5_CLK_SRC_TOP11));
+       pr_info("EXYNOS5_CLK_SRC_TOP13(0x%08X)\n", readl(EXYNOS5_CLK_SRC_TOP13));
+
+       pr_info("EXYNOS5_CLK_DIV_TOP0(0x%08X)\n", readl(EXYNOS5_CLK_DIV_TOP0));
+       pr_info("EXYNOS5_CLK_DIV_TOP1(0x%08X)\n", readl(EXYNOS5_CLK_DIV_TOP1));
+       pr_info("EXYNOS5_CLK_DIV_TOP8(0x%08X)\n", readl(EXYNOS5_CLK_DIV_TOP8));
+
+       return 0;
+}
+
+int exynos5422_fimc_is_cfg_clk(struct platform_device *pdev)
+{
+       pr_info("%s\n", __func__);
+
+       /* initialize Clocks */
+       exynos5422_cfg_clk_sclk(pdev);
+       exynos5422_cfg_clk_cam(pdev);
+       exynos5422_cfg_clk_isp(pdev);
+
+       return 0;
+}
+
+int exynos5422_fimc_is_clk_on(struct platform_device *pdev)
+{
+       pr_debug("%s\n", __func__);
+
+       fimc_is_enable_dt(pdev, "sclk_uart_isp");
+       fimc_is_enable_dt(pdev, "sclk_pwm_isp");
+       fimc_is_enable_dt(pdev, "sclk_spi0_isp");
+
+       fimc_is_enable_dt(pdev, "clk_3aa");
+       fimc_is_enable_dt(pdev, "clk_camif_top_3aa");
+       fimc_is_enable_dt(pdev, "clk_3aa_2");
+       fimc_is_enable_dt(pdev, "clk_camif_top_3aa0");
+
+       return 0;
+}
+
+int exynos5422_fimc_is_clk_off(struct platform_device *pdev)
+{
+       pr_debug("%s\n", __func__);
+
+       exynos5422_cfg_clk_div_max(pdev);
+       fimc_is_disable_dt(pdev, "sclk_uart_isp");
+       fimc_is_disable_dt(pdev, "sclk_pwm_isp");
+       fimc_is_disable_dt(pdev, "sclk_spi0_isp");
+
+       fimc_is_disable_dt(pdev, "clk_3aa");
+       fimc_is_disable_dt(pdev, "clk_camif_top_3aa");
+       fimc_is_disable_dt(pdev, "clk_3aa_2");
+       fimc_is_disable_dt(pdev, "clk_camif_top_3aa0");
+
+       return 0;
+}
+
+/* sequence is important, don't change order */
+int exynos5422_fimc_is_sensor_power_on(struct platform_device *pdev, int sensor_id)
+{
+       pr_debug("%s\n", __func__);
+
+       return 0;
+}
+
+/* sequence is important, don't change order */
+int exynos5422_fimc_is_sensor_power_off(struct platform_device *pdev, int sensor_id)
+{
+       pr_debug("%s\n", __func__);
+
+       return 0;
+}
+
+int exynos5422_fimc_is_print_pwr(struct platform_device *pdev)
+{
+       pr_debug("%s\n", __func__);
+
+       pr_info("ISP power state(0x%08x)\n", readl(EXYNOS5422_ISP_STATUS));
+       pr_info("CAM power state(0x%08x)\n", readl(EXYNOS5422_CAM_STATUS));
+       pr_info("CA5 power state(0x%08x)\n", readl(EXYNOS5422_ISP_ARM_STATUS));
+
+       return 0;
+}
+
+int exynos5422_fimc_is_set_user_clk_gate(u32 group_id,
+               bool is_on,
+               u32 user_scenario_id,
+               unsigned long msk_state,
+               struct exynos_fimc_is_clk_gate_info *gate_info) {
+       /* if you want to skip clock on/off, let this func return -1 */
+       int ret = -1;
+
+       switch (user_scenario_id) {
+       case CLK_GATE_FULL_BYPASS_SN:
+               if (is_on == true)
+                       gate_info->groups[group_id].mask_clk_on_mod &=
+                               ~((1 << FIMC_IS_GATE_DIS_IP) |
+                               (1 << FIMC_IS_GATE_3DNR_IP));
+               else
+                       gate_info->groups[group_id].mask_clk_off_self_mod |=
+                               ((1 << FIMC_IS_GATE_DIS_IP) |
+                               (1 << FIMC_IS_GATE_3DNR_IP));
+               ret = 0;
+               break;
+       case CLK_GATE_DIS_SN:
+               if (is_on == true)
+                       gate_info->groups[group_id].mask_clk_on_mod |=
+                               ((1 << FIMC_IS_GATE_DIS_IP) |
+                               (1 << FIMC_IS_GATE_3DNR_IP));
+               else
+                       gate_info->groups[group_id].mask_clk_off_self_mod |=
+                               ((1 << FIMC_IS_GATE_DIS_IP) |
+                               (1 << FIMC_IS_GATE_3DNR_IP));
+               ret = 0;
+               break;
+       default:
+               ret = 0;
+               break;
+       }
+
+       return ret;
+}
+#elif defined(CONFIG_SOC_EXYNOS5430) || defined(CONFIG_SOC_EXYNOS5433)
+int exynos5430_fimc_is_clk_gate(u32 clk_gate_id, bool is_on)
+{
+       int cfg = 0;
+       u32 value = 0;
+
+       if (clk_gate_id == 0)
+               return 0;
+
+       /* CAM00 */
+       if (clk_gate_id & (1 << FIMC_IS_GATE_3AA1_IP))
+               value |= (1 << 4);
+       if (clk_gate_id & (1 << FIMC_IS_GATE_3AA0_IP))
+               value |= (1 << 3);
+
+       if (value > 0) {
+               cfg = readl(EXYNOS5430_ENABLE_IP_CAM00);
+               if (is_on)
+                       writel(cfg | value, EXYNOS5430_ENABLE_IP_CAM00);
+               else
+                       writel(cfg & ~(value), EXYNOS5430_ENABLE_IP_CAM00);
+               pr_debug("%s :1 [%s] gate(%d) (0x%x) * (0x%x)\n", __func__,
+                               is_on ? "ON" : "OFF",
+                               clk_gate_id,
+                               cfg,
+                               value);
+       }
+
+
+       /* ISP 0 */
+       value = 0;
+       if (clk_gate_id & (1 << FIMC_IS_GATE_ISP_IP))
+               value |= (1 << 0);
+       if (clk_gate_id & (1 << FIMC_IS_GATE_DRC_IP))
+               value |= (1 << 1);
+       if (clk_gate_id & (1 << FIMC_IS_GATE_SCC_IP))
+               value |= (1 << 2);
+       if (clk_gate_id & (1 << FIMC_IS_GATE_DIS_IP))
+               value |= (1 << 3);
+       if (clk_gate_id & (1 << FIMC_IS_GATE_3DNR_IP))
+               value |= (1 << 4);
+       if (clk_gate_id & (1 << FIMC_IS_GATE_SCP_IP))
+               value |= (1 << 5);
+
+       if (value > 0) {
+               cfg = readl(EXYNOS5430_ENABLE_IP_ISP0);
+               if (is_on)
+                       writel(cfg | value, EXYNOS5430_ENABLE_IP_ISP0);
+               else
+                       writel(cfg & ~(value), EXYNOS5430_ENABLE_IP_ISP0);
+               pr_debug("%s :2 [%s] gate(%d) (0x%x) * (0x%x)\n", __func__,
+                               is_on ? "ON" : "OFF",
+                               clk_gate_id,
+                               cfg,
+                               value);
+       }
+
+       /* CAM 10 */
+       value = 0;
+       if (clk_gate_id & (1 << FIMC_IS_GATE_FD_IP))
+               value |= (1 << 3);
+
+       if (value > 0) {
+               cfg = readl(EXYNOS5430_ENABLE_IP_CAM10);
+               if (is_on)
+                       writel(cfg | value, EXYNOS5430_ENABLE_IP_CAM10);
+               else
+                       writel(cfg & ~(value), EXYNOS5430_ENABLE_IP_CAM10);
+               pr_debug("%s :3 [%s] gate(%d) (0x%x) * (0x%x)\n", __func__,
+                               is_on ? "ON" : "OFF",
+                               clk_gate_id,
+                               cfg,
+                               value);
+       }
+/*
+       pr_info("%s : [%s] gate(%d) (0x%x)\n", __func__,
+                       is_on ? "ON" : "OFF",
+                       clk_gate_id,
+                       cfg);
+*/
+       return 0;
+}
+
+static int exynos5430_cfg_clk_isp_pll_on(struct platform_device *pdev)
+{
+       pr_info("%s\n", __func__);
+
+       fimc_is_enable_dt(pdev, "fout_isp_pll");
+       fimc_is_set_parent_dt(pdev, "mout_isp_pll", "fout_isp_pll");
+
+       return 0;
+}
+
+static int exynos5430_cfg_clk_isp_pll_off(struct platform_device *pdev)
+{
+       pr_info("%s\n", __func__);
+
+       fimc_is_set_parent_dt(pdev, "mout_isp_pll", "fin_pll");
+       fimc_is_disable_dt(pdev, "fout_isp_pll");
+
+       return 0;
+}
+
+int exynos5430_cfg_clk_div_max(struct platform_device *pdev)
+{
+       /* SCLK */
+#ifndef CONFIG_COMPANION_USE
+       /* SCLK_SPI0 */
+       fimc_is_set_parent_dt(pdev, "mout_sclk_isp_spi0", "oscclk");
+       fimc_is_set_rate_dt(pdev, "dout_sclk_isp_spi0_a", 1);
+       fimc_is_set_parent_dt(pdev, "mout_sclk_isp_spi0_user", "oscclk");
+
+       /* SCLK_SPI1 */
+       fimc_is_set_parent_dt(pdev, "mout_sclk_isp_spi1", "oscclk");
+       fimc_is_set_rate_dt(pdev, "dout_sclk_isp_spi1_a", 1);
+       fimc_is_set_parent_dt(pdev, "mout_sclk_isp_spi1_user", "oscclk");
+#endif
+
+       /* SCLK_UART */
+       fimc_is_set_parent_dt(pdev, "mout_sclk_isp_uart", "oscclk");
+       fimc_is_set_rate_dt(pdev, "dout_sclk_isp_uart", 1);
+       fimc_is_set_parent_dt(pdev, "mout_sclk_isp_uart_user", "oscclk");
+
+       /* CAM1 */
+       /* C-A5 */
+       fimc_is_set_rate_dt(pdev, "dout_atclk_cam1", 1);
+       fimc_is_set_rate_dt(pdev, "dout_pclk_dbg_cam1", 1);
+
+       return 0;
+}
+
+int exynos5430_cfg_clk_sclk(struct platform_device *pdev)
+{
+#ifndef CONFIG_COMPANION_USE
+       /* SCLK_SPI0 */
+       fimc_is_set_parent_dt(pdev, "mout_sclk_isp_spi0", "mout_bus_pll_user");
+       fimc_is_set_rate_dt(pdev, "dout_sclk_isp_spi0_a", 275 * 1000000);
+       fimc_is_set_rate_dt(pdev, "dout_sclk_isp_spi0_b", 46 * 1000000);
+       fimc_is_set_parent_dt(pdev, "mout_sclk_isp_spi0_user", "sclk_isp_spi0_top");
+
+#endif
+       /* SCLK_SPI1 */
+       fimc_is_set_parent_dt(pdev, "mout_sclk_isp_spi1", "mout_bus_pll_user");
+       fimc_is_set_rate_dt(pdev, "dout_sclk_isp_spi1_a", 275 * 1000000);
+       fimc_is_set_rate_dt(pdev, "dout_sclk_isp_spi1_b", 46 * 1000000);
+       fimc_is_set_parent_dt(pdev, "mout_sclk_isp_spi1_user", "sclk_isp_spi1_top");
+
+       return 0;
+}
+
+int exynos5430_cfg_clk_cam0(struct platform_device *pdev)
+{
+       /* USER_MUX_SEL */
+       fimc_is_set_parent_dt(pdev, "mout_aclk_cam0_552_user", "aclk_cam0_552");
+       fimc_is_set_parent_dt(pdev, "mout_aclk_cam0_400_user", "aclk_cam0_400");
+       fimc_is_set_parent_dt(pdev, "mout_aclk_cam0_333_user", "aclk_cam0_333");
+       fimc_is_set_parent_dt(pdev, "mout_phyclk_rxbyteclkhs0_s4", "phyclk_rxbyteclkhs0_s4");
+       fimc_is_set_parent_dt(pdev, "mout_phyclk_rxbyteclkhs0_s2a", "phyclk_rxbyteclkhs0_s2a");
+       fimc_is_set_parent_dt(pdev, "mout_phyclk_rxbyteclkhs0_s2b", "phyclk_rxbyteclkhs0_s2b");
+
+       /* LITE A */
+       fimc_is_set_parent_dt(pdev, "mout_aclk_lite_a_a", "mout_aclk_cam0_552_user");
+       fimc_is_set_parent_dt(pdev, "mout_aclk_lite_a_b", "mout_aclk_lite_a_a");
+       fimc_is_set_rate_dt(pdev, "dout_aclk_lite_a", 552 * 1000000);
+       fimc_is_set_rate_dt(pdev, "dout_pclk_lite_a", 276 * 1000000);
+
+       /* LITE B */
+       fimc_is_set_parent_dt(pdev, "mout_aclk_lite_b_a", "mout_aclk_cam0_552_user");
+       fimc_is_set_parent_dt(pdev, "mout_aclk_lite_b_b", "mout_aclk_lite_b_a");
+       fimc_is_set_rate_dt(pdev, "dout_aclk_lite_b", 552 * 1000000);
+       fimc_is_set_rate_dt(pdev, "dout_pclk_lite_b", 276 * 1000000);
+
+       /* LITE D */
+       fimc_is_set_parent_dt(pdev, "mout_aclk_lite_d_a", "mout_aclk_cam0_552_user");
+       fimc_is_set_parent_dt(pdev, "mout_aclk_lite_d_b", "mout_aclk_lite_d_a");
+       fimc_is_set_rate_dt(pdev, "dout_aclk_lite_d", 552 * 1000000);
+       fimc_is_set_rate_dt(pdev, "dout_pclk_lite_d", 276 * 1000000);
+
+       /* LITE C PIXELASYNC */
+       fimc_is_set_parent_dt(pdev, "mout_sclk_pixelasync_lite_c_init_a", "mout_aclk_cam0_552_user");
+       fimc_is_set_parent_dt(pdev, "mout_sclk_pixelasync_lite_c_init_b", "mout_sclk_pixelasync_lite_c_init_a");
+       fimc_is_set_rate_dt(pdev, "dout_sclk_pixelasync_lite_c_init", 552 * 1000000);
+       fimc_is_set_rate_dt(pdev, "dout_pclk_pixelasync_lite_c", 276 * 1000000);
+
+       fimc_is_set_parent_dt(pdev, "mout_sclk_pixelasync_lite_c_a", "mout_aclk_cam0_552_user");
+       fimc_is_set_parent_dt(pdev, "mout_sclk_pixelasync_lite_c_b", "mout_aclk_cam0_333_user");
+       fimc_is_set_rate_dt(pdev, "dout_sclk_pixelasync_lite_c", 333 * 1000000);
+
+       /* 3AA 0 */
+       fimc_is_set_parent_dt(pdev, "mout_aclk_3aa0_a", "mout_aclk_cam0_552_user");
+       fimc_is_set_parent_dt(pdev, "mout_aclk_3aa0_b", "mout_aclk_3aa0_a");
+       fimc_is_set_rate_dt(pdev, "dout_aclk_3aa0", 552 * 1000000);
+       fimc_is_set_rate_dt(pdev, "dout_pclk_3aa0", 276 * 1000000);
+
+       /* 3AA 0 */
+       fimc_is_set_parent_dt(pdev, "mout_aclk_3aa1_a", "mout_aclk_cam0_552_user");
+       fimc_is_set_parent_dt(pdev, "mout_aclk_3aa1_b", "mout_aclk_3aa1_a");
+       fimc_is_set_rate_dt(pdev, "dout_aclk_3aa1", 552 * 1000000);
+       fimc_is_set_rate_dt(pdev, "dout_pclk_3aa1", 276 * 1000000);
+
+       /* CSI 0 */
+       fimc_is_set_parent_dt(pdev, "mout_aclk_csis0_a", "mout_aclk_cam0_552_user");
+       fimc_is_set_parent_dt(pdev, "mout_aclk_csis0_b", "mout_aclk_csis0_a");
+       fimc_is_set_rate_dt(pdev, "dout_aclk_csis0", 552 * 1000000);
+
+       /* CSI 1 */
+       fimc_is_set_parent_dt(pdev, "mout_aclk_csis1_a", "mout_aclk_cam0_552_user");
+       fimc_is_set_parent_dt(pdev, "mout_aclk_csis1_b", "mout_aclk_csis1_a");
+       fimc_is_set_rate_dt(pdev, "dout_aclk_csis1", 552 * 1000000);
+
+       /* CAM0 400 */
+       fimc_is_set_parent_dt(pdev, "mout_aclk_cam0_400", "mout_aclk_cam0_400_user");
+       fimc_is_set_rate_dt(pdev, "dout_aclk_cam0_400", 413 * 1000000);
+       fimc_is_set_rate_dt(pdev, "dout_aclk_cam0_200", 207 * 1000000);
+       fimc_is_set_rate_dt(pdev, "dout_pclk_cam0_50", 52 * 1000000);
+
+       return 0;
+}
+
+int exynos5430_cfg_clk_cam1(struct platform_device *pdev)
+{
+       /* USER_MUX_SEL */
+       fimc_is_set_parent_dt(pdev, "mout_aclk_cam1_552_user", "aclk_cam1_552");
+       fimc_is_set_parent_dt(pdev, "mout_aclk_cam1_400_user", "aclk_cam1_400");
+       fimc_is_set_parent_dt(pdev, "mout_aclk_cam1_333_user", "aclk_cam1_333");
+
+       /* C-A5 */
+       fimc_is_set_rate_dt(pdev, "dout_atclk_cam1", 276 * 1000000);
+       fimc_is_set_rate_dt(pdev, "dout_pclk_dbg_cam1", 138 * 1000000);
+
+       /* LITE A */
+       fimc_is_set_parent_dt(pdev, "mout_aclk_lite_c_a", "mout_aclk_cam1_400_user");
+       fimc_is_set_parent_dt(pdev, "mout_aclk_lite_c_b", "mout_aclk_cam1_333_user");
+       fimc_is_set_rate_dt(pdev, "dout_aclk_lite_c", 333 * 1000000);
+       fimc_is_set_rate_dt(pdev, "dout_pclk_lite_c", 166 * 1000000);
+
+       /* FD */
+       fimc_is_set_parent_dt(pdev, "mout_aclk_fd_a", "mout_aclk_cam1_400_user");
+       fimc_is_set_parent_dt(pdev, "mout_aclk_fd_b", "mout_aclk_fd_a");
+       fimc_is_set_rate_dt(pdev, "dout_aclk_fd", 413 * 1000000);
+       fimc_is_set_rate_dt(pdev, "dout_pclk_fd", 207 * 1000000);
+
+       /* CSI 2 */
+       fimc_is_set_parent_dt(pdev, "mout_aclk_csis2_a", "mout_aclk_cam1_400_user");
+       fimc_is_set_parent_dt(pdev, "mout_aclk_csis2_b", "mout_aclk_cam1_333_user");
+       fimc_is_set_rate_dt(pdev, "dout_aclk_csis2_a", 333 * 1000000);
+
+       /* MPWM */
+       fimc_is_set_rate_dt(pdev, "dout_pclk_cam1_166", 167 * 1000000);
+       fimc_is_set_rate_dt(pdev, "dout_pclk_cam1_83", 84 * 1000000);
+       fimc_is_set_rate_dt(pdev, "dout_sclk_isp_mpwm", 84 * 1000000);
+
+       /* CAM1 QE CLK GATE */
+       fimc_is_enable_dt(pdev, "gate_bts_fd");
+       fimc_is_disable_dt(pdev, "gate_bts_fd");
+
+       return 0;
+}
+
+int exynos5430_cfg_clk_cam1_spi(struct platform_device *pdev)
+{
+       /* USER_MUX_SEL */
+       fimc_is_set_parent_dt(pdev, "mout_aclk_cam1_333_user", "aclk_cam1_333");
+
+       /* SPI */
+       fimc_is_set_rate_dt(pdev, "dout_pclk_cam1_83", 84 * 1000000);
+
+       return 0;
+}
+
+int exynos5430_cfg_clk_isp(struct platform_device *pdev)
+{
+       /* CMU_ISP */
+       /* USER_MUX_SEL */
+       fimc_is_set_parent_dt(pdev, "mout_aclk_isp_400_user", "aclk_isp_400");
+       fimc_is_set_parent_dt(pdev, "mout_aclk_isp_dis_400_user", "aclk_isp_dis_400");
+       /* ISP */
+       fimc_is_set_rate_dt(pdev, "dout_aclk_isp_c_200", 207 * 1000000);
+       fimc_is_set_rate_dt(pdev, "dout_aclk_isp_d_200", 207 * 1000000);
+       fimc_is_set_rate_dt(pdev, "dout_pclk_isp", 83 * 1000000);
+       /* DIS */
+       fimc_is_set_rate_dt(pdev, "dout_pclk_isp_dis", 207 * 1000000);
+
+       /* ISP QE CLK GATE */
+       fimc_is_enable_dt(pdev, "gate_bts_3dnr");
+       fimc_is_enable_dt(pdev, "gate_bts_dis1");
+       fimc_is_enable_dt(pdev, "gate_bts_dis0");
+       fimc_is_enable_dt(pdev, "gate_bts_scalerc");
+       fimc_is_enable_dt(pdev, "gate_bts_drc");
+       fimc_is_disable_dt(pdev, "gate_bts_3dnr");
+       fimc_is_disable_dt(pdev, "gate_bts_dis1");
+       fimc_is_disable_dt(pdev, "gate_bts_dis0");
+       fimc_is_disable_dt(pdev, "gate_bts_scalerc");
+       fimc_is_disable_dt(pdev, "gate_bts_drc");
+
+       return 0;
+}
+
+int exynos5430_fimc_is_cfg_clk(struct platform_device *pdev)
+{
+       pr_debug("%s\n", __func__);
+
+       exynos5430_cfg_clk_isp_pll_on(pdev);
+       exynos5430_cfg_clk_div_max(pdev);
+
+       /* initialize Clocks */
+       exynos5430_cfg_clk_sclk(pdev);
+       exynos5430_cfg_clk_cam0(pdev);
+       exynos5430_cfg_clk_cam1(pdev);
+       exynos5430_cfg_clk_isp(pdev);
+
+       return 0;
+}
+
+static int exynos_fimc_is_sensor_iclk_init(struct platform_device *pdev)
+{
+       fimc_is_enable_dt(pdev, "aclk_csis0");
+       fimc_is_enable_dt(pdev, "pclk_csis0");
+       fimc_is_enable_dt(pdev, "aclk_csis1");
+       fimc_is_enable_dt(pdev, "pclk_csis1");
+       fimc_is_enable_dt(pdev, "gate_csis2");
+       fimc_is_enable_dt(pdev, "gate_lite_a");
+       fimc_is_enable_dt(pdev, "gate_lite_b");
+       fimc_is_enable_dt(pdev, "gate_lite_d");
+       fimc_is_enable_dt(pdev, "gate_lite_c");
+       fimc_is_enable_dt(pdev, "gate_lite_freecnt");
+
+       return 0;
+}
+
+static int exynos_fimc_is_sensor_iclk_deinit(struct platform_device *pdev)
+{
+       fimc_is_disable_dt(pdev, "aclk_csis0");
+       fimc_is_disable_dt(pdev, "pclk_csis0");
+       fimc_is_disable_dt(pdev, "aclk_csis1");
+       fimc_is_disable_dt(pdev, "pclk_csis1");
+       fimc_is_disable_dt(pdev, "gate_csis2");
+       fimc_is_disable_dt(pdev, "gate_lite_a");
+       fimc_is_disable_dt(pdev, "gate_lite_b");
+       fimc_is_disable_dt(pdev, "gate_lite_d");
+       fimc_is_disable_dt(pdev, "gate_lite_c");
+       fimc_is_disable_dt(pdev, "gate_lite_freecnt");
+
+       return 0;
+}
+
+int exynos5430_fimc_is_clk_on(struct platform_device *pdev)
+{
+       pr_debug("%s\n", __func__);
+
+       exynos_fimc_is_sensor_iclk_init(pdev);
+       exynos_fimc_is_sensor_iclk_deinit(pdev);
+
+       return 0;
+}
+
+int exynos5430_fimc_is_clk_off(struct platform_device *pdev)
+{
+       pr_debug("%s\n", __func__);
+
+       exynos5430_cfg_clk_div_max(pdev);
+       exynos5430_cfg_clk_isp_pll_off(pdev);
+
+       return 0;
+}
+
+int exynos5430_fimc_is_print_clk(struct platform_device *pdev)
+{
+       pr_debug("%s\n", __func__);
+
+       /* SCLK */
+       /* SCLK_SPI0 */
+       fimc_is_get_rate_dt(pdev, "sclk_isp_spi0_top");
+       fimc_is_get_rate_dt(pdev, "sclk_isp_spi0");
+       /* SCLK_SPI1 */
+       fimc_is_get_rate_dt(pdev, "sclk_isp_spi1_top");
+       fimc_is_get_rate_dt(pdev, "sclk_isp_spi1");
+       /* SCLK_UART */
+       fimc_is_get_rate_dt(pdev, "sclk_isp_uart_top");
+       fimc_is_get_rate_dt(pdev, "sclk_isp_uart");
+
+       /* CAM0 */
+       /* CMU_TOP */
+       fimc_is_get_rate_dt(pdev, "aclk_cam0_552");
+       fimc_is_get_rate_dt(pdev, "aclk_cam0_400");
+       fimc_is_get_rate_dt(pdev, "aclk_cam0_333");
+       /* LITE A */
+       fimc_is_get_rate_dt(pdev, "dout_aclk_lite_a");
+       fimc_is_get_rate_dt(pdev, "dout_pclk_lite_a");
+       /* LITE B */
+       fimc_is_get_rate_dt(pdev, "dout_aclk_lite_b");
+       fimc_is_get_rate_dt(pdev, "dout_pclk_lite_b");
+       /* LITE D */
+       fimc_is_get_rate_dt(pdev, "dout_aclk_lite_d");
+       fimc_is_get_rate_dt(pdev, "dout_pclk_lite_d");
+       /* LITE C PIXELASYNC */
+       fimc_is_get_rate_dt(pdev, "dout_sclk_pixelasync_lite_c_init");
+       fimc_is_get_rate_dt(pdev, "dout_pclk_pixelasync_lite_c");
+       fimc_is_get_rate_dt(pdev, "dout_sclk_pixelasync_lite_c");
+       /* 3AA 0 */
+       fimc_is_get_rate_dt(pdev, "dout_aclk_3aa0");
+       fimc_is_get_rate_dt(pdev, "dout_pclk_3aa0");
+       /* 3AA 0 */
+       fimc_is_get_rate_dt(pdev, "dout_aclk_3aa1");
+       fimc_is_get_rate_dt(pdev, "dout_pclk_3aa1");
+       /* CSI 0 */
+       fimc_is_get_rate_dt(pdev, "dout_aclk_csis0");
+       /* CSI 1 */
+       fimc_is_get_rate_dt(pdev, "dout_aclk_csis1");
+       /* CAM0 400 */
+       fimc_is_get_rate_dt(pdev, "dout_aclk_cam0_400");
+       fimc_is_get_rate_dt(pdev, "dout_aclk_cam0_200");
+       fimc_is_get_rate_dt(pdev, "dout_pclk_cam0_50");
+
+       /* CAM1 */
+       /* CMU_TOP */
+       fimc_is_get_rate_dt(pdev, "aclk_cam1_552");
+       fimc_is_get_rate_dt(pdev, "aclk_cam1_400");
+       fimc_is_get_rate_dt(pdev, "aclk_cam1_333");
+       /* C-A5 */
+       fimc_is_get_rate_dt(pdev, "dout_atclk_cam1");
+       fimc_is_get_rate_dt(pdev, "dout_pclk_dbg_cam1");
+       /* LITE A */
+       fimc_is_get_rate_dt(pdev, "dout_aclk_lite_c");
+       fimc_is_get_rate_dt(pdev, "dout_pclk_lite_c");
+       /* FD */
+       fimc_is_get_rate_dt(pdev, "dout_aclk_fd");
+       fimc_is_get_rate_dt(pdev, "dout_pclk_fd");
+       /* CSI 2 */
+       fimc_is_get_rate_dt(pdev, "dout_aclk_csis2_a");
+       /* MPWM */
+       fimc_is_get_rate_dt(pdev, "dout_pclk_cam1_166");
+       fimc_is_get_rate_dt(pdev, "dout_pclk_cam1_83");
+       fimc_is_get_rate_dt(pdev, "dout_sclk_isp_mpwm");
+
+       /* ISP */
+       /* CMU_TOP */
+       fimc_is_get_rate_dt(pdev, "aclk_isp_400");
+       fimc_is_get_rate_dt(pdev, "aclk_isp_dis_400");
+       /* ISP */
+       fimc_is_get_rate_dt(pdev, "dout_aclk_isp_c_200");
+       fimc_is_get_rate_dt(pdev, "dout_aclk_isp_d_200");
+       fimc_is_get_rate_dt(pdev, "dout_pclk_isp");
+       /* DIS */
+       fimc_is_get_rate_dt(pdev, "dout_pclk_isp_dis");
+
+       /* CMU_TOP_DUMP */
+       pr_info("EXYNOS5430_SRC_SEL_TOP1(0x%08X)\n", readl(EXYNOS5430_SRC_SEL_TOP1));
+       pr_info("EXYNOS5430_SRC_SEL_TOP2(0x%08X)\n", readl(EXYNOS5430_SRC_SEL_TOP2));
+       pr_info("EXYNOS5430_SRC_SEL_TOP_CAM1(0x%08X)\n", readl(EXYNOS5430_SRC_SEL_TOP_CAM1));
+       pr_info("EXYNOS5430_SRC_ENABLE_TOP0(0x%08X)\n", readl(EXYNOS5430_SRC_ENABLE_TOP0));
+       pr_info("EXYNOS5430_SRC_ENABLE_TOP1(0x%08X)\n", readl(EXYNOS5430_SRC_ENABLE_TOP1));
+       pr_info("EXYNOS5430_SRC_ENABLE_TOP2(0x%08X)\n", readl(EXYNOS5430_SRC_ENABLE_TOP2));
+       pr_info("EXYNOS5430_SRC_ENABLE_TOP3(0x%08X)\n", readl(EXYNOS5430_SRC_ENABLE_TOP3));
+       pr_info("EXYNOS5430_SRC_ENABLE_TOP_CAM1(0x%08X)\n", readl(EXYNOS5430_SRC_ENABLE_TOP_CAM1));
+       pr_info("EXYNOS5430_DIV_TOP0(0x%08X)\n", readl(EXYNOS5430_DIV_TOP0));
+       pr_info("EXYNOS5430_DIV_TOP_CAM10(0x%08X)\n", readl(EXYNOS5430_DIV_TOP_CAM10));
+       pr_info("EXYNOS5430_DIV_TOP_CAM11(0x%08X)\n", readl(EXYNOS5430_DIV_TOP_CAM11));
+       pr_info("EXYNOS5430_ENABLE_SCLK_TOP_CAM1(0x%08X)\n", readl(EXYNOS5430_ENABLE_SCLK_TOP_CAM1));
+       pr_info("EXYNOS5430_ENABLE_IP_TOP(0x%08X)\n", readl(EXYNOS5430_ENABLE_IP_TOP));
+       /* CMU_CAM0_DUMP */
+       pr_info("EXYNOS5430_SRC_SEL_CAM00(0x%08X)\n", readl(EXYNOS5430_SRC_SEL_CAM00));
+       pr_info("EXYNOS5430_SRC_SEL_CAM01(0x%08X)\n", readl(EXYNOS5430_SRC_SEL_CAM01));
+       pr_info("EXYNOS5430_SRC_SEL_CAM02(0x%08X)\n", readl(EXYNOS5430_SRC_SEL_CAM02));
+       pr_info("EXYNOS5430_SRC_SEL_CAM03(0x%08X)\n", readl(EXYNOS5430_SRC_SEL_CAM03));
+       pr_info("EXYNOS5430_SRC_SEL_CAM04(0x%08X)\n", readl(EXYNOS5430_SRC_SEL_CAM04));
+       pr_info("EXYNOS5430_SRC_ENABLE_CAM00(0x%08X)\n", readl(EXYNOS5430_SRC_ENABLE_CAM00));
+       pr_info("EXYNOS5430_SRC_ENABLE_CAM01(0x%08X)\n", readl(EXYNOS5430_SRC_ENABLE_CAM01));
+       pr_info("EXYNOS5430_SRC_ENABLE_CAM02(0x%08X)\n", readl(EXYNOS5430_SRC_ENABLE_CAM02));
+       pr_info("EXYNOS5430_SRC_ENABLE_CAM03(0x%08X)\n", readl(EXYNOS5430_SRC_ENABLE_CAM03));
+       pr_info("EXYNOS5430_SRC_ENABLE_CAM04(0x%08X)\n", readl(EXYNOS5430_SRC_ENABLE_CAM04));
+       pr_info("EXYNOS5430_SRC_STAT_CAM00(0x%08X)\n", readl(EXYNOS5430_SRC_STAT_CAM00));
+       pr_info("EXYNOS5430_SRC_STAT_CAM01(0x%08X)\n", readl(EXYNOS5430_SRC_STAT_CAM01));
+       pr_info("EXYNOS5430_SRC_STAT_CAM02(0x%08X)\n", readl(EXYNOS5430_SRC_STAT_CAM02));
+       pr_info("EXYNOS5430_SRC_STAT_CAM03(0x%08X)\n", readl(EXYNOS5430_SRC_STAT_CAM03));
+       pr_info("EXYNOS5430_SRC_STAT_CAM04(0x%08X)\n", readl(EXYNOS5430_SRC_STAT_CAM04));
+       pr_info("EXYNOS5430_SRC_IGNORE_CAM01(0x%08X)\n", readl(EXYNOS5430_SRC_IGNORE_CAM01));
+       pr_info("EXYNOS5430_DIV_CAM00(0x%08X)\n", readl(EXYNOS5430_DIV_CAM00));
+       pr_info("EXYNOS5430_DIV_CAM01(0x%08X)\n", readl(EXYNOS5430_DIV_CAM01));
+       pr_info("EXYNOS5430_DIV_CAM02(0x%08X)\n", readl(EXYNOS5430_DIV_CAM02));
+       pr_info("EXYNOS5430_DIV_CAM03(0x%08X)\n", readl(EXYNOS5430_DIV_CAM03));
+       pr_info("EXYNOS5430_DIV_STAT_CAM00(0x%08X)\n", readl(EXYNOS5430_DIV_STAT_CAM00));
+       pr_info("EXYNOS5430_DIV_STAT_CAM01(0x%08X)\n", readl(EXYNOS5430_DIV_STAT_CAM01));
+       pr_info("EXYNOS5430_DIV_STAT_CAM02(0x%08X)\n", readl(EXYNOS5430_DIV_STAT_CAM02));
+       pr_info("EXYNOS5430_DIV_STAT_CAM03(0x%08X)\n", readl(EXYNOS5430_DIV_STAT_CAM03));
+       pr_info("EXYNOS5430_ENABLE_IP_CAM00(0x%08X)\n", readl(EXYNOS5430_ENABLE_IP_CAM00));
+       pr_info("EXYNOS5430_ENABLE_IP_CAM01(0x%08X)\n", readl(EXYNOS5430_ENABLE_IP_CAM01));
+       pr_info("EXYNOS5430_ENABLE_IP_CAM02(0x%08X)\n", readl(EXYNOS5430_ENABLE_IP_CAM02));
+       pr_info("EXYNOS5430_ENABLE_IP_CAM03(0x%08X)\n", readl(EXYNOS5430_ENABLE_IP_CAM03));
+       /* CMU_CAM1_DUMP */
+       pr_info("EXYNOS5430_SRC_SEL_CAM10(0x%08X)\n", readl(EXYNOS5430_SRC_SEL_CAM10));
+       pr_info("EXYNOS5430_SRC_SEL_CAM11(0x%08X)\n", readl(EXYNOS5430_SRC_SEL_CAM11));
+       pr_info("EXYNOS5430_SRC_SEL_CAM12(0x%08X)\n", readl(EXYNOS5430_SRC_SEL_CAM12));
+       pr_info("EXYNOS5430_SRC_ENABLE_CAM10(0x%08X)\n", readl(EXYNOS5430_SRC_ENABLE_CAM10));
+       pr_info("EXYNOS5430_SRC_ENABLE_CAM11(0x%08X)\n", readl(EXYNOS5430_SRC_ENABLE_CAM11));
+       pr_info("EXYNOS5430_SRC_ENABLE_CAM12(0x%08X)\n", readl(EXYNOS5430_SRC_ENABLE_CAM12));
+       pr_info("EXYNOS5430_SRC_STAT_CAM10(0x%08X)\n", readl(EXYNOS5430_SRC_STAT_CAM10));
+       pr_info("EXYNOS5430_SRC_STAT_CAM11(0x%08X)\n", readl(EXYNOS5430_SRC_STAT_CAM11));
+       pr_info("EXYNOS5430_SRC_STAT_CAM12(0x%08X)\n", readl(EXYNOS5430_SRC_STAT_CAM12));
+       pr_info("EXYNOS5430_SRC_IGNORE_CAM11(0x%08X)\n", readl(EXYNOS5430_SRC_IGNORE_CAM11));
+       pr_info("EXYNOS5430_DIV_CAM10(0x%08X)\n", readl(EXYNOS5430_DIV_CAM10));
+       pr_info("EXYNOS5430_DIV_CAM11(0x%08X)\n", readl(EXYNOS5430_DIV_CAM11));
+       pr_info("EXYNOS5430_DIV_STAT_CAM10(0x%08X)\n", readl(EXYNOS5430_DIV_STAT_CAM10));
+       pr_info("EXYNOS5430_DIV_STAT_CAM11(0x%08X)\n", readl(EXYNOS5430_DIV_STAT_CAM11));
+       pr_info("EXYNOS5430_ENABLE_SCLK_CAM1(0x%08X)\n", readl(EXYNOS5430_ENABLE_SCLK_CAM1));
+       pr_info("EXYNOS5430_ENABLE_IP_CAM10(0x%08X)\n", readl(EXYNOS5430_ENABLE_IP_CAM10));
+       pr_info("EXYNOS5430_ENABLE_IP_CAM11(0x%08X)\n", readl(EXYNOS5430_ENABLE_IP_CAM11));
+       pr_info("EXYNOS5430_ENABLE_IP_CAM12(0x%08X)\n", readl(EXYNOS5430_ENABLE_IP_CAM12));
+       /* CMU_ISP_DUMP */
+       pr_info("EXYNOS5430_SRC_SEL_ISP(0x%08X)\n", readl(EXYNOS5430_SRC_SEL_ISP));
+       pr_info("EXYNOS5430_SRC_ENABLE_ISP(0x%08X)\n", readl(EXYNOS5430_SRC_ENABLE_ISP));
+       pr_info("EXYNOS5430_SRC_STAT_ISP(0x%08X)\n", readl(EXYNOS5430_SRC_STAT_ISP));
+       pr_info("EXYNOS5430_DIV_ISP(0x%08X)\n", readl(EXYNOS5430_DIV_ISP));
+       pr_info("EXYNOS5430_DIV_STAT_ISP(0x%08X)\n", readl(EXYNOS5430_DIV_STAT_ISP));
+       pr_info("EXYNOS5430_ENABLE_ACLK_ISP0(0x%08X)\n", readl(EXYNOS5430_ENABLE_ACLK_ISP0));
+       pr_info("EXYNOS5430_ENABLE_ACLK_ISP1(0x%08X)\n", readl(EXYNOS5430_ENABLE_ACLK_ISP1));
+       pr_info("EXYNOS5430_ENABLE_ACLK_ISP2(0x%08X)\n", readl(EXYNOS5430_ENABLE_ACLK_ISP2));
+       pr_info("EXYNOS5430_ENABLE_PCLK_ISP(0x%08X)\n", readl(EXYNOS5430_ENABLE_PCLK_ISP));
+       pr_info("EXYNOS5430_ENABLE_SCLK_ISP(0x%08X)\n", readl(EXYNOS5430_ENABLE_SCLK_ISP));
+       pr_info("EXYNOS5430_ENABLE_IP_ISP0(0x%08X)\n", readl(EXYNOS5430_ENABLE_IP_ISP0));
+       pr_info("EXYNOS5430_ENABLE_IP_ISP1(0x%08X)\n", readl(EXYNOS5430_ENABLE_IP_ISP1));
+       pr_info("EXYNOS5430_ENABLE_IP_ISP2(0x%08X)\n", readl(EXYNOS5430_ENABLE_IP_ISP2));
+       pr_info("EXYNOS5430_ENABLE_IP_ISP3(0x%08X)\n", readl(EXYNOS5430_ENABLE_IP_ISP3));
+       /* CMU_ENABLE_DUMP */
+       pr_info("EXYNOS5430_ENABLE_SCLK_TOP_CAM1(0x%08X)\n", readl(EXYNOS5430_ENABLE_SCLK_TOP_CAM1));
+       pr_info("EXYNOS5430_ENABLE_IP_TOP(0x%08X)\n", readl(EXYNOS5430_ENABLE_IP_TOP));
+       pr_info("EXYNOS5430_ENABLE_IP_CAM00(0x%08X)\n", readl(EXYNOS5430_ENABLE_IP_CAM00));
+       pr_info("EXYNOS5430_ENABLE_IP_CAM01(0x%08X)\n", readl(EXYNOS5430_ENABLE_IP_CAM01));
+       pr_info("EXYNOS5430_ENABLE_IP_CAM02(0x%08X)\n", readl(EXYNOS5430_ENABLE_IP_CAM02));
+       pr_info("EXYNOS5430_ENABLE_IP_CAM03(0x%08X)\n", readl(EXYNOS5430_ENABLE_IP_CAM03));
+       pr_info("EXYNOS5430_ENABLE_IP_CAM10(0x%08X)\n", readl(EXYNOS5430_ENABLE_IP_CAM10));
+       pr_info("EXYNOS5430_ENABLE_IP_CAM11(0x%08X)\n", readl(EXYNOS5430_ENABLE_IP_CAM11));
+       pr_info("EXYNOS5430_ENABLE_IP_CAM12(0x%08X)\n", readl(EXYNOS5430_ENABLE_IP_CAM12));
+       pr_info("EXYNOS5430_ENABLE_IP_ISP0(0x%08X)\n", readl(EXYNOS5430_ENABLE_IP_ISP0));
+       pr_info("EXYNOS5430_ENABLE_IP_ISP1(0x%08X)\n", readl(EXYNOS5430_ENABLE_IP_ISP1));
+       pr_info("EXYNOS5430_ENABLE_IP_ISP2(0x%08X)\n", readl(EXYNOS5430_ENABLE_IP_ISP2));
+       pr_info("EXYNOS5430_ENABLE_IP_ISP3(0x%08X)\n", readl(EXYNOS5430_ENABLE_IP_ISP3));
+
+       return 0;
+}
+
+/* sequence is important, don't change order */
+int exynos5430_fimc_is_sensor_power_on(struct platform_device *pdev, int sensor_id)
+{
+       pr_debug("%s\n", __func__);
+
+       return 0;
+}
+
+/* sequence is important, don't change order */
+int exynos5430_fimc_is_sensor_power_off(struct platform_device *pdev, int sensor_id)
+{
+       pr_debug("%s\n", __func__);
+
+       return 0;
+}
+
+int exynos5430_fimc_is_print_pwr(struct platform_device *pdev)
+{
+       pr_debug("%s\n", __func__);
+
+       pr_info("ISP power state(0x%08x)\n", readl(EXYNOS5430_ISP_STATUS));
+       pr_info("CAM0 power state(0x%08x)\n", readl(EXYNOS5430_CAM0_STATUS));
+       pr_info("CAM1 power state(0x%08x)\n", readl(EXYNOS5430_CAM1_STATUS));
+       pr_info("CA5 power state(0x%08x)\n", readl(EXYNOS5430_A5IS_STATUS));
+
+       return 0;
+}
+
+int exynos5430_fimc_is_set_user_clk_gate(u32 group_id,
+               bool is_on,
+               u32 user_scenario_id,
+               unsigned long msk_state,
+               struct exynos_fimc_is_clk_gate_info *gate_info) {
+       /* if you want to skip clock on/off, let this func return -1 */
+       int ret = -1;
+
+       switch (user_scenario_id) {
+       case CLK_GATE_NOT_FULL_BYPASS_SN:
+               if (is_on == true)
+                       gate_info->groups[group_id].mask_clk_on_mod &=
+                               ~((1 << FIMC_IS_GATE_DIS_IP) |
+                               (1 << FIMC_IS_GATE_3DNR_IP));
+               else
+                       gate_info->groups[group_id].mask_clk_on_mod |=
+                               ((1 << FIMC_IS_GATE_DIS_IP) |
+                               (1 << FIMC_IS_GATE_3DNR_IP));
+               ret = 0;
+               break;
+       case CLK_GATE_DIS_SN:
+               if (is_on == true)
+                       gate_info->groups[group_id].mask_clk_on_mod |=
+                               ((1 << FIMC_IS_GATE_DIS_IP) |
+                               (1 << FIMC_IS_GATE_3DNR_IP));
+               else
+                       gate_info->groups[group_id].mask_clk_on_mod &=
+                               ~((1 << FIMC_IS_GATE_DIS_IP) |
+                               (1 << FIMC_IS_GATE_3DNR_IP));
+               ret = 0;
+               break;
+       default:
+               ret = 0;
+               break;
+       }
+
+       return ret;
+}
+#endif
+
+/* Wrapper functions */
+int exynos_fimc_is_cfg_clk(struct platform_device *pdev)
+{
+#if defined(CONFIG_SOC_EXYNOS5422)
+       exynos5422_fimc_is_cfg_clk(pdev);
+#elif defined(CONFIG_SOC_EXYNOS5430) || defined(CONFIG_SOC_EXYNOS5433)
+       exynos5430_fimc_is_cfg_clk(pdev);
+#endif
+       return 0;
+}
+
+int exynos_fimc_is_cfg_cam_clk(struct platform_device *pdev)
+{
+#if defined(CONFIG_SOC_EXYNOS5422)
+       exynos5422_cfg_clk_sclk(pdev);
+       exynos5422_cfg_clk_cam(pdev);
+#elif defined(CONFIG_SOC_EXYNOS5430) || defined(CONFIG_SOC_EXYNOS5433)
+       exynos5430_cfg_clk_sclk(pdev);
+       exynos5430_cfg_clk_cam1_spi(pdev);
+#endif
+       return 0;
+}
+
+int exynos_fimc_is_clk_on(struct platform_device *pdev)
+{
+#if defined(CONFIG_SOC_EXYNOS5422)
+       exynos5422_fimc_is_clk_on(pdev);
+#elif defined(CONFIG_SOC_EXYNOS5430) || defined(CONFIG_SOC_EXYNOS5433)
+       exynos5430_fimc_is_clk_on(pdev);
+#endif
+       return 0;
+}
+
+int exynos_fimc_is_clk_off(struct platform_device *pdev)
+{
+#if defined(CONFIG_SOC_EXYNOS5422)
+       exynos5422_fimc_is_clk_off(pdev);
+#elif defined(CONFIG_SOC_EXYNOS5430) || defined(CONFIG_SOC_EXYNOS5433)
+       exynos5430_fimc_is_clk_off(pdev);
+#endif
+       return 0;
+}
+
+int exynos_fimc_is_print_clk(struct platform_device *pdev)
+{
+#if defined(CONFIG_SOC_EXYNOS5422)
+       exynos5422_fimc_is_print_clk(pdev);
+#elif defined(CONFIG_SOC_EXYNOS5430) || defined(CONFIG_SOC_EXYNOS5433)
+       exynos5430_fimc_is_print_clk(pdev);
+#endif
+       return 0;
+}
+
+int exynos_fimc_is_set_user_clk_gate(u32 group_id, bool is_on,
+       u32 user_scenario_id,
+       unsigned long msk_state,
+       struct exynos_fimc_is_clk_gate_info *gate_info)
+{
+#if defined(CONFIG_SOC_EXYNOS5422)
+       exynos5422_fimc_is_set_user_clk_gate(group_id, is_on, user_scenario_id, msk_state, gate_info);
+#elif defined(CONFIG_SOC_EXYNOS5430) || defined(CONFIG_SOC_EXYNOS5433)
+       exynos5430_fimc_is_set_user_clk_gate(group_id, is_on, user_scenario_id, msk_state, gate_info);
+#endif
+       return 0;
+}
+
+int exynos_fimc_is_clk_gate(u32 clk_gate_id, bool is_on)
+{
+#if defined(CONFIG_SOC_EXYNOS5422)
+       exynos5422_fimc_is_clk_gate(clk_gate_id, is_on);
+#elif defined(CONFIG_SOC_EXYNOS5430) || defined(CONFIG_SOC_EXYNOS5433)
+       exynos5430_fimc_is_clk_gate(clk_gate_id, is_on);
+#endif
+       return 0;
+}
+
+int exynos_fimc_is_sensor_power_on(struct platform_device *pdev, int sensor_id)
+{
+#if defined(CONFIG_SOC_EXYNOS5422)
+       exynos5422_fimc_is_sensor_power_on(pdev, sensor_id);
+#elif defined(CONFIG_SOC_EXYNOS5430) || defined(CONFIG_SOC_EXYNOS5433)
+       exynos5430_fimc_is_sensor_power_on(pdev, sensor_id);
+#endif
+       return 0;
+}
+
+int exynos_fimc_is_sensor_power_off(struct platform_device *pdev, int sensor_id)
+{
+#if defined(CONFIG_SOC_EXYNOS5422)
+       exynos5422_fimc_is_sensor_power_off(pdev, sensor_id);
+#elif defined(CONFIG_SOC_EXYNOS5430) || defined(CONFIG_SOC_EXYNOS5433)
+       exynos5430_fimc_is_sensor_power_off(pdev, sensor_id);
+#endif
+       return 0;
+}
+
+int exynos_fimc_is_print_pwr(struct platform_device *pdev)
+{
+#if defined(CONFIG_SOC_EXYNOS5422)
+       exynos5422_fimc_is_print_pwr(pdev);
+#elif defined(CONFIG_SOC_EXYNOS5430) || defined(CONFIG_SOC_EXYNOS5433)
+       exynos5430_fimc_is_print_pwr(pdev);
+#endif
+       return 0;
+}
diff --git a/drivers/media/platform/exynos/fimc-is/smc.h b/drivers/media/platform/exynos/fimc-is/smc.h
new file mode 100644 (file)
index 0000000..063d17c
--- /dev/null
@@ -0,0 +1,92 @@
+/*
+ *  Copyright (c) 2012 Samsung Electronics.
+ *
+ * EXYNOS - SMC Call
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#ifndef __ASM_ARCH_EXYNOS_SMC_H
+#define __ASM_ARCH_EXYNOS_SMC_H
+
+#define SMC_CMD_INIT           (-1)
+#define SMC_CMD_INFO           (-2)
+/* For Power Management */
+#define SMC_CMD_SLEEP          (-3)
+#define SMC_CMD_CPU1BOOT       (-4)
+#define SMC_CMD_CPU0AFTR       (-5)
+#define SMC_CMD_SAVE           (-6)
+#define SMC_CMD_SHUTDOWN       (-7)
+/* For CP15 Access */
+#define SMC_CMD_C15RESUME      (-11)
+/* For L2 Cache Access */
+#define SMC_CMD_L2X0CTRL       (-21)
+#define SMC_CMD_L2X0SETUP1     (-22)
+#define SMC_CMD_L2X0SETUP2     (-23)
+#define SMC_CMD_L2X0INVALL     (-24)
+#define SMC_CMD_L2X0DEBUG      (-25)
+
+/* For Accessing CP15/SFR (General) */
+#define SMC_CMD_REG            (-101)
+
+/* For setting memory for debug */
+#define SMC_CMD_SET_DEBUG_MEM  (-120)
+
+/* Command ID for smc */
+#define SMC_PROTECTION_SET     0x81000000
+#define SMC_DRM_FW_LOADING     0x81000001
+#define SMC_DCPP_SUPPORT       0x81000002
+#define SMC_DRM_MAKE_PGTABLE   0x81000003
+#define SMC_DRM_CLEAR_PGTABLE  0x81000004
+#define SMC_MEM_PROT_SET       0x81000005
+#define SMC_DRM_SECMEM_INFO    0x81000006
+#define SMC_DRM_VIDEO_PROC     0x81000007
+
+/* Parameter for smc */
+#define SMC_PROTECTION_ENABLE  1
+#define SMC_PROTECTION_DISABLE 0
+
+/* For FMP Ctrl */
+#define SMC_CMD_FMP            0x81000020
+
+/* For DTRNG Access */
+#ifdef CONFIG_EXYRNG_USE_CRYPTOMANAGER
+#define SMC_CMD_RANDOM         0x82001012
+#else
+#define SMC_CMD_RANDOM         0x81000030
+#endif
+
+/* MACRO for SMC_CMD_REG */
+#define SMC_REG_CLASS_CP15     (0x0 << 30)
+#define SMC_REG_CLASS_SFR_W    (0x1 << 30)
+#define SMC_REG_CLASS_SFR_R    (0x3 << 30)
+#define SMC_REG_CLASS_MASK     (0x3 << 30)
+#define SMC_REG_ID_CP15(CRn, Op1, CRm, Op2) \
+          (SMC_REG_CLASS_CP15 | (CRn << 10) | (Op1 << 7) | (CRm << 3) | (Op2))
+#define SMC_REG_ID_SFR_W(addr) (SMC_REG_CLASS_SFR_W | ((addr) >> 2))
+#define SMC_REG_ID_SFR_R(addr) (SMC_REG_CLASS_SFR_R | ((addr) >> 2))
+
+/* op type for SMC_CMD_SAVE and SMC_CMD_SHUTDOWN */
+#define OP_TYPE_CORE            0x0
+#define OP_TYPE_CLUSTER         0x1
+
+/* Power State required for SMC_CMD_SAVE and SMC_CMD_SHUTDOWN */
+#define SMC_POWERSTATE_SLEEP    0x0
+#define SMC_POWERSTATE_IDLE     0x1
+#define SMC_POWERSTATE_SWITCH   0x2
+
+/* For DTRNG Access */
+#define HWRNG_INIT             0x0
+#define HWRNG_EXIT             0x1
+#define HWRNG_GET_DATA         0x2
+#define HWRNG_RESUME           0x3
+
+#ifndef __ASSEMBLY__
+extern int exynos_smc(unsigned long cmd, unsigned long arg1, unsigned long arg2,
+                     unsigned long arg3);
+extern int exynos_smc_readsfr(unsigned long addr, unsigned long* val);
+#endif
+
+#endif
diff --git a/include/uapi/linux/videodev2_exynos_camera.h b/include/uapi/linux/videodev2_exynos_camera.h
new file mode 100644 (file)
index 0000000..ecef0b3
--- /dev/null
@@ -0,0 +1,80 @@
+/*
+ * Video for Linux Two header file for samsung
+ *
+ * Copyright (C) 2009, Dongsoo Nathaniel Kim<dongsoo45.kim@samsung.com>
+ *
+ * This header file contains several v4l2 APIs to be proposed to v4l2
+ * community and until bein accepted, will be used restrictly in Samsung's
+ * camera interface driver FIMC.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ */
+
+#ifndef __LINUX_VIDEODEV2_EXYNOS_CAMERA_H
+#define __LINUX_VIDEODEV2_EXYNOS_CAMERA_H
+
+/* Following CIDs are menu type */
+#define V4L2_CID_SCENEMODE     (V4L2_CID_CAMERA_CLASS_BASE+23)
+#define V4L2_CID_CAM_STABILIZE (V4L2_CID_CAMERA_CLASS_BASE+24)
+#define V4L2_CID_CAM_MULTISHOT (V4L2_CID_CAMERA_CLASS_BASE+25)
+
+/* Control dynamic range */
+#define V4L2_CID_CAM_DR                (V4L2_CID_CAMERA_CLASS_BASE+26)
+
+/* White balance preset control */
+#define V4L2_CID_WHITE_BALANCE_PRESET  (V4L2_CID_CAMERA_CLASS_BASE+27)
+#define V4L2_CID_CAM_SENSOR_FW_VER     (V4L2_CID_CAMERA_CLASS_BASE + 28)
+#define V4L2_CID_CAM_PHONE_FW_VER      (V4L2_CID_CAMERA_CLASS_BASE + 29)
+
+#define V4L2_CID_FIMC_IS_BASE          (V4L2_CTRL_CLASS_CAMERA | 0x1000)
+#define V4L2_CID_FIMC_IS_TUNE_BASE     (V4L2_CTRL_CLASS_CAMERA | 0x2000)
+#define V4L2_CID_SENSOR_BASE           (V4L2_CTRL_CLASS_CAMERA | 0x3000)
+
+#define V4L2_CID_IS_S_STREAM                   (V4L2_CID_FIMC_IS_BASE + 14)
+enum is_set_stream {
+       IS_DISABLE_STREAM,
+       IS_ENABLE_STREAM
+};
+
+#define V4L2_CID_IS_G_STREAM                   (V4L2_CID_FIMC_IS_BASE + 15)
+#define V4L2_CID_IS_G_CAPABILITY               (V4L2_CID_FIMC_IS_BASE + 17)
+#define V4L2_CID_IS_G_COMPLETES                        (V4L2_CID_FIMC_IS_BASE + 18)
+#define V4L2_CID_IS_BDS_WIDTH                  (V4L2_CID_FIMC_IS_BASE + 19)
+#define V4L2_CID_IS_BDS_HEIGHT                 (V4L2_CID_FIMC_IS_BASE + 20)
+#define V4L2_CID_IS_DVFS_LOCK                  (V4L2_CID_FIMC_IS_BASE + 21)
+#define V4L2_CID_IS_DVFS_UNLOCK                        (V4L2_CID_FIMC_IS_BASE + 22)
+#define V4L2_CID_IS_FORCE_DONE                 (V4L2_CID_FIMC_IS_BASE + 50)
+#define V4L2_CID_IS_SET_SETFILE                        (V4L2_CID_FIMC_IS_BASE + 51)
+#define V4L2_CID_IS_S_BNS                              (V4L2_CID_FIMC_IS_BASE + 52)
+#define V4L2_CID_IS_G_BNS_SIZE                 (V4L2_CID_FIMC_IS_BASE + 53)
+#define V4L2_CID_IS_COLOR_RANGE                        (V4L2_CID_FIMC_IS_BASE + 54)
+#define V4L2_CID_IS_MIN_TARGET_FPS             (V4L2_CID_FIMC_IS_BASE + 55)
+#define V4L2_CID_IS_MAX_TARGET_FPS             (V4L2_CID_FIMC_IS_BASE + 56)
+#define V4L2_CID_IS_G_DTPSTATUS                        (V4L2_CID_FIMC_IS_BASE + 57)
+#define V4L2_CID_IS_END_OF_STREAM              (V4L2_CID_FIMC_IS_BASE + 58)
+#define V4L2_CID_IS_MAP_BUFFER                 (V4L2_CID_FIMC_IS_BASE + 59)
+#define V4L2_CID_IS_INTENT                     (V4L2_CID_FIMC_IS_BASE + 60)
+
+#define V4L2_CID_SENSOR_SET_AE_TARGET                  (V4L2_CID_SENSOR_BASE + 1)
+#define V4L2_CID_SENSOR_SET_AE_WEIGHT_1x1_2            (V4L2_CID_SENSOR_BASE + 2)
+#define V4L2_CID_SENSOR_SET_AE_WEIGHT_1x3_4            (V4L2_CID_SENSOR_BASE + 3)
+#define V4L2_CID_SENSOR_SET_AE_WEIGHT_2x1_2            (V4L2_CID_SENSOR_BASE + 4)
+#define V4L2_CID_SENSOR_SET_AE_WEIGHT_2x3_4            (V4L2_CID_SENSOR_BASE + 5)
+#define V4L2_CID_SENSOR_SET_AE_WEIGHT_3x1_2            (V4L2_CID_SENSOR_BASE + 6)
+#define V4L2_CID_SENSOR_SET_AE_WEIGHT_3x3_4            (V4L2_CID_SENSOR_BASE + 7)
+#define V4L2_CID_SENSOR_SET_AE_WEIGHT_4x1_2            (V4L2_CID_SENSOR_BASE + 8)
+#define V4L2_CID_SENSOR_SET_AE_WEIGHT_4x3_4            (V4L2_CID_SENSOR_BASE + 9)
+#define V4L2_CID_SENSOR_SET_RG_WEIGHT                  (V4L2_CID_SENSOR_BASE + 10)
+#define V4L2_CID_SENSOR_SET_AE_SPEED                   (V4L2_CID_SENSOR_BASE + 11)
+#define V4L2_CID_SENSOR_SET_SHUTTER                    (V4L2_CID_SENSOR_BASE + 12)
+#define V4L2_CID_SENSOR_SET_GAIN                       (V4L2_CID_SENSOR_BASE + 13)
+#define V4L2_CID_SENSOR_SET_BIT_CONVERTING             (V4L2_CID_SENSOR_BASE + 14)
+#define V4L2_CID_SENSOR_SET_AUTO_EXPOSURE              (V4L2_CID_SENSOR_BASE + 15)
+#define V4L2_CID_SENSOR_SET_FRAME_RATE                 (V4L2_CID_SENSOR_BASE + 16)
+
+#define V4L2_CID_CAMERA_OIS_SINE_MODE  (V4L2_CID_PRIVATE_BASE+152)
+
+#endif /* __LINUX_VIDEODEV2_EXYNOS_CAMERA_H */