diff options
| author | Subhajeet Muhuri <kenny3fcb@gmail.com> | 2018-10-06 18:16:32 +0530 |
|---|---|---|
| committer | Davide Garberi <dade.garberi@gmail.com> | 2022-07-27 19:23:19 +0200 |
| commit | c3c7e8e07875dece75d0403bf340c9fd72fac391 (patch) | |
| tree | f31b78459b2e56c9c12dcdfe7587624898382449 | |
| parent | 1893918532d632086ea127e5f4de94e3dccfd2ae (diff) | |
camera: Squash reverts to make ZUK's camera working for newer CAF tags
* Squash of:
commit 9c909f4a62201b2ebb0ba56038d31bb85ae55d81
Author: Subhajeet Muhuri <kenny3fcb@gmail.com>
Date: Sun Oct 28 14:47:09 2018 +0100
Revert "msm: camera: Add laser LED support for depth sensor"
* "Camera error: Can't connect to the camera"
This reverts commit 63f5792c5c6a8de2e40a9eee1195dfa264ff9431.
Signed-off-by: Davide Garberi <dade.garberi@gmail.com>
commit f7229d06853654871e970aa7bf604b01f38c3d37
Author: Subhajeet Muhuri <kenny3fcb@gmail.com>
Date: Thu Oct 11 20:21:32 2018 +0530
Revert "msm: camera: Bypass redundant creation of video node in stereo"
* Camera crashes upon launching
This reverts commit f977e44aeaf5da07338a4649caa45367461226f0.
Signed-off-by: Davide Garberi <dade.garberi@gmail.com>
commit b0b964a9b6714ee4ff6af4e7f587f99921e3312a
Author: YaroST12 <yaro330@gmail.com>
Date: Sat Oct 6 18:36:18 2018 +0530
Revert "msm: cpp: Query buffer from buffer manager based on index"
* Breaks slow motion video recording
This reverts commit ddff1a93bac277b1a0ba14c601d5236c3c36365d.
Signed-off-by: Davide Garberi <dade.garberi@gmail.com>
commit 5e1c739e4622428fa0b8fd9350946c31d2424b8e
Author: Davide Garberi <dade.garberi@gmail.com>
Date: Sun Oct 28 14:32:43 2018 +0100
Revert "msm: camera: Framedrop notification"
This reverts commit 5925180360bca209c21e9271e277caaca68bcad5.
Signed-off-by: Davide Garberi <dade.garberi@gmail.com>
commit 0ef5dc40955cd7946f0a851feda516c34dc40d6d
Author: YaroST12 <yaro330@gmail.com>
Date: Sat Oct 6 18:31:20 2018 +0530
Revert "msm: camera: sensor: Adapting sensor driver to soc layer"
* Kernel panics at boot
This reverts commit 6b99b4c9a1706f8f7f1745af97e0f4bddecf168b.
Signed-off-by: Davide Garberi <dade.garberi@gmail.com>
commit 1da8c59614f005d524455147fd78fc5f32cfa33b
Author: Subhajeet Muhuri <kenny3fcb@gmail.com>
Date: Fri Oct 5 12:24:29 2018 +0530
Revert "msm: camera: sensor: Updating soc layer clock API for i2c drivers"
* Required for the proper revert of 6b99b4c
This reverts commit a4663702036e6b0ae9b82691027d9913d65d7a02.
Signed-off-by: Davide Garberi <dade.garberi@gmail.com>
commit 1b138397ea01ae70f653baf6c812fb5748b3783b
Author: Subhajeet Muhuri <kenny3fcb@gmail.com>
Date: Sat Oct 6 18:19:19 2018 +0530
Revert "msm: camera: Add regulator enable and disable independent of CSID"
* Required for the proper revert of 6b99b4c
This reverts commit fd39134867896ec5c28ce348816e31e7785e06ba.
Signed-off-by: Davide Garberi <dade.garberi@gmail.com>
commit 12e0c65509260092e8c3f22717080427a78c9469
Author: Subhajeet Muhuri <kenny3fcb@gmail.com>
Date: Sat Oct 6 18:16:32 2018 +0530
Revert "msm: camera: Add regulator enable and disable in csiphy"
* Required for the proper revert of 6b99b4c
This reverts commit d3e47e331617af3c87138bd205e65c6fa1a1bca7.
Signed-off-by: Davide Garberi <dade.garberi@gmail.com>
Change-Id: Iaa6aa22bb518b930141092fab9f51567c7eae092
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 |
