Lines Matching +full:lcdif +full:- +full:apb
1 // SPDX-License-Identifier: GPL-2.0-or-later
9 #include <linux/dma-mapping.h>
48 static int lcdif_attach_bridge(struct lcdif_drm_private *lcdif) in lcdif_attach_bridge() argument
50 struct device *dev = lcdif->drm->dev; in lcdif_attach_bridge()
55 for_each_endpoint_of_node(dev->of_node, ep) { in lcdif_attach_bridge()
74 bridge = devm_drm_of_get_bridge(dev, dev->of_node, 0, of_ep.id); in lcdif_attach_bridge()
87 return -ENOMEM; in lcdif_attach_bridge()
90 encoder->possible_crtcs = drm_crtc_mask(&lcdif->crtc); in lcdif_attach_bridge()
91 ret = drm_encoder_init(lcdif->drm, encoder, &lcdif_encoder_funcs, in lcdif_attach_bridge()
115 struct lcdif_drm_private *lcdif = drm->dev_private; in lcdif_irq_handler() local
118 stat = readl(lcdif->base + LCDC_V8_INT_STATUS_D0); in lcdif_irq_handler()
123 reg = readl(lcdif->base + LCDC_V8_CTRLDESCL0_5); in lcdif_irq_handler()
125 drm_crtc_handle_vblank(&lcdif->crtc); in lcdif_irq_handler()
128 writel(stat, lcdif->base + LCDC_V8_INT_STATUS_D0); in lcdif_irq_handler()
135 struct platform_device *pdev = to_platform_device(drm->dev); in lcdif_load()
136 struct lcdif_drm_private *lcdif; in lcdif_load() local
140 lcdif = devm_kzalloc(&pdev->dev, sizeof(*lcdif), GFP_KERNEL); in lcdif_load()
141 if (!lcdif) in lcdif_load()
142 return -ENOMEM; in lcdif_load()
144 lcdif->drm = drm; in lcdif_load()
145 drm->dev_private = lcdif; in lcdif_load()
148 lcdif->base = devm_ioremap_resource(drm->dev, res); in lcdif_load()
149 if (IS_ERR(lcdif->base)) in lcdif_load()
150 return PTR_ERR(lcdif->base); in lcdif_load()
152 lcdif->clk = devm_clk_get(drm->dev, "pix"); in lcdif_load()
153 if (IS_ERR(lcdif->clk)) in lcdif_load()
154 return PTR_ERR(lcdif->clk); in lcdif_load()
156 lcdif->clk_axi = devm_clk_get(drm->dev, "axi"); in lcdif_load()
157 if (IS_ERR(lcdif->clk_axi)) in lcdif_load()
158 return PTR_ERR(lcdif->clk_axi); in lcdif_load()
160 lcdif->clk_disp_axi = devm_clk_get(drm->dev, "disp_axi"); in lcdif_load()
161 if (IS_ERR(lcdif->clk_disp_axi)) in lcdif_load()
162 return PTR_ERR(lcdif->clk_disp_axi); in lcdif_load()
166 ret = dma_set_mask_and_coherent(drm->dev, DMA_BIT_MASK(36)); in lcdif_load()
173 dev_err(drm->dev, "Failed to initialize mode config\n"); in lcdif_load()
177 ret = lcdif_kms_init(lcdif); in lcdif_load()
179 dev_err(drm->dev, "Failed to initialize KMS pipeline\n"); in lcdif_load()
183 ret = drm_vblank_init(drm, drm->mode_config.num_crtc); in lcdif_load()
185 dev_err(drm->dev, "Failed to initialise vblank\n"); in lcdif_load()
190 drm_crtc_vblank_off(&lcdif->crtc); in lcdif_load()
192 ret = lcdif_attach_bridge(lcdif); in lcdif_load()
194 return dev_err_probe(drm->dev, ret, "Cannot connect bridge\n"); in lcdif_load()
196 drm->mode_config.min_width = LCDIF_MIN_XRES; in lcdif_load()
197 drm->mode_config.min_height = LCDIF_MIN_YRES; in lcdif_load()
198 drm->mode_config.max_width = LCDIF_MAX_XRES; in lcdif_load()
199 drm->mode_config.max_height = LCDIF_MAX_YRES; in lcdif_load()
200 drm->mode_config.funcs = &lcdif_mode_config_funcs; in lcdif_load()
201 drm->mode_config.helper_private = &lcdif_mode_config_helpers; in lcdif_load()
208 lcdif->irq = ret; in lcdif_load()
210 ret = devm_request_irq(drm->dev, lcdif->irq, lcdif_irq_handler, 0, in lcdif_load()
211 drm->driver->name, drm); in lcdif_load()
213 dev_err(drm->dev, "Failed to install IRQ handler\n"); in lcdif_load()
221 pm_runtime_enable(drm->dev); in lcdif_load()
228 struct lcdif_drm_private *lcdif = drm->dev_private; in lcdif_unload() local
230 pm_runtime_get_sync(drm->dev); in lcdif_unload()
232 drm_crtc_vblank_off(&lcdif->crtc); in lcdif_unload()
236 pm_runtime_put_sync(drm->dev); in lcdif_unload()
237 pm_runtime_disable(drm->dev); in lcdif_unload()
239 drm->dev_private = NULL; in lcdif_unload()
249 .name = "imx-lcdif",
250 .desc = "i.MX LCDIF Controller DRM",
256 { .compatible = "fsl,imx8mp-lcdif" },
257 { .compatible = "fsl,imx93-lcdif" },
267 drm = drm_dev_alloc(&lcdif_driver, &pdev->dev); in lcdif_probe()
311 struct lcdif_drm_private *lcdif = drm->dev_private; in lcdif_rpm_suspend() local
314 clk_disable_unprepare(lcdif->clk); in lcdif_rpm_suspend()
316 clk_disable_unprepare(lcdif->clk_disp_axi); in lcdif_rpm_suspend()
317 /* These clock supply the Control Bus, APB, APBH Ctrl Registers */ in lcdif_rpm_suspend()
318 clk_disable_unprepare(lcdif->clk_axi); in lcdif_rpm_suspend()
326 struct lcdif_drm_private *lcdif = drm->dev_private; in lcdif_rpm_resume() local
328 /* These clock supply the Control Bus, APB, APBH Ctrl Registers */ in lcdif_rpm_resume()
329 clk_prepare_enable(lcdif->clk_axi); in lcdif_rpm_resume()
331 clk_prepare_enable(lcdif->clk_disp_axi); in lcdif_rpm_resume()
333 clk_prepare_enable(lcdif->clk); in lcdif_rpm_resume()
373 .name = "imx-lcdif",
382 MODULE_DESCRIPTION("Freescale LCDIF DRM/KMS driver");