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

Commit 49bdc6fb authored by Ravikishore Pampana's avatar Ravikishore Pampana
Browse files

msm: camera: core: Fix cpas axi clk rate overflow



Change the clk variable type from int32_t to int64_t
to avoid integer overflow.

CRs-Fixed: 2609090
Change-Id: I9f785ce2c1e45b1e9a238c42e86da1161bf70f75
Signed-off-by: default avatarRavikishore Pampana <rpampana@codeaurora.org>
parent 299c1a13
Loading
Loading
Loading
Loading
+4 −4
Original line number Original line Diff line number Diff line
// SPDX-License-Identifier: GPL-2.0-only
// 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/device.h>
#include <linux/device.h>
@@ -425,7 +425,7 @@ static int cam_cpas_util_set_camnoc_axi_clk_rate(
	if (soc_private->control_camnoc_axi_clk) {
	if (soc_private->control_camnoc_axi_clk) {
		struct cam_hw_soc_info *soc_info = &cpas_hw->soc_info;
		struct cam_hw_soc_info *soc_info = &cpas_hw->soc_info;
		uint64_t required_camnoc_bw = 0, intermediate_result = 0;
		uint64_t required_camnoc_bw = 0, intermediate_result = 0;
		int32_t clk_rate = 0;
		int64_t clk_rate = 0;


		for (i = 0; i < CAM_CPAS_MAX_TREE_NODES; i++) {
		for (i = 0; i < CAM_CPAS_MAX_TREE_NODES; i++) {
			tree_node = soc_private->tree_node[i];
			tree_node = soc_private->tree_node[i];
@@ -454,7 +454,7 @@ static int cam_cpas_util_set_camnoc_axi_clk_rate(
		do_div(intermediate_result, soc_private->camnoc_bus_width);
		do_div(intermediate_result, soc_private->camnoc_bus_width);
		clk_rate = intermediate_result;
		clk_rate = intermediate_result;


		CAM_DBG(CAM_CPAS, "Setting camnoc axi clk rate : %llu %d",
		CAM_DBG(CAM_CPAS, "Setting camnoc axi clk rate : %llu %lld",
			required_camnoc_bw, clk_rate);
			required_camnoc_bw, clk_rate);


		/*
		/*
@@ -467,7 +467,7 @@ static int cam_cpas_util_set_camnoc_axi_clk_rate(
			rc = cam_soc_util_set_src_clk_rate(soc_info, clk_rate);
			rc = cam_soc_util_set_src_clk_rate(soc_info, clk_rate);
			if (rc)
			if (rc)
				CAM_ERR(CAM_CPAS,
				CAM_ERR(CAM_CPAS,
				"Failed in setting camnoc axi clk %llu %d %d",
				"Failed in setting camnoc axi clk %llu %lld %d",
				required_camnoc_bw, clk_rate, rc);
				required_camnoc_bw, clk_rate, rc);
		}
		}
	}
	}
+10 −10
Original line number Original line Diff line number Diff line
// SPDX-License-Identifier: GPL-2.0-only
// SPDX-License-Identifier: GPL-2.0-only
/*
/*
 * Copyright (c) 2015-2019, The Linux Foundation. All rights reserved.
 * Copyright (c) 2015-2020, The Linux Foundation. All rights reserved.
 */
 */


#include <linux/of.h>
#include <linux/of.h>
@@ -17,7 +17,7 @@ static char supported_clk_info[256];
static char debugfs_dir_name[64];
static char debugfs_dir_name[64];


int cam_soc_util_get_clk_level(struct cam_hw_soc_info *soc_info,
int cam_soc_util_get_clk_level(struct cam_hw_soc_info *soc_info,
	int32_t clk_rate, int clk_idx, int32_t *clk_lvl)
	int64_t clk_rate, int clk_idx, int32_t *clk_lvl)
{
{
	int i;
	int i;
	long clk_rate_round;
	long clk_rate_round;
@@ -41,7 +41,7 @@ int cam_soc_util_get_clk_level(struct cam_hw_soc_info *soc_info,
			(soc_info->clk_rate[i][clk_idx] >=
			(soc_info->clk_rate[i][clk_idx] >=
			clk_rate_round)) {
			clk_rate_round)) {
			CAM_DBG(CAM_UTIL,
			CAM_DBG(CAM_UTIL,
				"soc = %d round rate = %ld actual = %d",
				"soc = %d round rate = %ld actual = %lld",
				soc_info->clk_rate[i][clk_idx],
				soc_info->clk_rate[i][clk_idx],
				clk_rate_round, clk_rate);
				clk_rate_round, clk_rate);
			*clk_lvl = i;
			*clk_lvl = i;
@@ -380,7 +380,7 @@ long cam_soc_util_get_clk_round_rate(struct cam_hw_soc_info *soc_info,
 * @return:         Success or failure
 * @return:         Success or failure
 */
 */
static int cam_soc_util_set_clk_rate(struct clk *clk, const char *clk_name,
static int cam_soc_util_set_clk_rate(struct clk *clk, const char *clk_name,
	int32_t clk_rate)
	int64_t clk_rate)
{
{
	int rc = 0;
	int rc = 0;
	long clk_rate_round;
	long clk_rate_round;
@@ -388,7 +388,7 @@ static int cam_soc_util_set_clk_rate(struct clk *clk, const char *clk_name,
	if (!clk || !clk_name)
	if (!clk || !clk_name)
		return -EINVAL;
		return -EINVAL;


	CAM_DBG(CAM_UTIL, "set %s, rate %d", clk_name, clk_rate);
	CAM_DBG(CAM_UTIL, "set %s, rate %lld", clk_name, clk_rate);
	if (clk_rate > 0) {
	if (clk_rate > 0) {
		clk_rate_round = clk_round_rate(clk, clk_rate);
		clk_rate_round = clk_round_rate(clk, clk_rate);
		CAM_DBG(CAM_UTIL, "new_rate %ld", clk_rate_round);
		CAM_DBG(CAM_UTIL, "new_rate %ld", clk_rate_round);
@@ -424,7 +424,7 @@ static int cam_soc_util_set_clk_rate(struct clk *clk, const char *clk_name,
}
}


int cam_soc_util_set_src_clk_rate(struct cam_hw_soc_info *soc_info,
int cam_soc_util_set_src_clk_rate(struct cam_hw_soc_info *soc_info,
	int32_t clk_rate)
	int64_t clk_rate)
{
{
	int rc = 0;
	int rc = 0;
	int i = 0;
	int i = 0;
@@ -452,13 +452,13 @@ int cam_soc_util_set_src_clk_rate(struct cam_hw_soc_info *soc_info,
		&apply_level);
		&apply_level);
	if (rc || (apply_level < 0) || (apply_level >= CAM_MAX_VOTE)) {
	if (rc || (apply_level < 0) || (apply_level >= CAM_MAX_VOTE)) {
		CAM_ERR(CAM_UTIL,
		CAM_ERR(CAM_UTIL,
			"set %s, rate %d dev_name = %s apply level = %d",
			"set %s, rate %lld dev_name = %s apply level = %d",
			soc_info->clk_name[src_clk_idx], clk_rate,
			soc_info->clk_name[src_clk_idx], clk_rate,
			soc_info->dev_name, apply_level);
			soc_info->dev_name, apply_level);
			return -EINVAL;
			return -EINVAL;
	}
	}


	CAM_DBG(CAM_UTIL, "set %s, rate %d dev_name = %s apply level = %d",
	CAM_DBG(CAM_UTIL, "set %s, rate %lld dev_name = %s apply level = %d",
		soc_info->clk_name[src_clk_idx], clk_rate,
		soc_info->clk_name[src_clk_idx], clk_rate,
		soc_info->dev_name, apply_level);
		soc_info->dev_name, apply_level);


@@ -471,7 +471,7 @@ int cam_soc_util_set_src_clk_rate(struct cam_hw_soc_info *soc_info,
		soc_info->clk_name[src_clk_idx], clk_rate);
		soc_info->clk_name[src_clk_idx], clk_rate);
	if (rc) {
	if (rc) {
		CAM_ERR(CAM_UTIL,
		CAM_ERR(CAM_UTIL,
			"SET_RATE Failed: src clk: %s, rate %d, dev_name = %s rc: %d",
			"SET_RATE Failed: src clk: %s, rate %lld, dev_name = %s rc: %d",
			soc_info->clk_name[src_clk_idx], clk_rate,
			soc_info->clk_name[src_clk_idx], clk_rate,
			soc_info->dev_name, rc);
			soc_info->dev_name, rc);
		return rc;
		return rc;
+3 −3
Original line number Original line Diff line number Diff line
/* SPDX-License-Identifier: GPL-2.0-only */
/* SPDX-License-Identifier: GPL-2.0-only */
/*
/*
 * Copyright (c) 2015-2019, The Linux Foundation. All rights reserved.
 * Copyright (c) 2015-2020, The Linux Foundation. All rights reserved.
 */
 */


#ifndef _CAM_SOC_UTIL_H_
#ifndef _CAM_SOC_UTIL_H_
@@ -382,7 +382,7 @@ long cam_soc_util_get_clk_round_rate(struct cam_hw_soc_info *soc_info,
 * @return:             success or failure
 * @return:             success or failure
 */
 */
int cam_soc_util_set_src_clk_rate(struct cam_hw_soc_info *soc_info,
int cam_soc_util_set_src_clk_rate(struct cam_hw_soc_info *soc_info,
	int32_t clk_rate);
	int64_t clk_rate);


/**
/**
 * cam_soc_util_get_option_clk_by_name()
 * cam_soc_util_get_option_clk_by_name()
@@ -624,7 +624,7 @@ int cam_soc_util_clk_enable_default(struct cam_hw_soc_info *soc_info,
	enum cam_vote_level clk_level);
	enum cam_vote_level clk_level);


int cam_soc_util_get_clk_level(struct cam_hw_soc_info *soc_info,
int cam_soc_util_get_clk_level(struct cam_hw_soc_info *soc_info,
	int32_t clk_rate, int clk_idx, int32_t *clk_lvl);
	int64_t clk_rate, int clk_idx, int32_t *clk_lvl);


/* Callback to get reg space data for specific HW */
/* Callback to get reg space data for specific HW */
typedef int (*cam_soc_util_regspace_data_cb)(uint32_t reg_base_type,
typedef int (*cam_soc_util_regspace_data_cb)(uint32_t reg_base_type,