summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLinux Build Service Account <lnxbuild@localhost>2017-01-09 01:32:02 -0800
committerGerrit - the friendly Code Review server <code-review@localhost>2017-01-09 01:32:02 -0800
commit7bf4e176b405657873cc6ddca6dddf8911de450d (patch)
tree45e7ad35d660bd321c6382d613b2a188292458e8
parent2113b4e7d269eca0f09587f0131dadf7cb580bcb (diff)
parent14ac9d67d830df2b5564330ad3398bcf289c7a4a (diff)
Merge "msm: cpp: Use regulator APIs for gdsc reg access"
-rw-r--r--drivers/media/platform/msm/camera_v2/common/cam_soc_api.c44
-rw-r--r--drivers/media/platform/msm/camera_v2/common/cam_soc_api.h17
-rw-r--r--drivers/media/platform/msm/camera_v2/pproc/cpp/msm_cpp.c36
-rw-r--r--drivers/media/platform/msm/camera_v2/pproc/cpp/msm_cpp.h2
-rw-r--r--drivers/media/platform/msm/camera_v2/pproc/cpp/msm_cpp_soc.c12
5 files changed, 87 insertions, 24 deletions
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 6c09f3820dfd..34fffa8dd7ce 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
@@ -686,6 +686,50 @@ error:
}
EXPORT_SYMBOL(msm_camera_regulator_enable);
+/* set regulator mode */
+int msm_camera_regulator_set_mode(struct msm_cam_regulator *vdd_info,
+ int cnt, bool mode)
+{
+ int i;
+ int rc;
+ struct msm_cam_regulator *tmp = vdd_info;
+
+ if (!tmp) {
+ pr_err("Invalid params");
+ return -EINVAL;
+ }
+ CDBG("cnt : %d\n", cnt);
+
+ for (i = 0; i < cnt; i++) {
+ if (tmp && !IS_ERR_OR_NULL(tmp->vdd)) {
+ CDBG("name : %s, enable : %d\n", tmp->name, mode);
+ if (mode) {
+ rc = regulator_set_mode(tmp->vdd,
+ REGULATOR_MODE_FAST);
+ if (rc < 0) {
+ pr_err("regulator enable failed %d\n",
+ i);
+ goto error;
+ }
+ } else {
+ rc = regulator_set_mode(tmp->vdd,
+ REGULATOR_MODE_NORMAL);
+ if (rc < 0)
+ pr_err("regulator disable failed %d\n",
+ i);
+ goto error;
+ }
+ }
+ tmp++;
+ }
+
+ return 0;
+error:
+ return rc;
+}
+EXPORT_SYMBOL(msm_camera_regulator_set_mode);
+
+
/* Put regulators regulators */
void msm_camera_put_regulators(struct platform_device *pdev,
struct msm_cam_regulator **vdd_info, int cnt)
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 0e9d26bebe30..55074490bd72 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
@@ -248,6 +248,23 @@ int msm_camera_regulator_enable(struct msm_cam_regulator *vdd_info,
int cnt, int enable);
/**
+ * @brief : set the regultors mode
+ *
+ * This function sets the regulators for a specific
+ * mode. say:REGULATOR_MODE_FAST/REGULATOR_MODE_NORMAL
+ *
+ * @param vdd_info: Pointer to list of regulators
+ * @param cnt: Number of regulators to enable/disable
+ * @param mode: Flags specifies either enable/disable
+ *
+ * @return Status of operation. Negative in case of error. Zero otherwise.
+ */
+
+int msm_camera_regulator_set_mode(struct msm_cam_regulator *vdd_info,
+ int cnt, bool mode);
+
+
+/**
* @brief : Release the regulators
*
* This function releases the regulator resources.
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 2c661fbcd83c..1cf2c54aa8b8 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
@@ -1372,6 +1372,7 @@ static int cpp_open_node(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh)
mutex_unlock(&cpp_dev->mutex);
return rc;
}
+
cpp_dev->state = CPP_STATE_IDLE;
CPP_DBG("Invoking msm_ion_client_create()\n");
@@ -4184,27 +4185,22 @@ static int msm_cpp_update_gdscr_status(struct cpp_device *cpp_dev,
bool status)
{
int rc = 0;
- int value = 0;
-
+ uint32_t msm_cpp_reg_idx;
if (!cpp_dev) {
pr_err("%s: cpp device invalid\n", __func__);
rc = -EINVAL;
goto end;
}
-
- if (cpp_dev->camss_cpp_base) {
- value = msm_camera_io_r(cpp_dev->camss_cpp_base);
- pr_debug("value from camss cpp %x, status %d\n", value, status);
- if (status) {
- value &= CPP_GDSCR_SW_COLLAPSE_ENABLE;
- value |= CPP_GDSCR_HW_CONTROL_ENABLE;
- } else {
- value |= CPP_GDSCR_HW_CONTROL_DISABLE;
- value &= CPP_GDSCR_SW_COLLAPSE_DISABLE;
- }
- pr_debug("value %x after camss cpp mask\n", value);
- msm_camera_io_w(value, cpp_dev->camss_cpp_base);
+ msm_cpp_reg_idx = msm_cpp_get_regulator_index(cpp_dev, "vdd");
+ if (msm_cpp_reg_idx < 0) {
+ pr_err(" Fail to regulator index\n");
+ return -EINVAL;
}
+ rc = msm_camera_regulator_set_mode(cpp_dev->cpp_vdd +
+ msm_cpp_reg_idx, 1, status);
+ if (rc < 0)
+ pr_err("update cpp gdscr status failed\n");
+
end:
return rc;
}
@@ -4313,14 +4309,6 @@ static int cpp_probe(struct platform_device *pdev)
memset(&cpp_vbif, 0, sizeof(struct msm_cpp_vbif_data));
cpp_dev->vbif_data = &cpp_vbif;
- cpp_dev->camss_cpp_base =
- msm_camera_get_reg_base(pdev, "camss_cpp", true);
- if (!cpp_dev->camss_cpp_base) {
- rc = -ENOMEM;
- pr_err("failed to get camss_cpp_base\n");
- goto camss_cpp_base_failed;
- }
-
cpp_dev->base =
msm_camera_get_reg_base(pdev, "cpp", true);
if (!cpp_dev->base) {
@@ -4492,7 +4480,7 @@ vbif_base_failed:
cpp_base_failed:
msm_camera_put_reg_base(pdev, cpp_dev->camss_cpp_base,
"camss_cpp", true);
-camss_cpp_base_failed:
+
kfree(cpp_dev);
return rc;
}
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 470c0cf1131b..e69b9d633a1f 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
@@ -289,6 +289,8 @@ struct cpp_device {
int msm_cpp_set_micro_clk(struct cpp_device *cpp_dev);
int msm_update_freq_tbl(struct cpp_device *cpp_dev);
int msm_cpp_get_clock_index(struct cpp_device *cpp_dev, const char *clk_name);
+int msm_cpp_get_regulator_index(struct cpp_device *cpp_dev,
+ const char *regulator_name);
long msm_cpp_set_core_clk(struct cpp_device *cpp_dev, long rate, int idx);
void msm_cpp_fetch_dt_params(struct cpp_device *cpp_dev);
int msm_cpp_read_payload_params_from_dt(struct cpp_device *cpp_dev);
diff --git a/drivers/media/platform/msm/camera_v2/pproc/cpp/msm_cpp_soc.c b/drivers/media/platform/msm/camera_v2/pproc/cpp/msm_cpp_soc.c
index ddd32fc5c339..f016c348f144 100644
--- a/drivers/media/platform/msm/camera_v2/pproc/cpp/msm_cpp_soc.c
+++ b/drivers/media/platform/msm/camera_v2/pproc/cpp/msm_cpp_soc.c
@@ -71,6 +71,18 @@ int msm_cpp_get_clock_index(struct cpp_device *cpp_dev, const char *clk_name)
return -EINVAL;
}
+int msm_cpp_get_regulator_index(struct cpp_device *cpp_dev,
+ const char *regulator_name)
+{
+ uint32_t i = 0;
+
+ for (i = 0; i < cpp_dev->num_reg; i++) {
+ if (!strcmp(regulator_name, cpp_dev->cpp_vdd[i].name))
+ return i;
+ }
+ return -EINVAL;
+}
+
static int cpp_get_clk_freq_tbl_dt(struct cpp_device *cpp_dev)
{
uint32_t i, count, min_clk_rate;