From 15ade055295d13f95d49e3d99b09f3bbfb4a43e7 Mon Sep 17 00:00:00 2001
From: hc <hc@nodka.com>
Date: Mon, 06 Nov 2023 07:25:24 +0000
Subject: [PATCH] add at24 driver
---
kernel/drivers/gpu/arm/mali400/mali/linux/mali_kernel_linux.c | 55 +++++++++++++++++++++++++++++++++++++++----------------
1 files changed, 39 insertions(+), 16 deletions(-)
diff --git a/kernel/drivers/gpu/arm/mali400/mali/linux/mali_kernel_linux.c b/kernel/drivers/gpu/arm/mali400/mali/linux/mali_kernel_linux.c
index 08df33d..6e003c2 100755
--- a/kernel/drivers/gpu/arm/mali400/mali/linux/mali_kernel_linux.c
+++ b/kernel/drivers/gpu/arm/mali400/mali/linux/mali_kernel_linux.c
@@ -31,6 +31,7 @@
#include <linux/clk.h>
#include <linux/regulator/consumer.h>
#include <linux/mali/mali_utgard.h>
+#include <linux/pm_runtime.h>
#include <soc/rockchip/rockchip_opp_select.h>
#include "mali_kernel_common.h"
@@ -521,6 +522,7 @@
int err;
#ifdef CONFIG_MALI_DEVFREQ
struct mali_device *mdev;
+ const char *name = "mali";
#endif
MALI_DEBUG_PRINT(2, ("mali_probe(): Called for platform device %s\n", pdev->name));
@@ -575,25 +577,38 @@
mdev->regulator = NULL;
/* Allow probe to continue without regulator */
}
+ if (mdev->regulator) {
+ mdev->opp_table = dev_pm_opp_set_regulators(mdev->dev, &name, 1);
+ if (IS_ERR(mdev->opp_table)) {
+ mdev->opp_table = NULL;
+ MALI_DEBUG_PRINT(2, ("Continuing without opp regulator\n"));
+ }
+ }
#endif /* LINUX_VERSION_CODE >= 3, 12, 0 */
+
+ mdev->num_clks = devm_clk_bulk_get_all(mdev->dev, &mdev->clks);
+ if (mdev->num_clks < 1) {
+ MALI_DEBUG_PRINT(2, ("Continuing without Mali clock control\n"));
+ mdev->num_clks = 0;
+ mdev->clock = NULL;
+ } else {
+ /* Get "clk_mali" in the device tree for gpu dvfs */
+ mdev->clock = clk_get(mdev->dev, "clk_mali");
+ if (IS_ERR_OR_NULL(mdev->clock)) {
+ MALI_DEBUG_PRINT(2, ("Continuing without Mali dvfs clock\n"));
+ /* Allow probe to continue without clock. */
+ mdev->clock = NULL;
+ }
+ }
+ err = clk_bulk_prepare_enable(mdev->num_clks, mdev->clks);
+ if (err) {
+ MALI_PRINT_ERROR(("Failed to prepare clock (%d)\n", err));
+ goto clock_prepare_failed;
+ }
err = rk_platform_init_opp_table(mdev->dev);
if (err)
MALI_DEBUG_PRINT(3, ("Failed to init_opp_table\n"));
-
- /* Need to name the gpu clock "clk_mali" in the device tree */
- mdev->clock = clk_get(mdev->dev, "clk_mali");
- if (IS_ERR_OR_NULL(mdev->clock)) {
- MALI_DEBUG_PRINT(2, ("Continuing without Mali clock control\n"));
- mdev->clock = NULL;
- /* Allow probe to continue without clock. */
- } else {
- err = clk_prepare(mdev->clock);
- if (err) {
- MALI_PRINT_ERROR(("Failed to prepare clock (%d)\n", err));
- goto clock_prepare_failed;
- }
- }
/* initilize pm metrics related */
if (mali_pm_metrics_init(mdev) < 0) {
@@ -605,6 +620,7 @@
MALI_DEBUG_PRINT(2, ("mali devfreq init failed\n"));
goto devfreq_init_failed;
}
+ clk_bulk_disable(mdev->num_clks, mdev->clks);
#endif
@@ -640,8 +656,9 @@
devfreq_init_failed:
mali_pm_metrics_term(mdev);
pm_metrics_init_failed:
- clk_unprepare(mdev->clock);
+ clk_bulk_disable_unprepare(mdev->num_clks, mdev->clks);
clock_prepare_failed:
+ clk_bulk_put(mdev->num_clks, mdev->clks);
clk_put(mdev->clock);
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 19, 0)) && defined(CONFIG_OF) \
&& defined(CONFIG_PM_OPP)
@@ -651,6 +668,7 @@
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 12, 0)) && defined(CONFIG_OF) \
&& defined(CONFIG_REGULATOR)
regulator_put(mdev->regulator);
+ dev_pm_opp_put_regulators(mdev->opp_table);
#endif /* LINUX_VERSION_CODE >= 3, 12, 0 */
mali_device_free(mdev);
#endif
@@ -680,10 +698,12 @@
mali_pm_metrics_term(mdev);
if (mdev->clock) {
- clk_unprepare(mdev->clock);
clk_put(mdev->clock);
mdev->clock = NULL;
}
+ clk_bulk_unprepare(mdev->num_clks, mdev->clks);
+ clk_bulk_put(mdev->num_clks, mdev->clks);
+
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 19, 0)) && defined(CONFIG_OF) \
&& defined(CONFIG_PM_OPP)
dev_pm_opp_of_remove_table(mdev->dev);
@@ -692,6 +712,7 @@
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 12, 0)) && defined(CONFIG_OF) \
&& defined(CONFIG_REGULATOR)
regulator_put(mdev->regulator);
+ dev_pm_opp_put_regulators(mdev->opp_table);
#endif /* LINUX_VERSION_CODE >= 3, 12, 0 */
mali_device_free(mdev);
#endif
@@ -733,6 +754,7 @@
return -ENODEV;
#endif
+ pm_runtime_force_suspend(dev);
#if defined(CONFIG_MALI_DEVFREQ) && \
(LINUX_VERSION_CODE >= KERNEL_VERSION(3, 8, 0))
devfreq_suspend_device(mdev->devfreq);
@@ -777,6 +799,7 @@
(LINUX_VERSION_CODE >= KERNEL_VERSION(3, 8, 0))
devfreq_resume_device(mdev->devfreq);
#endif
+ pm_runtime_force_resume(dev);
return 0;
}
--
Gitblit v1.6.2