summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Documentation/devicetree/bindings/media/video/msm-cci.txt32
-rw-r--r--arch/arm/boot/dts/qcom/msm8996-camera.dtsi36
-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/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/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/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.c38
-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--include/media/msm_cam_sensor.h15
-rw-r--r--include/media/msmb_generic_buf_mgr.h4
-rw-r--r--include/soc/qcom/camera2.h5
-rw-r--r--include/uapi/media/msm_cam_sensor.h13
-rw-r--r--include/uapi/media/msm_camsensor_sdk.h10
-rw-r--r--include/uapi/media/msmb_camera.h1
-rw-r--r--include/uapi/media/msmb_generic_buf_mgr.h2
35 files changed, 841 insertions, 1142 deletions
diff --git a/Documentation/devicetree/bindings/media/video/msm-cci.txt b/Documentation/devicetree/bindings/media/video/msm-cci.txt
index c5c82a89f662..bb413af4b54d 100644
--- a/Documentation/devicetree/bindings/media/video/msm-cci.txt
+++ b/Documentation/devicetree/bindings/media/video/msm-cci.txt
@@ -205,31 +205,6 @@ Optional properties:
(in the same order).
- cam_vaf-supply : should contain regulator from which AF voltage is supplied
-* Qualcomm Technologies, Inc. MSM LASER LED
-
-Required properties:
-- cell-index : should contain unique identifier to differentiate
- between multiple laser led modules
-- reg : should contain i2c slave address of the laser led and length of
- data field which is 0x0
-- compatible :
- - "qcom,laser-led"
-- qcom,cci-master : should contain i2c master id to be used for this camera
- sensor
- - 0 -> MASTER 0
- - 1 -> MASTER 1
-
-Optional properties:
-- qcom,cam-vreg-name : should contain names of all regulators needed by this
- laser led
-- qcom,cam-vreg-min-voltage : should contain minimum voltage level in microvolts
- for regulators mentioned in qcom,cam-vreg-name property (in the same order)
-- qcom,cam-vreg-max-voltage : should contain maximum voltage level in microvolts
- for regulators mentioned in qcom,cam-vreg-name property (in the same order)
-- qcom,cam-vreg-op-mode : should contain the maximum current in microamps
- required from the regulators mentioned in the qcom,cam-vreg-name property
- (in the same order).
-
* Qualcomm Technologies, Inc. MSM OIS
Required properties:
@@ -302,13 +277,6 @@ Example:
qcom,cam-vreg-op-mode = <100000>;
};
- laserled0: qcom,laserled@0 {
- cell-index = <0>;
- reg = <0x0>;
- compatible = "qcom,laser-led";
- qcom,cci-master = <1>;
- };
-
qcom,camera@0 {
cell-index = <0>;
compatible = "qcom,camera";
diff --git a/arch/arm/boot/dts/qcom/msm8996-camera.dtsi b/arch/arm/boot/dts/qcom/msm8996-camera.dtsi
index d9ffdc45661b..d411be8baa28 100644
--- a/arch/arm/boot/dts/qcom/msm8996-camera.dtsi
+++ b/arch/arm/boot/dts/qcom/msm8996-camera.dtsi
@@ -28,24 +28,18 @@
reg-names = "csiphy", "csiphy_clk_mux";
interrupts = <0 78 0>;
interrupt-names = "csiphy";
- qcom,csi-vdd-voltage = <1250000>;
- qcom,mipi-csi-vdd-supply = <&pm8994_l2>;
- mmagic-supply = <&gdsc_mmagic_camss>;
- gdscr-supply = <&gdsc_camss_top>;
- qcom,cam-vreg-name = "mmagic", "gdscr";
- clocks = <&clock_mmss clk_mmss_mmagic_ahb_clk>,
- <&clock_mmss clk_camss_top_ahb_clk>,
+ clocks = <&clock_mmss clk_camss_top_ahb_clk>,
<&clock_mmss clk_camss_ispif_ahb_clk>,
<&clock_mmss clk_csi0phytimer_clk_src>,
<&clock_mmss clk_camss_csi0phytimer_clk>,
<&clock_mmss clk_camss_ahb_clk>,
<&clock_mmss clk_csiphy0_3p_clk_src>,
<&clock_mmss clk_camss_csiphy0_3p_clk>;
- clock-names = "mmagic_ahb_clk", "camss_top_ahb_clk",
+ clock-names = "camss_top_ahb_clk",
"ispif_ahb_clk", "csiphy_timer_src_clk",
"csiphy_timer_clk", "camss_ahb_clk",
"csiphy_3p_clk_src", "csi_phy_3p_clk";
- qcom,clock-rates = <0 0 0 200000000 0 0 100000000 0>;
+ qcom,clock-rates = <0 0 200000000 0 0 100000000 0>;
};
qcom,csiphy@a35000 {
@@ -55,24 +49,18 @@
reg-names = "csiphy", "csiphy_clk_mux";
interrupts = <0 79 0>;
interrupt-names = "csiphy";
- qcom,csi-vdd-voltage = <1250000>;
- qcom,mipi-csi-vdd-supply = <&pm8994_l2>;
- mmagic-supply = <&gdsc_mmagic_camss>;
- gdscr-supply = <&gdsc_camss_top>;
- qcom,cam-vreg-name = "mmagic", "gdscr";
- clocks = <&clock_mmss clk_mmss_mmagic_ahb_clk>,
- <&clock_mmss clk_camss_top_ahb_clk>,
+ clocks = <&clock_mmss clk_camss_top_ahb_clk>,
<&clock_mmss clk_camss_ispif_ahb_clk>,
<&clock_mmss clk_csi1phytimer_clk_src>,
<&clock_mmss clk_camss_csi1phytimer_clk>,
<&clock_mmss clk_camss_ahb_clk>,
<&clock_mmss clk_csiphy1_3p_clk_src>,
<&clock_mmss clk_camss_csiphy1_3p_clk>;
- clock-names = "mmagic_ahb_clk", "camss_top_ahb_clk",
+ clock-names = "camss_top_ahb_clk",
"ispif_ahb_clk", "csiphy_timer_src_clk",
"csiphy_timer_clk", "camss_ahb_clk",
"csiphy_3p_clk_src", "csi_phy_3p_clk";
- qcom,clock-rates = <0 0 0 200000000 0 0 100000000 0>;
+ qcom,clock-rates = <0 0 200000000 0 0 100000000 0>;
};
qcom,csiphy@a36000 {
@@ -82,24 +70,18 @@
reg-names = "csiphy", "csiphy_clk_mux";
interrupts = <0 80 0>;
interrupt-names = "csiphy";
- qcom,csi-vdd-voltage = <1250000>;
- qcom,mipi-csi-vdd-supply = <&pm8994_l2>;
- mmagic-supply = <&gdsc_mmagic_camss>;
- gdscr-supply = <&gdsc_camss_top>;
- qcom,cam-vreg-name = "mmagic", "gdscr";
- clocks = <&clock_mmss clk_mmss_mmagic_ahb_clk>,
- <&clock_mmss clk_camss_top_ahb_clk>,
+ clocks = <&clock_mmss clk_camss_top_ahb_clk>,
<&clock_mmss clk_camss_ispif_ahb_clk>,
<&clock_mmss clk_csi2phytimer_clk_src>,
<&clock_mmss clk_camss_csi2phytimer_clk>,
<&clock_mmss clk_camss_ahb_clk>,
<&clock_mmss clk_csiphy2_3p_clk_src>,
<&clock_mmss clk_camss_csiphy2_3p_clk>;
- clock-names = "mmagic_ahb_clk", "camss_top_ahb_clk",
+ clock-names = "camss_top_ahb_clk",
"ispif_ahb_clk", "csiphy_timer_src_clk",
"csiphy_timer_clk", "camss_ahb_clk",
"csiphy_3p_clk_src", "csi_phy_3p_clk";
- qcom,clock-rates = <0 0 0 200000000 0 0 100000000 0>;
+ qcom,clock-rates = <0 0 200000000 0 0 100000000 0>;
};
qcom,csid@a30000 {
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/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/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 31d2fdc24322..44a4ad7822cb 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/io/msm_camera_dt_util.c b/drivers/media/platform/msm/camera_v2/sensor/io/msm_camera_dt_util.c
index 4a4f0995785f..e0b703321dae 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
@@ -1464,7 +1464,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;
@@ -1472,9 +1472,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;
@@ -1565,6 +1568,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;
@@ -1667,9 +1678,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..effe16d21157 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;
@@ -1488,7 +1481,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 +1537,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 +1557,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/include/media/msm_cam_sensor.h b/include/media/msm_cam_sensor.h
index 2c8b651147e0..75d0912aa459 100644
--- a/include/media/msm_cam_sensor.h
+++ b/include/media/msm_cam_sensor.h
@@ -41,7 +41,6 @@ struct msm_camera_sensor_slave_info32 {
uint8_t is_init_params_valid;
struct msm_sensor_init_params sensor_init_params;
enum msm_sensor_output_format_t output_format;
- uint8_t bypass_video_node_creation;
};
struct msm_camera_csid_lut_params32 {
@@ -84,15 +83,6 @@ struct msm_ir_cut_cfg_data_t32 {
enum msm_ir_cut_cfg_type_t cfg_type;
};
-struct msm_laser_led_cfg_data_t32 {
- enum msm_laser_led_cfg_type_t cfg_type;
- compat_uptr_t setting;
- compat_uptr_t debug_reg;
- uint32_t debug_reg_size;
- uint16_t i2c_addr;
- enum i2c_freq_mode_t i2c_freq_mode;
-};
-
struct eeprom_read_t32 {
compat_uptr_t dbuffer;
uint32_t num_bytes;
@@ -285,10 +275,7 @@ struct msm_flash_cfg_data_t32 {
#define VIDIOC_MSM_IR_CUT_CFG32 \
_IOWR('V', BASE_VIDIOC_PRIVATE + 15, struct msm_ir_cut_cfg_data_t32)
-
-#define VIDIOC_MSM_LASER_LED_CFG32 \
- _IOWR('V', BASE_VIDIOC_PRIVATE + 16, struct msm_laser_led_cfg_data_t32)
-
#endif
#endif
+
diff --git a/include/media/msmb_generic_buf_mgr.h b/include/media/msmb_generic_buf_mgr.h
index 3cb82668acde..6588420fd6fd 100644
--- a/include/media/msmb_generic_buf_mgr.h
+++ b/include/media/msmb_generic_buf_mgr.h
@@ -1,4 +1,4 @@
-/* Copyright (c) 2013-2016, 2018 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
@@ -43,8 +43,6 @@ struct msm_buf_mngr_info32_t {
#define VIDIOC_MSM_BUF_MNGR_FLUSH32 \
_IOWR('V', BASE_VIDIOC_PRIVATE + 39, struct msm_buf_mngr_info32_t)
-#define VIDIOC_MSM_BUF_MNGR_BUF_ERROR32 \
- _IOWR('V', BASE_VIDIOC_PRIVATE + 41, struct msm_buf_mngr_info32_t)
#endif
#endif
diff --git a/include/soc/qcom/camera2.h b/include/soc/qcom/camera2.h
index 5a61d2b372c3..d6b3311d3b42 100644
--- a/include/soc/qcom/camera2.h
+++ b/include/soc/qcom/camera2.h
@@ -1,4 +1,4 @@
-/* Copyright (c) 2011-2016, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2011-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
@@ -105,11 +105,10 @@ struct msm_camera_power_ctrl_t {
struct camera_vreg_t *cam_vreg;
int num_vreg;
struct msm_camera_i2c_conf *i2c_conf;
- struct clk **clk_ptr;
struct msm_cam_clk_info *clk_info;
struct msm_pinctrl_info pinctrl_info;
uint8_t cam_pinctrl_status;
- size_t clk_info_size;
+ uint16_t clk_info_size;
};
enum msm_camera_actuator_name {
diff --git a/include/uapi/media/msm_cam_sensor.h b/include/uapi/media/msm_cam_sensor.h
index e4b4554dd690..2f10a300b817 100644
--- a/include/uapi/media/msm_cam_sensor.h
+++ b/include/uapi/media/msm_cam_sensor.h
@@ -90,7 +90,6 @@ enum sensor_sub_module_t {
SUB_MODULE_EXT,
SUB_MODULE_IR_LED,
SUB_MODULE_IR_CUT,
- SUB_MODULE_LASER_LED,
SUB_MODULE_MAX,
};
@@ -304,15 +303,6 @@ struct msm_ir_cut_cfg_data_t {
enum msm_ir_cut_cfg_type_t cfg_type;
};
-struct msm_laser_led_cfg_data_t {
- enum msm_laser_led_cfg_type_t cfg_type;
- void __user *setting;
- void __user *debug_reg;
- uint32_t debug_reg_size;
- uint16_t i2c_addr;
- enum i2c_freq_mode_t i2c_freq_mode;
-};
-
struct msm_eeprom_cfg_data {
enum eeprom_cfg_type_t cfgtype;
uint8_t is_supported;
@@ -630,8 +620,5 @@ struct sensor_init_cfg_data {
#define VIDIOC_MSM_IR_CUT_CFG \
_IOWR('V', BASE_VIDIOC_PRIVATE + 15, struct msm_ir_cut_cfg_data_t)
-#define VIDIOC_MSM_LASER_LED_CFG \
- _IOWR('V', BASE_VIDIOC_PRIVATE + 16, struct msm_laser_led_cfg_data_t)
-
#endif
diff --git a/include/uapi/media/msm_camsensor_sdk.h b/include/uapi/media/msm_camsensor_sdk.h
index 40731a927ce5..2f7bc77887ad 100644
--- a/include/uapi/media/msm_camsensor_sdk.h
+++ b/include/uapi/media/msm_camsensor_sdk.h
@@ -48,8 +48,6 @@
#define MSM_EEPROM_MEMORY_MAP_MAX_SIZE 80
#define MSM_EEPROM_MAX_MEM_MAP_CNT 8
-#define MSM_SENSOR_BYPASS_VIDEO_NODE 1
-
#define FRONT_AUX_SENSOR_SUPPORT
enum msm_sensor_camera_id_t {
@@ -211,13 +209,6 @@ enum msm_ir_led_cfg_type_t {
#define CFG_IR_LED_OFF CFG_IR_LED_OFF
#define CFG_IR_LED_ON CFG_IR_LED_ON
-enum msm_laser_led_cfg_type_t {
- CFG_LASER_LED_INIT,
- CFG_LASER_LED_CONTROL,
-};
-#define CFG_LASER_LED_INIT CFG_LASER_LED_INIT
-#define CFG_LASER_LED_CONTROL CFG_LASER_LED_CONTROL
-
enum msm_ir_cut_cfg_type_t {
CFG_IR_CUT_INIT = 0,
CFG_IR_CUT_RELEASE,
@@ -316,7 +307,6 @@ struct msm_camera_sensor_slave_info {
unsigned char is_init_params_valid;
struct msm_sensor_init_params sensor_init_params;
enum msm_sensor_output_format_t output_format;
- uint8_t bypass_video_node_creation;
};
struct msm_camera_i2c_reg_array {
diff --git a/include/uapi/media/msmb_camera.h b/include/uapi/media/msmb_camera.h
index 0a2dd446ccc4..d9e085c9f7b5 100644
--- a/include/uapi/media/msmb_camera.h
+++ b/include/uapi/media/msmb_camera.h
@@ -52,7 +52,6 @@
#define MSM_CAMERA_SUBDEV_IR_CUT 18
#define MSM_CAMERA_SUBDEV_EXT 19
#define MSM_CAMERA_SUBDEV_TOF 20
-#define MSM_CAMERA_SUBDEV_LASER_LED 21
#define MSM_MAX_CAMERA_SENSORS 6
/* The below macro is defined to put an upper limit on maximum
diff --git a/include/uapi/media/msmb_generic_buf_mgr.h b/include/uapi/media/msmb_generic_buf_mgr.h
index 8dad9ae92cf8..2961cae1e7c1 100644
--- a/include/uapi/media/msmb_generic_buf_mgr.h
+++ b/include/uapi/media/msmb_generic_buf_mgr.h
@@ -62,7 +62,5 @@ struct msm_buf_mngr_main_cont_info {
_IOWR('V', BASE_VIDIOC_PRIVATE + 40, \
struct msm_camera_private_ioctl_arg)
-#define VIDIOC_MSM_BUF_MNGR_BUF_ERROR \
- _IOWR('V', BASE_VIDIOC_PRIVATE + 41, struct msm_buf_mngr_info)
#endif