From: Daniil Gnusarev <gnusarevda@basealt.ru> To: devel-kernel@lists.altlinux.org Subject: [d-kernel] [PATCH 33/39] drm: baikal-vdu: driver compatibility with SDK earlier than 5.9 Date: Mon, 14 Oct 2024 18:02:14 +0400 Message-ID: <20241014140221.535985-34-gnusarevda@basealt.ru> (raw) In-Reply-To: <20241014140221.535985-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> --- 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 432270bebed69..90dc57bac7ae2 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 c9d5cea635628..a951c6661ffa6 100644 --- a/drivers/gpu/drm/baikal/baikal_vdu_drv.c +++ b/drivers/gpu/drm/baikal/baikal_vdu_drv.c @@ -49,6 +49,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 = { @@ -69,10 +72,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) { @@ -219,12 +225,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); @@ -260,9 +272,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; @@ -358,6 +375,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, @@ -367,27 +386,58 @@ 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); + if (lvds->num_lanes < 0) + lvds->num_lanes = 0; + } 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; @@ -397,10 +447,10 @@ 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:[~2024-10-14 14:02 UTC|newest] Thread overview: 41+ messages / expand[flat|nested] mbox.gz Atom feed top 2024-10-14 14:01 [d-kernel] [PATCH 00/39] Support Baikal-M in un-def in p11 Daniil Gnusarev 2024-10-14 14:01 ` [d-kernel] [PATCH 01/39] Baikal Electronics SoC family Daniil Gnusarev 2024-10-14 14:01 ` [d-kernel] [PATCH 02/39] Clk: Add clock drivers for Baikal BE-M1000 with new firmware Daniil Gnusarev 2024-10-14 14:01 ` [d-kernel] [PATCH 03/39] USB: Add support for Baikal USB PHY Daniil Gnusarev 2024-10-14 14:01 ` [d-kernel] [PATCH 04/39] PCI: Add support for PCIe controller for Baikal BE-M1000 Daniil Gnusarev 2024-10-14 14:01 ` [d-kernel] [PATCH 05/39] AHCI SATA: Add support " Daniil Gnusarev 2024-10-14 14:01 ` [d-kernel] [PATCH 06/39] UART: Add support for UART " Daniil Gnusarev 2024-10-14 14:01 ` [d-kernel] [PATCH 07/39] cpufreq-dt: don't load on Baikal-M SoC Daniil Gnusarev 2024-10-14 14:01 ` [d-kernel] [PATCH 08/39] Sound: add support for Baikal BE-M1000 I2S Daniil Gnusarev 2024-10-14 14:01 ` [d-kernel] [PATCH 09/39] sound: baikal-i2s: paper over RX overrun warnings on Baikal-M Daniil Gnusarev 2024-10-14 14:01 ` [d-kernel] [PATCH 10/39] net: stmmac: support of Baikal-BE1000 SoCs GMAC Daniil Gnusarev 2024-10-14 14:01 ` [d-kernel] [PATCH 11/39] net: fwnode_get_phy_id: consider all compatible strings Daniil Gnusarev 2024-10-14 14:01 ` [d-kernel] [PATCH 12/39] hwmon: bt1-pvt: access registers via pvt_{readl, writel} helpers Daniil Gnusarev 2024-10-14 14:01 ` [d-kernel] [PATCH 13/39] hwmon: bt1-pvt: define pvt_readl/pvt_writel for Baikal-M SoC Daniil Gnusarev 2024-10-14 14:01 ` [d-kernel] [PATCH 14/39] hwmon: bt1-pvt: adjusted probing " Daniil Gnusarev 2024-10-14 14:01 ` [d-kernel] [PATCH 15/39] hwmon: bt1-pvt: added compatible baikal, pvt Daniil Gnusarev 2024-10-14 14:01 ` [d-kernel] [PATCH 16/39] PVT: support register addressing with new firmware Daniil Gnusarev 2024-10-14 14:01 ` [d-kernel] [PATCH 17/39] drm: add Baikal-M SoC video display unit driver Daniil Gnusarev 2024-10-14 14:01 ` [d-kernel] [PATCH 18/39] drm/bridge: dw-hdmi: support ahb audio hw revision 0x2a Daniil Gnusarev 2024-10-14 14:02 ` [d-kernel] [PATCH 19/39] dt-bindings: dw-hdmi: added ahb-audio-regshift Daniil Gnusarev 2024-10-14 14:02 ` [d-kernel] [PATCH 20/39] drm/bridge: dw-hdmi: force ahb audio register offset for Baikal-M Daniil Gnusarev 2024-10-14 14:02 ` [d-kernel] [PATCH 21/39] drm/panfrost: forcibly set dma-coherent on Baikal-M Daniil Gnusarev 2024-10-14 14:02 ` [d-kernel] [PATCH 22/39] drm/panfrost: disable devfreq " Daniil Gnusarev 2024-10-14 14:02 ` [d-kernel] [PATCH 23/39] bmc: add board management controller driver Daniil Gnusarev 2024-10-14 14:02 ` [d-kernel] [PATCH 24/39] pm: disable all sleep states on Baikal-M based boards Daniil Gnusarev 2024-10-14 14:02 ` [d-kernel] [PATCH 25/39] sound: dwc-i2s: paper over RX overrun warnings on Baikal-M Daniil Gnusarev 2024-10-14 14:02 ` [d-kernel] [PATCH 26/39] sound: dwc-i2s: request all IRQs specified in device tree Daniil Gnusarev 2024-10-14 14:02 ` [d-kernel] [PATCH 27/39] usb: dwc3: of-simple: added compatible string for Baikal-M SoC Daniil Gnusarev 2024-10-14 14:02 ` [d-kernel] [PATCH 28/39] serial: 8250_dw: verify clock rate in dw8250_set_termios Daniil Gnusarev 2024-10-14 14:02 ` [d-kernel] [PATCH 29/39] clk: use "cmu-id" if there is no "reg" in devicetree Daniil Gnusarev 2024-10-14 14:02 ` [d-kernel] [PATCH 30/39] pci: baikal-pcie: driver compatibility with SDK earlier than 5.7 Daniil Gnusarev 2024-10-14 14:02 ` [d-kernel] [PATCH 31/39] pci: baikal-pcie: driver compatibility with SDK versions 5.4 Daniil Gnusarev 2024-10-14 14:02 ` [d-kernel] [PATCH 32/39] dw-pcie: refuse to load on Baikal-M with recent firmware Daniil Gnusarev 2024-10-14 14:02 ` Daniil Gnusarev [this message] 2024-10-14 14:02 ` [d-kernel] [PATCH 34/39] input: new driver - serdev-serio Daniil Gnusarev 2024-10-14 14:02 ` [d-kernel] [PATCH 35/39] input: added TF307 serio PS/2 emulator driver Daniil Gnusarev 2024-10-14 14:02 ` [d-kernel] [PATCH 36/39] input: tp_serio: catch up API changes Daniil Gnusarev 2024-10-14 14:02 ` [d-kernel] [PATCH 37/39] drm: baikal-m: add vblank events, fix mode switching Daniil Gnusarev 2024-10-14 14:02 ` [d-kernel] [PATCH 38/39] drm: baikal-vdu: disable backlight driver loading Daniil Gnusarev 2024-10-14 14:02 ` [d-kernel] [PATCH 39/39] config-aarch64: enable more configs for baikal-m support Daniil Gnusarev 2024-10-14 14:28 ` [d-kernel] [PATCH 00/39] Support Baikal-M in un-def in p11 Vitaly Chikunov
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=20241014140221.535985-34-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