Lines Matching +full:lcdif +full:- +full:pix

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)
50 struct device *dev = lcdif->drm->dev;
55 for_each_endpoint_of_node(dev->of_node, ep) {
74 bridge = devm_drm_of_get_bridge(dev, dev->of_node, 0, of_ep.id);
87 return -ENOMEM;
90 encoder->possible_crtcs = drm_crtc_mask(&lcdif->crtc);
91 ret = drm_encoder_init(lcdif->drm, encoder, &lcdif_encoder_funcs,
115 struct lcdif_drm_private *lcdif = drm->dev_private;
118 stat = readl(lcdif->base + LCDC_V8_INT_STATUS_D0);
123 reg = readl(lcdif->base + LCDC_V8_CTRLDESCL0_5);
125 drm_crtc_handle_vblank(&lcdif->crtc);
128 writel(stat, lcdif->base + LCDC_V8_INT_STATUS_D0);
135 struct platform_device *pdev = to_platform_device(drm->dev);
136 struct lcdif_drm_private *lcdif;
139 lcdif = devm_kzalloc(&pdev->dev, sizeof(*lcdif), GFP_KERNEL);
140 if (!lcdif)
141 return -ENOMEM;
143 lcdif->drm = drm;
144 drm->dev_private = lcdif;
146 lcdif->base = devm_platform_ioremap_resource(pdev, 0);
147 if (IS_ERR(lcdif->base))
148 return PTR_ERR(lcdif->base);
150 lcdif->clk = devm_clk_get(drm->dev, "pix");
151 if (IS_ERR(lcdif->clk))
152 return PTR_ERR(lcdif->clk);
154 lcdif->clk_axi = devm_clk_get(drm->dev, "axi");
155 if (IS_ERR(lcdif->clk_axi))
156 return PTR_ERR(lcdif->clk_axi);
158 lcdif->clk_disp_axi = devm_clk_get(drm->dev, "disp_axi");
159 if (IS_ERR(lcdif->clk_disp_axi))
160 return PTR_ERR(lcdif->clk_disp_axi);
164 ret = dma_set_mask_and_coherent(drm->dev, DMA_BIT_MASK(36));
171 dev_err(drm->dev, "Failed to initialize mode config\n");
175 ret = lcdif_kms_init(lcdif);
177 dev_err(drm->dev, "Failed to initialize KMS pipeline\n");
181 ret = drm_vblank_init(drm, drm->mode_config.num_crtc);
183 dev_err(drm->dev, "Failed to initialise vblank\n");
188 drm_crtc_vblank_off(&lcdif->crtc);
190 ret = lcdif_attach_bridge(lcdif);
192 return dev_err_probe(drm->dev, ret, "Cannot connect bridge\n");
194 drm->mode_config.min_width = LCDIF_MIN_XRES;
195 drm->mode_config.min_height = LCDIF_MIN_YRES;
196 drm->mode_config.max_width = LCDIF_MAX_XRES;
197 drm->mode_config.max_height = LCDIF_MAX_YRES;
198 drm->mode_config.funcs = &lcdif_mode_config_funcs;
199 drm->mode_config.helper_private = &lcdif_mode_config_helpers;
206 lcdif->irq = ret;
208 ret = devm_request_irq(drm->dev, lcdif->irq, lcdif_irq_handler, 0,
209 drm->driver->name, drm);
211 dev_err(drm->dev, "Failed to install IRQ handler\n");
219 pm_runtime_enable(drm->dev);
226 struct lcdif_drm_private *lcdif = drm->dev_private;
228 pm_runtime_get_sync(drm->dev);
230 drm_crtc_vblank_off(&lcdif->crtc);
234 pm_runtime_put_sync(drm->dev);
235 pm_runtime_disable(drm->dev);
237 drm->dev_private = NULL;
247 .name = "imx-lcdif",
248 .desc = "i.MX LCDIF Controller DRM",
254 { .compatible = "fsl,imx8mp-lcdif" },
255 { .compatible = "fsl,imx93-lcdif" },
265 drm = drm_dev_alloc(&lcdif_driver, &pdev->dev);
309 struct lcdif_drm_private *lcdif = drm->dev_private;
312 clk_disable_unprepare(lcdif->clk);
314 clk_disable_unprepare(lcdif->clk_disp_axi);
316 clk_disable_unprepare(lcdif->clk_axi);
324 struct lcdif_drm_private *lcdif = drm->dev_private;
327 clk_prepare_enable(lcdif->clk_axi);
329 clk_prepare_enable(lcdif->clk_disp_axi);
331 clk_prepare_enable(lcdif->clk);
371 .name = "imx-lcdif",
380 MODULE_DESCRIPTION("Freescale LCDIF DRM/KMS driver");