diff --git a/drivers/clk/qcom/vdd-class.c b/drivers/clk/qcom/vdd-class.c index f2d1ff3d94bf..1c93f5a573b3 100644 --- a/drivers/clk/qcom/vdd-class.c +++ b/drivers/clk/qcom/vdd-class.c @@ -1,5 +1,5 @@ // SPDX-License-Identifier: GPL-2.0-only -/* Copyright (c) 2019-2020, The Linux Foundation. All rights reserved. */ +/* Copyright (c) 2019-2021, The Linux Foundation. All rights reserved. */ #include #include @@ -112,6 +112,28 @@ static int clk_unvote_vdd_class_level(struct clk_vdd_class *vdd_class, int level return ret; } +/** + * clk_get_vdd_voltage - Return corner voltage for a vdd class + * @vdd_data: vdd_class data for the clock + * @level: voltage level + * + * Returns corner voltage on success, -EERROR otherwise. + */ +int clk_get_vdd_voltage(struct clk_vdd_class_data *vdd_data, int vdd_level) +{ + int i, corner = -EINVAL; + + for (i = 0; i < vdd_data->num_vdd_classes; i++) + corner = max(corner, vdd_data->vdd_classes[i]->vdd_uv[vdd_level]); + + if (vdd_data->vdd_class) + corner = max(corner, vdd_data->vdd_class->vdd_uv[vdd_level]); + + return corner; + +} +EXPORT_SYMBOL(clk_get_vdd_voltage); + /** * clk_vote_vdd_level - Add a vote for a given voltage level * @vdd_data: vdd_class data for the clock diff --git a/drivers/clk/qcom/vdd-class.h b/drivers/clk/qcom/vdd-class.h index 12cbfe6ed75f..a60752b6ac81 100644 --- a/drivers/clk/qcom/vdd-class.h +++ b/drivers/clk/qcom/vdd-class.h @@ -1,5 +1,5 @@ /* SPDX-License-Identifier: GPL-2.0-only */ -/* Copyright (c) 2019-2020, The Linux Foundation. All rights reserved. */ +/* Copyright (c) 2019-2021, The Linux Foundation. All rights reserved. */ #ifndef __QCOM_CLK_VDD_CLASS_H__ #define __QCOM_CLK_VDD_CLASS_H__ @@ -74,6 +74,7 @@ int clk_find_vdd_level(struct clk_hw *hw, struct clk_vdd_class_data *vdd_data, unsigned long rate); int clk_vote_vdd_level(struct clk_vdd_class_data *vdd_class, int level); int clk_unvote_vdd_level(struct clk_vdd_class_data *vdd_class, int level); +int clk_get_vdd_voltage(struct clk_vdd_class_data *vdd_data, int vdd_level); int clk_regulator_init(struct device *dev, const struct qcom_cc_desc *desc); int clk_vdd_proxy_vote(struct device *dev, const struct qcom_cc_desc *desc); int clk_vdd_proxy_unvote(struct device *dev, const struct qcom_cc_desc *desc);