Lines Matching +full:dc +full:- +full:id
1 // SPDX-License-Identifier: GPL-2.0-only
6 * Author: Jean-Jacques Hiblot <jjhiblot@traphandler.com>
7 * Author: Boris BREZILLON <boris.brezillon@free-electrons.com>
11 #include <linux/media-bus-format.h>
12 #include <linux/mfd/atmel-hlcdc.h>
29 * struct atmel_hlcdc_crtc_state - Atmel HLCDC CRTC state structure
48 * struct atmel_hlcdc_crtc - Atmel HLCDC CRTC structure
51 * @dc: pointer to the atmel_hlcdc structure provided by the MFD device
53 * @id: CRTC id (returned by drm_crtc_index)
57 struct atmel_hlcdc_dc *dc; member
59 int id; member
71 struct regmap *regmap = crtc->dc->hlcdc->regmap; in atmel_hlcdc_crtc_mode_set_nofb()
72 struct drm_display_mode *adj = &c->state->adjusted_mode; in atmel_hlcdc_crtc_mode_set_nofb()
76 struct drm_device *ddev = c->dev; in atmel_hlcdc_crtc_mode_set_nofb()
87 if (en_iter->crtc == c) { in atmel_hlcdc_crtc_mode_set_nofb()
97 if (connector->encoder == encoder) in atmel_hlcdc_crtc_mode_set_nofb()
102 ret = clk_prepare_enable(crtc->dc->hlcdc->sys_clk); in atmel_hlcdc_crtc_mode_set_nofb()
106 vm.vfront_porch = adj->crtc_vsync_start - adj->crtc_vdisplay; in atmel_hlcdc_crtc_mode_set_nofb()
107 vm.vback_porch = adj->crtc_vtotal - adj->crtc_vsync_end; in atmel_hlcdc_crtc_mode_set_nofb()
108 vm.vsync_len = adj->crtc_vsync_end - adj->crtc_vsync_start; in atmel_hlcdc_crtc_mode_set_nofb()
109 vm.hfront_porch = adj->crtc_hsync_start - adj->crtc_hdisplay; in atmel_hlcdc_crtc_mode_set_nofb()
110 vm.hback_porch = adj->crtc_htotal - adj->crtc_hsync_end; in atmel_hlcdc_crtc_mode_set_nofb()
111 vm.hsync_len = adj->crtc_hsync_end - adj->crtc_hsync_start; in atmel_hlcdc_crtc_mode_set_nofb()
114 (vm.hsync_len - 1) | ((vm.vsync_len - 1) << 16)); in atmel_hlcdc_crtc_mode_set_nofb()
117 (vm.vfront_porch - 1) | (vm.vback_porch << 16)); in atmel_hlcdc_crtc_mode_set_nofb()
120 (vm.hfront_porch - 1) | ((vm.hback_porch - 1) << 16)); in atmel_hlcdc_crtc_mode_set_nofb()
123 (adj->crtc_hdisplay - 1) | in atmel_hlcdc_crtc_mode_set_nofb()
124 ((adj->crtc_vdisplay - 1) << 16)); in atmel_hlcdc_crtc_mode_set_nofb()
126 prate = clk_get_rate(crtc->dc->hlcdc->sys_clk); in atmel_hlcdc_crtc_mode_set_nofb()
127 mode_rate = adj->crtc_clock * 1000; in atmel_hlcdc_crtc_mode_set_nofb()
128 if (!crtc->dc->desc->fixed_clksrc) { in atmel_hlcdc_crtc_mode_set_nofb()
148 (10 * (prate / div_low - mode_rate) < in atmel_hlcdc_crtc_mode_set_nofb()
149 (mode_rate - prate / div))) in atmel_hlcdc_crtc_mode_set_nofb()
161 connector->display_info.bus_flags & DRM_BUS_FLAG_PIXDATA_DRIVE_NEGEDGE) in atmel_hlcdc_crtc_mode_set_nofb()
166 state = drm_crtc_state_to_atmel_hlcdc_crtc_state(c->state); in atmel_hlcdc_crtc_mode_set_nofb()
167 cfg = state->output_mode << 8; in atmel_hlcdc_crtc_mode_set_nofb()
169 if (!crtc->dc->desc->is_xlcdc) { in atmel_hlcdc_crtc_mode_set_nofb()
170 if (adj->flags & DRM_MODE_FLAG_NVSYNC) in atmel_hlcdc_crtc_mode_set_nofb()
173 if (adj->flags & DRM_MODE_FLAG_NHSYNC) in atmel_hlcdc_crtc_mode_set_nofb()
176 cfg |= state->dpi << 11; in atmel_hlcdc_crtc_mode_set_nofb()
185 (crtc->dc->desc->is_xlcdc ? ATMEL_XLCDC_MODE_MASK | in atmel_hlcdc_crtc_mode_set_nofb()
189 clk_disable_unprepare(crtc->dc->hlcdc->sys_clk); in atmel_hlcdc_crtc_mode_set_nofb()
198 return atmel_hlcdc_dc_mode_valid(crtc->dc, mode); in atmel_hlcdc_crtc_mode_valid()
204 struct drm_device *dev = c->dev; in atmel_hlcdc_crtc_atomic_disable()
206 struct regmap *regmap = crtc->dc->hlcdc->regmap; in atmel_hlcdc_crtc_atomic_disable()
211 pm_runtime_get_sync(dev->dev); in atmel_hlcdc_crtc_atomic_disable()
213 if (crtc->dc->desc->is_xlcdc) { in atmel_hlcdc_crtc_atomic_disable()
218 dev_warn(dev->dev, "Atmel LCDC status register CMSTS timeout\n"); in atmel_hlcdc_crtc_atomic_disable()
224 dev_warn(dev->dev, "Atmel LCDC status register SDSTS timeout\n"); in atmel_hlcdc_crtc_atomic_disable()
231 dev_warn(dev->dev, "Atmel LCDC status register DISPSTS timeout\n"); in atmel_hlcdc_crtc_atomic_disable()
237 dev_warn(dev->dev, "Atmel LCDC status register LCDSTS timeout\n"); in atmel_hlcdc_crtc_atomic_disable()
243 dev_warn(dev->dev, "Atmel LCDC status register CLKSTS timeout\n"); in atmel_hlcdc_crtc_atomic_disable()
245 clk_disable_unprepare(crtc->dc->hlcdc->sys_clk); in atmel_hlcdc_crtc_atomic_disable()
246 pinctrl_pm_select_sleep_state(dev->dev); in atmel_hlcdc_crtc_atomic_disable()
248 pm_runtime_allow(dev->dev); in atmel_hlcdc_crtc_atomic_disable()
250 pm_runtime_put_sync(dev->dev); in atmel_hlcdc_crtc_atomic_disable()
256 struct drm_device *dev = c->dev; in atmel_hlcdc_crtc_atomic_enable()
258 struct regmap *regmap = crtc->dc->hlcdc->regmap; in atmel_hlcdc_crtc_atomic_enable()
261 pm_runtime_get_sync(dev->dev); in atmel_hlcdc_crtc_atomic_enable()
263 pm_runtime_forbid(dev->dev); in atmel_hlcdc_crtc_atomic_enable()
265 pinctrl_pm_select_default_state(dev->dev); in atmel_hlcdc_crtc_atomic_enable()
266 clk_prepare_enable(crtc->dc->hlcdc->sys_clk); in atmel_hlcdc_crtc_atomic_enable()
272 dev_warn(dev->dev, "Atmel LCDC status register CLKSTS timeout\n"); in atmel_hlcdc_crtc_atomic_enable()
278 dev_warn(dev->dev, "Atmel LCDC status register LCDSTS timeout\n"); in atmel_hlcdc_crtc_atomic_enable()
284 dev_warn(dev->dev, "Atmel LCDC status register DISPSTS timeout\n"); in atmel_hlcdc_crtc_atomic_enable()
286 if (crtc->dc->desc->is_xlcdc) { in atmel_hlcdc_crtc_atomic_enable()
291 dev_warn(dev->dev, "Atmel LCDC status register CMSTS timeout\n"); in atmel_hlcdc_crtc_atomic_enable()
297 dev_warn(dev->dev, "Atmel LCDC status register SDSTS timeout\n"); in atmel_hlcdc_crtc_atomic_enable()
300 pm_runtime_put_sync(dev->dev); in atmel_hlcdc_crtc_atomic_enable()
335 return -EINVAL; in atmel_xlcdc_connector_output_dsi()
338 for (j = 0; j < info->num_bus_formats; j++) { in atmel_xlcdc_connector_output_dsi()
339 switch (info->bus_formats[j]) { in atmel_xlcdc_connector_output_dsi()
361 struct drm_connector *connector = state->connector; in atmel_hlcdc_connector_output_mode()
362 struct drm_display_info *info = &connector->display_info; in atmel_hlcdc_connector_output_mode()
367 encoder = state->best_encoder; in atmel_hlcdc_connector_output_mode()
369 encoder = connector->encoder; in atmel_hlcdc_connector_output_mode()
371 * atmel-hlcdc to support DSI formats with DSI video pipeline in atmel_hlcdc_connector_output_mode()
375 if (encoder->encoder_type == DRM_MODE_ENCODER_DSI) in atmel_hlcdc_connector_output_mode()
390 return -EINVAL; in atmel_hlcdc_connector_output_mode()
393 for (j = 0; j < info->num_bus_formats; j++) { in atmel_hlcdc_connector_output_mode()
394 switch (info->bus_formats[j]) { in atmel_hlcdc_connector_output_mode()
424 crtc = drm_crtc_to_atmel_hlcdc_crtc(state->crtc); in atmel_hlcdc_crtc_select_output_mode()
425 output_fmts = crtc->dc->desc->is_xlcdc ? ATMEL_XLCDC_OUTPUT_MODE_MASK : in atmel_hlcdc_crtc_select_output_mode()
428 for_each_new_connector_in_state(state->state, connector, cstate, i) { in atmel_hlcdc_crtc_select_output_mode()
431 if (!cstate->crtc) in atmel_hlcdc_crtc_select_output_mode()
436 if (crtc->dc->desc->conflicting_output_formats) in atmel_hlcdc_crtc_select_output_mode()
443 return -EINVAL; in atmel_hlcdc_crtc_select_output_mode()
446 hstate->output_mode = fls(output_fmts) - 1; in atmel_hlcdc_crtc_select_output_mode()
447 if (crtc->dc->desc->is_xlcdc) { in atmel_hlcdc_crtc_select_output_mode()
450 hstate->output_mode -= 4; in atmel_hlcdc_crtc_select_output_mode()
451 hstate->dpi = 1; in atmel_hlcdc_crtc_select_output_mode()
453 hstate->dpi = 0; in atmel_hlcdc_crtc_select_output_mode()
488 spin_lock_irqsave(&c->dev->event_lock, flags); in atmel_hlcdc_crtc_atomic_flush()
490 if (c->state->event) { in atmel_hlcdc_crtc_atomic_flush()
491 c->state->event->pipe = drm_crtc_index(c); in atmel_hlcdc_crtc_atomic_flush()
495 crtc->event = c->state->event; in atmel_hlcdc_crtc_atomic_flush()
496 c->state->event = NULL; in atmel_hlcdc_crtc_atomic_flush()
498 spin_unlock_irqrestore(&c->dev->event_lock, flags); in atmel_hlcdc_crtc_atomic_flush()
521 struct drm_device *dev = crtc->base.dev; in atmel_hlcdc_crtc_finish_page_flip()
524 spin_lock_irqsave(&dev->event_lock, flags); in atmel_hlcdc_crtc_finish_page_flip()
525 if (crtc->event) { in atmel_hlcdc_crtc_finish_page_flip()
526 drm_crtc_send_vblank_event(&crtc->base, crtc->event); in atmel_hlcdc_crtc_finish_page_flip()
527 drm_crtc_vblank_put(&crtc->base); in atmel_hlcdc_crtc_finish_page_flip()
528 crtc->event = NULL; in atmel_hlcdc_crtc_finish_page_flip()
530 spin_unlock_irqrestore(&dev->event_lock, flags); in atmel_hlcdc_crtc_finish_page_flip()
543 if (crtc->state) { in atmel_hlcdc_crtc_reset()
544 __drm_atomic_helper_crtc_destroy_state(crtc->state); in atmel_hlcdc_crtc_reset()
545 state = drm_crtc_state_to_atmel_hlcdc_crtc_state(crtc->state); in atmel_hlcdc_crtc_reset()
547 crtc->state = NULL; in atmel_hlcdc_crtc_reset()
552 __drm_atomic_helper_crtc_reset(crtc, &state->base); in atmel_hlcdc_crtc_reset()
561 if (WARN_ON(!crtc->state)) in atmel_hlcdc_crtc_duplicate_state()
567 __drm_atomic_helper_crtc_duplicate_state(crtc, &state->base); in atmel_hlcdc_crtc_duplicate_state()
569 cur = drm_crtc_state_to_atmel_hlcdc_crtc_state(crtc->state); in atmel_hlcdc_crtc_duplicate_state()
570 state->output_mode = cur->output_mode; in atmel_hlcdc_crtc_duplicate_state()
571 if (c->dc->desc->is_xlcdc) in atmel_hlcdc_crtc_duplicate_state()
572 state->dpi = cur->dpi; in atmel_hlcdc_crtc_duplicate_state()
574 return &state->base; in atmel_hlcdc_crtc_duplicate_state()
590 struct regmap *regmap = crtc->dc->hlcdc->regmap; in atmel_hlcdc_crtc_enable_vblank()
601 struct regmap *regmap = crtc->dc->hlcdc->regmap; in atmel_hlcdc_crtc_disable_vblank()
620 struct atmel_hlcdc_dc *dc = dev->dev_private; in atmel_hlcdc_crtc_create() local
627 return -ENOMEM; in atmel_hlcdc_crtc_create()
629 crtc->dc = dc; in atmel_hlcdc_crtc_create()
632 if (!dc->layers[i]) in atmel_hlcdc_crtc_create()
635 switch (dc->layers[i]->desc->type) { in atmel_hlcdc_crtc_create()
637 primary = atmel_hlcdc_layer_to_plane(dc->layers[i]); in atmel_hlcdc_crtc_create()
641 cursor = atmel_hlcdc_layer_to_plane(dc->layers[i]); in atmel_hlcdc_crtc_create()
649 ret = drm_crtc_init_with_planes(dev, &crtc->base, &primary->base, in atmel_hlcdc_crtc_create()
650 &cursor->base, &atmel_hlcdc_crtc_funcs, in atmel_hlcdc_crtc_create()
655 crtc->id = drm_crtc_index(&crtc->base); in atmel_hlcdc_crtc_create()
660 if (dc->layers[i] && in atmel_hlcdc_crtc_create()
661 dc->layers[i]->desc->type == ATMEL_HLCDC_OVERLAY_LAYER) { in atmel_hlcdc_crtc_create()
662 overlay = atmel_hlcdc_layer_to_plane(dc->layers[i]); in atmel_hlcdc_crtc_create()
663 overlay->base.possible_crtcs = 1 << crtc->id; in atmel_hlcdc_crtc_create()
667 drm_crtc_helper_add(&crtc->base, &lcdc_crtc_helper_funcs); in atmel_hlcdc_crtc_create()
669 drm_mode_crtc_set_gamma_size(&crtc->base, ATMEL_HLCDC_CLUT_SIZE); in atmel_hlcdc_crtc_create()
670 drm_crtc_enable_color_mgmt(&crtc->base, 0, false, in atmel_hlcdc_crtc_create()
673 dc->crtc = &crtc->base; in atmel_hlcdc_crtc_create()
678 atmel_hlcdc_crtc_destroy(&crtc->base); in atmel_hlcdc_crtc_create()