lcdif
clks[lcdif] = mxs_clk_gate("lcdif", "lcdif_div", PIX, 31);
clks[lcdif] = mxs_clk_gate("lcdif", "lcdif_div", LCDIF, 31);
struct lcdif_drm_private *lcdif = drm->dev_private;
stat = readl(lcdif->base + LCDC_V8_INT_STATUS_D0);
reg = readl(lcdif->base + LCDC_V8_CTRLDESCL0_5);
drm_crtc_handle_vblank(&lcdif->crtc);
writel(stat, lcdif->base + LCDC_V8_INT_STATUS_D0);
struct lcdif_drm_private *lcdif;
lcdif = devm_kzalloc(&pdev->dev, sizeof(*lcdif), GFP_KERNEL);
if (!lcdif)
lcdif->drm = drm;
drm->dev_private = lcdif;
lcdif->base = devm_platform_ioremap_resource(pdev, 0);
if (IS_ERR(lcdif->base))
return PTR_ERR(lcdif->base);
lcdif->clk = devm_clk_get(drm->dev, "pix");
if (IS_ERR(lcdif->clk))
return dev_err_probe(drm->dev, PTR_ERR(lcdif->clk), "Failed to get pix clock\n");
lcdif->clk_axi = devm_clk_get(drm->dev, "axi");
if (IS_ERR(lcdif->clk_axi))
return dev_err_probe(drm->dev, PTR_ERR(lcdif->clk_axi),
lcdif->clk_disp_axi = devm_clk_get(drm->dev, "disp_axi");
if (IS_ERR(lcdif->clk_disp_axi))
return dev_err_probe(drm->dev, PTR_ERR(lcdif->clk_disp_axi),
ret = lcdif_kms_init(lcdif);
drm_crtc_vblank_off(&lcdif->crtc);
ret = lcdif_attach_bridge(lcdif);
lcdif->irq = ret;
ret = devm_request_irq(drm->dev, lcdif->irq, lcdif_irq_handler, 0,
struct lcdif_drm_private *lcdif = drm->dev_private;
drm_crtc_vblank_off(&lcdif->crtc);
struct lcdif_drm_private *lcdif = drm->dev_private;
clk_disable_unprepare(lcdif->clk);
clk_disable_unprepare(lcdif->clk_disp_axi);
clk_disable_unprepare(lcdif->clk_axi);
struct lcdif_drm_private *lcdif = drm->dev_private;
clk_prepare_enable(lcdif->clk_axi);
clk_prepare_enable(lcdif->clk_disp_axi);
clk_prepare_enable(lcdif->clk);
static int lcdif_attach_bridge(struct lcdif_drm_private *lcdif)
struct device *dev = lcdif->drm->dev;
encoder->possible_crtcs = drm_crtc_mask(&lcdif->crtc);
ret = drm_encoder_init(lcdif->drm, encoder, &lcdif_encoder_funcs,
connector = drm_bridge_connector_init(lcdif->drm, encoder);
int lcdif_kms_init(struct lcdif_drm_private *lcdif);
static void lcdif_set_formats(struct lcdif_drm_private *lcdif,
struct drm_device *drm = lcdif->drm;
lcdif->base + LCDC_V8_DISP_PARA);
lcdif->base + LCDC_V8_DISP_PARA);
lcdif->base + LCDC_V8_DISP_PARA);
lcdif->base + LCDC_V8_CTRLDESCL0_5);
lcdif->base + LCDC_V8_CTRLDESCL0_5);
lcdif->base + LCDC_V8_CTRLDESCL0_5);
lcdif->base + LCDC_V8_CTRLDESCL0_5);
lcdif->base + LCDC_V8_CTRLDESCL0_5);
lcdif->base + LCDC_V8_CTRLDESCL0_5);
lcdif->base + LCDC_V8_CTRLDESCL0_5);
lcdif->base + LCDC_V8_CTRLDESCL0_5);
lcdif->base + LCDC_V8_CTRLDESCL0_5);
lcdif->base + LCDC_V8_CTRLDESCL0_5);
lcdif->base + LCDC_V8_CSC0_CTRL);
lcdif->base + LCDC_V8_CSC0_COEF0);
lcdif->base + LCDC_V8_CSC0_COEF1);
lcdif->base + LCDC_V8_CSC0_COEF2);
lcdif->base + LCDC_V8_CSC0_COEF3);
lcdif->base + LCDC_V8_CSC0_COEF4);
lcdif->base + LCDC_V8_CSC0_COEF5);
lcdif->base + LCDC_V8_CSC0_CTRL);
writel(coeffs[0], lcdif->base + LCDC_V8_CSC0_COEF0);
writel(coeffs[1], lcdif->base + LCDC_V8_CSC0_COEF1);
writel(coeffs[2], lcdif->base + LCDC_V8_CSC0_COEF2);
writel(coeffs[3], lcdif->base + LCDC_V8_CSC0_COEF3);
writel(coeffs[4], lcdif->base + LCDC_V8_CSC0_COEF4);
writel(coeffs[5], lcdif->base + LCDC_V8_CSC0_COEF5);
writel(CSC0_CTRL_BYPASS, lcdif->base + LCDC_V8_CSC0_CTRL);
static void lcdif_set_mode(struct lcdif_drm_private *lcdif, u32 bus_flags)
struct drm_display_mode *m = &lcdif->crtc.state->adjusted_mode;
writel(ctrl, lcdif->base + LCDC_V8_CTRL);
lcdif->base + LCDC_V8_DISP_SIZE);
lcdif->base + LCDC_V8_HSYN_PARA);
lcdif->base + LCDC_V8_VSYN_PARA);
lcdif->base + LCDC_V8_VSYN_HSYN_WIDTH);
lcdif->base + LCDC_V8_CTRLDESCL0_1);
CTRLDESCL0_3_PITCH(lcdif->crtc.primary->state->fb->pitches[0]);
writel(ctrl, lcdif->base + LCDC_V8_CTRLDESCL0_3);
static void lcdif_enable_controller(struct lcdif_drm_private *lcdif)
lcdif->base + LCDC_V8_PANIC0_THRES);
lcdif->base + LCDC_V8_INT_ENABLE_D1);
reg = readl(lcdif->base + LCDC_V8_DISP_PARA);
writel(reg, lcdif->base + LCDC_V8_DISP_PARA);
reg = readl(lcdif->base + LCDC_V8_CTRLDESCL0_5);
writel(reg, lcdif->base + LCDC_V8_CTRLDESCL0_5);
static void lcdif_disable_controller(struct lcdif_drm_private *lcdif)
reg = readl(lcdif->base + LCDC_V8_CTRLDESCL0_5);
writel(reg, lcdif->base + LCDC_V8_CTRLDESCL0_5);
ret = readl_poll_timeout(lcdif->base + LCDC_V8_CTRLDESCL0_5,
drm_err(lcdif->drm, "Failed to disable controller!\n");
reg = readl(lcdif->base + LCDC_V8_DISP_PARA);
writel(reg, lcdif->base + LCDC_V8_DISP_PARA);
writel(0, lcdif->base + LCDC_V8_INT_ENABLE_D1);
static void lcdif_reset_block(struct lcdif_drm_private *lcdif)
writel(CTRL_SW_RESET, lcdif->base + LCDC_V8_CTRL + REG_SET);
readl(lcdif->base + LCDC_V8_CTRL);
writel(CTRL_SW_RESET, lcdif->base + LCDC_V8_CTRL + REG_CLR);
readl(lcdif->base + LCDC_V8_CTRL);
struct lcdif_drm_private *lcdif = to_lcdif_drm_private(drm);
m->clock, (int)(clk_get_rate(lcdif->clk) / 1000));
lcdif_reset_block(lcdif);
lcdif_set_formats(lcdif, plane_state, lcdif_crtc_state->bus_format);
lcdif_set_mode(lcdif, lcdif_crtc_state->bus_flags);
struct lcdif_drm_private *lcdif = to_lcdif_drm_private(crtc->dev);
reg = readl(lcdif->base + LCDC_V8_CTRLDESCL0_5);
writel(reg, lcdif->base + LCDC_V8_CTRLDESCL0_5);
struct lcdif_drm_private *lcdif = to_lcdif_drm_private(crtc->dev);
struct drm_display_mode *m = &lcdif->crtc.state->adjusted_mode;
struct drm_device *drm = lcdif->drm;
clk_set_rate(lcdif->clk, m->clock * 1000);
lcdif->base + LCDC_V8_CTRLDESCL_LOW0_4);
lcdif->base + LCDC_V8_CTRLDESCL_HIGH0_4);
lcdif_enable_controller(lcdif);
struct lcdif_drm_private *lcdif = to_lcdif_drm_private(crtc->dev);
struct drm_device *drm = lcdif->drm;
lcdif_disable_controller(lcdif);
struct lcdif_drm_private *lcdif = to_lcdif_drm_private(crtc->dev);
writel(INT_STATUS_D0_VS_BLANK, lcdif->base + LCDC_V8_INT_STATUS_D0);
writel(INT_ENABLE_D0_VS_BLANK_EN, lcdif->base + LCDC_V8_INT_ENABLE_D0);
struct lcdif_drm_private *lcdif = to_lcdif_drm_private(crtc->dev);
writel(0, lcdif->base + LCDC_V8_INT_ENABLE_D0);
writel(INT_STATUS_D0_VS_BLANK, lcdif->base + LCDC_V8_INT_STATUS_D0);
struct lcdif_drm_private *lcdif = to_lcdif_drm_private(plane->dev);
&lcdif->crtc);
struct lcdif_drm_private *lcdif = to_lcdif_drm_private(plane->dev);
lcdif->base + LCDC_V8_CTRLDESCL_LOW0_4);
lcdif->base + LCDC_V8_CTRLDESCL_HIGH0_4);
int lcdif_kms_init(struct lcdif_drm_private *lcdif)
struct drm_crtc *crtc = &lcdif->crtc;
drm_plane_helper_add(&lcdif->planes.primary,
ret = drm_universal_plane_init(lcdif->drm, &lcdif->planes.primary, 1,
ret = drm_plane_create_color_properties(&lcdif->planes.primary,
return drm_crtc_init_with_planes(lcdif->drm, crtc,
&lcdif->planes.primary, NULL,