Lines Matching +full:simple +full:- +full:framebuffer
1 // SPDX-License-Identifier: GPL-2.0
5 * (C) ST-Ericsson SA 2013
9 * DOC: ST-Ericsson MCDE Driver
11 * The MCDE (short for multi-channel display engine) is a graphics
15 * ST-Ericsson U8500 where is was used for mass-market deployments
18 * It can do 1080p30 on SDTV CCIR656, DPI-2, DBI-2 or DSI for
25 * Memory -> Overlay -> Channel -> FIFO -> 5 formatters -> DSI/DPI
40 * one FIFO and one formatter which we connect to the simple CMA framebuffer
46 * - Enabled damaged rectangles using drm_plane_enable_fb_damage_clips()
48 * command-only display.
49 * - Enable mixing of more planes, possibly at the cost of moving away
50 * from using the simple framebuffer pipeline.
51 * - Enable output to bridges such as the AV8100 HDMI encoder from
57 #include <linux/dma-buf.h>
151 val = readl(mcde->regs + MCDE_MISERR); in mcde_irq()
156 dev_info(mcde->dev, "some error IRQ\n"); in mcde_irq()
157 writel(val, mcde->regs + MCDE_RISERR); in mcde_irq()
165 struct mcde *mcde = drm->dev_private; in mcde_modeset_init()
168 if (!mcde->bridge) { in mcde_modeset_init()
169 dev_err(drm->dev, "no display output bridge yet\n"); in mcde_modeset_init()
170 return -EPROBE_DEFER; in mcde_modeset_init()
173 mode_config = &drm->mode_config; in mcde_modeset_init()
174 mode_config->funcs = &mcde_mode_config_funcs; in mcde_modeset_init()
175 mode_config->helper_private = &mcde_mode_config_helpers; in mcde_modeset_init()
177 mode_config->min_width = 1; in mcde_modeset_init()
178 mode_config->max_width = 1920; in mcde_modeset_init()
179 mode_config->min_height = 1; in mcde_modeset_init()
180 mode_config->max_height = 1080; in mcde_modeset_init()
188 if (mcde->te_sync) { in mcde_modeset_init()
191 dev_err(drm->dev, "failed to init vblank\n"); in mcde_modeset_init()
198 dev_err(drm->dev, "failed to init display\n"); in mcde_modeset_init()
206 * we selectively connect the bridge(s) here instead of this simple in mcde_modeset_init()
209 ret = drm_simple_display_pipe_attach_bridge(&mcde->pipe, in mcde_modeset_init()
210 mcde->bridge); in mcde_modeset_init()
212 dev_err(drm->dev, "failed to attach display output bridge\n"); in mcde_modeset_init()
229 struct mcde *mcde = drm->dev_private; in mcde_release()
271 ret = component_bind_all(drm->dev, drm); in mcde_drm_bind()
288 component_unbind_all(drm->dev, drm); in mcde_drm_bind()
298 component_unbind_all(drm->dev, drm); in mcde_drm_unbind()
317 struct device *dev = &pdev->dev; in mcde_probe()
330 return -ENOMEM; in mcde_probe()
331 mcde->dev = dev; in mcde_probe()
333 ret = drm_dev_init(&mcde->drm, &mcde_drm_driver, dev); in mcde_probe()
338 drm = &mcde->drm; in mcde_probe()
339 drm->dev_private = mcde; in mcde_probe()
343 mcde->te_sync = true; in mcde_probe()
344 /* Enable continuous updates: this is what Linux' framebuffer expects */ in mcde_probe()
345 mcde->oneshot_mode = false; in mcde_probe()
346 drm->dev_private = mcde; in mcde_probe()
349 mcde->epod = devm_regulator_get(dev, "epod"); in mcde_probe()
350 if (IS_ERR(mcde->epod)) { in mcde_probe()
351 ret = PTR_ERR(mcde->epod); in mcde_probe()
355 ret = regulator_enable(mcde->epod); in mcde_probe()
360 mcde->vana = devm_regulator_get(dev, "vana"); in mcde_probe()
361 if (IS_ERR(mcde->vana)) { in mcde_probe()
362 ret = PTR_ERR(mcde->vana); in mcde_probe()
366 ret = regulator_enable(mcde->vana); in mcde_probe()
373 * the v-esram34 regulator, but we don't use that yet in mcde_probe()
377 mcde->mcde_clk = devm_clk_get(dev, "mcde"); in mcde_probe()
378 if (IS_ERR(mcde->mcde_clk)) { in mcde_probe()
380 ret = PTR_ERR(mcde->mcde_clk); in mcde_probe()
383 ret = clk_prepare_enable(mcde->mcde_clk); in mcde_probe()
388 dev_info(dev, "MCDE clk rate %lu Hz\n", clk_get_rate(mcde->mcde_clk)); in mcde_probe()
390 mcde->lcd_clk = devm_clk_get(dev, "lcd"); in mcde_probe()
391 if (IS_ERR(mcde->lcd_clk)) { in mcde_probe()
393 ret = PTR_ERR(mcde->lcd_clk); in mcde_probe()
396 mcde->hdmi_clk = devm_clk_get(dev, "hdmi"); in mcde_probe()
397 if (IS_ERR(mcde->hdmi_clk)) { in mcde_probe()
399 ret = PTR_ERR(mcde->hdmi_clk); in mcde_probe()
404 mcde->regs = devm_ioremap_resource(dev, res); in mcde_probe()
405 if (IS_ERR(mcde->regs)) { in mcde_probe()
407 ret = -EINVAL; in mcde_probe()
413 ret = -EINVAL; in mcde_probe()
429 pid = readl(mcde->regs + MCDE_PID); in mcde_probe()
441 ret = -ENODEV; in mcde_probe()
458 writel(val, mcde->regs + MCDE_CONF0); in mcde_probe()
461 val = readl(mcde->regs + MCDE_CR); in mcde_probe()
463 writel(val, mcde->regs + MCDE_CR); in mcde_probe()
467 writel(0, mcde->regs + MCDE_IMSCERR); in mcde_probe()
468 writel(0xFFFFFFFF, mcde->regs + MCDE_RISERR); in mcde_probe()
475 struct device_driver *drv = &mcde_component_drivers[i]->driver; in mcde_probe()
487 return -ENODEV; in mcde_probe()
494 ret = component_master_add_with_match(&pdev->dev, &mcde_drm_comp_ops, in mcde_probe()
503 clk_disable_unprepare(mcde->mcde_clk); in mcde_probe()
505 regulator_disable(mcde->vana); in mcde_probe()
507 regulator_disable(mcde->epod); in mcde_probe()
517 struct mcde *mcde = drm->dev_private; in mcde_remove()
519 component_master_del(&pdev->dev, &mcde_drm_comp_ops); in mcde_remove()
520 clk_disable_unprepare(mcde->mcde_clk); in mcde_remove()
521 regulator_disable(mcde->vana); in mcde_remove()
522 regulator_disable(mcde->epod); in mcde_remove()
570 MODULE_ALIAS("platform:mcde-drm");