[PATCH v4 58/78] drm/vc4: hdmi: Move CEC init to its own function
Dave Stevenson
dave.stevenson at raspberrypi.com
Tue Jul 28 13:23:17 UTC 2020
Hi Maxime
On Wed, 8 Jul 2020 at 18:43, Maxime Ripard <maxime at cerno.tech> wrote:
>
> The CEC init code was put directly into the bind function, which was quite
> inconsistent with how the audio support was done, and would prevent us from
> further changes to skip that initialisation entirely.
>
> Signed-off-by: Maxime Ripard <maxime at cerno.tech>
Reviewed-by: Dave Stevenson <dave.stevenson at raspberrypi.com>
> ---
> drivers/gpu/drm/vc4/vc4_hdmi.c | 108 +++++++++++++++++++++-------------
> 1 file changed, 67 insertions(+), 41 deletions(-)
>
> diff --git a/drivers/gpu/drm/vc4/vc4_hdmi.c b/drivers/gpu/drm/vc4/vc4_hdmi.c
> index ef51eedaf75a..8cd08b541c14 100644
> --- a/drivers/gpu/drm/vc4/vc4_hdmi.c
> +++ b/drivers/gpu/drm/vc4/vc4_hdmi.c
> @@ -1171,6 +1171,67 @@ static const struct cec_adap_ops vc4_hdmi_cec_adap_ops = {
> .adap_log_addr = vc4_hdmi_cec_adap_log_addr,
> .adap_transmit = vc4_hdmi_cec_adap_transmit,
> };
> +
> +static int vc4_hdmi_cec_init(struct vc4_hdmi *vc4_hdmi)
> +{
> + struct cec_connector_info conn_info;
> + struct platform_device *pdev = vc4_hdmi->pdev;
> + u32 value;
> + int ret;
> +
> + vc4_hdmi->cec_adap = cec_allocate_adapter(&vc4_hdmi_cec_adap_ops,
> + vc4_hdmi, "vc4",
> + CEC_CAP_DEFAULTS |
> + CEC_CAP_CONNECTOR_INFO, 1);
> + ret = PTR_ERR_OR_ZERO(vc4_hdmi->cec_adap);
> + if (ret < 0)
> + return ret;
> +
> + cec_fill_conn_info_from_drm(&conn_info, &vc4_hdmi->connector);
> + cec_s_conn_info(vc4_hdmi->cec_adap, &conn_info);
> +
> + HDMI_WRITE(HDMI_CEC_CPU_MASK_SET, 0xffffffff);
> + value = HDMI_READ(HDMI_CEC_CNTRL_1);
> + value &= ~VC4_HDMI_CEC_DIV_CLK_CNT_MASK;
> + /*
> + * Set the logical address to Unregistered and set the clock
> + * divider: the hsm_clock rate and this divider setting will
> + * give a 40 kHz CEC clock.
> + */
> + value |= VC4_HDMI_CEC_ADDR_MASK |
> + (4091 << VC4_HDMI_CEC_DIV_CLK_CNT_SHIFT);
> + HDMI_WRITE(HDMI_CEC_CNTRL_1, value);
> + ret = devm_request_threaded_irq(&pdev->dev, platform_get_irq(pdev, 0),
> + vc4_cec_irq_handler,
> + vc4_cec_irq_handler_thread, 0,
> + "vc4 hdmi cec", vc4_hdmi);
> + if (ret)
> + goto err_delete_cec_adap;
> +
> + ret = cec_register_adapter(vc4_hdmi->cec_adap, &pdev->dev);
> + if (ret < 0)
> + goto err_delete_cec_adap;
> +
> + return 0;
> +
> +err_delete_cec_adap:
> + cec_delete_adapter(vc4_hdmi->cec_adap);
> +
> + return ret;
> +}
> +
> +static void vc4_hdmi_cec_exit(struct vc4_hdmi *vc4_hdmi)
> +{
> + cec_unregister_adapter(vc4_hdmi->cec_adap);
> +}
> +#else
> +static int vc4_hdmi_cec_init(struct vc4_hdmi *vc4_hdmi)
> +{
> + return 0;
> +}
> +
> +static void vc4_hdmi_cec_exit(struct vc4_hdmi *vc4_hdmi) {};
> +
> #endif
>
> static int vc4_hdmi_build_regset(struct vc4_hdmi *vc4_hdmi,
> @@ -1250,9 +1311,6 @@ static int vc4_hdmi_init_resources(struct vc4_hdmi *vc4_hdmi)
>
> static int vc4_hdmi_bind(struct device *dev, struct device *master, void *data)
> {
> -#ifdef CONFIG_DRM_VC4_HDMI_CEC
> - struct cec_connector_info conn_info;
> -#endif
> const struct vc4_hdmi_variant *variant = of_device_get_match_data(dev);
> struct platform_device *pdev = to_platform_device(dev);
> struct drm_device *drm = dev_get_drvdata(master);
> @@ -1332,43 +1390,13 @@ static int vc4_hdmi_bind(struct device *dev, struct device *master, void *data)
> if (ret)
> goto err_destroy_encoder;
>
> -#ifdef CONFIG_DRM_VC4_HDMI_CEC
> - vc4_hdmi->cec_adap = cec_allocate_adapter(&vc4_hdmi_cec_adap_ops,
> - vc4_hdmi, "vc4",
> - CEC_CAP_DEFAULTS |
> - CEC_CAP_CONNECTOR_INFO, 1);
> - ret = PTR_ERR_OR_ZERO(vc4_hdmi->cec_adap);
> - if (ret < 0)
> - goto err_destroy_conn;
> -
> - cec_fill_conn_info_from_drm(&conn_info, &vc4_hdmi->connector);
> - cec_s_conn_info(vc4_hdmi->cec_adap, &conn_info);
> -
> - HDMI_WRITE(HDMI_CEC_CPU_MASK_SET, 0xffffffff);
> - value = HDMI_READ(HDMI_CEC_CNTRL_1);
> - value &= ~VC4_HDMI_CEC_DIV_CLK_CNT_MASK;
> - /*
> - * Set the logical address to Unregistered and set the clock
> - * divider: the hsm_clock rate and this divider setting will
> - * give a 40 kHz CEC clock.
> - */
> - value |= VC4_HDMI_CEC_ADDR_MASK |
> - (4091 << VC4_HDMI_CEC_DIV_CLK_CNT_SHIFT);
> - HDMI_WRITE(HDMI_CEC_CNTRL_1, value);
> - ret = devm_request_threaded_irq(dev, platform_get_irq(pdev, 0),
> - vc4_cec_irq_handler,
> - vc4_cec_irq_handler_thread, 0,
> - "vc4 hdmi cec", vc4_hdmi);
> + ret = vc4_hdmi_cec_init(vc4_hdmi);
> if (ret)
> - goto err_delete_cec_adap;
> - ret = cec_register_adapter(vc4_hdmi->cec_adap, dev);
> - if (ret < 0)
> - goto err_delete_cec_adap;
> -#endif
> + goto err_destroy_conn;
>
> ret = vc4_hdmi_audio_init(vc4_hdmi);
> if (ret)
> - goto err_destroy_encoder;
> + goto err_free_cec;
>
> vc4_debugfs_add_file(drm, variant->debugfs_name,
> vc4_hdmi_debugfs_regs,
> @@ -1376,12 +1404,10 @@ static int vc4_hdmi_bind(struct device *dev, struct device *master, void *data)
>
> return 0;
>
> -#ifdef CONFIG_DRM_VC4_HDMI_CEC
> -err_delete_cec_adap:
> - cec_delete_adapter(vc4_hdmi->cec_adap);
> +err_free_cec:
> + vc4_hdmi_cec_exit(vc4_hdmi);
> err_destroy_conn:
> vc4_hdmi_connector_destroy(&vc4_hdmi->connector);
> -#endif
> err_destroy_encoder:
> drm_encoder_cleanup(encoder);
> err_unprepare_hsm:
> @@ -1422,7 +1448,7 @@ static void vc4_hdmi_unbind(struct device *dev, struct device *master,
> kfree(vc4_hdmi->hdmi_regset.regs);
> kfree(vc4_hdmi->hd_regset.regs);
>
> - cec_unregister_adapter(vc4_hdmi->cec_adap);
> + vc4_hdmi_cec_exit(vc4_hdmi);
> vc4_hdmi_connector_destroy(&vc4_hdmi->connector);
> drm_encoder_cleanup(&vc4_hdmi->encoder.base.base);
>
> --
> git-series 0.9.1
More information about the dri-devel
mailing list