Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c651d58e authored by Camera Software Integration's avatar Camera Software Integration Committed by Gerrit - the friendly Code Review server
Browse files

Merge "msm: camera: ife: Add support to provide IFE count in Query caps" into camera-kernel.lnx.4.0

parents 083b98cd 6de4fa2e
Loading
Loading
Loading
Loading
+97 −7
Original line number Diff line number Diff line
@@ -182,6 +182,11 @@ static int cam_ife_mgr_get_hw_caps(void *hw_mgr_priv,
	struct cam_ife_hw_mgr             *hw_mgr = hw_mgr_priv;
	struct cam_query_cap_cmd          *query = hw_caps_args;
	struct cam_isp_query_cap_cmd       query_isp;
	struct cam_isp_dev_cap_info       *ife_full_hw_info = NULL;
	struct cam_isp_dev_cap_info       *ife_lite_hw_info = NULL;
	struct cam_isp_dev_cap_info       *csid_full_hw_info = NULL;
	struct cam_isp_dev_cap_info       *csid_lite_hw_info = NULL;
	struct cam_ife_csid_hw_caps       *ife_csid_caps = {0};

	CAM_DBG(CAM_ISP, "enter");

@@ -196,13 +201,98 @@ static int cam_ife_mgr_get_hw_caps(void *hw_mgr_priv,
	query_isp.device_iommu.secure = hw_mgr->mgr_common.img_iommu_hdl_secure;
	query_isp.cdm_iommu.non_secure = hw_mgr->mgr_common.cmd_iommu_hdl;
	query_isp.cdm_iommu.secure = hw_mgr->mgr_common.cmd_iommu_hdl_secure;
	query_isp.num_dev = 2;
	for (i = 0; i < query_isp.num_dev; i++) {
		query_isp.dev_caps[i].hw_type = CAM_ISP_HW_IFE;
		query_isp.dev_caps[i].hw_version.major = 1;
		query_isp.dev_caps[i].hw_version.minor = 7;
		query_isp.dev_caps[i].hw_version.incr = 0;
		query_isp.dev_caps[i].hw_version.reserved = 0;
	query_isp.num_dev = 0;

	for (i = 0; i < CAM_IFE_HW_NUM_MAX; i++) {
		if (!hw_mgr->ife_devices[i])
			continue;

		if (hw_mgr->ife_dev_caps[i].is_lite) {
			if (ife_lite_hw_info == NULL) {
				ife_lite_hw_info =
					&query_isp.dev_caps[query_isp.num_dev];
				query_isp.num_dev++;

				ife_lite_hw_info->hw_type = CAM_ISP_HW_IFE_LITE;
				ife_lite_hw_info->hw_version.major =
					hw_mgr->ife_dev_caps[i].major;
				ife_lite_hw_info->hw_version.minor =
					hw_mgr->ife_dev_caps[i].minor;
				ife_lite_hw_info->hw_version.incr =
					hw_mgr->ife_dev_caps[i].incr;
				ife_lite_hw_info->hw_version.reserved = 0;
				ife_lite_hw_info->num_hw = 0;
			}

			ife_lite_hw_info->num_hw++;

		} else {
			if (ife_full_hw_info == NULL) {
				ife_full_hw_info =
					&query_isp.dev_caps[query_isp.num_dev];
				query_isp.num_dev++;

				ife_full_hw_info->hw_type = CAM_ISP_HW_IFE;
				ife_full_hw_info->hw_version.major =
					hw_mgr->ife_dev_caps[i].major;
				ife_full_hw_info->hw_version.minor =
					hw_mgr->ife_dev_caps[i].minor;
				ife_full_hw_info->hw_version.incr =
					hw_mgr->ife_dev_caps[i].incr;
				ife_full_hw_info->hw_version.reserved = 0;
				ife_full_hw_info->num_hw = 0;
			}

			ife_full_hw_info->num_hw++;
		}
	}

	for (i = 0; i < CAM_IFE_CSID_HW_NUM_MAX; i++) {
		if (!hw_mgr->csid_devices[i])
			continue;

		ife_csid_caps = (struct cam_ife_csid_hw_caps *)
			&hw_mgr->ife_csid_dev_caps[i];

		if (ife_csid_caps->is_lite) {
			if (csid_lite_hw_info == NULL) {
				csid_lite_hw_info =
					&query_isp.dev_caps[query_isp.num_dev];
				query_isp.num_dev++;

				csid_lite_hw_info->hw_type =
					CAM_ISP_HW_CSID_LITE;
				csid_lite_hw_info->hw_version.major =
					ife_csid_caps->major_version;
				csid_lite_hw_info->hw_version.minor =
					ife_csid_caps->minor_version;
				csid_lite_hw_info->hw_version.incr =
					ife_csid_caps->version_incr;
				csid_lite_hw_info->hw_version.reserved = 0;
				csid_lite_hw_info->num_hw = 0;
			}

			csid_lite_hw_info->num_hw++;

		} else {
			if (csid_full_hw_info == NULL) {
				csid_full_hw_info =
					&query_isp.dev_caps[query_isp.num_dev];
				query_isp.num_dev++;

				csid_full_hw_info->hw_type = CAM_ISP_HW_CSID;
				csid_full_hw_info->hw_version.major =
					ife_csid_caps->major_version;
				csid_full_hw_info->hw_version.minor =
					ife_csid_caps->minor_version;
				csid_full_hw_info->hw_version.incr =
					ife_csid_caps->version_incr;
				csid_full_hw_info->hw_version.reserved = 0;
				csid_full_hw_info->num_hw = 0;
			}

			csid_full_hw_info->num_hw++;
		}
	}

	if (copy_to_user(u64_to_user_ptr(query->caps_handle),
+22 −6
Original line number Diff line number Diff line
@@ -1223,7 +1223,7 @@ static int cam_ife_csid_enable_hw(struct cam_ife_csid_hw *csid_hw)
	int rc = 0;
	const struct cam_ife_csid_reg_offset   *csid_reg;
	struct cam_hw_soc_info                 *soc_info;
	uint32_t                               i, val;
	uint32_t                               i;
	int                                    clk_lvl;
	unsigned long                          flags;

@@ -1305,10 +1305,12 @@ static int cam_ife_csid_enable_hw(struct cam_ife_csid_hw *csid_hw)

	spin_unlock_irqrestore(&csid_hw->hw_info->hw_lock, flags);

	val = cam_io_r_mb(soc_info->reg_map[0].mem_base +
	csid_hw->csid_info->hw_reg_version =
		cam_io_r_mb(soc_info->reg_map[0].mem_base +
			csid_reg->cmn_reg->csid_hw_version_addr);
	CAM_DBG(CAM_ISP, "CSID:%d CSID HW version: 0x%x",
		csid_hw->hw_intf->hw_idx, val);
		csid_hw->hw_intf->hw_idx,
		csid_hw->csid_info->hw_reg_version);

	spin_lock_irqsave(&csid_hw->lock_state, flags);
	csid_hw->device_enabled = 1;
@@ -3102,6 +3104,7 @@ int cam_ife_csid_get_hw_caps(void *hw_priv,
	struct cam_ife_csid_hw                *csid_hw;
	struct cam_hw_info                    *csid_hw_info;
	const struct cam_ife_csid_reg_offset  *csid_reg;
	struct cam_csid_soc_private           *soc_priv = NULL;

	if (!hw_priv || !get_hw_cap_args) {
		CAM_ERR(CAM_ISP, "CSID: Invalid args");
@@ -3116,9 +3119,22 @@ int cam_ife_csid_get_hw_caps(void *hw_priv,
	hw_caps->num_rdis = csid_reg->cmn_reg->num_rdis;
	hw_caps->num_pix = csid_reg->cmn_reg->num_pix;
	hw_caps->num_ppp = csid_reg->cmn_reg->num_ppp;
	hw_caps->major_version = csid_reg->cmn_reg->major_version;
	hw_caps->minor_version = csid_reg->cmn_reg->minor_version;
	hw_caps->version_incr = csid_reg->cmn_reg->version_incr;

	/* NOTE: HW version is not correct since we dont enable
	 * the soc resources in the probe for CSID, instead we
	 * when the camera actually runs
	 */
	hw_caps->version_incr =
		csid_hw->csid_info->hw_reg_version & 0x00ffff;
	hw_caps->minor_version =
		(csid_hw->csid_info->hw_reg_version >> 16) & 0x0fff;
	hw_caps->major_version =
		(csid_hw->csid_info->hw_reg_version >> 28) & 0x000f;

	soc_priv = (struct cam_csid_soc_private *)
		(csid_hw_info->soc_info.soc_private);

	hw_caps->is_lite = soc_priv->is_ife_csid_lite;

	CAM_DBG(CAM_ISP,
		"CSID:%d No rdis:%d, no pix:%d, major:%d minor:%d ver :%d",
+2 −0
Original line number Diff line number Diff line
@@ -402,12 +402,14 @@ struct cam_ife_csid_reg_offset {
 *
 * @csid_reg:        csid register offsets
 * @hw_dts_version:  HW DTS version
 * @hw_reg_version:  HW Version read from register
 * @csid_max_clk:    maximim csid clock
 *
 */
struct cam_ife_csid_hw_info {
	const struct cam_ife_csid_reg_offset   *csid_reg;
	uint32_t                                hw_dts_version;
	uint32_t                                hw_reg_version;
	uint32_t                                csid_max_clk;

};
+10 −3
Original line number Diff line number Diff line
// SPDX-License-Identifier: GPL-2.0-only
/*
 * Copyright (c) 2017-2019, The Linux Foundation. All rights reserved.
 * Copyright (c) 2017-2020, The Linux Foundation. All rights reserved.
 */
#include <linux/slab.h>
#include "cam_ife_csid_soc.h"
@@ -10,16 +10,23 @@
static int cam_ife_csid_get_dt_properties(struct cam_hw_soc_info *soc_info)
{
	struct device_node *of_node = NULL;
	struct csid_device_soc_info *csid_soc_info = NULL;
	struct cam_csid_soc_private *soc_private = NULL;
	int rc = 0;

	of_node = soc_info->pdev->dev.of_node;
	csid_soc_info = (struct csid_device_soc_info *)soc_info->soc_private;

	rc = cam_soc_util_get_dt_properties(soc_info);
	if (rc)
		return rc;

	soc_private = (struct cam_csid_soc_private *)soc_info->soc_private;

	soc_private->is_ife_csid_lite = false;
	if (strnstr(soc_info->compatible, "lite",
		strlen(soc_info->compatible)) != NULL) {
		soc_private->is_ife_csid_lite = true;
	}

	return rc;
}

+3 −1
Original line number Diff line number Diff line
/* SPDX-License-Identifier: GPL-2.0-only */
/*
 * Copyright (c) 2017-2019, The Linux Foundation. All rights reserved.
 * Copyright (c) 2017-2020, The Linux Foundation. All rights reserved.
 */

#ifndef _CAM_IFE_CSID_SOC_H_
@@ -16,9 +16,11 @@
 * @cpas_handle:             Handle returned on registering with CPAS driver.
 *                           This handle is used for all further interface
 *                           with CPAS.
 * @is_ife_csid_lite:        Flag to indicate Whether a full csid or a Lite csid
 */
struct cam_csid_soc_private {
	uint32_t cpas_handle;
	bool     is_ife_csid_lite;
};

/**
Loading