Merge changes I66b4da08,Iba26640f into msm-3.0
* changes:
msm: camera: add reset csid and csiphy
msm: camera: Add csi_lane_mask and csi_lane_assign
diff --git a/arch/arm/mach-msm/board-8064-camera.c b/arch/arm/mach-msm/board-8064-camera.c
index 70d76fb..c714bc8 100644
--- a/arch/arm/mach-msm/board-8064-camera.c
+++ b/arch/arm/mach-msm/board-8064-camera.c
@@ -440,12 +440,18 @@
.flash_src = &msm_flash_src
};
+static struct msm_camera_csi_lane_params imx074_csi_lane_params = {
+ .csi_lane_assign = 0xE4,
+ .csi_lane_mask = 0xF,
+};
+
static struct msm_camera_sensor_platform_info sensor_board_info_imx074 = {
.mount_angle = 90,
.cam_vreg = apq_8064_back_cam_vreg,
.num_vreg = ARRAY_SIZE(apq_8064_back_cam_vreg),
.gpio_conf = &apq8064_back_cam_gpio_conf,
.i2c_conf = &apq8064_back_cam_i2c_conf,
+ .csi_lane_params = &imx074_csi_lane_params,
};
static struct msm_camera_sensor_info msm_camera_sensor_imx074_data = {
@@ -469,12 +475,18 @@
.flash_type = MSM_CAMERA_FLASH_NONE
};
+static struct msm_camera_csi_lane_params mt9m114_csi_lane_params = {
+ .csi_lane_assign = 0xE4,
+ .csi_lane_mask = 0x1,
+};
+
static struct msm_camera_sensor_platform_info sensor_board_info_mt9m114 = {
.mount_angle = 90,
.cam_vreg = apq_8064_mt9m114_vreg,
.num_vreg = ARRAY_SIZE(apq_8064_mt9m114_vreg),
.gpio_conf = &apq8064_front_cam_gpio_conf,
.i2c_conf = &apq8064_front_cam_i2c_conf,
+ .csi_lane_params = &mt9m114_csi_lane_params,
};
static struct msm_camera_sensor_info msm_camera_sensor_mt9m114_data = {
@@ -490,12 +502,18 @@
.flash_type = MSM_CAMERA_FLASH_NONE,
};
+static struct msm_camera_csi_lane_params ov2720_csi_lane_params = {
+ .csi_lane_assign = 0xE4,
+ .csi_lane_mask = 0x3,
+};
+
static struct msm_camera_sensor_platform_info sensor_board_info_ov2720 = {
.mount_angle = 0,
.cam_vreg = apq_8064_front_cam_vreg,
.num_vreg = ARRAY_SIZE(apq_8064_front_cam_vreg),
.gpio_conf = &apq8064_front_cam_gpio_conf,
.i2c_conf = &apq8064_front_cam_i2c_conf,
+ .csi_lane_params = &ov2720_csi_lane_params,
};
static struct msm_camera_sensor_info msm_camera_sensor_ov2720_data = {
diff --git a/arch/arm/mach-msm/board-8930-camera.c b/arch/arm/mach-msm/board-8930-camera.c
index 1d743d8..5f4e62c 100644
--- a/arch/arm/mach-msm/board-8930-camera.c
+++ b/arch/arm/mach-msm/board-8930-camera.c
@@ -425,11 +425,17 @@
#endif
};
+static struct msm_camera_csi_lane_params imx074_csi_lane_params = {
+ .csi_lane_assign = 0xE4,
+ .csi_lane_mask = 0xF,
+};
+
static struct msm_camera_sensor_platform_info sensor_board_info_imx074 = {
.mount_angle = 90,
.cam_vreg = msm_8930_back_cam_vreg,
.num_vreg = ARRAY_SIZE(msm_8930_back_cam_vreg),
.gpio_conf = &msm_8930_back_cam_gpio_conf,
+ .csi_lane_params = &imx074_csi_lane_params,
};
static struct msm_camera_sensor_info msm_camera_sensor_imx074_data = {
@@ -454,11 +460,17 @@
.flash_type = MSM_CAMERA_FLASH_NONE
};
+static struct msm_camera_csi_lane_params mt9m114_csi_lane_params = {
+ .csi_lane_assign = 0xE4,
+ .csi_lane_mask = 0x1,
+};
+
static struct msm_camera_sensor_platform_info sensor_board_info_mt9m114 = {
.mount_angle = 90,
.cam_vreg = msm_8930_mt9m114_vreg,
.num_vreg = ARRAY_SIZE(msm_8930_mt9m114_vreg),
.gpio_conf = &msm_8930_front_cam_gpio_conf,
+ .csi_lane_params = &mt9m114_csi_lane_params,
};
static struct msm_camera_sensor_info msm_camera_sensor_mt9m114_data = {
@@ -474,11 +486,17 @@
.flash_type = MSM_CAMERA_FLASH_NONE,
};
+static struct msm_camera_csi_lane_params ov2720_csi_lane_params = {
+ .csi_lane_assign = 0xE4,
+ .csi_lane_mask = 0x3,
+};
+
static struct msm_camera_sensor_platform_info sensor_board_info_ov2720 = {
.mount_angle = 0,
.cam_vreg = msm_8930_front_cam_vreg,
.num_vreg = ARRAY_SIZE(msm_8930_front_cam_vreg),
.gpio_conf = &msm_8930_front_cam_gpio_conf,
+ .csi_lane_params = &ov2720_csi_lane_params,
};
static struct msm_camera_sensor_info msm_camera_sensor_ov2720_data = {
@@ -501,11 +519,17 @@
.flash_type = MSM_CAMERA_FLASH_NONE,
};
+static struct msm_camera_csi_lane_params s5k3l1yx_csi_lane_params = {
+ .csi_lane_assign = 0xE4,
+ .csi_lane_mask = 0xF,
+};
+
static struct msm_camera_sensor_platform_info sensor_board_info_s5k3l1yx = {
.mount_angle = 0,
.cam_vreg = msm_8930_s5k3l1yx_vreg,
.num_vreg = ARRAY_SIZE(msm_8930_s5k3l1yx_vreg),
.gpio_conf = &msm_8930_back_cam_gpio_conf,
+ .csi_lane_params = &s5k3l1yx_csi_lane_params,
};
static struct msm_camera_sensor_info msm_camera_sensor_s5k3l1yx_data = {
diff --git a/arch/arm/mach-msm/board-8960-camera.c b/arch/arm/mach-msm/board-8960-camera.c
index 3a697bf..3392f46 100644
--- a/arch/arm/mach-msm/board-8960-camera.c
+++ b/arch/arm/mach-msm/board-8960-camera.c
@@ -496,11 +496,17 @@
#endif
};
+static struct msm_camera_csi_lane_params imx074_csi_lane_params = {
+ .csi_lane_assign = 0xE4,
+ .csi_lane_mask = 0xF,
+};
+
static struct msm_camera_sensor_platform_info sensor_board_info_imx074 = {
.mount_angle = 90,
.cam_vreg = msm_8960_back_cam_vreg,
.num_vreg = ARRAY_SIZE(msm_8960_back_cam_vreg),
.gpio_conf = &msm_8960_back_cam_gpio_conf,
+ .csi_lane_params = &imx074_csi_lane_params,
};
static struct msm_camera_sensor_info msm_camera_sensor_imx074_data = {
@@ -525,11 +531,17 @@
.flash_type = MSM_CAMERA_FLASH_NONE
};
+static struct msm_camera_csi_lane_params mt9m114_csi_lane_params = {
+ .csi_lane_assign = 0xE4,
+ .csi_lane_mask = 0x1,
+};
+
static struct msm_camera_sensor_platform_info sensor_board_info_mt9m114 = {
.mount_angle = 90,
.cam_vreg = msm_8960_mt9m114_vreg,
.num_vreg = ARRAY_SIZE(msm_8960_mt9m114_vreg),
.gpio_conf = &msm_8960_front_cam_gpio_conf,
+ .csi_lane_params = &mt9m114_csi_lane_params,
};
static struct msm_camera_sensor_info msm_camera_sensor_mt9m114_data = {
@@ -545,11 +557,17 @@
.flash_type = MSM_CAMERA_FLASH_NONE,
};
+static struct msm_camera_csi_lane_params ov2720_csi_lane_params = {
+ .csi_lane_assign = 0xE4,
+ .csi_lane_mask = 0x3,
+};
+
static struct msm_camera_sensor_platform_info sensor_board_info_ov2720 = {
.mount_angle = 0,
.cam_vreg = msm_8960_front_cam_vreg,
.num_vreg = ARRAY_SIZE(msm_8960_front_cam_vreg),
.gpio_conf = &msm_8960_front_cam_gpio_conf,
+ .csi_lane_params = &ov2720_csi_lane_params,
};
static struct msm_camera_sensor_info msm_camera_sensor_ov2720_data = {
@@ -572,11 +590,17 @@
.flash_type = MSM_CAMERA_FLASH_NONE,
};
+static struct msm_camera_csi_lane_params s5k3l1yx_csi_lane_params = {
+ .csi_lane_assign = 0xE4,
+ .csi_lane_mask = 0xF,
+};
+
static struct msm_camera_sensor_platform_info sensor_board_info_s5k3l1yx = {
.mount_angle = 0,
.cam_vreg = msm_8960_s5k3l1yx_vreg,
.num_vreg = ARRAY_SIZE(msm_8960_s5k3l1yx_vreg),
.gpio_conf = &msm_8960_back_cam_gpio_conf,
+ .csi_lane_params = &s5k3l1yx_csi_lane_params,
};
static struct msm_camera_sensor_info msm_camera_sensor_s5k3l1yx_data = {
diff --git a/arch/arm/mach-msm/include/mach/board.h b/arch/arm/mach-msm/include/mach/board.h
index 7fa4a07..7e17120 100644
--- a/arch/arm/mach-msm/include/mach/board.h
+++ b/arch/arm/mach-msm/include/mach/board.h
@@ -191,6 +191,11 @@
uint32_t delay;
};
+struct msm_camera_csi_lane_params {
+ uint8_t csi_lane_assign;
+ uint8_t csi_lane_mask;
+};
+
struct msm_camera_gpio_conf {
void *cam_gpiomux_conf_tbl;
uint8_t cam_gpiomux_conf_tbl_size;
@@ -227,6 +232,7 @@
int32_t (*ext_power_ctrl) (int enable);
struct msm_camera_gpio_conf *gpio_conf;
struct msm_camera_i2c_conf *i2c_conf;
+ struct msm_camera_csi_lane_params *csi_lane_params;
};
struct msm_actuator_info {
diff --git a/arch/arm/mach-msm/include/mach/camera.h b/arch/arm/mach-msm/include/mach/camera.h
index ef7be45..2aae5dd 100644
--- a/arch/arm/mach-msm/include/mach/camera.h
+++ b/arch/arm/mach-msm/include/mach/camera.h
@@ -192,6 +192,7 @@
struct msm_camera_csiphy_params {
uint8_t lane_cnt;
uint8_t settle_cnt;
+ uint8_t lane_mask;
};
struct msm_camera_csi2_params {
diff --git a/drivers/media/video/msm/csi/msm_csid.c b/drivers/media/video/msm/csi/msm_csid.c
index d7abaa9..e531089 100644
--- a/drivers/media/video/msm/csi/msm_csid.c
+++ b/drivers/media/video/msm/csi/msm_csid.c
@@ -51,8 +51,8 @@
#define CSID_TG_DT_n_CFG_1_ADDR 0xAC
#define CSID_TG_DT_n_CFG_2_ADDR 0xB0
#define CSID_TG_DT_n_CFG_3_ADDR 0xD8
-
-#define DBG_CSID 0
+#define CSID_RST_DONE_IRQ_BITSHIFT 11
+#define CSID_RST_STB_ALL 0x7FFF
static int msm_csid_cid_lut(
struct msm_camera_csid_lut_params *csid_lut_params,
@@ -92,6 +92,7 @@
csid_dev = v4l2_get_subdevdata(cfg_params->subdev);
csidbase = csid_dev->base;
csid_params = cfg_params->parms;
+
val = csid_params->lane_cnt - 1;
val |= csid_params->lane_assign << 2;
val |= 0x1 << 10;
@@ -105,8 +106,9 @@
if (rc < 0)
return rc;
- msm_io_w(0x7fF10800, csidbase + CSID_IRQ_MASK_ADDR);
- msm_io_w(0x7fF10800, csidbase + CSID_IRQ_CLEAR_CMD_ADDR);
+ val = ((1 << csid_params->lane_cnt) - 1) << 20;
+ msm_io_w(0x7f010800 | val, csidbase + CSID_IRQ_MASK_ADDR);
+ msm_io_w(0x7f010800 | val, csidbase + CSID_IRQ_CLEAR_CMD_ADDR);
msleep(20);
return rc;
@@ -119,10 +121,19 @@
irq = msm_io_r(csid_dev->base + CSID_IRQ_STATUS_ADDR);
CDBG("%s CSID%d_IRQ_STATUS_ADDR = 0x%x\n",
__func__, csid_dev->pdev->id, irq);
+ if (irq & (0x1 << CSID_RST_DONE_IRQ_BITSHIFT))
+ complete(&csid_dev->reset_complete);
msm_io_w(irq, csid_dev->base + CSID_IRQ_CLEAR_CMD_ADDR);
return IRQ_HANDLED;
}
+static void msm_csid_reset(struct csid_device *csid_dev)
+{
+ msm_io_w(CSID_RST_STB_ALL, csid_dev->base + CSID_RST_CMD_ADDR);
+ wait_for_completion_interruptible(&csid_dev->reset_complete);
+ return;
+}
+
static int msm_csid_subdev_g_chip_ident(struct v4l2_subdev *sd,
struct v4l2_dbg_chip_ident *chip)
{
@@ -185,9 +196,11 @@
msm_io_r(csid_dev->base + CSID_HW_VERSION_ADDR);
*csid_version = csid_dev->hw_version;
-#if DBG_CSID
+ init_completion(&csid_dev->reset_complete);
+
enable_irq(csid_dev->irq->start);
-#endif
+
+ msm_csid_reset(csid_dev);
return 0;
clk_enable_failed:
@@ -206,9 +219,7 @@
struct csid_device *csid_dev;
csid_dev = v4l2_get_subdevdata(sd);
-#if DBG_CSID
disable_irq(csid_dev->irq->start);
-#endif
msm_cam_clk_enable(&csid_dev->pdev->dev, csid_clk_info,
csid_dev->csid_clk, ARRAY_SIZE(csid_clk_info), 0);
diff --git a/drivers/media/video/msm/csi/msm_csid.h b/drivers/media/video/msm/csi/msm_csid.h
index 105cd49..2eae49c 100644
--- a/drivers/media/video/msm/csi/msm_csid.h
+++ b/drivers/media/video/msm/csi/msm_csid.h
@@ -26,6 +26,7 @@
struct regulator *csi_vdd;
void __iomem *base;
struct mutex mutex;
+ struct completion reset_complete;
uint32_t hw_version;
struct clk *csid_clk[5];
diff --git a/drivers/media/video/msm/csi/msm_csiphy.c b/drivers/media/video/msm/csi/msm_csiphy.c
index a30dc29..0c1e0a4 100644
--- a/drivers/media/video/msm/csi/msm_csiphy.c
+++ b/drivers/media/video/msm/csi/msm_csiphy.c
@@ -38,6 +38,8 @@
#define MIPI_CSIPHY_LNCK_MISC1_ADDR 0x128
#define MIPI_CSIPHY_GLBL_T_INIT_CFG0_ADDR 0x1E0
#define MIPI_CSIPHY_T_WAKEUP_CFG0_ADDR 0x1E8
+#define MIPI_CSIPHY_T_WAKEUP_CFG1_ADDR 0x1EC
+#define MIPI_CSIPHY_GLBL_RESET_ADDR 0x0140
#define MIPI_CSIPHY_GLBL_PWR_CFG_ADDR 0x0144
#define MIPI_CSIPHY_INTERRUPT_STATUS0_ADDR 0x0180
#define MIPI_CSIPHY_INTERRUPT_STATUS1_ADDR 0x0184
@@ -58,14 +60,17 @@
int msm_csiphy_config(struct csiphy_cfg_params *cfg_params)
{
int rc = 0;
- int i = 0;
+ int j = 0;
uint32_t val = 0;
+ uint8_t lane_cnt = 0, lane_mask = 0;
struct csiphy_device *csiphy_dev;
struct msm_camera_csiphy_params *csiphy_params;
void __iomem *csiphybase;
csiphy_dev = v4l2_get_subdevdata(cfg_params->subdev);
csiphybase = csiphy_dev->base;
csiphy_params = cfg_params->parms;
+ lane_mask = csiphy_params->lane_mask;
+ lane_cnt = csiphy_params->lane_cnt;
if (csiphy_params->lane_cnt < 1 || csiphy_params->lane_cnt > 4) {
CDBG("%s: unsupported lane cnt %d\n",
__func__, csiphy_params->lane_cnt);
@@ -73,15 +78,28 @@
}
val = 0x3;
- msm_io_w((((1 << csiphy_params->lane_cnt) - 1) << 2) | val,
- csiphybase + MIPI_CSIPHY_GLBL_PWR_CFG_ADDR);
+ msm_io_w((csiphy_params->lane_mask << 2) | val,
+ csiphybase + MIPI_CSIPHY_GLBL_PWR_CFG_ADDR);
msm_io_w(0x1, csiphybase + MIPI_CSIPHY_GLBL_T_INIT_CFG0_ADDR);
msm_io_w(0x1, csiphybase + MIPI_CSIPHY_T_WAKEUP_CFG0_ADDR);
- for (i = 0; i < csiphy_params->lane_cnt; i++) {
- msm_io_w(0x10, csiphybase + MIPI_CSIPHY_LNn_CFG2_ADDR + 0x40*i);
+ while (lane_mask & 0xf) {
+ if (!(lane_mask & 0x1)) {
+ j++;
+ lane_mask >>= 1;
+ continue;
+ }
+ msm_io_w(0x10, csiphybase + MIPI_CSIPHY_LNn_CFG2_ADDR + 0x40*j);
msm_io_w(csiphy_params->settle_cnt,
- csiphybase + MIPI_CSIPHY_LNn_CFG3_ADDR + 0x40*i);
+ csiphybase + MIPI_CSIPHY_LNn_CFG3_ADDR + 0x40*j);
+ msm_io_w(0x6F,
+ csiphybase + MIPI_CSIPHY_INTERRUPT_MASK0_ADDR +
+ 0x4*(j+1));
+ msm_io_w(0x6F,
+ csiphybase + MIPI_CSIPHY_INTERRUPT_CLEAR0_ADDR +
+ 0x4*(j+1));
+ j++;
+ lane_mask >>= 1;
}
msm_io_w(0x10, csiphybase + MIPI_CSIPHY_LNCK_CFG2_ADDR);
@@ -92,13 +110,6 @@
csiphybase + MIPI_CSIPHY_INTERRUPT_MASK0_ADDR);
msm_io_w(0x24,
csiphybase + MIPI_CSIPHY_INTERRUPT_CLEAR0_ADDR);
-
- for (i = 1; i <= csiphy_params->lane_cnt; i++) {
- msm_io_w(0x6F,
- csiphybase + MIPI_CSIPHY_INTERRUPT_MASK0_ADDR + 0x4*i);
- msm_io_w(0x6F,
- csiphybase + MIPI_CSIPHY_INTERRUPT_CLEAR0_ADDR + 0x4*i);
- }
return rc;
}
@@ -131,6 +142,13 @@
return IRQ_HANDLED;
}
+static void msm_csiphy_reset(struct csiphy_device *csiphy_dev)
+{
+ msm_io_w(0x1, csiphy_dev->base + MIPI_CSIPHY_GLBL_RESET_ADDR);
+ usleep_range(5000, 8000);
+ msm_io_w(0x0, csiphy_dev->base + MIPI_CSIPHY_GLBL_RESET_ADDR);
+}
+
static int msm_csiphy_subdev_g_chip_ident(struct v4l2_subdev *sd,
struct v4l2_dbg_chip_ident *chip)
{
@@ -173,6 +191,7 @@
#if DBG_CSIPHY
enable_irq(csiphy_dev->irq->start);
#endif
+ msm_csiphy_reset(csiphy_dev);
return 0;
}
diff --git a/drivers/media/video/msm/sensors/imx074_v4l2.c b/drivers/media/video/msm/sensors/imx074_v4l2.c
index 92700f6..af9d1f4 100644
--- a/drivers/media/video/msm/sensors/imx074_v4l2.c
+++ b/drivers/media/video/msm/sensors/imx074_v4l2.c
@@ -175,7 +175,6 @@
static struct msm_camera_csi2_params imx074_csi_params = {
.csid_params = {
- .lane_assign = 0xe4,
.lane_cnt = 4,
.lut_params = {
.num_cid = 2,
diff --git a/drivers/media/video/msm/sensors/msm_sensor.c b/drivers/media/video/msm/sensors/msm_sensor.c
index e40a528..1112be7 100644
--- a/drivers/media/video/msm/sensors/msm_sensor.c
+++ b/drivers/media/video/msm/sensors/msm_sensor.c
@@ -321,6 +321,12 @@
msm_sensor_write_res_settings(s_ctrl, res);
if (s_ctrl->curr_csi_params != s_ctrl->csi_params[res]) {
s_ctrl->curr_csi_params = s_ctrl->csi_params[res];
+ s_ctrl->curr_csi_params->csid_params.lane_assign =
+ s_ctrl->sensordata->sensor_platform_info->
+ csi_lane_params->csi_lane_assign;
+ s_ctrl->curr_csi_params->csiphy_params.lane_mask =
+ s_ctrl->sensordata->sensor_platform_info->
+ csi_lane_params->csi_lane_mask;
v4l2_subdev_notify(&s_ctrl->sensor_v4l2_subdev,
NOTIFY_CSID_CFG,
&s_ctrl->curr_csi_params->csid_params);
diff --git a/drivers/media/video/msm/sensors/mt9m114_v4l2.c b/drivers/media/video/msm/sensors/mt9m114_v4l2.c
index a1e56f7..2184806 100644
--- a/drivers/media/video/msm/sensors/mt9m114_v4l2.c
+++ b/drivers/media/video/msm/sensors/mt9m114_v4l2.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2011, Code Aurora Forum. All rights reserved.
+/* Copyright (c) 2011-2012, Code Aurora Forum. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and
@@ -1191,7 +1191,6 @@
static struct msm_camera_csi2_params mt9m114_csi_params = {
.csid_params = {
- .lane_assign = 0xe4,
.lane_cnt = 1,
.lut_params = {
.num_cid = 2,
diff --git a/drivers/media/video/msm/sensors/ov2720.c b/drivers/media/video/msm/sensors/ov2720.c
index 246900e..05556eb 100644
--- a/drivers/media/video/msm/sensors/ov2720.c
+++ b/drivers/media/video/msm/sensors/ov2720.c
@@ -341,7 +341,6 @@
static struct msm_camera_csi2_params ov2720_csi_params = {
.csid_params = {
- .lane_assign = 0xe4,
.lane_cnt = 2,
.lut_params = {
.num_cid = 2,
diff --git a/drivers/media/video/msm/sensors/s5k3l1yx.c b/drivers/media/video/msm/sensors/s5k3l1yx.c
index af68601..4a790f8 100644
--- a/drivers/media/video/msm/sensors/s5k3l1yx.c
+++ b/drivers/media/video/msm/sensors/s5k3l1yx.c
@@ -542,7 +542,6 @@
static struct msm_camera_csi2_params s5k3l1yx_csi_params = {
.csid_params = {
- .lane_assign = 0xe4,
.lane_cnt = 4,
.lut_params = {
.num_cid = ARRAY_SIZE(s5k3l1yx_cid_cfg),