提交 923310ba 编写于 作者: J Jyri Sarha

drm/tilcdc: Stop using struct drm_driver load() callback

Stop using struct drm_driver load() and unload() callbacks. The
callbacks should not be used anymore. Instead of using load the
drm_device is allocated with drm_dev_alloc() and registered with
drm_dev_register() only after the driver is completely initialized.
The deinitialization is done directly either in component unbind
callback or in platform driver demove callback.
Signed-off-by: NJyri Sarha <jsarha@ti.com>
Reviewed-by: NLaurent Pinchart <laurent.pinchart@ideasonboard.com>
上级 15d704e5
master alk-4.19.24 alk-4.19.30 alk-4.19.34 alk-4.19.36 alk-4.19.43 alk-4.19.48 alk-4.19.57 ck-4.19.67 ck-4.19.81 ck-4.19.91 github/fork/deepanshu1422/fix-typo-in-comment github/fork/haosdent/fix-typo linux-next v4.19.91 v4.19.90 v4.19.89 v4.19.88 v4.19.87 v4.19.86 v4.19.85 v4.19.84 v4.19.83 v4.19.82 v4.19.81 v4.19.80 v4.19.79 v4.19.78 v4.19.77 v4.19.76 v4.19.75 v4.19.74 v4.19.73 v4.19.72 v4.19.71 v4.19.70 v4.19.69 v4.19.68 v4.19.67 v4.19.66 v4.19.65 v4.19.64 v4.19.63 v4.19.62 v4.19.61 v4.19.60 v4.19.59 v4.19.58 v4.19.57 v4.19.56 v4.19.55 v4.19.54 v4.19.53 v4.19.52 v4.19.51 v4.19.50 v4.19.49 v4.19.48 v4.19.47 v4.19.46 v4.19.45 v4.19.44 v4.19.43 v4.19.42 v4.19.41 v4.19.40 v4.19.39 v4.19.38 v4.19.37 v4.19.36 v4.19.35 v4.19.34 v4.19.33 v4.19.32 v4.19.31 v4.19.30 v4.19.29 v4.19.28 v4.19.27 v4.19.26 v4.19.25 v4.19.24 v4.19.23 v4.19.22 v4.19.21 v4.19.20 v4.19.19 v4.19.18 v4.19.17 v4.19.16 v4.19.15 v4.19.14 v4.19.13 v4.19.12 v4.19.11 v4.19.10 v4.19.9 v4.19.8 v4.19.7 v4.19.6 v4.19.5 v4.19.4 v4.19.3 v4.19.2 v4.19.1 v4.19 v4.19-rc8 v4.19-rc7 v4.19-rc6 v4.19-rc5 v4.19-rc4 v4.19-rc3 v4.19-rc2 v4.19-rc1 ck-release-21 ck-release-20 ck-release-19.2 ck-release-19.1 ck-release-19 ck-release-18 ck-release-17.2 ck-release-17.1 ck-release-17 ck-release-16 ck-release-15.1 ck-release-15 ck-release-14 ck-release-13.2 ck-release-13 ck-release-12 ck-release-11 ck-release-10 ck-release-9 ck-release-7 alk-release-15 alk-release-14 alk-release-13.2 alk-release-13 alk-release-12 alk-release-11 alk-release-10 alk-release-9 alk-release-7
无相关合并请求
......@@ -194,18 +194,22 @@ static int cpufreq_transition(struct notifier_block *nb,
* DRM operations:
*/
static int tilcdc_unload(struct drm_device *dev)
static void tilcdc_fini(struct drm_device *dev)
{
struct tilcdc_drm_private *priv = dev->dev_private;
tilcdc_remove_external_encoders(dev);
drm_modeset_lock_crtc(priv->crtc, NULL);
tilcdc_crtc_disable(priv->crtc);
drm_modeset_unlock_crtc(priv->crtc);
drm_dev_unregister(dev);
drm_fbdev_cma_fini(priv->fbdev);
drm_kms_helper_poll_fini(dev);
drm_fbdev_cma_fini(priv->fbdev);
drm_irq_uninstall(dev);
drm_mode_config_cleanup(dev);
drm_vblank_cleanup(dev);
drm_irq_uninstall(dev);
tilcdc_remove_external_encoders(dev);
#ifdef CONFIG_CPU_FREQ
cpufreq_unregister_notifier(&priv->freq_transition,
......@@ -225,28 +229,34 @@ static int tilcdc_unload(struct drm_device *dev)
pm_runtime_disable(dev->dev);
return 0;
drm_dev_unref(dev);
}
static int tilcdc_load(struct drm_device *dev, unsigned long flags)
static int tilcdc_init(struct drm_driver *ddrv, struct device *dev)
{
struct platform_device *pdev = dev->platformdev;
struct device_node *node = pdev->dev.of_node;
struct drm_device *ddev;
struct platform_device *pdev = to_platform_device(dev);
struct device_node *node = dev->of_node;
struct tilcdc_drm_private *priv;
struct resource *res;
u32 bpp = 0;
int ret;
priv = devm_kzalloc(dev->dev, sizeof(*priv), GFP_KERNEL);
priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
if (!priv) {
dev_err(dev->dev, "failed to allocate private data\n");
dev_err(dev, "failed to allocate private data\n");
return -ENOMEM;
}
dev->dev_private = priv;
ddev = drm_dev_alloc(ddrv, dev);
if (IS_ERR(ddev))
return PTR_ERR(ddev);
ddev->platformdev = pdev;
ddev->dev_private = priv;
priv->is_componentized =
tilcdc_get_external_components(dev->dev, NULL) > 0;
tilcdc_get_external_components(dev, NULL) > 0;
priv->wq = alloc_ordered_workqueue("tilcdc", 0);
if (!priv->wq) {
......@@ -256,21 +266,21 @@ static int tilcdc_load(struct drm_device *dev, unsigned long flags)
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
if (!res) {
dev_err(dev->dev, "failed to get memory resource\n");
dev_err(dev, "failed to get memory resource\n");
ret = -EINVAL;
goto fail_free_wq;
}
priv->mmio = ioremap_nocache(res->start, resource_size(res));
if (!priv->mmio) {
dev_err(dev->dev, "failed to ioremap\n");
dev_err(dev, "failed to ioremap\n");
ret = -ENOMEM;
goto fail_free_wq;
}
priv->clk = clk_get(dev->dev, "fck");
priv->clk = clk_get(dev, "fck");
if (IS_ERR(priv->clk)) {
dev_err(dev->dev, "failed to get functional clock\n");
dev_err(dev, "failed to get functional clock\n");
ret = -ENODEV;
goto fail_iounmap;
}
......@@ -280,7 +290,7 @@ static int tilcdc_load(struct drm_device *dev, unsigned long flags)
ret = cpufreq_register_notifier(&priv->freq_transition,
CPUFREQ_TRANSITION_NOTIFIER);
if (ret) {
dev_err(dev->dev, "failed to register cpufreq notifier\n");
dev_err(dev, "failed to register cpufreq notifier\n");
goto fail_put_clk;
}
#endif
......@@ -301,11 +311,11 @@ static int tilcdc_load(struct drm_device *dev, unsigned long flags)
DBG("Maximum Pixel Clock Value %dKHz", priv->max_pixelclock);
pm_runtime_enable(dev->dev);
pm_runtime_enable(dev);
/* Determine LCD IP Version */
pm_runtime_get_sync(dev->dev);
switch (tilcdc_read(dev, LCDC_PID_REG)) {
pm_runtime_get_sync(dev);
switch (tilcdc_read(ddev, LCDC_PID_REG)) {
case 0x4c100102:
priv->rev = 1;
break;
......@@ -314,14 +324,14 @@ static int tilcdc_load(struct drm_device *dev, unsigned long flags)
priv->rev = 2;
break;
default:
dev_warn(dev->dev, "Unknown PID Reg value 0x%08x, "
"defaulting to LCD revision 1\n",
tilcdc_read(dev, LCDC_PID_REG));
dev_warn(dev, "Unknown PID Reg value 0x%08x, "
"defaulting to LCD revision 1\n",
tilcdc_read(ddev, LCDC_PID_REG));
priv->rev = 1;
break;
}
pm_runtime_put_sync(dev->dev);
pm_runtime_put_sync(dev);
if (priv->rev == 1) {
DBG("Revision 1 LCDC supports only RGB565 format");
......@@ -354,74 +364,82 @@ static int tilcdc_load(struct drm_device *dev, unsigned long flags)
}
}
ret = modeset_init(dev);
ret = modeset_init(ddev);
if (ret < 0) {
dev_err(dev->dev, "failed to initialize mode setting\n");
dev_err(dev, "failed to initialize mode setting\n");
goto fail_cpufreq_unregister;
}
platform_set_drvdata(pdev, dev);
platform_set_drvdata(pdev, ddev);
if (priv->is_componentized) {
ret = component_bind_all(dev->dev, dev);
ret = component_bind_all(dev, ddev);
if (ret < 0)
goto fail_mode_config_cleanup;
ret = tilcdc_add_external_encoders(dev);
ret = tilcdc_add_external_encoders(ddev);
if (ret < 0)
goto fail_component_cleanup;
}
if ((priv->num_encoders == 0) || (priv->num_connectors == 0)) {
dev_err(dev->dev, "no encoders/connectors found\n");
dev_err(dev, "no encoders/connectors found\n");
ret = -ENXIO;
goto fail_external_cleanup;
}
ret = drm_vblank_init(dev, 1);
ret = drm_vblank_init(ddev, 1);
if (ret < 0) {
dev_err(dev->dev, "failed to initialize vblank\n");
dev_err(dev, "failed to initialize vblank\n");
goto fail_external_cleanup;
}
ret = drm_irq_install(dev, platform_get_irq(dev->platformdev, 0));
ret = drm_irq_install(ddev, platform_get_irq(pdev, 0));
if (ret < 0) {
dev_err(dev->dev, "failed to install IRQ handler\n");
dev_err(dev, "failed to install IRQ handler\n");
goto fail_vblank_cleanup;
}
drm_mode_config_reset(dev);
drm_mode_config_reset(ddev);
priv->fbdev = drm_fbdev_cma_init(dev, bpp,
dev->mode_config.num_crtc,
dev->mode_config.num_connector);
priv->fbdev = drm_fbdev_cma_init(ddev, bpp,
ddev->mode_config.num_crtc,
ddev->mode_config.num_connector);
if (IS_ERR(priv->fbdev)) {
ret = PTR_ERR(priv->fbdev);
goto fail_irq_uninstall;
}
drm_kms_helper_poll_init(dev);
drm_kms_helper_poll_init(ddev);
ret = drm_dev_register(ddev, 0);
if (ret)
goto fail_platform_init;
return 0;
fail_platform_init:
drm_kms_helper_poll_fini(ddev);
drm_fbdev_cma_fini(priv->fbdev);
fail_irq_uninstall:
drm_irq_uninstall(dev);
drm_irq_uninstall(ddev);
fail_vblank_cleanup:
drm_vblank_cleanup(dev);
drm_vblank_cleanup(ddev);
fail_component_cleanup:
if (priv->is_componentized)
component_unbind_all(dev->dev, dev);
component_unbind_all(dev, dev);
fail_mode_config_cleanup:
drm_mode_config_cleanup(dev);
drm_mode_config_cleanup(ddev);
fail_external_cleanup:
tilcdc_remove_external_encoders(dev);
tilcdc_remove_external_encoders(ddev);
fail_cpufreq_unregister:
pm_runtime_disable(dev->dev);
pm_runtime_disable(dev);
#ifdef CONFIG_CPU_FREQ
cpufreq_unregister_notifier(&priv->freq_transition,
CPUFREQ_TRANSITION_NOTIFIER);
......@@ -438,7 +456,8 @@ static int tilcdc_load(struct drm_device *dev, unsigned long flags)
destroy_workqueue(priv->wq);
fail_unset_priv:
dev->dev_private = NULL;
ddev->dev_private = NULL;
drm_dev_unref(ddev);
return ret;
}
......@@ -583,8 +602,6 @@ static const struct file_operations fops = {
static struct drm_driver tilcdc_driver = {
.driver_features = (DRIVER_HAVE_IRQ | DRIVER_GEM | DRIVER_MODESET |
DRIVER_PRIME | DRIVER_ATOMIC),
.load = tilcdc_load,
.unload = tilcdc_unload,
.lastclose = tilcdc_lastclose,
.irq_handler = tilcdc_irq,
.get_vblank_counter = drm_vblank_no_hw_counter,
......@@ -658,10 +675,9 @@ static const struct dev_pm_ops tilcdc_pm_ops = {
/*
* Platform driver:
*/
static int tilcdc_bind(struct device *dev)
{
return drm_platform_init(&tilcdc_driver, to_platform_device(dev));
return tilcdc_init(&tilcdc_driver, dev);
}
static void tilcdc_unbind(struct device *dev)
......@@ -672,7 +688,7 @@ static void tilcdc_unbind(struct device *dev)
if (!ddev->dev_private)
return;
drm_put_dev(dev_get_drvdata(dev));
tilcdc_fini(dev_get_drvdata(dev));
}
static const struct component_master_ops tilcdc_comp_ops = {
......@@ -695,7 +711,7 @@ static int tilcdc_pdev_probe(struct platform_device *pdev)
if (ret < 0)
return ret;
else if (ret == 0)
return drm_platform_init(&tilcdc_driver, pdev);
return tilcdc_init(&tilcdc_driver, &pdev->dev);
else
return component_master_add_with_match(&pdev->dev,
&tilcdc_comp_ops,
......@@ -710,7 +726,7 @@ static int tilcdc_pdev_remove(struct platform_device *pdev)
if (ret < 0)
return ret;
else if (ret == 0)
drm_put_dev(platform_get_drvdata(pdev));
tilcdc_fini(platform_get_drvdata(pdev));
else
component_master_del(&pdev->dev, &tilcdc_comp_ops);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册
反馈
建议
客服 返回
顶部