drivers/gpu/drm/stm/ltdc.c:2078 ltdc_load() warn: 'ldev->pixel_clk' from clk_prepare_enable() not released on lines: 1948.
kernel test robot <[email protected]>
| Newsgroups | dev.linux.lists.oe-kbuild |
|---|---|
| Message-ID | <[email protected]> |
BCC: [email protected] CC: [email protected] CC: [email protected] TO: Yannick Fertre <[email protected]> CC: "Raphael Gallais-Pou" <[email protected]> tree: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git master head: 0e35b9b6ec0ffcc5e23cbdec09f5c622ad532b53 commit: d80667642b0f43580efd489d627dd24aa10ab98f drm/stm: ltdc: support new hardware version for STM32MP25 SoC date: 11 months ago :::::: branch date: 3 days ago :::::: commit date: 11 months ago config: microblaze-randconfig-r071-20260710 (https://download.01.org/0day-ci/archive/20260710/[email protected]/config) compiler: microblaze-linux-gcc (GCC) 8.5.0 smatch: v0.5.0-9185-gbcc58b9c If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags | Fixes: d80667642b0f ("drm/stm: ltdc: support new hardware version for STM32MP25 SoC") | Reported-by: kernel test robot <[email protected]> | Reported-by: Dan Carpenter <[email protected]> | Closes: https://lore.kernel.org/r/[email protected]/ New smatch warnings: drivers/gpu/drm/stm/ltdc.c:2078 ltdc_load() warn: 'ldev->pixel_clk' from clk_prepare_enable() not released on lines: 1948. Old smatch warnings: drivers/gpu/drm/stm/ltdc.c:939 ltdc_crtc_mode_set_nofb() warn: pm_runtime_get_sync() also returns 1 on success drivers/gpu/drm/stm/ltdc.c:1903 ltdc_resume() warn: 'ldev->pixel_clk' from clk_prepare_enable() not released on lines: 1903. vim +2078 drivers/gpu/drm/stm/ltdc.c df61c776657fa5 Yannick Fertré 2019-03-21 1905 b759012c5fa761 Yannick Fertre 2017-04-14 1906 int ltdc_load(struct drm_device *ddev) b759012c5fa761 Yannick Fertre 2017-04-14 1907 { b759012c5fa761 Yannick Fertre 2017-04-14 1908 struct platform_device *pdev = to_platform_device(ddev->dev); b759012c5fa761 Yannick Fertre 2017-04-14 1909 struct ltdc_device *ldev = ddev->dev_private; b759012c5fa761 Yannick Fertre 2017-04-14 1910 struct device *dev = ddev->dev; b759012c5fa761 Yannick Fertre 2017-04-14 1911 struct device_node *np = dev->of_node; b430ff7ef8b016 Yannick Fertre 2020-02-28 1912 struct drm_bridge *bridge; b430ff7ef8b016 Yannick Fertre 2020-02-28 1913 struct drm_panel *panel; b759012c5fa761 Yannick Fertre 2017-04-14 1914 struct drm_crtc *crtc; b759012c5fa761 Yannick Fertre 2017-04-14 1915 struct reset_control *rstc; b430ff7ef8b016 Yannick Fertre 2020-02-28 1916 int irq, i, nb_endpoints; b430ff7ef8b016 Yannick Fertre 2020-02-28 1917 int ret = -ENODEV; b759012c5fa761 Yannick Fertre 2017-04-14 1918 1e00a12dbb09a7 Raphael Gallais-Pou 2025-08-25 1919 drm_dbg_driver(ddev, "\n"); b759012c5fa761 Yannick Fertre 2017-04-14 1920 b430ff7ef8b016 Yannick Fertre 2020-02-28 1921 /* Get number of endpoints */ b430ff7ef8b016 Yannick Fertre 2020-02-28 1922 nb_endpoints = of_graph_get_endpoint_count(np); b430ff7ef8b016 Yannick Fertre 2020-02-28 1923 if (!nb_endpoints) b430ff7ef8b016 Yannick Fertre 2020-02-28 1924 return -ENODEV; b759012c5fa761 Yannick Fertre 2017-04-14 1925 b759012c5fa761 Yannick Fertre 2017-04-14 1926 ldev->pixel_clk = devm_clk_get(dev, "lcd"); b759012c5fa761 Yannick Fertre 2017-04-14 1927 if (IS_ERR(ldev->pixel_clk)) { 1f358bc6f272b9 Fabien Dessenne 2019-04-24 1928 if (PTR_ERR(ldev->pixel_clk) != -EPROBE_DEFER) 1e00a12dbb09a7 Raphael Gallais-Pou 2025-08-25 1929 drm_err(ddev, "Unable to get lcd clock\n"); 1f358bc6f272b9 Fabien Dessenne 2019-04-24 1930 return PTR_ERR(ldev->pixel_clk); b759012c5fa761 Yannick Fertre 2017-04-14 1931 } b759012c5fa761 Yannick Fertre 2017-04-14 1932 b759012c5fa761 Yannick Fertre 2017-04-14 1933 if (clk_prepare_enable(ldev->pixel_clk)) { 1e00a12dbb09a7 Raphael Gallais-Pou 2025-08-25 1934 drm_err(ddev, "Unable to prepare pixel clock\n"); b759012c5fa761 Yannick Fertre 2017-04-14 1935 return -ENODEV; b759012c5fa761 Yannick Fertre 2017-04-14 1936 } b759012c5fa761 Yannick Fertre 2017-04-14 1937 d80667642b0f43 Yannick Fertre 2025-08-22 1938 if (of_device_is_compatible(np, "st,stm32mp251-ltdc") || d80667642b0f43 Yannick Fertre 2025-08-22 1939 of_device_is_compatible(np, "st,stm32mp255-ltdc")) { d80667642b0f43 Yannick Fertre 2025-08-22 1940 ldev->bus_clk = devm_clk_get(dev, "bus"); d80667642b0f43 Yannick Fertre 2025-08-22 1941 if (IS_ERR(ldev->bus_clk)) d80667642b0f43 Yannick Fertre 2025-08-22 1942 return dev_err_probe(dev, PTR_ERR(ldev->bus_clk), d80667642b0f43 Yannick Fertre 2025-08-22 1943 "Unable to get bus clock\n"); d80667642b0f43 Yannick Fertre 2025-08-22 1944 d80667642b0f43 Yannick Fertre 2025-08-22 1945 ret = clk_prepare_enable(ldev->bus_clk); d80667642b0f43 Yannick Fertre 2025-08-22 1946 if (ret) { d80667642b0f43 Yannick Fertre 2025-08-22 1947 drm_err(ddev, "Unable to prepare bus clock\n"); d80667642b0f43 Yannick Fertre 2025-08-22 1948 return ret; d80667642b0f43 Yannick Fertre 2025-08-22 1949 } d80667642b0f43 Yannick Fertre 2025-08-22 1950 } d80667642b0f43 Yannick Fertre 2025-08-22 1951 b430ff7ef8b016 Yannick Fertre 2020-02-28 1952 /* Get endpoints if any */ b430ff7ef8b016 Yannick Fertre 2020-02-28 1953 for (i = 0; i < nb_endpoints; i++) { b430ff7ef8b016 Yannick Fertre 2020-02-28 1954 ret = drm_of_find_panel_or_bridge(np, 0, i, &panel, &bridge); b430ff7ef8b016 Yannick Fertre 2020-02-28 1955 b430ff7ef8b016 Yannick Fertre 2020-02-28 1956 /* b430ff7ef8b016 Yannick Fertre 2020-02-28 1957 * If at least one endpoint is -ENODEV, continue probing, b430ff7ef8b016 Yannick Fertre 2020-02-28 1958 * else if at least one endpoint returned an error b430ff7ef8b016 Yannick Fertre 2020-02-28 1959 * (ie -EPROBE_DEFER) then stop probing. b430ff7ef8b016 Yannick Fertre 2020-02-28 1960 */ b430ff7ef8b016 Yannick Fertre 2020-02-28 1961 if (ret == -ENODEV) b430ff7ef8b016 Yannick Fertre 2020-02-28 1962 continue; b430ff7ef8b016 Yannick Fertre 2020-02-28 1963 else if (ret) b430ff7ef8b016 Yannick Fertre 2020-02-28 1964 goto err; b430ff7ef8b016 Yannick Fertre 2020-02-28 1965 b430ff7ef8b016 Yannick Fertre 2020-02-28 1966 if (panel) { 19dd9780b7ac67 Katya Orlova 2024-02-16 1967 bridge = drmm_panel_bridge_add(ddev, panel); b430ff7ef8b016 Yannick Fertre 2020-02-28 1968 if (IS_ERR(bridge)) { 1e00a12dbb09a7 Raphael Gallais-Pou 2025-08-25 1969 drm_err(ddev, "panel-bridge endpoint %d\n", i); b430ff7ef8b016 Yannick Fertre 2020-02-28 1970 ret = PTR_ERR(bridge); b430ff7ef8b016 Yannick Fertre 2020-02-28 1971 goto err; b430ff7ef8b016 Yannick Fertre 2020-02-28 1972 } b430ff7ef8b016 Yannick Fertre 2020-02-28 1973 } b430ff7ef8b016 Yannick Fertre 2020-02-28 1974 b430ff7ef8b016 Yannick Fertre 2020-02-28 1975 if (bridge) { b430ff7ef8b016 Yannick Fertre 2020-02-28 1976 ret = ltdc_encoder_init(ddev, bridge); b430ff7ef8b016 Yannick Fertre 2020-02-28 1977 if (ret) { 648ce7fd186cfb Jagan Teki 2021-07-04 1978 if (ret != -EPROBE_DEFER) 1e00a12dbb09a7 Raphael Gallais-Pou 2025-08-25 1979 drm_err(ddev, "init encoder endpoint %d\n", i); b430ff7ef8b016 Yannick Fertre 2020-02-28 1980 goto err; b430ff7ef8b016 Yannick Fertre 2020-02-28 1981 } b430ff7ef8b016 Yannick Fertre 2020-02-28 1982 } b430ff7ef8b016 Yannick Fertre 2020-02-28 1983 } b430ff7ef8b016 Yannick Fertre 2020-02-28 1984 b430ff7ef8b016 Yannick Fertre 2020-02-28 1985 rstc = devm_reset_control_get_exclusive(dev, NULL); b430ff7ef8b016 Yannick Fertre 2020-02-28 1986 b430ff7ef8b016 Yannick Fertre 2020-02-28 1987 mutex_init(&ldev->err_lock); b430ff7ef8b016 Yannick Fertre 2020-02-28 1988 f42f540b9d0c16 Yannick Fertré 2019-04-03 1989 if (!IS_ERR(rstc)) { f42f540b9d0c16 Yannick Fertré 2019-04-03 1990 reset_control_assert(rstc); f42f540b9d0c16 Yannick Fertré 2019-04-03 1991 usleep_range(10, 20); f42f540b9d0c16 Yannick Fertré 2019-04-03 1992 reset_control_deassert(rstc); f42f540b9d0c16 Yannick Fertré 2019-04-03 1993 } f42f540b9d0c16 Yannick Fertré 2019-04-03 1994 50cc9a322b5f4f Anusha Srivatsa 2025-02-25 1995 ldev->regs = devm_platform_ioremap_resource(pdev, 0); b759012c5fa761 Yannick Fertre 2017-04-14 1996 if (IS_ERR(ldev->regs)) { 1e00a12dbb09a7 Raphael Gallais-Pou 2025-08-25 1997 drm_err(ddev, "Unable to get ltdc registers\n"); cea3a330ee20e9 Philippe CORNU 2017-07-17 1998 ret = PTR_ERR(ldev->regs); cea3a330ee20e9 Philippe CORNU 2017-07-17 1999 goto err; b759012c5fa761 Yannick Fertre 2017-04-14 2000 } b759012c5fa761 Yannick Fertre 2017-04-14 2001 734c26450aefaa Yannick Fertre 2021-12-15 2002 ldev->regmap = devm_regmap_init_mmio(&pdev->dev, ldev->regs, &stm32_ltdc_regmap_cfg); 734c26450aefaa Yannick Fertre 2021-12-15 2003 if (IS_ERR(ldev->regmap)) { 1e00a12dbb09a7 Raphael Gallais-Pou 2025-08-25 2004 drm_err(ddev, "Unable to regmap ltdc registers\n"); 734c26450aefaa Yannick Fertre 2021-12-15 2005 ret = PTR_ERR(ldev->regmap); 734c26450aefaa Yannick Fertre 2021-12-15 2006 goto err; 734c26450aefaa Yannick Fertre 2021-12-15 2007 } 734c26450aefaa Yannick Fertre 2021-12-15 2008 544aa6cefb24d7 Yannick Fertre 2020-01-21 2009 ret = ltdc_get_caps(ddev); 544aa6cefb24d7 Yannick Fertre 2020-01-21 2010 if (ret) { 1e00a12dbb09a7 Raphael Gallais-Pou 2025-08-25 2011 drm_err(ddev, "hardware identifier (0x%08x) not supported!\n", 544aa6cefb24d7 Yannick Fertre 2020-01-21 2012 ldev->caps.hw_version); 9e759fc7dcd6d4 Fabien Dessenne 2019-04-24 2013 goto err; 544aa6cefb24d7 Yannick Fertre 2020-01-21 2014 } 9e759fc7dcd6d4 Fabien Dessenne 2019-04-24 2015 ef824286128edd Yannick Fertre 2024-07-12 2016 /* Disable all interrupts */ ef824286128edd Yannick Fertre 2024-07-12 2017 regmap_clear_bits(ldev->regmap, LTDC_IER, IER_MASK); 7d008eecb0cfc2 Yannick Fertre 2022-06-03 2018 1e00a12dbb09a7 Raphael Gallais-Pou 2025-08-25 2019 drm_dbg_driver(ddev, "ltdc hw version 0x%08x\n", ldev->caps.hw_version); 544aa6cefb24d7 Yannick Fertre 2020-01-21 2020 7d008eecb0cfc2 Yannick Fertre 2022-06-03 2021 /* initialize default value for fifo underrun threshold & clear interrupt error counters */ 7d008eecb0cfc2 Yannick Fertre 2022-06-03 2022 ldev->transfer_err = 0; 7d008eecb0cfc2 Yannick Fertre 2022-06-03 2023 ldev->fifo_err = 0; 7d008eecb0cfc2 Yannick Fertre 2022-06-03 2024 ldev->fifo_warn = 0; 7d008eecb0cfc2 Yannick Fertre 2022-06-03 2025 ldev->fifo_threshold = FUT_DFT; 7d008eecb0cfc2 Yannick Fertre 2022-06-03 2026 544aa6cefb24d7 Yannick Fertre 2020-01-21 2027 for (i = 0; i < ldev->caps.nb_irq; i++) { 544aa6cefb24d7 Yannick Fertre 2020-01-21 2028 irq = platform_get_irq(pdev, i); 544aa6cefb24d7 Yannick Fertre 2020-01-21 2029 if (irq < 0) { 544aa6cefb24d7 Yannick Fertre 2020-01-21 2030 ret = irq; 544aa6cefb24d7 Yannick Fertre 2020-01-21 2031 goto err; 544aa6cefb24d7 Yannick Fertre 2020-01-21 2032 } b759012c5fa761 Yannick Fertre 2017-04-14 2033 b759012c5fa761 Yannick Fertre 2017-04-14 2034 ret = devm_request_threaded_irq(dev, irq, ltdc_irq, b759012c5fa761 Yannick Fertre 2017-04-14 2035 ltdc_irq_thread, IRQF_ONESHOT, b759012c5fa761 Yannick Fertre 2017-04-14 2036 dev_name(dev), ddev); b759012c5fa761 Yannick Fertre 2017-04-14 2037 if (ret) { 1e00a12dbb09a7 Raphael Gallais-Pou 2025-08-25 2038 drm_err(ddev, "Failed to register LTDC interrupt\n"); cea3a330ee20e9 Philippe CORNU 2017-07-17 2039 goto err; b759012c5fa761 Yannick Fertre 2017-04-14 2040 } c188d7ebbebd0b Philippe CORNU 2017-10-26 2041 } b759012c5fa761 Yannick Fertre 2017-04-14 2042 19dd9780b7ac67 Katya Orlova 2024-02-16 2043 crtc = drmm_kzalloc(ddev, sizeof(*crtc), GFP_KERNEL); b759012c5fa761 Yannick Fertre 2017-04-14 2044 if (!crtc) { 1e00a12dbb09a7 Raphael Gallais-Pou 2025-08-25 2045 drm_err(ddev, "Failed to allocate crtc\n"); b759012c5fa761 Yannick Fertre 2017-04-14 2046 ret = -ENOMEM; b759012c5fa761 Yannick Fertre 2017-04-14 2047 goto err; b759012c5fa761 Yannick Fertre 2017-04-14 2048 } b759012c5fa761 Yannick Fertre 2017-04-14 2049 b759012c5fa761 Yannick Fertre 2017-04-14 2050 ret = ltdc_crtc_init(ddev, crtc); b759012c5fa761 Yannick Fertre 2017-04-14 2051 if (ret) { 1e00a12dbb09a7 Raphael Gallais-Pou 2025-08-25 2052 drm_err(ddev, "Failed to init crtc\n"); b759012c5fa761 Yannick Fertre 2017-04-14 2053 goto err; b759012c5fa761 Yannick Fertre 2017-04-14 2054 } b759012c5fa761 Yannick Fertre 2017-04-14 2055 b759012c5fa761 Yannick Fertre 2017-04-14 2056 ret = drm_vblank_init(ddev, NB_CRTC); b759012c5fa761 Yannick Fertre 2017-04-14 2057 if (ret) { 1e00a12dbb09a7 Raphael Gallais-Pou 2025-08-25 2058 drm_err(ddev, "Failed calling drm_vblank_init()\n"); b759012c5fa761 Yannick Fertre 2017-04-14 2059 goto err; b759012c5fa761 Yannick Fertre 2017-04-14 2060 } b759012c5fa761 Yannick Fertre 2017-04-14 2061 35ab6cfbf21178 Yannick Fertré 2019-06-03 2062 clk_disable_unprepare(ldev->pixel_clk); 35ab6cfbf21178 Yannick Fertré 2019-06-03 2063 d80667642b0f43 Yannick Fertre 2025-08-22 2064 if (ldev->bus_clk) d80667642b0f43 Yannick Fertre 2025-08-22 2065 clk_disable_unprepare(ldev->bus_clk); d80667642b0f43 Yannick Fertre 2025-08-22 2066 92a57b3fb500e2 Yannick Fertré 2019-09-06 2067 pinctrl_pm_select_sleep_state(ddev->dev); 92a57b3fb500e2 Yannick Fertré 2019-09-06 2068 35ab6cfbf21178 Yannick Fertré 2019-06-03 2069 pm_runtime_enable(ddev->dev); bdf31bcf3d84ef Philippe CORNU 2017-07-17 2070 35ab6cfbf21178 Yannick Fertré 2019-06-03 2071 return 0; b759012c5fa761 Yannick Fertre 2017-04-14 2072 err: b759012c5fa761 Yannick Fertre 2017-04-14 2073 clk_disable_unprepare(ldev->pixel_clk); b759012c5fa761 Yannick Fertre 2017-04-14 2074 d80667642b0f43 Yannick Fertre 2025-08-22 2075 if (ldev->bus_clk) d80667642b0f43 Yannick Fertre 2025-08-22 2076 clk_disable_unprepare(ldev->bus_clk); d80667642b0f43 Yannick Fertre 2025-08-22 2077 b759012c5fa761 Yannick Fertre 2017-04-14 @2078 return ret; b759012c5fa761 Yannick Fertre 2017-04-14 2079 } b759012c5fa761 Yannick Fertre 2017-04-14 2080 :::::: The code at line 2078 was first introduced by commit :::::: b759012c5fa761ee08998c80fc4ad6343c258487 drm/stm: Add STM32 LTDC driver :::::: TO: Yannick Fertre <[email protected]> :::::: CC: Eric Anholt <[email protected]> -- 0-DAY CI Kernel Test Service https://github.com/intel/lkp-tests/wiki