mirror of https://github.com/armbian/build.git
sunxi-6.13: BUGFIX: Remove the incomplete patch.
When starting a GPU with a power domain, it is necessary to additionally control the switching on and off of the clock in the GPU driver.
This commit is contained in:
parent
7d1fb049d5
commit
89e66f4606
|
@ -1,138 +0,0 @@
|
|||
From 891448a1c84c14a040d721138bc5b47927c057ae Mon Sep 17 00:00:00 2001
|
||||
From: Andre Przywara <andre.przywara@arm.com>
|
||||
Date: Sun, 25 Feb 2024 16:06:16 +0000
|
||||
Subject: [PATCH] clk: sunxi-ng: h6-r: add GPU power domain
|
||||
|
||||
The Allwinner H616 features register 0x7010254 in the PRCM MMIO frame,
|
||||
where bit 0 needs to be cleared to enable operation of the Mali GPU.
|
||||
With this bit set (the reset default), any access to the Mali registers
|
||||
hangs the bus and thus the whole system. The BSP code clears this bit
|
||||
in U-Boot and their kernel never touches it again.
|
||||
|
||||
Register a power-domain device to control this bit. Since we claim this
|
||||
MMIO region in the H6 R-CCU driver, add the code here, so that we don't
|
||||
need to artificially split the MMIO range in the DT.
|
||||
Since there seems to be at least one other register with similar behaviour
|
||||
nearby (0x7010260), make the power domain take one cell, even though we
|
||||
only support domain #0 for now.
|
||||
|
||||
Signed-off-by: Andre Przywara <andre.przywara@arm.com>
|
||||
---
|
||||
drivers/clk/sunxi-ng/ccu-sun50i-h6-r.c | 84 ++++++++++++++++++++++++++
|
||||
1 file changed, 84 insertions(+)
|
||||
|
||||
diff --git a/drivers/clk/sunxi-ng/ccu-sun50i-h6-r.c b/drivers/clk/sunxi-ng/ccu-sun50i-h6-r.c
|
||||
index 2a8b998cf09c..ab8b167f4a72 100644
|
||||
--- a/drivers/clk/sunxi-ng/ccu-sun50i-h6-r.c
|
||||
+++ b/drivers/clk/sunxi-ng/ccu-sun50i-h6-r.c
|
||||
@@ -4,9 +4,11 @@
|
||||
*/
|
||||
|
||||
#include <linux/clk-provider.h>
|
||||
+#include <linux/io.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/platform_device.h>
|
||||
+#include <linux/pm_domain.h>
|
||||
|
||||
#include "ccu_common.h"
|
||||
#include "ccu_reset.h"
|
||||
@@ -217,6 +219,86 @@ static const struct sunxi_ccu_desc sun50i_h616_r_ccu_desc = {
|
||||
.num_resets = ARRAY_SIZE(sun50i_h616_r_ccu_resets),
|
||||
};
|
||||
|
||||
+#define PD_H616_GPU_REG 0x254
|
||||
+
|
||||
+struct sun50i_h616_ppu_pd {
|
||||
+ struct generic_pm_domain genpd;
|
||||
+ void __iomem *base;
|
||||
+};
|
||||
+
|
||||
+#define to_sun50i_h616_ppu_pd(_genpd) \
|
||||
+ container_of(_genpd, struct sun50i_h616_ppu_pd, genpd)
|
||||
+
|
||||
+static bool sun50i_h616_ppu_power_status(const struct sun50i_h616_ppu_pd *pd)
|
||||
+{
|
||||
+ return !readl(pd->base + PD_H616_GPU_REG);
|
||||
+}
|
||||
+
|
||||
+static int sun50i_h616_ppu_pd_set_power(const struct sun50i_h616_ppu_pd *pd,
|
||||
+ bool power_on)
|
||||
+{
|
||||
+ if (power_on)
|
||||
+ writel(0, pd->base + PD_H616_GPU_REG);
|
||||
+ else
|
||||
+ writel(1, pd->base + PD_H616_GPU_REG);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int sun50i_h616_ppu_pd_power_on(struct generic_pm_domain *genpd)
|
||||
+{
|
||||
+ const struct sun50i_h616_ppu_pd *pd = to_sun50i_h616_ppu_pd(genpd);
|
||||
+
|
||||
+ return sun50i_h616_ppu_pd_set_power(pd, true);
|
||||
+}
|
||||
+
|
||||
+static int sun50i_h616_ppu_pd_power_off(struct generic_pm_domain *genpd)
|
||||
+{
|
||||
+ const struct sun50i_h616_ppu_pd *pd = to_sun50i_h616_ppu_pd(genpd);
|
||||
+
|
||||
+ return sun50i_h616_ppu_pd_set_power(pd, false);
|
||||
+}
|
||||
+
|
||||
+static int sun50i_h616_register_ppu(struct platform_device *pdev,
|
||||
+ void __iomem *base)
|
||||
+{
|
||||
+ struct device *dev = &pdev->dev;
|
||||
+ struct genpd_onecell_data *ppu;
|
||||
+ struct sun50i_h616_ppu_pd *pd;
|
||||
+ int ret;
|
||||
+
|
||||
+ pd = devm_kzalloc(dev, sizeof(*pd), GFP_KERNEL);
|
||||
+ if (!pd)
|
||||
+ return -ENOMEM;
|
||||
+
|
||||
+ ppu = devm_kzalloc(dev, sizeof(*ppu), GFP_KERNEL);
|
||||
+ if (!ppu)
|
||||
+ return -ENOMEM;
|
||||
+
|
||||
+ ppu->domains = devm_kzalloc(dev, sizeof(*ppu->domains), GFP_KERNEL);
|
||||
+ if (!ppu->domains)
|
||||
+ return -ENOMEM;
|
||||
+
|
||||
+ ppu->num_domains = 1;
|
||||
+ pd->genpd.name = "GPU";
|
||||
+ pd->genpd.power_off = sun50i_h616_ppu_pd_power_off;
|
||||
+ pd->genpd.power_on = sun50i_h616_ppu_pd_power_on;
|
||||
+ pd->base = base;
|
||||
+
|
||||
+ ret = pm_genpd_init(&pd->genpd, NULL, !sun50i_h616_ppu_power_status(pd));
|
||||
+ if (ret) {
|
||||
+ dev_warn(dev, "Failed to add GPU power domain: %d\n", ret);
|
||||
+ return ret;
|
||||
+ }
|
||||
+
|
||||
+ ppu->domains[0] = &pd->genpd;
|
||||
+ ret = of_genpd_add_provider_onecell(dev->of_node, ppu);
|
||||
+ if (ret)
|
||||
+ dev_warn(dev, "Failed to add provider: %d\n", ret);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
static int sun50i_h6_r_ccu_probe(struct platform_device *pdev)
|
||||
{
|
||||
const struct sunxi_ccu_desc *desc;
|
||||
@@ -230,6 +312,8 @@ static int sun50i_h6_r_ccu_probe(struct platform_device *pdev)
|
||||
if (IS_ERR(reg))
|
||||
return PTR_ERR(reg);
|
||||
|
||||
+ sun50i_h616_register_ppu(pdev, reg);
|
||||
+
|
||||
return devm_sunxi_ccu_probe(&pdev->dev, reg, desc);
|
||||
}
|
||||
|
||||
--
|
||||
2.35.3
|
||||
|
|
@ -179,5 +179,4 @@
|
|||
patches.armbian/Fix-ghost-touches-on-tsc2007-tft-screen.patch
|
||||
patches.armbian/arm-dts-sun8i-h2-plus-orangepi-zero-fix-usb_otg-dr_mode.patch
|
||||
patches.armbian/BigTreeTech-CB1-dts-i2c-gpio-mode-adjustment-and-ws2812-rgb_val.patch
|
||||
patches.armbian/clk-sunxi-ng-h6-r-add-GPU-power-domain.patch
|
||||
patches.armbian/arm64-allwinner-Add-sun50i-h618-bananapi-m4-berry-support.patch
|
||||
|
|
|
@ -466,5 +466,4 @@
|
|||
patches.armbian/Fix-ghost-touches-on-tsc2007-tft-screen.patch
|
||||
patches.armbian/arm-dts-sun8i-h2-plus-orangepi-zero-fix-usb_otg-dr_mode.patch
|
||||
patches.armbian/BigTreeTech-CB1-dts-i2c-gpio-mode-adjustment-and-ws2812-rgb_val.patch
|
||||
- patches.armbian/clk-sunxi-ng-h6-r-add-GPU-power-domain.patch
|
||||
patches.armbian/arm64-allwinner-Add-sun50i-h618-bananapi-m4-berry-support.patch
|
||||
|
|
Loading…
Reference in New Issue