Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

drm/stm: ltdc: handle lvds pixel clock

Handle LVDS pixel clock.

The LTDC operates with multiple clock domains for register access,
requiring all clocks to be provided during read/write operations. This
imposes a dependency between the LVDS and LTDC to access correctly all
LTDC registers. And because both IPs' pixel rates must be synchronized,
the LTDC has to handle the LVDS clock.

Signed-off-by: Yannick Fertre <yannick.fertre@foss.st.com>
Acked-by: Yannick Fertre <yannick.fertre@foss.st.com>
Acked-by: Philippe Cornu <philippe.cornu@foss.st.com>
Link: https://lore.kernel.org/r/20250822-drm-misc-next-v5-8-9c825e28f733@foss.st.com
Signed-off-by: Raphael Gallais-Pou <raphael.gallais-pou@foss.st.com>

authored by

Yannick Fertre and committed by
Raphael Gallais-Pou
b7243862 d8066764

+22 -1
+21 -1
drivers/gpu/drm/stm/ltdc.c
··· 838 838 int target_max = target + CLK_TOLERANCE_HZ; 839 839 int result; 840 840 841 + if (ldev->lvds_clk) { 842 + result = clk_round_rate(ldev->lvds_clk, target); 843 + drm_dbg_driver(crtc->dev, "lvds pixclk rate target %d, available %d\n", 844 + target, result); 845 + } 846 + 841 847 result = clk_round_rate(ldev->pixel_clk, target); 842 848 843 849 drm_dbg_driver(crtc->dev, "clk rate target %d, available %d\n", target, result); ··· 1885 1879 clk_disable_unprepare(ldev->pixel_clk); 1886 1880 if (ldev->bus_clk) 1887 1881 clk_disable_unprepare(ldev->bus_clk); 1882 + if (ldev->lvds_clk) 1883 + clk_disable_unprepare(ldev->lvds_clk); 1888 1884 } 1889 1885 1890 1886 int ltdc_resume(struct drm_device *ddev) ··· 1904 1896 1905 1897 if (ldev->bus_clk) { 1906 1898 ret = clk_prepare_enable(ldev->bus_clk); 1907 - if (ret) 1899 + if (ret) { 1908 1900 drm_err(ddev, "failed to enable bus clock (%d)\n", ret); 1901 + return ret; 1902 + } 1903 + } 1904 + 1905 + if (ldev->lvds_clk) { 1906 + ret = clk_prepare_enable(ldev->lvds_clk); 1907 + if (ret) 1908 + drm_err(ddev, "failed to prepare lvds clock\n"); 1909 1909 } 1910 1910 1911 1911 return ret; ··· 1997 1981 } 1998 1982 } 1999 1983 } 1984 + 1985 + ldev->lvds_clk = devm_clk_get(dev, "lvds"); 1986 + if (IS_ERR(ldev->lvds_clk)) 1987 + ldev->lvds_clk = NULL; 2000 1988 2001 1989 rstc = devm_reset_control_get_exclusive(dev, NULL); 2002 1990
+1
drivers/gpu/drm/stm/ltdc.h
··· 48 48 void __iomem *regs; 49 49 struct regmap *regmap; 50 50 struct clk *pixel_clk; /* lcd pixel clock */ 51 + struct clk *lvds_clk; /* lvds pixel clock */ 51 52 struct clk *bus_clk; /* bus clock */ 52 53 struct mutex err_lock; /* protecting error_status */ 53 54 struct ltdc_caps caps;