From: Daniil Gnusarev <gnusarevda@basealt.ru>
To: gnusarevda@basealt.ru, devel-kernel@lists.altlinux.org
Subject: [d-kernel] [PATCH 15/35] drm: baikal-vdu: driver compatibility with SDK earlier than 5.9
Date: Fri, 27 Feb 2026 14:32:16 +0400
Message-ID: <20260227103236.785736-16-gnusarevda@basealt.ru> (raw)
In-Reply-To: <20260227103236.785736-1-gnusarevda@basealt.ru>
In early SDK before version 5.9 in devicetree used separate
description of VDU devices, for HDMI and for LVDS. Later began to
be used jointly. This patch allows to use the driver with old
firmware versions.
Signed-off-by: Daniil Gnusarev <gnusarevda@basealt.ru>
Do-not-upstream: this is a feature of Baikal-M
---
drivers/gpu/drm/baikal/baikal_vdu_drm.h | 1 +
drivers/gpu/drm/baikal/baikal_vdu_drv.c | 82 ++++++++++++++++++++-----
2 files changed, 67 insertions(+), 16 deletions(-)
diff --git a/drivers/gpu/drm/baikal/baikal_vdu_drm.h b/drivers/gpu/drm/baikal/baikal_vdu_drm.h
index 432270bebed69b..90dc57bac7ae2c 100644
--- a/drivers/gpu/drm/baikal/baikal_vdu_drm.h
+++ b/drivers/gpu/drm/baikal/baikal_vdu_drm.h
@@ -67,6 +67,7 @@ struct baikal_vdu_crossbar {
struct drm_device drm;
struct baikal_vdu_private hdmi;
struct baikal_vdu_private lvds;
+ int legacy;
};
struct baikal_lvds_bridge {
diff --git a/drivers/gpu/drm/baikal/baikal_vdu_drv.c b/drivers/gpu/drm/baikal/baikal_vdu_drv.c
index e2a5e6ff03e37d..db7ef4c2027c6c 100644
--- a/drivers/gpu/drm/baikal/baikal_vdu_drv.c
+++ b/drivers/gpu/drm/baikal/baikal_vdu_drv.c
@@ -50,6 +50,9 @@ int mode_override = 0;
int hdmi_off = 0;
int lvds_off = 0;
+#define legacy_LDVS 1
+#define legacy_HDMI 2
+
static struct drm_driver vdu_drm_driver;
static struct drm_mode_config_funcs mode_config_funcs = {
@@ -70,10 +73,13 @@ static struct drm_bridge *devm_baikal_get_bridge(struct device *dev,
struct drm_bridge *bridge;
struct drm_panel *panel;
struct fwnode_handle *fwnode;
+ struct drm_device *drm = dev_get_drvdata(dev);
+ struct baikal_vdu_crossbar *crossbar = drm_to_baikal_vdu_crossbar(drm);
int ret = 0;
if (is_of_node(dev->fwnode)) {
- ret = drm_of_find_panel_or_bridge(to_of_node(dev->fwnode), port,
+ ret = drm_of_find_panel_or_bridge(to_of_node(dev->fwnode),
+ crossbar->legacy ? 0 : port,
endpoint, &panel, &bridge);
} else {
if (port == CRTC_HDMI) {
@@ -221,12 +227,18 @@ static int baikal_vdu_allocate_resources(struct platform_device *pdev,
struct baikal_vdu_private *priv)
{
struct device *dev = &pdev->dev;
+ struct drm_device *drm = priv->drm;
+ struct baikal_vdu_crossbar *crossbar = drm_to_baikal_vdu_crossbar(drm);
struct resource *mem;
int ret;
- mem = platform_get_resource_byname(pdev, IORESOURCE_MEM, priv->regs_name);
- if (!mem)
- mem = platform_get_resource(pdev, IORESOURCE_MEM, priv->index);
+ if (crossbar->legacy)
+ mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+ else {
+ mem = platform_get_resource_byname(pdev, IORESOURCE_MEM, priv->regs_name);
+ if (!mem)
+ mem = platform_get_resource(pdev, IORESOURCE_MEM, priv->index);
+ }
if (!mem) {
dev_err(dev, "%s %s: no MMIO resource specified\n", __func__, priv->name);
@@ -261,9 +273,14 @@ static int baikal_vdu_allocate_irq(struct platform_device *pdev,
struct baikal_vdu_private *priv)
{
struct device *dev = &pdev->dev;
+ struct drm_device *drm = priv->drm;
+ struct baikal_vdu_crossbar *crossbar = drm_to_baikal_vdu_crossbar(drm);
int ret;
- priv->irq = fwnode_irq_get_byname(dev->fwnode, priv->irq_name);
+ if (crossbar->legacy)
+ priv->irq = fwnode_irq_get(dev->fwnode, 0);
+ else
+ priv->irq = fwnode_irq_get_byname(dev->fwnode, priv->irq_name);
if (priv->irq < 0) {
dev_err(dev, "%s %s: no IRQ resource specified\n", __func__, priv->name);
return -EINVAL;
@@ -362,6 +379,8 @@ static int baikal_vdu_drm_probe(struct platform_device *pdev)
struct drm_device *drm;
struct drm_mode_config *mode_config;
struct arm_smccc_res res;
+ struct device_node *node;
+ int node_count;
int ret;
crossbar = devm_drm_dev_alloc(dev, &vdu_drm_driver,
@@ -371,25 +390,54 @@ static int baikal_vdu_drm_probe(struct platform_device *pdev)
drm = &crossbar->drm;
platform_set_drvdata(pdev, drm);
+ crossbar->legacy = 0;
hdmi = &crossbar->hdmi;
baikal_vdu_set_name(hdmi, CRTC_HDMI, "hdmi");
lvds = &crossbar->lvds;
baikal_vdu_set_name(lvds, CRTC_LVDS, "lvds");
- ret = baikal_vdu_bridge_init(hdmi, drm);
- if (ret == -EPROBE_DEFER)
- goto out_drm;
+ node = NULL;
+ node_count = 0;
+ while ((node = of_find_compatible_node(node, NULL, "baikal,vdu")))
+ node_count++;
+
+ if (node_count > 1) {
+ dev_info(dev, "Found separate description of VDU devices\n");
+ if (device_property_present(dev, "lvds-out")) {
+ // LVDS
+ crossbar->legacy = legacy_LDVS;
+ sprintf(lvds->pclk_name, "pclk");
+ lvds->index = CRTC_LVDS;
+ } else {
+ // HDMI
+ crossbar->legacy = legacy_HDMI;
+ sprintf(hdmi->pclk_name, "pclk");
+ hdmi->index = CRTC_HDMI;
+ }
+ }
- ret = device_property_read_u32(&pdev->dev, "lvds-lanes",
- &lvds->num_lanes);
- if (ret)
- lvds->num_lanes = 0;
- if (lvds->num_lanes) {
- ret = baikal_vdu_bridge_init(lvds, drm);
+ if (crossbar->legacy != legacy_LDVS) {
+ ret = baikal_vdu_bridge_init(hdmi, drm);
if (ret == -EPROBE_DEFER)
goto out_drm;
}
+ if (crossbar->legacy != legacy_HDMI) {
+ ret = device_property_read_u32(&pdev->dev, "lvds-lanes",
+ &lvds->num_lanes);
+ if (ret) {
+ if (crossbar->legacy)
+ lvds->num_lanes = of_graph_get_endpoint_count(dev->of_node);
+ else
+ lvds->num_lanes = 0;
+ }
+ if (lvds->num_lanes) {
+ ret = baikal_vdu_bridge_init(lvds, drm);
+ if (ret == -EPROBE_DEFER)
+ goto out_drm;
+ }
+ }
+
drm_mode_config_init(drm);
mode_config = &drm->mode_config;
mode_config->funcs = &mode_config_funcs;
@@ -399,10 +447,12 @@ static int baikal_vdu_drm_probe(struct platform_device *pdev)
mode_config->max_height = 8192;
hdmi->off = hdmi_off;
- hdmi->ready = baikal_vdu_resources_init(pdev, hdmi);
+ hdmi->ready = (crossbar->legacy != legacy_LDVS) &&
+ baikal_vdu_resources_init(pdev, hdmi);
if (lvds->num_lanes) {
lvds->off = lvds_off;
- lvds->ready = baikal_vdu_resources_init(pdev, lvds);
+ lvds->ready = (crossbar->legacy != legacy_HDMI) &&
+ baikal_vdu_resources_init(pdev, lvds);
} else {
lvds->ready = 0;
lvds->bridge = NULL;
--
2.42.2
next prev parent reply other threads:[~2026-02-27 10:32 UTC|newest]
Thread overview: 36+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-02-27 10:32 [d-kernel] [PATCH 00/35] Kernel 6.18 with support for the Baikal-M SoC Daniil Gnusarev
2026-02-27 10:32 ` [d-kernel] [PATCH 01/35] Baikal Electronics SoC family Daniil Gnusarev
2026-02-27 10:32 ` [d-kernel] [PATCH 02/35] clk: Add clock drivers for Baikal BE-M1000 Daniil Gnusarev
2026-02-27 10:32 ` [d-kernel] [PATCH 03/35] clk: baikal-m: old firmware: use "cmu-id" if there is no "reg" in devicetree Daniil Gnusarev
2026-02-27 10:32 ` [d-kernel] [PATCH 04/35] usb: add support for Baikal USB PHY Daniil Gnusarev
2026-02-27 10:32 ` [d-kernel] [PATCH 05/35] usb: dwc3: of-simple: added compatible string for Baikal-M SoC Daniil Gnusarev
2026-02-27 10:32 ` [d-kernel] [PATCH 06/35] uart: add support for UART Baikal BE-M1000 Daniil Gnusarev
2026-02-27 10:32 ` [d-kernel] [PATCH 07/35] serial: 8250_dw: verify clock rate in dw8250_set_termios Daniil Gnusarev
2026-02-27 10:32 ` [d-kernel] [PATCH 08/35] cpufreq-dt: don't load on Baikal-M SoC Daniil Gnusarev
2026-02-27 10:32 ` [d-kernel] [PATCH 09/35] net: stmmac: support of Baikal-BE1000 SoCs GMAC Daniil Gnusarev
2026-02-27 10:32 ` [d-kernel] [PATCH 10/35] net: fwnode_get_phy_id: consider all compatible strings Daniil Gnusarev
2026-02-27 10:32 ` [d-kernel] [PATCH 11/35] drm/panfrost: forcibly set dma-coherent on Baikal-M Daniil Gnusarev
2026-02-27 10:32 ` [d-kernel] [PATCH 12/35] drm/panfrost: disable devfreq " Daniil Gnusarev
2026-02-27 10:32 ` [d-kernel] [PATCH 13/35] ata: ahci: add support for Baikal BE-M1000 Daniil Gnusarev
2026-02-27 10:32 ` [d-kernel] [PATCH 14/35] drm: add Baikal-M SoC video display unit driver Daniil Gnusarev
2026-02-27 10:32 ` Daniil Gnusarev [this message]
2026-02-27 10:32 ` [d-kernel] [PATCH 16/35] drm: baikal-vdu: disable backlight driver loading Daniil Gnusarev
2026-02-27 10:32 ` [d-kernel] [PATCH 17/35] sound: add support for Baikal BE-M1000 I2S Daniil Gnusarev
2026-02-27 10:32 ` [d-kernel] [PATCH 18/35] sound: dwc-i2s: request all IRQs specified in device tree Daniil Gnusarev
2026-02-27 10:32 ` [d-kernel] [PATCH 19/35] sound: dwc-i2s: paper over RX overrun warnings on Baikal-M Daniil Gnusarev
2026-02-27 10:32 ` [d-kernel] [PATCH 20/35] sound: baikal-i2s: " Daniil Gnusarev
2026-02-27 10:32 ` [d-kernel] [PATCH 21/35] drm/bridge: dw-hdmi: support ahb audio hw revision 0x2a Daniil Gnusarev
2026-02-27 10:32 ` [d-kernel] [PATCH 22/35] dt-bindings: dw-hdmi: added ahb-audio-regshift Daniil Gnusarev
2026-02-27 10:32 ` [d-kernel] [PATCH 23/35] drm/bridge: dw-hdmi: force ahb audio register offset for Baikal-M Daniil Gnusarev
2026-02-27 10:32 ` [d-kernel] [PATCH 24/35] dw-hdmi: add flag SNDRV_PCM_INFO_BATCH for audio via hdmi on Baikal-M Daniil Gnusarev
2026-02-27 10:32 ` [d-kernel] [PATCH 25/35] bmc: add board management controller driver Daniil Gnusarev
2026-02-27 10:32 ` [d-kernel] [PATCH 26/35] pm: disable all sleep states on Baikal-M based boards Daniil Gnusarev
2026-02-27 10:32 ` [d-kernel] [PATCH 27/35] sound: hda: add driver for HDA controller on Baikal-M Daniil Gnusarev
2026-02-27 10:32 ` [d-kernel] [PATCH 28/35] sound: hda: enable jack detection in polling mode " Daniil Gnusarev
2026-02-27 10:32 ` [d-kernel] [PATCH 29/35] input: new driver - serdev-serio Daniil Gnusarev
2026-02-27 10:32 ` [d-kernel] [PATCH 30/35] input: serio: add an alias to the sersev-serio driver Daniil Gnusarev
2026-02-27 10:32 ` [d-kernel] [PATCH 31/35] input: added TF307 serio PS/2 emulator driver Daniil Gnusarev
2026-02-27 10:32 ` [d-kernel] [PATCH 32/35] hwmon: add Baikal-M monitoring driver Daniil Gnusarev
2026-02-27 10:32 ` [d-kernel] [PATCH 33/35] hwmon: baikal-pvt: support work on machines with old firmware Daniil Gnusarev
2026-02-27 10:32 ` [d-kernel] [PATCH 34/35] dw-pcie: refuse to load on Baikal-M with recent firmware Daniil Gnusarev
2026-02-27 10:32 ` [d-kernel] [PATCH 35/35] config-aarch64: enable more configs for Baikal-M support Daniil Gnusarev
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260227103236.785736-16-gnusarevda@basealt.ru \
--to=gnusarevda@basealt.ru \
--cc=devel-kernel@lists.altlinux.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
ALT Linux kernel packages development
This inbox may be cloned and mirrored by anyone:
git clone --mirror http://lore.altlinux.org/devel-kernel/0 devel-kernel/git/0.git
# If you have public-inbox 1.1+ installed, you may
# initialize and index your mirror using the following commands:
public-inbox-init -V2 devel-kernel devel-kernel/ http://lore.altlinux.org/devel-kernel \
devel-kernel@altlinux.org devel-kernel@altlinux.ru devel-kernel@altlinux.com
public-inbox-index devel-kernel
Example config snippet for mirrors.
Newsgroup available over NNTP:
nntp://lore.altlinux.org/org.altlinux.lists.devel-kernel
AGPL code for this site: git clone https://public-inbox.org/public-inbox.git