Lines Matching +full:panel +full:- +full:timing
1 // SPDX-License-Identifier: GPL-2.0
57 struct awg_timing *timing);
79 * @panel_node: panel node reference from device tree
80 * @panel: reference to the panel connected to the dvo
94 struct drm_panel *panel; member
113 struct drm_display_mode *mode = &dvo->mode; in dvo_awg_generate_code()
114 struct dvo_config *config = dvo->config; in dvo_awg_generate_code()
116 struct awg_timing timing; in dvo_awg_generate_code() local
121 timing.total_lines = mode->vtotal; in dvo_awg_generate_code()
122 timing.active_lines = mode->vdisplay; in dvo_awg_generate_code()
123 timing.blanking_lines = mode->vsync_start - mode->vdisplay; in dvo_awg_generate_code()
124 timing.trailing_lines = mode->vtotal - mode->vsync_start; in dvo_awg_generate_code()
125 timing.total_pixels = mode->htotal; in dvo_awg_generate_code()
126 timing.active_pixels = mode->hdisplay; in dvo_awg_generate_code()
127 timing.blanking_pixels = mode->hsync_start - mode->hdisplay; in dvo_awg_generate_code()
128 timing.trailing_pixels = mode->htotal - mode->hsync_start; in dvo_awg_generate_code()
129 timing.blanking_level = BLANKING_LEVEL; in dvo_awg_generate_code()
131 if (config->awg_fwgen_fct(&fw_gen_params, &timing)) { in dvo_awg_generate_code()
133 return -EINVAL; in dvo_awg_generate_code()
155 dvo->regs + DVO_DIGSYNC_INSTR_I + i * 4); in dvo_awg_configure()
157 writel(0, dvo->regs + DVO_DIGSYNC_INSTR_I + i * 4); in dvo_awg_configure()
159 writel(DVO_AWG_CTRL_EN, dvo->regs + DVO_AWG_DIGSYNC_CTRL); in dvo_awg_configure()
162 #define DBGFS_DUMP(reg) seq_printf(s, "\n %-25s 0x%08X", #reg, \
163 readl(dvo->regs + reg))
180 struct drm_info_node *node = s->private; in dvo_dbg_show()
181 struct sti_dvo *dvo = (struct sti_dvo *)node->info_ent->data; in dvo_dbg_show()
183 seq_printf(s, "DVO: (vaddr = 0x%p)", dvo->regs); in dvo_dbg_show()
189 dvo_dbg_awg_microcode(s, dvo->regs + DVO_DIGSYNC_INSTR_I); in dvo_dbg_show()
207 minor->debugfs_root, minor); in dvo_debugfs_init()
212 struct sti_dvo *dvo = bridge->driver_private; in sti_dvo_disable()
214 if (!dvo->enabled) in sti_dvo_disable()
219 if (dvo->config->awg_fwgen_fct) in sti_dvo_disable()
220 writel(0x00000000, dvo->regs + DVO_AWG_DIGSYNC_CTRL); in sti_dvo_disable()
222 writel(0x00000000, dvo->regs + DVO_DOF_CFG); in sti_dvo_disable()
224 drm_panel_disable(dvo->panel); in sti_dvo_disable()
227 clk_disable_unprepare(dvo->clk_pix); in sti_dvo_disable()
228 clk_disable_unprepare(dvo->clk); in sti_dvo_disable()
230 dvo->enabled = false; in sti_dvo_disable()
235 struct sti_dvo *dvo = bridge->driver_private; in sti_dvo_pre_enable()
236 struct dvo_config *config = dvo->config; in sti_dvo_pre_enable()
241 if (dvo->enabled) in sti_dvo_pre_enable()
245 writel(0x00000000, dvo->regs + DVO_DOF_CFG); in sti_dvo_pre_enable()
246 writel(0x00000000, dvo->regs + DVO_AWG_DIGSYNC_CTRL); in sti_dvo_pre_enable()
248 if (config->awg_fwgen_fct) { in sti_dvo_pre_enable()
259 if (clk_prepare_enable(dvo->clk_pix)) in sti_dvo_pre_enable()
261 if (clk_prepare_enable(dvo->clk)) in sti_dvo_pre_enable()
264 drm_panel_enable(dvo->panel); in sti_dvo_pre_enable()
267 writel(config->lowbyte, dvo->regs + DVO_LUT_PROG_LOW); in sti_dvo_pre_enable()
268 writel(config->midbyte, dvo->regs + DVO_LUT_PROG_MID); in sti_dvo_pre_enable()
269 writel(config->highbyte, dvo->regs + DVO_LUT_PROG_HIGH); in sti_dvo_pre_enable()
272 val = (config->flags | DVO_DOF_EN); in sti_dvo_pre_enable()
273 writel(val, dvo->regs + DVO_DOF_CFG); in sti_dvo_pre_enable()
275 dvo->enabled = true; in sti_dvo_pre_enable()
282 struct sti_dvo *dvo = bridge->driver_private; in sti_dvo_set_mode()
283 struct sti_mixer *mixer = to_sti_mixer(dvo->encoder->crtc); in sti_dvo_set_mode()
284 int rate = mode->clock * 1000; in sti_dvo_set_mode()
290 memcpy(&dvo->mode, mode, sizeof(struct drm_display_mode)); in sti_dvo_set_mode()
294 if (mixer->id == STI_MIXER_MAIN) in sti_dvo_set_mode()
295 clkp = dvo->clk_main_parent; in sti_dvo_set_mode()
297 clkp = dvo->clk_aux_parent; in sti_dvo_set_mode()
300 clk_set_parent(dvo->clk_pix, clkp); in sti_dvo_set_mode()
301 clk_set_parent(dvo->clk, clkp); in sti_dvo_set_mode()
305 ret = clk_set_rate(dvo->clk_pix, rate); in sti_dvo_set_mode()
311 ret = clk_set_rate(dvo->clk, rate); in sti_dvo_set_mode()
318 dvo->config = &rgb_24bit_de_cfg; in sti_dvo_set_mode()
338 struct sti_dvo *dvo = dvo_connector->dvo; in sti_dvo_connector_get_modes()
340 if (dvo->panel) in sti_dvo_connector_get_modes()
341 return drm_panel_get_modes(dvo->panel); in sti_dvo_connector_get_modes()
351 int target = mode->clock * 1000; in sti_dvo_connector_mode_valid()
352 int target_min = target - CLK_TOLERANCE_HZ; in sti_dvo_connector_mode_valid()
357 struct sti_dvo *dvo = dvo_connector->dvo; in sti_dvo_connector_mode_valid()
359 result = clk_round_rate(dvo->clk_pix, target); in sti_dvo_connector_mode_valid()
383 struct sti_dvo *dvo = dvo_connector->dvo; in sti_dvo_connector_detect()
387 if (!dvo->panel) { in sti_dvo_connector_detect()
388 dvo->panel = of_drm_find_panel(dvo->panel_node); in sti_dvo_connector_detect()
389 if (IS_ERR(dvo->panel)) in sti_dvo_connector_detect()
390 dvo->panel = NULL; in sti_dvo_connector_detect()
392 drm_panel_attach(dvo->panel, connector); in sti_dvo_connector_detect()
395 if (dvo->panel) in sti_dvo_connector_detect()
405 struct sti_dvo *dvo = dvo_connector->dvo; in sti_dvo_late_register()
407 if (dvo_debugfs_init(dvo, dvo->drm_dev->primary)) { in sti_dvo_late_register()
409 return -EINVAL; in sti_dvo_late_register()
429 list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) { in sti_dvo_find_encoder()
430 if (encoder->encoder_type == DRM_MODE_ENCODER_LVDS) in sti_dvo_find_encoder()
448 dvo->drm_dev = drm_dev; in sti_dvo_bind()
452 return -ENOMEM; in sti_dvo_bind()
456 return -ENOMEM; in sti_dvo_bind()
458 connector->dvo = dvo; in sti_dvo_bind()
462 return -ENOMEM; in sti_dvo_bind()
464 bridge->driver_private = dvo; in sti_dvo_bind()
465 bridge->funcs = &sti_dvo_bridge_funcs; in sti_dvo_bind()
466 bridge->of_node = dvo->dev.of_node; in sti_dvo_bind()
475 dvo->bridge = bridge; in sti_dvo_bind()
476 connector->encoder = encoder; in sti_dvo_bind()
477 dvo->encoder = encoder; in sti_dvo_bind()
481 drm_connector->polled = DRM_CONNECTOR_POLL_HPD; in sti_dvo_bind()
498 return -EINVAL; in sti_dvo_bind()
506 drm_bridge_remove(dvo->bridge); in sti_dvo_unbind()
516 struct device *dev = &pdev->dev; in sti_dvo_probe()
519 struct device_node *np = dev->of_node; in sti_dvo_probe()
526 return -ENOMEM; in sti_dvo_probe()
529 dvo->dev = pdev->dev; in sti_dvo_probe()
531 res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "dvo-reg"); in sti_dvo_probe()
534 return -ENOMEM; in sti_dvo_probe()
536 dvo->regs = devm_ioremap_nocache(dev, res->start, in sti_dvo_probe()
538 if (!dvo->regs) in sti_dvo_probe()
539 return -ENOMEM; in sti_dvo_probe()
541 dvo->clk_pix = devm_clk_get(dev, "dvo_pix"); in sti_dvo_probe()
542 if (IS_ERR(dvo->clk_pix)) { in sti_dvo_probe()
544 return PTR_ERR(dvo->clk_pix); in sti_dvo_probe()
547 dvo->clk = devm_clk_get(dev, "dvo"); in sti_dvo_probe()
548 if (IS_ERR(dvo->clk)) { in sti_dvo_probe()
550 return PTR_ERR(dvo->clk); in sti_dvo_probe()
553 dvo->clk_main_parent = devm_clk_get(dev, "main_parent"); in sti_dvo_probe()
554 if (IS_ERR(dvo->clk_main_parent)) { in sti_dvo_probe()
556 dvo->clk_main_parent = NULL; in sti_dvo_probe()
559 dvo->clk_aux_parent = devm_clk_get(dev, "aux_parent"); in sti_dvo_probe()
560 if (IS_ERR(dvo->clk_aux_parent)) { in sti_dvo_probe()
562 dvo->clk_aux_parent = NULL; in sti_dvo_probe()
565 dvo->panel_node = of_parse_phandle(np, "sti,panel", 0); in sti_dvo_probe()
566 if (!dvo->panel_node) in sti_dvo_probe()
567 DRM_ERROR("No panel associated to the dvo output\n"); in sti_dvo_probe()
568 of_node_put(dvo->panel_node); in sti_dvo_probe()
572 return component_add(&pdev->dev, &sti_dvo_ops); in sti_dvo_probe()
577 component_del(&pdev->dev, &sti_dvo_ops); in sti_dvo_remove()
582 { .compatible = "st,stih407-dvo", },
589 .name = "sti-dvo",