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

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

Merge "msm: camera: cpas: read and pass fuse information to user space" into camera-kernel.lnx.4.0

parents 3da4eff7 55944b02
Loading
Loading
Loading
Loading
+9 −1
Original line number Diff line number Diff line
@@ -1747,6 +1747,7 @@ static int cam_cpas_hw_get_hw_info(void *hw_priv,
	struct cam_hw_info *cpas_hw;
	struct cam_cpas *cpas_core;
	struct cam_cpas_hw_caps *hw_caps;
	struct cam_cpas_private_soc *soc_private;

	if (!hw_priv || !get_hw_cap_args) {
		CAM_ERR(CAM_CPAS, "Invalid arguments %pK %pK",
@@ -1763,9 +1764,16 @@ static int cam_cpas_hw_get_hw_info(void *hw_priv,
	cpas_hw = (struct cam_hw_info *)hw_priv;
	cpas_core = (struct cam_cpas *) cpas_hw->core_info;
	hw_caps = (struct cam_cpas_hw_caps *)get_hw_cap_args;

	*hw_caps = cpas_core->hw_caps;

	/*Extract Fuse Info*/
	soc_private = (struct cam_cpas_private_soc *)
		cpas_hw->soc_info.soc_private;

	hw_caps->fuse_info = soc_private->fuse_info;
	CAM_INFO(CAM_CPAS, "fuse info->num_fuses %d",
		hw_caps->fuse_info.num_fuses);

	return 0;
}

+2 −0
Original line number Diff line number Diff line
@@ -114,6 +114,7 @@ struct cam_cpas_hw_cmd_stop {
 * @camera_version: Camera version
 * @cpas_version: CPAS version
 * @camera_capability: Camera hw capabilities
 * @fuse_info: Fuse information
 *
 */
struct cam_cpas_hw_caps {
@@ -121,6 +122,7 @@ struct cam_cpas_hw_caps {
	struct cam_hw_version camera_version;
	struct cam_hw_version cpas_version;
	uint32_t camera_capability;
	struct cam_cpas_fuse_info fuse_info;
};

int cam_cpas_hw_probe(struct platform_device *pdev,
+38 −5
Original line number Diff line number Diff line
@@ -173,7 +173,8 @@ int cam_cpas_get_cpas_hw_version(uint32_t *hw_version)
int cam_cpas_get_hw_info(uint32_t *camera_family,
	struct cam_hw_version *camera_version,
	struct cam_hw_version *cpas_version,
	uint32_t *cam_caps)
	uint32_t *cam_caps,
	struct cam_cpas_fuse_info *cam_fuse_info)
{
	if (!CAM_CPAS_INTF_INITIALIZED()) {
		CAM_ERR(CAM_CPAS, "cpas intf not initialized");
@@ -190,6 +191,12 @@ int cam_cpas_get_hw_info(uint32_t *camera_family,
	*camera_version = g_cpas_intf->hw_caps.camera_version;
	*cpas_version   = g_cpas_intf->hw_caps.cpas_version;
	*cam_caps       = g_cpas_intf->hw_caps.camera_capability;
	if (cam_fuse_info)
		*cam_fuse_info  = g_cpas_intf->hw_caps.fuse_info;

	CAM_DBG(CAM_CPAS, "Family %d, version %d.%d cam_caps %d",
		*camera_family, camera_version->major,
		camera_version->minor, *cam_caps);

	return 0;
}
@@ -529,7 +536,32 @@ int cam_cpas_subdev_cmd(struct cam_cpas_intf *cpas_intf,

		rc = cam_cpas_get_hw_info(&query.camera_family,
			&query.camera_version, &query.cpas_version,
			&query.reserved);
			&query.reserved, NULL);
		if (rc)
			break;

		rc = copy_to_user(u64_to_user_ptr(cmd->handle), &query,
			sizeof(query));
		if (rc)
			CAM_ERR(CAM_CPAS, "Failed in copy to user, rc=%d", rc);

		break;
	}
	case CAM_QUERY_CAP_V2: {
		struct cam_cpas_query_cap_v2 query;

		rc = copy_from_user(&query, u64_to_user_ptr(cmd->handle),
			sizeof(query));
		if (rc) {
			CAM_ERR(CAM_CPAS, "Failed in copy from user, rc=%d",
				rc);
			break;
		}

		rc = cam_cpas_get_hw_info(&query.camera_family,
			&query.camera_version, &query.cpas_version,
			&query.reserved,
			&query.fuse_info);
		if (rc)
			break;

@@ -729,6 +761,7 @@ static int cam_cpas_dev_component_bind(struct device *dev,

	hw_intf = g_cpas_intf->hw_intf;
	hw_caps = &g_cpas_intf->hw_caps;

	if (hw_intf->hw_ops.get_hw_caps) {
		rc = hw_intf->hw_ops.get_hw_caps(hw_intf->hw_priv,
			hw_caps, sizeof(struct cam_cpas_hw_caps));
+46 −1
Original line number Diff line number Diff line
@@ -18,7 +18,6 @@
static uint cpas_dump;
module_param(cpas_dump, uint, 0644);


void cam_cpas_dump_axi_vote_info(
	const struct cam_cpas_client *cpas_client,
	const char *identifier,
@@ -467,6 +466,51 @@ static int cam_cpas_parse_node_tree(struct cam_cpas *cpas_core,
	return 0;
}

int cam_cpas_get_hw_fuse(struct platform_device *pdev,
	struct cam_cpas_private_soc *soc_private)
{
	struct device_node *of_node;
	void *fuse;
	uint32_t fuse_addr, fuse_bit;
	uint32_t fuse_val = 0, feature_bit_pos;
	int count = 0, i = 0;

	memset(&soc_private->fuse_info, 0, sizeof(soc_private->fuse_info));

	of_node = pdev->dev.of_node;
	count   = of_property_count_u32_elems(of_node, "cam_hw_fuse");
	if (count <= 0) {
		CAM_INFO(CAM_CPAS, "no or invalid fuse enrties %d", count);
		return 0;
	} else if (count%3 != 0) {
		CAM_INFO(CAM_CPAS, "fuse entries should be multiple of 3 %d",
			count);
		return -EINVAL;
	}

	for (i = 0; i < count; i = i + 3) {
		of_property_read_u32_index(of_node, "cam_hw_fuse", i,
				&feature_bit_pos);
		of_property_read_u32_index(of_node, "cam_hw_fuse", i + 1,
				&fuse_addr);
		of_property_read_u32_index(of_node, "cam_hw_fuse", i + 2,
				&fuse_bit);
		CAM_INFO(CAM_CPAS, "feature_bit 0x%x addr 0x%x, bit %d",
			feature_bit_pos, fuse_addr, fuse_bit);
		fuse = ioremap(fuse_addr, 4);
		if (fuse) {
			fuse_val = cam_io_r(fuse);
			soc_private->fuse_info.fuse_val[i].fuse_id = fuse_addr;
			soc_private->fuse_info.fuse_val[i].fuse_val = fuse_val;
		}
		CAM_INFO(CAM_CPAS, "fuse_addr 0x%x, fuse_val %x",
			fuse_addr, fuse_val);
		soc_private->fuse_info.num_fuses++;
		iounmap(fuse);
	}

	return 0;
}

int cam_cpas_get_hw_features(struct platform_device *pdev,
	struct cam_cpas_private_soc *soc_private)
@@ -532,6 +576,7 @@ int cam_cpas_get_custom_dt_info(struct cam_hw_info *cpas_hw,
	}

	cam_cpas_get_hw_features(pdev, soc_private);
	cam_cpas_get_hw_fuse(pdev, soc_private);

	soc_private->camnoc_axi_min_ib_bw = 0;
	rc = of_property_read_u64(of_node,
+2 −0
Original line number Diff line number Diff line
@@ -91,6 +91,7 @@ struct cam_cpas_tree_node {
 *      camnoc axi clock
 * @camnoc_axi_min_ib_bw: Min camnoc BW which varies based on target
 * @feature_mask: feature mask value for hw supported features
 * @fuse_info: fuse information
 *
 */
struct cam_cpas_private_soc {
@@ -109,6 +110,7 @@ struct cam_cpas_private_soc {
	uint32_t camnoc_axi_clk_bw_margin;
	uint64_t camnoc_axi_min_ib_bw;
	uint32_t feature_mask;
	struct cam_cpas_fuse_info fuse_info;
};

void cam_cpas_util_debug_parse_data(struct cam_cpas_private_soc *soc_private);
Loading