74 lines
2.8 KiB
Diff
74 lines
2.8 KiB
Diff
From b05e82b0c175953238d0393aa70789e206ca610a Mon Sep 17 00:00:00 2001
|
|
From: Icenowy Zheng <icenowy@aosc.io>
|
|
Date: Wed, 17 Jun 2020 08:47:09 +0800
|
|
Subject: [PATCH 204/323] 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 0da01b2ba..0fc63ee45 100644
|
|
--- a/drivers/gpu/drm/sun4i/sun4i_tcon.c
|
|
+++ b/drivers/gpu/drm/sun4i/sun4i_tcon.c
|
|
@@ -107,9 +107,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);
|
|
}
|
|
}
|
|
@@ -1546,6 +1548,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,
|
|
@@ -1596,6 +1606,7 @@ const struct of_device_id sun4i_tcon_of_table[] = {
|
|
{ .compatible = "allwinner,sun8i-v3s-tcon", .data = &sun8i_v3s_quirks },
|
|
{ .compatible = "allwinner,sun9i-a80-tcon-lcd", .data = &sun9i_a80_tcon_lcd_quirks },
|
|
{ .compatible = "allwinner,sun9i-a80-tcon-tv", .data = &sun9i_a80_tcon_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 c0565e471..ea0e6b023 100644
|
|
--- a/drivers/gpu/drm/sun4i/sun4i_tcon.h
|
|
+++ b/drivers/gpu/drm/sun4i/sun4i_tcon.h
|
|
@@ -249,6 +249,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.0
|
|
|