diff options
Diffstat (limited to 'drivers/gpu/drm/exynos')
41 files changed, 426 insertions, 952 deletions
diff --git a/drivers/gpu/drm/exynos/Kconfig b/drivers/gpu/drm/exynos/Kconfig index 1d1f1e5e33f..046bcda36ab 100644 --- a/drivers/gpu/drm/exynos/Kconfig +++ b/drivers/gpu/drm/exynos/Kconfig @@ -24,7 +24,7 @@ config DRM_EXYNOS_DMABUF  config DRM_EXYNOS_FIMD  	bool "Exynos DRM FIMD" -	depends on DRM_EXYNOS && !FB_S3C +	depends on DRM_EXYNOS && !FB_S3C && !ARCH_MULTIPLATFORM  	help  	  Choose this option if you want to use Exynos FIMD for DRM. @@ -48,7 +48,7 @@ config DRM_EXYNOS_G2D  config DRM_EXYNOS_IPP  	bool "Exynos DRM IPP" -	depends on DRM_EXYNOS +	depends on DRM_EXYNOS && !ARCH_MULTIPLATFORM  	help  	  Choose this option if you want to use IPP feature for DRM. diff --git a/drivers/gpu/drm/exynos/exynos_ddc.c b/drivers/gpu/drm/exynos/exynos_ddc.c index bef43e0342a..4e9b5ba8edf 100644 --- a/drivers/gpu/drm/exynos/exynos_ddc.c +++ b/drivers/gpu/drm/exynos/exynos_ddc.c @@ -66,6 +66,6 @@ struct i2c_driver ddc_driver = {  	},  	.id_table	= ddc_idtable,  	.probe		= s5p_ddc_probe, -	.remove		= __devexit_p(s5p_ddc_remove), +	.remove		= s5p_ddc_remove,  	.command		= NULL,  }; diff --git a/drivers/gpu/drm/exynos/exynos_drm_buf.c b/drivers/gpu/drm/exynos/exynos_drm_buf.c index 9601bad47a2..57affae9568 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_buf.c +++ b/drivers/gpu/drm/exynos/exynos_drm_buf.c @@ -3,24 +3,10 @@   * Copyright (c) 2011 Samsung Electronics Co., Ltd.   * Author: Inki Dae <inki.dae@samsung.com>   * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL - * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR - * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, - * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. + * This program is free software; you can redistribute  it and/or modify it + * under  the terms of  the GNU General  Public License as published by the + * Free Software Foundation;  either version 2 of the  License, or (at your + * option) any later version.   */  #include <drm/drmP.h> @@ -29,6 +15,7 @@  #include "exynos_drm_drv.h"  #include "exynos_drm_gem.h"  #include "exynos_drm_buf.h" +#include "exynos_drm_iommu.h"  static int lowlevel_buffer_allocate(struct drm_device *dev,  		unsigned int flags, struct exynos_drm_gem_buf *buf) @@ -51,7 +38,7 @@ static int lowlevel_buffer_allocate(struct drm_device *dev,  	 * region will be allocated else physically contiguous  	 * as possible.  	 */ -	if (flags & EXYNOS_BO_CONTIG) +	if (!(flags & EXYNOS_BO_NONCONTIG))  		dma_set_attr(DMA_ATTR_FORCE_CONTIGUOUS, &buf->dma_attrs);  	/* @@ -66,14 +53,45 @@ static int lowlevel_buffer_allocate(struct drm_device *dev,  	dma_set_attr(attr, &buf->dma_attrs);  	dma_set_attr(DMA_ATTR_NO_KERNEL_MAPPING, &buf->dma_attrs); -	buf->pages = dma_alloc_attrs(dev->dev, buf->size, -			&buf->dma_addr, GFP_KERNEL, &buf->dma_attrs); -	if (!buf->pages) { -		DRM_ERROR("failed to allocate buffer.\n"); -		return -ENOMEM; +	nr_pages = buf->size >> PAGE_SHIFT; + +	if (!is_drm_iommu_supported(dev)) { +		dma_addr_t start_addr; +		unsigned int i = 0; + +		buf->pages = kzalloc(sizeof(struct page) * nr_pages, +					GFP_KERNEL); +		if (!buf->pages) { +			DRM_ERROR("failed to allocate pages.\n"); +			return -ENOMEM; +		} + +		buf->kvaddr = dma_alloc_attrs(dev->dev, buf->size, +					&buf->dma_addr, GFP_KERNEL, +					&buf->dma_attrs); +		if (!buf->kvaddr) { +			DRM_ERROR("failed to allocate buffer.\n"); +			kfree(buf->pages); +			return -ENOMEM; +		} + +		start_addr = buf->dma_addr; +		while (i < nr_pages) { +			buf->pages[i] = phys_to_page(start_addr); +			start_addr += PAGE_SIZE; +			i++; +		} +	} else { + +		buf->pages = dma_alloc_attrs(dev->dev, buf->size, +					&buf->dma_addr, GFP_KERNEL, +					&buf->dma_attrs); +		if (!buf->pages) { +			DRM_ERROR("failed to allocate buffer.\n"); +			return -ENOMEM; +		}  	} -	nr_pages = buf->size >> PAGE_SHIFT;  	buf->sgt = drm_prime_pages_to_sg(buf->pages, nr_pages);  	if (!buf->sgt) {  		DRM_ERROR("failed to get sg table.\n"); @@ -92,6 +110,9 @@ err_free_attrs:  			(dma_addr_t)buf->dma_addr, &buf->dma_attrs);  	buf->dma_addr = (dma_addr_t)NULL; +	if (!is_drm_iommu_supported(dev)) +		kfree(buf->pages); +  	return ret;  } @@ -114,8 +135,14 @@ static void lowlevel_buffer_deallocate(struct drm_device *dev,  	kfree(buf->sgt);  	buf->sgt = NULL; -	dma_free_attrs(dev->dev, buf->size, buf->pages, +	if (!is_drm_iommu_supported(dev)) { +		dma_free_attrs(dev->dev, buf->size, buf->kvaddr, +				(dma_addr_t)buf->dma_addr, &buf->dma_attrs); +		kfree(buf->pages); +	} else +		dma_free_attrs(dev->dev, buf->size, buf->pages,  				(dma_addr_t)buf->dma_addr, &buf->dma_attrs); +  	buf->dma_addr = (dma_addr_t)NULL;  } diff --git a/drivers/gpu/drm/exynos/exynos_drm_buf.h b/drivers/gpu/drm/exynos/exynos_drm_buf.h index 25cf1628503..a6412f19673 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_buf.h +++ b/drivers/gpu/drm/exynos/exynos_drm_buf.h @@ -3,24 +3,10 @@   * Copyright (c) 2011 Samsung Electronics Co., Ltd.   * Author: Inki Dae <inki.dae@samsung.com>   * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL - * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR - * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, - * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. + * This program is free software; you can redistribute  it and/or modify it + * under  the terms of  the GNU General  Public License as published by the + * Free Software Foundation;  either version 2 of the  License, or (at your + * option) any later version.   */  #ifndef _EXYNOS_DRM_BUF_H_ diff --git a/drivers/gpu/drm/exynos/exynos_drm_connector.c b/drivers/gpu/drm/exynos/exynos_drm_connector.c index 0f68a287267..4c5b6859c9e 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_connector.c +++ b/drivers/gpu/drm/exynos/exynos_drm_connector.c @@ -5,24 +5,10 @@   *	Joonyoung Shim <jy0922.shim@samsung.com>   *	Seung-Woo Kim <sw0312.kim@samsung.com>   * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL - * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR - * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, - * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. + * This program is free software; you can redistribute  it and/or modify it + * under  the terms of  the GNU General  Public License as published by the + * Free Software Foundation;  either version 2 of the  License, or (at your + * option) any later version.   */  #include <drm/drmP.h> @@ -32,7 +18,6 @@  #include "exynos_drm_drv.h"  #include "exynos_drm_encoder.h" -#define MAX_EDID 256  #define to_exynos_connector(x)	container_of(x, struct exynos_drm_connector,\  				drm_connector) @@ -110,7 +95,9 @@ static int exynos_drm_connector_get_modes(struct drm_connector *connector)  					to_exynos_connector(connector);  	struct exynos_drm_manager *manager = exynos_connector->manager;  	struct exynos_drm_display_ops *display_ops = manager->display_ops; -	unsigned int count; +	struct edid *edid = NULL; +	unsigned int count = 0; +	int ret;  	DRM_DEBUG_KMS("%s\n", __FILE__); @@ -128,27 +115,21 @@ static int exynos_drm_connector_get_modes(struct drm_connector *connector)  	 * because lcd panel has only one mode.  	 */  	if (display_ops->get_edid) { -		int ret; -		void *edid; - -		edid = kzalloc(MAX_EDID, GFP_KERNEL); -		if (!edid) { -			DRM_ERROR("failed to allocate edid\n"); -			return 0; +		edid = display_ops->get_edid(manager->dev, connector); +		if (IS_ERR_OR_NULL(edid)) { +			ret = PTR_ERR(edid); +			edid = NULL; +			DRM_ERROR("Panel operation get_edid failed %d\n", ret); +			goto out;  		} -		ret = display_ops->get_edid(manager->dev, connector, -						edid, MAX_EDID); -		if (ret < 0) { -			DRM_ERROR("failed to get edid data.\n"); -			kfree(edid); -			edid = NULL; -			return 0; +		count = drm_add_edid_modes(connector, edid); +		if (count < 0) { +			DRM_ERROR("Add edid modes failed %d\n", count); +			goto out;  		}  		drm_mode_connector_update_edid_property(connector, edid); -		count = drm_add_edid_modes(connector, edid); -		kfree(edid);  	} else {  		struct exynos_drm_panel_info *panel;  		struct drm_display_mode *mode = drm_mode_create(connector->dev); @@ -175,6 +156,8 @@ static int exynos_drm_connector_get_modes(struct drm_connector *connector)  		count = 1;  	} +out: +	kfree(edid);  	return count;  } diff --git a/drivers/gpu/drm/exynos/exynos_drm_connector.h b/drivers/gpu/drm/exynos/exynos_drm_connector.h index 22f6cc442c3..547c6b59035 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_connector.h +++ b/drivers/gpu/drm/exynos/exynos_drm_connector.h @@ -5,24 +5,10 @@   *	Joonyoung Shim <jy0922.shim@samsung.com>   *	Seung-Woo Kim <sw0312.kim@samsung.com>   * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL - * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR - * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, - * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. + * This program is free software; you can redistribute  it and/or modify it + * under  the terms of  the GNU General  Public License as published by the + * Free Software Foundation;  either version 2 of the  License, or (at your + * option) any later version.   */  #ifndef _EXYNOS_DRM_CONNECTOR_H_ diff --git a/drivers/gpu/drm/exynos/exynos_drm_core.c b/drivers/gpu/drm/exynos/exynos_drm_core.c index 94026ad76a7..4667c9f67ac 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_core.c +++ b/drivers/gpu/drm/exynos/exynos_drm_core.c @@ -6,24 +6,10 @@   *	Joonyoung Shim <jy0922.shim@samsung.com>   *	Seung-Woo Kim <sw0312.kim@samsung.com>   * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL - * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR - * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, - * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. + * This program is free software; you can redistribute  it and/or modify it + * under  the terms of  the GNU General  Public License as published by the + * Free Software Foundation;  either version 2 of the  License, or (at your + * option) any later version.   */  #include <drm/drmP.h> diff --git a/drivers/gpu/drm/exynos/exynos_drm_crtc.c b/drivers/gpu/drm/exynos/exynos_drm_crtc.c index 2efa4b031d7..e8894bc9e6d 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_crtc.c +++ b/drivers/gpu/drm/exynos/exynos_drm_crtc.c @@ -6,24 +6,10 @@   *	Joonyoung Shim <jy0922.shim@samsung.com>   *	Seung-Woo Kim <sw0312.kim@samsung.com>   * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL - * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR - * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, - * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. + * This program is free software; you can redistribute  it and/or modify it + * under  the terms of  the GNU General  Public License as published by the + * Free Software Foundation;  either version 2 of the  License, or (at your + * option) any later version.   */  #include <drm/drmP.h> @@ -407,3 +393,33 @@ void exynos_drm_crtc_disable_vblank(struct drm_device *dev, int crtc)  	exynos_drm_fn_encoder(private->crtc[crtc], &crtc,  			exynos_drm_disable_vblank);  } + +void exynos_drm_crtc_finish_pageflip(struct drm_device *dev, int crtc) +{ +	struct exynos_drm_private *dev_priv = dev->dev_private; +	struct drm_pending_vblank_event *e, *t; +	struct timeval now; +	unsigned long flags; + +	DRM_DEBUG_KMS("%s\n", __FILE__); + +	spin_lock_irqsave(&dev->event_lock, flags); + +	list_for_each_entry_safe(e, t, &dev_priv->pageflip_event_list, +			base.link) { +		/* if event's pipe isn't same as crtc then ignore it. */ +		if (crtc != e->pipe) +			continue; + +		do_gettimeofday(&now); +		e->event.sequence = 0; +		e->event.tv_sec = now.tv_sec; +		e->event.tv_usec = now.tv_usec; + +		list_move_tail(&e->base.link, &e->base.file_priv->event_list); +		wake_up_interruptible(&e->base.file_priv->event_wait); +		drm_vblank_put(dev, crtc); +	} + +	spin_unlock_irqrestore(&dev->event_lock, flags); +} diff --git a/drivers/gpu/drm/exynos/exynos_drm_crtc.h b/drivers/gpu/drm/exynos/exynos_drm_crtc.h index 6bae8d8c250..3e197e6ae7d 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_crtc.h +++ b/drivers/gpu/drm/exynos/exynos_drm_crtc.h @@ -6,24 +6,10 @@   *	Joonyoung Shim <jy0922.shim@samsung.com>   *	Seung-Woo Kim <sw0312.kim@samsung.com>   * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL - * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR - * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, - * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. + * This program is free software; you can redistribute  it and/or modify it + * under  the terms of  the GNU General  Public License as published by the + * Free Software Foundation;  either version 2 of the  License, or (at your + * option) any later version.   */  #ifndef _EXYNOS_DRM_CRTC_H_ @@ -32,5 +18,6 @@  int exynos_drm_crtc_create(struct drm_device *dev, unsigned int nr);  int exynos_drm_crtc_enable_vblank(struct drm_device *dev, int crtc);  void exynos_drm_crtc_disable_vblank(struct drm_device *dev, int crtc); +void exynos_drm_crtc_finish_pageflip(struct drm_device *dev, int crtc);  #endif diff --git a/drivers/gpu/drm/exynos/exynos_drm_dmabuf.c b/drivers/gpu/drm/exynos/exynos_drm_dmabuf.c index 61d5a8402eb..ba0a3aa7854 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_dmabuf.c +++ b/drivers/gpu/drm/exynos/exynos_drm_dmabuf.c @@ -3,24 +3,10 @@   * Copyright (c) 2012 Samsung Electronics Co., Ltd.   * Author: Inki Dae <inki.dae@samsung.com>   * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL - * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR - * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, - * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. + * This program is free software; you can redistribute  it and/or modify it + * under  the terms of  the GNU General  Public License as published by the + * Free Software Foundation;  either version 2 of the  License, or (at your + * option) any later version.   */  #include <drm/drmP.h> @@ -33,6 +19,7 @@  struct exynos_drm_dmabuf_attachment {  	struct sg_table sgt;  	enum dma_data_direction dir; +	bool is_mapped;  };  static int exynos_gem_attach_dma_buf(struct dma_buf *dmabuf, @@ -86,17 +73,10 @@ static struct sg_table *  	DRM_DEBUG_PRIME("%s\n", __FILE__); -	if (WARN_ON(dir == DMA_NONE)) -		return ERR_PTR(-EINVAL); -  	/* just return current sgt if already requested. */ -	if (exynos_attach->dir == dir) +	if (exynos_attach->dir == dir && exynos_attach->is_mapped)  		return &exynos_attach->sgt; -	/* reattaching is not allowed. */ -	if (WARN_ON(exynos_attach->dir != DMA_NONE)) -		return ERR_PTR(-EBUSY); -  	buf = gem_obj->buffer;  	if (!buf) {  		DRM_ERROR("buffer is null.\n"); @@ -121,13 +101,17 @@ static struct sg_table *  		wr = sg_next(wr);  	} -	nents = dma_map_sg(attach->dev, sgt->sgl, sgt->orig_nents, dir); -	if (!nents) { -		DRM_ERROR("failed to map sgl with iommu.\n"); -		sgt = ERR_PTR(-EIO); -		goto err_unlock; +	if (dir != DMA_NONE) { +		nents = dma_map_sg(attach->dev, sgt->sgl, sgt->orig_nents, dir); +		if (!nents) { +			DRM_ERROR("failed to map sgl with iommu.\n"); +			sg_free_table(sgt); +			sgt = ERR_PTR(-EIO); +			goto err_unlock; +		}  	} +	exynos_attach->is_mapped = true;  	exynos_attach->dir = dir;  	attach->priv = exynos_attach; @@ -222,7 +206,7 @@ struct dma_buf *exynos_dmabuf_prime_export(struct drm_device *drm_dev,  	struct exynos_drm_gem_obj *exynos_gem_obj = to_exynos_gem_obj(obj);  	return dma_buf_export(exynos_gem_obj, &exynos_dmabuf_ops, -				exynos_gem_obj->base.size, 0600); +				exynos_gem_obj->base.size, flags);  }  struct drm_gem_object *exynos_dmabuf_prime_import(struct drm_device *drm_dev, @@ -246,7 +230,12 @@ struct drm_gem_object *exynos_dmabuf_prime_import(struct drm_device *drm_dev,  		/* is it from our device? */  		if (obj->dev == drm_dev) { +			/* +			 * Importing dmabuf exported from out own gem increases +			 * refcount on gem itself instead of f_count of dmabuf. +			 */  			drm_gem_object_reference(obj); +			dma_buf_put(dma_buf);  			return obj;  		}  	} diff --git a/drivers/gpu/drm/exynos/exynos_drm_dmabuf.h b/drivers/gpu/drm/exynos/exynos_drm_dmabuf.h index 662a8f98ccd..49acfafb4fd 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_dmabuf.h +++ b/drivers/gpu/drm/exynos/exynos_drm_dmabuf.h @@ -3,24 +3,10 @@   * Copyright (c) 2012 Samsung Electronics Co., Ltd.   * Author: Inki Dae <inki.dae@samsung.com>   * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL - * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR - * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, - * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. + * This program is free software; you can redistribute  it and/or modify it + * under  the terms of  the GNU General  Public License as published by the + * Free Software Foundation;  either version 2 of the  License, or (at your + * option) any later version.   */  #ifndef _EXYNOS_DRM_DMABUF_H_ diff --git a/drivers/gpu/drm/exynos/exynos_drm_drv.c b/drivers/gpu/drm/exynos/exynos_drm_drv.c index e0a8e8024b0..3da5c2d214d 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_drv.c +++ b/drivers/gpu/drm/exynos/exynos_drm_drv.c @@ -5,24 +5,10 @@   *	Joonyoung Shim <jy0922.shim@samsung.com>   *	Seung-Woo Kim <sw0312.kim@samsung.com>   * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL - * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR - * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, - * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. + * This program is free software; you can redistribute  it and/or modify it + * under  the terms of  the GNU General  Public License as published by the + * Free Software Foundation;  either version 2 of the  License, or (at your + * option) any later version.   */  #include <drm/drmP.h> @@ -325,7 +311,7 @@ static int exynos_drm_platform_remove(struct platform_device *pdev)  static struct platform_driver exynos_drm_platform_driver = {  	.probe		= exynos_drm_platform_probe, -	.remove		= __devexit_p(exynos_drm_platform_remove), +	.remove		= exynos_drm_platform_remove,  	.driver		= {  		.owner	= THIS_MODULE,  		.name	= "exynos-drm", diff --git a/drivers/gpu/drm/exynos/exynos_drm_drv.h b/drivers/gpu/drm/exynos/exynos_drm_drv.h index f5a97745bf9..4606fac7241 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_drv.h +++ b/drivers/gpu/drm/exynos/exynos_drm_drv.h @@ -6,24 +6,10 @@   *	Joonyoung Shim <jy0922.shim@samsung.com>   *	Seung-Woo Kim <sw0312.kim@samsung.com>   * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL - * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR - * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, - * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. + * This program is free software; you can redistribute  it and/or modify it + * under  the terms of  the GNU General  Public License as published by the + * Free Software Foundation;  either version 2 of the  License, or (at your + * option) any later version.   */  #ifndef _EXYNOS_DRM_DRV_H_ @@ -162,8 +148,8 @@ struct exynos_drm_overlay {  struct exynos_drm_display_ops {  	enum exynos_drm_output_type type;  	bool (*is_connected)(struct device *dev); -	int (*get_edid)(struct device *dev, struct drm_connector *connector, -				u8 *edid, int len); +	struct edid *(*get_edid)(struct device *dev, +			struct drm_connector *connector);  	void *(*get_panel)(struct device *dev);  	int (*check_timing)(struct device *dev, void *timing);  	int (*power_on)(struct device *dev, int mode); diff --git a/drivers/gpu/drm/exynos/exynos_drm_encoder.c b/drivers/gpu/drm/exynos/exynos_drm_encoder.c index 301485215a7..c63721f64ae 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_encoder.c +++ b/drivers/gpu/drm/exynos/exynos_drm_encoder.c @@ -6,24 +6,10 @@   *	Joonyoung Shim <jy0922.shim@samsung.com>   *	Seung-Woo Kim <sw0312.kim@samsung.com>   * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL - * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR - * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, - * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. + * This program is free software; you can redistribute  it and/or modify it + * under  the terms of  the GNU General  Public License as published by the + * Free Software Foundation;  either version 2 of the  License, or (at your + * option) any later version.   */  #include <drm/drmP.h> diff --git a/drivers/gpu/drm/exynos/exynos_drm_encoder.h b/drivers/gpu/drm/exynos/exynos_drm_encoder.h index 88bb25a2a91..89e2fb0770a 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_encoder.h +++ b/drivers/gpu/drm/exynos/exynos_drm_encoder.h @@ -5,24 +5,10 @@   *	Joonyoung Shim <jy0922.shim@samsung.com>   *	Seung-Woo Kim <sw0312.kim@samsung.com>   * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL - * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR - * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, - * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. + * This program is free software; you can redistribute  it and/or modify it + * under  the terms of  the GNU General  Public License as published by the + * Free Software Foundation;  either version 2 of the  License, or (at your + * option) any later version.   */  #ifndef _EXYNOS_DRM_ENCODER_H_ diff --git a/drivers/gpu/drm/exynos/exynos_drm_fb.c b/drivers/gpu/drm/exynos/exynos_drm_fb.c index 5426cc5a5e8..294c0513f58 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_fb.c +++ b/drivers/gpu/drm/exynos/exynos_drm_fb.c @@ -6,24 +6,10 @@   *	Joonyoung Shim <jy0922.shim@samsung.com>   *	Seung-Woo Kim <sw0312.kim@samsung.com>   * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL - * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR - * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, - * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. + * This program is free software; you can redistribute  it and/or modify it + * under  the terms of  the GNU General  Public License as published by the + * Free Software Foundation;  either version 2 of the  License, or (at your + * option) any later version.   */  #include <drm/drmP.h> diff --git a/drivers/gpu/drm/exynos/exynos_drm_fb.h b/drivers/gpu/drm/exynos/exynos_drm_fb.h index 96262e54f76..517471b3756 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_fb.h +++ b/drivers/gpu/drm/exynos/exynos_drm_fb.h @@ -5,24 +5,10 @@   *	Joonyoung Shim <jy0922.shim@samsung.com>   *	Seung-Woo Kim <sw0312.kim@samsung.com>   * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL - * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR - * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, - * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. + * This program is free software; you can redistribute  it and/or modify it + * under  the terms of  the GNU General  Public License as published by the + * Free Software Foundation;  either version 2 of the  License, or (at your + * option) any later version.   */  #ifndef _EXYNOS_DRM_FB_H_ diff --git a/drivers/gpu/drm/exynos/exynos_drm_fbdev.c b/drivers/gpu/drm/exynos/exynos_drm_fbdev.c index f433eb7533a..71f867340a8 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_fbdev.c +++ b/drivers/gpu/drm/exynos/exynos_drm_fbdev.c @@ -6,24 +6,10 @@   *	Joonyoung Shim <jy0922.shim@samsung.com>   *	Seung-Woo Kim <sw0312.kim@samsung.com>   * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL - * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR - * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, - * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. + * This program is free software; you can redistribute  it and/or modify it + * under  the terms of  the GNU General  Public License as published by the + * Free Software Foundation;  either version 2 of the  License, or (at your + * option) any later version.   */  #include <drm/drmP.h> @@ -34,6 +20,7 @@  #include "exynos_drm_drv.h"  #include "exynos_drm_fb.h"  #include "exynos_drm_gem.h" +#include "exynos_drm_iommu.h"  #define MAX_CONNECTOR		4  #define PREFERRED_BPP		32 @@ -111,9 +98,18 @@ static int exynos_drm_fbdev_update(struct drm_fb_helper *helper,  	/* map pages with kernel virtual space. */  	if (!buffer->kvaddr) { -		unsigned int nr_pages = buffer->size >> PAGE_SHIFT; -		buffer->kvaddr = vmap(buffer->pages, nr_pages, VM_MAP, +		if (is_drm_iommu_supported(dev)) { +			unsigned int nr_pages = buffer->size >> PAGE_SHIFT; + +			buffer->kvaddr = vmap(buffer->pages, nr_pages, VM_MAP,  					pgprot_writecombine(PAGE_KERNEL)); +		} else { +			phys_addr_t dma_addr = buffer->dma_addr; +			if (dma_addr) +				buffer->kvaddr = phys_to_virt(dma_addr); +			else +				buffer->kvaddr = (void __iomem *)NULL; +		}  		if (!buffer->kvaddr) {  			DRM_ERROR("failed to map pages to kernel space.\n");  			return -EIO; @@ -128,8 +124,12 @@ static int exynos_drm_fbdev_update(struct drm_fb_helper *helper,  	dev->mode_config.fb_base = (resource_size_t)buffer->dma_addr;  	fbi->screen_base = buffer->kvaddr + offset; -	fbi->fix.smem_start = (unsigned long) +	if (is_drm_iommu_supported(dev)) +		fbi->fix.smem_start = (unsigned long)  			(page_to_phys(sg_page(buffer->sgt->sgl)) + offset); +	else +		fbi->fix.smem_start = (unsigned long)buffer->dma_addr; +  	fbi->screen_size = size;  	fbi->fix.smem_len = size; @@ -320,7 +320,7 @@ static void exynos_drm_fbdev_destroy(struct drm_device *dev,  	struct exynos_drm_gem_obj *exynos_gem_obj = exynos_fbd->exynos_gem_obj;  	struct drm_framebuffer *fb; -	if (exynos_gem_obj->buffer->kvaddr) +	if (is_drm_iommu_supported(dev) && exynos_gem_obj->buffer->kvaddr)  		vunmap(exynos_gem_obj->buffer->kvaddr);  	/* release drm framebuffer and real buffer */ diff --git a/drivers/gpu/drm/exynos/exynos_drm_fbdev.h b/drivers/gpu/drm/exynos/exynos_drm_fbdev.h index ccfce8a1a45..e16d7f0ae19 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_fbdev.h +++ b/drivers/gpu/drm/exynos/exynos_drm_fbdev.h @@ -6,24 +6,10 @@   *	Joonyoung Shim <jy0922.shim@samsung.com>   *	Seung-Woo Kim <sw0312.kim@samsung.com>   * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL - * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR - * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, - * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. + * This program is free software; you can redistribute  it and/or modify it + * under  the terms of  the GNU General  Public License as published by the + * Free Software Foundation;  either version 2 of the  License, or (at your + * option) any later version.   */  #ifndef _EXYNOS_DRM_FBDEV_H_ diff --git a/drivers/gpu/drm/exynos/exynos_drm_fimc.c b/drivers/gpu/drm/exynos/exynos_drm_fimc.c index 61ea24296b5..67a83e69544 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_fimc.c +++ b/drivers/gpu/drm/exynos/exynos_drm_fimc.c @@ -25,7 +25,7 @@  #include "exynos_drm_fimc.h"  /* - * FIMC is stand for Fully Interactive Mobile Camera and + * FIMC stands for Fully Interactive Mobile Camera and   * supports image scaler/rotator and input/output DMA operations.   * input DMA reads image data from the memory.   * output DMA writes image data to memory. @@ -163,19 +163,29 @@ struct fimc_context {  	bool	suspended;  }; -static void fimc_sw_reset(struct fimc_context *ctx, bool pattern) +static void fimc_sw_reset(struct fimc_context *ctx)  {  	u32 cfg; -	DRM_DEBUG_KMS("%s:pattern[%d]\n", __func__, pattern); +	DRM_DEBUG_KMS("%s\n", __func__); + +	/* stop dma operation */ +	cfg = fimc_read(EXYNOS_CISTATUS); +	if (EXYNOS_CISTATUS_GET_ENVID_STATUS(cfg)) { +		cfg = fimc_read(EXYNOS_MSCTRL); +		cfg &= ~EXYNOS_MSCTRL_ENVID; +		fimc_write(cfg, EXYNOS_MSCTRL); +	}  	cfg = fimc_read(EXYNOS_CISRCFMT);  	cfg |= EXYNOS_CISRCFMT_ITU601_8BIT; -	if (pattern) -		cfg |= EXYNOS_CIGCTRL_TESTPATTERN_COLOR_BAR; -  	fimc_write(cfg, EXYNOS_CISRCFMT); +	/* disable image capture */ +	cfg = fimc_read(EXYNOS_CIIMGCPT); +	cfg &= ~(EXYNOS_CIIMGCPT_IMGCPTEN_SC | EXYNOS_CIIMGCPT_IMGCPTEN); +	fimc_write(cfg, EXYNOS_CIIMGCPT); +  	/* s/w reset */  	cfg = fimc_read(EXYNOS_CIGCTRL);  	cfg |= (EXYNOS_CIGCTRL_SWRST); @@ -695,7 +705,7 @@ static int fimc_src_set_addr(struct device *dev,  {  	struct fimc_context *ctx = get_fimc_context(dev);  	struct exynos_drm_ippdrv *ippdrv = &ctx->ippdrv; -	struct drm_exynos_ipp_cmd_node *c_node = ippdrv->cmd; +	struct drm_exynos_ipp_cmd_node *c_node = ippdrv->c_node;  	struct drm_exynos_ipp_property *property;  	struct drm_exynos_ipp_config *config; @@ -705,10 +715,6 @@ static int fimc_src_set_addr(struct device *dev,  	}  	property = &c_node->property; -	if (!property) { -		DRM_ERROR("failed to get property.\n"); -		return -EINVAL; -	}  	DRM_DEBUG_KMS("%s:prop_id[%d]buf_id[%d]buf_type[%d]\n", __func__,  		property->prop_id, buf_id, buf_type); @@ -1206,7 +1212,7 @@ static int fimc_dst_set_buf_seq(struct fimc_context *ctx, u32 buf_id,  	}  	/* sequence id */ -	cfg &= (~mask); +	cfg &= ~mask;  	cfg |= (enable << buf_id);  	fimc_write(cfg, EXYNOS_CIFCNTSEQ); @@ -1231,7 +1237,7 @@ static int fimc_dst_set_addr(struct device *dev,  {  	struct fimc_context *ctx = get_fimc_context(dev);  	struct exynos_drm_ippdrv *ippdrv = &ctx->ippdrv; -	struct drm_exynos_ipp_cmd_node *c_node = ippdrv->cmd; +	struct drm_exynos_ipp_cmd_node *c_node = ippdrv->c_node;  	struct drm_exynos_ipp_property *property;  	struct drm_exynos_ipp_config *config; @@ -1241,10 +1247,6 @@ static int fimc_dst_set_addr(struct device *dev,  	}  	property = &c_node->property; -	if (!property) { -		DRM_ERROR("failed to get property.\n"); -		return -EINVAL; -	}  	DRM_DEBUG_KMS("%s:prop_id[%d]buf_id[%d]buf_type[%d]\n", __func__,  		property->prop_id, buf_id, buf_type); @@ -1317,7 +1319,7 @@ static irqreturn_t fimc_irq_handler(int irq, void *dev_id)  {  	struct fimc_context *ctx = dev_id;  	struct exynos_drm_ippdrv *ippdrv = &ctx->ippdrv; -	struct drm_exynos_ipp_cmd_node *c_node = ippdrv->cmd; +	struct drm_exynos_ipp_cmd_node *c_node = ippdrv->c_node;  	struct drm_exynos_ipp_event_work *event_work =  		c_node->event_work;  	int buf_id; @@ -1395,6 +1397,7 @@ static inline bool fimc_check_drm_flip(enum drm_exynos_flip flip)  	case EXYNOS_DRM_FLIP_NONE:  	case EXYNOS_DRM_FLIP_VERTICAL:  	case EXYNOS_DRM_FLIP_HORIZONTAL: +	case EXYNOS_DRM_FLIP_BOTH:  		return true;  	default:  		DRM_DEBUG_KMS("%s:invalid flip\n", __func__); @@ -1543,7 +1546,7 @@ static int fimc_ippdrv_reset(struct device *dev)  	DRM_DEBUG_KMS("%s\n", __func__);  	/* reset h/w block */ -	fimc_sw_reset(ctx, false); +	fimc_sw_reset(ctx);  	/* reset scaler capability */  	memset(&ctx->sc, 0x0, sizeof(ctx->sc)); @@ -1557,7 +1560,7 @@ static int fimc_ippdrv_start(struct device *dev, enum drm_exynos_ipp_cmd cmd)  {  	struct fimc_context *ctx = get_fimc_context(dev);  	struct exynos_drm_ippdrv *ippdrv = &ctx->ippdrv; -	struct drm_exynos_ipp_cmd_node *c_node = ippdrv->cmd; +	struct drm_exynos_ipp_cmd_node *c_node = ippdrv->c_node;  	struct drm_exynos_ipp_property *property;  	struct drm_exynos_ipp_config *config;  	struct drm_exynos_pos	img_pos[EXYNOS_DRM_OPS_MAX]; @@ -1573,10 +1576,6 @@ static int fimc_ippdrv_start(struct device *dev, enum drm_exynos_ipp_cmd cmd)  	}  	property = &c_node->property; -	if (!property) { -		DRM_ERROR("failed to get property.\n"); -		return -EINVAL; -	}  	fimc_handle_irq(ctx, true, false, true); @@ -1714,7 +1713,7 @@ static void fimc_ippdrv_stop(struct device *dev, enum drm_exynos_ipp_cmd cmd)  	fimc_write(cfg, EXYNOS_CIGCTRL);  } -static int __devinit fimc_probe(struct platform_device *pdev) +static int fimc_probe(struct platform_device *pdev)  {  	struct device *dev = &pdev->dev;  	struct fimc_context *ctx; @@ -1739,93 +1738,64 @@ static int __devinit fimc_probe(struct platform_device *pdev)  		platform_get_device_id(pdev)->driver_data;  	/* clock control */ -	ctx->sclk_fimc_clk = clk_get(dev, "sclk_fimc"); +	ctx->sclk_fimc_clk = devm_clk_get(dev, "sclk_fimc");  	if (IS_ERR(ctx->sclk_fimc_clk)) {  		dev_err(dev, "failed to get src fimc clock.\n"); -		ret = PTR_ERR(ctx->sclk_fimc_clk); -		goto err_ctx; +		return PTR_ERR(ctx->sclk_fimc_clk);  	}  	clk_enable(ctx->sclk_fimc_clk); -	ctx->fimc_clk = clk_get(dev, "fimc"); +	ctx->fimc_clk = devm_clk_get(dev, "fimc");  	if (IS_ERR(ctx->fimc_clk)) {  		dev_err(dev, "failed to get fimc clock.\n"); -		ret = PTR_ERR(ctx->fimc_clk);  		clk_disable(ctx->sclk_fimc_clk); -		clk_put(ctx->sclk_fimc_clk); -		goto err_ctx; +		return PTR_ERR(ctx->fimc_clk);  	} -	ctx->wb_clk = clk_get(dev, "pxl_async0"); +	ctx->wb_clk = devm_clk_get(dev, "pxl_async0");  	if (IS_ERR(ctx->wb_clk)) {  		dev_err(dev, "failed to get writeback a clock.\n"); -		ret = PTR_ERR(ctx->wb_clk);  		clk_disable(ctx->sclk_fimc_clk); -		clk_put(ctx->sclk_fimc_clk); -		clk_put(ctx->fimc_clk); -		goto err_ctx; +		return PTR_ERR(ctx->wb_clk);  	} -	ctx->wb_b_clk = clk_get(dev, "pxl_async1"); +	ctx->wb_b_clk = devm_clk_get(dev, "pxl_async1");  	if (IS_ERR(ctx->wb_b_clk)) {  		dev_err(dev, "failed to get writeback b clock.\n"); -		ret = PTR_ERR(ctx->wb_b_clk);  		clk_disable(ctx->sclk_fimc_clk); -		clk_put(ctx->sclk_fimc_clk); -		clk_put(ctx->fimc_clk); -		clk_put(ctx->wb_clk); -		goto err_ctx; +		return PTR_ERR(ctx->wb_b_clk);  	} -	parent_clk = clk_get(dev, ddata->parent_clk); +	parent_clk = devm_clk_get(dev, ddata->parent_clk);  	if (IS_ERR(parent_clk)) {  		dev_err(dev, "failed to get parent clock.\n"); -		ret = PTR_ERR(parent_clk);  		clk_disable(ctx->sclk_fimc_clk); -		clk_put(ctx->sclk_fimc_clk); -		clk_put(ctx->fimc_clk); -		clk_put(ctx->wb_clk); -		clk_put(ctx->wb_b_clk); -		goto err_ctx; +		return PTR_ERR(parent_clk);  	}  	if (clk_set_parent(ctx->sclk_fimc_clk, parent_clk)) {  		dev_err(dev, "failed to set parent.\n"); -		ret = -EINVAL; -		clk_put(parent_clk);  		clk_disable(ctx->sclk_fimc_clk); -		clk_put(ctx->sclk_fimc_clk); -		clk_put(ctx->fimc_clk); -		clk_put(ctx->wb_clk); -		clk_put(ctx->wb_b_clk); -		goto err_ctx; +		return -EINVAL;  	} -	clk_put(parent_clk); +	devm_clk_put(dev, parent_clk);  	clk_set_rate(ctx->sclk_fimc_clk, pdata->clk_rate);  	/* resource memory */  	ctx->regs_res = platform_get_resource(pdev, IORESOURCE_MEM, 0); -	if (!ctx->regs_res) { -		dev_err(dev, "failed to find registers.\n"); -		ret = -ENOENT; -		goto err_clk; -	} -  	ctx->regs = devm_request_and_ioremap(dev, ctx->regs_res);  	if (!ctx->regs) {  		dev_err(dev, "failed to map registers.\n"); -		ret = -ENXIO; -		goto err_clk; +		return -ENXIO;  	}  	/* resource irq */  	res = platform_get_resource(pdev, IORESOURCE_IRQ, 0);  	if (!res) {  		dev_err(dev, "failed to request irq resource.\n"); -		ret = -ENOENT; -		goto err_get_regs; +		return -ENOENT;  	}  	ctx->irq = res->start; @@ -1833,7 +1803,7 @@ static int __devinit fimc_probe(struct platform_device *pdev)  		IRQF_ONESHOT, "drm_fimc", ctx);  	if (ret < 0) {  		dev_err(dev, "failed to request irq.\n"); -		goto err_get_regs; +		return ret;  	}  	/* context initailization */ @@ -1879,19 +1849,11 @@ err_ippdrv_register:  	pm_runtime_disable(dev);  err_get_irq:  	free_irq(ctx->irq, ctx); -err_get_regs: -	devm_iounmap(dev, ctx->regs); -err_clk: -	clk_put(ctx->sclk_fimc_clk); -	clk_put(ctx->fimc_clk); -	clk_put(ctx->wb_clk); -	clk_put(ctx->wb_b_clk); -err_ctx: -	devm_kfree(dev, ctx); +  	return ret;  } -static int __devexit fimc_remove(struct platform_device *pdev) +static int fimc_remove(struct platform_device *pdev)  {  	struct device *dev = &pdev->dev;  	struct fimc_context *ctx = get_fimc_context(dev); @@ -1905,14 +1867,6 @@ static int __devexit fimc_remove(struct platform_device *pdev)  	pm_runtime_disable(dev);  	free_irq(ctx->irq, ctx); -	devm_iounmap(dev, ctx->regs); - -	clk_put(ctx->sclk_fimc_clk); -	clk_put(ctx->fimc_clk); -	clk_put(ctx->wb_clk); -	clk_put(ctx->wb_b_clk); - -	devm_kfree(dev, ctx);  	return 0;  } @@ -1990,7 +1944,7 @@ static const struct dev_pm_ops fimc_pm_ops = {  struct platform_driver fimc_driver = {  	.probe		= fimc_probe, -	.remove		= __devexit_p(fimc_remove), +	.remove		= fimc_remove,  	.id_table	= fimc_driver_ids,  	.driver		= {  		.name	= "exynos-drm-fimc", diff --git a/drivers/gpu/drm/exynos/exynos_drm_fimc.h b/drivers/gpu/drm/exynos/exynos_drm_fimc.h index dc970fa0d88..127a424c5fd 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_fimc.h +++ b/drivers/gpu/drm/exynos/exynos_drm_fimc.h @@ -6,24 +6,10 @@   *	Jinyoung Jeon <jy0.jeon@samsung.com>   *	Sangmin Lee <lsmin.lee@samsung.com>   * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL - * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR - * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, - * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. + * This program is free software; you can redistribute  it and/or modify it + * under  the terms of  the GNU General  Public License as published by the + * Free Software Foundation;  either version 2 of the  License, or (at your + * option) any later version.   */  #ifndef _EXYNOS_DRM_FIMC_H_ diff --git a/drivers/gpu/drm/exynos/exynos_drm_fimd.c b/drivers/gpu/drm/exynos/exynos_drm_fimd.c index bf0d9baca2b..9537761931e 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_fimd.c +++ b/drivers/gpu/drm/exynos/exynos_drm_fimd.c @@ -663,34 +663,6 @@ static struct exynos_drm_manager fimd_manager = {  	.display_ops	= &fimd_display_ops,  }; -static void fimd_finish_pageflip(struct drm_device *drm_dev, int crtc) -{ -	struct exynos_drm_private *dev_priv = drm_dev->dev_private; -	struct drm_pending_vblank_event *e, *t; -	struct timeval now; -	unsigned long flags; - -	spin_lock_irqsave(&drm_dev->event_lock, flags); - -	list_for_each_entry_safe(e, t, &dev_priv->pageflip_event_list, -			base.link) { -		/* if event's pipe isn't same as crtc then ignore it. */ -		if (crtc != e->pipe) -			continue; - -		do_gettimeofday(&now); -		e->event.sequence = 0; -		e->event.tv_sec = now.tv_sec; -		e->event.tv_usec = now.tv_usec; - -		list_move_tail(&e->base.link, &e->base.file_priv->event_list); -		wake_up_interruptible(&e->base.file_priv->event_wait); -		drm_vblank_put(drm_dev, crtc); -	} - -	spin_unlock_irqrestore(&drm_dev->event_lock, flags); -} -  static irqreturn_t fimd_irq_handler(int irq, void *dev_id)  {  	struct fimd_context *ctx = (struct fimd_context *)dev_id; @@ -710,7 +682,7 @@ static irqreturn_t fimd_irq_handler(int irq, void *dev_id)  		goto out;  	drm_handle_vblank(drm_dev, manager->pipe); -	fimd_finish_pageflip(drm_dev, manager->pipe); +	exynos_drm_crtc_finish_pageflip(drm_dev, manager->pipe);  	/* set wait vsync event to zero and wake up queue. */  	if (atomic_read(&ctx->wait_vsync_event)) { @@ -898,7 +870,7 @@ static int fimd_activate(struct fimd_context *ctx, bool enable)  	return 0;  } -static int __devinit fimd_probe(struct platform_device *pdev) +static int fimd_probe(struct platform_device *pdev)  {  	struct device *dev = &pdev->dev;  	struct fimd_context *ctx; @@ -997,7 +969,7 @@ static int __devinit fimd_probe(struct platform_device *pdev)  	return 0;  } -static int __devexit fimd_remove(struct platform_device *pdev) +static int fimd_remove(struct platform_device *pdev)  {  	struct device *dev = &pdev->dev;  	struct fimd_context *ctx = platform_get_drvdata(pdev); @@ -1046,7 +1018,7 @@ static int fimd_resume(struct device *dev)  	 * of pm runtime would still be 1 so in this case, fimd driver  	 * should be on directly not drawing on pm runtime interface.  	 */ -	if (pm_runtime_suspended(dev)) { +	if (!pm_runtime_suspended(dev)) {  		int ret;  		ret = fimd_activate(ctx, true); @@ -1105,7 +1077,7 @@ static const struct dev_pm_ops fimd_pm_ops = {  struct platform_driver fimd_driver = {  	.probe		= fimd_probe, -	.remove		= __devexit_p(fimd_remove), +	.remove		= fimd_remove,  	.id_table       = fimd_driver_ids,  	.driver		= {  		.name	= "exynos4-fb", diff --git a/drivers/gpu/drm/exynos/exynos_drm_g2d.c b/drivers/gpu/drm/exynos/exynos_drm_g2d.c index 6ffa0763c07..9a4c08e7453 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_g2d.c +++ b/drivers/gpu/drm/exynos/exynos_drm_g2d.c @@ -324,7 +324,7 @@ out:  	g2d_userptr = NULL;  } -dma_addr_t *g2d_userptr_get_dma_addr(struct drm_device *drm_dev, +static dma_addr_t *g2d_userptr_get_dma_addr(struct drm_device *drm_dev,  					unsigned long userptr,  					unsigned long size,  					struct drm_file *filp, @@ -1090,7 +1090,7 @@ static void g2d_close(struct drm_device *drm_dev, struct device *dev,  	kfree(file_priv->g2d_priv);  } -static int __devinit g2d_probe(struct platform_device *pdev) +static int g2d_probe(struct platform_device *pdev)  {  	struct device *dev = &pdev->dev;  	struct resource *res; @@ -1188,7 +1188,7 @@ err_destroy_slab:  	return ret;  } -static int __devexit g2d_remove(struct platform_device *pdev) +static int g2d_remove(struct platform_device *pdev)  {  	struct g2d_data *g2d = platform_get_drvdata(pdev); @@ -1242,7 +1242,7 @@ static SIMPLE_DEV_PM_OPS(g2d_pm_ops, g2d_suspend, g2d_resume);  struct platform_driver g2d_driver = {  	.probe		= g2d_probe, -	.remove		= __devexit_p(g2d_remove), +	.remove		= g2d_remove,  	.driver		= {  		.name	= "s5p-g2d",  		.owner	= THIS_MODULE, diff --git a/drivers/gpu/drm/exynos/exynos_drm_gem.c b/drivers/gpu/drm/exynos/exynos_drm_gem.c index d48183e7e05..47318077652 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_gem.c +++ b/drivers/gpu/drm/exynos/exynos_drm_gem.c @@ -3,24 +3,10 @@   * Copyright (c) 2011 Samsung Electronics Co., Ltd.   * Author: Inki Dae <inki.dae@samsung.com>   * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL - * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR - * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, - * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. + * This program is free software; you can redistribute  it and/or modify it + * under  the terms of  the GNU General  Public License as published by the + * Free Software Foundation;  either version 2 of the  License, or (at your + * option) any later version.   */  #include <drm/drmP.h> diff --git a/drivers/gpu/drm/exynos/exynos_drm_gem.h b/drivers/gpu/drm/exynos/exynos_drm_gem.h index f11f2afd5bf..35ebac47dc2 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_gem.h +++ b/drivers/gpu/drm/exynos/exynos_drm_gem.h @@ -3,24 +3,10 @@   * Copyright (c) 2011 Samsung Electronics Co., Ltd.   * Authoer: Inki Dae <inki.dae@samsung.com>   * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL - * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR - * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, - * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. + * This program is free software; you can redistribute  it and/or modify it + * under  the terms of  the GNU General  Public License as published by the + * Free Software Foundation;  either version 2 of the  License, or (at your + * option) any later version.   */  #ifndef _EXYNOS_DRM_GEM_H_ diff --git a/drivers/gpu/drm/exynos/exynos_drm_gsc.c b/drivers/gpu/drm/exynos/exynos_drm_gsc.c index 5639353d47b..8140753ec9c 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_gsc.c +++ b/drivers/gpu/drm/exynos/exynos_drm_gsc.c @@ -25,7 +25,7 @@  #include "exynos_drm_gsc.h"  /* - * GSC is stand for General SCaler and + * GSC stands for General SCaler and   * supports image scaler/rotator and input/output DMA operations.   * input DMA reads image data from the memory.   * output DMA writes image data to memory. @@ -711,7 +711,7 @@ static int gsc_src_set_addr(struct device *dev,  {  	struct gsc_context *ctx = get_gsc_context(dev);  	struct exynos_drm_ippdrv *ippdrv = &ctx->ippdrv; -	struct drm_exynos_ipp_cmd_node *c_node = ippdrv->cmd; +	struct drm_exynos_ipp_cmd_node *c_node = ippdrv->c_node;  	struct drm_exynos_ipp_property *property;  	if (!c_node) { @@ -720,10 +720,6 @@ static int gsc_src_set_addr(struct device *dev,  	}  	property = &c_node->property; -	if (!property) { -		DRM_ERROR("failed to get property.\n"); -		return -EFAULT; -	}  	DRM_DEBUG_KMS("%s:prop_id[%d]buf_id[%d]buf_type[%d]\n", __func__,  		property->prop_id, buf_id, buf_type); @@ -1171,7 +1167,7 @@ static int gsc_dst_set_addr(struct device *dev,  {  	struct gsc_context *ctx = get_gsc_context(dev);  	struct exynos_drm_ippdrv *ippdrv = &ctx->ippdrv; -	struct drm_exynos_ipp_cmd_node *c_node = ippdrv->cmd; +	struct drm_exynos_ipp_cmd_node *c_node = ippdrv->c_node;  	struct drm_exynos_ipp_property *property;  	if (!c_node) { @@ -1180,10 +1176,6 @@ static int gsc_dst_set_addr(struct device *dev,  	}  	property = &c_node->property; -	if (!property) { -		DRM_ERROR("failed to get property.\n"); -		return -EFAULT; -	}  	DRM_DEBUG_KMS("%s:prop_id[%d]buf_id[%d]buf_type[%d]\n", __func__,  		property->prop_id, buf_id, buf_type); @@ -1312,7 +1304,7 @@ static irqreturn_t gsc_irq_handler(int irq, void *dev_id)  {  	struct gsc_context *ctx = dev_id;  	struct exynos_drm_ippdrv *ippdrv = &ctx->ippdrv; -	struct drm_exynos_ipp_cmd_node *c_node = ippdrv->cmd; +	struct drm_exynos_ipp_cmd_node *c_node = ippdrv->c_node;  	struct drm_exynos_ipp_event_work *event_work =  		c_node->event_work;  	u32 status; @@ -1399,7 +1391,7 @@ static inline bool gsc_check_drm_flip(enum drm_exynos_flip flip)  	case EXYNOS_DRM_FLIP_NONE:  	case EXYNOS_DRM_FLIP_VERTICAL:  	case EXYNOS_DRM_FLIP_HORIZONTAL: -	case EXYNOS_DRM_FLIP_VERTICAL | EXYNOS_DRM_FLIP_HORIZONTAL: +	case EXYNOS_DRM_FLIP_BOTH:  		return true;  	default:  		DRM_DEBUG_KMS("%s:invalid flip\n", __func__); @@ -1549,7 +1541,7 @@ static int gsc_ippdrv_start(struct device *dev, enum drm_exynos_ipp_cmd cmd)  {  	struct gsc_context *ctx = get_gsc_context(dev);  	struct exynos_drm_ippdrv *ippdrv = &ctx->ippdrv; -	struct drm_exynos_ipp_cmd_node *c_node = ippdrv->cmd; +	struct drm_exynos_ipp_cmd_node *c_node = ippdrv->c_node;  	struct drm_exynos_ipp_property *property;  	struct drm_exynos_ipp_config *config;  	struct drm_exynos_pos	img_pos[EXYNOS_DRM_OPS_MAX]; @@ -1565,10 +1557,6 @@ static int gsc_ippdrv_start(struct device *dev, enum drm_exynos_ipp_cmd cmd)  	}  	property = &c_node->property; -	if (!property) { -		DRM_ERROR("failed to get property.\n"); -		return -EINVAL; -	}  	gsc_handle_irq(ctx, true, false, true); @@ -1604,7 +1592,7 @@ static int gsc_ippdrv_start(struct device *dev, enum drm_exynos_ipp_cmd cmd)  		exynos_drm_ippnb_send_event(IPP_SET_WRITEBACK, (void *)&set_wb);  		/* src local path */ -		cfg = readl(GSC_IN_CON); +		cfg = gsc_read(GSC_IN_CON);  		cfg &= ~(GSC_IN_PATH_MASK | GSC_IN_LOCAL_SEL_MASK);  		cfg |= (GSC_IN_PATH_LOCAL | GSC_IN_LOCAL_FIMD_WB);  		gsc_write(cfg, GSC_IN_CON); @@ -1683,7 +1671,7 @@ static void gsc_ippdrv_stop(struct device *dev, enum drm_exynos_ipp_cmd cmd)  	gsc_write(cfg, GSC_ENABLE);  } -static int __devinit gsc_probe(struct platform_device *pdev) +static int gsc_probe(struct platform_device *pdev)  {  	struct device *dev = &pdev->dev;  	struct gsc_context *ctx; @@ -1696,34 +1684,25 @@ static int __devinit gsc_probe(struct platform_device *pdev)  		return -ENOMEM;  	/* clock control */ -	ctx->gsc_clk = clk_get(dev, "gscl"); +	ctx->gsc_clk = devm_clk_get(dev, "gscl");  	if (IS_ERR(ctx->gsc_clk)) {  		dev_err(dev, "failed to get gsc clock.\n"); -		ret = PTR_ERR(ctx->gsc_clk); -		goto err_ctx; +		return PTR_ERR(ctx->gsc_clk);  	}  	/* resource memory */  	ctx->regs_res = platform_get_resource(pdev, IORESOURCE_MEM, 0); -	if (!ctx->regs_res) { -		dev_err(dev, "failed to find registers.\n"); -		ret = -ENOENT; -		goto err_clk; -	} -  	ctx->regs = devm_request_and_ioremap(dev, ctx->regs_res);  	if (!ctx->regs) {  		dev_err(dev, "failed to map registers.\n"); -		ret = -ENXIO; -		goto err_clk; +		return -ENXIO;  	}  	/* resource irq */  	res = platform_get_resource(pdev, IORESOURCE_IRQ, 0);  	if (!res) {  		dev_err(dev, "failed to request irq resource.\n"); -		ret = -ENOENT; -		goto err_get_regs; +		return -ENOENT;  	}  	ctx->irq = res->start; @@ -1731,7 +1710,7 @@ static int __devinit gsc_probe(struct platform_device *pdev)  		IRQF_ONESHOT, "drm_gsc", ctx);  	if (ret < 0) {  		dev_err(dev, "failed to request irq.\n"); -		goto err_get_regs; +		return ret;  	}  	/* context initailization */ @@ -1775,16 +1754,10 @@ err_ippdrv_register:  	pm_runtime_disable(dev);  err_get_irq:  	free_irq(ctx->irq, ctx); -err_get_regs: -	devm_iounmap(dev, ctx->regs); -err_clk: -	clk_put(ctx->gsc_clk); -err_ctx: -	devm_kfree(dev, ctx);  	return ret;  } -static int __devexit gsc_remove(struct platform_device *pdev) +static int gsc_remove(struct platform_device *pdev)  {  	struct device *dev = &pdev->dev;  	struct gsc_context *ctx = get_gsc_context(dev); @@ -1798,11 +1771,6 @@ static int __devexit gsc_remove(struct platform_device *pdev)  	pm_runtime_disable(dev);  	free_irq(ctx->irq, ctx); -	devm_iounmap(dev, ctx->regs); - -	clk_put(ctx->gsc_clk); - -	devm_kfree(dev, ctx);  	return 0;  } @@ -1860,7 +1828,7 @@ static const struct dev_pm_ops gsc_pm_ops = {  struct platform_driver gsc_driver = {  	.probe		= gsc_probe, -	.remove		= __devexit_p(gsc_remove), +	.remove		= gsc_remove,  	.driver		= {  		.name	= "exynos-drm-gsc",  		.owner	= THIS_MODULE, diff --git a/drivers/gpu/drm/exynos/exynos_drm_gsc.h b/drivers/gpu/drm/exynos/exynos_drm_gsc.h index b3c3bc618c0..29ec1c5efcf 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_gsc.h +++ b/drivers/gpu/drm/exynos/exynos_drm_gsc.h @@ -6,24 +6,10 @@   *	Jinyoung Jeon <jy0.jeon@samsung.com>   *	Sangmin Lee <lsmin.lee@samsung.com>   * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL - * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR - * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, - * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. + * This program is free software; you can redistribute  it and/or modify it + * under  the terms of  the GNU General  Public License as published by the + * Free Software Foundation;  either version 2 of the  License, or (at your + * option) any later version.   */  #ifndef _EXYNOS_DRM_GSC_H_ diff --git a/drivers/gpu/drm/exynos/exynos_drm_hdmi.c b/drivers/gpu/drm/exynos/exynos_drm_hdmi.c index 55793c46e3c..28644539b30 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_hdmi.c +++ b/drivers/gpu/drm/exynos/exynos_drm_hdmi.c @@ -108,18 +108,17 @@ static bool drm_hdmi_is_connected(struct device *dev)  	return false;  } -static int drm_hdmi_get_edid(struct device *dev, -		struct drm_connector *connector, u8 *edid, int len) +static struct edid *drm_hdmi_get_edid(struct device *dev, +			struct drm_connector *connector)  {  	struct drm_hdmi_context *ctx = to_context(dev);  	DRM_DEBUG_KMS("%s\n", __FILE__);  	if (hdmi_ops && hdmi_ops->get_edid) -		return hdmi_ops->get_edid(ctx->hdmi_ctx->ctx, connector, edid, -					  len); +		return hdmi_ops->get_edid(ctx->hdmi_ctx->ctx, connector); -	return 0; +	return NULL;  }  static int drm_hdmi_check_timing(struct device *dev, void *timing) @@ -385,7 +384,7 @@ static void hdmi_subdrv_remove(struct drm_device *drm_dev, struct device *dev)  		mixer_ops->iommu_on(ctx->mixer_ctx->ctx, false);  } -static int __devinit exynos_drm_hdmi_probe(struct platform_device *pdev) +static int exynos_drm_hdmi_probe(struct platform_device *pdev)  {  	struct device *dev = &pdev->dev;  	struct exynos_drm_subdrv *subdrv; @@ -413,7 +412,7 @@ static int __devinit exynos_drm_hdmi_probe(struct platform_device *pdev)  	return 0;  } -static int __devexit exynos_drm_hdmi_remove(struct platform_device *pdev) +static int exynos_drm_hdmi_remove(struct platform_device *pdev)  {  	struct drm_hdmi_context *ctx = platform_get_drvdata(pdev); @@ -426,7 +425,7 @@ static int __devexit exynos_drm_hdmi_remove(struct platform_device *pdev)  struct platform_driver exynos_drm_common_hdmi_driver = {  	.probe		= exynos_drm_hdmi_probe, -	.remove		= __devexit_p(exynos_drm_hdmi_remove), +	.remove		= exynos_drm_hdmi_remove,  	.driver		= {  		.name	= "exynos-drm-hdmi",  		.owner	= THIS_MODULE, diff --git a/drivers/gpu/drm/exynos/exynos_drm_hdmi.h b/drivers/gpu/drm/exynos/exynos_drm_hdmi.h index fcc3093ec8f..d80516fc9ed 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_hdmi.h +++ b/drivers/gpu/drm/exynos/exynos_drm_hdmi.h @@ -3,24 +3,10 @@   * Copyright (c) 2011 Samsung Electronics Co., Ltd.   * Authoer: Inki Dae <inki.dae@samsung.com>   * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL - * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR - * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, - * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. + * This program is free software; you can redistribute  it and/or modify it + * under  the terms of  the GNU General  Public License as published by the + * Free Software Foundation;  either version 2 of the  License, or (at your + * option) any later version.   */  #ifndef _EXYNOS_DRM_HDMI_H_ @@ -44,8 +30,8 @@ struct exynos_drm_hdmi_context {  struct exynos_hdmi_ops {  	/* display */  	bool (*is_connected)(void *ctx); -	int (*get_edid)(void *ctx, struct drm_connector *connector, -			u8 *edid, int len); +	struct edid *(*get_edid)(void *ctx, +			struct drm_connector *connector);  	int (*check_timing)(void *ctx, void *timing);  	int (*power_on)(void *ctx, int mode); diff --git a/drivers/gpu/drm/exynos/exynos_drm_iommu.c b/drivers/gpu/drm/exynos/exynos_drm_iommu.c index 2482b7f9634..3799d5c2b5d 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_iommu.c +++ b/drivers/gpu/drm/exynos/exynos_drm_iommu.c @@ -3,24 +3,10 @@   * Copyright (c) 2012 Samsung Electronics Co., Ltd.   * Author: Inki Dae <inki.dae@samsung.com>   * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL - * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR - * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, - * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. + * This program is free software; you can redistribute  it and/or modify it + * under  the terms of  the GNU General  Public License as published by the + * Free Software Foundation;  either version 2 of the  License, or (at your + * option) any later version.   */  #include <drmP.h> diff --git a/drivers/gpu/drm/exynos/exynos_drm_iommu.h b/drivers/gpu/drm/exynos/exynos_drm_iommu.h index 18a0ca190b9..53b7deea8ab 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_iommu.h +++ b/drivers/gpu/drm/exynos/exynos_drm_iommu.h @@ -3,24 +3,10 @@   * Copyright (c) 2012 Samsung Electronics Co., Ltd.   * Authoer: Inki Dae <inki.dae@samsung.com>   * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL - * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR - * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, - * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. + * This program is free software; you can redistribute  it and/or modify it + * under  the terms of  the GNU General  Public License as published by the + * Free Software Foundation;  either version 2 of the  License, or (at your + * option) any later version.   */  #ifndef _EXYNOS_DRM_IOMMU_H_ diff --git a/drivers/gpu/drm/exynos/exynos_drm_ipp.c b/drivers/gpu/drm/exynos/exynos_drm_ipp.c index 49eebe948ed..1a556354e92 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_ipp.c +++ b/drivers/gpu/drm/exynos/exynos_drm_ipp.c @@ -27,7 +27,7 @@  #include "exynos_drm_iommu.h"  /* - * IPP is stand for Image Post Processing and + * IPP stands for Image Post Processing and   * supports image scaler/rotator and input/output DMA operations.   * using FIMC, GSC, Rotator, so on.   * IPP is integration device driver of same attribute h/w @@ -869,7 +869,7 @@ static void ipp_put_event(struct drm_exynos_ipp_cmd_node *c_node,  	}  } -void ipp_handle_cmd_work(struct device *dev, +static void ipp_handle_cmd_work(struct device *dev,  		struct exynos_drm_ippdrv *ippdrv,  		struct drm_exynos_ipp_cmd_work *cmd_work,  		struct drm_exynos_ipp_cmd_node *c_node) @@ -1292,7 +1292,7 @@ static int ipp_start_property(struct exynos_drm_ippdrv *ippdrv,  	DRM_DEBUG_KMS("%s:prop_id[%d]\n", __func__, property->prop_id);  	/* store command info in ippdrv */ -	ippdrv->cmd = c_node; +	ippdrv->c_node = c_node;  	if (!ipp_check_mem_list(c_node)) {  		DRM_DEBUG_KMS("%s:empty memory.\n", __func__); @@ -1303,7 +1303,7 @@ static int ipp_start_property(struct exynos_drm_ippdrv *ippdrv,  	ret = ipp_set_property(ippdrv, property);  	if (ret) {  		DRM_ERROR("failed to set property.\n"); -		ippdrv->cmd = NULL; +		ippdrv->c_node = NULL;  		return ret;  	} @@ -1487,11 +1487,6 @@ void ipp_sched_cmd(struct work_struct *work)  	mutex_lock(&c_node->cmd_lock);  	property = &c_node->property; -	if (!property) { -		DRM_ERROR("failed to get property:prop_id[%d]\n", -			c_node->property.prop_id); -		goto err_unlock; -	}  	switch (cmd_work->ctrl) {  	case IPP_CTRL_PLAY: @@ -1704,7 +1699,7 @@ void ipp_sched_event(struct work_struct *work)  		return;  	} -	c_node = ippdrv->cmd; +	c_node = ippdrv->c_node;  	if (!c_node) {  		DRM_ERROR("failed to get command node.\n");  		return; @@ -1888,14 +1883,14 @@ err_clear:  	return;  } -static int __devinit ipp_probe(struct platform_device *pdev) +static int ipp_probe(struct platform_device *pdev)  {  	struct device *dev = &pdev->dev;  	struct ipp_context *ctx;  	struct exynos_drm_subdrv *subdrv;  	int ret; -	ctx = kzalloc(sizeof(*ctx), GFP_KERNEL); +	ctx = devm_kzalloc(&pdev->dev, sizeof(*ctx), GFP_KERNEL);  	if (!ctx)  		return -ENOMEM; @@ -1916,8 +1911,7 @@ static int __devinit ipp_probe(struct platform_device *pdev)  	ctx->event_workq = create_singlethread_workqueue("ipp_event");  	if (!ctx->event_workq) {  		dev_err(dev, "failed to create event workqueue\n"); -		ret = -EINVAL; -		goto err_clear; +		return -EINVAL;  	}  	/* @@ -1958,12 +1952,10 @@ err_cmd_workq:  	destroy_workqueue(ctx->cmd_workq);  err_event_workq:  	destroy_workqueue(ctx->event_workq); -err_clear: -	kfree(ctx);  	return ret;  } -static int __devexit ipp_remove(struct platform_device *pdev) +static int ipp_remove(struct platform_device *pdev)  {  	struct ipp_context *ctx = platform_get_drvdata(pdev); @@ -1985,8 +1977,6 @@ static int __devexit ipp_remove(struct platform_device *pdev)  	destroy_workqueue(ctx->cmd_workq);  	destroy_workqueue(ctx->event_workq); -	kfree(ctx); -  	return 0;  } @@ -2050,7 +2040,7 @@ static const struct dev_pm_ops ipp_pm_ops = {  struct platform_driver ipp_driver = {  	.probe		= ipp_probe, -	.remove		= __devexit_p(ipp_remove), +	.remove		= ipp_remove,  	.driver		= {  		.name	= "exynos-drm-ipp",  		.owner	= THIS_MODULE, diff --git a/drivers/gpu/drm/exynos/exynos_drm_ipp.h b/drivers/gpu/drm/exynos/exynos_drm_ipp.h index 28ffac95386..4cadbea7dbd 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_ipp.h +++ b/drivers/gpu/drm/exynos/exynos_drm_ipp.h @@ -6,24 +6,10 @@   *	Jinyoung Jeon <jy0.jeon@samsung.com>   *	Sangmin Lee <lsmin.lee@samsung.com>   * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL - * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR - * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, - * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. + * This program is free software; you can redistribute  it and/or modify it + * under  the terms of  the GNU General  Public License as published by the + * Free Software Foundation;  either version 2 of the  License, or (at your + * option) any later version.   */  #ifndef _EXYNOS_DRM_IPP_H_ @@ -160,7 +146,7 @@ struct exynos_drm_ipp_ops {   * @dedicated: dedicated ipp device.   * @ops: source, destination operations.   * @event_workq: event work queue. - * @cmd: current command information. + * @c_node: current command information.   * @cmd_list: list head for command information.   * @prop_list: property informations of current ipp driver.   * @check_property: check property about format, size, buffer. @@ -178,7 +164,7 @@ struct exynos_drm_ippdrv {  	bool	dedicated;  	struct exynos_drm_ipp_ops	*ops[EXYNOS_DRM_OPS_MAX];  	struct workqueue_struct	*event_workq; -	struct drm_exynos_ipp_cmd_node *cmd; +	struct drm_exynos_ipp_cmd_node *c_node;  	struct list_head	cmd_list;  	struct drm_exynos_ipp_prop_list *prop_list; diff --git a/drivers/gpu/drm/exynos/exynos_drm_rotator.c b/drivers/gpu/drm/exynos/exynos_drm_rotator.c index 1c2366083c7..f976e29def6 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_rotator.c +++ b/drivers/gpu/drm/exynos/exynos_drm_rotator.c @@ -139,7 +139,7 @@ static irqreturn_t rotator_irq_handler(int irq, void *arg)  {  	struct rot_context *rot = arg;  	struct exynos_drm_ippdrv *ippdrv = &rot->ippdrv; -	struct drm_exynos_ipp_cmd_node *c_node = ippdrv->cmd; +	struct drm_exynos_ipp_cmd_node *c_node = ippdrv->c_node;  	struct drm_exynos_ipp_event_work *event_work = c_node->event_work;  	enum rot_irq_status irq_status;  	u32 val; @@ -513,6 +513,7 @@ static inline bool rotator_check_drm_flip(enum drm_exynos_flip flip)  	case EXYNOS_DRM_FLIP_NONE:  	case EXYNOS_DRM_FLIP_VERTICAL:  	case EXYNOS_DRM_FLIP_HORIZONTAL: +	case EXYNOS_DRM_FLIP_BOTH:  		return true;  	default:  		DRM_DEBUG_KMS("%s:invalid flip\n", __func__); @@ -638,7 +639,7 @@ static int rotator_ippdrv_start(struct device *dev, enum drm_exynos_ipp_cmd cmd)  	return 0;  } -static int __devinit rotator_probe(struct platform_device *pdev) +static int rotator_probe(struct platform_device *pdev)  {  	struct device *dev = &pdev->dev;  	struct rot_context *rot; @@ -655,34 +656,26 @@ static int __devinit rotator_probe(struct platform_device *pdev)  				platform_get_device_id(pdev)->driver_data;  	rot->regs_res = platform_get_resource(pdev, IORESOURCE_MEM, 0); -	if (!rot->regs_res) { -		dev_err(dev, "failed to find registers\n"); -		ret = -ENOENT; -		goto err_get_resource; -	} -  	rot->regs = devm_request_and_ioremap(dev, rot->regs_res);  	if (!rot->regs) {  		dev_err(dev, "failed to map register\n"); -		ret = -ENXIO; -		goto err_get_resource; +		return -ENXIO;  	}  	rot->irq = platform_get_irq(pdev, 0);  	if (rot->irq < 0) {  		dev_err(dev, "failed to get irq\n"); -		ret = rot->irq; -		goto err_get_irq; +		return rot->irq;  	}  	ret = request_threaded_irq(rot->irq, NULL, rotator_irq_handler,  			IRQF_ONESHOT, "drm_rotator", rot);  	if (ret < 0) {  		dev_err(dev, "failed to request irq\n"); -		goto err_get_irq; +		return ret;  	} -	rot->clock = clk_get(dev, "rotator"); +	rot->clock = devm_clk_get(dev, "rotator");  	if (IS_ERR_OR_NULL(rot->clock)) {  		dev_err(dev, "failed to get clock\n");  		ret = PTR_ERR(rot->clock); @@ -720,17 +713,12 @@ static int __devinit rotator_probe(struct platform_device *pdev)  err_ippdrv_register:  	devm_kfree(dev, ippdrv->prop_list);  	pm_runtime_disable(dev); -	clk_put(rot->clock);  err_clk_get:  	free_irq(rot->irq, rot); -err_get_irq: -	devm_iounmap(dev, rot->regs); -err_get_resource: -	devm_kfree(dev, rot);  	return ret;  } -static int __devexit rotator_remove(struct platform_device *pdev) +static int rotator_remove(struct platform_device *pdev)  {  	struct device *dev = &pdev->dev;  	struct rot_context *rot = dev_get_drvdata(dev); @@ -740,17 +728,13 @@ static int __devexit rotator_remove(struct platform_device *pdev)  	exynos_drm_ippdrv_unregister(ippdrv);  	pm_runtime_disable(dev); -	clk_put(rot->clock);  	free_irq(rot->irq, rot); -	devm_iounmap(dev, rot->regs); - -	devm_kfree(dev, rot);  	return 0;  } -struct rot_limit_table rot_limit_tbl = { +static struct rot_limit_table rot_limit_tbl = {  	.ycbcr420_2p = {  		.min_w = 32,  		.min_h = 32, @@ -767,7 +751,7 @@ struct rot_limit_table rot_limit_tbl = {  	},  }; -struct platform_device_id rotator_driver_ids[] = { +static struct platform_device_id rotator_driver_ids[] = {  	{  		.name		= "exynos-rot",  		.driver_data	= (unsigned long)&rot_limit_tbl, @@ -845,7 +829,7 @@ static const struct dev_pm_ops rotator_pm_ops = {  struct platform_driver rotator_driver = {  	.probe		= rotator_probe, -	.remove		= __devexit_p(rotator_remove), +	.remove		= rotator_remove,  	.id_table	= rotator_driver_ids,  	.driver		= {  		.name	= "exynos-rot", diff --git a/drivers/gpu/drm/exynos/exynos_drm_rotator.h b/drivers/gpu/drm/exynos/exynos_drm_rotator.h index a2d7a14a52b..71a0b4c0c1e 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_rotator.h +++ b/drivers/gpu/drm/exynos/exynos_drm_rotator.h @@ -5,24 +5,10 @@   *	YoungJun Cho <yj44.cho@samsung.com>   *	Eunchul Kim <chulspro.kim@samsung.com>   * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL - * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR - * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, - * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. + * This program is free software; you can redistribute  it and/or modify it + * under  the terms of  the GNU General  Public License as published by the + * Free Software Foundation;  either version 2 of the  License, or (at your + * option) any later version.   */  #ifndef	_EXYNOS_DRM_ROTATOR_H_ diff --git a/drivers/gpu/drm/exynos/exynos_drm_vidi.c b/drivers/gpu/drm/exynos/exynos_drm_vidi.c index 99bfc38dfaa..13ccbd4bcfa 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_vidi.c +++ b/drivers/gpu/drm/exynos/exynos_drm_vidi.c @@ -98,10 +98,12 @@ static bool vidi_display_is_connected(struct device *dev)  	return ctx->connected ? true : false;  } -static int vidi_get_edid(struct device *dev, struct drm_connector *connector, -				u8 *edid, int len) +static struct edid *vidi_get_edid(struct device *dev, +			struct drm_connector *connector)  {  	struct vidi_context *ctx = get_vidi_context(dev); +	struct edid *edid; +	int edid_len;  	DRM_DEBUG_KMS("%s\n", __FILE__); @@ -111,13 +113,18 @@ static int vidi_get_edid(struct device *dev, struct drm_connector *connector,  	 */  	if (!ctx->raw_edid) {  		DRM_DEBUG_KMS("raw_edid is null.\n"); -		return -EFAULT; +		return ERR_PTR(-EFAULT);  	} -	memcpy(edid, ctx->raw_edid, min((1 + ctx->raw_edid->extensions) -					* EDID_LENGTH, len)); +	edid_len = (1 + ctx->raw_edid->extensions) * EDID_LENGTH; +	edid = kzalloc(edid_len, GFP_KERNEL); +	if (!edid) { +		DRM_DEBUG_KMS("failed to allocate edid\n"); +		return ERR_PTR(-ENOMEM); +	} -	return 0; +	memcpy(edid, ctx->raw_edid, edid_len); +	return edid;  }  static void *vidi_get_panel(struct device *dev) @@ -372,34 +379,6 @@ static struct exynos_drm_manager vidi_manager = {  	.display_ops	= &vidi_display_ops,  }; -static void vidi_finish_pageflip(struct drm_device *drm_dev, int crtc) -{ -	struct exynos_drm_private *dev_priv = drm_dev->dev_private; -	struct drm_pending_vblank_event *e, *t; -	struct timeval now; -	unsigned long flags; - -	spin_lock_irqsave(&drm_dev->event_lock, flags); - -	list_for_each_entry_safe(e, t, &dev_priv->pageflip_event_list, -			base.link) { -		/* if event's pipe isn't same as crtc then ignore it. */ -		if (crtc != e->pipe) -			continue; - -		do_gettimeofday(&now); -		e->event.sequence = 0; -		e->event.tv_sec = now.tv_sec; -		e->event.tv_usec = now.tv_usec; - -		list_move_tail(&e->base.link, &e->base.file_priv->event_list); -		wake_up_interruptible(&e->base.file_priv->event_wait); -		drm_vblank_put(drm_dev, crtc); -	} - -	spin_unlock_irqrestore(&drm_dev->event_lock, flags); -} -  static void vidi_fake_vblank_handler(struct work_struct *work)  {  	struct vidi_context *ctx = container_of(work, struct vidi_context, @@ -424,7 +403,7 @@ static void vidi_fake_vblank_handler(struct work_struct *work)  	mutex_unlock(&ctx->lock); -	vidi_finish_pageflip(subdrv->drm_dev, manager->pipe); +	exynos_drm_crtc_finish_pageflip(subdrv->drm_dev, manager->pipe);  }  static int vidi_subdrv_probe(struct drm_device *drm_dev, struct device *dev) @@ -542,7 +521,6 @@ int vidi_connection_ioctl(struct drm_device *drm_dev, void *data,  	struct exynos_drm_manager *manager;  	struct exynos_drm_display_ops *display_ops;  	struct drm_exynos_vidi_connection *vidi = data; -	struct edid *raw_edid;  	int edid_len;  	DRM_DEBUG_KMS("%s\n", __FILE__); @@ -579,11 +557,11 @@ int vidi_connection_ioctl(struct drm_device *drm_dev, void *data,  	}  	if (vidi->connection) { -		if (!vidi->edid) { -			DRM_DEBUG_KMS("edid data is null.\n"); +		struct edid *raw_edid  = (struct edid *)(uint32_t)vidi->edid; +		if (!drm_edid_is_valid(raw_edid)) { +			DRM_DEBUG_KMS("edid data is invalid.\n");  			return -EINVAL;  		} -		raw_edid = (struct edid *)(uint32_t)vidi->edid;  		edid_len = (1 + raw_edid->extensions) * EDID_LENGTH;  		ctx->raw_edid = kzalloc(edid_len, GFP_KERNEL);  		if (!ctx->raw_edid) { @@ -609,7 +587,7 @@ int vidi_connection_ioctl(struct drm_device *drm_dev, void *data,  	return 0;  } -static int __devinit vidi_probe(struct platform_device *pdev) +static int vidi_probe(struct platform_device *pdev)  {  	struct device *dev = &pdev->dev;  	struct vidi_context *ctx; @@ -645,7 +623,7 @@ static int __devinit vidi_probe(struct platform_device *pdev)  	return 0;  } -static int __devexit vidi_remove(struct platform_device *pdev) +static int vidi_remove(struct platform_device *pdev)  {  	struct vidi_context *ctx = platform_get_drvdata(pdev); @@ -683,7 +661,7 @@ static const struct dev_pm_ops vidi_pm_ops = {  struct platform_driver vidi_driver = {  	.probe		= vidi_probe, -	.remove		= __devexit_p(vidi_remove), +	.remove		= vidi_remove,  	.driver		= {  		.name	= "exynos-drm-vidi",  		.owner	= THIS_MODULE, diff --git a/drivers/gpu/drm/exynos/exynos_drm_vidi.h b/drivers/gpu/drm/exynos/exynos_drm_vidi.h index a4babe4e65d..1e5fdaa36cc 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_vidi.h +++ b/drivers/gpu/drm/exynos/exynos_drm_vidi.h @@ -3,24 +3,10 @@   * Copyright (c) 2012 Samsung Electronics Co., Ltd.   * Author: Inki Dae <inki.dae@samsung.com>   * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL - * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR - * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, - * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. + * This program is free software; you can redistribute  it and/or modify it + * under  the terms of  the GNU General  Public License as published by the + * Free Software Foundation;  either version 2 of the  License, or (at your + * option) any later version.   */  #ifndef _EXYNOS_DRM_VIDI_H_ diff --git a/drivers/gpu/drm/exynos/exynos_hdmi.c b/drivers/gpu/drm/exynos/exynos_hdmi.c index 2c46b6c0b82..fbab3c46860 100644 --- a/drivers/gpu/drm/exynos/exynos_hdmi.c +++ b/drivers/gpu/drm/exynos/exynos_hdmi.c @@ -34,7 +34,6 @@  #include <linux/regulator/consumer.h>  #include <linux/io.h>  #include <linux/of_gpio.h> -#include <plat/gpio-cfg.h>  #include <drm/exynos_drm.h> @@ -98,8 +97,7 @@ struct hdmi_context {  	void __iomem			*regs;  	void				*parent_ctx; -	int				external_irq; -	int				internal_irq; +	int				irq;  	struct i2c_client		*ddc_port;  	struct i2c_client		*hdmiphy_port; @@ -1391,8 +1389,7 @@ static bool hdmi_is_connected(void *ctx)  	return hdata->hpd;  } -static int hdmi_get_edid(void *ctx, struct drm_connector *connector, -				u8 *edid, int len) +static struct edid *hdmi_get_edid(void *ctx, struct drm_connector *connector)  {  	struct edid *raw_edid;  	struct hdmi_context *hdata = ctx; @@ -1400,22 +1397,18 @@ static int hdmi_get_edid(void *ctx, struct drm_connector *connector,  	DRM_DEBUG_KMS("[%d] %s\n", __LINE__, __func__);  	if (!hdata->ddc_port) -		return -ENODEV; +		return ERR_PTR(-ENODEV);  	raw_edid = drm_get_edid(connector, hdata->ddc_port->adapter); -	if (raw_edid) { -		hdata->dvi_mode = !drm_detect_hdmi_monitor(raw_edid); -		memcpy(edid, raw_edid, min((1 + raw_edid->extensions) -					* EDID_LENGTH, len)); -		DRM_DEBUG_KMS("%s : width[%d] x height[%d]\n", -			(hdata->dvi_mode ? "dvi monitor" : "hdmi monitor"), -			raw_edid->width_cm, raw_edid->height_cm); -		kfree(raw_edid); -	} else { -		return -ENODEV; -	} +	if (!raw_edid) +		return ERR_PTR(-ENODEV); -	return 0; +	hdata->dvi_mode = !drm_detect_hdmi_monitor(raw_edid); +	DRM_DEBUG_KMS("%s : width[%d] x height[%d]\n", +		(hdata->dvi_mode ? "dvi monitor" : "hdmi monitor"), +		raw_edid->width_cm, raw_edid->height_cm); + +	return raw_edid;  }  static int hdmi_v13_check_timing(struct fb_videomode *check_timing) @@ -1652,16 +1645,16 @@ static void hdmi_conf_reset(struct hdmi_context *hdata)  	/* resetting HDMI core */  	hdmi_reg_writemask(hdata, reg,  0, HDMI_CORE_SW_RSTOUT); -	mdelay(10); +	usleep_range(10000, 12000);  	hdmi_reg_writemask(hdata, reg, ~0, HDMI_CORE_SW_RSTOUT); -	mdelay(10); +	usleep_range(10000, 12000);  }  static void hdmi_conf_init(struct hdmi_context *hdata)  {  	struct hdmi_infoframe infoframe; -	/* disable HPD interrupts */ +	/* disable HPD interrupts from HDMI IP block, use GPIO instead */  	hdmi_reg_writemask(hdata, HDMI_INTC_CON, 0, HDMI_INTC_EN_GLOBAL |  		HDMI_INTC_EN_HPD_PLUG | HDMI_INTC_EN_HPD_UNPLUG); @@ -1779,7 +1772,7 @@ static void hdmi_v13_timing_apply(struct hdmi_context *hdata)  		u32 val = hdmi_reg_read(hdata, HDMI_V13_PHY_STATUS);  		if (val & HDMI_PHY_STATUS_READY)  			break; -		mdelay(1); +		usleep_range(1000, 2000);  	}  	/* steady state not achieved */  	if (tries == 0) { @@ -1946,7 +1939,7 @@ static void hdmi_v14_timing_apply(struct hdmi_context *hdata)  		u32 val = hdmi_reg_read(hdata, HDMI_PHY_STATUS_0);  		if (val & HDMI_PHY_STATUS_READY)  			break; -		mdelay(1); +		usleep_range(1000, 2000);  	}  	/* steady state not achieved */  	if (tries == 0) { @@ -1998,9 +1991,9 @@ static void hdmiphy_conf_reset(struct hdmi_context *hdata)  	/* reset hdmiphy */  	hdmi_reg_writemask(hdata, reg, ~0, HDMI_PHY_SW_RSTOUT); -	mdelay(10); +	usleep_range(10000, 12000);  	hdmi_reg_writemask(hdata, reg,  0, HDMI_PHY_SW_RSTOUT); -	mdelay(10); +	usleep_range(10000, 12000);  }  static void hdmiphy_poweron(struct hdmi_context *hdata) @@ -2048,7 +2041,7 @@ static void hdmiphy_conf_apply(struct hdmi_context *hdata)  		return;  	} -	mdelay(10); +	usleep_range(10000, 12000);  	/* operation mode */  	operation[0] = 0x1f; @@ -2170,6 +2163,13 @@ static void hdmi_commit(void *ctx)  	DRM_DEBUG_KMS("[%d] %s\n", __LINE__, __func__); +	mutex_lock(&hdata->hdmi_mutex); +	if (!hdata->powered) { +		mutex_unlock(&hdata->hdmi_mutex); +		return; +	} +	mutex_unlock(&hdata->hdmi_mutex); +  	hdmi_conf_apply(hdata);  } @@ -2265,7 +2265,7 @@ static struct exynos_hdmi_ops hdmi_ops = {  	.dpms		= hdmi_dpms,  }; -static irqreturn_t hdmi_external_irq_thread(int irq, void *arg) +static irqreturn_t hdmi_irq_thread(int irq, void *arg)  {  	struct exynos_drm_hdmi_context *ctx = arg;  	struct hdmi_context *hdata = ctx->ctx; @@ -2280,32 +2280,7 @@ static irqreturn_t hdmi_external_irq_thread(int irq, void *arg)  	return IRQ_HANDLED;  } -static irqreturn_t hdmi_internal_irq_thread(int irq, void *arg) -{ -	struct exynos_drm_hdmi_context *ctx = arg; -	struct hdmi_context *hdata = ctx->ctx; -	u32 intc_flag; - -	intc_flag = hdmi_reg_read(hdata, HDMI_INTC_FLAG); -	/* clearing flags for HPD plug/unplug */ -	if (intc_flag & HDMI_INTC_FLAG_HPD_UNPLUG) { -		DRM_DEBUG_KMS("unplugged\n"); -		hdmi_reg_writemask(hdata, HDMI_INTC_FLAG, ~0, -			HDMI_INTC_FLAG_HPD_UNPLUG); -	} -	if (intc_flag & HDMI_INTC_FLAG_HPD_PLUG) { -		DRM_DEBUG_KMS("plugged\n"); -		hdmi_reg_writemask(hdata, HDMI_INTC_FLAG, ~0, -			HDMI_INTC_FLAG_HPD_PLUG); -	} - -	if (ctx->drm_dev) -		drm_helper_hpd_irq_event(ctx->drm_dev); - -	return IRQ_HANDLED; -} - -static int __devinit hdmi_resources_init(struct hdmi_context *hdata) +static int hdmi_resources_init(struct hdmi_context *hdata)  {  	struct device *dev = hdata->dev;  	struct hdmi_resources *res = &hdata->res; @@ -2451,7 +2426,7 @@ static struct of_device_id hdmi_match_types[] = {  };  #endif -static int __devinit hdmi_probe(struct platform_device *pdev) +static int hdmi_probe(struct platform_device *pdev)  {  	struct device *dev = &pdev->dev;  	struct exynos_drm_hdmi_context *drm_hdmi_ctx; @@ -2555,39 +2530,24 @@ static int __devinit hdmi_probe(struct platform_device *pdev)  	hdata->hdmiphy_port = hdmi_hdmiphy; -	hdata->external_irq = gpio_to_irq(hdata->hpd_gpio); -	if (hdata->external_irq < 0) { -		DRM_ERROR("failed to get GPIO external irq\n"); -		ret = hdata->external_irq; -		goto err_hdmiphy; -	} - -	hdata->internal_irq = platform_get_irq(pdev, 0); -	if (hdata->internal_irq < 0) { -		DRM_ERROR("failed to get platform internal irq\n"); -		ret = hdata->internal_irq; +	hdata->irq = gpio_to_irq(hdata->hpd_gpio); +	if (hdata->irq < 0) { +		DRM_ERROR("failed to get GPIO irq\n"); +		ret = hdata->irq;  		goto err_hdmiphy;  	}  	hdata->hpd = gpio_get_value(hdata->hpd_gpio); -	ret = request_threaded_irq(hdata->external_irq, NULL, -			hdmi_external_irq_thread, IRQF_TRIGGER_RISING | +	ret = request_threaded_irq(hdata->irq, NULL, +			hdmi_irq_thread, IRQF_TRIGGER_RISING |  			IRQF_TRIGGER_FALLING | IRQF_ONESHOT, -			"hdmi_external", drm_hdmi_ctx); +			"hdmi", drm_hdmi_ctx);  	if (ret) { -		DRM_ERROR("failed to register hdmi external interrupt\n"); +		DRM_ERROR("failed to register hdmi interrupt\n");  		goto err_hdmiphy;  	} -	ret = request_threaded_irq(hdata->internal_irq, NULL, -			hdmi_internal_irq_thread, IRQF_ONESHOT, -			"hdmi_internal", drm_hdmi_ctx); -	if (ret) { -		DRM_ERROR("failed to register hdmi internal interrupt\n"); -		goto err_free_irq; -	} -  	/* Attach HDMI Driver to common hdmi. */  	exynos_hdmi_drv_attach(drm_hdmi_ctx); @@ -2598,8 +2558,6 @@ static int __devinit hdmi_probe(struct platform_device *pdev)  	return 0; -err_free_irq: -	free_irq(hdata->external_irq, drm_hdmi_ctx);  err_hdmiphy:  	i2c_del_driver(&hdmiphy_driver);  err_ddc: @@ -2607,7 +2565,7 @@ err_ddc:  	return ret;  } -static int __devexit hdmi_remove(struct platform_device *pdev) +static int hdmi_remove(struct platform_device *pdev)  {  	struct device *dev = &pdev->dev;  	struct exynos_drm_hdmi_context *ctx = platform_get_drvdata(pdev); @@ -2617,8 +2575,7 @@ static int __devexit hdmi_remove(struct platform_device *pdev)  	pm_runtime_disable(dev); -	free_irq(hdata->internal_irq, hdata); -	free_irq(hdata->external_irq, hdata); +	free_irq(hdata->irq, hdata);  	/* hdmiphy i2c driver */ @@ -2637,8 +2594,7 @@ static int hdmi_suspend(struct device *dev)  	DRM_DEBUG_KMS("[%d] %s\n", __LINE__, __func__); -	disable_irq(hdata->internal_irq); -	disable_irq(hdata->external_irq); +	disable_irq(hdata->irq);  	hdata->hpd = false;  	if (ctx->drm_dev) @@ -2663,8 +2619,7 @@ static int hdmi_resume(struct device *dev)  	hdata->hpd = gpio_get_value(hdata->hpd_gpio); -	enable_irq(hdata->external_irq); -	enable_irq(hdata->internal_irq); +	enable_irq(hdata->irq);  	if (!pm_runtime_suspended(dev)) {  		DRM_DEBUG_KMS("%s : Already resumed\n", __func__); @@ -2708,7 +2663,7 @@ static const struct dev_pm_ops hdmi_pm_ops = {  struct platform_driver hdmi_driver = {  	.probe		= hdmi_probe, -	.remove		= __devexit_p(hdmi_remove), +	.remove		= hdmi_remove,  	.id_table = hdmi_driver_types,  	.driver		= {  		.name	= "exynos-hdmi", diff --git a/drivers/gpu/drm/exynos/exynos_hdmi.h b/drivers/gpu/drm/exynos/exynos_hdmi.h index 1c3b6d8f1fe..0ddf3957de1 100644 --- a/drivers/gpu/drm/exynos/exynos_hdmi.h +++ b/drivers/gpu/drm/exynos/exynos_hdmi.h @@ -5,24 +5,10 @@   *	Inki Dae <inki.dae@samsung.com>   *	Seung-Woo Kim <sw0312.kim@samsung.com>   * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL - * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR - * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, - * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. + * This program is free software; you can redistribute  it and/or modify it + * under  the terms of  the GNU General  Public License as published by the + * Free Software Foundation;  either version 2 of the  License, or (at your + * option) any later version.   */  #ifndef _EXYNOS_HDMI_H_ diff --git a/drivers/gpu/drm/exynos/exynos_hdmiphy.c b/drivers/gpu/drm/exynos/exynos_hdmiphy.c index 6206056f4a3..ea49d132ecf 100644 --- a/drivers/gpu/drm/exynos/exynos_hdmiphy.c +++ b/drivers/gpu/drm/exynos/exynos_hdmiphy.c @@ -64,7 +64,7 @@ struct i2c_driver hdmiphy_driver = {  	},  	.id_table = hdmiphy_id,  	.probe		= hdmiphy_probe, -	.remove		= __devexit_p(hdmiphy_remove), +	.remove		= hdmiphy_remove,  	.command		= NULL,  };  EXPORT_SYMBOL(hdmiphy_driver); diff --git a/drivers/gpu/drm/exynos/exynos_mixer.c b/drivers/gpu/drm/exynos/exynos_mixer.c index 21db89530fc..c414584bfba 100644 --- a/drivers/gpu/drm/exynos/exynos_mixer.c +++ b/drivers/gpu/drm/exynos/exynos_mixer.c @@ -35,6 +35,7 @@  #include <drm/exynos_drm.h>  #include "exynos_drm_drv.h" +#include "exynos_drm_crtc.h"  #include "exynos_drm_hdmi.h"  #include "exynos_drm_iommu.h" @@ -599,7 +600,7 @@ static void vp_win_reset(struct mixer_context *ctx)  		/* waiting until VP_SRESET_PROCESSING is 0 */  		if (~vp_reg_read(res, VP_SRESET) & VP_SRESET_PROCESSING)  			break; -		mdelay(10); +		usleep_range(10000, 12000);  	}  	WARN(tries == 0, "failed to reset Video Processor\n");  } @@ -775,6 +776,13 @@ static void mixer_win_commit(void *ctx, int win)  	DRM_DEBUG_KMS("[%d] %s, win: %d\n", __LINE__, __func__, win); +	mutex_lock(&mixer_ctx->mixer_mutex); +	if (!mixer_ctx->powered) { +		mutex_unlock(&mixer_ctx->mixer_mutex); +		return; +	} +	mutex_unlock(&mixer_ctx->mixer_mutex); +  	if (win > 1 && mixer_ctx->vp_enabled)  		vp_video_buffer(mixer_ctx, win);  	else @@ -949,35 +957,6 @@ static struct exynos_mixer_ops mixer_ops = {  	.win_disable		= mixer_win_disable,  }; -/* for pageflip event */ -static void mixer_finish_pageflip(struct drm_device *drm_dev, int crtc) -{ -	struct exynos_drm_private *dev_priv = drm_dev->dev_private; -	struct drm_pending_vblank_event *e, *t; -	struct timeval now; -	unsigned long flags; - -	spin_lock_irqsave(&drm_dev->event_lock, flags); - -	list_for_each_entry_safe(e, t, &dev_priv->pageflip_event_list, -			base.link) { -		/* if event's pipe isn't same as crtc then ignore it. */ -		if (crtc != e->pipe) -			continue; - -		do_gettimeofday(&now); -		e->event.sequence = 0; -		e->event.tv_sec = now.tv_sec; -		e->event.tv_usec = now.tv_usec; - -		list_move_tail(&e->base.link, &e->base.file_priv->event_list); -		wake_up_interruptible(&e->base.file_priv->event_wait); -		drm_vblank_put(drm_dev, crtc); -	} - -	spin_unlock_irqrestore(&drm_dev->event_lock, flags); -} -  static irqreturn_t mixer_irq_handler(int irq, void *arg)  {  	struct exynos_drm_hdmi_context *drm_hdmi_ctx = arg; @@ -1006,7 +985,8 @@ static irqreturn_t mixer_irq_handler(int irq, void *arg)  		}  		drm_handle_vblank(drm_hdmi_ctx->drm_dev, ctx->pipe); -		mixer_finish_pageflip(drm_hdmi_ctx->drm_dev, ctx->pipe); +		exynos_drm_crtc_finish_pageflip(drm_hdmi_ctx->drm_dev, +				ctx->pipe);  		/* set wait vsync event to zero and wake up queue. */  		if (atomic_read(&ctx->wait_vsync_event)) { @@ -1029,8 +1009,8 @@ out:  	return IRQ_HANDLED;  } -static int __devinit mixer_resources_init(struct exynos_drm_hdmi_context *ctx, -				 struct platform_device *pdev) +static int mixer_resources_init(struct exynos_drm_hdmi_context *ctx, +				struct platform_device *pdev)  {  	struct mixer_context *mixer_ctx = ctx->ctx;  	struct device *dev = &pdev->dev; @@ -1081,8 +1061,8 @@ static int __devinit mixer_resources_init(struct exynos_drm_hdmi_context *ctx,  	return 0;  } -static int __devinit vp_resources_init(struct exynos_drm_hdmi_context *ctx, -				 struct platform_device *pdev) +static int vp_resources_init(struct exynos_drm_hdmi_context *ctx, +			     struct platform_device *pdev)  {  	struct mixer_context *mixer_ctx = ctx->ctx;  	struct device *dev = &pdev->dev; @@ -1155,7 +1135,7 @@ static struct of_device_id mixer_match_types[] = {  	}  }; -static int __devinit mixer_probe(struct platform_device *pdev) +static int mixer_probe(struct platform_device *pdev)  {  	struct device *dev = &pdev->dev;  	struct exynos_drm_hdmi_context *drm_hdmi_ctx; @@ -1316,6 +1296,6 @@ struct platform_driver mixer_driver = {  		.of_match_table = mixer_match_types,  	},  	.probe = mixer_probe, -	.remove = __devexit_p(mixer_remove), +	.remove = mixer_remove,  	.id_table	= mixer_driver_types,  };  |