diff options
Diffstat (limited to 'drivers/gpu/drm/tilcdc')
| -rw-r--r-- | drivers/gpu/drm/tilcdc/tilcdc_drv.c | 15 | ||||
| -rw-r--r-- | drivers/gpu/drm/tilcdc/tilcdc_drv.h | 1 | ||||
| -rw-r--r-- | drivers/gpu/drm/tilcdc/tilcdc_panel.c | 41 | ||||
| -rw-r--r-- | drivers/gpu/drm/tilcdc/tilcdc_slave.c | 29 | ||||
| -rw-r--r-- | drivers/gpu/drm/tilcdc/tilcdc_tfp410.c | 37 | 
5 files changed, 61 insertions, 62 deletions
diff --git a/drivers/gpu/drm/tilcdc/tilcdc_drv.c b/drivers/gpu/drm/tilcdc/tilcdc_drv.c index b20b69488dc9..6be623b4a86f 100644 --- a/drivers/gpu/drm/tilcdc/tilcdc_drv.c +++ b/drivers/gpu/drm/tilcdc/tilcdc_drv.c @@ -120,8 +120,8 @@ static int cpufreq_transition(struct notifier_block *nb,  static int tilcdc_unload(struct drm_device *dev)  {  	struct tilcdc_drm_private *priv = dev->dev_private; -	struct tilcdc_module *mod, *cur; +	drm_fbdev_cma_fini(priv->fbdev);  	drm_kms_helper_poll_fini(dev);  	drm_mode_config_cleanup(dev);  	drm_vblank_cleanup(dev); @@ -148,11 +148,6 @@ static int tilcdc_unload(struct drm_device *dev)  	pm_runtime_disable(dev->dev); -	list_for_each_entry_safe(mod, cur, &module_list, list) { -		DBG("destroying module: %s", mod->name); -		mod->funcs->destroy(mod); -	} -  	kfree(priv);  	return 0; @@ -628,13 +623,13 @@ static int __init tilcdc_drm_init(void)  static void __exit tilcdc_drm_fini(void)  {  	DBG("fini"); -	tilcdc_tfp410_fini(); -	tilcdc_slave_fini(); -	tilcdc_panel_fini();  	platform_driver_unregister(&tilcdc_platform_driver); +	tilcdc_panel_fini(); +	tilcdc_slave_fini(); +	tilcdc_tfp410_fini();  } -late_initcall(tilcdc_drm_init); +module_init(tilcdc_drm_init);  module_exit(tilcdc_drm_fini);  MODULE_AUTHOR("Rob Clark <[email protected]"); diff --git a/drivers/gpu/drm/tilcdc/tilcdc_drv.h b/drivers/gpu/drm/tilcdc/tilcdc_drv.h index 093803683b25..7596c144a9fb 100644 --- a/drivers/gpu/drm/tilcdc/tilcdc_drv.h +++ b/drivers/gpu/drm/tilcdc/tilcdc_drv.h @@ -98,7 +98,6 @@ struct tilcdc_module;  struct tilcdc_module_ops {  	/* create appropriate encoders/connectors: */  	int (*modeset_init)(struct tilcdc_module *mod, struct drm_device *dev); -	void (*destroy)(struct tilcdc_module *mod);  #ifdef CONFIG_DEBUG_FS  	/* create debugfs nodes (can be NULL): */  	int (*debugfs_init)(struct tilcdc_module *mod, struct drm_minor *minor); diff --git a/drivers/gpu/drm/tilcdc/tilcdc_panel.c b/drivers/gpu/drm/tilcdc/tilcdc_panel.c index 86c67329b605..4c7aa1d8134f 100644 --- a/drivers/gpu/drm/tilcdc/tilcdc_panel.c +++ b/drivers/gpu/drm/tilcdc/tilcdc_panel.c @@ -151,6 +151,7 @@ struct panel_connector {  static void panel_connector_destroy(struct drm_connector *connector)  {  	struct panel_connector *panel_connector = to_panel_connector(connector); +	drm_connector_unregister(connector);  	drm_connector_cleanup(connector);  	kfree(panel_connector);  } @@ -247,7 +248,7 @@ static struct drm_connector *panel_connector_create(struct drm_device *dev,  	if (ret)  		goto fail; -	drm_sysfs_connector_add(connector); +	drm_connector_register(connector);  	return connector; @@ -281,23 +282,8 @@ static int panel_modeset_init(struct tilcdc_module *mod, struct drm_device *dev)  	return 0;  } -static void panel_destroy(struct tilcdc_module *mod) -{ -	struct panel_module *panel_mod = to_panel_module(mod); - -	if (panel_mod->timings) { -		display_timings_release(panel_mod->timings); -		kfree(panel_mod->timings); -	} - -	tilcdc_module_cleanup(mod); -	kfree(panel_mod->info); -	kfree(panel_mod); -} -  static const struct tilcdc_module_ops panel_module_ops = {  		.modeset_init = panel_modeset_init, -		.destroy = panel_destroy,  };  /* @@ -373,6 +359,7 @@ static int panel_probe(struct platform_device *pdev)  		return -ENOMEM;  	mod = &panel_mod->base; +	pdev->dev.platform_data = mod;  	tilcdc_module_init(mod, "panel", &panel_module_ops); @@ -380,17 +367,16 @@ static int panel_probe(struct platform_device *pdev)  	if (IS_ERR(pinctrl))  		dev_warn(&pdev->dev, "pins are not configured\n"); -  	panel_mod->timings = of_get_display_timings(node);  	if (!panel_mod->timings) {  		dev_err(&pdev->dev, "could not get panel timings\n"); -		goto fail; +		goto fail_free;  	}  	panel_mod->info = of_get_panel_info(node);  	if (!panel_mod->info) {  		dev_err(&pdev->dev, "could not get panel info\n"); -		goto fail; +		goto fail_timings;  	}  	mod->preferred_bpp = panel_mod->info->bpp; @@ -401,13 +387,26 @@ static int panel_probe(struct platform_device *pdev)  	return 0; -fail: -	panel_destroy(mod); +fail_timings: +	display_timings_release(panel_mod->timings); + +fail_free: +	kfree(panel_mod); +	tilcdc_module_cleanup(mod);  	return ret;  }  static int panel_remove(struct platform_device *pdev)  { +	struct tilcdc_module *mod = dev_get_platdata(&pdev->dev); +	struct panel_module *panel_mod = to_panel_module(mod); + +	display_timings_release(panel_mod->timings); + +	tilcdc_module_cleanup(mod); +	kfree(panel_mod->info); +	kfree(panel_mod); +  	return 0;  } diff --git a/drivers/gpu/drm/tilcdc/tilcdc_slave.c b/drivers/gpu/drm/tilcdc/tilcdc_slave.c index 595068ba2d5e..3775fd49dac4 100644 --- a/drivers/gpu/drm/tilcdc/tilcdc_slave.c +++ b/drivers/gpu/drm/tilcdc/tilcdc_slave.c @@ -166,6 +166,7 @@ struct slave_connector {  static void slave_connector_destroy(struct drm_connector *connector)  {  	struct slave_connector *slave_connector = to_slave_connector(connector); +	drm_connector_unregister(connector);  	drm_connector_cleanup(connector);  	kfree(slave_connector);  } @@ -261,7 +262,7 @@ static struct drm_connector *slave_connector_create(struct drm_device *dev,  	if (ret)  		goto fail; -	drm_sysfs_connector_add(connector); +	drm_connector_register(connector);  	return connector; @@ -295,17 +296,8 @@ static int slave_modeset_init(struct tilcdc_module *mod, struct drm_device *dev)  	return 0;  } -static void slave_destroy(struct tilcdc_module *mod) -{ -	struct slave_module *slave_mod = to_slave_module(mod); - -	tilcdc_module_cleanup(mod); -	kfree(slave_mod); -} -  static const struct tilcdc_module_ops slave_module_ops = {  		.modeset_init = slave_modeset_init, -		.destroy = slave_destroy,  };  /* @@ -355,10 +347,13 @@ static int slave_probe(struct platform_device *pdev)  	}  	slave_mod = kzalloc(sizeof(*slave_mod), GFP_KERNEL); -	if (!slave_mod) -		return -ENOMEM; +	if (!slave_mod) { +		ret = -ENOMEM; +		goto fail_adapter; +	}  	mod = &slave_mod->base; +	pdev->dev.platform_data = mod;  	mod->preferred_bpp = slave_info.bpp; @@ -373,10 +368,20 @@ static int slave_probe(struct platform_device *pdev)  	tilcdc_slave_probedefer(false);  	return 0; + +fail_adapter: +	i2c_put_adapter(slavei2c); +	return ret;  }  static int slave_remove(struct platform_device *pdev)  { +	struct tilcdc_module *mod = dev_get_platdata(&pdev->dev); +	struct slave_module *slave_mod = to_slave_module(mod); + +	tilcdc_module_cleanup(mod); +	kfree(slave_mod); +  	return 0;  } diff --git a/drivers/gpu/drm/tilcdc/tilcdc_tfp410.c b/drivers/gpu/drm/tilcdc/tilcdc_tfp410.c index c38b56b268ac..354c47ca6374 100644 --- a/drivers/gpu/drm/tilcdc/tilcdc_tfp410.c +++ b/drivers/gpu/drm/tilcdc/tilcdc_tfp410.c @@ -167,6 +167,7 @@ struct tfp410_connector {  static void tfp410_connector_destroy(struct drm_connector *connector)  {  	struct tfp410_connector *tfp410_connector = to_tfp410_connector(connector); +	drm_connector_unregister(connector);  	drm_connector_cleanup(connector);  	kfree(tfp410_connector);  } @@ -261,7 +262,7 @@ static struct drm_connector *tfp410_connector_create(struct drm_device *dev,  	if (ret)  		goto fail; -	drm_sysfs_connector_add(connector); +	drm_connector_register(connector);  	return connector; @@ -295,23 +296,8 @@ static int tfp410_modeset_init(struct tilcdc_module *mod, struct drm_device *dev  	return 0;  } -static void tfp410_destroy(struct tilcdc_module *mod) -{ -	struct tfp410_module *tfp410_mod = to_tfp410_module(mod); - -	if (tfp410_mod->i2c) -		i2c_put_adapter(tfp410_mod->i2c); - -	if (!IS_ERR_VALUE(tfp410_mod->gpio)) -		gpio_free(tfp410_mod->gpio); - -	tilcdc_module_cleanup(mod); -	kfree(tfp410_mod); -} -  static const struct tilcdc_module_ops tfp410_module_ops = {  		.modeset_init = tfp410_modeset_init, -		.destroy = tfp410_destroy,  };  /* @@ -341,6 +327,7 @@ static int tfp410_probe(struct platform_device *pdev)  		return -ENOMEM;  	mod = &tfp410_mod->base; +	pdev->dev.platform_data = mod;  	tilcdc_module_init(mod, "tfp410", &tfp410_module_ops); @@ -364,6 +351,7 @@ static int tfp410_probe(struct platform_device *pdev)  	tfp410_mod->i2c = of_find_i2c_adapter_by_node(i2c_node);  	if (!tfp410_mod->i2c) {  		dev_err(&pdev->dev, "could not get i2c\n"); +		of_node_put(i2c_node);  		goto fail;  	} @@ -377,19 +365,32 @@ static int tfp410_probe(struct platform_device *pdev)  		ret = gpio_request(tfp410_mod->gpio, "DVI_PDn");  		if (ret) {  			dev_err(&pdev->dev, "could not get DVI_PDn gpio\n"); -			goto fail; +			goto fail_adapter;  		}  	}  	return 0; +fail_adapter: +	i2c_put_adapter(tfp410_mod->i2c); +  fail: -	tfp410_destroy(mod); +	kfree(tfp410_mod); +	tilcdc_module_cleanup(mod);  	return ret;  }  static int tfp410_remove(struct platform_device *pdev)  { +	struct tilcdc_module *mod = dev_get_platdata(&pdev->dev); +	struct tfp410_module *tfp410_mod = to_tfp410_module(mod); + +	i2c_put_adapter(tfp410_mod->i2c); +	gpio_free(tfp410_mod->gpio); + +	tilcdc_module_cleanup(mod); +	kfree(tfp410_mod); +  	return 0;  }  |