diff --git a/drivers/clk/qcom/common.c b/drivers/clk/qcom/common.c index a3562e575e68..7e80841075bd 100644 --- a/drivers/clk/qcom/common.c +++ b/drivers/clk/qcom/common.c @@ -11,12 +11,14 @@ #include #include #include +#include #include "common.h" #include "clk-rcg.h" #include "clk-regmap.h" #include "reset.h" #include "gdsc.h" +#include "vdd-level.h" struct qcom_cc { struct qcom_reset_controller reset; @@ -357,4 +359,22 @@ void qcom_cc_sync_state(struct device *dev, const struct qcom_cc_desc *desc) } EXPORT_SYMBOL(qcom_cc_sync_state); +int qcom_clk_get_voltage(struct clk *clk, unsigned long rate) +{ + struct clk_regmap *rclk; + struct clk_hw *hw = __clk_get_hw(clk); + int vdd_level; + + if (!clk_is_regmap_clk(hw)) + return -EINVAL; + + rclk = to_clk_regmap(hw); + vdd_level = clk_find_vdd_level(hw, &rclk->vdd_data, rate); + if (vdd_level < 0) + return vdd_level; + + return rclk->vdd_data.vdd_class->vdd_uv[vdd_level]; +} +EXPORT_SYMBOL(qcom_clk_get_voltage); + MODULE_LICENSE("GPL v2"); diff --git a/drivers/clk/qcom/vdd-class.c b/drivers/clk/qcom/vdd-class.c index fcef07077d4b..e5d6d5f77add 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, The Linux Foundation. All rights reserved. */ +/* Copyright (c) 2019-2020, The Linux Foundation. All rights reserved. */ #include #include @@ -147,6 +147,9 @@ int clk_find_vdd_level(struct clk_hw *hw, { int level; + if (!vdd_data->num_rate_max) + return -ENODATA; + /* * For certain PLLs, due to the limitation in the bits allocated for * programming the fractional divider, the actual rate of the PLL will diff --git a/include/linux/clk/qcom.h b/include/linux/clk/qcom.h new file mode 100644 index 000000000000..8e510b10b987 --- /dev/null +++ b/include/linux/clk/qcom.h @@ -0,0 +1,13 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +/* + * Copyright (c) 2020 The Linux Foundation. All rights reserved. + */ + +#ifndef __LINUX_CLK_QCOM_H_ +#define __LINUX_CLK_QCOM_H_ + +#include + +int qcom_clk_get_voltage(struct clk *clk, unsigned long rate); + +#endif /* __LINUX_CLK_QCOM_H_ */