From: Dmitry Osipenko <digetx@gmail.com>
To: "Thierry Reding" <thierry.reding@gmail.com>,
"Jonathan Hunter" <jonathanh@nvidia.com>,
"Michał Mirosław" <mirq-linux@rere.qmqm.pl>,
"Nikola Milosavljević" <mnidza@outlook.com>,
"Ulf Hansson" <ulf.hansson@linaro.org>,
"Peter Geis" <pgwipeout@gmail.com>,
"Nicolas Chauvet" <kwizart@gmail.com>,
"Viresh Kumar" <vireshk@kernel.org>,
"Stephen Boyd" <sboyd@kernel.org>,
"Matt Merhar" <mattmerhar@protonmail.com>,
"Paul Fertser" <fercerpav@gmail.com>,
"Mark Brown" <broonie@kernel.org>,
"Liam Girdwood" <lgirdwood@gmail.com>,
"Krzysztof Kozlowski" <krzysztof.kozlowski@canonical.com>,
"Mikko Perttunen" <mperttunen@nvidia.com>
Cc: linux-kernel@vger.kernel.org, linux-tegra@vger.kernel.org,
devicetree@vger.kernel.org, linux-pm@vger.kernel.org,
Nathan Chancellor <nathan@kernel.org>,
linux-clk@vger.kernel.org
Subject: [PATCH v6 04/14] soc/tegra: Add devm_tegra_core_dev_init_opp_table()
Date: Tue, 1 Jun 2021 05:31:09 +0300 [thread overview]
Message-ID: <20210601023119.22044-5-digetx@gmail.com> (raw)
In-Reply-To: <20210601023119.22044-1-digetx@gmail.com>
Add common helper which initializes OPP table for Tegra SoC core devices.
Tested-by: Peter Geis <pgwipeout@gmail.com> # Ouya T30
Tested-by: Paul Fertser <fercerpav@gmail.com> # PAZ00 T20
Tested-by: Nicolas Chauvet <kwizart@gmail.com> # PAZ00 T20 and TK1 T124
Tested-by: Matt Merhar <mattmerhar@protonmail.com> # Ouya T30
Signed-off-by: Dmitry Osipenko <digetx@gmail.com>
---
drivers/soc/tegra/common.c | 97 ++++++++++++++++++++++++++++++++++++++
include/soc/tegra/common.h | 22 +++++++++
2 files changed, 119 insertions(+)
diff --git a/drivers/soc/tegra/common.c b/drivers/soc/tegra/common.c
index 3dc54f59cafe..cd33e99249c3 100644
--- a/drivers/soc/tegra/common.c
+++ b/drivers/soc/tegra/common.c
@@ -3,9 +3,16 @@
* Copyright (C) 2014 NVIDIA CORPORATION. All rights reserved.
*/
+#define dev_fmt(fmt) "tegra-soc: " fmt
+
+#include <linux/clk.h>
+#include <linux/device.h>
+#include <linux/export.h>
#include <linux/of.h>
+#include <linux/pm_opp.h>
#include <soc/tegra/common.h>
+#include <soc/tegra/fuse.h>
static const struct of_device_id tegra_machine_match[] = {
{ .compatible = "nvidia,tegra20", },
@@ -31,3 +38,93 @@ bool soc_is_tegra(void)
return match != NULL;
}
+
+static int tegra_core_dev_init_opp_state(struct device *dev)
+{
+ unsigned long rate;
+ struct clk *clk;
+ int err;
+
+ clk = devm_clk_get(dev, NULL);
+ if (IS_ERR(clk)) {
+ dev_err(dev, "failed to get clk: %pe\n", clk);
+ return PTR_ERR(clk);
+ }
+
+ rate = clk_get_rate(clk);
+ if (!rate) {
+ dev_err(dev, "failed to get clk rate\n");
+ return -EINVAL;
+ }
+
+ /* first dummy rate-setting initializes voltage vote */
+ err = dev_pm_opp_set_rate(dev, rate);
+ if (err) {
+ dev_err(dev, "failed to initialize OPP clock: %d\n", err);
+ return err;
+ }
+
+ return 0;
+}
+
+/**
+ * devm_tegra_core_dev_init_opp_table() - initialize OPP table
+ * @dev: device for which OPP table is initialized
+ * @params: pointer to the OPP table configuration
+ *
+ * This function will initialize OPP table and sync OPP state of a Tegra SoC
+ * core device.
+ *
+ * Return: 0 on success or errorno.
+ */
+int devm_tegra_core_dev_init_opp_table(struct device *dev,
+ struct tegra_core_opp_params *params)
+{
+ u32 hw_version;
+ int err;
+
+ err = devm_pm_opp_set_clkname(dev, NULL);
+ if (err) {
+ dev_err(dev, "failed to set OPP clk: %d\n", err);
+ return err;
+ }
+
+ /* Tegra114+ doesn't support OPP yet */
+ if (!of_machine_is_compatible("nvidia,tegra20") &&
+ !of_machine_is_compatible("nvidia,tegra30"))
+ return -ENODEV;
+
+ if (of_machine_is_compatible("nvidia,tegra20"))
+ hw_version = BIT(tegra_sku_info.soc_process_id);
+ else
+ hw_version = BIT(tegra_sku_info.soc_speedo_id);
+
+ err = devm_pm_opp_set_supported_hw(dev, &hw_version, 1);
+ if (err) {
+ dev_err(dev, "failed to set OPP supported HW: %d\n", err);
+ return err;
+ }
+
+ /*
+ * Older device-trees have an empty OPP table, we will get
+ * -ENODEV from devm_pm_opp_of_add_table() in this case.
+ */
+ err = devm_pm_opp_of_add_table(dev);
+ if (err) {
+ if (err == -ENODEV)
+ dev_err_once(dev, "OPP table not found, please update device-tree\n");
+ else
+ dev_err(dev, "failed to add OPP table: %d\n", err);
+
+ return err;
+ }
+
+ if (params->init_state) {
+ err = tegra_core_dev_init_opp_state(dev);
+ if (err)
+ return err;
+ }
+
+ return 0;
+}
+EXPORT_SYMBOL_GPL(devm_tegra_core_dev_init_opp_table);
diff --git a/include/soc/tegra/common.h b/include/soc/tegra/common.h
index 744280ecab5f..af41ad80ec21 100644
--- a/include/soc/tegra/common.h
+++ b/include/soc/tegra/common.h
@@ -6,15 +6,37 @@
#ifndef __SOC_TEGRA_COMMON_H__
#define __SOC_TEGRA_COMMON_H__
+#include <linux/errno.h>
#include <linux/types.h>
+struct device;
+
+/**
+ * Tegra SoC core device OPP table configuration
+ *
+ * @init_state: pre-initialize OPP state of a device
+ */
+struct tegra_core_opp_params {
+ bool init_state;
+};
+
#ifdef CONFIG_ARCH_TEGRA
bool soc_is_tegra(void);
+
+int devm_tegra_core_dev_init_opp_table(struct device *dev,
+ struct tegra_core_opp_params *params);
#else
static inline bool soc_is_tegra(void)
{
return false;
}
+
+static inline int
+devm_tegra_core_dev_init_opp_table(struct device *dev,
+ struct tegra_core_opp_params *params)
+{
+ return -ENODEV;
+}
#endif
#endif /* __SOC_TEGRA_COMMON_H__ */
--
2.30.2
next prev parent reply other threads:[~2021-06-01 2:33 UTC|newest]
Thread overview: 26+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-06-01 2:31 [PATCH v6 00/14] NVIDIA Tegra memory and power management changes for 5.14 Dmitry Osipenko
2021-06-01 2:31 ` [PATCH v6 01/14] regulator: core: Add regulator_sync_voltage_rdev() Dmitry Osipenko
2021-06-01 2:31 ` [PATCH v6 02/14] soc/tegra: regulators: Bump voltages on system reboot Dmitry Osipenko
2021-06-01 2:31 ` [PATCH v6 03/14] soc/tegra: Add stub for soc_is_tegra() Dmitry Osipenko
2021-06-01 2:31 ` Dmitry Osipenko [this message]
2021-06-01 2:31 ` [PATCH v6 05/14] soc/tegra: fuse: Add stubs needed for compile-testing Dmitry Osipenko
2021-06-01 2:31 ` [PATCH v6 06/14] clk: tegra: " Dmitry Osipenko
2021-06-01 2:31 ` [PATCH v6 07/14] memory: tegra: Fix compilation warnings on 64bit platforms Dmitry Osipenko
2021-06-01 2:31 ` [PATCH v6 08/14] memory: tegra: Enable compile testing for all drivers Dmitry Osipenko
2021-06-07 6:01 ` Krzysztof Kozlowski
2021-06-07 13:36 ` Thierry Reding
2021-06-07 13:37 ` Dmitry Osipenko
2021-06-07 14:01 ` Dmitry Osipenko
2021-06-07 14:19 ` Thierry Reding
2021-06-07 14:42 ` Krzysztof Kozlowski
2021-06-08 15:18 ` Dmitry Osipenko
2021-06-01 2:31 ` [PATCH v6 09/14] memory: tegra20-emc: Use devm_tegra_core_dev_init_opp_table() Dmitry Osipenko
2021-06-01 2:31 ` [PATCH v6 10/14] memory: tegra30-emc: " Dmitry Osipenko
2021-06-01 2:31 ` [PATCH v6 11/14] dt-bindings: soc: tegra-pmc: Document core power domain Dmitry Osipenko
2021-06-01 2:31 ` [PATCH v6 12/14] soc/tegra: pmc: Add " Dmitry Osipenko
2021-06-01 2:31 ` [PATCH v6 13/14] soc/tegra: pmc: Add driver state syncing Dmitry Osipenko
2021-06-01 2:31 ` [PATCH v6 14/14] soc/tegra: regulators: Support core domain " Dmitry Osipenko
2021-06-01 11:27 ` [PATCH v6 00/14] NVIDIA Tegra memory and power management changes for 5.14 Thierry Reding
2021-06-01 15:51 ` Dmitry Osipenko
2021-06-01 17:10 ` Thierry Reding
2021-06-01 18:00 ` Dmitry Osipenko
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20210601023119.22044-5-digetx@gmail.com \
--to=digetx@gmail.com \
--cc=broonie@kernel.org \
--cc=devicetree@vger.kernel.org \
--cc=fercerpav@gmail.com \
--cc=jonathanh@nvidia.com \
--cc=krzysztof.kozlowski@canonical.com \
--cc=kwizart@gmail.com \
--cc=lgirdwood@gmail.com \
--cc=linux-clk@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pm@vger.kernel.org \
--cc=linux-tegra@vger.kernel.org \
--cc=mattmerhar@protonmail.com \
--cc=mirq-linux@rere.qmqm.pl \
--cc=mnidza@outlook.com \
--cc=mperttunen@nvidia.com \
--cc=nathan@kernel.org \
--cc=pgwipeout@gmail.com \
--cc=sboyd@kernel.org \
--cc=thierry.reding@gmail.com \
--cc=ulf.hansson@linaro.org \
--cc=vireshk@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).