From 6778948f9de86c3cfaf36725a7c87dcff9ba247f Mon Sep 17 00:00:00 2001 From: hc <hc@nodka.com> Date: Mon, 11 Dec 2023 08:20:59 +0000 Subject: [PATCH] kernel_5.10 no rt --- kernel/drivers/gpu/arm/mali400/mali/linux/mali_kernel_linux.c | 72 +++++++++++++++++++---------------- 1 files changed, 39 insertions(+), 33 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..534db25 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" @@ -177,11 +178,7 @@ static int mali_open(struct inode *inode, struct file *filp); static int mali_release(struct inode *inode, struct file *filp); -#ifdef HAVE_UNLOCKED_IOCTL static long mali_ioctl(struct file *filp, unsigned int cmd, unsigned long arg); -#else -static int mali_ioctl(struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg); -#endif static int mali_probe(struct platform_device *pdev); static int mali_remove(struct platform_device *pdev); @@ -275,11 +272,7 @@ .owner = THIS_MODULE, .open = mali_open, .release = mali_release, -#ifdef HAVE_UNLOCKED_IOCTL .unlocked_ioctl = mali_ioctl, -#else - .ioctl = mali_ioctl, -#endif .compat_ioctl = mali_ioctl, .mmap = mali_mmap }; @@ -521,6 +514,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 +569,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 +612,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 +648,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 +660,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 +690,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 +704,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 +746,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 +791,7 @@ (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 8, 0)) devfreq_resume_device(mdev->devfreq); #endif + pm_runtime_force_resume(dev); return 0; } @@ -917,19 +932,10 @@ } } -#ifdef HAVE_UNLOCKED_IOCTL static long mali_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) -#else -static int mali_ioctl(struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg) -#endif { int err; struct mali_session_data *session_data; - -#ifndef HAVE_UNLOCKED_IOCTL - /* inode not used */ - (void)inode; -#endif MALI_DEBUG_PRINT(7, ("Ioctl received 0x%08X 0x%08lX\n", cmd, arg)); -- Gitblit v1.6.2