Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 2b54f781 authored by Dave Airlie's avatar Dave Airlie
Browse files

Merge branch 'drm/shmob' of git://linuxtv.org/pinchartl/fbdev into drm-next

Fixes for shmob + prime support

* 'drm/shmob' of git://linuxtv.org/pinchartl/fbdev:
  drm/shmobile: Enable compilation on all ARM platforms
  drm/shmobile: Add DRM PRIME support
  drm/shmobile: Use devm_* managed functions
  drm/shmobile: Minor typo fix in debug message
parents 4bf8e196 227c1fb2
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
config DRM_SHMOBILE
	tristate "DRM Support for SH Mobile"
	depends on DRM && (SUPERH || ARCH_SHMOBILE)
	depends on DRM && (ARM || SUPERH)
	select DRM_KMS_HELPER
	select DRM_KMS_CMA_HELPER
	select DRM_GEM_CMA_HELPER
+15 −20
Original line number Diff line number Diff line
@@ -90,7 +90,7 @@ static int shmob_drm_setup_clocks(struct shmob_drm_device *sdev,
		return -EINVAL;
	}

	clk = clk_get(sdev->dev, clkname);
	clk = devm_clk_get(sdev->dev, clkname);
	if (IS_ERR(clk)) {
		dev_err(sdev->dev, "cannot get dot clock %s\n", clkname);
		return PTR_ERR(clk);
@@ -106,21 +106,12 @@ static int shmob_drm_setup_clocks(struct shmob_drm_device *sdev,

static int shmob_drm_unload(struct drm_device *dev)
{
	struct shmob_drm_device *sdev = dev->dev_private;

	drm_kms_helper_poll_fini(dev);
	drm_mode_config_cleanup(dev);
	drm_vblank_cleanup(dev);
	drm_irq_uninstall(dev);

	if (sdev->clock)
		clk_put(sdev->clock);

	if (sdev->mmio)
		iounmap(sdev->mmio);

	dev->dev_private = NULL;
	kfree(sdev);

	return 0;
}
@@ -139,7 +130,7 @@ static int shmob_drm_load(struct drm_device *dev, unsigned long flags)
		return -EINVAL;
	}

	sdev = kzalloc(sizeof(*sdev), GFP_KERNEL);
	sdev = devm_kzalloc(&pdev->dev, sizeof(*sdev), GFP_KERNEL);
	if (sdev == NULL) {
		dev_err(dev->dev, "failed to allocate private data\n");
		return -ENOMEM;
@@ -156,29 +147,28 @@ static int shmob_drm_load(struct drm_device *dev, unsigned long flags)
	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
	if (res == NULL) {
		dev_err(&pdev->dev, "failed to get memory resource\n");
		ret = -EINVAL;
		goto done;
		return -EINVAL;
	}

	sdev->mmio = ioremap_nocache(res->start, resource_size(res));
	sdev->mmio = devm_ioremap_nocache(&pdev->dev, res->start,
					  resource_size(res));
	if (sdev->mmio == NULL) {
		dev_err(&pdev->dev, "failed to remap memory resource\n");
		ret = -ENOMEM;
		goto done;
		return -ENOMEM;
	}

	ret = shmob_drm_setup_clocks(sdev, pdata->clk_source);
	if (ret < 0)
		goto done;
		return ret;

	ret = shmob_drm_init_interface(sdev);
	if (ret < 0)
		goto done;
		return ret;

	ret = shmob_drm_modeset_init(sdev);
	if (ret < 0) {
		dev_err(&pdev->dev, "failed to initialize mode setting\n");
		goto done;
		return ret;
	}

	for (i = 0; i < 4; ++i) {
@@ -273,7 +263,8 @@ static const struct file_operations shmob_drm_fops = {
};

static struct drm_driver shmob_drm_driver = {
	.driver_features	= DRIVER_HAVE_IRQ | DRIVER_GEM | DRIVER_MODESET,
	.driver_features	= DRIVER_HAVE_IRQ | DRIVER_GEM | DRIVER_MODESET
				| DRIVER_PRIME,
	.load			= shmob_drm_load,
	.unload			= shmob_drm_unload,
	.preclose		= shmob_drm_preclose,
@@ -283,6 +274,10 @@ static struct drm_driver shmob_drm_driver = {
	.disable_vblank		= shmob_drm_disable_vblank,
	.gem_free_object	= drm_gem_cma_free_object,
	.gem_vm_ops		= &drm_gem_cma_vm_ops,
	.prime_handle_to_fd	= drm_gem_prime_handle_to_fd,
	.prime_fd_to_handle	= drm_gem_prime_fd_to_handle,
	.gem_prime_import	= drm_gem_cma_dmabuf_import,
	.gem_prime_export	= drm_gem_cma_dmabuf_export,
	.dumb_create		= drm_gem_cma_dumb_create,
	.dumb_map_offset	= drm_gem_cma_dumb_map_offset,
	.dumb_destroy		= drm_gem_cma_dumb_destroy,
+1 −1
Original line number Diff line number Diff line
@@ -116,7 +116,7 @@ shmob_drm_fb_create(struct drm_device *dev, struct drm_file *file_priv,
	}

	if (mode_cmd->pitches[0] & 7 || mode_cmd->pitches[0] >= 65536) {
		dev_dbg(dev->dev, "valid pitch value %u\n",
		dev_dbg(dev->dev, "invalid pitch value %u\n",
			mode_cmd->pitches[0]);
		return ERR_PTR(-EINVAL);
	}
+1 −6
Original line number Diff line number Diff line
@@ -221,11 +221,8 @@ static int shmob_drm_plane_disable(struct drm_plane *plane)

static void shmob_drm_plane_destroy(struct drm_plane *plane)
{
	struct shmob_drm_plane *splane = to_shmob_plane(plane);

	shmob_drm_plane_disable(plane);
	drm_plane_cleanup(plane);
	kfree(splane);
}

static const struct drm_plane_funcs shmob_drm_plane_funcs = {
@@ -251,7 +248,7 @@ int shmob_drm_plane_create(struct shmob_drm_device *sdev, unsigned int index)
	struct shmob_drm_plane *splane;
	int ret;

	splane = kzalloc(sizeof(*splane), GFP_KERNEL);
	splane = devm_kzalloc(sdev->dev, sizeof(*splane), GFP_KERNEL);
	if (splane == NULL)
		return -ENOMEM;

@@ -261,8 +258,6 @@ int shmob_drm_plane_create(struct shmob_drm_device *sdev, unsigned int index)
	ret = drm_plane_init(sdev->ddev, &splane->plane, 1,
			     &shmob_drm_plane_funcs, formats,
			     ARRAY_SIZE(formats), false);
	if (ret < 0)
		kfree(splane);

	return ret;
}