Lines Matching refs:mxsfb

40 static u32 set_hsync_pulse_width(struct mxsfb_drm_private *mxsfb, u32 val)  in set_hsync_pulse_width()  argument
42 return (val & mxsfb->devdata->hs_wdth_mask) << in set_hsync_pulse_width()
43 mxsfb->devdata->hs_wdth_shift; in set_hsync_pulse_width()
50 static void mxsfb_set_formats(struct mxsfb_drm_private *mxsfb) in mxsfb_set_formats() argument
52 struct drm_device *drm = mxsfb->drm; in mxsfb_set_formats()
53 const u32 format = mxsfb->crtc.primary->state->fb->format->format; in mxsfb_set_formats()
57 if (mxsfb->connector->display_info.num_bus_formats) in mxsfb_set_formats()
58 bus_format = mxsfb->connector->display_info.bus_formats[0]; in mxsfb_set_formats()
66 ctrl1 = readl(mxsfb->base + LCDC_CTRL1); in mxsfb_set_formats()
98 writel(ctrl1, mxsfb->base + LCDC_CTRL1); in mxsfb_set_formats()
99 writel(ctrl, mxsfb->base + LCDC_CTRL); in mxsfb_set_formats()
102 static void mxsfb_enable_controller(struct mxsfb_drm_private *mxsfb) in mxsfb_enable_controller() argument
106 if (mxsfb->clk_disp_axi) in mxsfb_enable_controller()
107 clk_prepare_enable(mxsfb->clk_disp_axi); in mxsfb_enable_controller()
108 clk_prepare_enable(mxsfb->clk); in mxsfb_enable_controller()
111 if (mxsfb->devdata->has_ctrl2) { in mxsfb_enable_controller()
112 reg = readl(mxsfb->base + LCDC_V4_CTRL2); in mxsfb_enable_controller()
115 writel(reg, mxsfb->base + LCDC_V4_CTRL2); in mxsfb_enable_controller()
119 writel(CTRL_DOTCLK_MODE, mxsfb->base + LCDC_CTRL + REG_SET); in mxsfb_enable_controller()
122 reg = readl(mxsfb->base + LCDC_VDCTRL4); in mxsfb_enable_controller()
124 writel(reg, mxsfb->base + LCDC_VDCTRL4); in mxsfb_enable_controller()
151 reg = readl(mxsfb->base + LCDC_CTRL1); in mxsfb_enable_controller()
153 writel(reg, mxsfb->base + LCDC_CTRL1); in mxsfb_enable_controller()
155 writel(CTRL_RUN, mxsfb->base + LCDC_CTRL + REG_SET); in mxsfb_enable_controller()
158 static void mxsfb_disable_controller(struct mxsfb_drm_private *mxsfb) in mxsfb_disable_controller() argument
166 writel(CTRL_DOTCLK_MODE, mxsfb->base + LCDC_CTRL + REG_CLR); in mxsfb_disable_controller()
168 readl_poll_timeout(mxsfb->base + LCDC_CTRL, reg, !(reg & CTRL_RUN), in mxsfb_disable_controller()
171 reg = readl(mxsfb->base + LCDC_VDCTRL4); in mxsfb_disable_controller()
173 writel(reg, mxsfb->base + LCDC_VDCTRL4); in mxsfb_disable_controller()
175 clk_disable_unprepare(mxsfb->clk); in mxsfb_disable_controller()
176 if (mxsfb->clk_disp_axi) in mxsfb_disable_controller()
177 clk_disable_unprepare(mxsfb->clk_disp_axi); in mxsfb_disable_controller()
193 static int mxsfb_reset_block(struct mxsfb_drm_private *mxsfb) in mxsfb_reset_block() argument
197 ret = clear_poll_bit(mxsfb->base + LCDC_CTRL, CTRL_SFTRST); in mxsfb_reset_block()
201 writel(CTRL_CLKGATE, mxsfb->base + LCDC_CTRL + REG_CLR); in mxsfb_reset_block()
203 ret = clear_poll_bit(mxsfb->base + LCDC_CTRL, CTRL_SFTRST); in mxsfb_reset_block()
207 return clear_poll_bit(mxsfb->base + LCDC_CTRL, CTRL_CLKGATE); in mxsfb_reset_block()
225 static void mxsfb_crtc_mode_set_nofb(struct mxsfb_drm_private *mxsfb) in mxsfb_crtc_mode_set_nofb() argument
227 struct drm_device *drm = mxsfb->crtc.dev; in mxsfb_crtc_mode_set_nofb()
228 struct drm_display_mode *m = &mxsfb->crtc.state->adjusted_mode; in mxsfb_crtc_mode_set_nofb()
229 u32 bus_flags = mxsfb->connector->display_info.bus_flags; in mxsfb_crtc_mode_set_nofb()
240 err = mxsfb_reset_block(mxsfb); in mxsfb_crtc_mode_set_nofb()
245 writel(CTRL1_FIFO_CLEAR, mxsfb->base + LCDC_CTRL1 + REG_SET); in mxsfb_crtc_mode_set_nofb()
246 readl(mxsfb->base + LCDC_CTRL1); in mxsfb_crtc_mode_set_nofb()
247 writel(CTRL1_FIFO_CLEAR, mxsfb->base + LCDC_CTRL1 + REG_CLR); in mxsfb_crtc_mode_set_nofb()
248 readl(mxsfb->base + LCDC_CTRL1); in mxsfb_crtc_mode_set_nofb()
250 if (mxsfb->devdata->has_overlay) in mxsfb_crtc_mode_set_nofb()
251 writel(0, mxsfb->base + LCDC_AS_CTRL); in mxsfb_crtc_mode_set_nofb()
253 mxsfb_set_formats(mxsfb); in mxsfb_crtc_mode_set_nofb()
255 clk_set_rate(mxsfb->clk, m->crtc_clock * 1000); in mxsfb_crtc_mode_set_nofb()
257 if (mxsfb->bridge && mxsfb->bridge->timings) in mxsfb_crtc_mode_set_nofb()
258 bus_flags = mxsfb->bridge->timings->input_bus_flags; in mxsfb_crtc_mode_set_nofb()
262 (int)(clk_get_rate(mxsfb->clk) / 1000)); in mxsfb_crtc_mode_set_nofb()
269 mxsfb->base + mxsfb->devdata->transfer_count); in mxsfb_crtc_mode_set_nofb()
293 writel(vdctrl0, mxsfb->base + LCDC_VDCTRL0); in mxsfb_crtc_mode_set_nofb()
296 writel(m->crtc_vtotal, mxsfb->base + LCDC_VDCTRL1); in mxsfb_crtc_mode_set_nofb()
300 writel(set_hsync_pulse_width(mxsfb, hsync_pulse_len) | in mxsfb_crtc_mode_set_nofb()
302 mxsfb->base + LCDC_VDCTRL2); in mxsfb_crtc_mode_set_nofb()
306 mxsfb->base + LCDC_VDCTRL3); in mxsfb_crtc_mode_set_nofb()
309 mxsfb->base + LCDC_VDCTRL4); in mxsfb_crtc_mode_set_nofb()
348 struct mxsfb_drm_private *mxsfb = to_mxsfb_drm_private(crtc->dev); in mxsfb_crtc_atomic_enable() local
349 struct drm_device *drm = mxsfb->drm; in mxsfb_crtc_atomic_enable()
353 mxsfb_enable_axi_clk(mxsfb); in mxsfb_crtc_atomic_enable()
357 mxsfb_crtc_mode_set_nofb(mxsfb); in mxsfb_crtc_atomic_enable()
362 writel(paddr, mxsfb->base + mxsfb->devdata->cur_buf); in mxsfb_crtc_atomic_enable()
363 writel(paddr, mxsfb->base + mxsfb->devdata->next_buf); in mxsfb_crtc_atomic_enable()
366 mxsfb_enable_controller(mxsfb); in mxsfb_crtc_atomic_enable()
372 struct mxsfb_drm_private *mxsfb = to_mxsfb_drm_private(crtc->dev); in mxsfb_crtc_atomic_disable() local
373 struct drm_device *drm = mxsfb->drm; in mxsfb_crtc_atomic_disable()
376 mxsfb_disable_controller(mxsfb); in mxsfb_crtc_atomic_disable()
388 mxsfb_disable_axi_clk(mxsfb); in mxsfb_crtc_atomic_disable()
394 struct mxsfb_drm_private *mxsfb = to_mxsfb_drm_private(crtc->dev); in mxsfb_crtc_enable_vblank() local
397 writel(CTRL1_CUR_FRAME_DONE_IRQ, mxsfb->base + LCDC_CTRL1 + REG_CLR); in mxsfb_crtc_enable_vblank()
398 writel(CTRL1_CUR_FRAME_DONE_IRQ_EN, mxsfb->base + LCDC_CTRL1 + REG_SET); in mxsfb_crtc_enable_vblank()
405 struct mxsfb_drm_private *mxsfb = to_mxsfb_drm_private(crtc->dev); in mxsfb_crtc_disable_vblank() local
408 writel(CTRL1_CUR_FRAME_DONE_IRQ_EN, mxsfb->base + LCDC_CTRL1 + REG_CLR); in mxsfb_crtc_disable_vblank()
409 writel(CTRL1_CUR_FRAME_DONE_IRQ, mxsfb->base + LCDC_CTRL1 + REG_CLR); in mxsfb_crtc_disable_vblank()
445 struct mxsfb_drm_private *mxsfb = to_mxsfb_drm_private(plane->dev); in mxsfb_plane_atomic_check() local
449 &mxsfb->crtc); in mxsfb_plane_atomic_check()
460 struct mxsfb_drm_private *mxsfb = to_mxsfb_drm_private(plane->dev); in mxsfb_plane_primary_atomic_update() local
465 writel(paddr, mxsfb->base + mxsfb->devdata->next_buf); in mxsfb_plane_primary_atomic_update()
471 struct mxsfb_drm_private *mxsfb = to_mxsfb_drm_private(plane->dev); in mxsfb_plane_overlay_atomic_update() local
478 writel(0, mxsfb->base + LCDC_AS_CTRL); in mxsfb_plane_overlay_atomic_update()
490 writel(paddr, mxsfb->base + LCDC_AS_NEXT_BUF); in mxsfb_plane_overlay_atomic_update()
497 writel(paddr, mxsfb->base + LCDC_AS_BUF); in mxsfb_plane_overlay_atomic_update()
525 writel(ctrl, mxsfb->base + LCDC_AS_CTRL); in mxsfb_plane_overlay_atomic_update()
581 int mxsfb_kms_init(struct mxsfb_drm_private *mxsfb) in mxsfb_kms_init() argument
583 struct drm_encoder *encoder = &mxsfb->encoder; in mxsfb_kms_init()
584 struct drm_crtc *crtc = &mxsfb->crtc; in mxsfb_kms_init()
587 drm_plane_helper_add(&mxsfb->planes.primary, in mxsfb_kms_init()
589 ret = drm_universal_plane_init(mxsfb->drm, &mxsfb->planes.primary, 1, in mxsfb_kms_init()
598 if (mxsfb->devdata->has_overlay) { in mxsfb_kms_init()
599 drm_plane_helper_add(&mxsfb->planes.overlay, in mxsfb_kms_init()
601 ret = drm_universal_plane_init(mxsfb->drm, in mxsfb_kms_init()
602 &mxsfb->planes.overlay, 1, in mxsfb_kms_init()
613 ret = drm_crtc_init_with_planes(mxsfb->drm, crtc, in mxsfb_kms_init()
614 &mxsfb->planes.primary, NULL, in mxsfb_kms_init()
620 return drm_encoder_init(mxsfb->drm, encoder, &mxsfb_encoder_funcs, in mxsfb_kms_init()