Lines Matching refs:mxsfb

41 static u32 set_hsync_pulse_width(struct mxsfb_drm_private *mxsfb, u32 val)  in set_hsync_pulse_width()  argument
43 return (val & mxsfb->devdata->hs_wdth_mask) << in set_hsync_pulse_width()
44 mxsfb->devdata->hs_wdth_shift; in set_hsync_pulse_width()
51 static void mxsfb_set_formats(struct mxsfb_drm_private *mxsfb, in mxsfb_set_formats() argument
54 struct drm_device *drm = mxsfb->drm; in mxsfb_set_formats()
55 const u32 format = mxsfb->crtc.primary->state->fb->format->format; in mxsfb_set_formats()
64 ctrl1 = readl(mxsfb->base + LCDC_CTRL1); in mxsfb_set_formats()
96 writel(ctrl1, mxsfb->base + LCDC_CTRL1); in mxsfb_set_formats()
97 writel(ctrl, mxsfb->base + LCDC_CTRL); in mxsfb_set_formats()
100 static void mxsfb_set_mode(struct mxsfb_drm_private *mxsfb, u32 bus_flags) in mxsfb_set_mode() argument
102 struct drm_display_mode *m = &mxsfb->crtc.state->adjusted_mode; in mxsfb_set_mode()
107 mxsfb->base + mxsfb->devdata->transfer_count); in mxsfb_set_mode()
131 writel(vdctrl0, mxsfb->base + LCDC_VDCTRL0); in mxsfb_set_mode()
134 writel(m->crtc_vtotal, mxsfb->base + LCDC_VDCTRL1); in mxsfb_set_mode()
138 writel(set_hsync_pulse_width(mxsfb, hsync_pulse_len) | in mxsfb_set_mode()
140 mxsfb->base + LCDC_VDCTRL2); in mxsfb_set_mode()
144 mxsfb->base + LCDC_VDCTRL3); in mxsfb_set_mode()
147 mxsfb->base + LCDC_VDCTRL4); in mxsfb_set_mode()
151 static void mxsfb_enable_controller(struct mxsfb_drm_private *mxsfb) in mxsfb_enable_controller() argument
155 if (mxsfb->clk_disp_axi) in mxsfb_enable_controller()
156 clk_prepare_enable(mxsfb->clk_disp_axi); in mxsfb_enable_controller()
157 clk_prepare_enable(mxsfb->clk); in mxsfb_enable_controller()
160 if (mxsfb->devdata->has_ctrl2) { in mxsfb_enable_controller()
161 reg = readl(mxsfb->base + LCDC_V4_CTRL2); in mxsfb_enable_controller()
164 writel(reg, mxsfb->base + LCDC_V4_CTRL2); in mxsfb_enable_controller()
168 writel(CTRL_DOTCLK_MODE, mxsfb->base + LCDC_CTRL + REG_SET); in mxsfb_enable_controller()
171 reg = readl(mxsfb->base + LCDC_VDCTRL4); in mxsfb_enable_controller()
173 writel(reg, mxsfb->base + LCDC_VDCTRL4); in mxsfb_enable_controller()
200 reg = readl(mxsfb->base + LCDC_CTRL1); in mxsfb_enable_controller()
202 writel(reg, mxsfb->base + LCDC_CTRL1); in mxsfb_enable_controller()
204 writel(CTRL_RUN, mxsfb->base + LCDC_CTRL + REG_SET); in mxsfb_enable_controller()
207 static void mxsfb_disable_controller(struct mxsfb_drm_private *mxsfb) in mxsfb_disable_controller() argument
215 writel(CTRL_DOTCLK_MODE, mxsfb->base + LCDC_CTRL + REG_CLR); in mxsfb_disable_controller()
217 readl_poll_timeout(mxsfb->base + LCDC_CTRL, reg, !(reg & CTRL_RUN), in mxsfb_disable_controller()
220 reg = readl(mxsfb->base + LCDC_VDCTRL4); in mxsfb_disable_controller()
222 writel(reg, mxsfb->base + LCDC_VDCTRL4); in mxsfb_disable_controller()
224 clk_disable_unprepare(mxsfb->clk); in mxsfb_disable_controller()
225 if (mxsfb->clk_disp_axi) in mxsfb_disable_controller()
226 clk_disable_unprepare(mxsfb->clk_disp_axi); in mxsfb_disable_controller()
242 static int mxsfb_reset_block(struct mxsfb_drm_private *mxsfb) in mxsfb_reset_block() argument
252 ret = clear_poll_bit(mxsfb->base + LCDC_CTRL, CTRL_SFTRST); in mxsfb_reset_block()
256 writel(CTRL_CLKGATE, mxsfb->base + LCDC_CTRL + REG_CLR); in mxsfb_reset_block()
258 ret = clear_poll_bit(mxsfb->base + LCDC_CTRL, CTRL_SFTRST); in mxsfb_reset_block()
262 ret = clear_poll_bit(mxsfb->base + LCDC_CTRL, CTRL_CLKGATE); in mxsfb_reset_block()
267 writel(CTRL1_FIFO_CLEAR, mxsfb->base + LCDC_CTRL1 + REG_SET); in mxsfb_reset_block()
268 readl(mxsfb->base + LCDC_CTRL1); in mxsfb_reset_block()
269 writel(CTRL1_FIFO_CLEAR, mxsfb->base + LCDC_CTRL1 + REG_CLR); in mxsfb_reset_block()
270 readl(mxsfb->base + LCDC_CTRL1); in mxsfb_reset_block()
272 if (mxsfb->devdata->has_overlay) in mxsfb_reset_block()
273 writel(0, mxsfb->base + LCDC_AS_CTRL); in mxsfb_reset_block()
278 static void mxsfb_crtc_mode_set_nofb(struct mxsfb_drm_private *mxsfb, in mxsfb_crtc_mode_set_nofb() argument
282 struct drm_device *drm = mxsfb->crtc.dev; in mxsfb_crtc_mode_set_nofb()
283 struct drm_display_mode *m = &mxsfb->crtc.state->adjusted_mode; in mxsfb_crtc_mode_set_nofb()
284 u32 bus_flags = mxsfb->connector->display_info.bus_flags; in mxsfb_crtc_mode_set_nofb()
287 if (mxsfb->bridge && mxsfb->bridge->timings) in mxsfb_crtc_mode_set_nofb()
288 bus_flags = mxsfb->bridge->timings->input_bus_flags; in mxsfb_crtc_mode_set_nofb()
294 (int)(clk_get_rate(mxsfb->clk) / 1000)); in mxsfb_crtc_mode_set_nofb()
300 err = mxsfb_reset_block(mxsfb); in mxsfb_crtc_mode_set_nofb()
304 mxsfb_set_formats(mxsfb, bus_format); in mxsfb_crtc_mode_set_nofb()
306 clk_set_rate(mxsfb->clk, m->crtc_clock * 1000); in mxsfb_crtc_mode_set_nofb()
308 mxsfb_set_mode(mxsfb, bus_flags); in mxsfb_crtc_mode_set_nofb()
349 struct mxsfb_drm_private *mxsfb = to_mxsfb_drm_private(crtc->dev); in mxsfb_crtc_atomic_enable() local
353 struct drm_device *drm = mxsfb->drm; in mxsfb_crtc_atomic_enable()
358 mxsfb_enable_axi_clk(mxsfb); in mxsfb_crtc_atomic_enable()
363 if (mxsfb->bridge) { in mxsfb_crtc_atomic_enable()
366 mxsfb->bridge); in mxsfb_crtc_atomic_enable()
381 if (!bus_format && mxsfb->connector->display_info.num_bus_formats) in mxsfb_crtc_atomic_enable()
382 bus_format = mxsfb->connector->display_info.bus_formats[0]; in mxsfb_crtc_atomic_enable()
388 mxsfb_crtc_mode_set_nofb(mxsfb, bridge_state, bus_format); in mxsfb_crtc_atomic_enable()
393 writel(dma_addr, mxsfb->base + mxsfb->devdata->cur_buf); in mxsfb_crtc_atomic_enable()
394 writel(dma_addr, mxsfb->base + mxsfb->devdata->next_buf); in mxsfb_crtc_atomic_enable()
397 mxsfb_enable_controller(mxsfb); in mxsfb_crtc_atomic_enable()
403 struct mxsfb_drm_private *mxsfb = to_mxsfb_drm_private(crtc->dev); in mxsfb_crtc_atomic_disable() local
404 struct drm_device *drm = mxsfb->drm; in mxsfb_crtc_atomic_disable()
407 mxsfb_disable_controller(mxsfb); in mxsfb_crtc_atomic_disable()
419 mxsfb_disable_axi_clk(mxsfb); in mxsfb_crtc_atomic_disable()
425 struct mxsfb_drm_private *mxsfb = to_mxsfb_drm_private(crtc->dev); in mxsfb_crtc_enable_vblank() local
428 writel(CTRL1_CUR_FRAME_DONE_IRQ, mxsfb->base + LCDC_CTRL1 + REG_CLR); in mxsfb_crtc_enable_vblank()
429 writel(CTRL1_CUR_FRAME_DONE_IRQ_EN, mxsfb->base + LCDC_CTRL1 + REG_SET); in mxsfb_crtc_enable_vblank()
436 struct mxsfb_drm_private *mxsfb = to_mxsfb_drm_private(crtc->dev); in mxsfb_crtc_disable_vblank() local
439 writel(CTRL1_CUR_FRAME_DONE_IRQ_EN, mxsfb->base + LCDC_CTRL1 + REG_CLR); in mxsfb_crtc_disable_vblank()
440 writel(CTRL1_CUR_FRAME_DONE_IRQ, mxsfb->base + LCDC_CTRL1 + REG_CLR); in mxsfb_crtc_disable_vblank()
445 struct mxsfb_drm_private *mxsfb; in mxsfb_crtc_set_crc_source() local
450 mxsfb = to_mxsfb_drm_private(crtc->dev); in mxsfb_crtc_set_crc_source()
453 mxsfb->crc_active = true; in mxsfb_crtc_set_crc_source()
455 mxsfb->crc_active = false; in mxsfb_crtc_set_crc_source()
526 struct mxsfb_drm_private *mxsfb = to_mxsfb_drm_private(plane->dev); in mxsfb_plane_atomic_check() local
530 &mxsfb->crtc); in mxsfb_plane_atomic_check()
541 struct mxsfb_drm_private *mxsfb = to_mxsfb_drm_private(plane->dev); in mxsfb_plane_primary_atomic_update() local
548 writel(dma_addr, mxsfb->base + mxsfb->devdata->next_buf); in mxsfb_plane_primary_atomic_update()
556 struct mxsfb_drm_private *mxsfb = to_mxsfb_drm_private(plane->dev); in mxsfb_plane_overlay_atomic_update() local
564 writel(0, mxsfb->base + LCDC_AS_CTRL); in mxsfb_plane_overlay_atomic_update()
576 writel(dma_addr, mxsfb->base + LCDC_AS_NEXT_BUF); in mxsfb_plane_overlay_atomic_update()
583 writel(dma_addr, mxsfb->base + LCDC_AS_BUF); in mxsfb_plane_overlay_atomic_update()
611 writel(ctrl, mxsfb->base + LCDC_AS_CTRL); in mxsfb_plane_overlay_atomic_update()
665 int mxsfb_kms_init(struct mxsfb_drm_private *mxsfb) in mxsfb_kms_init() argument
667 struct drm_encoder *encoder = &mxsfb->encoder; in mxsfb_kms_init()
668 struct drm_crtc *crtc = &mxsfb->crtc; in mxsfb_kms_init()
671 drm_plane_helper_add(&mxsfb->planes.primary, in mxsfb_kms_init()
673 ret = drm_universal_plane_init(mxsfb->drm, &mxsfb->planes.primary, 1, in mxsfb_kms_init()
682 if (mxsfb->devdata->has_overlay) { in mxsfb_kms_init()
683 drm_plane_helper_add(&mxsfb->planes.overlay, in mxsfb_kms_init()
685 ret = drm_universal_plane_init(mxsfb->drm, in mxsfb_kms_init()
686 &mxsfb->planes.overlay, 1, in mxsfb_kms_init()
697 if (mxsfb->devdata->has_crc32) { in mxsfb_kms_init()
698 ret = drm_crtc_init_with_planes(mxsfb->drm, crtc, in mxsfb_kms_init()
699 &mxsfb->planes.primary, NULL, in mxsfb_kms_init()
703 ret = drm_crtc_init_with_planes(mxsfb->drm, crtc, in mxsfb_kms_init()
704 &mxsfb->planes.primary, NULL, in mxsfb_kms_init()
711 return drm_encoder_init(mxsfb->drm, encoder, &mxsfb_encoder_funcs, in mxsfb_kms_init()