static void msm_hdmi_register_audio_driver(struct hdmi *hdmi, struct device *dev) { struct hdmi_codec_pdata codec_data = { .ops = &msm_hdmi_audio_codec_ops, .max_i2s_channels = 2, .i2s = 1, }; //struct platform_device *pdev; hdmi->audio_pdev = platform_device_register_data(dev, HDMI_CODEC_DRV_NAME, PLATFORM_DEVID_AUTO, &codec_data, sizeof(codec_data)); if (IS_ERR(hdmi->audio_pdev)) return; DRM_INFO("%s driver bound to HDMI\n", HDMI_CODEC_DRV_NAME); } static int hdmi_dev_probe(struct platform_device *pdev) { return component_add(&pdev->dev, &hdmi_ops); } static int hdmi_dev_remove(struct platform_device *pdev) { component_del(&pdev->dev, &hdmi_ops); return 0; }
static int exynos_dp_remove(struct platform_device *pdev) { pm_runtime_disable(&pdev->dev); component_del(&pdev->dev, &exynos_dp_ops); return 0; }
static int exynos_dp_remove(struct platform_device *pdev) { component_del(&pdev->dev, &exynos_dp_ops); exynos_drm_component_del(&pdev->dev, EXYNOS_DEVICE_TYPE_CONNECTOR); return 0; }
static int zynqmp_dpsub_remove(struct platform_device *pdev) { struct zynqmp_dpsub *dpsub = platform_get_drvdata(pdev); int err, ret = 0; xlnx_drm_pipeline_exit(dpsub->master); of_platform_depopulate(&pdev->dev); of_reserved_mem_device_release(&pdev->dev); component_del(&pdev->dev, &zynqmp_dpsub_component_ops); err = zynqmp_disp_remove(pdev); if (err) ret = -EIO; err = zynqmp_dp_remove(pdev); if (err) ret = -EIO; pm_runtime_disable(&pdev->dev); return err; }
static int dsi_dev_remove(struct platform_device *pdev) { DBG(""); component_del(&pdev->dev, &dsi_ops); return 0; }
static int dw_hdmi_rockchip_remove(struct platform_device *pdev) { component_del(&pdev->dev, &dw_hdmi_rockchip_ops); return 0; }
static int rfbi_remove(struct platform_device *pdev) { component_del(&pdev->dev, &rfbi_component_ops); return 0; }
static int mtk_disp_ovl_remove(struct platform_device *pdev) { component_del(&pdev->dev, &mtk_disp_ovl_component_ops); return 0; }
static int sun4i_hdmi_remove(struct platform_device *pdev) { component_del(&pdev->dev, &sun4i_hdmi_ops); return 0; }
static int sti_compositor_remove(struct platform_device *pdev) { component_del(&pdev->dev, &sti_compositor_ops); return 0; }
static int sti_tvout_remove(struct platform_device *pdev) { component_master_del(&pdev->dev, &sti_tvout_master_ops); component_del(&pdev->dev, &sti_tvout_ops); return 0; }
static int dw_mipi_dsi_remove(struct platform_device *pdev) { component_del(&pdev->dev, &dw_mipi_dsi_ops); return 0; }
static int vc4_v3d_dev_remove(struct platform_device *pdev) { component_del(&pdev->dev, &vc4_v3d_ops); return 0; }
static int ipu_drm_remove(struct platform_device *pdev) { component_del(&pdev->dev, &ipu_crtc_ops); return 0; }
static int exynos_dp_remove(struct platform_device *pdev) { component_del(&pdev->dev, &exynos_dp_ops); return 0; }
static int imx_ldb_remove(struct platform_device *pdev) { component_del(&pdev->dev, &imx_ldb_ops); return 0; }
static int sun8i_mixer_remove(struct platform_device *pdev) { component_del(&pdev->dev, &sun8i_mixer_ops); return 0; }
static int zynqmp_dpsub_probe(struct platform_device *pdev) { struct zynqmp_dpsub *dpsub; int ret; dpsub = devm_kzalloc(&pdev->dev, sizeof(*dpsub), GFP_KERNEL); if (!dpsub) return -ENOMEM; /* Sub-driver will access dpsub from drvdata */ platform_set_drvdata(pdev, dpsub); pm_runtime_enable(&pdev->dev); /* * DP should be probed first so that the zynqmp_disp can set the output * format accordingly. */ ret = zynqmp_dp_probe(pdev); if (ret) goto err_pm; ret = zynqmp_disp_probe(pdev); if (ret) goto err_dp; ret = component_add(&pdev->dev, &zynqmp_dpsub_component_ops); if (ret) goto err_disp; /* Try the reserved memory. Proceed if there's none */ of_reserved_mem_device_init(&pdev->dev); /* Populate the sound child nodes */ ret = of_platform_populate(pdev->dev.of_node, NULL, NULL, &pdev->dev); if (ret) { dev_err(&pdev->dev, "failed to populate child nodes\n"); goto err_rmem; } dpsub->master = xlnx_drm_pipeline_init(pdev); if (IS_ERR(dpsub->master)) { dev_err(&pdev->dev, "failed to initialize the drm pipeline\n"); goto err_populate; } dev_info(&pdev->dev, "ZynqMP DisplayPort Subsystem driver probed"); return 0; err_populate: of_platform_depopulate(&pdev->dev); err_rmem: of_reserved_mem_device_release(&pdev->dev); component_del(&pdev->dev, &zynqmp_dpsub_component_ops); err_disp: zynqmp_disp_remove(pdev); err_dp: zynqmp_dp_remove(pdev); err_pm: pm_runtime_disable(&pdev->dev); return ret; }
static int adreno_remove(struct platform_device *pdev) { component_del(&pdev->dev, &a3xx_ops); return 0; }
static int rockchip_dp_remove(struct platform_device *pdev) { component_del(&pdev->dev, &rockchip_dp_component_ops); return 0; }
static int hdmi_audio_register(struct device *dev) { struct omap_hdmi_audio_pdata pdata = { .dev = dev, .dss_version = omapdss_get_version(), .audio_dma_addr = hdmi_wp_get_audio_dma_addr(&hdmi.wp), .ops = &hdmi_audio_ops, }; hdmi.audio_pdev = platform_device_register_data( dev, "omap-hdmi-audio", PLATFORM_DEVID_AUTO, &pdata, sizeof(pdata)); if (IS_ERR(hdmi.audio_pdev)) return PTR_ERR(hdmi.audio_pdev); hdmi_runtime_get(); hdmi.wp_idlemode = REG_GET(hdmi.wp.base, HDMI_WP_SYSCONFIG, 3, 2); hdmi_runtime_put(); return 0; } /* HDMI HW IP initialisation */ static int hdmi5_bind(struct device *dev, struct device *master, void *data) { struct platform_device *pdev = to_platform_device(dev); int r; int irq; hdmi.pdev = pdev; dev_set_drvdata(&pdev->dev, &hdmi); mutex_init(&hdmi.lock); spin_lock_init(&hdmi.audio_playing_lock); if (pdev->dev.of_node) { r = hdmi_probe_of(pdev); if (r) return r; } r = hdmi_wp_init(pdev, &hdmi.wp); if (r) return r; r = hdmi_pll_init(pdev, &hdmi.pll, &hdmi.wp); if (r) return r; r = hdmi_phy_init(pdev, &hdmi.phy); if (r) goto err; r = hdmi5_core_init(pdev, &hdmi.core); if (r) goto err; irq = platform_get_irq(pdev, 0); if (irq < 0) { DSSERR("platform_get_irq failed\n"); r = -ENODEV; goto err; } r = devm_request_threaded_irq(&pdev->dev, irq, NULL, hdmi_irq_handler, IRQF_ONESHOT, "OMAP HDMI", &hdmi.wp); if (r) { DSSERR("HDMI IRQ request failed\n"); goto err; } pm_runtime_enable(&pdev->dev); hdmi_init_output(pdev); r = hdmi_audio_register(&pdev->dev); if (r) { DSSERR("Registering HDMI audio failed %d\n", r); hdmi_uninit_output(pdev); pm_runtime_disable(&pdev->dev); return r; } dss_debugfs_create_file("hdmi", hdmi_dump_regs); return 0; err: hdmi_pll_uninit(&hdmi.pll); return r; } static void hdmi5_unbind(struct device *dev, struct device *master, void *data) { struct platform_device *pdev = to_platform_device(dev); if (hdmi.audio_pdev) platform_device_unregister(hdmi.audio_pdev); hdmi_uninit_output(pdev); hdmi_pll_uninit(&hdmi.pll); pm_runtime_disable(&pdev->dev); } static const struct component_ops hdmi5_component_ops = { .bind = hdmi5_bind, .unbind = hdmi5_unbind, }; static int hdmi5_probe(struct platform_device *pdev) { return component_add(&pdev->dev, &hdmi5_component_ops); } static int hdmi5_remove(struct platform_device *pdev) { component_del(&pdev->dev, &hdmi5_component_ops); return 0; }
static int meson_dw_hdmi_remove(struct platform_device *pdev) { component_del(&pdev->dev, &meson_dw_hdmi_ops); return 0; }