Commit 3c2eb780 authored by Dave Airlie's avatar Dave Airlie

Merge tag 'exynos-drm-next-for-v6.8' of...

Merge tag 'exynos-drm-next-for-v6.8' of git://git.kernel.org/pub/scm/linux/kernel/git/daeinki/drm-exynos into drm-next

One bug fix
- Add a missing call to drm_atomic_helper_shutdown() in Exynos DRM
driver.

  This function is necessary during system shutdown and when the driver
  is unbound. Without this function, components like panels may not shut
  down properly, potentially leading to power issue as mentioned in the
  kernel documentation, specially in the "driver instance overview"
  secstion of 'drm_drv.c'.

Two cleanups
- Convert '.remove()' callback function in the Exynos DRM platform
  driver to a version that returns void instead of an integer.
- Change connector type of exynos_drm_dpi.c module to DPI.
Signed-off-by: default avatarDave Airlie <airlied@redhat.com>

From: Inki Dae <inki.dae@samsung.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20231212051134.48524-1-inki.dae@samsung.com
parents c1ee197d ead5a41c
...@@ -862,18 +862,16 @@ static int exynos5433_decon_probe(struct platform_device *pdev) ...@@ -862,18 +862,16 @@ static int exynos5433_decon_probe(struct platform_device *pdev)
return ret; return ret;
} }
static int exynos5433_decon_remove(struct platform_device *pdev) static void exynos5433_decon_remove(struct platform_device *pdev)
{ {
pm_runtime_disable(&pdev->dev); pm_runtime_disable(&pdev->dev);
component_del(&pdev->dev, &decon_component_ops); component_del(&pdev->dev, &decon_component_ops);
return 0;
} }
struct platform_driver exynos5433_decon_driver = { struct platform_driver exynos5433_decon_driver = {
.probe = exynos5433_decon_probe, .probe = exynos5433_decon_probe,
.remove = exynos5433_decon_remove, .remove_new = exynos5433_decon_remove,
.driver = { .driver = {
.name = "exynos5433-decon", .name = "exynos5433-decon",
.pm = pm_ptr(&exynos5433_decon_pm_ops), .pm = pm_ptr(&exynos5433_decon_pm_ops),
......
...@@ -765,7 +765,7 @@ static int decon_probe(struct platform_device *pdev) ...@@ -765,7 +765,7 @@ static int decon_probe(struct platform_device *pdev)
return ret; return ret;
} }
static int decon_remove(struct platform_device *pdev) static void decon_remove(struct platform_device *pdev)
{ {
struct decon_context *ctx = dev_get_drvdata(&pdev->dev); struct decon_context *ctx = dev_get_drvdata(&pdev->dev);
...@@ -774,8 +774,6 @@ static int decon_remove(struct platform_device *pdev) ...@@ -774,8 +774,6 @@ static int decon_remove(struct platform_device *pdev)
iounmap(ctx->regs); iounmap(ctx->regs);
component_del(&pdev->dev, &decon_component_ops); component_del(&pdev->dev, &decon_component_ops);
return 0;
} }
static int exynos7_decon_suspend(struct device *dev) static int exynos7_decon_suspend(struct device *dev)
...@@ -840,7 +838,7 @@ static DEFINE_RUNTIME_DEV_PM_OPS(exynos7_decon_pm_ops, exynos7_decon_suspend, ...@@ -840,7 +838,7 @@ static DEFINE_RUNTIME_DEV_PM_OPS(exynos7_decon_pm_ops, exynos7_decon_suspend,
struct platform_driver decon_driver = { struct platform_driver decon_driver = {
.probe = decon_probe, .probe = decon_probe,
.remove = decon_remove, .remove_new = decon_remove,
.driver = { .driver = {
.name = "exynos-decon", .name = "exynos-decon",
.pm = pm_ptr(&exynos7_decon_pm_ops), .pm = pm_ptr(&exynos7_decon_pm_ops),
......
...@@ -250,14 +250,12 @@ static int exynos_dp_probe(struct platform_device *pdev) ...@@ -250,14 +250,12 @@ static int exynos_dp_probe(struct platform_device *pdev)
return component_add(&pdev->dev, &exynos_dp_ops); return component_add(&pdev->dev, &exynos_dp_ops);
} }
static int exynos_dp_remove(struct platform_device *pdev) static void exynos_dp_remove(struct platform_device *pdev)
{ {
struct exynos_dp_device *dp = platform_get_drvdata(pdev); struct exynos_dp_device *dp = platform_get_drvdata(pdev);
component_del(&pdev->dev, &exynos_dp_ops); component_del(&pdev->dev, &exynos_dp_ops);
analogix_dp_remove(dp->adp); analogix_dp_remove(dp->adp);
return 0;
} }
static int exynos_dp_suspend(struct device *dev) static int exynos_dp_suspend(struct device *dev)
...@@ -285,7 +283,7 @@ MODULE_DEVICE_TABLE(of, exynos_dp_match); ...@@ -285,7 +283,7 @@ MODULE_DEVICE_TABLE(of, exynos_dp_match);
struct platform_driver dp_driver = { struct platform_driver dp_driver = {
.probe = exynos_dp_probe, .probe = exynos_dp_probe,
.remove = exynos_dp_remove, .remove_new = exynos_dp_remove,
.driver = { .driver = {
.name = "exynos-dp", .name = "exynos-dp",
.owner = THIS_MODULE, .owner = THIS_MODULE,
......
...@@ -101,7 +101,7 @@ static int exynos_dpi_create_connector(struct drm_encoder *encoder) ...@@ -101,7 +101,7 @@ static int exynos_dpi_create_connector(struct drm_encoder *encoder)
ret = drm_connector_init(encoder->dev, connector, ret = drm_connector_init(encoder->dev, connector,
&exynos_dpi_connector_funcs, &exynos_dpi_connector_funcs,
DRM_MODE_CONNECTOR_VGA); DRM_MODE_CONNECTOR_DPI);
if (ret) { if (ret) {
DRM_DEV_ERROR(ctx->dev, DRM_DEV_ERROR(ctx->dev,
"failed to initialize connector with drm\n"); "failed to initialize connector with drm\n");
......
...@@ -300,6 +300,7 @@ static int exynos_drm_bind(struct device *dev) ...@@ -300,6 +300,7 @@ static int exynos_drm_bind(struct device *dev)
drm_mode_config_cleanup(drm); drm_mode_config_cleanup(drm);
exynos_drm_cleanup_dma(drm); exynos_drm_cleanup_dma(drm);
kfree(private); kfree(private);
dev_set_drvdata(dev, NULL);
err_free_drm: err_free_drm:
drm_dev_put(drm); drm_dev_put(drm);
...@@ -313,6 +314,7 @@ static void exynos_drm_unbind(struct device *dev) ...@@ -313,6 +314,7 @@ static void exynos_drm_unbind(struct device *dev)
drm_dev_unregister(drm); drm_dev_unregister(drm);
drm_kms_helper_poll_fini(drm); drm_kms_helper_poll_fini(drm);
drm_atomic_helper_shutdown(drm);
component_unbind_all(drm->dev, drm); component_unbind_all(drm->dev, drm);
drm_mode_config_cleanup(drm); drm_mode_config_cleanup(drm);
...@@ -344,15 +346,23 @@ static int exynos_drm_platform_probe(struct platform_device *pdev) ...@@ -344,15 +346,23 @@ static int exynos_drm_platform_probe(struct platform_device *pdev)
match); match);
} }
static int exynos_drm_platform_remove(struct platform_device *pdev) static void exynos_drm_platform_remove(struct platform_device *pdev)
{ {
component_master_del(&pdev->dev, &exynos_drm_ops); component_master_del(&pdev->dev, &exynos_drm_ops);
return 0; }
static void exynos_drm_platform_shutdown(struct platform_device *pdev)
{
struct drm_device *drm = platform_get_drvdata(pdev);
if (drm)
drm_atomic_helper_shutdown(drm);
} }
static struct platform_driver exynos_drm_platform_driver = { static struct platform_driver exynos_drm_platform_driver = {
.probe = exynos_drm_platform_probe, .probe = exynos_drm_platform_probe,
.remove = exynos_drm_platform_remove, .remove_new = exynos_drm_platform_remove,
.shutdown = exynos_drm_platform_shutdown,
.driver = { .driver = {
.name = "exynos-drm", .name = "exynos-drm",
.pm = &exynos_drm_pm_ops, .pm = &exynos_drm_pm_ops,
......
...@@ -1367,7 +1367,7 @@ static int fimc_probe(struct platform_device *pdev) ...@@ -1367,7 +1367,7 @@ static int fimc_probe(struct platform_device *pdev)
return ret; return ret;
} }
static int fimc_remove(struct platform_device *pdev) static void fimc_remove(struct platform_device *pdev)
{ {
struct device *dev = &pdev->dev; struct device *dev = &pdev->dev;
struct fimc_context *ctx = get_fimc_context(dev); struct fimc_context *ctx = get_fimc_context(dev);
...@@ -1377,8 +1377,6 @@ static int fimc_remove(struct platform_device *pdev) ...@@ -1377,8 +1377,6 @@ static int fimc_remove(struct platform_device *pdev)
pm_runtime_disable(dev); pm_runtime_disable(dev);
fimc_put_clocks(ctx); fimc_put_clocks(ctx);
return 0;
} }
static int fimc_runtime_suspend(struct device *dev) static int fimc_runtime_suspend(struct device *dev)
...@@ -1410,7 +1408,7 @@ MODULE_DEVICE_TABLE(of, fimc_of_match); ...@@ -1410,7 +1408,7 @@ MODULE_DEVICE_TABLE(of, fimc_of_match);
struct platform_driver fimc_driver = { struct platform_driver fimc_driver = {
.probe = fimc_probe, .probe = fimc_probe,
.remove = fimc_remove, .remove_new = fimc_remove,
.driver = { .driver = {
.of_match_table = fimc_of_match, .of_match_table = fimc_of_match,
.name = "exynos-drm-fimc", .name = "exynos-drm-fimc",
......
...@@ -1277,13 +1277,11 @@ static int fimd_probe(struct platform_device *pdev) ...@@ -1277,13 +1277,11 @@ static int fimd_probe(struct platform_device *pdev)
return ret; return ret;
} }
static int fimd_remove(struct platform_device *pdev) static void fimd_remove(struct platform_device *pdev)
{ {
pm_runtime_disable(&pdev->dev); pm_runtime_disable(&pdev->dev);
component_del(&pdev->dev, &fimd_component_ops); component_del(&pdev->dev, &fimd_component_ops);
return 0;
} }
static int exynos_fimd_suspend(struct device *dev) static int exynos_fimd_suspend(struct device *dev)
...@@ -1325,7 +1323,7 @@ static DEFINE_RUNTIME_DEV_PM_OPS(exynos_fimd_pm_ops, exynos_fimd_suspend, ...@@ -1325,7 +1323,7 @@ static DEFINE_RUNTIME_DEV_PM_OPS(exynos_fimd_pm_ops, exynos_fimd_suspend,
struct platform_driver fimd_driver = { struct platform_driver fimd_driver = {
.probe = fimd_probe, .probe = fimd_probe,
.remove = fimd_remove, .remove_new = fimd_remove,
.driver = { .driver = {
.name = "exynos4-fb", .name = "exynos4-fb",
.owner = THIS_MODULE, .owner = THIS_MODULE,
......
...@@ -1530,7 +1530,7 @@ static int g2d_probe(struct platform_device *pdev) ...@@ -1530,7 +1530,7 @@ static int g2d_probe(struct platform_device *pdev)
return ret; return ret;
} }
static int g2d_remove(struct platform_device *pdev) static void g2d_remove(struct platform_device *pdev)
{ {
struct g2d_data *g2d = platform_get_drvdata(pdev); struct g2d_data *g2d = platform_get_drvdata(pdev);
...@@ -1545,8 +1545,6 @@ static int g2d_remove(struct platform_device *pdev) ...@@ -1545,8 +1545,6 @@ static int g2d_remove(struct platform_device *pdev)
g2d_fini_cmdlist(g2d); g2d_fini_cmdlist(g2d);
destroy_workqueue(g2d->g2d_workq); destroy_workqueue(g2d->g2d_workq);
kmem_cache_destroy(g2d->runqueue_slab); kmem_cache_destroy(g2d->runqueue_slab);
return 0;
} }
static int g2d_suspend(struct device *dev) static int g2d_suspend(struct device *dev)
...@@ -1609,7 +1607,7 @@ MODULE_DEVICE_TABLE(of, exynos_g2d_match); ...@@ -1609,7 +1607,7 @@ MODULE_DEVICE_TABLE(of, exynos_g2d_match);
struct platform_driver g2d_driver = { struct platform_driver g2d_driver = {
.probe = g2d_probe, .probe = g2d_probe,
.remove = g2d_remove, .remove_new = g2d_remove,
.driver = { .driver = {
.name = "exynos-drm-g2d", .name = "exynos-drm-g2d",
.owner = THIS_MODULE, .owner = THIS_MODULE,
......
...@@ -1309,15 +1309,13 @@ static int gsc_probe(struct platform_device *pdev) ...@@ -1309,15 +1309,13 @@ static int gsc_probe(struct platform_device *pdev)
return ret; return ret;
} }
static int gsc_remove(struct platform_device *pdev) static void gsc_remove(struct platform_device *pdev)
{ {
struct device *dev = &pdev->dev; struct device *dev = &pdev->dev;
component_del(dev, &gsc_component_ops); component_del(dev, &gsc_component_ops);
pm_runtime_dont_use_autosuspend(dev); pm_runtime_dont_use_autosuspend(dev);
pm_runtime_disable(dev); pm_runtime_disable(dev);
return 0;
} }
static int __maybe_unused gsc_runtime_suspend(struct device *dev) static int __maybe_unused gsc_runtime_suspend(struct device *dev)
...@@ -1422,7 +1420,7 @@ MODULE_DEVICE_TABLE(of, exynos_drm_gsc_of_match); ...@@ -1422,7 +1420,7 @@ MODULE_DEVICE_TABLE(of, exynos_drm_gsc_of_match);
struct platform_driver gsc_driver = { struct platform_driver gsc_driver = {
.probe = gsc_probe, .probe = gsc_probe,
.remove = gsc_remove, .remove_new = gsc_remove,
.driver = { .driver = {
.name = "exynos-drm-gsc", .name = "exynos-drm-gsc",
.owner = THIS_MODULE, .owner = THIS_MODULE,
......
...@@ -442,7 +442,7 @@ static int exynos_mic_probe(struct platform_device *pdev) ...@@ -442,7 +442,7 @@ static int exynos_mic_probe(struct platform_device *pdev)
return ret; return ret;
} }
static int exynos_mic_remove(struct platform_device *pdev) static void exynos_mic_remove(struct platform_device *pdev)
{ {
struct exynos_mic *mic = platform_get_drvdata(pdev); struct exynos_mic *mic = platform_get_drvdata(pdev);
...@@ -450,8 +450,6 @@ static int exynos_mic_remove(struct platform_device *pdev) ...@@ -450,8 +450,6 @@ static int exynos_mic_remove(struct platform_device *pdev)
pm_runtime_disable(&pdev->dev); pm_runtime_disable(&pdev->dev);
drm_bridge_remove(&mic->bridge); drm_bridge_remove(&mic->bridge);
return 0;
} }
static const struct of_device_id exynos_mic_of_match[] = { static const struct of_device_id exynos_mic_of_match[] = {
...@@ -462,7 +460,7 @@ MODULE_DEVICE_TABLE(of, exynos_mic_of_match); ...@@ -462,7 +460,7 @@ MODULE_DEVICE_TABLE(of, exynos_mic_of_match);
struct platform_driver mic_driver = { struct platform_driver mic_driver = {
.probe = exynos_mic_probe, .probe = exynos_mic_probe,
.remove = exynos_mic_remove, .remove_new = exynos_mic_remove,
.driver = { .driver = {
.name = "exynos-mic", .name = "exynos-mic",
.pm = pm_ptr(&exynos_mic_pm_ops), .pm = pm_ptr(&exynos_mic_pm_ops),
......
...@@ -329,15 +329,13 @@ static int rotator_probe(struct platform_device *pdev) ...@@ -329,15 +329,13 @@ static int rotator_probe(struct platform_device *pdev)
return ret; return ret;
} }
static int rotator_remove(struct platform_device *pdev) static void rotator_remove(struct platform_device *pdev)
{ {
struct device *dev = &pdev->dev; struct device *dev = &pdev->dev;
component_del(dev, &rotator_component_ops); component_del(dev, &rotator_component_ops);
pm_runtime_dont_use_autosuspend(dev); pm_runtime_dont_use_autosuspend(dev);
pm_runtime_disable(dev); pm_runtime_disable(dev);
return 0;
} }
static int rotator_runtime_suspend(struct device *dev) static int rotator_runtime_suspend(struct device *dev)
...@@ -453,7 +451,7 @@ static DEFINE_RUNTIME_DEV_PM_OPS(rotator_pm_ops, rotator_runtime_suspend, ...@@ -453,7 +451,7 @@ static DEFINE_RUNTIME_DEV_PM_OPS(rotator_pm_ops, rotator_runtime_suspend,
struct platform_driver rotator_driver = { struct platform_driver rotator_driver = {
.probe = rotator_probe, .probe = rotator_probe,
.remove = rotator_remove, .remove_new = rotator_remove,
.driver = { .driver = {
.name = "exynos-rotator", .name = "exynos-rotator",
.owner = THIS_MODULE, .owner = THIS_MODULE,
......
...@@ -539,15 +539,13 @@ static int scaler_probe(struct platform_device *pdev) ...@@ -539,15 +539,13 @@ static int scaler_probe(struct platform_device *pdev)
return ret; return ret;
} }
static int scaler_remove(struct platform_device *pdev) static void scaler_remove(struct platform_device *pdev)
{ {
struct device *dev = &pdev->dev; struct device *dev = &pdev->dev;
component_del(dev, &scaler_component_ops); component_del(dev, &scaler_component_ops);
pm_runtime_dont_use_autosuspend(dev); pm_runtime_dont_use_autosuspend(dev);
pm_runtime_disable(dev); pm_runtime_disable(dev);
return 0;
} }
static int clk_disable_unprepare_wrapper(struct clk *clk) static int clk_disable_unprepare_wrapper(struct clk *clk)
...@@ -721,7 +719,7 @@ MODULE_DEVICE_TABLE(of, exynos_scaler_match); ...@@ -721,7 +719,7 @@ MODULE_DEVICE_TABLE(of, exynos_scaler_match);
struct platform_driver scaler_driver = { struct platform_driver scaler_driver = {
.probe = scaler_probe, .probe = scaler_probe,
.remove = scaler_remove, .remove_new = scaler_remove,
.driver = { .driver = {
.name = "exynos-scaler", .name = "exynos-scaler",
.owner = THIS_MODULE, .owner = THIS_MODULE,
......
...@@ -462,7 +462,7 @@ static int vidi_probe(struct platform_device *pdev) ...@@ -462,7 +462,7 @@ static int vidi_probe(struct platform_device *pdev)
return component_add(dev, &vidi_component_ops); return component_add(dev, &vidi_component_ops);
} }
static int vidi_remove(struct platform_device *pdev) static void vidi_remove(struct platform_device *pdev)
{ {
struct vidi_context *ctx = platform_get_drvdata(pdev); struct vidi_context *ctx = platform_get_drvdata(pdev);
...@@ -472,13 +472,11 @@ static int vidi_remove(struct platform_device *pdev) ...@@ -472,13 +472,11 @@ static int vidi_remove(struct platform_device *pdev)
} }
component_del(&pdev->dev, &vidi_component_ops); component_del(&pdev->dev, &vidi_component_ops);
return 0;
} }
struct platform_driver vidi_driver = { struct platform_driver vidi_driver = {
.probe = vidi_probe, .probe = vidi_probe,
.remove = vidi_remove, .remove_new = vidi_remove,
.driver = { .driver = {
.name = "exynos-drm-vidi", .name = "exynos-drm-vidi",
.owner = THIS_MODULE, .owner = THIS_MODULE,
......
...@@ -2069,7 +2069,7 @@ static int hdmi_probe(struct platform_device *pdev) ...@@ -2069,7 +2069,7 @@ static int hdmi_probe(struct platform_device *pdev)
return ret; return ret;
} }
static int hdmi_remove(struct platform_device *pdev) static void hdmi_remove(struct platform_device *pdev)
{ {
struct hdmi_context *hdata = platform_get_drvdata(pdev); struct hdmi_context *hdata = platform_get_drvdata(pdev);
...@@ -2092,8 +2092,6 @@ static int hdmi_remove(struct platform_device *pdev) ...@@ -2092,8 +2092,6 @@ static int hdmi_remove(struct platform_device *pdev)
put_device(&hdata->ddc_adpt->dev); put_device(&hdata->ddc_adpt->dev);
mutex_destroy(&hdata->mutex); mutex_destroy(&hdata->mutex);
return 0;
} }
static int __maybe_unused exynos_hdmi_suspend(struct device *dev) static int __maybe_unused exynos_hdmi_suspend(struct device *dev)
...@@ -2125,7 +2123,7 @@ static const struct dev_pm_ops exynos_hdmi_pm_ops = { ...@@ -2125,7 +2123,7 @@ static const struct dev_pm_ops exynos_hdmi_pm_ops = {
struct platform_driver hdmi_driver = { struct platform_driver hdmi_driver = {
.probe = hdmi_probe, .probe = hdmi_probe,
.remove = hdmi_remove, .remove_new = hdmi_remove,
.driver = { .driver = {
.name = "exynos-hdmi", .name = "exynos-hdmi",
.owner = THIS_MODULE, .owner = THIS_MODULE,
......
...@@ -1258,13 +1258,11 @@ static int mixer_probe(struct platform_device *pdev) ...@@ -1258,13 +1258,11 @@ static int mixer_probe(struct platform_device *pdev)
return ret; return ret;
} }
static int mixer_remove(struct platform_device *pdev) static void mixer_remove(struct platform_device *pdev)
{ {
pm_runtime_disable(&pdev->dev); pm_runtime_disable(&pdev->dev);
component_del(&pdev->dev, &mixer_component_ops); component_del(&pdev->dev, &mixer_component_ops);
return 0;
} }
static int __maybe_unused exynos_mixer_suspend(struct device *dev) static int __maybe_unused exynos_mixer_suspend(struct device *dev)
...@@ -1338,5 +1336,5 @@ struct platform_driver mixer_driver = { ...@@ -1338,5 +1336,5 @@ struct platform_driver mixer_driver = {
.of_match_table = mixer_match_types, .of_match_table = mixer_match_types,
}, },
.probe = mixer_probe, .probe = mixer_probe,
.remove = mixer_remove, .remove_new = mixer_remove,
}; };
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment