Hi Andrey,
On Fri, Feb 14, 2020 at 11:32:31PM +0200, Andrey Lebedev wrote:
On Fri, Feb 14, 2020 at 09:53:51AM +0100, Maxime Ripard wrote:
On Fri, Feb 14, 2020 at 10:43:58AM +0200, Andrey Lebedev wrote:
On Fri, Feb 14, 2020 at 08:52:18AM +0100, Maxime Ripard wrote:
This will create a spurious warning message for TCON1, since we adjusted the driver to tell it supports LVDS, but there's no LVDS reset line, so we need to make it finer grained.
Yes, I can attribute two of the messages in my dmesg log [1] to this ("Missing LVDS properties" and "LVDS output disabled". "sun4i-tcon 1c0d000.lcd-controller" is indeed tcon1). And yes, I can see how they can be confusing to someone.
I'd need some pointers on how to deal with that though (if we want to do it in this scope).
Like I was mentionning, you could introduce a new compatible for each TCON (tcon0 and tcon1) and only set the support_lvds flag for tcon0
Can you give me an idea how that compatible might look like?
tcon0: lcd-controller@1c0c000 { compatible = "allwinner,sun7i-a20-tcon", "allwinner,lvds";
or
tcon0: lcd-controller@1c0c000 { compatible = "allwinner,sun7i-a20-tcon", "allwinner,tcon0";
? Or something completely different?
Something like
&tcon0 { compatible = "allwinner,sun7i-a20-tcon0", "allwinner,sun7i-a20-tcon"; };
&tcon1 { compatible = "allwinner,sun7i-a20-tcon1", "allwinner,sun7i-a20-tcon"; };
Hi Maxime, here is what I came up with, please take a look. If the approach is right, I'll split it up and include into the patch set.
From f3e45c958a9551a52ac26435785bdb572e54d8db Mon Sep 17 00:00:00 2001 From: Andrey Lebedev andrey@lebedev.lt Date: Fri, 14 Feb 2020 23:21:59 +0200 Subject: [PATCH] Mark tcon0 to be the only tcon capable of LVDS on sun7i-a20
This allows to avoid warnings about reset line not provided for tcon1.
Signed-off-by: Andrey Lebedev andrey@lebedev.lt
arch/arm/boot/dts/sun7i-a20.dtsi | 2 +- drivers/gpu/drm/sun4i/sun4i_tcon.c | 22 +++++++++++++++++++++- drivers/gpu/drm/sun4i/sun4i_tcon.h | 2 ++ 3 files changed, 24 insertions(+), 2 deletions(-)
diff --git a/arch/arm/boot/dts/sun7i-a20.dtsi b/arch/arm/boot/dts/sun7i-a20.dtsi index 3b3c366a2bee..bab59fc4d9b1 100644 --- a/arch/arm/boot/dts/sun7i-a20.dtsi +++ b/arch/arm/boot/dts/sun7i-a20.dtsi @@ -405,7 +405,7 @@ };
tcon0: lcd-controller@1c0c000 {
compatible = "allwinner,sun7i-a20-tcon";
compatible = "allwinner,sun7i-a20-tcon0", "allwinner,sun7i-a20-tcon";
That's correct
reg = <0x01c0c000 0x1000>; interrupts = <GIC_SPI 44 IRQ_TYPE_LEVEL_HIGH>; resets = <&ccu RST_TCON0>, <&ccu RST_LVDS>;
diff --git a/drivers/gpu/drm/sun4i/sun4i_tcon.c b/drivers/gpu/drm/sun4i/sun4i_tcon.c index 800a9bd86112..cb2040aec436 100644 --- a/drivers/gpu/drm/sun4i/sun4i_tcon.c +++ b/drivers/gpu/drm/sun4i/sun4i_tcon.c @@ -1107,6 +1107,25 @@ static struct sunxi_engine *sun4i_tcon_find_engine(struct sun4i_drv *drv, return sun4i_tcon_find_engine_traverse(drv, node, 0); }
+/*
- Check if given tcon supports LVDS
- Some of the sunxi SoC variants contain several timing controllers, but only
- one of them can be used to drive LVDS screen. In this case such tcon is
- identified in respective quirks struct: lvds_compatible_tcon property will
- hold "compatible" string of the tcon, that supports LVDS.
- If lvds_compatible_tcon is not set, all tcons are considered capable of
- driving LVDS.
- */
+static bool sun4i_tcon_lvds_compat(struct device *dev, struct sun4i_tcon *tcon) +{
- if (tcon->quirks->lvds_compatible_tcon == NULL)
return true;
- return of_device_is_compatible(dev->of_node,
tcon->quirks->lvds_compatible_tcon);
+}
static int sun4i_tcon_bind(struct device *dev, struct device *master, void *data) { @@ -1161,7 +1180,7 @@ static int sun4i_tcon_bind(struct device *dev, struct device *master, return ret; }
- if (tcon->quirks->supports_lvds) {
- if (tcon->quirks->supports_lvds && sun4i_tcon_lvds_compat(dev, tcon)) { /*
- This can only be made optional since we've had DT
- nodes without the LVDS reset properties.
@@ -1481,6 +1500,7 @@ static const struct sun4i_tcon_quirks sun6i_a31s_quirks = {
static const struct sun4i_tcon_quirks sun7i_a20_quirks = { .supports_lvds = true,
- .lvds_compatible_tcon = "allwinner,sun7i-a20-tcon0", .has_channel_0 = true, .has_channel_1 = true, .dclk_min_div = 4,
diff --git a/drivers/gpu/drm/sun4i/sun4i_tcon.h b/drivers/gpu/drm/sun4i/sun4i_tcon.h index cfbf4e6c1679..bc87d28ee341 100644 --- a/drivers/gpu/drm/sun4i/sun4i_tcon.h +++ b/drivers/gpu/drm/sun4i/sun4i_tcon.h @@ -235,6 +235,8 @@ struct sun4i_tcon_quirks { bool needs_de_be_mux; /* sun6i needs mux to select backend */ bool needs_edp_reset; /* a80 edp reset needed for tcon0 access */ bool supports_lvds; /* Does the TCON support an LVDS output? */
- /* "compatible" string of TCON that exclusively supports LVDS */
- const char *lvds_compatible_tcon;
However this is far more complicated than needed, you can simply add a new quirks structure associated to the tcon0 compatible in sun4i_tcon_of_table, and that will do
Maxime