msm: camera: Add CCI MASTER field in device tree
CCI supports I2C transaction on two I2C masters. In current
camera framework, only MASTER 0 is supported. Add CCI MASTER field
in device tree sensor property and select proper MASTER in sensor
driver.
Change-Id: I0c08739780b2f112962bd50b338bfeabd27289e5
Signed-off-by: Sreesudhan Ramakrish Ramkumar <srramku@codeaurora.org>
diff --git a/Documentation/devicetree/bindings/media/video/msm-cci.txt b/Documentation/devicetree/bindings/media/video/msm-cci.txt
index cf33f50..a6a5eb3 100644
--- a/Documentation/devicetree/bindings/media/video/msm-cci.txt
+++ b/Documentation/devicetree/bindings/media/video/msm-cci.txt
@@ -125,6 +125,11 @@
- qcom,sensor-position : should contain the mount angle of the camera sensor
- 0 -> back camera
- 1 -> front camera
+- qcom,cci-master : should contain i2c master id to be used for this camera
+ sensor
+ - 0 -> MASTER 0
+ - 1 -> MASTER 1
+
Example:
qcom,cci@0xfda0c000 {
diff --git a/arch/arm/boot/dts/msm8974-camera-sensor-liquid.dtsi b/arch/arm/boot/dts/msm8974-camera-sensor-liquid.dtsi
index cb2b4ed..c9ea119 100644
--- a/arch/arm/boot/dts/msm8974-camera-sensor-liquid.dtsi
+++ b/arch/arm/boot/dts/msm8974-camera-sensor-liquid.dtsi
@@ -48,6 +48,7 @@
qcom,csi-lane-mask = <0x1F>;
qcom,sensor-position = <0>;
qcom,sensor-mode = <1>;
+ qcom,cci-master = <0>;
status = "ok";
};
@@ -83,6 +84,7 @@
qcom,csi-lane-mask = <0x7>;
qcom,sensor-position = <1>;
qcom,sensor-mode = <1>;
+ qcom,cci-master = <0>;
status = "ok";
};
};
diff --git a/arch/arm/boot/dts/msm8974-camera-sensor.dtsi b/arch/arm/boot/dts/msm8974-camera-sensor.dtsi
index c3e205f..a873091 100644
--- a/arch/arm/boot/dts/msm8974-camera-sensor.dtsi
+++ b/arch/arm/boot/dts/msm8974-camera-sensor.dtsi
@@ -48,6 +48,7 @@
qcom,csi-lane-mask = <0x1F>;
qcom,sensor-position = <0>;
qcom,sensor-mode = <1>;
+ qcom,cci-master = <0>;
status = "ok";
};
@@ -83,6 +84,7 @@
qcom,csi-lane-mask = <0x7>;
qcom,sensor-position = <1>;
qcom,sensor-mode = <1>;
+ qcom,cci-master = <1>;
status = "ok";
};
};
diff --git a/arch/arm/boot/dts/msm8974-camera.dtsi b/arch/arm/boot/dts/msm8974-camera.dtsi
index 68b0f5c..11af103 100644
--- a/arch/arm/boot/dts/msm8974-camera.dtsi
+++ b/arch/arm/boot/dts/msm8974-camera.dtsi
@@ -248,6 +248,7 @@
qcom,csi-lane-mask = <0x3>;
qcom,sensor-position = <1>;
qcom,sensor-mode = <1>;
+ qcom,cci-master = <0>;
};
};
};
diff --git a/arch/arm/mach-msm/include/mach/camera2.h b/arch/arm/mach-msm/include/mach/camera2.h
index e624131..88e2f12 100644
--- a/arch/arm/mach-msm/include/mach/camera2.h
+++ b/arch/arm/mach-msm/include/mach/camera2.h
@@ -36,6 +36,11 @@
S_EXIT
};
+enum cci_i2c_master_t {
+ MASTER_0,
+ MASTER_1,
+};
+
struct msm_camera_slave_info {
uint16_t sensor_slave_addr;
uint16_t sensor_id_reg_addr;
diff --git a/drivers/media/platform/msm/camera_v2/sensor/cci/msm_cci.h b/drivers/media/platform/msm/camera_v2/sensor/cci/msm_cci.h
index 527a8db..f9e40f1 100644
--- a/drivers/media/platform/msm/camera_v2/sensor/cci/msm_cci.h
+++ b/drivers/media/platform/msm/camera_v2/sensor/cci/msm_cci.h
@@ -18,6 +18,7 @@
#include <linux/platform_device.h>
#include <media/v4l2-subdev.h>
#include <media/msm_cam_sensor.h>
+#include <mach/camera2.h>
#include "msm_sd.h"
#define NUM_MASTERS 2
@@ -26,11 +27,6 @@
#define TRUE 1
#define FALSE 0
-enum cci_i2c_master_t {
- MASTER_0,
- MASTER_1,
-};
-
enum cci_i2c_queue_t {
QUEUE_0,
QUEUE_1,
diff --git a/drivers/media/platform/msm/camera_v2/sensor/msm_sensor.c b/drivers/media/platform/msm/camera_v2/sensor/msm_sensor.c
index 78c3207..ffc22c3 100644
--- a/drivers/media/platform/msm/camera_v2/sensor/msm_sensor.c
+++ b/drivers/media/platform/msm/camera_v2/sensor/msm_sensor.c
@@ -640,6 +640,16 @@
rc = 0;
}
+ rc = of_property_read_u32(of_node, "qcom,cci-master",
+ &s_ctrl->cci_i2c_master);
+ CDBG("%s qcom,cci-master %d, rc %d\n", __func__, s_ctrl->cci_i2c_master,
+ rc);
+ if (rc < 0) {
+ /* Set default master 0 */
+ s_ctrl->cci_i2c_master = MASTER_0;
+ rc = 0;
+ }
+
rc = msm_sensor_get_sub_module_index(of_node, sensordata);
if (rc < 0) {
pr_err("%s failed %d\n", __func__, __LINE__);
@@ -1410,7 +1420,7 @@
/* TODO: get CCI subdev */
cci_client = s_ctrl->sensor_i2c_client->cci_client;
cci_client->cci_subdev = msm_cci_get_subdev();
- cci_client->cci_i2c_master = MASTER_0;
+ cci_client->cci_i2c_master = s_ctrl->cci_i2c_master;
cci_client->sid =
s_ctrl->sensordata->slave_info->sensor_slave_addr >> 1;
cci_client->retries = 3;
diff --git a/drivers/media/platform/msm/camera_v2/sensor/msm_sensor.h b/drivers/media/platform/msm/camera_v2/sensor/msm_sensor.h
index 20a2b14..bfce4cb 100644
--- a/drivers/media/platform/msm/camera_v2/sensor/msm_sensor.h
+++ b/drivers/media/platform/msm/camera_v2/sensor/msm_sensor.h
@@ -48,6 +48,7 @@
struct msm_sensor_ctrl_t {
struct platform_device *pdev;
enum msm_sensor_device_type_t sensor_device_type;
+ enum cci_i2c_master_t cci_i2c_master;
struct msm_camera_sensor_board_info *sensordata;
struct msm_sensor_power_setting_array power_setting_array;
struct mutex *msm_sensor_mutex;