/* * Copyright (c) 2018, NVIDIA CORPORATION. All rights reserved. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include #include #include #include #include #include #define BPMP_CLK_CMD(cmd, id) ((id) | ((cmd) << 24)) static int64_t bpmp_dvfs_get_fmax_at_vmin(int clk_id) { struct mrq_clk_request req; struct mrq_clk_response reply; int ret; req.cmd_and_id = BPMP_CLK_CMD(CMD_CLK_GET_FMAX_AT_VMIN, clk_id); ret = tegra_bpmp_send_receive(MRQ_CLK, &req, sizeof(req), &reply, sizeof(reply)); if (ret < 0) return ret; return reply.clk_get_fmax_at_vmin.rate; } /* * Get maximum frequency of the clock that guaranteed to be reachable at/below * minimum voltage at all temperatures. */ unsigned long tegra_bpmp_dvfs_get_fmax_at_vmin(int clk_id) { int64_t rate; if (clk_id > 0) { rate = bpmp_dvfs_get_fmax_at_vmin(clk_id); if (rate > 0) return rate; } return 0; } EXPORT_SYMBOL(tegra_bpmp_dvfs_get_fmax_at_vmin); /* * Helper uitlity to retrieve clock id from clocks property in device tree * node. */ int tegra_bpmp_dvfs_get_clk_id(struct device_node *np, const char *name) { int index; struct of_phandle_args clkspec; if (!np || !name) return -EINVAL; index = of_property_match_string(np, "clock-names", name); if (of_parse_phandle_with_args(np, "clocks", "#clock-cells", index, &clkspec)) return -ENOENT; return clkspec.args[0]; } EXPORT_SYMBOL(tegra_bpmp_dvfs_get_clk_id);