74 lines
2.8 KiB
Diff
74 lines
2.8 KiB
Diff
|
From 40f5fc5b08b21142931662147d039ec217c9ba2f Mon Sep 17 00:00:00 2001
|
||
|
From: Icenowy Zheng <icenowy@aosc.io>
|
||
|
Date: Mon, 14 Aug 2023 07:28:10 +0200
|
||
|
Subject: [PATCH 211/464] drm/sun4i: tcon: hand over the duty to keep TCON0
|
||
|
clock to CCU on A64
|
||
|
|
||
|
As the A64 CCU driver has already the ability to keep TCON0 clock stable
|
||
|
when HDMI changes its parent's clock, do not protect TCON0 clock on A64
|
||
|
in the TCON driver to allow PLL-Video0 gets changed by HDMI (the CCU
|
||
|
will then restore the TCON0 clock rate).
|
||
|
|
||
|
Signed-off-by: Icenowy Zheng <icenowy@aosc.io>
|
||
|
---
|
||
|
drivers/gpu/drm/sun4i/sun4i_tcon.c | 15 +++++++++++++--
|
||
|
drivers/gpu/drm/sun4i/sun4i_tcon.h | 1 +
|
||
|
2 files changed, 14 insertions(+), 2 deletions(-)
|
||
|
|
||
|
diff --git a/drivers/gpu/drm/sun4i/sun4i_tcon.c b/drivers/gpu/drm/sun4i/sun4i_tcon.c
|
||
|
index c44d5f3350d1..6f2d544c5f29 100644
|
||
|
--- a/drivers/gpu/drm/sun4i/sun4i_tcon.c
|
||
|
+++ b/drivers/gpu/drm/sun4i/sun4i_tcon.c
|
||
|
@@ -110,9 +110,11 @@ static void sun4i_tcon_channel_set_status(struct sun4i_tcon *tcon, int channel,
|
||
|
|
||
|
if (enabled) {
|
||
|
clk_prepare_enable(clk);
|
||
|
- clk_rate_exclusive_get(clk);
|
||
|
+ if (!tcon->quirks->clk_kept_by_ccu)
|
||
|
+ clk_rate_exclusive_get(clk);
|
||
|
} else {
|
||
|
- clk_rate_exclusive_put(clk);
|
||
|
+ if (!tcon->quirks->clk_kept_by_ccu)
|
||
|
+ clk_rate_exclusive_put(clk);
|
||
|
clk_disable_unprepare(clk);
|
||
|
}
|
||
|
}
|
||
|
@@ -1562,6 +1564,14 @@ static const struct sun4i_tcon_quirks sun8i_a33_quirks = {
|
||
|
.supports_lvds = true,
|
||
|
};
|
||
|
|
||
|
+static const struct sun4i_tcon_quirks sun50i_a64_lcd_quirks = {
|
||
|
+ .supports_lvds = true,
|
||
|
+ .has_channel_0 = true,
|
||
|
+ .clk_kept_by_ccu = true,
|
||
|
+ .dclk_min_div = 1,
|
||
|
+ .setup_lvds_phy = sun6i_tcon_setup_lvds_phy,
|
||
|
+};
|
||
|
+
|
||
|
static const struct sun4i_tcon_quirks sun8i_a83t_lcd_quirks = {
|
||
|
.supports_lvds = true,
|
||
|
.has_channel_0 = true,
|
||
|
@@ -1620,6 +1630,7 @@ const struct of_device_id sun4i_tcon_of_table[] = {
|
||
|
{ .compatible = "allwinner,sun9i-a80-tcon-tv", .data = &sun9i_a80_tcon_tv_quirks },
|
||
|
{ .compatible = "allwinner,sun20i-d1-tcon-lcd", .data = &sun20i_d1_lcd_quirks },
|
||
|
{ .compatible = "allwinner,sun20i-d1-tcon-tv", .data = &sun8i_r40_tv_quirks },
|
||
|
+ { .compatible = "allwinner,sun50i-a64-tcon-lcd", .data = &sun50i_a64_lcd_quirks },
|
||
|
{ }
|
||
|
};
|
||
|
MODULE_DEVICE_TABLE(of, sun4i_tcon_of_table);
|
||
|
diff --git a/drivers/gpu/drm/sun4i/sun4i_tcon.h b/drivers/gpu/drm/sun4i/sun4i_tcon.h
|
||
|
index 864d70b9d242..7ba3df9e27df 100644
|
||
|
--- a/drivers/gpu/drm/sun4i/sun4i_tcon.h
|
||
|
+++ b/drivers/gpu/drm/sun4i/sun4i_tcon.h
|
||
|
@@ -250,6 +250,7 @@ struct sun4i_tcon_quirks {
|
||
|
bool needs_edp_reset; /* a80 edp reset needed for tcon0 access */
|
||
|
bool supports_lvds; /* Does the TCON support an LVDS output? */
|
||
|
bool polarity_in_ch0; /* some tcon1 channels have polarity bits in tcon0 pol register */
|
||
|
+ bool clk_kept_by_ccu; /* On A64 we rely on CCU to keep TCON0 clock stable */
|
||
|
u8 dclk_min_div; /* minimum divider for TCON0 DCLK */
|
||
|
|
||
|
/* callback to handle tcon muxing options */
|
||
|
--
|
||
|
2.34.1
|
||
|
|