Lines Matching +full:bcm2835 +full:- +full:hdmi

1 // SPDX-License-Identifier: GPL-2.0-only
13 * PAL and PAL-M or NTSC and NTSC-J.
177 #define VEC_READ(offset) readl(vec->regs + (offset))
178 #define VEC_WRITE(offset, val) writel(val, vec->regs + (offset))
273 struct drm_connector_state *state = connector->state; in vc4_vec_connector_get_modes()
276 mode = drm_mode_duplicate(connector->dev, in vc4_vec_connector_get_modes()
277 vc4_vec_tv_modes[state->tv.mode].mode); in vc4_vec_connector_get_modes()
280 return -ENOMEM; in vc4_vec_connector_get_modes()
302 struct drm_connector *connector = &vec->connector; in vc4_vec_connector_init()
305 connector->interlace_allowed = true; in vc4_vec_connector_init()
314 drm_object_attach_property(&connector->base, in vc4_vec_connector_init()
315 dev->mode_config.tv_mode_property, in vc4_vec_connector_init()
318 drm_connector_attach_encoder(connector, &vec->encoder.base); in vc4_vec_connector_init()
326 struct drm_device *drm = encoder->dev; in vc4_vec_encoder_disable()
340 clk_disable_unprepare(vec->clock); in vc4_vec_encoder_disable()
342 ret = pm_runtime_put(&vec->pdev->dev); in vc4_vec_encoder_disable()
358 struct drm_device *drm = encoder->dev; in vc4_vec_encoder_enable()
360 struct drm_connector *connector = &vec->connector; in vc4_vec_encoder_enable()
364 &vc4_vec_tv_modes[conn_state->tv.mode]; in vc4_vec_encoder_enable()
370 ret = pm_runtime_get_sync(&vec->pdev->dev); in vc4_vec_encoder_enable()
378 * because there's a chance we share the same parent with the HDMI in vc4_vec_encoder_enable()
383 ret = clk_set_rate(vec->clock, 108000000); in vc4_vec_encoder_enable()
389 ret = clk_prepare_enable(vec->clock); in vc4_vec_encoder_enable()
399 /* Disable the CGSM-A and WSE blocks */ in vc4_vec_encoder_enable()
418 VEC_WRITE(VEC_DAC_CONFIG, vec->variant->dac_config); in vc4_vec_encoder_enable()
423 VEC_WRITE(VEC_CONFIG0, tv_mode->config0); in vc4_vec_encoder_enable()
424 VEC_WRITE(VEC_CONFIG1, tv_mode->config1); in vc4_vec_encoder_enable()
426 if (tv_mode->custom_freq) { in vc4_vec_encoder_enable()
428 (tv_mode->custom_freq >> 16) & 0xffff); in vc4_vec_encoder_enable()
430 tv_mode->custom_freq & 0xffff); in vc4_vec_encoder_enable()
441 pm_runtime_put(&vec->pdev->dev); in vc4_vec_encoder_enable()
452 vec_mode = &vc4_vec_tv_modes[conn_state->tv.mode]; in vc4_vec_encoder_atomic_check()
454 if (conn_state->crtc && in vc4_vec_encoder_atomic_check()
455 !drm_mode_equal(vec_mode->mode, &crtc_state->adjusted_mode)) in vc4_vec_encoder_atomic_check()
456 return -EINVAL; in vc4_vec_encoder_atomic_check()
469 struct drm_device *drm = encoder->dev; in vc4_vec_late_register()
473 ret = vc4_debugfs_add_regset32(drm->primary, "vec_regs", in vc4_vec_late_register()
474 &vec->regset); in vc4_vec_late_register()
498 { .compatible = "brcm,bcm2835-vec", .data = &bcm2835_vec_variant },
499 { .compatible = "brcm,bcm2711-vec", .data = &bcm2711_vec_variant },
505 [VC4_VEC_TV_MODE_NTSC_J] = "NTSC-J",
507 [VC4_VEC_TV_MODE_PAL_M] = "PAL-M",
524 return -ENOMEM; in vc4_vec_bind()
526 vec->encoder.type = VC4_ENCODER_TYPE_VEC; in vc4_vec_bind()
527 vec->pdev = pdev; in vc4_vec_bind()
528 vec->variant = (const struct vc4_vec_variant *) in vc4_vec_bind()
530 vec->regs = vc4_ioremap_regs(pdev, 0); in vc4_vec_bind()
531 if (IS_ERR(vec->regs)) in vc4_vec_bind()
532 return PTR_ERR(vec->regs); in vc4_vec_bind()
533 vec->regset.base = vec->regs; in vc4_vec_bind()
534 vec->regset.regs = vec_regs; in vc4_vec_bind()
535 vec->regset.nregs = ARRAY_SIZE(vec_regs); in vc4_vec_bind()
537 vec->clock = devm_clk_get(dev, NULL); in vc4_vec_bind()
538 if (IS_ERR(vec->clock)) { in vc4_vec_bind()
539 ret = PTR_ERR(vec->clock); in vc4_vec_bind()
540 if (ret != -EPROBE_DEFER) in vc4_vec_bind()
549 ret = drmm_encoder_init(drm, &vec->encoder.base, in vc4_vec_bind()
556 drm_encoder_helper_add(&vec->encoder.base, &vc4_vec_encoder_helper_funcs); in vc4_vec_bind()
573 return component_add(&pdev->dev, &vc4_vec_ops); in vc4_vec_dev_probe()
578 component_del(&pdev->dev, &vc4_vec_ops); in vc4_vec_dev_remove()