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

Commit dd383af6 authored by Linus Torvalds's avatar Linus Torvalds
Browse files

Merge branch 'drm-fixes' of git://people.freedesktop.org/~airlied/linux

Pull drm fixes from Dave Airlie:
 "I realise this a bit bigger than I would want at this point.

  Exynos is a large chunk, I got them to half what they wanted already,
  and hey its ARM based, so not going to hurt many people.

  Radeon has only two fixes, but the PLL fixes were a bit bigger, but
  required for a lot of scenarios, the fence fix is really urgent.

  vmwgfx: I've pulled in a dumb ioctl support patch that I was going to
  shove in later and cc stable, but we need it asap, its mainly to stop
  mesa growing a really ugly dependency in userspace to run stuff on
  vmware, and if I don't stick it in the kernel now, everyone will have
  to ship ugly userspace libs to workaround it.

  nouveau: single urgent fix found in F18 testing, causes X to not start
  properly when f18 plymouth is used

  i915: smattering of fixes and debug quieting

  gma500: single regression fix

  So as I said a bit large, but its fairly well scattered and its all
  stuff I'll be shipping in F18's 3.6 kernel."

* 'drm-fixes' of git://people.freedesktop.org/~airlied/linux: (26 commits)
  drm/nouveau: fix booting with plymouth + dumb support
  drm/radeon: make 64bit fences more robust v3
  drm/radeon: rework pll selection (v3)
  drm: Drop the NV12M and YUV420M formats
  drm/exynos: remove DRM_FORMAT_NV12M from plane module
  drm/exynos: fix double call of drm_prime_(init/destroy)_file_private
  drm/exynos: add dummy support for dmabuf-mmap
  drm/exynos: Add missing braces around sizeof in exynos_mixer.c
  drm/exynos: Add missing braces around sizeof in exynos_hdmi.c
  drm/exynos: Make g2d_pm_ops static
  drm/exynos: Add dependency for G2D in Kconfig
  drm/exynos: fixed page align bug.
  drm/exynos: Use ERR_CAST inlined function instead of ERR_PTR(PTR_ERR(.. [1]
  drm/exynos: Use devm_* functions in exynos_drm_g2d.c file
  drm/exynos: Use devm_kzalloc in exynos_drm_hdmi.c file
  drm/exynos: Use devm_kzalloc in exynos_drm_vidi.c file
  drm/exynos: Remove redundant check in exynos_drm_fimd.c file
  drm/exynos: Remove redundant check in exynos_hdmi.c file
  vmwgfx: add dumb ioctl support
  gma500: Fix regression on Oaktrail devices
  ...
parents 889cb3b9 610bd7da
Loading
Loading
Loading
Loading
+1 −1
Original line number Original line Diff line number Diff line
@@ -36,6 +36,6 @@ config DRM_EXYNOS_VIDI


config DRM_EXYNOS_G2D
config DRM_EXYNOS_G2D
	bool "Exynos DRM G2D"
	bool "Exynos DRM G2D"
	depends on DRM_EXYNOS
	depends on DRM_EXYNOS && !VIDEO_SAMSUNG_S5P_G2D
	help
	help
	  Choose this option if you want to use Exynos G2D for DRM.
	  Choose this option if you want to use Exynos G2D for DRM.
+7 −0
Original line number Original line Diff line number Diff line
@@ -163,6 +163,12 @@ static void exynos_gem_dmabuf_kunmap(struct dma_buf *dma_buf,
	/* TODO */
	/* TODO */
}
}


static int exynos_gem_dmabuf_mmap(struct dma_buf *dma_buf,
	struct vm_area_struct *vma)
{
	return -ENOTTY;
}

static struct dma_buf_ops exynos_dmabuf_ops = {
static struct dma_buf_ops exynos_dmabuf_ops = {
	.map_dma_buf		= exynos_gem_map_dma_buf,
	.map_dma_buf		= exynos_gem_map_dma_buf,
	.unmap_dma_buf		= exynos_gem_unmap_dma_buf,
	.unmap_dma_buf		= exynos_gem_unmap_dma_buf,
@@ -170,6 +176,7 @@ static struct dma_buf_ops exynos_dmabuf_ops = {
	.kmap_atomic		= exynos_gem_dmabuf_kmap_atomic,
	.kmap_atomic		= exynos_gem_dmabuf_kmap_atomic,
	.kunmap			= exynos_gem_dmabuf_kunmap,
	.kunmap			= exynos_gem_dmabuf_kunmap,
	.kunmap_atomic		= exynos_gem_dmabuf_kunmap_atomic,
	.kunmap_atomic		= exynos_gem_dmabuf_kunmap_atomic,
	.mmap			= exynos_gem_dmabuf_mmap,
	.release		= exynos_dmabuf_release,
	.release		= exynos_dmabuf_release,
};
};


+0 −2
Original line number Original line Diff line number Diff line
@@ -160,7 +160,6 @@ static int exynos_drm_open(struct drm_device *dev, struct drm_file *file)
	if (!file_priv)
	if (!file_priv)
		return -ENOMEM;
		return -ENOMEM;


	drm_prime_init_file_private(&file->prime);
	file->driver_priv = file_priv;
	file->driver_priv = file_priv;


	return exynos_drm_subdrv_open(dev, file);
	return exynos_drm_subdrv_open(dev, file);
@@ -184,7 +183,6 @@ static void exynos_drm_preclose(struct drm_device *dev,
			e->base.destroy(&e->base);
			e->base.destroy(&e->base);
		}
		}
	}
	}
	drm_prime_destroy_file_private(&file->prime);
	spin_unlock_irqrestore(&dev->event_lock, flags);
	spin_unlock_irqrestore(&dev->event_lock, flags);


	exynos_drm_subdrv_close(dev, file);
	exynos_drm_subdrv_close(dev, file);
