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