summaryrefslogtreecommitdiff
path: root/drivers/media/platform
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/media/platform')
-rw-r--r--drivers/media/platform/msm/camera_v2/camera/camera.c7
-rw-r--r--drivers/media/platform/msm/camera_v2/common/cam_smmu_api.c2
-rw-r--r--drivers/media/platform/msm/camera_v2/common/cam_soc_api.c95
-rw-r--r--drivers/media/platform/msm/camera_v2/common/cam_soc_api.h39
-rw-r--r--drivers/media/platform/msm/camera_v2/isp/msm_buf_mgr.c3
-rw-r--r--drivers/media/platform/msm/camera_v2/isp/msm_isp_axi_util.c5
-rw-r--r--drivers/media/platform/msm/camera_v2/isp/msm_isp_util.c2
-rw-r--r--drivers/media/platform/msm/camera_v2/ispif/msm_ispif.c366
-rw-r--r--drivers/media/platform/msm/camera_v2/ispif/msm_ispif.h3
-rw-r--r--drivers/media/platform/msm/camera_v2/ispif/msm_ispif_hwreg_v1.h6
-rw-r--r--drivers/media/platform/msm/camera_v2/ispif/msm_ispif_hwreg_v2.h8
-rw-r--r--drivers/media/platform/msm/camera_v2/ispif/msm_ispif_hwreg_v3.h7
-rw-r--r--drivers/media/platform/msm/camera_v2/msm_buf_mgr/msm_generic_buf_mgr.c37
-rw-r--r--drivers/media/platform/msm/camera_v2/msm_sd.h5
-rw-r--r--drivers/media/platform/msm/camera_v2/msm_vb2/msm_vb2.c62
-rw-r--r--drivers/media/platform/msm/camera_v2/pproc/cpp/Makefile1
-rw-r--r--drivers/media/platform/msm/camera_v2/pproc/cpp/msm_cpp.c183
-rw-r--r--drivers/media/platform/msm/camera_v2/pproc/cpp/msm_cpp.h3
-rw-r--r--drivers/media/platform/msm/camera_v2/sensor/Makefile1
-rw-r--r--drivers/media/platform/msm/camera_v2/sensor/actuator/msm_actuator.c22
-rw-r--r--drivers/media/platform/msm/camera_v2/sensor/cci/msm_cci.c161
-rw-r--r--drivers/media/platform/msm/camera_v2/sensor/cci/msm_cci.h12
-rw-r--r--drivers/media/platform/msm/camera_v2/sensor/csid/msm_csid.c354
-rw-r--r--drivers/media/platform/msm/camera_v2/sensor/csid/msm_csid.h11
-rw-r--r--drivers/media/platform/msm/camera_v2/sensor/csiphy/msm_csiphy.c490
-rw-r--r--drivers/media/platform/msm/camera_v2/sensor/csiphy/msm_csiphy.h13
-rw-r--r--drivers/media/platform/msm/camera_v2/sensor/eeprom/msm_eeprom.c75
-rw-r--r--drivers/media/platform/msm/camera_v2/sensor/flash/msm_flash.c148
-rw-r--r--drivers/media/platform/msm/camera_v2/sensor/io/msm_camera_cci_i2c.c15
-rw-r--r--drivers/media/platform/msm/camera_v2/sensor/io/msm_camera_dt_util.c35
-rw-r--r--drivers/media/platform/msm/camera_v2/sensor/io/msm_camera_dt_util.h4
-rw-r--r--drivers/media/platform/msm/camera_v2/sensor/io/msm_camera_i2c_mux.c70
-rw-r--r--drivers/media/platform/msm/camera_v2/sensor/io/msm_camera_i2c_mux.h6
-rw-r--r--drivers/media/platform/msm/camera_v2/sensor/laser_led/Makefile5
-rw-r--r--drivers/media/platform/msm/camera_v2/sensor/laser_led/msm_laser_led.h57
-rw-r--r--drivers/media/platform/msm/camera_v2/sensor/msm_sensor.c90
-rw-r--r--drivers/media/platform/msm/camera_v2/sensor/msm_sensor.h1
-rw-r--r--drivers/media/platform/msm/camera_v2/sensor/msm_sensor_driver.c104
-rw-r--r--drivers/media/platform/msm/camera_v2/sensor/ois/msm_ois.c4
39 files changed, 1114 insertions, 1398 deletions
diff --git a/drivers/media/platform/msm/camera_v2/camera/camera.c b/drivers/media/platform/msm/camera_v2/camera/camera.c
index 1c721e95180a..03ec503b77af 100644
--- a/drivers/media/platform/msm/camera_v2/camera/camera.c
+++ b/drivers/media/platform/msm/camera_v2/camera/camera.c
@@ -93,6 +93,13 @@ static int camera_v4l2_querycap(struct file *filep, void *fh,
int rc;
struct v4l2_event event;
+ cap->bus_info[0] = 0;
+ strlcpy(cap->driver, "msm-sensor", sizeof(cap->driver));
+ strlcpy(cap->card, "msm-sensor", sizeof(cap->card));
+ cap->device_caps = V4L2_CAP_VIDEO_OUTPUT |
+ V4L2_CAP_STREAMING;
+ cap->capabilities = cap->device_caps | V4L2_CAP_DEVICE_CAPS;
+
if (msm_is_daemon_present() == false)
return 0;
diff --git a/drivers/media/platform/msm/camera_v2/common/cam_smmu_api.c b/drivers/media/platform/msm/camera_v2/common/cam_smmu_api.c
index 7d9edde62c1b..0a6f2646be96 100644
--- a/drivers/media/platform/msm/camera_v2/common/cam_smmu_api.c
+++ b/drivers/media/platform/msm/camera_v2/common/cam_smmu_api.c
@@ -2327,7 +2327,7 @@ static int cam_smmu_populate_sids(struct device *dev,
if (rc < 0)
pr_err("misconfiguration, can't fetch SID\n");
- pr_err("__debug cnt = %d, cb->name: :%s sid [%d] = %d\n,",
+ pr_err("__debug cnt = %d, cb->name: :%s sid [%d] = %d\n",
cnt, cb->name, j, cb->sids[j]);
}
return rc;
diff --git a/drivers/media/platform/msm/camera_v2/common/cam_soc_api.c b/drivers/media/platform/msm/camera_v2/common/cam_soc_api.c
index 2dca190413d1..8c1cbaa24260 100644
--- a/drivers/media/platform/msm/camera_v2/common/cam_soc_api.c
+++ b/drivers/media/platform/msm/camera_v2/common/cam_soc_api.c
@@ -41,7 +41,7 @@ struct msm_cam_bus_pscale_data g_cv[CAM_BUS_CLIENT_MAX];
/* Get all clocks from DT */
-static int msm_camera_get_clk_info_internal(struct device *dev,
+int msm_camera_get_clk_info(struct platform_device *pdev,
struct msm_cam_clk_info **clk_info,
struct clk ***clk_ptr,
size_t *num_clk)
@@ -53,7 +53,10 @@ static int msm_camera_get_clk_info_internal(struct device *dev,
bool clock_cntl_support = false;
struct device_node *of_node;
- of_node = dev->of_node;
+ if (!pdev || !clk_info || !num_clk)
+ return -EINVAL;
+
+ of_node = pdev->dev.of_node;
cnt = of_property_count_strings(of_node, "clock-names");
if (cnt <= 0) {
@@ -91,19 +94,19 @@ static int msm_camera_get_clk_info_internal(struct device *dev,
*num_clk = cnt;
- *clk_info = devm_kcalloc(dev, cnt,
+ *clk_info = devm_kcalloc(&pdev->dev, cnt,
sizeof(struct msm_cam_clk_info), GFP_KERNEL);
if (!*clk_info)
return -ENOMEM;
- *clk_ptr = devm_kcalloc(dev, cnt, sizeof(struct clk *),
+ *clk_ptr = devm_kcalloc(&pdev->dev, cnt, sizeof(struct clk *),
GFP_KERNEL);
if (!*clk_ptr) {
rc = -ENOMEM;
goto err1;
}
- rates = devm_kcalloc(dev, cnt, sizeof(long), GFP_KERNEL);
+ rates = devm_kcalloc(&pdev->dev, cnt, sizeof(long), GFP_KERNEL);
if (!rates) {
rc = -ENOMEM;
goto err2;
@@ -158,7 +161,7 @@ static int msm_camera_get_clk_info_internal(struct device *dev,
i, (*clk_info)[i].clk_rate);
(*clk_ptr)[i] =
- devm_clk_get(dev, (*clk_info)[i].clk_name);
+ devm_clk_get(&pdev->dev, (*clk_info)[i].clk_name);
if (IS_ERR((*clk_ptr)[i])) {
rc = PTR_ERR((*clk_ptr)[i]);
goto err4;
@@ -166,50 +169,18 @@ static int msm_camera_get_clk_info_internal(struct device *dev,
CDBG("clk ptr[%d] :%pK\n", i, (*clk_ptr)[i]);
}
- devm_kfree(dev, rates);
+ devm_kfree(&pdev->dev, rates);
return rc;
err4:
for (--i; i >= 0; i--)
- devm_clk_put(dev, (*clk_ptr)[i]);
+ devm_clk_put(&pdev->dev, (*clk_ptr)[i]);
err3:
- devm_kfree(dev, rates);
+ devm_kfree(&pdev->dev, rates);
err2:
- devm_kfree(dev, *clk_ptr);
+ devm_kfree(&pdev->dev, *clk_ptr);
err1:
- devm_kfree(dev, *clk_info);
- return rc;
-}
-
-/* Get all clocks from DT for I2C devices */
-int msm_camera_i2c_dev_get_clk_info(struct device *dev,
- struct msm_cam_clk_info **clk_info,
- struct clk ***clk_ptr,
- size_t *num_clk)
-{
- int rc = 0;
-
- if (!dev || !clk_info || !clk_ptr || !num_clk)
- return -EINVAL;
-
- rc = msm_camera_get_clk_info_internal(dev, clk_info, clk_ptr, num_clk);
- return rc;
-}
-EXPORT_SYMBOL(msm_camera_i2c_dev_get_clk_info);
-
-/* Get all clocks from DT for platform devices */
-int msm_camera_get_clk_info(struct platform_device *pdev,
- struct msm_cam_clk_info **clk_info,
- struct clk ***clk_ptr,
- size_t *num_clk)
-{
- int rc = 0;
-
- if (!pdev || (&pdev->dev == NULL) || !clk_info || !clk_ptr || !num_clk)
- return -EINVAL;
-
- rc = msm_camera_get_clk_info_internal(&pdev->dev,
- clk_info, clk_ptr, num_clk);
+ devm_kfree(&pdev->dev, *clk_info);
return rc;
}
EXPORT_SYMBOL(msm_camera_get_clk_info);
@@ -466,7 +437,7 @@ int msm_camera_set_clk_flags(struct clk *clk, unsigned long flags)
EXPORT_SYMBOL(msm_camera_set_clk_flags);
/* release memory allocated for clocks */
-static int msm_camera_put_clk_info_internal(struct device *dev,
+int msm_camera_put_clk_info(struct platform_device *pdev,
struct msm_cam_clk_info **clk_info,
struct clk ***clk_ptr, int cnt)
{
@@ -474,46 +445,16 @@ static int msm_camera_put_clk_info_internal(struct device *dev,
for (i = cnt - 1; i >= 0; i--) {
if (clk_ptr[i] != NULL)
- devm_clk_put(dev, (*clk_ptr)[i]);
+ devm_clk_put(&pdev->dev, (*clk_ptr)[i]);
CDBG("clk ptr[%d] :%pK\n", i, (*clk_ptr)[i]);
}
- devm_kfree(dev, *clk_info);
- devm_kfree(dev, *clk_ptr);
+ devm_kfree(&pdev->dev, *clk_info);
+ devm_kfree(&pdev->dev, *clk_ptr);
*clk_info = NULL;
*clk_ptr = NULL;
return 0;
}
-
-/* release memory allocated for clocks for i2c devices */
-int msm_camera_i2c_dev_put_clk_info(struct device *dev,
- struct msm_cam_clk_info **clk_info,
- struct clk ***clk_ptr, int cnt)
-{
- int rc = 0;
-
- if (!dev || !clk_info || !clk_ptr)
- return -EINVAL;
-
- rc = msm_camera_put_clk_info_internal(dev, clk_info, clk_ptr, cnt);
- return rc;
-}
-EXPORT_SYMBOL(msm_camera_i2c_dev_put_clk_info);
-
-/* release memory allocated for clocks for platform devices */
-int msm_camera_put_clk_info(struct platform_device *pdev,
- struct msm_cam_clk_info **clk_info,
- struct clk ***clk_ptr, int cnt)
-{
- int rc = 0;
-
- if (!pdev || (&pdev->dev == NULL) || !clk_info || !clk_ptr)
- return -EINVAL;
-
- rc = msm_camera_put_clk_info_internal(&pdev->dev,
- clk_info, clk_ptr, cnt);
- return rc;
-}
EXPORT_SYMBOL(msm_camera_put_clk_info);
int msm_camera_put_clk_info_and_rates(struct platform_device *pdev,
diff --git a/drivers/media/platform/msm/camera_v2/common/cam_soc_api.h b/drivers/media/platform/msm/camera_v2/common/cam_soc_api.h
index 55074490bd72..50a2d3e71b2b 100644
--- a/drivers/media/platform/msm/camera_v2/common/cam_soc_api.h
+++ b/drivers/media/platform/msm/camera_v2/common/cam_soc_api.h
@@ -54,30 +54,11 @@ struct msm_cam_regulator {
*
* @return Status of operation. Negative in case of error. Zero otherwise.
*/
+
int msm_camera_get_clk_info(struct platform_device *pdev,
struct msm_cam_clk_info **clk_info,
struct clk ***clk_ptr,
size_t *num_clk);
-
-/**
- * @brief : Gets clock information from dtsi
- *
- * This function extracts the clocks information for a specific
- * i2c device
- *
- * @param dev : i2c device to get clocks information
- * @param clk_info : Pointer to populate clock information array
- * @param clk_ptr : Pointer to populate clock resource pointers
- * @param num_clk: Pointer to populate the number of clocks
- * extracted from dtsi
- *
- * @return Status of operation. Negative in case of error. Zero otherwise.
- */
-int msm_camera_i2c_dev_get_clk_info(struct device *dev,
- struct msm_cam_clk_info **clk_info,
- struct clk ***clk_ptr,
- size_t *num_clk);
-
/**
* @brief : Gets clock information and rates from dtsi
*
@@ -117,23 +98,6 @@ int msm_camera_get_clk_info_and_rates(
int msm_camera_put_clk_info(struct platform_device *pdev,
struct msm_cam_clk_info **clk_info,
struct clk ***clk_ptr, int cnt);
-
-/**
- * @brief : Puts clock information
- *
- * This function releases the memory allocated for the clocks
- *
- * @param dev : Pointer to i2c device
- * @param clk_info : Pointer to release the allocated memory
- * @param clk_ptr : Pointer to release the clock resources
- * @param cnt : Number of clk resources
- *
- * @return Status of operation. Negative in case of error. Zero otherwise.
- */
-int msm_camera_i2c_dev_put_clk_info(struct device *dev,
- struct msm_cam_clk_info **clk_info,
- struct clk ***clk_ptr, int cnt);
-
/**
* @brief : Puts clock information
*
@@ -148,6 +112,7 @@ int msm_camera_i2c_dev_put_clk_info(struct device *dev,
*
* @return Status of operation. Negative in case of error. Zero otherwise.
*/
+
int msm_camera_put_clk_info_and_rates(struct platform_device *pdev,
struct msm_cam_clk_info **clk_info,
struct clk ***clk_ptr, uint32_t ***clk_rates,
diff --git a/drivers/media/platform/msm/camera_v2/isp/msm_buf_mgr.c b/drivers/media/platform/msm/camera_v2/isp/msm_buf_mgr.c
index 20a38925aa10..eab56b70e646 100644
--- a/drivers/media/platform/msm/camera_v2/isp/msm_buf_mgr.c
+++ b/drivers/media/platform/msm/camera_v2/isp/msm_buf_mgr.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2013-2018, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2013-2017, The Linux Foundation. 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
@@ -26,7 +26,6 @@
#include <media/v4l2-ioctl.h>
#include <media/v4l2-device.h>
#include <media/videobuf2-core.h>
-#include <media/msmb_generic_buf_mgr.h>
#include "msm.h"
#include "msm_buf_mgr.h"
diff --git a/drivers/media/platform/msm/camera_v2/isp/msm_isp_axi_util.c b/drivers/media/platform/msm/camera_v2/isp/msm_isp_axi_util.c
index 914355e804d1..e03635b3a833 100644
--- a/drivers/media/platform/msm/camera_v2/isp/msm_isp_axi_util.c
+++ b/drivers/media/platform/msm/camera_v2/isp/msm_isp_axi_util.c
@@ -3592,6 +3592,7 @@ static int msm_isp_request_frame(struct vfe_device *vfe_dev,
uint32_t wm_mask = 0;
int vfe_idx;
uint32_t pingpong_bit = 0;
+ uint32_t do_drop_frame;
if (!vfe_dev || !stream_info) {
pr_err("%s %d failed: vfe_dev %pK stream_info %pK\n", __func__,
@@ -3614,7 +3615,7 @@ static int msm_isp_request_frame(struct vfe_device *vfe_dev,
vfe_ops.axi_ops.get_pingpong_status(vfe_dev);
/* As MCT is still processing it, need to drop the additional requests*/
- if (vfe_dev->isp_page->drop_reconfig) {
+ if (vfe_dev->isp_page->drop_reconfig && do_drop_frame) {
pr_err("%s: MCT has not yet delayed %d drop request %d\n",
__func__, vfe_dev->isp_page->drop_reconfig, frame_id);
goto error;
@@ -3637,6 +3638,7 @@ static int msm_isp_request_frame(struct vfe_device *vfe_dev,
pr_debug("%s:%d invalid time to request frame %d try drop_reconfig\n",
__func__, __LINE__, frame_id);
vfe_dev->isp_page->drop_reconfig = 1;
+ do_drop_frame = 1;
return 0;
} else if ((vfe_dev->axi_data.src_info[frame_src].active) &&
((frame_id ==
@@ -3645,6 +3647,7 @@ static int msm_isp_request_frame(struct vfe_device *vfe_dev,
(stream_info->undelivered_request_cnt <=
MAX_BUFFERS_IN_HW)) {
vfe_dev->isp_page->drop_reconfig = 1;
+ do_drop_frame = 0;
pr_debug("%s: vfe_%d request_frame %d cur frame id %d pix %d try drop_reconfig\n",
__func__, vfe_dev->pdev->id, frame_id,
vfe_dev->axi_data.src_info[VFE_PIX_0].frame_id,
diff --git a/drivers/media/platform/msm/camera_v2/isp/msm_isp_util.c b/drivers/media/platform/msm/camera_v2/isp/msm_isp_util.c
index 3e9544fc94a7..bd34c744feea 100644
--- a/drivers/media/platform/msm/camera_v2/isp/msm_isp_util.c
+++ b/drivers/media/platform/msm/camera_v2/isp/msm_isp_util.c
@@ -214,7 +214,7 @@ void msm_isp_get_timestamp(struct msm_isp_timestamp *time_stamp,
time_stamp->buf_time.tv_sec = time_stamp->vt_time.tv_sec;
time_stamp->buf_time.tv_usec = time_stamp->vt_time.tv_usec;
} else {
- get_monotonic_boottime(&ts);
+ ktime_get_ts(&ts);
time_stamp->buf_time.tv_sec = ts.tv_sec;
time_stamp->buf_time.tv_usec = ts.tv_nsec/1000;
}
diff --git a/drivers/media/platform/msm/camera_v2/ispif/msm_ispif.c b/drivers/media/platform/msm/camera_v2/ispif/msm_ispif.c
index da2381d24394..4e18659bf95e 100644
--- a/drivers/media/platform/msm/camera_v2/ispif/msm_ispif.c
+++ b/drivers/media/platform/msm/camera_v2/ispif/msm_ispif.c
@@ -49,35 +49,17 @@
#define ISPIF_TIMEOUT_ALL_US 1000000
#define ISPIF_SOF_DEBUG_COUNT 5
-/* 3D Threshold value according guidelines for line width 1280 */
-#define STEREO_DEFAULT_3D_THRESHOLD 0x36
-
-/*
- * Overflows before restarting interface during stereo usecase
- * to give some tolerance for cases when the two sensors sync fails
- * this value is chosen by experiment
- */
-#define MAX_PIX_OVERFLOW_ERROR_COUNT 10
-static int pix_overflow_error_count[VFE_MAX] = { 0 };
-
#undef CDBG
#ifdef CONFIG_MSMB_CAMERA_DEBUG
#define CDBG(fmt, args...) pr_debug(fmt, ##args)
#else
-#define CDBG(fmt, args...)
+#define CDBG(fmt, args...) do { } while (0)
#endif
-/* Backward interface compatibility for 3D THRESHOLD calculation */
-#define ISPIF_USE_DEFAULT_THRESHOLD (0)
-#define ISPIF_CALCULATE_THRESHOLD (1)
-
static int msm_ispif_clk_ahb_enable(struct ispif_device *ispif, int enable);
static int ispif_close_node(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh);
static long msm_ispif_subdev_ioctl_unlocked(struct v4l2_subdev *sd,
unsigned int cmd, void *arg);
-static long msm_ispif_dispatch_cmd(enum ispif_cfg_type_t cmd,
- struct ispif_device *ispif,
- struct msm_ispif_param_data_ext *params);
int msm_ispif_get_clk_info(struct ispif_device *ispif_dev,
struct platform_device *pdev);
@@ -275,7 +257,16 @@ static long msm_ispif_cmd_ext(struct v4l2_subdev *sd,
}
mutex_lock(&ispif->mutex);
- rc = msm_ispif_dispatch_cmd(pcdata.cfg_type, ispif, params);
+ switch (pcdata.cfg_type) {
+ case ISPIF_CFG2:
+ rc = msm_ispif_config2(ispif, params);
+ msm_ispif_io_dump_reg(ispif);
+ break;
+ default:
+ pr_err("%s: invalid cfg_type\n", __func__);
+ rc = -EINVAL;
+ break;
+ }
mutex_unlock(&ispif->mutex);
kfree(params);
return rc;
@@ -464,7 +455,7 @@ static int msm_ispif_reset_hw(struct ispif_device *ispif)
/* This is set when device is 8974 */
ispif->clk_idx = 1;
}
- memset(ispif->stereo_configured, 0, sizeof(ispif->stereo_configured));
+
atomic_set(&ispif->reset_trig[VFE0], 1);
/* initiate reset of ISPIF */
msm_camera_io_w(ISPIF_RST_CMD_MASK,
@@ -872,34 +863,15 @@ static uint16_t msm_ispif_get_cids_mask_from_cfg(
return cids_mask;
}
-
-static uint16_t msm_ispif_get_right_cids_mask_from_cfg(
- struct msm_ispif_right_param_entry *entry, int num_cids)
-{
- int i;
- uint16_t cids_mask = 0;
-
- if (WARN_ON(!entry))
- return cids_mask;
-
- for (i = 0; i < num_cids && i < MAX_CID_CH_PARAM_ENTRY; i++) {
- if (entry->cids[i] < CID_MAX)
- cids_mask |= (1 << entry->cids[i]);
- }
-
- return cids_mask;
-}
-
static int msm_ispif_config(struct ispif_device *ispif,
void *data)
{
int rc = 0, i = 0;
- uint16_t cid_mask = 0;
- uint16_t cid_right_mask = 0;
+ uint16_t cid_mask;
enum msm_ispif_intftype intftype;
enum msm_ispif_vfe_intf vfe_intf;
- struct msm_ispif_param_data_ext *params =
- (struct msm_ispif_param_data_ext *)data;
+ struct msm_ispif_param_data *params =
+ (struct msm_ispif_param_data *)data;
BUG_ON(!ispif);
BUG_ON(!params);
@@ -949,15 +921,9 @@ static int msm_ispif_config(struct ispif_device *ispif,
return -EINVAL;
}
- if (ispif->csid_version >= CSID_VERSION_V30) {
+ if (ispif->csid_version >= CSID_VERSION_V30)
msm_ispif_select_clk_mux(ispif, intftype,
params->entries[i].csid, vfe_intf);
- if (intftype == PIX0 && params->stereo_enable &&
- params->right_entries[i].csid < CSID_MAX)
- msm_ispif_select_clk_mux(ispif, PIX1,
- params->right_entries[i].csid,
- vfe_intf);
- }
rc = msm_ispif_validate_intf_status(ispif, intftype, vfe_intf);
if (rc) {
@@ -968,26 +934,10 @@ static int msm_ispif_config(struct ispif_device *ispif,
msm_ispif_sel_csid_core(ispif, intftype,
params->entries[i].csid, vfe_intf);
- if (intftype == PIX0 && params->stereo_enable &&
- params->right_entries[i].csid < CSID_MAX)
- /* configure right stereo csid */
- msm_ispif_sel_csid_core(ispif, PIX1,
- params->right_entries[i].csid, vfe_intf);
-
cid_mask = msm_ispif_get_cids_mask_from_cfg(
&params->entries[i]);
msm_ispif_enable_intf_cids(ispif, intftype,
cid_mask, vfe_intf, 1);
- if (params->stereo_enable)
- cid_right_mask = msm_ispif_get_right_cids_mask_from_cfg(
- &params->right_entries[i],
- params->entries[i].num_cids);
- else
- cid_right_mask = 0;
- if (cid_right_mask && params->stereo_enable)
- /* configure right stereo cids */
- msm_ispif_enable_intf_cids(ispif, PIX1,
- cid_right_mask, vfe_intf, 1);
if (params->entries[i].crop_enable)
msm_ispif_enable_crop(ispif, intftype, vfe_intf,
params->entries[i].crop_start_pixel,
@@ -1020,44 +970,8 @@ static int msm_ispif_config(struct ispif_device *ispif,
return rc;
}
-static void msm_ispif_config_stereo(struct ispif_device *ispif,
- struct msm_ispif_param_data_ext *params, int use_line_width) {
-
- int i;
- enum msm_ispif_vfe_intf vfe_intf;
- uint32_t stereo_3d_threshold = STEREO_DEFAULT_3D_THRESHOLD;
-
- if (params->num > MAX_PARAM_ENTRIES)
- return;
-
- for (i = 0; i < params->num; i++) {
- vfe_intf = params->entries[i].vfe_intf;
- if (!msm_ispif_is_intf_valid(ispif->csid_version, vfe_intf)) {
- pr_err("%s: invalid interface type %d\n", __func__,
- vfe_intf);
- return;
- }
- if (params->entries[i].intftype == PIX0 &&
- params->stereo_enable &&
- params->right_entries[i].csid < CSID_MAX &&
- !ispif->stereo_configured[vfe_intf]) {
- msm_camera_io_w_mb(0x3,
- ispif->base + ISPIF_VFE_m_OUTPUT_SEL(vfe_intf));
- if (use_line_width &&
- (params->line_width[vfe_intf] > 0))
- stereo_3d_threshold =
- (params->line_width[vfe_intf] +
- 2 * 6 - 1) / (2 * 6);
- msm_camera_io_w_mb(stereo_3d_threshold,
- ispif->base +
- ISPIF_VFE_m_3D_THRESHOLD(vfe_intf));
- ispif->stereo_configured[vfe_intf] = 1;
- }
- }
-}
-
static void msm_ispif_intf_cmd(struct ispif_device *ispif, uint32_t cmd_bits,
- struct msm_ispif_param_data_ext *params)
+ struct msm_ispif_param_data *params)
{
uint8_t vc;
int i, k;
@@ -1102,19 +1016,6 @@ static void msm_ispif_intf_cmd(struct ispif_device *ispif, uint32_t cmd_bits,
ispif->applied_intf_cmd[vfe_intf].intf_cmd |=
(cmd_bits << (vc * 2 + intf_type * 8));
}
- if (intf_type == PIX0 && params->stereo_enable &&
- params->right_entries[i].cids[k] < CID_MAX) {
- cid = params->right_entries[i].cids[k];
- vc = cid / 4;
-
- /* fill right stereo command */
- /* zero 2 bits */
- ispif->applied_intf_cmd[vfe_intf].intf_cmd &=
- ~(0x3 << (vc * 2 + PIX1 * 8));
- /* set cmd bits */
- ispif->applied_intf_cmd[vfe_intf].intf_cmd |=
- (cmd_bits << (vc * 2 + PIX1 * 8));
- }
}
/* cmd for PIX0, PIX1, RDI0, RDI1 */
if (ispif->applied_intf_cmd[vfe_intf].intf_cmd != 0xFFFFFFFF)
@@ -1131,7 +1032,7 @@ static void msm_ispif_intf_cmd(struct ispif_device *ispif, uint32_t cmd_bits,
}
static int msm_ispif_stop_immediately(struct ispif_device *ispif,
- struct msm_ispif_param_data_ext *params)
+ struct msm_ispif_param_data *params)
{
int i, rc = 0;
uint16_t cid_mask = 0;
@@ -1159,24 +1060,13 @@ static int msm_ispif_stop_immediately(struct ispif_device *ispif,
&params->entries[i]);
msm_ispif_enable_intf_cids(ispif, params->entries[i].intftype,
cid_mask, params->entries[i].vfe_intf, 0);
- if (params->stereo_enable) {
- ispif->stereo_configured[
- params->entries[i].vfe_intf] = 0;
- cid_mask = msm_ispif_get_right_cids_mask_from_cfg(
- &params->right_entries[i],
- params->entries[i].num_cids);
- if (cid_mask)
- msm_ispif_enable_intf_cids(ispif,
- params->entries[i].intftype, cid_mask,
- params->entries[i].vfe_intf, 0);
- }
}
return rc;
}
static int msm_ispif_start_frame_boundary(struct ispif_device *ispif,
- struct msm_ispif_param_data_ext *params)
+ struct msm_ispif_param_data *params)
{
int rc = 0;
@@ -1192,15 +1082,13 @@ static int msm_ispif_start_frame_boundary(struct ispif_device *ispif,
rc = -EINVAL;
return rc;
}
-
- msm_ispif_config_stereo(ispif, params, ISPIF_USE_DEFAULT_THRESHOLD);
msm_ispif_intf_cmd(ispif, ISPIF_INTF_CMD_ENABLE_FRAME_BOUNDARY, params);
return rc;
}
static int msm_ispif_restart_frame_boundary(struct ispif_device *ispif,
- struct msm_ispif_param_data_ext *params)
+ struct msm_ispif_param_data *params)
{
int rc = 0, i;
long timeout = 0;
@@ -1342,11 +1230,10 @@ end:
}
static int msm_ispif_stop_frame_boundary(struct ispif_device *ispif,
- struct msm_ispif_param_data_ext *params)
+ struct msm_ispif_param_data *params)
{
int i, rc = 0;
uint16_t cid_mask = 0;
- uint16_t cid_right_mask = 0;
uint32_t intf_addr;
enum msm_ispif_vfe_intf vfe_intf;
uint32_t stop_flag = 0;
@@ -1384,13 +1271,6 @@ static int msm_ispif_stop_frame_boundary(struct ispif_device *ispif,
for (i = 0; i < params->num; i++) {
cid_mask =
msm_ispif_get_cids_mask_from_cfg(&params->entries[i]);
- if (params->stereo_enable)
- cid_right_mask =
- msm_ispif_get_right_cids_mask_from_cfg(
- &params->right_entries[i],
- params->entries[i].num_cids);
- else
- cid_right_mask = 0;
vfe_intf = params->entries[i].vfe_intf;
switch (params->entries[i].intftype) {
@@ -1422,26 +1302,10 @@ static int msm_ispif_stop_frame_boundary(struct ispif_device *ispif,
ISPIF_TIMEOUT_ALL_US);
if (rc < 0)
goto end;
- if (cid_right_mask) {
- ispif->stereo_configured[
- params->entries[i].vfe_intf] = 0;
- intf_addr = ISPIF_VFE_m_PIX_INTF_n_STATUS(vfe_intf, 1);
- rc = readl_poll_timeout(ispif->base + intf_addr,
- stop_flag,
- (stop_flag & 0xF) == 0xF,
- ISPIF_TIMEOUT_SLEEP_US,
- ISPIF_TIMEOUT_ALL_US);
- if (rc < 0)
- goto end;
- }
/* disable CIDs in CID_MASK register */
msm_ispif_enable_intf_cids(ispif, params->entries[i].intftype,
cid_mask, vfe_intf, 0);
- if (cid_right_mask)
- msm_ispif_enable_intf_cids(ispif,
- params->entries[i].intftype, cid_right_mask,
- params->entries[i].vfe_intf, 0);
}
end:
@@ -1462,14 +1326,6 @@ static void ispif_process_irq(struct ispif_device *ispif,
ispif->sof_count[vfe_id].sof_cnt[PIX0]++;
ispif->ispif_sof_debug++;
}
- if (out[vfe_id].ispifIrqStatus1 &
- ISPIF_IRQ_STATUS_PIX_SOF_MASK) {
- if (ispif->ispif_sof_debug < ISPIF_SOF_DEBUG_COUNT*2)
- pr_err("%s: PIX1 frame id: %u\n", __func__,
- ispif->sof_count[vfe_id].sof_cnt[PIX1]);
- ispif->sof_count[vfe_id].sof_cnt[PIX1]++;
- ispif->ispif_sof_debug++;
- }
if (out[vfe_id].ispifIrqStatus0 &
ISPIF_IRQ_STATUS_RDI0_SOF_MASK) {
if (ispif->ispif_rdi0_debug < ISPIF_SOF_DEBUG_COUNT)
@@ -1496,55 +1352,12 @@ static void ispif_process_irq(struct ispif_device *ispif,
}
}
-static int msm_ispif_reconfig_3d_output(struct ispif_device *ispif,
- enum msm_ispif_vfe_intf vfe_id)
-{
- uint32_t reg_data;
-
- if (WARN_ON(!ispif))
- return -EINVAL;
-
- if (!((vfe_id == VFE0) || (vfe_id == VFE1))) {
- pr_err("%s;%d Cannot reconfigure 3D mode for VFE%d", __func__,
- __LINE__, vfe_id);
- return -EINVAL;
- }
- pr_info("%s;%d Reconfiguring 3D mode for VFE%d", __func__, __LINE__,
- vfe_id);
- reg_data = 0xFFFCFFFC;
- msm_camera_io_w_mb(reg_data, ispif->base +
- ISPIF_VFE_m_INTF_CMD_0(vfe_id));
- msm_camera_io_w_mb(reg_data, ispif->base +
- ISPIF_IRQ_GLOBAL_CLEAR_CMD_ADDR);
-
- if (vfe_id == VFE0) {
- reg_data = 0;
- reg_data |= (PIX_0_VFE_RST_STB | PIX_1_VFE_RST_STB |
- STROBED_RST_EN | PIX_0_CSID_RST_STB |
- PIX_1_CSID_RST_STB | PIX_OUTPUT_0_MISR_RST_STB);
- msm_camera_io_w_mb(reg_data, ispif->base + ISPIF_RST_CMD_ADDR);
- } else {
- reg_data = 0;
- reg_data |= (PIX_0_VFE_RST_STB | PIX_1_VFE_RST_STB |
- STROBED_RST_EN | PIX_0_CSID_RST_STB |
- PIX_1_CSID_RST_STB | PIX_OUTPUT_0_MISR_RST_STB);
- msm_camera_io_w_mb(reg_data, ispif->base +
- ISPIF_RST_CMD_1_ADDR);
- }
-
- reg_data = 0xFFFDFFFD;
- msm_camera_io_w_mb(reg_data, ispif->base +
- ISPIF_VFE_m_INTF_CMD_0(vfe_id));
- return 0;
-}
-
static inline void msm_ispif_read_irq_status(struct ispif_irq_status *out,
void *data)
{
struct ispif_device *ispif = (struct ispif_device *)data;
bool fatal_err = false;
int i = 0;
- uint32_t reg_data;
BUG_ON(!ispif);
BUG_ON(!out);
@@ -1595,12 +1408,6 @@ static inline void msm_ispif_read_irq_status(struct ispif_irq_status *out,
fatal_err = true;
}
- if (out[VFE0].ispifIrqStatus1 & PIX_INTF_1_OVERFLOW_IRQ) {
- pr_err_ratelimited("%s: VFE0 pix1 overflow.\n",
- __func__);
- fatal_err = true;
- }
-
if (out[VFE0].ispifIrqStatus0 & RAW_INTF_0_OVERFLOW_IRQ) {
pr_err_ratelimited("%s: VFE0 rdi0 overflow.\n",
__func__);
@@ -1633,12 +1440,6 @@ static inline void msm_ispif_read_irq_status(struct ispif_irq_status *out,
fatal_err = true;
}
- if (out[VFE1].ispifIrqStatus1 & PIX_INTF_1_OVERFLOW_IRQ) {
- pr_err_ratelimited("%s: VFE1 pix1 overflow.\n",
- __func__);
- fatal_err = true;
- }
-
if (out[VFE1].ispifIrqStatus0 & RAW_INTF_0_OVERFLOW_IRQ) {
pr_err_ratelimited("%s: VFE1 rdi0 overflow.\n",
__func__);
@@ -1660,43 +1461,6 @@ static inline void msm_ispif_read_irq_status(struct ispif_irq_status *out,
ispif_process_irq(ispif, out, VFE1);
}
- if ((out[VFE0].ispifIrqStatus0 & PIX_INTF_0_OVERFLOW_IRQ) ||
- (out[VFE0].ispifIrqStatus1 & PIX_INTF_0_OVERFLOW_IRQ) ||
- (out[VFE0].ispifIrqStatus2 & (L_R_SOF_MISMATCH_ERR_IRQ |
- L_R_EOF_MISMATCH_ERR_IRQ | L_R_SOL_MISMATCH_ERR_IRQ))) {
- reg_data = msm_camera_io_r(ispif->base +
- ISPIF_VFE_m_OUTPUT_SEL(VFE0));
- if ((reg_data & 0x03) == VFE_PIX_INTF_SEL_3D) {
- pix_overflow_error_count[VFE0]++;
- if (pix_overflow_error_count[VFE0] >=
- MAX_PIX_OVERFLOW_ERROR_COUNT) {
- msm_ispif_reconfig_3d_output(ispif, VFE0);
- pix_overflow_error_count[VFE0] = 0;
- }
- fatal_err = false;
- }
- }
-
- if (ispif->vfe_info.num_vfe > 1) {
- if ((out[VFE1].ispifIrqStatus0 & PIX_INTF_0_OVERFLOW_IRQ) ||
- (out[VFE1].ispifIrqStatus1 & PIX_INTF_0_OVERFLOW_IRQ) ||
- (out[VFE1].ispifIrqStatus2 & (L_R_SOF_MISMATCH_ERR_IRQ |
- L_R_EOF_MISMATCH_ERR_IRQ | L_R_SOL_MISMATCH_ERR_IRQ))) {
- reg_data = msm_camera_io_r(ispif->base +
- ISPIF_VFE_m_OUTPUT_SEL(VFE1));
- if ((reg_data & 0x03) == VFE_PIX_INTF_SEL_3D) {
- pix_overflow_error_count[VFE1]++;
- if (pix_overflow_error_count[VFE1] >=
- MAX_PIX_OVERFLOW_ERROR_COUNT) {
- msm_ispif_reconfig_3d_output(ispif,
- VFE1);
- pix_overflow_error_count[VFE1] = 0;
- }
- }
- fatal_err = false;
- }
- }
-
if (fatal_err == true) {
pr_err_ratelimited("%s: fatal error, stop ispif immediately\n",
__func__);
@@ -1805,101 +1569,61 @@ static void msm_ispif_release(struct ispif_device *ispif)
pr_err("%s: failed to remove vote for AHB\n", __func__);
}
-static long msm_ispif_dispatch_cmd(enum ispif_cfg_type_t cmd,
- struct ispif_device *ispif,
- struct msm_ispif_param_data_ext *params)
+static long msm_ispif_cmd(struct v4l2_subdev *sd, void *arg)
{
long rc = 0;
+ struct ispif_cfg_data *pcdata = (struct ispif_cfg_data *)arg;
+ struct ispif_device *ispif =
+ (struct ispif_device *)v4l2_get_subdevdata(sd);
- switch (cmd) {
+ BUG_ON(!sd);
+ BUG_ON(!pcdata);
+
+ mutex_lock(&ispif->mutex);
+ switch (pcdata->cfg_type) {
+ case ISPIF_ENABLE_REG_DUMP:
+ ispif->enb_dump_reg = pcdata->reg_dump; /* save dump config */
+ break;
+ case ISPIF_INIT:
+ rc = msm_ispif_init(ispif, pcdata->csid_version);
+ msm_ispif_io_dump_reg(ispif);
+ break;
case ISPIF_CFG:
- rc = msm_ispif_config(ispif, params);
+ rc = msm_ispif_config(ispif, &pcdata->params);
msm_ispif_io_dump_reg(ispif);
break;
case ISPIF_START_FRAME_BOUNDARY:
- rc = msm_ispif_start_frame_boundary(ispif, params);
+ rc = msm_ispif_start_frame_boundary(ispif, &pcdata->params);
msm_ispif_io_dump_reg(ispif);
break;
case ISPIF_RESTART_FRAME_BOUNDARY:
- rc = msm_ispif_restart_frame_boundary(ispif, params);
+ rc = msm_ispif_restart_frame_boundary(ispif, &pcdata->params);
msm_ispif_io_dump_reg(ispif);
break;
+
case ISPIF_STOP_FRAME_BOUNDARY:
- rc = msm_ispif_stop_frame_boundary(ispif, params);
+ rc = msm_ispif_stop_frame_boundary(ispif, &pcdata->params);
msm_ispif_io_dump_reg(ispif);
break;
case ISPIF_STOP_IMMEDIATELY:
- rc = msm_ispif_stop_immediately(ispif, params);
+ rc = msm_ispif_stop_immediately(ispif, &pcdata->params);
msm_ispif_io_dump_reg(ispif);
break;
case ISPIF_RELEASE:
msm_ispif_reset(ispif);
msm_ispif_reset_hw(ispif);
break;
- case ISPIF_CFG2:
- rc = msm_ispif_config2(ispif, params);
- msm_ispif_io_dump_reg(ispif);
- break;
- case ISPIF_CFG_STEREO:
- msm_ispif_config_stereo(ispif, params,
- ISPIF_CALCULATE_THRESHOLD);
- break;
- default:
- pr_err("%s: invalid cfg_type\n", __func__);
- rc = -EINVAL;
- break;
- }
- return rc;
-}
-
-static long msm_ispif_cmd(struct v4l2_subdev *sd, void *arg)
-{
- long rc = 0;
- struct ispif_cfg_data *pcdata = (struct ispif_cfg_data *)arg;
- struct ispif_device *ispif =
- (struct ispif_device *)v4l2_get_subdevdata(sd);
- int i;
- struct msm_ispif_param_data_ext params;
-
- if (WARN_ON(!sd) || WARN_ON(!pcdata))
- return -EINVAL;
-
- mutex_lock(&ispif->mutex);
- switch (pcdata->cfg_type) {
- case ISPIF_ENABLE_REG_DUMP:
- /* save dump config */
- ispif->enb_dump_reg = pcdata->reg_dump;
- break;
- case ISPIF_INIT:
- rc = msm_ispif_init(ispif, pcdata->csid_version);
- msm_ispif_io_dump_reg(ispif);
- break;
case ISPIF_SET_VFE_INFO:
rc = msm_ispif_set_vfe_info(ispif, &pcdata->vfe_info);
break;
default:
- memset(&params, 0, sizeof(params));
- if (pcdata->params.num > MAX_PARAM_ENTRIES) {
- pr_err("%s: invalid num entries %u\n", __func__,
- pcdata->params.num);
- rc = -EINVAL;
- } else {
- params.num = pcdata->params.num;
- for (i = 0; i < pcdata->params.num; i++)
- memcpy(&params.entries[i],
- &pcdata->params.entries[i],
- sizeof(struct msm_ispif_params_entry));
- params.stereo_enable = 0;
- rc = msm_ispif_dispatch_cmd(pcdata->cfg_type, ispif,
- &params);
- }
+ pr_err("%s: invalid cfg_type\n", __func__);
+ rc = -EINVAL;
break;
}
mutex_unlock(&ispif->mutex);
-
return rc;
}
-
static struct v4l2_file_operations msm_ispif_v4l2_subdev_fops;
static long msm_ispif_subdev_ioctl_unlocked(struct v4l2_subdev *sd,
diff --git a/drivers/media/platform/msm/camera_v2/ispif/msm_ispif.h b/drivers/media/platform/msm/camera_v2/ispif/msm_ispif.h
index 3e6680c63ee5..61e8f1dd7aff 100644
--- a/drivers/media/platform/msm/camera_v2/ispif/msm_ispif.h
+++ b/drivers/media/platform/msm/camera_v2/ispif/msm_ispif.h
@@ -1,4 +1,4 @@
-/* Copyright (c) 2013-2017, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2013-2016, The Linux Foundation. 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
@@ -77,6 +77,5 @@ struct ispif_device {
int ispif_vdd_count;
struct regulator *vfe_vdd[ISPIF_VFE_VDD_INFO_MAX];
int vfe_vdd_count;
- int stereo_configured[VFE_MAX];
};
#endif
diff --git a/drivers/media/platform/msm/camera_v2/ispif/msm_ispif_hwreg_v1.h b/drivers/media/platform/msm/camera_v2/ispif/msm_ispif_hwreg_v1.h
index 49d7d0f7624e..d488ca618537 100644
--- a/drivers/media/platform/msm/camera_v2/ispif/msm_ispif_hwreg_v1.h
+++ b/drivers/media/platform/msm/camera_v2/ispif/msm_ispif_hwreg_v1.h
@@ -87,12 +87,6 @@
#define MISC_LOGIC_RST_STB BIT(1)
#define STROBED_RST_EN BIT(0)
-#define VFE_PIX_INTF_SEL_3D 0x3
-#define PIX_OUTPUT_0_MISR_RST_STB BIT(16)
-#define L_R_SOF_MISMATCH_ERR_IRQ BIT(16)
-#define L_R_EOF_MISMATCH_ERR_IRQ BIT(17)
-#define L_R_SOL_MISMATCH_ERR_IRQ BIT(18)
-
#define ISPIF_RST_CMD_MASK 0xFE1C77FF
#define ISPIF_RST_CMD_1_MASK 0xFFFFFFFF /* undefined */
diff --git a/drivers/media/platform/msm/camera_v2/ispif/msm_ispif_hwreg_v2.h b/drivers/media/platform/msm/camera_v2/ispif/msm_ispif_hwreg_v2.h
index 9abf55efc46c..8ae61dc2d4f6 100644
--- a/drivers/media/platform/msm/camera_v2/ispif/msm_ispif_hwreg_v2.h
+++ b/drivers/media/platform/msm/camera_v2/ispif/msm_ispif_hwreg_v2.h
@@ -22,7 +22,6 @@
#define ISPIF_VFE(m) ((m) * 0x200)
#define ISPIF_VFE_m_CTRL_0(m) (0x200 + ISPIF_VFE(m))
-#define ISPIF_VFE_m_CTRL_1(m) (0x204 + ISPIF_VFE(m))
#define ISPIF_VFE_m_IRQ_MASK_0(m) (0x208 + ISPIF_VFE(m))
#define ISPIF_VFE_m_IRQ_MASK_1(m) (0x20C + ISPIF_VFE(m))
#define ISPIF_VFE_m_IRQ_MASK_2(m) (0x210 + ISPIF_VFE(m))
@@ -72,12 +71,6 @@
#define MISC_LOGIC_RST_STB BIT(1)
#define STROBED_RST_EN BIT(0)
-#define VFE_PIX_INTF_SEL_3D 0x3
-#define PIX_OUTPUT_0_MISR_RST_STB BIT(16)
-#define L_R_SOF_MISMATCH_ERR_IRQ BIT(16)
-#define L_R_EOF_MISMATCH_ERR_IRQ BIT(17)
-#define L_R_SOL_MISMATCH_ERR_IRQ BIT(18)
-
#define ISPIF_RST_CMD_MASK 0xFE0F1FFF
#define ISPIF_RST_CMD_1_MASK 0xFC0F1FF9
@@ -85,7 +78,6 @@
#define ISPIF_RST_CMD_1_MASK_RESTART 0x00001FF9
#define PIX_INTF_0_OVERFLOW_IRQ BIT(12)
-#define PIX_INTF_1_OVERFLOW_IRQ BIT(12)
#define RAW_INTF_0_OVERFLOW_IRQ BIT(25)
#define RAW_INTF_1_OVERFLOW_IRQ BIT(25)
#define RAW_INTF_2_OVERFLOW_IRQ BIT(12)
diff --git a/drivers/media/platform/msm/camera_v2/ispif/msm_ispif_hwreg_v3.h b/drivers/media/platform/msm/camera_v2/ispif/msm_ispif_hwreg_v3.h
index 5f2aa06f3e13..94cc974441ee 100644
--- a/drivers/media/platform/msm/camera_v2/ispif/msm_ispif_hwreg_v3.h
+++ b/drivers/media/platform/msm/camera_v2/ispif/msm_ispif_hwreg_v3.h
@@ -74,12 +74,6 @@
#define MISC_LOGIC_RST_STB BIT(1)
#define STROBED_RST_EN BIT(0)
-#define VFE_PIX_INTF_SEL_3D 0x3
-#define PIX_OUTPUT_0_MISR_RST_STB BIT(16)
-#define L_R_SOF_MISMATCH_ERR_IRQ BIT(16)
-#define L_R_EOF_MISMATCH_ERR_IRQ BIT(17)
-#define L_R_SOL_MISMATCH_ERR_IRQ BIT(18)
-
#define ISPIF_RST_CMD_MASK 0xFE7F1FFF
#define ISPIF_RST_CMD_1_MASK 0xFC7F1FF9
@@ -87,7 +81,6 @@
#define ISPIF_RST_CMD_1_MASK_RESTART 0x7F1FF9
#define PIX_INTF_0_OVERFLOW_IRQ BIT(12)
-#define PIX_INTF_1_OVERFLOW_IRQ BIT(12)
#define RAW_INTF_0_OVERFLOW_IRQ BIT(25)
#define RAW_INTF_1_OVERFLOW_IRQ BIT(25)
#define RAW_INTF_2_OVERFLOW_IRQ BIT(12)
diff --git a/drivers/media/platform/msm/camera_v2/msm_buf_mgr/msm_generic_buf_mgr.c b/drivers/media/platform/msm/camera_v2/msm_buf_mgr/msm_generic_buf_mgr.c
index bf5296e6d071..f29a3d6f30c2 100644
--- a/drivers/media/platform/msm/camera_v2/msm_buf_mgr/msm_generic_buf_mgr.c
+++ b/drivers/media/platform/msm/camera_v2/msm_buf_mgr/msm_generic_buf_mgr.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2013-2018, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2013-2017, The Linux Foundation. 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
@@ -166,33 +166,6 @@ static int32_t msm_buf_mngr_buf_done(struct msm_buf_mngr_device *buf_mngr_dev,
return ret;
}
-static int32_t msm_buf_mngr_buf_error(struct msm_buf_mngr_device *buf_mngr_dev,
- struct msm_buf_mngr_info *buf_info)
-{
- unsigned long flags;
- struct msm_get_bufs *bufs, *save;
- int32_t ret = -EINVAL;
-
- spin_lock_irqsave(&buf_mngr_dev->buf_q_spinlock, flags);
- list_for_each_entry_safe(bufs, save, &buf_mngr_dev->buf_qhead, entry) {
- if ((bufs->session_id == buf_info->session_id) &&
- (bufs->stream_id == buf_info->stream_id) &&
- (bufs->index == buf_info->index)) {
- ret = buf_mngr_dev->vb2_ops.buf_error
- (bufs->vb2_v4l2_buf,
- buf_info->session_id,
- buf_info->stream_id,
- buf_info->frame_id,
- &buf_info->timestamp,
- buf_info->reserved);
- list_del_init(&bufs->entry);
- kfree(bufs);
- break;
- }
- }
- spin_unlock_irqrestore(&buf_mngr_dev->buf_q_spinlock, flags);
- return ret;
-}
static int32_t msm_buf_mngr_put_buf(struct msm_buf_mngr_device *buf_mngr_dev,
struct msm_buf_mngr_info *buf_info)
@@ -500,9 +473,6 @@ int msm_cam_buf_mgr_ops(unsigned int cmd, void *argp)
case VIDIOC_MSM_BUF_MNGR_BUF_DONE:
rc = msm_buf_mngr_buf_done(msm_buf_mngr_dev, argp);
break;
- case VIDIOC_MSM_BUF_MNGR_BUF_ERROR:
- rc = msm_buf_mngr_buf_error(msm_buf_mngr_dev, argp);
- break;
case VIDIOC_MSM_BUF_MNGR_PUT_BUF:
rc = msm_buf_mngr_put_buf(msm_buf_mngr_dev, argp);
break;
@@ -599,7 +569,6 @@ static long msm_buf_mngr_subdev_ioctl(struct v4l2_subdev *sd,
case VIDIOC_MSM_BUF_MNGR_GET_BUF:
case VIDIOC_MSM_BUF_MNGR_BUF_DONE:
case VIDIOC_MSM_BUF_MNGR_PUT_BUF:
- case VIDIOC_MSM_BUF_MNGR_BUF_ERROR:
rc = msm_cam_buf_mgr_ops(cmd, argp);
break;
case VIDIOC_MSM_BUF_MNGR_INIT:
@@ -748,9 +717,6 @@ static long msm_bmgr_subdev_fops_compat_ioctl(struct file *file,
case VIDIOC_MSM_BUF_MNGR_BUF_DONE32:
cmd = VIDIOC_MSM_BUF_MNGR_BUF_DONE;
break;
- case VIDIOC_MSM_BUF_MNGR_BUF_ERROR32:
- cmd = VIDIOC_MSM_BUF_MNGR_BUF_ERROR;
- break;
case VIDIOC_MSM_BUF_MNGR_PUT_BUF32:
cmd = VIDIOC_MSM_BUF_MNGR_PUT_BUF;
break;
@@ -769,7 +735,6 @@ static long msm_bmgr_subdev_fops_compat_ioctl(struct file *file,
switch (cmd) {
case VIDIOC_MSM_BUF_MNGR_GET_BUF:
case VIDIOC_MSM_BUF_MNGR_BUF_DONE:
- case VIDIOC_MSM_BUF_MNGR_BUF_ERROR:
case VIDIOC_MSM_BUF_MNGR_FLUSH:
case VIDIOC_MSM_BUF_MNGR_PUT_BUF: {
struct msm_buf_mngr_info32_t buf_info32;
diff --git a/drivers/media/platform/msm/camera_v2/msm_sd.h b/drivers/media/platform/msm/camera_v2/msm_sd.h
index 3d5d3e03632e..d893d9fc07e3 100644
--- a/drivers/media/platform/msm/camera_v2/msm_sd.h
+++ b/drivers/media/platform/msm/camera_v2/msm_sd.h
@@ -1,4 +1,4 @@
-/* Copyright (c) 2012-2016, 2018 The Linux Foundation. All rights reserved.
+/* Copyright (c) 2012-2016, The Linux Foundation. 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
@@ -81,9 +81,6 @@ struct msm_sd_req_vb2_q {
unsigned int stream_id, uint32_t sequence, struct timeval *ts,
uint32_t reserved);
int (*flush_buf)(int session_id, unsigned int stream_id);
- int (*buf_error)(struct vb2_v4l2_buffer *vb2_v4l2_buf, int session_id,
- unsigned int stream_id, uint32_t sequence, struct timeval *ts,
- uint32_t reserved);
};
#define MSM_SD_NOTIFY_GET_SD 0x00000001
diff --git a/drivers/media/platform/msm/camera_v2/msm_vb2/msm_vb2.c b/drivers/media/platform/msm/camera_v2/msm_vb2/msm_vb2.c
index 5943d57812f0..a1a5f24a71b3 100644
--- a/drivers/media/platform/msm/camera_v2/msm_vb2/msm_vb2.c
+++ b/drivers/media/platform/msm/camera_v2/msm_vb2/msm_vb2.c
@@ -465,67 +465,6 @@ static int msm_vb2_buf_done(struct vb2_v4l2_buffer *vb, int session_id,
return rc;
}
-static int msm_vb2_buf_error(struct vb2_v4l2_buffer *vb, int session_id,
- unsigned int stream_id, uint32_t sequence,
- struct timeval *ts, uint32_t buf_type)
-{
- unsigned long flags, rl_flags;
- struct msm_vb2_buffer *msm_vb2;
- struct msm_stream *stream;
- struct msm_session *session;
- struct vb2_v4l2_buffer *vb2_v4l2_buf = NULL;
- int rc = 0;
-
- session = msm_get_session(session_id);
- if (IS_ERR_OR_NULL(session))
- return -EINVAL;
-
- read_lock_irqsave(&session->stream_rwlock, rl_flags);
-
- stream = msm_get_stream(session, stream_id);
- if (IS_ERR_OR_NULL(stream)) {
- read_unlock_irqrestore(&session->stream_rwlock, rl_flags);
- return -EINVAL;
- }
-
- spin_lock_irqsave(&stream->stream_lock, flags);
- if (vb) {
- list_for_each_entry(msm_vb2, &(stream->queued_list), list) {
- vb2_v4l2_buf = &(msm_vb2->vb2_v4l2_buf);
- if (vb2_v4l2_buf == vb)
- break;
- }
- if (vb2_v4l2_buf != vb) {
- pr_err("VB buffer is INVALID ses_id=%d, str_id=%d, vb=%pK\n",
- session_id, stream_id, vb);
- spin_unlock_irqrestore(&stream->stream_lock, flags);
- read_unlock_irqrestore(&session->stream_rwlock,
- rl_flags);
- return -EINVAL;
- }
- msm_vb2 =
- container_of(vb2_v4l2_buf, struct msm_vb2_buffer,
- vb2_v4l2_buf);
- /* put buf before buf done */
- if (msm_vb2->in_freeq) {
- vb2_v4l2_buf->sequence = sequence;
- vb2_v4l2_buf->timestamp = *ts;
- vb2_buffer_done(&vb2_v4l2_buf->vb2_buf,
- VB2_BUF_STATE_ERROR);
- msm_vb2->in_freeq = 0;
- rc = 0;
- } else
- rc = -EINVAL;
- } else {
- pr_err(" VB buffer is NULL for ses_id=%d, str_id=%d\n",
- session_id, stream_id);
- rc = -EINVAL;
- }
- spin_unlock_irqrestore(&stream->stream_lock, flags);
- read_unlock_irqrestore(&session->stream_rwlock, rl_flags);
- return rc;
-}
-
long msm_vb2_return_buf_by_idx(int session_id, unsigned int stream_id,
uint32_t index)
{
@@ -624,7 +563,6 @@ int msm_vb2_request_cb(struct msm_sd_req_vb2_q *req)
req->put_buf = msm_vb2_put_buf;
req->buf_done = msm_vb2_buf_done;
req->flush_buf = msm_vb2_flush_buf;
- req->buf_error = msm_vb2_buf_error;
return 0;
}
diff --git a/drivers/media/platform/msm/camera_v2/pproc/cpp/Makefile b/drivers/media/platform/msm/camera_v2/pproc/cpp/Makefile
index 2198352143f7..56880f4d5676 100644
--- a/drivers/media/platform/msm/camera_v2/pproc/cpp/Makefile
+++ b/drivers/media/platform/msm/camera_v2/pproc/cpp/Makefile
@@ -2,5 +2,4 @@ ccflags-y += -Idrivers/media/platform/msm/camera_v2
ccflags-y += -Idrivers/media/platform/msm/camera_v2/isp/
ccflags-y += -Idrivers/media/platform/msm/camera_v2/sensor/io
ccflags-y += -Idrivers/media/platform/msm/camera_v2/common
-ccflags-y += -Idrivers/media/platform/msm/camera_v2/msm_buf_mgr/
obj-$(CONFIG_MSM_CPP) += msm_cpp_soc.o msm_cpp.o
diff --git a/drivers/media/platform/msm/camera_v2/pproc/cpp/msm_cpp.c b/drivers/media/platform/msm/camera_v2/pproc/cpp/msm_cpp.c
index 48b7488cd233..072a91c51f6f 100644
--- a/drivers/media/platform/msm/camera_v2/pproc/cpp/msm_cpp.c
+++ b/drivers/media/platform/msm/camera_v2/pproc/cpp/msm_cpp.c
@@ -86,27 +86,9 @@
iden = swap_iden; \
}
-#define SWAP_BUF_INDEX_FOR_BATCH_ON_PREVIEW(new_frame, buff_mgr_info, \
- cur_index, swap_index) { \
- if (IS_BATCH_BUFFER_ON_PREVIEW(new_frame)) \
- buff_mgr_info.index = swap_index; \
- else \
- buff_mgr_info.index = cur_index; \
-}
-
-/*
- * Default value for get buf to be used - 0xFFFFFFFF
- * 0 is a valid index
- * no valid index from userspace, use last buffer from queue.
- */
-#define DEFAULT_OUTPUT_BUF_INDEX 0xFFFFFFFF
-#define IS_DEFAULT_OUTPUT_BUF_INDEX(index) \
- ((index == DEFAULT_OUTPUT_BUF_INDEX) ? 1 : 0)
-
static struct msm_cpp_vbif_data cpp_vbif;
static int msm_cpp_buffer_ops(struct cpp_device *cpp_dev,
- uint32_t buff_mgr_ops, uint32_t ids, void *arg);
-
+ uint32_t buff_mgr_ops, struct msm_buf_mngr_info *buff_mgr_info);
static int msm_cpp_send_frame_to_hardware(struct cpp_device *cpp_dev,
struct msm_queue_cmd *frame_qcmd);
static int msm_cpp_send_command_to_hardware(struct cpp_device *cpp_dev,
@@ -114,8 +96,6 @@ static int msm_cpp_send_command_to_hardware(struct cpp_device *cpp_dev,
static int msm_cpp_update_gdscr_status(struct cpp_device *cpp_dev,
bool status);
-static int msm_cpp_buffer_private_ops(struct cpp_device *cpp_dev,
- uint32_t buff_mgr_ops, uint32_t id, void *arg);
static void msm_cpp_set_micro_irq_mask(struct cpp_device *cpp_dev,
uint8_t enable, uint32_t irq_mask);
static void msm_cpp_flush_queue_and_release_buffer(struct cpp_device *cpp_dev,
@@ -1126,9 +1106,12 @@ static int cpp_init_hardware(struct cpp_device *cpp_dev)
pr_err("%s: irq request fail\n", __func__);
goto req_irq_fail;
}
- rc = msm_cam_buf_mgr_register_ops(&cpp_dev->buf_mgr_ops);
+ cpp_dev->buf_mgr_subdev = msm_buf_mngr_get_subdev();
+
+ rc = msm_cpp_buffer_ops(cpp_dev,
+ VIDIOC_MSM_BUF_MNGR_INIT, NULL);
if (rc < 0) {
- pr_err("buf mngr req ops failed\n");
+ pr_err("buf mngr init failed\n");
msm_camera_unregister_irq(cpp_dev->pdev,
cpp_dev->irq, cpp_dev);
goto req_irq_fail;
@@ -1206,6 +1189,12 @@ static void cpp_release_hardware(struct cpp_device *cpp_dev)
int32_t rc;
if (cpp_dev->state != CPP_STATE_BOOT) {
+ rc = msm_cpp_buffer_ops(cpp_dev,
+ VIDIOC_MSM_BUF_MNGR_DEINIT, NULL);
+ if (rc < 0) {
+ pr_err("error in buf mngr deinit\n");
+ rc = -EINVAL;
+ }
msm_camera_unregister_irq(cpp_dev->pdev, cpp_dev->irq, cpp_dev);
tasklet_kill(&cpp_dev->cpp_tasklet);
atomic_set(&cpp_dev->irq_cnt, 0);
@@ -1623,29 +1612,12 @@ static const struct v4l2_subdev_internal_ops msm_cpp_internal_ops = {
};
static int msm_cpp_buffer_ops(struct cpp_device *cpp_dev,
- uint32_t buff_mgr_ops, uint32_t ids,
- void *arg)
+ uint32_t buff_mgr_ops, struct msm_buf_mngr_info *buff_mgr_info)
{
int rc = -EINVAL;
- switch (buff_mgr_ops) {
- case VIDIOC_MSM_BUF_MNGR_IOCTL_CMD: {
- rc = msm_cpp_buffer_private_ops(cpp_dev, buff_mgr_ops,
- ids, arg);
- break;
- }
- case VIDIOC_MSM_BUF_MNGR_PUT_BUF:
- case VIDIOC_MSM_BUF_MNGR_BUF_DONE:
- case VIDIOC_MSM_BUF_MNGR_GET_BUF:
- case VIDIOC_MSM_BUF_MNGR_BUF_ERROR:
- default: {
- struct msm_buf_mngr_info *buff_mgr_info =
- (struct msm_buf_mngr_info *)arg;
- rc = cpp_dev->buf_mgr_ops.msm_cam_buf_mgr_ops(buff_mgr_ops,
- buff_mgr_info);
- break;
- }
- }
+ rc = v4l2_subdev_call(cpp_dev->buf_mgr_subdev, core, ioctl,
+ buff_mgr_ops, buff_mgr_info);
if (rc < 0)
pr_debug("%s: line %d rc = %d\n", __func__, __LINE__, rc);
return rc;
@@ -1692,7 +1664,6 @@ static int msm_cpp_notify_frame_done(struct cpp_device *cpp_dev,
memset(&buff_mgr_info, 0,
sizeof(struct msm_buf_mngr_info));
-
buff_mgr_info.session_id = ((iden >> 16) & 0xFFFF);
buff_mgr_info.stream_id = (iden & 0xFFFF);
buff_mgr_info.frame_id = processed_frame->frame_id;
@@ -1710,7 +1681,7 @@ static int msm_cpp_notify_frame_done(struct cpp_device *cpp_dev,
if (put_buf) {
rc = msm_cpp_buffer_ops(cpp_dev,
VIDIOC_MSM_BUF_MNGR_PUT_BUF,
- 0x0, &buff_mgr_info);
+ &buff_mgr_info);
if (rc < 0) {
pr_err("error putting buffer\n");
rc = -EINVAL;
@@ -1718,7 +1689,7 @@ static int msm_cpp_notify_frame_done(struct cpp_device *cpp_dev,
} else {
rc = msm_cpp_buffer_ops(cpp_dev,
VIDIOC_MSM_BUF_MNGR_BUF_DONE,
- 0x0, &buff_mgr_info);
+ &buff_mgr_info);
if (rc < 0) {
pr_err("error putting buffer\n");
rc = -EINVAL;
@@ -1737,7 +1708,6 @@ static int msm_cpp_notify_frame_done(struct cpp_device *cpp_dev,
memset(&buff_mgr_info, 0,
sizeof(struct msm_buf_mngr_info));
-
buff_mgr_info.session_id = ((iden >> 16) & 0xFFFF);
buff_mgr_info.stream_id = (iden & 0xFFFF);
buff_mgr_info.frame_id = processed_frame->frame_id;
@@ -1747,7 +1717,7 @@ static int msm_cpp_notify_frame_done(struct cpp_device *cpp_dev,
if (put_buf) {
rc = msm_cpp_buffer_ops(cpp_dev,
VIDIOC_MSM_BUF_MNGR_PUT_BUF,
- 0x0, &buff_mgr_info);
+ &buff_mgr_info);
if (rc < 0) {
pr_err("error putting buffer\n");
rc = -EINVAL;
@@ -1755,7 +1725,7 @@ static int msm_cpp_notify_frame_done(struct cpp_device *cpp_dev,
} else {
rc = msm_cpp_buffer_ops(cpp_dev,
VIDIOC_MSM_BUF_MNGR_BUF_DONE,
- 0x0, &buff_mgr_info);
+ &buff_mgr_info);
if (rc < 0) {
pr_err("error putting buffer\n");
rc = -EINVAL;
@@ -2623,8 +2593,6 @@ static int msm_cpp_cfg_frame(struct cpp_device *cpp_dev,
uint8_t tnr_enabled;
enum msm_camera_buf_mngr_buf_type buf_type =
MSM_CAMERA_BUF_MNGR_BUF_PLANAR;
- uint32_t ioctl_cmd, idx;
- uint32_t op_index, dup_index;
stripe_base = cpp_dev->payload_params.stripe_base;
stripe_size = cpp_dev->payload_params.stripe_size;
@@ -2714,12 +2682,8 @@ static int msm_cpp_cfg_frame(struct cpp_device *cpp_dev,
goto frame_msg_err;
}
- op_index = new_frame->output_buffer_info[0].index;
- dup_index = new_frame->duplicate_buffer_info.index;
-
if (new_frame->we_disable == 0) {
int32_t iden = new_frame->identity;
-
if ((new_frame->output_buffer_info[0].native_buff == 0) &&
(new_frame->first_payload)) {
memset(&buff_mgr_info, 0,
@@ -2732,32 +2696,16 @@ static int msm_cpp_cfg_frame(struct cpp_device *cpp_dev,
SWAP_IDENTITY_FOR_BATCH_ON_PREVIEW(new_frame,
iden, new_frame->duplicate_identity);
- /*
- * Swap the input buffer index for batch mode with
- * buffer on preview
- */
- SWAP_BUF_INDEX_FOR_BATCH_ON_PREVIEW(new_frame,
- buff_mgr_info, op_index, dup_index);
-
buff_mgr_info.session_id = ((iden >> 16) & 0xFFFF);
buff_mgr_info.stream_id = (iden & 0xFFFF);
buff_mgr_info.type = buf_type;
-
- if (IS_DEFAULT_OUTPUT_BUF_INDEX(buff_mgr_info.index)) {
- ioctl_cmd = VIDIOC_MSM_BUF_MNGR_GET_BUF;
- idx = 0x0;
- } else {
- ioctl_cmd = VIDIOC_MSM_BUF_MNGR_IOCTL_CMD;
- idx =
- MSM_CAMERA_BUF_MNGR_IOCTL_ID_GET_BUF_BY_IDX;
- }
rc = msm_cpp_buffer_ops(cpp_dev,
- ioctl_cmd, idx, &buff_mgr_info);
+ VIDIOC_MSM_BUF_MNGR_GET_BUF,
+ &buff_mgr_info);
if (rc < 0) {
rc = -EAGAIN;
- pr_debug("%s:get_buf err rc:%d, index %d\n",
- __func__, rc,
- new_frame->output_buffer_info[0].index);
+ pr_debug("%s: error getting buffer rc:%d\n",
+ __func__, rc);
goto frame_msg_err;
}
num_output_bufs =
@@ -2796,32 +2744,16 @@ static int msm_cpp_cfg_frame(struct cpp_device *cpp_dev,
iden, new_frame->identity);
memset(&dup_buff_mgr_info, 0, sizeof(struct msm_buf_mngr_info));
-
- /*
- * Swap the input buffer index for batch mode with
- * buffer on preview
- */
- SWAP_BUF_INDEX_FOR_BATCH_ON_PREVIEW(new_frame,
- dup_buff_mgr_info, dup_index, op_index);
-
dup_buff_mgr_info.session_id = ((iden >> 16) & 0xFFFF);
dup_buff_mgr_info.stream_id = (iden & 0xFFFF);
dup_buff_mgr_info.type =
MSM_CAMERA_BUF_MNGR_BUF_PLANAR;
- if (IS_DEFAULT_OUTPUT_BUF_INDEX(dup_buff_mgr_info.index)) {
- ioctl_cmd = VIDIOC_MSM_BUF_MNGR_GET_BUF;
- idx = 0x0;
- } else {
- ioctl_cmd = VIDIOC_MSM_BUF_MNGR_IOCTL_CMD;
- idx = MSM_CAMERA_BUF_MNGR_IOCTL_ID_GET_BUF_BY_IDX;
- }
- rc = msm_cpp_buffer_ops(cpp_dev, ioctl_cmd, idx,
+ rc = msm_cpp_buffer_ops(cpp_dev, VIDIOC_MSM_BUF_MNGR_GET_BUF,
&dup_buff_mgr_info);
if (rc < 0) {
rc = -EAGAIN;
- pr_debug("%s: get_buf err rc:%d, index %d\n",
- __func__, rc,
- new_frame->duplicate_buffer_info.index);
+ pr_debug("%s: error getting buffer rc:%d\n",
+ __func__, rc);
goto phyaddr_err;
}
new_frame->duplicate_buffer_info.index =
@@ -2835,7 +2767,7 @@ static int msm_cpp_cfg_frame(struct cpp_device *cpp_dev,
pr_err("error gettting output physical address\n");
rc = -EINVAL;
msm_cpp_buffer_ops(cpp_dev, VIDIOC_MSM_BUF_MNGR_PUT_BUF,
- 0x0, &dup_buff_mgr_info);
+ &dup_buff_mgr_info);
goto phyaddr_err;
}
/* set duplicate enable bit */
@@ -2913,7 +2845,7 @@ qcmd_err:
phyaddr_err:
if (new_frame->output_buffer_info[0].native_buff == 0)
msm_cpp_buffer_ops(cpp_dev, VIDIOC_MSM_BUF_MNGR_PUT_BUF,
- 0x0, &buff_mgr_info);
+ &buff_mgr_info);
frame_msg_err:
kfree(cpp_frame_msg);
kfree(new_frame);
@@ -3583,11 +3515,11 @@ STREAM_BUFF_END:
if (queue_buf_info.is_buf_dirty) {
rc = msm_cpp_buffer_ops(cpp_dev,
VIDIOC_MSM_BUF_MNGR_PUT_BUF,
- 0x0, &queue_buf_info.buff_mgr_info);
+ &queue_buf_info.buff_mgr_info);
} else {
rc = msm_cpp_buffer_ops(cpp_dev,
VIDIOC_MSM_BUF_MNGR_BUF_DONE,
- 0x0, &queue_buf_info.buff_mgr_info);
+ &queue_buf_info.buff_mgr_info);
}
if (rc < 0) {
pr_err("error in buf done\n");
@@ -3599,7 +3531,6 @@ STREAM_BUFF_END:
case VIDIOC_MSM_CPP_POP_STREAM_BUFFER: {
struct msm_buf_mngr_info buff_mgr_info;
struct msm_cpp_frame_info_t frame_info;
- uint32_t ioctl_cmd, idx;
if (ioctl_ptr->ioctl_ptr == NULL ||
(ioctl_ptr->len !=
sizeof(struct msm_cpp_frame_info_t))) {
@@ -3619,25 +3550,16 @@ STREAM_BUFF_END:
buff_mgr_info.stream_id = (frame_info.identity & 0xFFFF);
buff_mgr_info.type =
MSM_CAMERA_BUF_MNGR_BUF_PLANAR;
- if (IS_DEFAULT_OUTPUT_BUF_INDEX(
- frame_info.output_buffer_info[0].index)) {
- ioctl_cmd = VIDIOC_MSM_BUF_MNGR_GET_BUF;
- idx = 0x0;
- } else {
- ioctl_cmd = VIDIOC_MSM_BUF_MNGR_IOCTL_CMD;
- idx = MSM_CAMERA_BUF_MNGR_IOCTL_ID_GET_BUF_BY_IDX;
- }
- rc = msm_cpp_buffer_ops(cpp_dev, ioctl_cmd, idx,
+ rc = msm_cpp_buffer_ops(cpp_dev, VIDIOC_MSM_BUF_MNGR_GET_BUF,
&buff_mgr_info);
if (rc < 0) {
rc = -EAGAIN;
- pr_err_ratelimited("POP: get_buf err rc:%d, index %d\n",
- rc, frame_info.output_buffer_info[0].index);
+ pr_err_ratelimited("error getting buffer rc:%d\n", rc);
break;
}
buff_mgr_info.frame_id = frame_info.frame_id;
- rc = msm_cpp_buffer_ops(cpp_dev, VIDIOC_MSM_BUF_MNGR_BUF_ERROR,
- 0x0, &buff_mgr_info);
+ rc = msm_cpp_buffer_ops(cpp_dev, VIDIOC_MSM_BUF_MNGR_BUF_DONE,
+ &buff_mgr_info);
if (rc < 0) {
pr_err("error in buf done\n");
rc = -EAGAIN;
@@ -4494,43 +4416,6 @@ static void msm_cpp_set_vbif_reg_values(struct cpp_device *cpp_dev)
}
}
-static int msm_cpp_buffer_private_ops(struct cpp_device *cpp_dev,
- uint32_t buff_mgr_ops, uint32_t id, void *arg) {
-
- int32_t rc = 0;
-
- switch (id) {
- case MSM_CAMERA_BUF_MNGR_IOCTL_ID_GET_BUF_BY_IDX: {
- struct msm_camera_private_ioctl_arg ioctl_arg;
- struct msm_buf_mngr_info *buff_mgr_info =
- (struct msm_buf_mngr_info *)arg;
-
- ioctl_arg.id = MSM_CAMERA_BUF_MNGR_IOCTL_ID_GET_BUF_BY_IDX;
- ioctl_arg.size = sizeof(struct msm_buf_mngr_info);
- ioctl_arg.result = 0;
- ioctl_arg.reserved = 0x0;
- ioctl_arg.ioctl_ptr = 0x0;
- MSM_CAM_GET_IOCTL_ARG_PTR(&ioctl_arg.ioctl_ptr, &buff_mgr_info,
- sizeof(void *));
- rc = cpp_dev->buf_mgr_ops.msm_cam_buf_mgr_ops(buff_mgr_ops,
- &ioctl_arg);
- /* Use VIDIOC_MSM_BUF_MNGR_GET_BUF if getbuf with indx fails */
- if (rc < 0) {
- pr_err_ratelimited("get_buf_by_idx for %d err %d,use get_buf\n",
- buff_mgr_info->index, rc);
- rc = cpp_dev->buf_mgr_ops.msm_cam_buf_mgr_ops(
- VIDIOC_MSM_BUF_MNGR_GET_BUF, buff_mgr_info);
- }
- break;
- }
- default: {
- pr_err("unsupported buffer manager ioctl\n");
- break;
- }
- }
- return rc;
-}
-
static int cpp_probe(struct platform_device *pdev)
{
struct cpp_device *cpp_dev;
diff --git a/drivers/media/platform/msm/camera_v2/pproc/cpp/msm_cpp.h b/drivers/media/platform/msm/camera_v2/pproc/cpp/msm_cpp.h
index 0f5d6759acd3..f4c09cb9f1cf 100644
--- a/drivers/media/platform/msm/camera_v2/pproc/cpp/msm_cpp.h
+++ b/drivers/media/platform/msm/camera_v2/pproc/cpp/msm_cpp.h
@@ -19,7 +19,6 @@
#include <linux/platform_device.h>
#include <linux/interrupt.h>
#include <media/v4l2-subdev.h>
-#include "msm_generic_buf_mgr.h"
#include "msm_sd.h"
#include "cam_soc_api.h"
#include "cam_hw_ops.h"
@@ -283,7 +282,7 @@ struct cpp_device {
struct msm_cpp_buff_queue_info_t *buff_queue;
uint32_t num_buffq;
- struct msm_cam_buf_mgr_req_ops buf_mgr_ops;
+ struct v4l2_subdev *buf_mgr_subdev;
uint32_t bus_client;
uint32_t bus_idx;
diff --git a/drivers/media/platform/msm/camera_v2/sensor/Makefile b/drivers/media/platform/msm/camera_v2/sensor/Makefile
index b04560fe42bc..872dc59d218e 100644
--- a/drivers/media/platform/msm/camera_v2/sensor/Makefile
+++ b/drivers/media/platform/msm/camera_v2/sensor/Makefile
@@ -5,5 +5,4 @@ ccflags-y += -Idrivers/media/platform/msm/camera_v2/camera
ccflags-y += -Idrivers/media/platform/msm/camera_v2/sensor/io
ccflags-y += -Idrivers/media/platform/msm/camera_v2/sensor/cci
obj-$(CONFIG_MSMB_CAMERA) += cci/ io/ csiphy/ csid/ actuator/ eeprom/ ois/ flash/ ir_led/ ir_cut/
-obj-$(CONFIG_MSMB_CAMERA) += laser_led/
obj-$(CONFIG_MSM_CAMERA_SENSOR) += msm_sensor_init.o msm_sensor_driver.o msm_sensor.o
diff --git a/drivers/media/platform/msm/camera_v2/sensor/actuator/msm_actuator.c b/drivers/media/platform/msm/camera_v2/sensor/actuator/msm_actuator.c
index c80f8159220d..908e3c78465a 100644
--- a/drivers/media/platform/msm/camera_v2/sensor/actuator/msm_actuator.c
+++ b/drivers/media/platform/msm/camera_v2/sensor/actuator/msm_actuator.c
@@ -111,6 +111,11 @@ static void msm_actuator_parse_i2c_params(struct msm_actuator_ctrl_t *a_ctrl,
i2c_tbl = a_ctrl->i2c_reg_tbl;
for (i = 0; i < size; i++) {
+ /* check that the index into i2c_tbl cannot grow larger that
+ the allocated size of i2c_tbl */
+ if ((a_ctrl->total_steps + 1) < (a_ctrl->i2c_tbl_index))
+ break;
+
if (write_arr[i].reg_write_type == MSM_ACTUATOR_WRITE_DAC) {
value = (next_lens_position <<
write_arr[i].data_shift) |
@@ -121,14 +126,9 @@ static void msm_actuator_parse_i2c_params(struct msm_actuator_ctrl_t *a_ctrl,
i2c_byte1 = write_arr[i].reg_addr;
i2c_byte2 = value;
if (size != (i+1)) {
- i2c_byte2 = value & 0xFF;
+ i2c_byte2 = (value & 0xFF00) >> 8;
CDBG("byte1:0x%x, byte2:0x%x\n",
i2c_byte1, i2c_byte2);
- if (a_ctrl->i2c_tbl_index >
- a_ctrl->total_steps) {
- pr_err("failed:i2c table index out of bound\n");
- break;
- }
i2c_tbl[a_ctrl->i2c_tbl_index].
reg_addr = i2c_byte1;
i2c_tbl[a_ctrl->i2c_tbl_index].
@@ -138,7 +138,7 @@ static void msm_actuator_parse_i2c_params(struct msm_actuator_ctrl_t *a_ctrl,
a_ctrl->i2c_tbl_index++;
i++;
i2c_byte1 = write_arr[i].reg_addr;
- i2c_byte2 = (value & 0xFF00) >> 8;
+ i2c_byte2 = value & 0xFF;
}
} else {
i2c_byte1 = (value & 0xFF00) >> 8;
@@ -149,10 +149,6 @@ static void msm_actuator_parse_i2c_params(struct msm_actuator_ctrl_t *a_ctrl,
i2c_byte2 = (hw_dword & write_arr[i].hw_mask) >>
write_arr[i].hw_shift;
}
- if (a_ctrl->i2c_tbl_index > a_ctrl->total_steps) {
- pr_err("failed: i2c table index out of bound\n");
- break;
- }
CDBG("i2c_byte1:0x%x, i2c_byte2:0x%x\n", i2c_byte1, i2c_byte2);
i2c_tbl[a_ctrl->i2c_tbl_index].reg_addr = i2c_byte1;
i2c_tbl[a_ctrl->i2c_tbl_index].reg_data = i2c_byte2;
@@ -1824,6 +1820,8 @@ static int32_t msm_actuator_power_up(struct msm_actuator_ctrl_t *a_ctrl)
/* VREG needs some delay to power up */
usleep_range(2000, 3000);
a_ctrl->actuator_state = ACT_ENABLE_STATE;
+ usleep_range(12 * 1000, (12
+ * 1000) + 1000);
CDBG("Exit\n");
return rc;
@@ -2098,7 +2096,7 @@ static struct msm_actuator msm_vcm_actuator_table = {
.actuator_init_focus = msm_actuator_init_focus,
.actuator_parse_i2c_params = msm_actuator_parse_i2c_params,
.actuator_set_position = msm_actuator_set_position,
- .actuator_park_lens = msm_actuator_park_lens,
+ .actuator_park_lens = NULL, /* Do not return msm_actuator_park_lens */
},
};
diff --git a/drivers/media/platform/msm/camera_v2/sensor/cci/msm_cci.c b/drivers/media/platform/msm/camera_v2/sensor/cci/msm_cci.c
index e747d965ee3e..45a7f815259c 100644
--- a/drivers/media/platform/msm/camera_v2/sensor/cci/msm_cci.c
+++ b/drivers/media/platform/msm/camera_v2/sensor/cci/msm_cci.c
@@ -60,6 +60,8 @@
static struct v4l2_subdev *g_cci_subdev;
+static struct msm_cam_clk_info cci_clk_info[CCI_NUM_CLK_CASES][CCI_NUM_CLK_MAX];
+
static void msm_cci_dump_registers(struct cci_device *cci_dev,
enum cci_i2c_master_t master, enum cci_i2c_queue_t queue)
{
@@ -1240,7 +1242,7 @@ static uint32_t msm_cci_cycles_per_ms(unsigned long clk)
return cycles_per_us;
}
-static uint32_t *msm_cci_get_clk_rates(struct cci_device *cci_dev,
+static struct msm_cam_clk_info *msm_cci_get_clk(struct cci_device *cci_dev,
struct msm_camera_cci_ctrl *c_ctrl)
{
uint32_t j;
@@ -1265,21 +1267,21 @@ static uint32_t *msm_cci_get_clk_rates(struct cci_device *cci_dev,
"clock-names", CCI_CLK_SRC_NAME);
if (idx < 0) {
cci_dev->cycles_per_us = CYCLES_PER_MICRO_SEC_DEFAULT;
- return cci_dev->cci_clk_rates[0];
+ return &cci_clk_info[0][0];
}
if (cci_clk_src == 0) {
- clk = cci_dev->cci_clk_rates[0][idx];
+ clk = cci_clk_info[0][idx].clk_rate;
cci_dev->cycles_per_us = msm_cci_cycles_per_ms(clk);
- return cci_dev->cci_clk_rates[0];
+ return &cci_clk_info[0][0];
}
for (j = 0; j < cci_dev->num_clk_cases; j++) {
- clk = cci_dev->cci_clk_rates[j][idx];
+ clk = cci_clk_info[j][idx].clk_rate;
if (clk == cci_clk_src) {
cci_dev->cycles_per_us = msm_cci_cycles_per_ms(clk);
cci_dev->cci_clk_src = cci_clk_src;
- return cci_dev->cci_clk_rates[j];
+ return &cci_clk_info[j][0];
}
}
@@ -1312,7 +1314,7 @@ static int32_t msm_cci_init(struct v4l2_subdev *sd,
int32_t rc = 0, ret = 0;
struct cci_device *cci_dev;
enum cci_i2c_master_t master = MASTER_0;
- uint32_t *clk_rates = NULL;
+ struct msm_cam_clk_info *clk_info = NULL;
cci_dev = v4l2_get_subdevdata(sd);
if (!cci_dev || !c_ctrl) {
@@ -1407,32 +1409,24 @@ static int32_t msm_cci_init(struct v4l2_subdev *sd,
goto reg_enable_failed;
}
- clk_rates = msm_cci_get_clk_rates(cci_dev, c_ctrl);
- if (!clk_rates) {
+ clk_info = msm_cci_get_clk(cci_dev, c_ctrl);
+ if (!clk_info) {
pr_err("%s: clk enable failed\n", __func__);
goto reg_enable_failed;
}
- for (i = 0; i < cci_dev->num_clk; i++) {
- cci_dev->cci_clk_info[i].clk_rate =
- clk_rates[i];
- }
- rc = msm_camera_clk_enable(&cci_dev->pdev->dev,
- cci_dev->cci_clk_info, cci_dev->cci_clk,
- cci_dev->num_clk, true);
+ rc = msm_cam_clk_enable(&cci_dev->pdev->dev, clk_info,
+ cci_dev->cci_clk, cci_dev->num_clk, 1);
if (rc < 0) {
- pr_err("%s: clk enable failed\n", __func__);
+ CDBG("%s: clk enable failed\n", __func__);
goto reg_enable_failed;
}
-
/* Re-initialize the completion */
reinit_completion(&cci_dev->cci_master_info[master].reset_complete);
for (i = 0; i < NUM_QUEUES; i++)
reinit_completion(&cci_dev->cci_master_info[master].
report_q[i]);
- rc = msm_camera_enable_irq(cci_dev->irq, true);
- if (rc < 0)
- pr_err("%s: irq enable failed\n", __func__);
+ enable_irq(cci_dev->irq->start);
cci_dev->hw_version = msm_camera_io_r_mb(cci_dev->base +
CCI_HW_VERSION_ADDR);
pr_info("%s:%d: hw_version = 0x%x\n", __func__, __LINE__,
@@ -1510,9 +1504,9 @@ static int32_t msm_cci_init(struct v4l2_subdev *sd,
return 0;
reset_complete_failed:
- msm_camera_enable_irq(cci_dev->irq, false);
- msm_camera_clk_enable(&cci_dev->pdev->dev, cci_dev->cci_clk_info,
- cci_dev->cci_clk, cci_dev->num_clk, false);
+ disable_irq(cci_dev->irq->start);
+ msm_cam_clk_enable(&cci_dev->pdev->dev, clk_info,
+ cci_dev->cci_clk, cci_dev->num_clk, 0);
reg_enable_failed:
msm_camera_config_vreg(&cci_dev->pdev->dev, cci_dev->cci_vreg,
cci_dev->regulator_count, NULL, 0, &cci_dev->cci_reg_ptr[0], 0);
@@ -1555,9 +1549,9 @@ static int32_t msm_cci_release(struct v4l2_subdev *sd)
if (cci_dev->write_wq[i])
flush_workqueue(cci_dev->write_wq[i]);
- msm_camera_enable_irq(cci_dev->irq, false);
- msm_camera_clk_enable(&cci_dev->pdev->dev, cci_dev->cci_clk_info,
- cci_dev->cci_clk, cci_dev->num_clk, false);
+ disable_irq(cci_dev->irq->start);
+ msm_cam_clk_enable(&cci_dev->pdev->dev, &cci_clk_info[0][0],
+ cci_dev->cci_clk, cci_dev->num_clk, 0);
rc = msm_camera_enable_vreg(&cci_dev->pdev->dev, cci_dev->cci_vreg,
cci_dev->regulator_count, NULL, 0, &cci_dev->cci_reg_ptr[0], 0);
@@ -2074,6 +2068,75 @@ struct v4l2_subdev *msm_cci_get_subdev(void)
return g_cci_subdev;
}
+static int msm_cci_get_clk_info(struct cci_device *cci_dev,
+ struct platform_device *pdev)
+{
+ uint32_t count;
+ uint32_t count_r;
+ int i, j, rc;
+ const uint32_t *p;
+ int index = 0;
+
+ struct device_node *of_node;
+ of_node = pdev->dev.of_node;
+
+ count = of_property_count_strings(of_node, "clock-names");
+ cci_dev->num_clk = count;
+
+ CDBG("%s: count = %d\n", __func__, count);
+ if (count == 0) {
+ pr_err("%s: no clocks found in device tree, count=%d",
+ __func__, count);
+ return 0;
+ }
+
+ if (count > CCI_NUM_CLK_MAX) {
+ pr_err("%s: invalid count=%d, max is %d\n", __func__,
+ count, CCI_NUM_CLK_MAX);
+ return -EINVAL;
+ }
+
+ p = of_get_property(of_node, "qcom,clock-rates", &count_r);
+ if (!p || !count_r) {
+ pr_err("failed\n");
+ return -EINVAL;
+ }
+
+ count_r /= sizeof(uint32_t);
+ cci_dev->num_clk_cases = count_r/count;
+
+ if (cci_dev->num_clk_cases > CCI_NUM_CLK_CASES) {
+ pr_err("%s: invalid count=%d, max is %d\n", __func__,
+ cci_dev->num_clk_cases, CCI_NUM_CLK_CASES);
+ return -EINVAL;
+ }
+
+ index = 0;
+ for (i = 0; i < count_r/count; i++) {
+ for (j = 0; j < count; j++) {
+ rc = of_property_read_string_index(of_node,
+ "clock-names", j,
+ &(cci_clk_info[i][j].clk_name));
+ CDBG("%s: clock-names[%d][%d] = %s\n", __func__,
+ i, j, cci_clk_info[i][j].clk_name);
+ if (rc < 0) {
+ pr_err("%s:%d, failed\n", __func__, __LINE__);
+ return rc;
+ }
+
+ cci_clk_info[i][j].clk_rate =
+ (be32_to_cpu(p[index]) == 0) ?
+ (long)-1 : be32_to_cpu(p[index]);
+ CDBG("%s: clk_rate[%d][%d] = %ld\n", __func__, i, j,
+ cci_clk_info[i][j].clk_rate);
+ index++;
+ }
+ }
+ return 0;
+}
+
+
+
static int msm_cci_probe(struct platform_device *pdev)
{
struct cci_device *new_cci_dev;
@@ -2095,10 +2158,7 @@ static int msm_cci_probe(struct platform_device *pdev)
of_property_read_u32((&pdev->dev)->of_node,
"cell-index", &pdev->id);
- rc = msm_camera_get_clk_info_and_rates(pdev,
- &new_cci_dev->cci_clk_info, &new_cci_dev->cci_clk,
- &new_cci_dev->cci_clk_rates, &new_cci_dev->num_clk_cases,
- &new_cci_dev->num_clk);
+ rc = msm_cci_get_clk_info(new_cci_dev, pdev);
if (rc < 0) {
pr_err("%s: msm_cci_get_clk_info() failed", __func__);
kfree(new_cci_dev);
@@ -2106,13 +2166,15 @@ static int msm_cci_probe(struct platform_device *pdev)
}
new_cci_dev->ref_count = 0;
- new_cci_dev->base = msm_camera_get_reg_base(pdev, "cci", true);
- if (!new_cci_dev->base) {
+ new_cci_dev->mem = platform_get_resource_byname(pdev,
+ IORESOURCE_MEM, "cci");
+ if (!new_cci_dev->mem) {
pr_err("%s: no mem resource?\n", __func__);
rc = -ENODEV;
goto cci_no_resource;
}
- new_cci_dev->irq = msm_camera_get_irq(pdev, "cci");
+ new_cci_dev->irq = platform_get_resource_byname(pdev,
+ IORESOURCE_IRQ, "cci");
if (!new_cci_dev->irq) {
pr_err("%s: no irq resource?\n", __func__);
rc = -ENODEV;
@@ -2122,15 +2184,29 @@ static int msm_cci_probe(struct platform_device *pdev)
__LINE__,
(int) new_cci_dev->irq->start,
(int) new_cci_dev->irq->end);
- rc = msm_camera_register_irq(pdev, new_cci_dev->irq,
- msm_cci_irq, IRQF_TRIGGER_RISING, "cci", new_cci_dev);
+ new_cci_dev->io = request_mem_region(new_cci_dev->mem->start,
+ resource_size(new_cci_dev->mem), pdev->name);
+ if (!new_cci_dev->io) {
+ pr_err("%s: no valid mem region\n", __func__);
+ rc = -EBUSY;
+ goto cci_no_resource;
+ }
+
+ new_cci_dev->base = ioremap(new_cci_dev->mem->start,
+ resource_size(new_cci_dev->mem));
+ if (!new_cci_dev->base) {
+ rc = -ENOMEM;
+ goto cci_release_mem;
+ }
+ rc = request_irq(new_cci_dev->irq->start, msm_cci_irq,
+ IRQF_TRIGGER_RISING, "cci", new_cci_dev);
if (rc < 0) {
pr_err("%s: irq request fail\n", __func__);
rc = -EBUSY;
goto cci_release_mem;
}
- msm_camera_enable_irq(new_cci_dev->irq, false);
+ disable_irq(new_cci_dev->irq->start);
new_cci_dev->msm_sd.close_seq = MSM_SD_CLOSE_2ND_CATEGORY | 0x6;
msm_sd_register(&new_cci_dev->msm_sd);
new_cci_dev->pdev = pdev;
@@ -2172,7 +2248,8 @@ static int msm_cci_probe(struct platform_device *pdev)
cci_invalid_vreg_data:
kfree(new_cci_dev->cci_vreg);
cci_release_mem:
- msm_camera_put_reg_base(pdev, new_cci_dev->base, "cci", true);
+ release_mem_region(new_cci_dev->mem->start,
+ resource_size(new_cci_dev->mem));
cci_no_resource:
kfree(new_cci_dev);
return rc;
@@ -2183,13 +2260,7 @@ static int msm_cci_exit(struct platform_device *pdev)
struct v4l2_subdev *subdev = platform_get_drvdata(pdev);
struct cci_device *cci_dev =
v4l2_get_subdevdata(subdev);
-
- msm_camera_put_clk_info_and_rates(pdev,
- &cci_dev->cci_clk_info, &cci_dev->cci_clk,
- &cci_dev->cci_clk_rates, cci_dev->num_clk_cases,
- cci_dev->num_clk);
-
- msm_camera_put_reg_base(pdev, cci_dev->base, "cci", true);
+ release_mem_region(cci_dev->mem->start, resource_size(cci_dev->mem));
kfree(cci_dev);
return 0;
}
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 eb615cc7a62c..0d230657c97b 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
@@ -21,7 +21,6 @@
#include <media/msm_cam_sensor.h>
#include <soc/qcom/camera2.h>
#include "msm_sd.h"
-#include "cam_soc_api.h"
#define NUM_MASTERS 2
#define NUM_QUEUES 2
@@ -151,17 +150,18 @@ struct cci_device {
struct platform_device *pdev;
struct msm_sd_subdev msm_sd;
struct v4l2_subdev subdev;
+ struct resource *mem;
struct resource *irq;
+ struct resource *io;
void __iomem *base;
uint32_t hw_version;
uint8_t ref_count;
enum msm_cci_state_t cci_state;
- size_t num_clk;
- size_t num_clk_cases;
- struct clk **cci_clk;
- uint32_t **cci_clk_rates;
- struct msm_cam_clk_info *cci_clk_info;
+ uint32_t num_clk;
+ uint32_t num_clk_cases;
+
+ struct clk *cci_clk[CCI_NUM_CLK_MAX];
struct msm_camera_cci_i2c_queue_info
cci_i2c_queue_info[NUM_MASTERS][NUM_QUEUES];
struct msm_camera_cci_master_info cci_master_info[NUM_MASTERS];
diff --git a/drivers/media/platform/msm/camera_v2/sensor/csid/msm_csid.c b/drivers/media/platform/msm/camera_v2/sensor/csid/msm_csid.c
index 9473fb0dc44e..283d648e0b52 100644
--- a/drivers/media/platform/msm/camera_v2/sensor/csid/msm_csid.c
+++ b/drivers/media/platform/msm/camera_v2/sensor/csid/msm_csid.c
@@ -66,10 +66,16 @@
#undef CDBG
#define CDBG(fmt, args...) pr_debug(fmt, ##args)
+static struct msm_cam_clk_info csid_clk_info[CSID_NUM_CLK_MAX];
+static struct msm_cam_clk_info csid_clk_src_info[CSID_NUM_CLK_MAX];
+
static struct camera_vreg_t csid_vreg_info[] = {
{"qcom,mipi-csi-vdd", 0, 0, 12000},
};
+static struct camera_vreg_t csid_8960_vreg_info[] = {
+ {"mipi_csi_vdd", 1200000, 1200000, 20000},
+};
#ifdef CONFIG_COMPAT
static struct v4l2_file_operations msm_csid_v4l2_subdev_fops;
#endif
@@ -261,36 +267,16 @@ static int msm_csid_reset(struct csid_device *csid_dev)
return rc;
}
-static bool msm_csid_find_max_clk_rate(struct csid_device *csid_dev)
-{
- int i;
- bool ret = FALSE;
-
- for (i = 0; i < csid_dev->num_clk; i++) {
- if (!strcmp(csid_dev->csid_clk_info[i].clk_name,
- "csi_src_clk")) {
- CDBG("%s:%d, copy csi_src_clk, clk_rate[%d] = %ld",
- __func__, __LINE__, i,
- csid_dev->csid_clk_info[i].clk_rate);
- csid_dev->csid_max_clk =
- csid_dev->csid_clk_info[i].clk_rate;
- csid_dev->csid_clk_index = i;
- ret = TRUE;
- break;
- }
- }
- return ret;
-}
static int msm_csid_config(struct csid_device *csid_dev,
struct msm_camera_csid_params *csid_params)
{
int rc = 0;
- uint32_t val = 0;
- long clk_rate = 0;
- uint32_t input_sel;
+ uint32_t val = 0, clk_rate = 0;
+ uint32_t round_rate = 0, input_sel;
uint32_t lane_assign = 0;
uint8_t lane_num = 0;
uint8_t i, j;
+ struct clk **csid_clk_ptr;
void __iomem *csidbase;
csidbase = csid_dev->base;
if (!csidbase || !csid_params) {
@@ -319,17 +305,25 @@ static int msm_csid_config(struct csid_device *csid_dev,
return rc;
}
- if (!msm_csid_find_max_clk_rate(csid_dev))
- pr_err("msm_csid_find_max_clk_rate failed\n");
+ csid_clk_ptr = csid_dev->csid_clk;
+ if (!csid_clk_ptr) {
+ pr_err("csi_src_clk get failed\n");
+ return -EINVAL;
+ }
clk_rate = (csid_params->csi_clk > 0) ?
(csid_params->csi_clk) : csid_dev->csid_max_clk;
-
- clk_rate = msm_camera_clk_set_rate(&csid_dev->pdev->dev,
- csid_dev->csid_clk[csid_dev->csid_clk_index], clk_rate);
- if (clk_rate < 0) {
+ round_rate = clk_round_rate(csid_clk_ptr[csid_dev->csid_clk_index],
+ clk_rate);
+ if (round_rate > csid_dev->csid_max_clk)
+ round_rate = csid_dev->csid_max_clk;
+ pr_debug("usr set rate csi_clk clk_rate = %u round_rate = %u\n",
+ clk_rate, round_rate);
+ rc = clk_set_rate(csid_clk_ptr[csid_dev->csid_clk_index],
+ round_rate);
+ if (rc < 0) {
pr_err("csi_src_clk set failed\n");
- return -EINVAL;
+ return rc;
}
if (csid_dev->is_testmode == 1) {
@@ -541,6 +535,14 @@ static int msm_csid_init(struct csid_device *csid_dev, uint32_t *csid_version)
return rc;
}
+ csid_dev->base = ioremap(csid_dev->mem->start,
+ resource_size(csid_dev->mem));
+ if (!csid_dev->base) {
+ pr_err("%s csid_dev->base NULL\n", __func__);
+ rc = -ENOMEM;
+ goto ioremap_fail;
+ }
+
pr_info("%s: CSID_VERSION = 0x%x\n", __func__,
csid_dev->ctrl_reg->csid_reg.csid_version);
/* power up */
@@ -552,9 +554,15 @@ static int msm_csid_init(struct csid_device *csid_dev, uint32_t *csid_version)
goto top_vreg_config_failed;
}
- rc = msm_camera_config_vreg(&csid_dev->pdev->dev,
- csid_vreg_info, ARRAY_SIZE(csid_vreg_info),
- NULL, 0, &csid_dev->csi_vdd, 1);
+ if (csid_dev->ctrl_reg->csid_reg.csid_version < CSID_VERSION_V22) {
+ rc = msm_camera_config_vreg(&csid_dev->pdev->dev,
+ csid_8960_vreg_info, ARRAY_SIZE(csid_8960_vreg_info),
+ NULL, 0, &csid_dev->csi_vdd, 1);
+ } else {
+ rc = msm_camera_config_vreg(&csid_dev->pdev->dev,
+ csid_vreg_info, ARRAY_SIZE(csid_vreg_info),
+ NULL, 0, &csid_dev->csi_vdd, 1);
+ }
if (rc < 0) {
pr_err("%s: regulator on failed\n", __func__);
goto csid_vreg_config_failed;
@@ -568,16 +576,28 @@ static int msm_csid_init(struct csid_device *csid_dev, uint32_t *csid_version)
goto top_vreg_enable_failed;
}
- rc = msm_camera_enable_vreg(&csid_dev->pdev->dev,
- csid_vreg_info, ARRAY_SIZE(csid_vreg_info),
- NULL, 0, &csid_dev->csi_vdd, 1);
+ if (csid_dev->ctrl_reg->csid_reg.csid_version < CSID_VERSION_V22) {
+ rc = msm_camera_enable_vreg(&csid_dev->pdev->dev,
+ csid_8960_vreg_info, ARRAY_SIZE(csid_8960_vreg_info),
+ NULL, 0, &csid_dev->csi_vdd, 1);
+ } else {
+ rc = msm_camera_enable_vreg(&csid_dev->pdev->dev,
+ csid_vreg_info, ARRAY_SIZE(csid_vreg_info),
+ NULL, 0, &csid_dev->csi_vdd, 1);
+ }
if (rc < 0) {
pr_err("%s: regulator enable failed\n", __func__);
goto csid_vreg_enable_failed;
}
- rc = msm_camera_clk_enable(&csid_dev->pdev->dev,
- csid_dev->csid_clk_info, csid_dev->csid_clk,
- csid_dev->num_clk, true);
+
+ if (csid_dev->ctrl_reg->csid_reg.csid_version == CSID_VERSION_V22)
+ msm_cam_clk_sel_src(&csid_dev->pdev->dev,
+ &csid_clk_info[3], csid_clk_src_info,
+ csid_dev->num_clk_src_info);
+
+ rc = msm_cam_clk_enable(&csid_dev->pdev->dev,
+ csid_clk_info, csid_dev->csid_clk,
+ csid_dev->num_clk, 1);
if (rc < 0) {
pr_err("%s:%d clock enable failed\n",
__func__, __LINE__);
@@ -596,9 +616,8 @@ static int msm_csid_init(struct csid_device *csid_dev, uint32_t *csid_version)
init_completion(&csid_dev->reset_complete);
- rc = msm_camera_enable_irq(csid_dev->irq, true);
- if (rc < 0)
- pr_err("%s: irq enable failed\n", __func__);
+ enable_irq(csid_dev->irq->start);
+
rc = msm_csid_reset(csid_dev);
if (rc < 0) {
pr_err("%s:%d msm_csid_reset failed\n", __func__, __LINE__);
@@ -609,26 +628,41 @@ static int msm_csid_init(struct csid_device *csid_dev, uint32_t *csid_version)
return rc;
msm_csid_reset_fail:
- msm_camera_enable_irq(csid_dev->irq, false);
- msm_camera_clk_enable(&csid_dev->pdev->dev, csid_dev->csid_clk_info,
- csid_dev->csid_clk, csid_dev->num_clk, false);
+ disable_irq(csid_dev->irq->start);
+ msm_cam_clk_enable(&csid_dev->pdev->dev, csid_clk_info,
+ csid_dev->csid_clk, csid_dev->num_clk, 0);
clk_enable_failed:
- msm_camera_enable_vreg(&csid_dev->pdev->dev,
- csid_vreg_info, ARRAY_SIZE(csid_vreg_info),
- NULL, 0, &csid_dev->csi_vdd, 0);
+ if (csid_dev->ctrl_reg->csid_reg.csid_version < CSID_VERSION_V22) {
+ msm_camera_enable_vreg(&csid_dev->pdev->dev,
+ csid_8960_vreg_info, ARRAY_SIZE(csid_8960_vreg_info),
+ NULL, 0, &csid_dev->csi_vdd, 0);
+ } else {
+ msm_camera_enable_vreg(&csid_dev->pdev->dev,
+ csid_vreg_info, ARRAY_SIZE(csid_vreg_info),
+ NULL, 0, &csid_dev->csi_vdd, 0);
+ }
csid_vreg_enable_failed:
msm_camera_enable_vreg(&csid_dev->pdev->dev, csid_dev->csid_vreg,
csid_dev->regulator_count, NULL, 0,
&csid_dev->csid_reg_ptr[0], 0);
top_vreg_enable_failed:
- msm_camera_config_vreg(&csid_dev->pdev->dev,
- csid_vreg_info, ARRAY_SIZE(csid_vreg_info),
- NULL, 0, &csid_dev->csi_vdd, 0);
+ if (csid_dev->ctrl_reg->csid_reg.csid_version < CSID_VERSION_V22) {
+ msm_camera_config_vreg(&csid_dev->pdev->dev,
+ csid_8960_vreg_info, ARRAY_SIZE(csid_8960_vreg_info),
+ NULL, 0, &csid_dev->csi_vdd, 0);
+ } else {
+ msm_camera_config_vreg(&csid_dev->pdev->dev,
+ csid_vreg_info, ARRAY_SIZE(csid_vreg_info),
+ NULL, 0, &csid_dev->csi_vdd, 0);
+ }
csid_vreg_config_failed:
msm_camera_config_vreg(&csid_dev->pdev->dev, csid_dev->csid_vreg,
csid_dev->regulator_count, NULL, 0,
&csid_dev->csid_reg_ptr[0], 0);
top_vreg_config_failed:
+ iounmap(csid_dev->base);
+ csid_dev->base = NULL;
+ioremap_fail:
if (cam_config_ahb_clk(NULL, 0, CAM_AHB_CLIENT_CSID,
CAM_AHB_SUSPEND_VOTE) < 0)
pr_err("%s: failed to remove vote from AHB\n", __func__);
@@ -655,34 +689,49 @@ static int msm_csid_release(struct csid_device *csid_dev)
msm_camera_io_w(0, csid_dev->base +
csid_dev->ctrl_reg->csid_reg.csid_irq_mask_addr);
- msm_camera_enable_irq(csid_dev->irq, false);
-
- msm_camera_clk_enable(&csid_dev->pdev->dev,
- csid_dev->csid_clk_info,
- csid_dev->csid_clk,
- csid_dev->num_clk, false);
-
- msm_camera_enable_vreg(&csid_dev->pdev->dev,
- csid_vreg_info, ARRAY_SIZE(csid_vreg_info),
- NULL, 0, &csid_dev->csi_vdd, 0);
+ disable_irq(csid_dev->irq->start);
- msm_camera_enable_vreg(&csid_dev->pdev->dev,
- csid_dev->csid_vreg, csid_dev->regulator_count, NULL,
- 0, &csid_dev->csid_reg_ptr[0], 0);
+ if (csid_dev->hw_version == CSID_VERSION_V20) {
+ msm_cam_clk_enable(&csid_dev->pdev->dev, csid_clk_info,
+ csid_dev->csid_clk, csid_dev->num_clk, 0);
- msm_camera_config_vreg(&csid_dev->pdev->dev,
- csid_vreg_info, ARRAY_SIZE(csid_vreg_info),
- NULL, 0, &csid_dev->csi_vdd, 0);
+ msm_camera_enable_vreg(&csid_dev->pdev->dev,
+ csid_8960_vreg_info, ARRAY_SIZE(csid_8960_vreg_info),
+ NULL, 0, &csid_dev->csi_vdd, 0);
- msm_camera_config_vreg(&csid_dev->pdev->dev,
- csid_dev->csid_vreg, csid_dev->regulator_count, NULL,
- 0, &csid_dev->csid_reg_ptr[0], 0);
+ msm_camera_config_vreg(&csid_dev->pdev->dev,
+ csid_8960_vreg_info, ARRAY_SIZE(csid_8960_vreg_info),
+ NULL, 0, &csid_dev->csi_vdd, 0);
+ } else {
+ msm_cam_clk_enable(&csid_dev->pdev->dev,
+ csid_clk_info,
+ csid_dev->csid_clk,
+ csid_dev->num_clk, 0);
+
+ msm_camera_enable_vreg(&csid_dev->pdev->dev,
+ csid_vreg_info, ARRAY_SIZE(csid_vreg_info),
+ NULL, 0, &csid_dev->csi_vdd, 0);
+
+ msm_camera_enable_vreg(&csid_dev->pdev->dev,
+ csid_dev->csid_vreg, csid_dev->regulator_count, NULL,
+ 0, &csid_dev->csid_reg_ptr[0], 0);
+
+ msm_camera_config_vreg(&csid_dev->pdev->dev,
+ csid_vreg_info, ARRAY_SIZE(csid_vreg_info),
+ NULL, 0, &csid_dev->csi_vdd, 0);
+
+ msm_camera_config_vreg(&csid_dev->pdev->dev,
+ csid_dev->csid_vreg, csid_dev->regulator_count, NULL,
+ 0, &csid_dev->csid_reg_ptr[0], 0);
+ }
if (!IS_ERR_OR_NULL(csid_dev->reg_ptr)) {
regulator_disable(csid_dev->reg_ptr);
regulator_put(csid_dev->reg_ptr);
}
+ iounmap(csid_dev->base);
+ csid_dev->base = NULL;
csid_dev->csid_state = CSID_POWER_DOWN;
if (cam_config_ahb_clk(NULL, 0, CAM_AHB_CLIENT_CSID,
@@ -1010,6 +1059,116 @@ static const struct v4l2_subdev_ops msm_csid_subdev_ops = {
.core = &msm_csid_subdev_core_ops,
};
+static int msm_csid_get_clk_info(struct csid_device *csid_dev,
+ struct platform_device *pdev)
+{
+ uint32_t count;
+ uint32_t cnt = 0;
+ int i, rc;
+ int ii = 0;
+ uint32_t rates[CSID_NUM_CLK_MAX];
+ const char *clock_name;
+ struct device_node *of_node;
+ of_node = pdev->dev.of_node;
+
+ count = of_property_count_strings(of_node, "clock-names");
+ csid_dev->num_clk = count;
+
+ CDBG("%s: count = %d\n", __func__, count);
+ if (count == 0) {
+ pr_err("%s: no clocks found in device tree, count=%d",
+ __func__, count);
+ return -EINVAL;
+ }
+
+ if (count > CSID_NUM_CLK_MAX) {
+ pr_err("%s: invalid count=%d, max is %d\n", __func__,
+ count, CSID_NUM_CLK_MAX);
+ return -EINVAL;
+ }
+
+ if (csid_dev->hw_dts_version == CSID_VERSION_V22) {
+ cnt = count;
+ count = 0;
+
+ for (i = 0; i < cnt; i++) {
+ count++;
+ rc = of_property_read_string_index(of_node,
+ "clock-names", i, &clock_name);
+ CDBG("%s: clock_names[%d] = %s\n", __func__,
+ i, clock_name);
+ if (rc < 0) {
+ pr_err("%s:%d, failed\n", __func__, __LINE__);
+ return rc;
+ }
+ if (strcmp(clock_name, "csi_phy_src_clk") == 0)
+ break;
+ }
+ csid_dev->num_clk = count;
+ }
+
+ for (i = 0; i < count; i++) {
+ rc = of_property_read_string_index(of_node, "clock-names",
+ i, &(csid_clk_info[i].clk_name));
+ CDBG("%s: clock-names[%d] = %s\n", __func__,
+ i, csid_clk_info[i].clk_name);
+ if (rc < 0) {
+ pr_err("%s:%d, failed\n", __func__, __LINE__);
+ return rc;
+ }
+ }
+ rc = of_property_read_u32_array(of_node, "qcom,clock-rates",
+ rates, count);
+ if (rc < 0) {
+ pr_err("%s:%d, failed", __func__, __LINE__);
+ return rc;
+ }
+ for (i = 0; i < count; i++) {
+ csid_clk_info[i].clk_rate = (rates[i] == 0) ?
+ (long)-1 : rates[i];
+ if (!strcmp(csid_clk_info[i].clk_name, "csi_src_clk")) {
+ CDBG("%s:%d, copy csi_src_clk",
+ __func__, __LINE__);
+ csid_dev->csid_max_clk = rates[i];
+ csid_dev->csid_clk_index = i;
+ }
+ CDBG("%s: clk_rate[%d] = %ld\n", __func__, i,
+ csid_clk_info[i].clk_rate);
+ }
+
+ if (csid_dev->hw_dts_version == CSID_VERSION_V22) {
+ csid_dev->num_clk_src_info = cnt - count;
+ CDBG("%s: count = %d\n", __func__, (cnt - count));
+
+ for (i = count; i < cnt; i++) {
+ ii++;
+ rc = of_property_read_string_index(of_node,
+ "clock-names", i,
+ &(csid_clk_src_info[ii].clk_name));
+ CDBG("%s: clock-names[%d] = %s\n", __func__,
+ ii, csid_clk_src_info[ii].clk_name);
+ if (rc < 0) {
+ pr_err("%s:%d, failed\n", __func__, __LINE__);
+ return rc;
+ }
+ }
+ ii = 0;
+ rc = of_property_read_u32_array(of_node, "qcom,clock-rates",
+ rates, cnt);
+ if (rc < 0) {
+ pr_err("%s:%d, failed", __func__, __LINE__);
+ return rc;
+ }
+ for (i = count; i < cnt; i++) {
+ ii++;
+ csid_clk_src_info[ii].clk_rate = rates[i];
+ CDBG("%s: clk_rate[%d] = %ld\n", __func__, ii,
+ csid_clk_src_info[ii].clk_rate);
+ }
+ }
+ return 0;
+}
+
static int csid_probe(struct platform_device *pdev)
{
struct csid_device *new_csid_dev;
@@ -1060,10 +1219,9 @@ static int csid_probe(struct platform_device *pdev)
csid_vreg_info[0].max_voltage = csi_vdd_voltage;
}
- rc = msm_camera_get_clk_info(pdev, &new_csid_dev->csid_clk_info,
- &new_csid_dev->csid_clk, &new_csid_dev->num_clk);
+ rc = msm_csid_get_clk_info(new_csid_dev, pdev);
if (rc < 0) {
- pr_err("%s: msm_camera_get_clk_info failed", __func__);
+ pr_err("%s: msm_csid_get_clk_info() failed", __func__);
rc = -EFAULT;
goto csid_no_resource;
}
@@ -1084,18 +1242,28 @@ static int csid_probe(struct platform_device *pdev)
goto csid_no_resource;
}
- new_csid_dev->base = msm_camera_get_reg_base(pdev, "csid", true);
- if (!new_csid_dev->base) {
+ new_csid_dev->mem = platform_get_resource_byname(pdev,
+ IORESOURCE_MEM, "csid");
+ if (!new_csid_dev->mem) {
pr_err("%s: no mem resource?\n", __func__);
rc = -ENODEV;
goto csid_invalid_vreg_data;
}
- new_csid_dev->irq = msm_camera_get_irq(pdev, "csid");
+ new_csid_dev->irq = platform_get_resource_byname(pdev,
+ IORESOURCE_IRQ, "csid");
if (!new_csid_dev->irq) {
pr_err("%s: no irq resource?\n", __func__);
rc = -ENODEV;
- goto csid_invalid_irq;
+ goto csid_invalid_vreg_data;
}
+ new_csid_dev->io = request_mem_region(new_csid_dev->mem->start,
+ resource_size(new_csid_dev->mem), pdev->name);
+ if (!new_csid_dev->io) {
+ pr_err("%s: no valid mem region\n", __func__);
+ rc = -EBUSY;
+ goto csid_invalid_vreg_data;
+ }
+
new_csid_dev->pdev = pdev;
new_csid_dev->msm_sd.sd.internal_ops = &msm_csid_internal_ops;
new_csid_dev->msm_sd.sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
@@ -1113,18 +1281,22 @@ static int csid_probe(struct platform_device *pdev)
new_csid_dev->msm_sd.sd.devnode->fops = &msm_csid_v4l2_subdev_fops;
#endif
- rc = msm_camera_register_irq(pdev, new_csid_dev->irq,
- msm_csid_irq, IRQF_TRIGGER_RISING, "csid", new_csid_dev);
+ rc = request_irq(new_csid_dev->irq->start, msm_csid_irq,
+ IRQF_TRIGGER_RISING, "csid", new_csid_dev);
if (rc < 0) {
+ release_mem_region(new_csid_dev->mem->start,
+ resource_size(new_csid_dev->mem));
pr_err("%s: irq request fail\n", __func__);
rc = -EBUSY;
- goto csid_invalid_irq;
+ goto csid_invalid_vreg_data;
}
- rc = msm_camera_enable_irq(new_csid_dev->irq, false);
+ disable_irq(new_csid_dev->irq->start);
if (rc < 0) {
+ release_mem_region(new_csid_dev->mem->start,
+ resource_size(new_csid_dev->mem));
pr_err("%s Error registering irq ", __func__);
rc = -EBUSY;
- goto csid_invalid_irq;
+ goto csid_invalid_vreg_data;
}
if (of_device_is_compatible(new_csid_dev->pdev->dev.of_node,
@@ -1203,14 +1375,12 @@ static int csid_probe(struct platform_device *pdev)
pr_err("%s:%d, invalid hw version : 0x%x", __func__, __LINE__,
new_csid_dev->hw_dts_version);
rc = -EINVAL;
- goto csid_invalid_irq;
+ goto csid_invalid_vreg_data;
}
new_csid_dev->csid_state = CSID_POWER_DOWN;
return 0;
-csid_invalid_irq:
- msm_camera_put_reg_base(pdev, new_csid_dev->base, "csid", true);
csid_invalid_vreg_data:
kfree(new_csid_dev->csid_vreg);
csid_no_resource:
@@ -1220,19 +1390,6 @@ csid_no_resource:
return rc;
}
-static int msm_csid_exit(struct platform_device *pdev)
-{
- struct v4l2_subdev *subdev = platform_get_drvdata(pdev);
- struct csid_device *csid_dev =
- v4l2_get_subdevdata(subdev);
-
- msm_camera_put_clk_info(pdev, &csid_dev->csid_clk_info,
- &csid_dev->csid_clk, csid_dev->num_clk);
- msm_camera_put_reg_base(pdev, csid_dev->base, "csid", true);
- kfree(csid_dev);
- return 0;
-}
-
static const struct of_device_id msm_csid_dt_match[] = {
{.compatible = "qcom,csid"},
{}
@@ -1242,7 +1399,6 @@ MODULE_DEVICE_TABLE(of, msm_csid_dt_match);
static struct platform_driver csid_driver = {
.probe = csid_probe,
- .remove = msm_csid_exit,
.driver = {
.name = MSM_CSID_DRV_NAME,
.owner = THIS_MODULE,
diff --git a/drivers/media/platform/msm/camera_v2/sensor/csid/msm_csid.h b/drivers/media/platform/msm/camera_v2/sensor/csid/msm_csid.h
index 8a720c8089c5..d01a99bba847 100644
--- a/drivers/media/platform/msm/camera_v2/sensor/csid/msm_csid.h
+++ b/drivers/media/platform/msm/camera_v2/sensor/csid/msm_csid.h
@@ -19,7 +19,8 @@
#include <media/v4l2-subdev.h>
#include <media/msm_cam_sensor.h>
#include "msm_sd.h"
-#include "cam_soc_api.h"
+
+#define CSID_NUM_CLK_MAX 16
#define CSID_SOF_DEBUG_COUNT 3
@@ -90,7 +91,9 @@ enum msm_csid_state_t {
struct csid_device {
struct platform_device *pdev;
struct msm_sd_subdev msm_sd;
+ struct resource *mem;
struct resource *irq;
+ struct resource *io;
struct regulator *csi_vdd;
void __iomem *base;
struct mutex mutex;
@@ -99,10 +102,10 @@ struct csid_device {
uint32_t hw_dts_version;
enum msm_csid_state_t csid_state;
struct csid_ctrl_t *ctrl_reg;
+ uint32_t num_clk;
+ uint32_t num_clk_src_info;
struct regulator *reg_ptr;
- size_t num_clk;
- struct clk **csid_clk;
- struct msm_cam_clk_info *csid_clk_info;
+ struct clk *csid_clk[CSID_NUM_CLK_MAX];
uint32_t csid_clk_index;
uint32_t csid_max_clk;
uint32_t csid_3p_enabled;
diff --git a/drivers/media/platform/msm/camera_v2/sensor/csiphy/msm_csiphy.c b/drivers/media/platform/msm/camera_v2/sensor/csiphy/msm_csiphy.c
index 4f7a62716810..ad827dcf4b02 100644
--- a/drivers/media/platform/msm/camera_v2/sensor/csiphy/msm_csiphy.c
+++ b/drivers/media/platform/msm/camera_v2/sensor/csiphy/msm_csiphy.c
@@ -769,13 +769,13 @@ static int msm_csiphy_lane_config(struct csiphy_device *csiphy_dev,
{
int rc = 0;
int j = 0, curr_lane = 0;
- uint32_t val = 0;
- long clk_rate = 0;
+ uint32_t val = 0, clk_rate = 0, round_rate = 0;
uint8_t lane_cnt = 0;
uint16_t lane_mask = 0;
void __iomem *csiphybase;
uint8_t csiphy_id = csiphy_dev->pdev->id;
int32_t lane_val = 0, lane_right = 0, num_lanes = 0;
+ struct clk **csid_phy_clk_ptr;
int ratio = 1;
csiphybase = csiphy_dev->base;
@@ -793,21 +793,33 @@ static int msm_csiphy_lane_config(struct csiphy_device *csiphy_dev,
return rc;
}
+ csid_phy_clk_ptr = csiphy_dev->csiphy_clk;
+ if (!csid_phy_clk_ptr) {
+ pr_err("csiphy_timer_src_clk get failed\n");
+ return -EINVAL;
+ }
+
clk_rate = (csiphy_params->csiphy_clk > 0)
? csiphy_params->csiphy_clk :
csiphy_dev->csiphy_max_clk;
- clk_rate = msm_camera_clk_set_rate(&csiphy_dev->pdev->dev,
- csiphy_dev->csiphy_clk[csiphy_dev->csiphy_clk_index],
- clk_rate);
- if (clk_rate < 0) {
- pr_err("csiphy_clk_set_rate failed\n");
- return -EINVAL;
+ round_rate = clk_round_rate(
+ csid_phy_clk_ptr[csiphy_dev->csiphy_clk_index],
+ clk_rate);
+ if (round_rate >= csiphy_dev->csiphy_max_clk)
+ round_rate = csiphy_dev->csiphy_max_clk;
+ else {
+ ratio = csiphy_dev->csiphy_max_clk/round_rate;
+ csiphy_params->settle_cnt = csiphy_params->settle_cnt/ratio;
}
- if (clk_rate < csiphy_dev->csiphy_max_clk &&
- clk_rate > 0) {
- ratio = csiphy_dev->csiphy_max_clk/clk_rate;
- csiphy_params->settle_cnt = csiphy_params->settle_cnt/ratio;
+ CDBG("set from usr csiphy_clk clk_rate = %u round_rate = %u\n",
+ clk_rate, round_rate);
+ rc = clk_set_rate(
+ csid_phy_clk_ptr[csiphy_dev->csiphy_clk_index],
+ round_rate);
+ if (rc < 0) {
+ pr_err("csiphy_timer_src_clk set failed\n");
+ return rc;
}
CDBG("%s csiphy_params, mask = 0x%x cnt = %d, data rate = %llu\n",
__func__,
@@ -836,12 +848,11 @@ static int msm_csiphy_lane_config(struct csiphy_device *csiphy_dev,
mb();
}
- csiphy_dev->csi_3phase = csiphy_params->csi_3phase;
if (csiphy_dev->csiphy_3phase == CSI_3PHASE_HW) {
- if (csiphy_dev->csi_3phase == 1) {
- rc = msm_camera_clk_enable(&csiphy_dev->pdev->dev,
+ if (csiphy_params->csi_3phase == 1) {
+ msm_cam_clk_enable(&csiphy_dev->pdev->dev,
csiphy_dev->csiphy_3p_clk_info,
- csiphy_dev->csiphy_3p_clk, 2, true);
+ csiphy_dev->csiphy_3p_clk, 2, 1);
if (csiphy_dev->hw_dts_version >= CSIPHY_VERSION_V50)
rc = msm_csiphy_3phase_lane_config_v50(
csiphy_dev, csiphy_params);
@@ -1101,42 +1112,57 @@ static int msm_csiphy_init(struct csiphy_device *csiphy_dev)
return rc;
}
+ csiphy_dev->base = ioremap(csiphy_dev->mem->start,
+ resource_size(csiphy_dev->mem));
+ if (!csiphy_dev->base) {
+ pr_err("%s: csiphy_dev->base NULL\n", __func__);
+ csiphy_dev->ref_count--;
+ rc = -ENOMEM;
+ goto ioremap_fail;
+ }
CDBG("%s:%d called\n", __func__, __LINE__);
- rc = msm_camera_config_vreg(&csiphy_dev->pdev->dev,
- csiphy_dev->csiphy_vreg,
- csiphy_dev->regulator_count, NULL, 0,
- &csiphy_dev->csiphy_reg_ptr[0], 1);
- if (rc < 0) {
- pr_err("%s:%d csiphy config_vreg failed\n",
- __func__, __LINE__);
- goto csiphy_vreg_config_fail;
- }
- rc = msm_camera_enable_vreg(&csiphy_dev->pdev->dev,
- csiphy_dev->csiphy_vreg,
- csiphy_dev->regulator_count, NULL, 0,
- &csiphy_dev->csiphy_reg_ptr[0], 1);
- if (rc < 0) {
- pr_err("%s:%d csiphy enable_vreg failed\n",
- __func__, __LINE__);
- goto top_vreg_enable_failed;
- }
+ if (csiphy_dev->hw_dts_version < CSIPHY_VERSION_V30) {
+ rc = msm_cam_clk_enable(&csiphy_dev->pdev->dev,
+ csiphy_dev->csiphy_clk_info, csiphy_dev->csiphy_clk,
+ csiphy_dev->num_clk, 1);
+ } else if (csiphy_dev->hw_dts_version >= CSIPHY_VERSION_V30) {
+ if (!csiphy_dev->clk_mux_mem || !csiphy_dev->clk_mux_io) {
+ pr_err("%s clk mux mem %p io %p\n", __func__,
+ csiphy_dev->clk_mux_mem,
+ csiphy_dev->clk_mux_io);
+ rc = -ENOMEM;
+ goto csiphy_base_fail;
+ }
+ csiphy_dev->clk_mux_base = ioremap(
+ csiphy_dev->clk_mux_mem->start,
+ resource_size(csiphy_dev->clk_mux_mem));
+ if (!csiphy_dev->clk_mux_base) {
+ pr_err("%s: ERROR %d\n", __func__, __LINE__);
+ rc = -ENOMEM;
+ goto csiphy_base_fail;
+ }
- rc = msm_camera_clk_enable(&csiphy_dev->pdev->dev,
- csiphy_dev->csiphy_clk_info, csiphy_dev->csiphy_clk,
- csiphy_dev->num_clk, true);
+ CDBG("%s:%d called\n", __func__, __LINE__);
+ rc = msm_cam_clk_enable(&csiphy_dev->pdev->dev,
+ csiphy_dev->csiphy_clk_info, csiphy_dev->csiphy_clk,
+ csiphy_dev->num_clk, 1);
+ } else {
+ pr_err("%s: ERROR Invalid CSIPHY Version %d",
+ __func__, __LINE__);
+ rc = -EINVAL;
+ goto csiphy_base_fail;
+ }
CDBG("%s:%d called\n", __func__, __LINE__);
if (rc < 0) {
pr_err("%s: csiphy clk enable failed\n", __func__);
csiphy_dev->ref_count--;
- goto csiphy_enable_clk_fail;
+ goto csiphy_mux_base_fail;
}
CDBG("%s:%d called\n", __func__, __LINE__);
- rc = msm_camera_enable_irq(csiphy_dev->irq, true);
- if (rc < 0)
- pr_err("%s: irq enable failed\n", __func__);
+ enable_irq(csiphy_dev->irq->start);
if (csiphy_dev->csiphy_3phase == CSI_3PHASE_HW)
msm_csiphy_3ph_reset(csiphy_dev);
@@ -1158,17 +1184,14 @@ static int msm_csiphy_init(struct csiphy_device *csiphy_dev)
csiphy_dev->csiphy_state = CSIPHY_POWER_UP;
return 0;
-csiphy_enable_clk_fail:
- msm_camera_enable_vreg(&csiphy_dev->pdev->dev,
- csiphy_dev->csiphy_vreg,
- csiphy_dev->regulator_count, NULL, 0,
- &csiphy_dev->csiphy_reg_ptr[0], 0);
-top_vreg_enable_failed:
- msm_camera_config_vreg(&csiphy_dev->pdev->dev,
- csiphy_dev->csiphy_vreg,
- csiphy_dev->regulator_count, NULL, 0,
- &csiphy_dev->csiphy_reg_ptr[0], 0);
-csiphy_vreg_config_fail:
+csiphy_mux_base_fail:
+ iounmap(csiphy_dev->clk_mux_base);
+ csiphy_dev->clk_mux_base = NULL;
+csiphy_base_fail:
+ iounmap(csiphy_dev->base);
+ csiphy_dev->base = NULL;
+ioremap_fail:
+ csiphy_dev->ref_count--;
if (cam_config_ahb_clk(NULL, 0, CAM_AHB_CLIENT_CSIPHY,
CAM_AHB_SUSPEND_VOTE) < 0)
pr_err("%s: failed to vote for AHB\n", __func__);
@@ -1208,36 +1231,54 @@ static int msm_csiphy_init(struct csiphy_device *csiphy_dev)
pr_err("%s: failed to vote for AHB\n", __func__);
return rc;
}
- rc = msm_camera_config_vreg(&csiphy_dev->pdev->dev,
- csiphy_dev->csiphy_vreg,
- csiphy_dev->regulator_count, NULL, 0,
- &csiphy_dev->csiphy_reg_ptr[0], 1);
- if (rc < 0) {
- pr_err("%s:%d csiphy config_vreg failed\n",
- __func__, __LINE__);
- goto csiphy_vreg_config_fail;
- }
- rc = msm_camera_enable_vreg(&csiphy_dev->pdev->dev,
- csiphy_dev->csiphy_vreg,
- csiphy_dev->regulator_count, NULL, 0,
- &csiphy_dev->csiphy_reg_ptr[0], 1);
- if (rc < 0) {
- pr_err("%s:%d csiphy enable_vreg failed\n",
- __func__, __LINE__);
- goto top_vreg_enable_failed;
- }
- rc = msm_camera_clk_enable(&csiphy_dev->pdev->dev,
- csiphy_dev->csiphy_clk_info, csiphy_dev->csiphy_clk,
- csiphy_dev->num_clk, true);
+ csiphy_dev->base = ioremap(csiphy_dev->mem->start,
+ resource_size(csiphy_dev->mem));
+ if (!csiphy_dev->base) {
+ pr_err("%s: csiphy_dev->base NULL\n", __func__);
+ csiphy_dev->ref_count--;
+ rc = -ENOMEM;
+ goto ioremap_fail;
+ }
+ if (csiphy_dev->hw_dts_version <= CSIPHY_VERSION_V22) {
+ CDBG("%s:%d called\n", __func__, __LINE__);
+ rc = msm_cam_clk_enable(&csiphy_dev->pdev->dev,
+ csiphy_dev->csiphy_clk_info, csiphy_dev->csiphy_clk,
+ csiphy_dev->num_clk, 1);
+ } else if (csiphy_dev->hw_dts_version >= CSIPHY_VERSION_V30) {
+ if (!csiphy_dev->clk_mux_mem || !csiphy_dev->clk_mux_io) {
+ pr_err("%s clk mux mem %p io %p\n", __func__,
+ csiphy_dev->clk_mux_mem,
+ csiphy_dev->clk_mux_io);
+ rc = -ENOMEM;
+ goto csiphy_base_fail;
+ }
+ csiphy_dev->clk_mux_base = ioremap(
+ csiphy_dev->clk_mux_mem->start,
+ resource_size(csiphy_dev->clk_mux_mem));
+ if (!csiphy_dev->clk_mux_base) {
+ pr_err("%s: ERROR %d\n", __func__, __LINE__);
+ rc = -ENOMEM;
+ goto csiphy_base_fail;
+ }
+ CDBG("%s:%d called\n", __func__, __LINE__);
+ rc = msm_cam_clk_enable(&csiphy_dev->pdev->dev,
+ csiphy_dev->csiphy_clk_info, csiphy_dev->csiphy_clk,
+ csiphy_dev->num_clk, 1);
+ } else {
+ pr_err("%s: ERROR Invalid CSIPHY Version %d",
+ __func__, __LINE__);
+ rc = -EINVAL;
+ goto csiphy_base_fail;
+ }
CDBG("%s:%d called\n", __func__, __LINE__);
if (rc < 0) {
pr_err("%s: csiphy clk enable failed\n", __func__);
csiphy_dev->ref_count--;
- goto csiphy_enable_clk_fail;
+ goto csiphy_mux_base_fail;
}
- CDBG("%s:%d clk enable success\n", __func__, __LINE__);
+ CDBG("%s:%d called\n", __func__, __LINE__);
if (csiphy_dev->csiphy_3phase == CSI_3PHASE_HW)
msm_csiphy_3ph_reset(csiphy_dev);
@@ -1260,17 +1301,14 @@ static int msm_csiphy_init(struct csiphy_device *csiphy_dev)
csiphy_dev->csiphy_state = CSIPHY_POWER_UP;
return 0;
-csiphy_enable_clk_fail:
- msm_camera_enable_vreg(&csiphy_dev->pdev->dev,
- csiphy_dev->csiphy_vreg,
- csiphy_dev->regulator_count, NULL, 0,
- &csiphy_dev->csiphy_reg_ptr[0], 0);
-top_vreg_enable_failed:
- msm_camera_config_vreg(&csiphy_dev->pdev->dev,
- csiphy_dev->csiphy_vreg,
- csiphy_dev->regulator_count, NULL, 0,
- &csiphy_dev->csiphy_reg_ptr[0], 0);
-csiphy_vreg_config_fail:
+csiphy_mux_base_fail:
+ iounmap(csiphy_dev->clk_mux_base);
+ csiphy_dev->clk_mux_base = NULL;
+csiphy_base_fail:
+ iounmap(csiphy_dev->base);
+ csiphy_dev->base = NULL;
+ioremap_fail:
+ csiphy_dev->ref_count--;
if (cam_config_ahb_clk(NULL, 0, CAM_AHB_CLIENT_CSIPHY,
CAM_AHB_SUSPEND_VOTE) < 0)
pr_err("%s: failed to vote for AHB\n", __func__);
@@ -1370,27 +1408,24 @@ static int msm_csiphy_release(struct csiphy_device *csiphy_dev, void *arg)
mipi_csiphy_glbl_pwr_cfg_addr);
}
- rc = msm_camera_enable_irq(csiphy_dev->irq, false);
+ disable_irq(csiphy_dev->irq->start);
- msm_camera_clk_enable(&csiphy_dev->pdev->dev,
- csiphy_dev->csiphy_clk_info, csiphy_dev->csiphy_clk,
- csiphy_dev->num_clk, false);
-
- if (csiphy_dev->csiphy_3phase == CSI_3PHASE_HW &&
- csiphy_dev->csi_3phase == 1) {
- msm_camera_clk_enable(&csiphy_dev->pdev->dev,
- csiphy_dev->csiphy_3p_clk_info,
- csiphy_dev->csiphy_3p_clk, 2, false);
+ if (csiphy_dev->hw_dts_version <= CSIPHY_VERSION_V22) {
+ msm_cam_clk_enable(&csiphy_dev->pdev->dev,
+ csiphy_dev->csiphy_clk_info, csiphy_dev->csiphy_clk,
+ csiphy_dev->num_clk, 0);
+ } else if (csiphy_dev->hw_dts_version >= CSIPHY_VERSION_V30) {
+ msm_cam_clk_enable(&csiphy_dev->pdev->dev,
+ csiphy_dev->csiphy_clk_info, csiphy_dev->csiphy_clk,
+ csiphy_dev->num_clk, 0);
+ if (csiphy_dev->csiphy_3phase == CSI_3PHASE_HW)
+ msm_cam_clk_enable(&csiphy_dev->pdev->dev,
+ csiphy_dev->csiphy_3p_clk_info,
+ csiphy_dev->csiphy_3p_clk, 2, 0);
+ iounmap(csiphy_dev->clk_mux_base);
}
-
- msm_camera_enable_vreg(&csiphy_dev->pdev->dev,
- csiphy_dev->csiphy_vreg,
- csiphy_dev->regulator_count, NULL, 0,
- &csiphy_dev->csiphy_reg_ptr[0], 0);
- msm_camera_config_vreg(&csiphy_dev->pdev->dev,
- csiphy_dev->csiphy_vreg, csiphy_dev->regulator_count,
- NULL, 0, &csiphy_dev->csiphy_reg_ptr[0], 0);
-
+ iounmap(csiphy_dev->base);
+ csiphy_dev->base = NULL;
csiphy_dev->csiphy_state = CSIPHY_POWER_DOWN;
if (cam_config_ahb_clk(NULL, 0, CAM_AHB_CLIENT_CSIPHY,
@@ -1401,7 +1436,7 @@ static int msm_csiphy_release(struct csiphy_device *csiphy_dev, void *arg)
#else
static int msm_csiphy_release(struct csiphy_device *csiphy_dev, void *arg)
{
- int i = 0, rc = 0;
+ int i = 0;
struct msm_camera_csi_lane_params *csi_lane_params;
uint16_t csi_lane_mask;
csi_lane_params = (struct msm_camera_csi_lane_params *)arg;
@@ -1489,26 +1524,25 @@ static int msm_csiphy_release(struct csiphy_device *csiphy_dev, void *arg)
mipi_csiphy_glbl_pwr_cfg_addr);
}
if (csiphy_dev->csiphy_sof_debug == SOF_DEBUG_ENABLE) {
- rc = msm_camera_enable_irq(csiphy_dev->irq, false);
- }
-
- msm_camera_clk_enable(&csiphy_dev->pdev->dev,
- csiphy_dev->csiphy_clk_info, csiphy_dev->csiphy_clk,
- csiphy_dev->num_clk, false);
- if (csiphy_dev->csiphy_3phase == CSI_3PHASE_HW &&
- csiphy_dev->csi_3phase == 1) {
- msm_camera_clk_enable(&csiphy_dev->pdev->dev,
- csiphy_dev->csiphy_3p_clk_info,
- csiphy_dev->csiphy_3p_clk, 2, false);
+ disable_irq(csiphy_dev->irq->start);
+ }
+ if (csiphy_dev->hw_dts_version <= CSIPHY_VERSION_V22) {
+ msm_cam_clk_enable(&csiphy_dev->pdev->dev,
+ csiphy_dev->csiphy_clk_info, csiphy_dev->csiphy_clk,
+ csiphy_dev->num_clk, 0);
+ } else if (csiphy_dev->hw_dts_version >= CSIPHY_VERSION_V30) {
+ msm_cam_clk_enable(&csiphy_dev->pdev->dev,
+ csiphy_dev->csiphy_clk_info, csiphy_dev->csiphy_clk,
+ csiphy_dev->num_clk, 0);
+ if (csiphy_dev->csiphy_3phase == CSI_3PHASE_HW)
+ msm_cam_clk_enable(&csiphy_dev->pdev->dev,
+ csiphy_dev->csiphy_3p_clk_info,
+ csiphy_dev->csiphy_3p_clk, 2, 0);
+ iounmap(csiphy_dev->clk_mux_base);
}
- msm_camera_enable_vreg(&csiphy_dev->pdev->dev,
- csiphy_dev->csiphy_vreg, csiphy_dev->regulator_count,
- NULL, 0, &csiphy_dev->csiphy_reg_ptr[0], 0);
- msm_camera_config_vreg(&csiphy_dev->pdev->dev,
- csiphy_dev->csiphy_vreg, csiphy_dev->regulator_count,
- NULL, 0, &csiphy_dev->csiphy_reg_ptr[0], 0);
-
+ iounmap(csiphy_dev->base);
+ csiphy_dev->base = NULL;
csiphy_dev->csiphy_state = CSIPHY_POWER_DOWN;
if (cam_config_ahb_clk(NULL, 0, CAM_AHB_CLIENT_CSIPHY,
@@ -1602,7 +1636,7 @@ static long msm_csiphy_subdev_ioctl(struct v4l2_subdev *sd,
break;
if (csiphy_dev->csiphy_sof_debug == SOF_DEBUG_DISABLE) {
csiphy_dev->csiphy_sof_debug = SOF_DEBUG_ENABLE;
- rc = msm_camera_enable_irq(csiphy_dev->irq, true);
+ enable_irq(csiphy_dev->irq->start);
}
break;
case MSM_SD_UNNOTIFY_FREEZE:
@@ -1610,7 +1644,7 @@ static long msm_csiphy_subdev_ioctl(struct v4l2_subdev *sd,
!csiphy_dev->ref_count)
break;
csiphy_dev->csiphy_sof_debug = SOF_DEBUG_DISABLE;
- rc = msm_camera_enable_irq(csiphy_dev->irq, false);
+ disable_irq(csiphy_dev->irq->start);
break;
default:
pr_err_ratelimited("%s: command not found\n", __func__);
@@ -1662,58 +1696,69 @@ static const struct v4l2_subdev_ops msm_csiphy_subdev_ops = {
static int msm_csiphy_get_clk_info(struct csiphy_device *csiphy_dev,
struct platform_device *pdev)
{
+ uint32_t count;
int i, rc = 0;
+ uint32_t rates[CSIPHY_NUM_CLK_MAX];
+ const char *clk_name[CSIPHY_NUM_CLK_MAX];
char *csi_3p_clk_name = "csi_phy_3p_clk";
char *csi_3p_clk_src_name = "csiphy_3p_clk_src";
uint32_t clk_cnt = 0;
- rc = msm_camera_get_clk_info(csiphy_dev->pdev,
- &csiphy_dev->csiphy_all_clk_info,
- &csiphy_dev->csiphy_all_clk,
- &csiphy_dev->num_all_clk);
- if (rc < 0) {
- pr_err("%s:%d, failed\n", __func__, __LINE__);
- return rc;
+ struct device_node *of_node;
+ of_node = pdev->dev.of_node;
+
+ count = of_property_count_strings(of_node, "clock-names");
+
+ CDBG("%s: count = %d\n", __func__, count);
+ if (count == 0) {
+ pr_err("%s: no clocks found in device tree, count=%d",
+ __func__, count);
+ return 0;
}
- if (csiphy_dev->num_all_clk > CSIPHY_NUM_CLK_MAX) {
- pr_err("%s: invalid count=%zu, max is %d\n", __func__,
- csiphy_dev->num_all_clk, CSIPHY_NUM_CLK_MAX);
- rc = -EINVAL;
- goto MAX_CLK_ERROR;
+ if (count > CSIPHY_NUM_CLK_MAX) {
+ pr_err("%s: invalid count=%d, max is %d\n", __func__,
+ count, CSIPHY_NUM_CLK_MAX);
+ return -EINVAL;
}
- for (i = 0; i < csiphy_dev->num_all_clk; i++) {
- if (!strcmp(csiphy_dev->csiphy_all_clk_info[i].clk_name,
- csi_3p_clk_src_name)) {
+ for (i = 0; i < count; i++) {
+ rc = of_property_read_string_index(of_node, "clock-names",
+ i, &clk_name[i]);
+ CDBG("%s: clock-names[%d] = %s\n", __func__, i, clk_name[i]);
+ if (rc < 0) {
+ pr_err("%s:%d, failed\n", __func__, __LINE__);
+ return rc;
+ }
+ }
+ rc = of_property_read_u32_array(of_node, "qcom,clock-rates",
+ rates, count);
+ if (rc < 0) {
+ pr_err("%s:%d, failed", __func__, __LINE__);
+ return rc;
+ }
+ for (i = 0; i < count; i++) {
+ if (!strcmp(clk_name[i], csi_3p_clk_src_name)) {
csiphy_dev->csiphy_3p_clk_info[0].clk_name =
- csiphy_dev->csiphy_all_clk_info[i].clk_name;
+ clk_name[i];
csiphy_dev->csiphy_3p_clk_info[0].clk_rate =
- csiphy_dev->csiphy_all_clk_info[i].clk_rate;
- csiphy_dev->csiphy_3p_clk[0] =
- csiphy_dev->csiphy_all_clk[i];
+ (rates[i] == 0) ? (long)-1 : rates[i];
continue;
- } else if (!strcmp(csiphy_dev->csiphy_all_clk_info[i].clk_name,
- csi_3p_clk_name)) {
+ } else if (!strcmp(clk_name[i], csi_3p_clk_name)) {
csiphy_dev->csiphy_3p_clk_info[1].clk_name =
- csiphy_dev->csiphy_all_clk_info[i].clk_name;
+ clk_name[i];
csiphy_dev->csiphy_3p_clk_info[1].clk_rate =
- csiphy_dev->csiphy_all_clk_info[i].clk_rate;
- csiphy_dev->csiphy_3p_clk[1] =
- csiphy_dev->csiphy_all_clk[i];
+ (rates[i] == 0) ? (long)-1 : rates[i];
continue;
}
csiphy_dev->csiphy_clk_info[clk_cnt].clk_name =
- csiphy_dev->csiphy_all_clk_info[i].clk_name;
+ clk_name[i];
csiphy_dev->csiphy_clk_info[clk_cnt].clk_rate =
- csiphy_dev->csiphy_all_clk_info[i].clk_rate;
- csiphy_dev->csiphy_clk[clk_cnt] =
- csiphy_dev->csiphy_all_clk[clk_cnt];
+ (rates[i] == 0) ? (long)-1 : rates[i];
if (!strcmp(csiphy_dev->csiphy_clk_info[clk_cnt].clk_name,
"csiphy_timer_src_clk")) {
CDBG("%s:%d, copy csiphy_timer_src_clk",
__func__, __LINE__);
- csiphy_dev->csiphy_max_clk =
- csiphy_dev->csiphy_clk_info[clk_cnt].clk_rate;
+ csiphy_dev->csiphy_max_clk = rates[i];
csiphy_dev->csiphy_clk_index = clk_cnt;
}
CDBG("%s: clk_rate[%d] = %ld\n", __func__, clk_cnt,
@@ -1723,13 +1768,6 @@ static int msm_csiphy_get_clk_info(struct csiphy_device *csiphy_dev,
csiphy_dev->num_clk = clk_cnt;
return rc;
-MAX_CLK_ERROR:
- msm_camera_put_clk_info(csiphy_dev->pdev,
- &csiphy_dev->csiphy_all_clk_info,
- &csiphy_dev->csiphy_all_clk,
- csiphy_dev->num_all_clk);
-
- return rc;
}
static int csiphy_probe(struct platform_device *pdev)
@@ -1762,6 +1800,56 @@ static int csiphy_probe(struct platform_device *pdev)
CDBG("%s: device id = %d\n", __func__, pdev->id);
}
+ rc = msm_csiphy_get_clk_info(new_csiphy_dev, pdev);
+ if (rc < 0) {
+ pr_err("%s: msm_csiphy_get_clk_info() failed", __func__);
+ return -EFAULT;
+ }
+
+ new_csiphy_dev->mem = platform_get_resource_byname(pdev,
+ IORESOURCE_MEM, "csiphy");
+ if (!new_csiphy_dev->mem) {
+ pr_err("%s: no mem resource?\n", __func__);
+ rc = -ENODEV;
+ goto csiphy_no_resource;
+ }
+ new_csiphy_dev->irq = platform_get_resource_byname(pdev,
+ IORESOURCE_IRQ, "csiphy");
+ if (!new_csiphy_dev->irq) {
+ pr_err("%s: no irq resource?\n", __func__);
+ rc = -ENODEV;
+ goto csiphy_no_resource;
+ }
+ new_csiphy_dev->io = request_mem_region(new_csiphy_dev->mem->start,
+ resource_size(new_csiphy_dev->mem), pdev->name);
+ if (!new_csiphy_dev->io) {
+ pr_err("%s: no valid mem region\n", __func__);
+ rc = -EBUSY;
+ goto csiphy_no_resource;
+ }
+
+ rc = request_irq(new_csiphy_dev->irq->start, msm_csiphy_irq,
+ IRQF_TRIGGER_RISING, "csiphy", new_csiphy_dev);
+ if (rc < 0) {
+ release_mem_region(new_csiphy_dev->mem->start,
+ resource_size(new_csiphy_dev->mem));
+ pr_err("%s: irq request fail\n", __func__);
+ rc = -EBUSY;
+ goto csiphy_no_resource;
+ }
+ disable_irq(new_csiphy_dev->irq->start);
+
+ new_csiphy_dev->clk_mux_mem = platform_get_resource_byname(pdev,
+ IORESOURCE_MEM, "csiphy_clk_mux");
+ if (new_csiphy_dev->clk_mux_mem) {
+ new_csiphy_dev->clk_mux_io = request_mem_region(
+ new_csiphy_dev->clk_mux_mem->start,
+ resource_size(new_csiphy_dev->clk_mux_mem),
+ new_csiphy_dev->clk_mux_mem->name);
+ if (!new_csiphy_dev->clk_mux_io)
+ pr_err("%s: ERROR %d\n", __func__, __LINE__);
+ }
+
new_csiphy_dev->pdev = pdev;
new_csiphy_dev->msm_sd.sd.internal_ops = &msm_csiphy_internal_ops;
new_csiphy_dev->msm_sd.sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
@@ -1832,53 +1920,8 @@ static int csiphy_probe(struct platform_device *pdev)
} else {
pr_err("%s:%d, invalid hw version : 0x%x\n", __func__, __LINE__,
new_csiphy_dev->hw_dts_version);
- rc = -EINVAL;
- goto csiphy_no_resource;
- }
-
- rc = msm_camera_get_dt_vreg_data(pdev->dev.of_node,
- &(new_csiphy_dev->csiphy_vreg),
- &(new_csiphy_dev->regulator_count));
- if (rc < 0) {
- pr_err("%s: get vreg data from dtsi fail\n", __func__);
- rc = -EFAULT;
- goto csiphy_no_resource;
- }
- /* ToDo: Enable 3phase clock for dynamic clock enable/disable */
- rc = msm_csiphy_get_clk_info(new_csiphy_dev, pdev);
- if (rc < 0) {
- pr_err("%s: msm_csiphy_get_clk_info() failed", __func__);
- rc = -EFAULT;
- goto csiphy_no_resource;
- }
-
- new_csiphy_dev->base = msm_camera_get_reg_base(pdev, "csiphy", true);
- if (!new_csiphy_dev->base) {
- pr_err("%s: no mem resource?\n", __func__);
- rc = -ENODEV;
- goto csiphy_no_resource;
- }
-
- if (new_csiphy_dev->hw_dts_version >= CSIPHY_VERSION_V30) {
- new_csiphy_dev->clk_mux_base = msm_camera_get_reg_base(pdev,
- "csiphy_clk_mux", true);
- if (!new_csiphy_dev->clk_mux_base)
- pr_err("%s: no mem resource?\n", __func__);
- }
- new_csiphy_dev->irq = msm_camera_get_irq(pdev, "csiphy");
- if (!new_csiphy_dev->irq) {
- pr_err("%s: no irq resource?\n", __func__);
- rc = -ENODEV;
- goto csiphy_no_irq_resource;
- }
- rc = msm_camera_register_irq(pdev, new_csiphy_dev->irq,
- msm_csiphy_irq, IRQF_TRIGGER_RISING, "csiphy", new_csiphy_dev);
- if (rc < 0) {
- pr_err("%s: irq request fail\n", __func__);
- rc = -EBUSY;
- goto csiphy_no_irq_resource;
+ return -EINVAL;
}
- msm_camera_enable_irq(new_csiphy_dev->irq, false);
msm_cam_copy_v4l2_subdev_fops(&msm_csiphy_v4l2_subdev_fops);
#ifdef CONFIG_COMPAT
@@ -1890,36 +1933,10 @@ static int csiphy_probe(struct platform_device *pdev)
new_csiphy_dev->csiphy_state = CSIPHY_POWER_DOWN;
return 0;
-csiphy_no_irq_resource:
- if (new_csiphy_dev->hw_dts_version >= CSIPHY_VERSION_V30) {
- msm_camera_put_reg_base(pdev, new_csiphy_dev->clk_mux_base,
- "csiphy_clk_mux", true);
- }
- msm_camera_put_reg_base(pdev, new_csiphy_dev->base, "csiphy", true);
csiphy_no_resource:
mutex_destroy(&new_csiphy_dev->mutex);
kfree(new_csiphy_dev->ctrl_reg);
kfree(new_csiphy_dev);
- return rc;
-}
-
-static int msm_csiphy_exit(struct platform_device *pdev)
-{
- struct v4l2_subdev *subdev = platform_get_drvdata(pdev);
- struct csiphy_device *csiphy_dev =
- v4l2_get_subdevdata(subdev);
-
- msm_camera_put_clk_info(pdev,
- &csiphy_dev->csiphy_all_clk_info,
- &csiphy_dev->csiphy_all_clk,
- csiphy_dev->num_all_clk);
-
- msm_camera_put_reg_base(pdev, csiphy_dev->base, "csiphy", true);
- if (csiphy_dev->hw_dts_version >= CSIPHY_VERSION_V30) {
- msm_camera_put_reg_base(pdev, csiphy_dev->clk_mux_base,
- "csiphy_clk_mux", true);
- }
- kfree(csiphy_dev);
return 0;
}
@@ -1932,7 +1949,6 @@ MODULE_DEVICE_TABLE(of, msm_csiphy_dt_match);
static struct platform_driver csiphy_driver = {
.probe = csiphy_probe,
- .remove = msm_csiphy_exit,
.driver = {
.name = MSM_CSIPHY_DRV_NAME,
.owner = THIS_MODULE,
diff --git a/drivers/media/platform/msm/camera_v2/sensor/csiphy/msm_csiphy.h b/drivers/media/platform/msm/camera_v2/sensor/csiphy/msm_csiphy.h
index c33f183963cc..982a44cf8bfd 100644
--- a/drivers/media/platform/msm/camera_v2/sensor/csiphy/msm_csiphy.h
+++ b/drivers/media/platform/msm/camera_v2/sensor/csiphy/msm_csiphy.h
@@ -20,8 +20,6 @@
#include <media/msm_cam_sensor.h>
#include "msm_sd.h"
#include "msm_camera_io_util.h"
-#include "msm_camera_dt_util.h"
-#include "cam_soc_api.h"
#define MAX_CSIPHY 3
#define CSIPHY_NUM_CLK_MAX 16
@@ -161,7 +159,11 @@ struct csiphy_device {
struct platform_device *pdev;
struct msm_sd_subdev msm_sd;
struct v4l2_subdev subdev;
+ struct resource *mem;
+ struct resource *clk_mux_mem;
struct resource *irq;
+ struct resource *io;
+ struct resource *clk_mux_io;
void __iomem *base;
void __iomem *clk_mux_base;
struct mutex mutex;
@@ -169,15 +171,11 @@ struct csiphy_device {
uint32_t hw_dts_version;
enum msm_csiphy_state_t csiphy_state;
struct csiphy_ctrl_t *ctrl_reg;
- size_t num_all_clk;
- struct clk **csiphy_all_clk;
- struct msm_cam_clk_info *csiphy_all_clk_info;
uint32_t num_clk;
struct clk *csiphy_clk[CSIPHY_NUM_CLK_MAX];
struct msm_cam_clk_info csiphy_clk_info[CSIPHY_NUM_CLK_MAX];
struct clk *csiphy_3p_clk[2];
struct msm_cam_clk_info csiphy_3p_clk_info[2];
- unsigned char csi_3phase;
int32_t ref_count;
uint16_t lane_mask[MAX_CSIPHY];
uint32_t is_3_1_20nm_hw;
@@ -187,9 +185,6 @@ struct csiphy_device {
uint8_t num_irq_registers;
uint32_t csiphy_sof_debug;
uint32_t csiphy_sof_debug_count;
- struct camera_vreg_t *csiphy_vreg;
- struct regulator *csiphy_reg_ptr[MAX_REGULATOR];
- int32_t regulator_count;
};
#define VIDIOC_MSM_CSIPHY_RELEASE \
diff --git a/drivers/media/platform/msm/camera_v2/sensor/eeprom/msm_eeprom.c b/drivers/media/platform/msm/camera_v2/sensor/eeprom/msm_eeprom.c
index 802fe807b6d3..6e2eaddbac79 100644
--- a/drivers/media/platform/msm/camera_v2/sensor/eeprom/msm_eeprom.c
+++ b/drivers/media/platform/msm/camera_v2/sensor/eeprom/msm_eeprom.c
@@ -770,6 +770,15 @@ static int msm_eeprom_close(struct v4l2_subdev *sd,
return rc;
}
+static struct msm_cam_clk_info cam_8960_clk_info[] = {
+ [SENSOR_CAM_MCLK] = {"cam_clk", 24000000},
+};
+
+static struct msm_cam_clk_info cam_8974_clk_info[] = {
+ [SENSOR_CAM_MCLK] = {"cam_src_clk", 19200000},
+ [SENSOR_CAM_CLK] = {"cam_clk", 0},
+};
+
static const struct v4l2_subdev_internal_ops msm_eeprom_internal_ops = {
.open = msm_eeprom_open,
.close = msm_eeprom_close,
@@ -788,6 +797,7 @@ static int msm_eeprom_i2c_probe(struct i2c_client *client,
{
int rc = 0;
struct msm_eeprom_ctrl_t *e_ctrl = NULL;
+ struct msm_camera_power_ctrl_t *power_info = NULL;
CDBG("%s E\n", __func__);
if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) {
@@ -809,6 +819,7 @@ static int msm_eeprom_i2c_probe(struct i2c_client *client,
rc = -EINVAL;
goto ectrl_free;
}
+ power_info = &e_ctrl->eboard_info->power_info;
e_ctrl->i2c_client.client = client;
e_ctrl->cal_data.mapdata = NULL;
e_ctrl->cal_data.map = NULL;
@@ -822,17 +833,9 @@ static int msm_eeprom_i2c_probe(struct i2c_client *client,
if (e_ctrl->eboard_info->i2c_slaveaddr != 0)
e_ctrl->i2c_client.client->addr =
e_ctrl->eboard_info->i2c_slaveaddr;
-
- /*Get clocks information*/
- rc = msm_camera_i2c_dev_get_clk_info(
- &e_ctrl->i2c_client.client->dev,
- &e_ctrl->eboard_info->power_info.clk_info,
- &e_ctrl->eboard_info->power_info.clk_ptr,
- &e_ctrl->eboard_info->power_info.clk_info_size);
- if (rc < 0) {
- pr_err("failed: msm_camera_get_clk_info rc %d", rc);
- goto ectrl_free;
- }
+ power_info->clk_info = cam_8960_clk_info;
+ power_info->clk_info_size = ARRAY_SIZE(cam_8960_clk_info);
+ power_info->dev = &client->dev;
/*IMPLEMENT READING PART*/
/* Initialize sub device */
@@ -876,11 +879,6 @@ static int msm_eeprom_i2c_remove(struct i2c_client *client)
return 0;
}
- msm_camera_i2c_dev_put_clk_info(&e_ctrl->i2c_client.client->dev,
- &e_ctrl->eboard_info->power_info.clk_info,
- &e_ctrl->eboard_info->power_info.clk_ptr,
- e_ctrl->eboard_info->power_info.clk_info_size);
-
kfree(e_ctrl->cal_data.mapdata);
kfree(e_ctrl->cal_data.map);
if (e_ctrl->eboard_info) {
@@ -1128,18 +1126,10 @@ static int msm_eeprom_spi_setup(struct spi_device *spi)
CDBG("%s MM data miss:%d\n", __func__, __LINE__);
power_info = &eb_info->power_info;
- power_info->dev = &spi->dev;
- /*Get clocks information*/
- rc = msm_camera_i2c_dev_get_clk_info(
- &spi->dev,
- &power_info->clk_info,
- &power_info->clk_ptr,
- &power_info->clk_info_size);
- if (rc < 0) {
- pr_err("failed: msm_camera_get_clk_info rc %d", rc);
- goto board_free;
- }
+ power_info->clk_info = cam_8974_clk_info;
+ power_info->clk_info_size = ARRAY_SIZE(cam_8974_clk_info);
+ power_info->dev = &spi->dev;
rc = msm_eeprom_get_dt_data(e_ctrl);
if (rc < 0)
@@ -1218,11 +1208,6 @@ power_down:
msm_camera_power_down(power_info, e_ctrl->eeprom_device_type,
&e_ctrl->i2c_client);
caldata_free:
- msm_camera_i2c_dev_put_clk_info(
- &e_ctrl->i2c_client.spi_client->spi_master->dev,
- &e_ctrl->eboard_info->power_info.clk_info,
- &e_ctrl->eboard_info->power_info.clk_ptr,
- e_ctrl->eboard_info->power_info.clk_info_size);
kfree(e_ctrl->cal_data.mapdata);
kfree(e_ctrl->cal_data.map);
board_free:
@@ -1273,13 +1258,6 @@ static int msm_eeprom_spi_remove(struct spi_device *sdev)
pr_err("%s: board info is NULL\n", __func__);
return 0;
}
-
- msm_camera_i2c_dev_put_clk_info(
- &e_ctrl->i2c_client.spi_client->spi_master->dev,
- &e_ctrl->eboard_info->power_info.clk_info,
- &e_ctrl->eboard_info->power_info.clk_ptr,
- e_ctrl->eboard_info->power_info.clk_info_size);
-
kfree(e_ctrl->i2c_client.spi_client);
kfree(e_ctrl->cal_data.mapdata);
kfree(e_ctrl->cal_data.map);
@@ -1638,17 +1616,10 @@ static int msm_eeprom_platform_probe(struct platform_device *pdev)
cci_client->cci_subdev = msm_cci_get_subdev();
cci_client->retries = 3;
cci_client->id_map = 0;
- power_info->dev = &pdev->dev;
- /*Get clocks information*/
- rc = msm_camera_get_clk_info(e_ctrl->pdev,
- &power_info->clk_info,
- &power_info->clk_ptr,
- &power_info->clk_info_size);
- if (rc < 0) {
- pr_err("failed: msm_camera_get_clk_info rc %d", rc);
- goto board_free;
- }
+ power_info->clk_info = cam_8974_clk_info;
+ power_info->clk_info_size = ARRAY_SIZE(cam_8974_clk_info);
+ power_info->dev = &pdev->dev;
rc = of_property_read_u32(of_node, "cell-index",
&pdev->id);
@@ -1797,12 +1768,6 @@ static int msm_eeprom_platform_remove(struct platform_device *pdev)
pr_err("%s: board info is NULL\n", __func__);
return 0;
}
-
- msm_camera_put_clk_info(e_ctrl->pdev,
- &e_ctrl->eboard_info->power_info.clk_info,
- &e_ctrl->eboard_info->power_info.clk_ptr,
- e_ctrl->eboard_info->power_info.clk_info_size);
-
kfree(e_ctrl->i2c_client.cci_client);
kfree(e_ctrl->cal_data.mapdata);
kfree(e_ctrl->cal_data.map);
diff --git a/drivers/media/platform/msm/camera_v2/sensor/flash/msm_flash.c b/drivers/media/platform/msm/camera_v2/sensor/flash/msm_flash.c
index 4ca4ac1860c8..fc04190aa4b8 100644
--- a/drivers/media/platform/msm/camera_v2/sensor/flash/msm_flash.c
+++ b/drivers/media/platform/msm/camera_v2/sensor/flash/msm_flash.c
@@ -20,6 +20,8 @@
#include "msm_camera_dt_util.h"
#include "msm_cci.h"
+#include <linux/proc_fs.h>
+
#undef CDBG
#define CDBG(fmt, args...) pr_debug(fmt, ##args)
@@ -55,6 +57,9 @@ static struct msm_camera_i2c_fn_t msm_sensor_cci_func_tbl = {
.i2c_poll = msm_camera_cci_i2c_poll,
};
+
+static int32_t torch_status = 0;
+
void msm_torch_brightness_set(struct led_classdev *led_cdev,
enum led_brightness value)
{
@@ -399,6 +404,8 @@ static int32_t msm_flash_off(struct msm_flash_ctrl_t *flash_ctrl,
if (flash_ctrl->switch_trigger)
led_trigger_event(flash_ctrl->switch_trigger, 0);
+ torch_status = 0;
+
CDBG("Exit\n");
return 0;
}
@@ -641,6 +648,9 @@ static int32_t msm_flash_low(
}
if (flash_ctrl->switch_trigger)
led_trigger_event(flash_ctrl->switch_trigger, 1);
+
+ torch_status = 1;
+
CDBG("Exit\n");
return 0;
}
@@ -668,7 +678,7 @@ static int32_t msm_flash_high(
curr = flash_data->flash_current[i];
} else {
curr = flash_ctrl->flash_op_current[i];
- pr_debug("LED flash_current[%d] clamped %d\n",
+ CDBG("LED flash_current[%d] clamped %d\n",
i, curr);
}
CDBG("high_flash_current[%d] = %d", i, curr);
@@ -1236,6 +1246,135 @@ static long msm_flash_subdev_fops_ioctl(struct file *file,
return video_usercopy(file, cmd, arg, msm_flash_subdev_do_ioctl);
}
#endif
+
+static struct msm_flash_ctrl_t fctrl;
+ssize_t proc_flash_led_write (struct file *file, const char __user *buf, size_t nbytes, loff_t *ppos)
+{
+ char string[128];
+ uint32_t i = 0;
+ memset(string,0x0,128);
+ if(copy_from_user(string, buf, nbytes))
+ return -EFAULT;
+ pr_err("proc_flash_led_write %d bytes ,%x,%s,\n",(int)nbytes,string[nbytes-1],string);
+ if (!strncmp((const char *)string, (const char *)"on",2))
+ {
+ CDBG("proc_flash_led_write on called\n");
+ for (i = 0; i < fctrl.torch_num_sources; i++)
+ if (fctrl.torch_trigger[i])
+ led_trigger_event(fctrl.torch_trigger[i], fctrl.torch_op_current[i]);
+ if (fctrl.switch_trigger)
+ led_trigger_event(fctrl.switch_trigger, 1);
+ torch_status = 1;
+ }
+ else if (!strncmp((const char *)string, (const char *)"off",3))
+ {
+ CDBG("proc_flash_led_write off called\n");
+ for (i = 0; i < fctrl.flash_num_sources; i++)
+ if (fctrl.flash_trigger[i])
+ led_trigger_event(fctrl.flash_trigger[i], 0);
+ for (i = 0; i < fctrl.torch_num_sources; i++)
+ if (fctrl.torch_trigger[i])
+ led_trigger_event(fctrl.torch_trigger[i], 0);
+ if (fctrl.switch_trigger)
+ led_trigger_event(fctrl.switch_trigger, 0);
+ torch_status = 0;
+ }
+ else if (!strncmp((const char *)string, (const char *)"led1_on",7))
+ {
+ CDBG("proc_flash_led_write led1_on called\n");
+ if (fctrl.torch_trigger[0])
+ led_trigger_event(fctrl.torch_trigger[0], fctrl.torch_op_current[0]);
+ if (fctrl.switch_trigger)
+ led_trigger_event(fctrl.switch_trigger, 1);
+ torch_status = 1;
+ }
+ else if (!strncmp((const char *)string, (const char *)"led1_off",8))
+ {
+ CDBG("proc_flash_led_write led1_on called\n");
+ if (fctrl.torch_trigger[0])
+ led_trigger_event(fctrl.torch_trigger[0],0);
+ if (fctrl.switch_trigger)
+ led_trigger_event(fctrl.switch_trigger, 0);
+ torch_status = 0;
+ }
+ else if (!strncmp((const char *)string, (const char *)"led2_on",7))
+ {
+ CDBG("proc_flash_led_write led2_on called\n");
+ if (fctrl.torch_trigger[1])
+ led_trigger_event(fctrl.torch_trigger[1], fctrl.torch_op_current[1]);
+ if (fctrl.switch_trigger)
+ led_trigger_event(fctrl.switch_trigger, 1);
+ torch_status = 1;
+ }
+ else if (!strncmp((const char *)string, (const char *)"led2_off",8))
+ {
+ CDBG("proc_flash_led_write led2_off called\n");
+ if (fctrl.torch_trigger[0])
+ led_trigger_event(fctrl.torch_trigger[1],0);
+ if (fctrl.switch_trigger)
+ led_trigger_event(fctrl.switch_trigger, 0);
+ torch_status = 0;
+ }
+ else if (!strncmp((const char *)string, (const char *)"flash1_on",9))
+ {
+ CDBG("proc_flash_led_write flash1_on called\n");
+ if (fctrl.flash_trigger[0])
+ led_trigger_event(fctrl.flash_trigger[0], 800);
+ if (fctrl.switch_trigger)
+ led_trigger_event(fctrl.switch_trigger, 1);
+ }
+ else if (!strncmp((const char *)string, (const char *)"flash1_off",10))
+ {
+ CDBG("proc_flash_led_write flash1_off called\n");
+ if (fctrl.flash_trigger[0])
+ led_trigger_event(fctrl.flash_trigger[0], 0);
+ if (fctrl.switch_trigger)
+ led_trigger_event(fctrl.switch_trigger, 0);
+ }
+ else if (!strncmp((const char *)string, (const char *)"flash2_on",9))
+ {
+ CDBG("proc_flash_led_write flash2_on called\n");
+ if (fctrl.flash_trigger[1])
+ led_trigger_event(fctrl.flash_trigger[1], 800);
+ if (fctrl.switch_trigger)
+ led_trigger_event(fctrl.switch_trigger, 1);
+ }
+ else if (!strncmp((const char *)string, (const char *)"flash2_off",10))
+ {
+ CDBG("proc_flash_led_write flash2_off called\n");
+ if (fctrl.flash_trigger[1])
+ led_trigger_event(fctrl.flash_trigger[1], 0);
+ if (fctrl.switch_trigger)
+ led_trigger_event(fctrl.switch_trigger, 0);
+ }
+ else
+ {
+ CDBG("proc_flash_led_write default called\n");
+ }
+ return nbytes;
+}
+ssize_t proc_flash_led_read (struct file *file, char __user *buf, size_t nbytes, loff_t *ppos)
+{
+ char kbuff[128];
+ memset(kbuff,0x0,128);
+ if(buf != NULL && nbytes > 2){
+ if(torch_status)
+ strcpy(kbuff,"on\n");
+ else
+ strcpy(kbuff,"off\n");
+ }
+ if(copy_to_user(buf,kbuff,strlen(kbuff)+1))
+ return -EFAULT;
+ else
+ return strlen(kbuff)+1;
+}
+EXPORT_SYMBOL(proc_flash_led_write);
+const struct file_operations proc_flash_led_operations = {
+ .owner = THIS_MODULE,
+ .write = proc_flash_led_write,
+ .read = proc_flash_led_read,
+};
+
static int32_t msm_flash_platform_probe(struct platform_device *pdev)
{
int32_t rc = 0;
@@ -1310,6 +1449,13 @@ static int32_t msm_flash_platform_probe(struct platform_device *pdev)
if (flash_ctrl->flash_driver_type == FLASH_DRIVER_PMIC)
rc = msm_torch_create_classdev(pdev, flash_ctrl);
+
+ if (flash_ctrl->flash_driver_type == FLASH_DRIVER_PMIC){
+ proc_create_data("CTP_FLASH_CTRL", S_IFREG | S_IWUGO | S_IWUSR |S_IRUGO, NULL, &proc_flash_led_operations, NULL);
+ proc_create_data("CTP_TORCH_CTRL", S_IFREG | S_IWUGO | S_IWUSR |S_IRUGO, NULL, &proc_flash_led_operations, NULL);
+ memcpy(&fctrl,flash_ctrl,sizeof(struct msm_flash_ctrl_t));
+ }
+
CDBG("probe success\n");
return rc;
}
diff --git a/drivers/media/platform/msm/camera_v2/sensor/io/msm_camera_cci_i2c.c b/drivers/media/platform/msm/camera_v2/sensor/io/msm_camera_cci_i2c.c
index fc6ceb1b590f..80035bdda324 100644
--- a/drivers/media/platform/msm/camera_v2/sensor/io/msm_camera_cci_i2c.c
+++ b/drivers/media/platform/msm/camera_v2/sensor/io/msm_camera_cci_i2c.c
@@ -402,7 +402,9 @@ int32_t msm_camera_cci_i2c_poll(struct msm_camera_i2c_client *client,
enum msm_camera_i2c_data_type data_type, uint32_t delay_ms)
{
int32_t rc = -EFAULT;
+#if 0
int32_t i = 0;
+#endif
S_I2C_DBG("%s: addr: 0x%x data: 0x%x dt: %d\n",
__func__, addr, data, data_type);
@@ -411,6 +413,7 @@ int32_t msm_camera_cci_i2c_poll(struct msm_camera_i2c_client *client,
__func__, __LINE__, delay_ms, MAX_POLL_DELAY_MS);
return -EINVAL;
}
+#if 0
for (i = 0; i < delay_ms; i++) {
rc = msm_camera_cci_i2c_compare(client,
addr, data, data_type);
@@ -418,7 +421,19 @@ int32_t msm_camera_cci_i2c_poll(struct msm_camera_i2c_client *client,
return rc;
usleep_range(1000, 1010);
}
+#else
+ do {
+ rc = msm_camera_cci_i2c_compare(client,
+ addr, data, data_type);
+ if (rc == I2C_COMPARE_MATCH || rc < 0)
+ return rc;
+ if(delay_ms == 0)
+ break;
+
+ usleep_range(1000, 1010);
+ } while(delay_ms-- > 0);
+#endif
/* If rc is 1 then read is successful but poll is failure */
if (rc == 1)
pr_err("%s:%d poll failed rc=%d(non-fatal)\n",
diff --git a/drivers/media/platform/msm/camera_v2/sensor/io/msm_camera_dt_util.c b/drivers/media/platform/msm/camera_v2/sensor/io/msm_camera_dt_util.c
index 3bcf2ac9e9f1..419371a9f318 100644
--- a/drivers/media/platform/msm/camera_v2/sensor/io/msm_camera_dt_util.c
+++ b/drivers/media/platform/msm/camera_v2/sensor/io/msm_camera_dt_util.c
@@ -1465,7 +1465,7 @@ int msm_camera_power_up(struct msm_camera_power_ctrl_t *ctrl,
switch (power_setting->seq_type) {
case SENSOR_CLK:
if (power_setting->seq_val >= ctrl->clk_info_size) {
- pr_err("%s clk index %d >= max %zu\n", __func__,
+ pr_err("%s clk index %d >= max %d\n", __func__,
power_setting->seq_val,
ctrl->clk_info_size);
goto power_up_failed;
@@ -1473,9 +1473,12 @@ int msm_camera_power_up(struct msm_camera_power_ctrl_t *ctrl,
if (power_setting->config_val)
ctrl->clk_info[power_setting->seq_val].
clk_rate = power_setting->config_val;
- rc = msm_camera_clk_enable(ctrl->dev,
- ctrl->clk_info, ctrl->clk_ptr,
- ctrl->clk_info_size, true);
+
+ rc = msm_cam_clk_enable(ctrl->dev,
+ &ctrl->clk_info[0],
+ (struct clk **)&power_setting->data[0],
+ ctrl->clk_info_size,
+ 1);
if (rc < 0) {
pr_err("%s: clk enable failed\n", __func__);
goto power_up_failed;
@@ -1566,6 +1569,14 @@ power_up_failed:
power_setting = &ctrl->power_setting[index];
CDBG("%s type %d\n", __func__, power_setting->seq_type);
switch (power_setting->seq_type) {
+
+ case SENSOR_CLK:
+ msm_cam_clk_enable(ctrl->dev,
+ &ctrl->clk_info[0],
+ (struct clk **)&power_setting->data[0],
+ ctrl->clk_info_size,
+ 0);
+ break;
case SENSOR_GPIO:
if (!ctrl->gpio_conf->gpio_num_info)
continue;
@@ -1668,9 +1679,19 @@ int msm_camera_power_down(struct msm_camera_power_ctrl_t *ctrl,
CDBG("%s type %d\n", __func__, pd->seq_type);
switch (pd->seq_type) {
case SENSOR_CLK:
- msm_camera_clk_enable(ctrl->dev,
- ctrl->clk_info, ctrl->clk_ptr,
- ctrl->clk_info_size, false);
+
+ ps = msm_camera_get_power_settings(ctrl,
+ pd->seq_type,
+ pd->seq_val);
+ if (ps)
+ msm_cam_clk_enable(ctrl->dev,
+ &ctrl->clk_info[0],
+ (struct clk **)&ps->data[0],
+ ctrl->clk_info_size,
+ 0);
+ else
+ pr_err("%s error in power up/down seq data\n",
+ __func__);
break;
case SENSOR_GPIO:
if (pd->seq_val >= SENSOR_GPIO_MAX ||
diff --git a/drivers/media/platform/msm/camera_v2/sensor/io/msm_camera_dt_util.h b/drivers/media/platform/msm/camera_v2/sensor/io/msm_camera_dt_util.h
index 220915511cce..c9e31712cc85 100644
--- a/drivers/media/platform/msm/camera_v2/sensor/io/msm_camera_dt_util.h
+++ b/drivers/media/platform/msm/camera_v2/sensor/io/msm_camera_dt_util.h
@@ -1,4 +1,4 @@
-/* Copyright (c) 2013-2016, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2013-2015, The Linux Foundation. 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
@@ -18,8 +18,6 @@
#include <linux/of_gpio.h>
#include <linux/of.h>
#include "msm_camera_i2c.h"
-#include "cam_soc_api.h"
-
#define INVALID_VREG 100
diff --git a/drivers/media/platform/msm/camera_v2/sensor/io/msm_camera_i2c_mux.c b/drivers/media/platform/msm/camera_v2/sensor/io/msm_camera_i2c_mux.c
index a1cc8d5fae4d..888af7e1eb37 100644
--- a/drivers/media/platform/msm/camera_v2/sensor/io/msm_camera_i2c_mux.c
+++ b/drivers/media/platform/msm/camera_v2/sensor/io/msm_camera_i2c_mux.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2011-2014, 2016, The Linux Foundatation. All rights reserved.
+/* Copyright (c) 2011-2014, The Linux Foundatation. 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
@@ -40,6 +40,19 @@ static int msm_i2c_mux_init(struct i2c_mux_device *mux_device)
{
int rc = 0, val = 0;
if (mux_device->use_count == 0) {
+ mux_device->ctl_base = ioremap(mux_device->ctl_mem->start,
+ resource_size(mux_device->ctl_mem));
+ if (!mux_device->ctl_base) {
+ rc = -ENOMEM;
+ return rc;
+ }
+ mux_device->rw_base = ioremap(mux_device->rw_mem->start,
+ resource_size(mux_device->rw_mem));
+ if (!mux_device->rw_base) {
+ rc = -ENOMEM;
+ iounmap(mux_device->ctl_base);
+ return rc;
+ }
val = msm_camera_io_r(mux_device->rw_base);
msm_camera_io_w((val | 0x200), mux_device->rw_base);
}
@@ -54,6 +67,8 @@ static int msm_i2c_mux_release(struct i2c_mux_device *mux_device)
if (mux_device->use_count == 0) {
val = msm_camera_io_r(mux_device->rw_base);
msm_camera_io_w((val & ~0x200), mux_device->rw_base);
+ iounmap(mux_device->rw_base);
+ iounmap(mux_device->ctl_base);
}
return 0;
}
@@ -110,54 +125,45 @@ static int i2c_mux_probe(struct platform_device *pdev)
platform_set_drvdata(pdev, &mux_device->subdev);
mutex_init(&mux_device->mutex);
- mux_device->ctl_base = msm_camera_get_reg_base(pdev,
- "i2c_mux_ctl", true);
- if (!mux_device->ctl_base) {
+ mux_device->ctl_mem = platform_get_resource_byname(pdev,
+ IORESOURCE_MEM, "i2c_mux_ctl");
+ if (!mux_device->ctl_mem) {
pr_err("%s: no mem resource?\n", __func__);
rc = -ENODEV;
- goto ctl_base_failed;
+ goto i2c_mux_no_resource;
}
- mux_device->rw_base = msm_camera_get_reg_base(pdev, "i2c_mux_rw", true);
+ mux_device->ctl_io = request_mem_region(mux_device->ctl_mem->start,
+ resource_size(mux_device->ctl_mem), pdev->name);
+ if (!mux_device->ctl_io) {
+ pr_err("%s: no valid mem region\n", __func__);
+ rc = -EBUSY;
+ goto i2c_mux_no_resource;
+ }
+ mux_device->rw_mem = platform_get_resource_byname(pdev,
+ IORESOURCE_MEM, "i2c_mux_rw");
if (!mux_device->rw_mem) {
pr_err("%s: no mem resource?\n", __func__);
rc = -ENODEV;
- goto rw_base_failed;
+ goto i2c_mux_no_resource;
+ }
+ mux_device->rw_io = request_mem_region(mux_device->rw_mem->start,
+ resource_size(mux_device->rw_mem), pdev->name);
+ if (!mux_device->rw_io) {
+ pr_err("%s: no valid mem region\n", __func__);
+ rc = -EBUSY;
+ goto i2c_mux_no_resource;
}
mux_device->pdev = pdev;
return 0;
-rw_base_failed:
- msm_camera_put_reg_base(pdev, mux_device->ctl_base,
- "i2c_mux_ctl", true);
-ctl_base_failed:
+i2c_mux_no_resource:
mutex_destroy(&mux_device->mutex);
kfree(mux_device);
return 0;
}
-static int i2c_mux_remove(struct platform_device *pdev)
-{
- struct v4l2_subdev *sub_dev = platform_get_drvdata(pdev);
- struct i2c_mux_device *mux_device;
-
- if (!sub_dev) {
- pr_err("%s: sub device is NULL\n", __func__);
- return 0;
- }
-
- mux_device = (struct mux_device *)v4l2_get_subdevdata(sub_dev);
- if (!mux_device) {
- pr_err("%s: sub device is NULL\n", __func__);
- return 0;
- }
-
- msm_camera_put_reg_base(pdev, mux_device->rw_base, "i2c_mux_ctl", true);
- msm_camera_put_reg_base(pdev, mux_device->ctl_base, "i2c_mux_rw", true);
-}
-
static struct platform_driver i2c_mux_driver = {
.probe = i2c_mux_probe,
- .remove = i2c_mux_remove,
.driver = {
.name = MSM_I2C_MUX_DRV_NAME,
.owner = THIS_MODULE,
diff --git a/drivers/media/platform/msm/camera_v2/sensor/io/msm_camera_i2c_mux.h b/drivers/media/platform/msm/camera_v2/sensor/io/msm_camera_i2c_mux.h
index 422de4ef3d36..649d499c76db 100644
--- a/drivers/media/platform/msm/camera_v2/sensor/io/msm_camera_i2c_mux.h
+++ b/drivers/media/platform/msm/camera_v2/sensor/io/msm_camera_i2c_mux.h
@@ -1,4 +1,4 @@
-/* Copyright (c) 2011-2014, 2016, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2011-2014, The Linux Foundation. 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
@@ -19,7 +19,11 @@
struct i2c_mux_device {
struct platform_device *pdev;
struct v4l2_subdev subdev;
+ struct resource *ctl_mem;
+ struct resource *ctl_io;
void __iomem *ctl_base;
+ struct resource *rw_mem;
+ struct resource *rw_io;
void __iomem *rw_base;
struct mutex mutex;
unsigned use_count;
diff --git a/drivers/media/platform/msm/camera_v2/sensor/laser_led/Makefile b/drivers/media/platform/msm/camera_v2/sensor/laser_led/Makefile
deleted file mode 100644
index e981fc2e1f9c..000000000000
--- a/drivers/media/platform/msm/camera_v2/sensor/laser_led/Makefile
+++ /dev/null
@@ -1,5 +0,0 @@
-ccflags-y += -Idrivers/media/platform/msm/camera_v2
-ccflags-y += -Idrivers/media/platform/msm/camera_v2/common
-ccflags-y += -Idrivers/media/platform/msm/camera_v2/sensor/io
-ccflags-y += -Idrivers/media/platform/msm/camera_v2/sensor/cci
-obj-$(CONFIG_MSMB_CAMERA) += msm_laser_led.o
diff --git a/drivers/media/platform/msm/camera_v2/sensor/laser_led/msm_laser_led.h b/drivers/media/platform/msm/camera_v2/sensor/laser_led/msm_laser_led.h
deleted file mode 100644
index d5cb8b435d12..000000000000
--- a/drivers/media/platform/msm/camera_v2/sensor/laser_led/msm_laser_led.h
+++ /dev/null
@@ -1,57 +0,0 @@
-/* Copyright (c) 2017, The Linux Foundation. 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
- * only version 2 as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- */
-
-#ifndef MSM_LASER_LED_H
-#define MSM_LASER_LED_H
-
-#include <linux/i2c.h>
-#include <linux/gpio.h>
-#include <soc/qcom/camera2.h>
-#include <media/v4l2-subdev.h>
-#include <media/msmb_camera.h>
-#include <linux/platform_device.h>
-#include <media/v4l2-ioctl.h>
-#include <media/msm_cam_sensor.h>
-#include "msm_camera_i2c.h"
-#include "msm_camera_dt_util.h"
-#include "msm_camera_io_util.h"
-#include "msm_sd.h"
-
-
-#define DEFINE_MSM_MUTEX(mutexname) \
- static struct mutex mutexname = __MUTEX_INITIALIZER(mutexname)
-
-enum msm_camera_laser_led_state_t {
- MSM_CAMERA_LASER_LED_INIT,
- MSM_CAMERA_LASER_LED_RELEASE,
-};
-
-struct msm_laser_led_ctrl_t;
-
-struct msm_laser_led_ctrl_t {
- struct msm_sd_subdev msm_sd;
- struct platform_device *pdev;
- struct msm_laser_led_func_t *func_tbl;
- struct msm_camera_power_ctrl_t power_info;
- struct i2c_driver *i2c_driver;
- struct platform_driver *pdriver;
- struct msm_camera_i2c_client i2c_client;
- enum msm_camera_device_type_t laser_led_device_type;
- struct v4l2_subdev sdev;
- struct v4l2_subdev_ops *laser_led_v4l2_subdev_ops;
- struct mutex *laser_led_mutex;
- enum msm_camera_laser_led_state_t laser_led_state;
- enum cci_i2c_master_t cci_master;
-};
-
-#endif
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 fcef05374098..b5099d795386 100644
--- a/drivers/media/platform/msm/camera_v2/sensor/msm_sensor.c
+++ b/drivers/media/platform/msm/camera_v2/sensor/msm_sensor.c
@@ -94,23 +94,16 @@ int32_t msm_sensor_free_sensor_data(struct msm_sensor_ctrl_t *s_ctrl)
kfree(s_ctrl->sensordata->power_info.power_down_setting);
kfree(s_ctrl->sensordata->csi_lane_params);
kfree(s_ctrl->sensordata->sensor_info);
- if (s_ctrl->sensor_device_type == MSM_CAMERA_I2C_DEVICE) {
- msm_camera_i2c_dev_put_clk_info(
- &s_ctrl->sensor_i2c_client->client->dev,
- &s_ctrl->sensordata->power_info.clk_info,
- &s_ctrl->sensordata->power_info.clk_ptr,
- s_ctrl->sensordata->power_info.clk_info_size);
- } else {
- msm_camera_put_clk_info(s_ctrl->pdev,
- &s_ctrl->sensordata->power_info.clk_info,
- &s_ctrl->sensordata->power_info.clk_ptr,
- s_ctrl->sensordata->power_info.clk_info_size);
- }
-
+ kfree(s_ctrl->sensordata->power_info.clk_info);
kfree(s_ctrl->sensordata);
return 0;
}
+static struct msm_cam_clk_info cam_8974_clk_info[] = {
+ [SENSOR_CAM_MCLK] = {"cam_src_clk", 24000000},
+ [SENSOR_CAM_CLK] = {"cam_clk", 0},
+};
+
int msm_sensor_power_down(struct msm_sensor_ctrl_t *s_ctrl)
{
struct msm_camera_power_ctrl_t *power_info;
@@ -899,6 +892,32 @@ static int msm_sensor_config32(struct msm_sensor_ctrl_t *s_ctrl,
}
break;
}
+ case CFG_RELEASE_CCI: {
+ if(s_ctrl->sensor_device_type == MSM_CAMERA_PLATFORM_DEVICE){
+ rc = s_ctrl->sensor_i2c_client->i2c_func_tbl->
+ i2c_util(s_ctrl->sensor_i2c_client, MSM_CCI_RELEASE);
+ if (rc < 0)
+ pr_err("MSM_CCI_RELEASE failed");
+ }
+ else{
+ rc = -EINVAL;
+ pr_err("CFG_RELEASE_CCI not support");
+ }
+ break;
+ }
+ case CFG_INIT_CCI: {
+ if(s_ctrl->sensor_device_type == MSM_CAMERA_PLATFORM_DEVICE){
+ rc = s_ctrl->sensor_i2c_client->i2c_func_tbl->
+ i2c_util(s_ctrl->sensor_i2c_client, MSM_CCI_INIT);
+ if (rc < 0)
+ pr_err("MSM_CCI_RELEASE failed");
+ }
+ else{
+ rc = -EINVAL;
+ pr_err("CFG_INIT_CCI not support");
+ }
+ break;
+ }
default:
rc = -EFAULT;
@@ -1386,6 +1405,32 @@ int msm_sensor_config(struct msm_sensor_ctrl_t *s_ctrl, void __user *argp)
}
break;
}
+ case CFG_RELEASE_CCI: {
+ if(s_ctrl->sensor_device_type == MSM_CAMERA_PLATFORM_DEVICE){
+ rc = s_ctrl->sensor_i2c_client->i2c_func_tbl->
+ i2c_util(s_ctrl->sensor_i2c_client, MSM_CCI_RELEASE);
+ if (rc < 0)
+ pr_err("MSM_CCI_RELEASE failed");
+ }
+ else{
+ rc = -EINVAL;
+ pr_err("CFG_RELEASE_CCI not support");
+ }
+ break;
+ }
+ case CFG_INIT_CCI: {
+ if(s_ctrl->sensor_device_type == MSM_CAMERA_PLATFORM_DEVICE){
+ rc = s_ctrl->sensor_i2c_client->i2c_func_tbl->
+ i2c_util(s_ctrl->sensor_i2c_client, MSM_CCI_INIT);
+ if (rc < 0)
+ pr_err("MSM_CCI_RELEASE failed");
+ }
+ else{
+ rc = -EINVAL;
+ pr_err("CFG_INIT_CCI not support");
+ }
+ break;
+ }
default:
rc = -EFAULT;
@@ -1488,7 +1533,9 @@ static struct msm_camera_i2c_fn_t msm_sensor_secure_func_tbl = {
int32_t msm_sensor_init_default_params(struct msm_sensor_ctrl_t *s_ctrl)
{
+ int32_t rc = -ENOMEM;
struct msm_camera_cci_client *cci_client = NULL;
+ struct msm_cam_clk_info *clk_info = NULL;
unsigned long mount_pos = 0;
/* Validate input parameters */
@@ -1542,6 +1589,19 @@ int32_t msm_sensor_init_default_params(struct msm_sensor_ctrl_t *s_ctrl)
if (!s_ctrl->sensor_v4l2_subdev_ops)
s_ctrl->sensor_v4l2_subdev_ops = &msm_sensor_subdev_ops;
+ /* Initialize clock info */
+ clk_info = kzalloc(sizeof(cam_8974_clk_info), GFP_KERNEL);
+ if (!clk_info) {
+ pr_err("%s:%d failed no memory clk_info %p\n", __func__,
+ __LINE__, clk_info);
+ rc = -ENOMEM;
+ goto FREE_CCI_CLIENT;
+ }
+ memcpy(clk_info, cam_8974_clk_info, sizeof(cam_8974_clk_info));
+ s_ctrl->sensordata->power_info.clk_info = clk_info;
+ s_ctrl->sensordata->power_info.clk_info_size =
+ ARRAY_SIZE(cam_8974_clk_info);
+
/* Update sensor mount angle and position in media entity flag */
mount_pos = s_ctrl->sensordata->sensor_info->position << 16;
mount_pos = mount_pos | ((s_ctrl->sensordata->sensor_info->
@@ -1549,4 +1609,8 @@ int32_t msm_sensor_init_default_params(struct msm_sensor_ctrl_t *s_ctrl)
s_ctrl->msm_sd.sd.entity.flags = mount_pos | MEDIA_ENT_FL_DEFAULT;
return 0;
+
+FREE_CCI_CLIENT:
+ kfree(cci_client);
+ return rc;
}
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 8f55f453bf03..5d57ec8c28ff 100644
--- a/drivers/media/platform/msm/camera_v2/sensor/msm_sensor.h
+++ b/drivers/media/platform/msm/camera_v2/sensor/msm_sensor.h
@@ -89,7 +89,6 @@ struct msm_sensor_ctrl_t {
uint32_t set_mclk_23880000;
uint8_t is_csid_tg_mode;
uint32_t is_secure;
- uint8_t bypass_video_node_creation;
};
int msm_sensor_config(struct msm_sensor_ctrl_t *s_ctrl, void __user *argp);
diff --git a/drivers/media/platform/msm/camera_v2/sensor/msm_sensor_driver.c b/drivers/media/platform/msm/camera_v2/sensor/msm_sensor_driver.c
index 3f180735dd95..8a74abc76227 100644
--- a/drivers/media/platform/msm/camera_v2/sensor/msm_sensor_driver.c
+++ b/drivers/media/platform/msm/camera_v2/sensor/msm_sensor_driver.c
@@ -86,14 +86,11 @@ static int32_t msm_sensor_driver_create_i2c_v4l_subdev
struct i2c_client *client = s_ctrl->sensor_i2c_client->client;
CDBG("%s %s I2c probe succeeded\n", __func__, client->name);
- if (s_ctrl->bypass_video_node_creation == 0) {
- rc = camera_init_v4l2(&client->dev, &session_id);
- if (rc < 0) {
- pr_err("failed: camera_init_i2c_v4l2 rc %d", rc);
- return rc;
- }
+ rc = camera_init_v4l2(&client->dev, &session_id);
+ if (rc < 0) {
+ pr_err("failed: camera_init_i2c_v4l2 rc %d", rc);
+ return rc;
}
-
CDBG("%s rc %d session_id %d\n", __func__, rc, session_id);
snprintf(s_ctrl->msm_sd.sd.name,
sizeof(s_ctrl->msm_sd.sd.name), "%s",
@@ -130,14 +127,11 @@ static int32_t msm_sensor_driver_create_v4l_subdev
int32_t rc = 0;
uint32_t session_id = 0;
- if (s_ctrl->bypass_video_node_creation == 0) {
- rc = camera_init_v4l2(&s_ctrl->pdev->dev, &session_id);
- if (rc < 0) {
- pr_err("failed: camera_init_v4l2 rc %d", rc);
- return rc;
- }
+ rc = camera_init_v4l2(&s_ctrl->pdev->dev, &session_id);
+ if (rc < 0) {
+ pr_err("failed: camera_init_v4l2 rc %d", rc);
+ return rc;
}
-
CDBG("rc %d session_id %d", rc, session_id);
s_ctrl->sensordata->sensor_info->session_id = session_id;
@@ -297,45 +291,6 @@ static int32_t msm_sensor_fill_actuator_subdevid_by_name(
return rc;
}
-static int32_t msm_sensor_fill_laser_led_subdevid_by_name(
- struct msm_sensor_ctrl_t *s_ctrl)
-{
- int32_t rc = 0;
- struct device_node *src_node = NULL;
- uint32_t val = 0;
- int32_t *laser_led_subdev_id;
- struct msm_sensor_info_t *sensor_info;
- struct device_node *of_node = s_ctrl->of_node;
-
- if (!of_node)
- return -EINVAL;
-
- sensor_info = s_ctrl->sensordata->sensor_info;
- laser_led_subdev_id = &sensor_info->subdev_id[SUB_MODULE_LASER_LED];
- /* set sudev id to -1 and try to found new id */
- *laser_led_subdev_id = -1;
-
-
- src_node = of_parse_phandle(of_node, "qcom,laserled-src", 0);
- if (!src_node) {
- CDBG("%s:%d src_node NULL\n", __func__, __LINE__);
- } else {
- rc = of_property_read_u32(src_node, "cell-index", &val);
- CDBG("%s qcom,laser led cell index %d, rc %d\n", __func__,
- val, rc);
- of_node_put(src_node);
- src_node = NULL;
- if (rc < 0) {
- pr_err("%s cell index not found %d\n",
- __func__, __LINE__);
- return -EINVAL;
- }
- *laser_led_subdev_id = val;
- }
-
- return rc;
-}
-
static int32_t msm_sensor_fill_flash_subdevid_by_name(
struct msm_sensor_ctrl_t *s_ctrl)
{
@@ -820,8 +775,6 @@ int32_t msm_sensor_driver_probe(void *setting,
slave_info32->sensor_init_params;
slave_info->output_format =
slave_info32->output_format;
- slave_info->bypass_video_node_creation =
- !!slave_info32->bypass_video_node_creation;
kfree(slave_info32);
} else
#endif
@@ -864,8 +817,7 @@ int32_t msm_sensor_driver_probe(void *setting,
slave_info->sensor_init_params.position);
CDBG("mount %d",
slave_info->sensor_init_params.sensor_mount_angle);
- CDBG("bypass video node creation %d",
- slave_info->bypass_video_node_creation);
+
/* Validate camera id */
if (slave_info->camera_id >= MAX_CAMERAS) {
pr_err("failed: invalid camera id %d max %d",
@@ -1020,11 +972,6 @@ CSID_TG:
pr_err("%s failed %d\n", __func__, __LINE__);
goto free_camera_info;
}
- rc = msm_sensor_fill_laser_led_subdevid_by_name(s_ctrl);
- if (rc < 0) {
- pr_err("%s failed %d\n", __func__, __LINE__);
- goto free_camera_info;
- }
rc = msm_sensor_fill_ois_subdevid_by_name(s_ctrl);
if (rc < 0) {
@@ -1047,9 +994,6 @@ CSID_TG:
pr_err("%s probe succeeded", slave_info->sensor_name);
- s_ctrl->bypass_video_node_creation =
- slave_info->bypass_video_node_creation;
-
/*
* Create /dev/videoX node, comment for now until dummy /dev/videoX
* node is created and used by HAL
@@ -1352,27 +1296,15 @@ static int32_t msm_sensor_driver_platform_probe(struct platform_device *pdev)
s_ctrl->sensor_device_type = MSM_CAMERA_PLATFORM_DEVICE;
s_ctrl->of_node = pdev->dev.of_node;
- /*fill in platform device*/
- s_ctrl->pdev = pdev;
-
rc = msm_sensor_driver_parse(s_ctrl);
if (rc < 0) {
pr_err("failed: msm_sensor_driver_parse rc %d", rc);
goto FREE_S_CTRL;
}
- /* Get clocks information */
- rc = msm_camera_get_clk_info(s_ctrl->pdev,
- &s_ctrl->sensordata->power_info.clk_info,
- &s_ctrl->sensordata->power_info.clk_ptr,
- &s_ctrl->sensordata->power_info.clk_info_size);
- if (rc < 0) {
- pr_err("failed: msm_camera_get_clk_info rc %d", rc);
- goto FREE_S_CTRL;
- }
-
- /* Fill platform device id*/
+ /* Fill platform device */
pdev->id = s_ctrl->id;
+ s_ctrl->pdev = pdev;
/* Fill device in power info */
s_ctrl->sensordata->power_info.dev = &pdev->dev;
@@ -1416,20 +1348,8 @@ static int32_t msm_sensor_driver_i2c_probe(struct i2c_client *client,
if (s_ctrl->sensor_i2c_client != NULL) {
s_ctrl->sensor_i2c_client->client = client;
s_ctrl->sensordata->power_info.dev = &client->dev;
-
- /* Get clocks information */
- rc = msm_camera_i2c_dev_get_clk_info(
- &s_ctrl->sensor_i2c_client->client->dev,
- &s_ctrl->sensordata->power_info.clk_info,
- &s_ctrl->sensordata->power_info.clk_ptr,
- &s_ctrl->sensordata->power_info.clk_info_size);
- if (rc < 0) {
- pr_err("failed: msm_camera_i2c_dev_get_clk_info rc %d",
- rc);
- goto FREE_S_CTRL;
- }
+ return rc;
}
- return rc;
FREE_S_CTRL:
kfree(s_ctrl);
return rc;
diff --git a/drivers/media/platform/msm/camera_v2/sensor/ois/msm_ois.c b/drivers/media/platform/msm/camera_v2/sensor/ois/msm_ois.c
index 478ef5b7038d..3fe6978d520e 100644
--- a/drivers/media/platform/msm/camera_v2/sensor/ois/msm_ois.c
+++ b/drivers/media/platform/msm/camera_v2/sensor/ois/msm_ois.c
@@ -252,6 +252,8 @@ static int32_t msm_ois_write_settings(struct msm_ois_ctrl_t *o_ctrl,
settings[i].reg_data,
settings[i].data_type,
settings[i].delay);
+ if (rc != 0)
+ rc = -EINVAL;
break;
default:
@@ -974,7 +976,7 @@ static int32_t msm_ois_platform_probe(struct platform_device *pdev)
rc = msm_sensor_driver_get_gpio_data(&(msm_ois_t->gconf),
(&pdev->dev)->of_node);
- if (rc < 0) {
+ if (rc <= 0) {
pr_err("%s: No/Error OIS GPIO\n", __func__);
} else {
msm_ois_t->cam_pinctrl_status = 1;