+0 −5
Original line number Original line Diff line number Diff line
@@ -831,11 +831,6 @@ static int __devinit fimd_probe(struct platform_device *pdev)
	}
	}


	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
	if (!res) {
		dev_err(dev, "failed to find registers\n");
		ret = -ENOENT;
		goto err_clk;
	}


	ctx->regs = devm_request_and_ioremap(&pdev->dev, res);
	ctx->regs = devm_request_and_ioremap(&pdev->dev, res);
	if (!ctx->regs) {
	if (!ctx->regs) {
+11 −41
Original line number Original line Diff line number Diff line
@@ -129,7 +129,6 @@ struct g2d_runqueue_node {
struct g2d_data {
struct g2d_data {
	struct device			*dev;
	struct device			*dev;
	struct clk			*gate_clk;
	struct clk			*gate_clk;
	struct resource			*regs_res;
	void __iomem			*regs;
	void __iomem			*regs;
	int				irq;
	int				irq;
	struct workqueue_struct		*g2d_workq;
	struct workqueue_struct		*g2d_workq;
@@ -751,7 +750,7 @@ static int __devinit g2d_probe(struct platform_device *pdev)
	struct exynos_drm_subdrv *subdrv;
	struct exynos_drm_subdrv *subdrv;
	int ret;
	int ret;


	g2d = kzalloc(sizeof(*g2d), GFP_KERNEL);
	g2d = devm_kzalloc(&pdev->dev, sizeof(*g2d), GFP_KERNEL);
	if (!g2d) {
	if (!g2d) {
		dev_err(dev, "failed to allocate driver data\n");
		dev_err(dev, "failed to allocate driver data\n");
		return -ENOMEM;
		return -ENOMEM;
@@ -759,10 +758,8 @@ static int __devinit g2d_probe(struct platform_device *pdev)


	g2d->runqueue_slab = kmem_cache_create("g2d_runqueue_slab",
	g2d->runqueue_slab = kmem_cache_create("g2d_runqueue_slab",
			sizeof(struct g2d_runqueue_node), 0, 0, NULL);
			sizeof(struct g2d_runqueue_node), 0, 0, NULL);
	if (!g2d->runqueue_slab) {
	if (!g2d->runqueue_slab)
		ret = -ENOMEM;
		return -ENOMEM;
		goto err_free_mem;
	}


	g2d->dev = dev;
	g2d->dev = dev;


@@ -794,38 +791,26 @@ static int __devinit g2d_probe(struct platform_device *pdev)
	pm_runtime_enable(dev);
	pm_runtime_enable(dev);


	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
	if (!res) {
		dev_err(dev, "failed to get I/O memory\n");
		ret = -ENOENT;
		goto err_put_clk;
	}


	g2d->regs_res = request_mem_region(res->start, resource_size(res),
	g2d->regs = devm_request_and_ioremap(&pdev->dev, res);
					   dev_name(dev));
	if (!g2d->regs_res) {
		dev_err(dev, "failed to request I/O memory\n");
		ret = -ENOENT;
		goto err_put_clk;
	}

	g2d->regs = ioremap(res->start, resource_size(res));
	if (!g2d->regs) {
	if (!g2d->regs) {
		dev_err(dev, "failed to remap I/O memory\n");
		dev_err(dev, "failed to remap I/O memory\n");
		ret = -ENXIO;
		ret = -ENXIO;
		goto err_release_res;
		goto err_put_clk;
	}
	}


	g2d->irq = platform_get_irq(pdev, 0);
	g2d->irq = platform_get_irq(pdev, 0);
	if (g2d->irq < 0) {
	if (g2d->irq < 0) {
		dev_err(dev, "failed to get irq\n");
		dev_err(dev, "failed to get irq\n");
		ret = g2d->irq;
		ret = g2d->irq;
		goto err_unmap_base;
		goto err_put_clk;
	}
	}


	ret = request_irq(g2d->irq, g2d_irq_handler, 0, "drm_g2d", g2d);
	ret = devm_request_irq(&pdev->dev, g2d->irq, g2d_irq_handler, 0,
								"drm_g2d", g2d);
	if (ret < 0) {
	if (ret < 0) {
		dev_err(dev, "irq request failed\n");
		dev_err(dev, "irq request failed\n");
		goto err_unmap_base;
		goto err_put_clk;
	}
	}


	platform_set_drvdata(pdev, g2d);
	platform_set_drvdata(pdev, g2d);
@@ -838,7 +823,7 @@ static int __devinit g2d_probe(struct platform_device *pdev)
	ret = exynos_drm_subdrv_register(subdrv);
	ret = exynos_drm_subdrv_register(subdrv);
	if (ret < 0) {
	if (ret < 0) {
		dev_err(dev, "failed to register drm g2d device\n");
		dev_err(dev, "failed to register drm g2d device\n");
		goto err_free_irq;
		goto err_put_clk;
	}
	}


	dev_info(dev, "The exynos g2d(ver %d.%d) successfully probed\n",
	dev_info(dev, "The exynos g2d(ver %d.%d) successfully probed\n",
@@ -846,13 +831,6 @@ static int __devinit g2d_probe(struct platform_device *pdev)


	return 0;
	return 0;


err_free_irq:
	free_irq(g2d->irq, g2d);
err_unmap_base:
	iounmap(g2d->regs);
err_release_res:
	release_resource(g2d->regs_res);
	kfree(g2d->regs_res);
err_put_clk:
err_put_clk:
	pm_runtime_disable(dev);
	pm_runtime_disable(dev);
	clk_put(g2d->gate_clk);
	clk_put(g2d->gate_clk);
@@ -862,8 +840,6 @@ static int __devinit g2d_probe(struct platform_device *pdev)
	destroy_workqueue(g2d->g2d_workq);
	destroy_workqueue(g2d->g2d_workq);
err_destroy_slab:
err_destroy_slab:
	kmem_cache_destroy(g2d->runqueue_slab);
	kmem_cache_destroy(g2d->runqueue_slab);
err_free_mem:
	kfree(g2d);
	return ret;
	return ret;
}
}


@@ -873,24 +849,18 @@ static int __devexit g2d_remove(struct platform_device *pdev)


	cancel_work_sync(&g2d->runqueue_work);
	cancel_work_sync(&g2d->runqueue_work);
	exynos_drm_subdrv_unregister(&g2d->subdrv);
	exynos_drm_subdrv_unregister(&g2d->subdrv);
	free_irq(g2d->irq, g2d);


	while (g2d->runqueue_node) {
	while (g2d->runqueue_node) {
		g2d_free_runqueue_node(g2d, g2d->runqueue_node);
		g2d_free_runqueue_node(g2d, g2d->runqueue_node);
		g2d->runqueue_node = g2d_get_runqueue_node(g2d);
		g2d->runqueue_node = g2d_get_runqueue_node(g2d);
	}
	}


	iounmap(g2d->regs);
	release_resource(g2d->regs_res);
	kfree(g2d->regs_res);

	pm_runtime_disable(&pdev->dev);
	pm_runtime_disable(&pdev->dev);
	clk_put(g2d->gate_clk);
	clk_put(g2d->gate_clk);


	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);
	kfree(g2d);


	return 0;
	return 0;
}
}
@@ -924,7 +894,7 @@ static int g2d_resume(struct device *dev)
}
}
#endif
#endif


SIMPLE_DEV_PM_OPS(g2d_pm_ops, g2d_suspend, g2d_resume);
static SIMPLE_DEV_PM_OPS(g2d_pm_ops, g2d_suspend, g2d_resume);


struct platform_driver g2d_driver = {
struct platform_driver g2d_driver = {
	.probe		= g2d_probe,
	.probe		= g2d_probe,
Loading