[PATCH v2 40/60] drm/omap: dss: hdmi4: Move initialization code from bind to probe
Sebastian Reichel
sre at kernel.org
Sun Jun 10 22:54:14 UTC 2018
Hi,
On Sat, May 26, 2018 at 08:24:58PM +0300, Laurent Pinchart wrote:
> There's no reason to delay initialization of most of the driver (such as
> mapping memory I/O or enabling runtime PM) to the component bind
> handler. Perform as much of the initialization as possible at probe
> time, initializing at bind time only the parts that depends on the DSS.
> The cleanup code is moved from unbind to remove in a similar way.
>
> Signed-off-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
> ---
Reviewed-by: Sebastian Reichel <sebastian.reichel at collabora.co.uk>
-- Sebastian
> drivers/gpu/drm/omapdrm/dss/hdmi4.c | 218 +++++++++++++++++++-----------------
> 1 file changed, 117 insertions(+), 101 deletions(-)
>
> diff --git a/drivers/gpu/drm/omapdrm/dss/hdmi4.c b/drivers/gpu/drm/omapdrm/dss/hdmi4.c
> index 1d1f2e0b2b2a..89fdce02278c 100644
> --- a/drivers/gpu/drm/omapdrm/dss/hdmi4.c
> +++ b/drivers/gpu/drm/omapdrm/dss/hdmi4.c
> @@ -553,53 +553,10 @@ static const struct omap_dss_device_ops hdmi_ops = {
> },
> };
>
> -static void hdmi_init_output(struct omap_hdmi *hdmi)
> -{
> - struct omap_dss_device *out = &hdmi->output;
> -
> - out->dev = &hdmi->pdev->dev;
> - out->id = OMAP_DSS_OUTPUT_HDMI;
> - out->output_type = OMAP_DISPLAY_TYPE_HDMI;
> - out->name = "hdmi.0";
> - out->dispc_channel = OMAP_DSS_CHANNEL_DIGIT;
> - out->ops = &hdmi_ops;
> - out->owner = THIS_MODULE;
> - out->of_ports = BIT(0);
> -
> - omapdss_device_register(out);
> -}
> -
> -static void hdmi_uninit_output(struct omap_hdmi *hdmi)
> -{
> - struct omap_dss_device *out = &hdmi->output;
> -
> - omapdss_device_unregister(out);
> -}
> -
> -static int hdmi_probe_of(struct omap_hdmi *hdmi)
> -{
> - struct platform_device *pdev = hdmi->pdev;
> - struct device_node *node = pdev->dev.of_node;
> - struct device_node *ep;
> - int r;
> -
> - ep = of_graph_get_endpoint_by_regs(node, 0, 0);
> - if (!ep)
> - return 0;
> -
> - r = hdmi_parse_lanes_of(pdev, ep, &hdmi->phy);
> - if (r)
> - goto err;
> -
> - of_node_put(ep);
> - return 0;
> -
> -err:
> - of_node_put(ep);
> - return r;
> -}
> +/* -----------------------------------------------------------------------------
> + * Audio Callbacks
> + */
>
> -/* Audio callbacks */
> static int hdmi_audio_startup(struct device *dev,
> void (*abort_cb)(struct device *dev))
> {
> @@ -714,27 +671,123 @@ static int hdmi_audio_register(struct omap_hdmi *hdmi)
> return 0;
> }
>
> -/* HDMI HW IP initialisation */
> +/* -----------------------------------------------------------------------------
> + * Component Bind & Unbind
> + */
> +
> static int hdmi4_bind(struct device *dev, struct device *master, void *data)
> {
> - struct platform_device *pdev = to_platform_device(dev);
> struct dss_device *dss = dss_get_device(master);
> - struct omap_hdmi *hdmi;
> + struct omap_hdmi *hdmi = dev_get_drvdata(dev);
> int r;
> +
> + hdmi->dss = dss;
> +
> + r = hdmi_pll_init(dss, hdmi->pdev, &hdmi->pll, &hdmi->wp);
> + if (r)
> + return r;
> +
> + r = hdmi4_cec_init(hdmi->pdev, &hdmi->core, &hdmi->wp);
> + if (r)
> + goto err_pll_uninit;
> +
> + r = hdmi_audio_register(hdmi);
> + if (r) {
> + DSSERR("Registering HDMI audio failed\n");
> + goto err_cec_uninit;
> + }
> +
> + hdmi->debugfs = dss_debugfs_create_file(dss, "hdmi", hdmi_dump_regs,
> + hdmi);
> +
> + return 0;
> +
> +err_cec_uninit:
> + hdmi4_cec_uninit(&hdmi->core);
> +err_pll_uninit:
> + hdmi_pll_uninit(&hdmi->pll);
> + return r;
> +}
> +
> +static void hdmi4_unbind(struct device *dev, struct device *master, void *data)
> +{
> + struct omap_hdmi *hdmi = dev_get_drvdata(dev);
> +
> + dss_debugfs_remove_file(hdmi->debugfs);
> +
> + if (hdmi->audio_pdev)
> + platform_device_unregister(hdmi->audio_pdev);
> +
> + hdmi4_cec_uninit(&hdmi->core);
> + hdmi_pll_uninit(&hdmi->pll);
> +}
> +
> +static const struct component_ops hdmi4_component_ops = {
> + .bind = hdmi4_bind,
> + .unbind = hdmi4_unbind,
> +};
> +
> +/* -----------------------------------------------------------------------------
> + * Probe & Remove, Suspend & Resume
> + */
> +
> +static void hdmi4_init_output(struct omap_hdmi *hdmi)
> +{
> + struct omap_dss_device *out = &hdmi->output;
> +
> + out->dev = &hdmi->pdev->dev;
> + out->id = OMAP_DSS_OUTPUT_HDMI;
> + out->output_type = OMAP_DISPLAY_TYPE_HDMI;
> + out->name = "hdmi.0";
> + out->dispc_channel = OMAP_DSS_CHANNEL_DIGIT;
> + out->ops = &hdmi_ops;
> + out->owner = THIS_MODULE;
> + out->of_ports = BIT(0);
> +
> + omapdss_device_register(out);
> +}
> +
> +static void hdmi4_uninit_output(struct omap_hdmi *hdmi)
> +{
> + struct omap_dss_device *out = &hdmi->output;
> +
> + omapdss_device_unregister(out);
> +}
> +
> +static int hdmi4_probe_of(struct omap_hdmi *hdmi)
> +{
> + struct platform_device *pdev = hdmi->pdev;
> + struct device_node *node = pdev->dev.of_node;
> + struct device_node *ep;
> + int r;
> +
> + ep = of_graph_get_endpoint_by_regs(node, 0, 0);
> + if (!ep)
> + return 0;
> +
> + r = hdmi_parse_lanes_of(pdev, ep, &hdmi->phy);
> + of_node_put(ep);
> + return r;
> +}
> +
> +static int hdmi4_probe(struct platform_device *pdev)
> +{
> + struct omap_hdmi *hdmi;
> int irq;
> + int r;
>
> hdmi = kzalloc(sizeof(*hdmi), GFP_KERNEL);
> if (!hdmi)
> return -ENOMEM;
>
> hdmi->pdev = pdev;
> - hdmi->dss = dss;
> +
> dev_set_drvdata(&pdev->dev, hdmi);
>
> mutex_init(&hdmi->lock);
> spin_lock_init(&hdmi->audio_playing_lock);
>
> - r = hdmi_probe_of(hdmi);
> + r = hdmi4_probe_of(hdmi);
> if (r)
> goto err_free;
>
> @@ -742,27 +795,19 @@ static int hdmi4_bind(struct device *dev, struct device *master, void *data)
> if (r)
> goto err_free;
>
> - r = hdmi_pll_init(dss, pdev, &hdmi->pll, &hdmi->wp);
> - if (r)
> - goto err_free;
> -
> r = hdmi_phy_init(pdev, &hdmi->phy, 4);
> if (r)
> - goto err_pll;
> + goto err_free;
>
> r = hdmi4_core_init(pdev, &hdmi->core);
> if (r)
> - goto err_pll;
> -
> - r = hdmi4_cec_init(pdev, &hdmi->core, &hdmi->wp);
> - if (r)
> - goto err_pll;
> + goto err_free;
>
> irq = platform_get_irq(pdev, 0);
> if (irq < 0) {
> DSSERR("platform_get_irq failed\n");
> r = -ENODEV;
> - goto err_pll;
> + goto err_free;
> }
>
> r = devm_request_threaded_irq(&pdev->dev, irq,
> @@ -770,67 +815,38 @@ static int hdmi4_bind(struct device *dev, struct device *master, void *data)
> IRQF_ONESHOT, "OMAP HDMI", hdmi);
> if (r) {
> DSSERR("HDMI IRQ request failed\n");
> - goto err_pll;
> + goto err_free;
> }
>
> pm_runtime_enable(&pdev->dev);
>
> - hdmi_init_output(hdmi);
> + hdmi4_init_output(hdmi);
>
> - r = hdmi_audio_register(hdmi);
> - if (r) {
> - DSSERR("Registering HDMI audio failed\n");
> + r = component_add(&pdev->dev, &hdmi4_component_ops);
> + if (r)
> goto err_uninit_output;
> - }
> -
> - hdmi->debugfs = dss_debugfs_create_file(dss, "hdmi", hdmi_dump_regs,
> - hdmi);
>
> return 0;
>
> err_uninit_output:
> - hdmi_uninit_output(hdmi);
> + hdmi4_uninit_output(hdmi);
> pm_runtime_disable(&pdev->dev);
> -err_pll:
> - hdmi_pll_uninit(&hdmi->pll);
> err_free:
> kfree(hdmi);
> return r;
> }
>
> -static void hdmi4_unbind(struct device *dev, struct device *master, void *data)
> +static int hdmi4_remove(struct platform_device *pdev)
> {
> - struct omap_hdmi *hdmi = dev_get_drvdata(dev);
> + struct omap_hdmi *hdmi = platform_get_drvdata(pdev);
>
> - dss_debugfs_remove_file(hdmi->debugfs);
> -
> - if (hdmi->audio_pdev)
> - platform_device_unregister(hdmi->audio_pdev);
> -
> - hdmi_uninit_output(hdmi);
> -
> - hdmi4_cec_uninit(&hdmi->core);
> + component_del(&pdev->dev, &hdmi4_component_ops);
>
> - hdmi_pll_uninit(&hdmi->pll);
> + hdmi4_uninit_output(hdmi);
>
> - pm_runtime_disable(dev);
> + pm_runtime_disable(&pdev->dev);
>
> kfree(hdmi);
> -}
> -
> -static const struct component_ops hdmi4_component_ops = {
> - .bind = hdmi4_bind,
> - .unbind = hdmi4_unbind,
> -};
> -
> -static int hdmi4_probe(struct platform_device *pdev)
> -{
> - return component_add(&pdev->dev, &hdmi4_component_ops);
> -}
> -
> -static int hdmi4_remove(struct platform_device *pdev)
> -{
> - component_del(&pdev->dev, &hdmi4_component_ops);
> return 0;
> }
>
> --
> Regards,
>
> Laurent Pinchart
>
> _______________________________________________
> dri-devel mailing list
> dri-devel at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/dri-devel
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: not available
URL: <https://lists.freedesktop.org/archives/dri-devel/attachments/20180611/98bd16e4/attachment.sig>
More information about the dri-devel
mailing list