diff options
Diffstat (limited to 'drivers/gpu/drm/exynos')
40 files changed, 324 insertions, 812 deletions
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..ab37437bad8 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> 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..9df97714b6c 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> @@ -222,7 +208,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 +232,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..b9e51bc09e8 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_ 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..36c3905536a 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_g2d.c +++ b/drivers/gpu/drm/exynos/exynos_drm_g2d.c @@ -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..850e9950b7d 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_hdmi.c +++ b/drivers/gpu/drm/exynos/exynos_drm_hdmi.c @@ -385,7 +385,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 +413,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 +426,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..784a7e9a766 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_ 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..0bda96454a0 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 @@ -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..e9e83ef688f 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,12 +728,8 @@ 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;  } @@ -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..d0ca3c4e06c 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_vidi.c +++ b/drivers/gpu/drm/exynos/exynos_drm_vidi.c @@ -372,34 +372,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 +396,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) @@ -609,7 +581,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 +617,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 +655,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..41ff79d8ac8 100644 --- a/drivers/gpu/drm/exynos/exynos_hdmi.c +++ b/drivers/gpu/drm/exynos/exynos_hdmi.c @@ -2305,7 +2305,7 @@ static irqreturn_t hdmi_internal_irq_thread(int irq, void *arg)  	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 +2451,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; @@ -2607,7 +2607,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); @@ -2708,7 +2708,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..c187ea33b74 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" @@ -949,35 +950,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 +978,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 +1002,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 +1054,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 +1128,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 +1289,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,  };  |