From patchwork Mon Apr 29 14:50:50 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Rahul Sharma X-Patchwork-Id: 2500471 Return-Path: X-Original-To: patchwork-linux-samsung-soc@patchwork.kernel.org Delivered-To: patchwork-process-083081@patchwork2.kernel.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by patchwork2.kernel.org (Postfix) with ESMTP id 70F6FDF25A for ; Mon, 29 Apr 2013 14:27:31 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1757966Ab3D2O1a (ORCPT ); Mon, 29 Apr 2013 10:27:30 -0400 Received: from mailout1.samsung.com ([203.254.224.24]:54941 "EHLO mailout1.samsung.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1757827Ab3D2O1a (ORCPT ); Mon, 29 Apr 2013 10:27:30 -0400 Received: from epcpsbgr4.samsung.com (u144.gpu120.samsung.co.kr [203.254.230.144]) by mailout1.samsung.com (Oracle Communications Messaging Server 7u4-24.01 (7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTP id <0MM000F0GTHSE210@mailout1.samsung.com> for linux-samsung-soc@vger.kernel.org; Mon, 29 Apr 2013 23:27:28 +0900 (KST) Received: from epcpsbgm2.samsung.com ( [172.20.52.125]) by epcpsbgr4.samsung.com (EPCPMTA) with SMTP id 19.DF.04074.0538E715; Mon, 29 Apr 2013 23:27:28 +0900 (KST) X-AuditID: cbfee690-b7f136d000000fea-52-517e8350d5d3 Received: from epmmp2 ( [203.254.227.17]) by epcpsbgm2.samsung.com (EPCPMTA) with SMTP id CF.C8.01422.0538E715; Mon, 29 Apr 2013 23:27:28 +0900 (KST) Received: from chromeserver-PowerEdge-T410.sisodomain.com ([107.108.73.106]) by mmp2.samsung.com (Oracle Communications Messaging Server 7u4-24.01(7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTPA id <0MM0008Q3TEYJ640@mmp2.samsung.com>; Mon, 29 Apr 2013 23:27:28 +0900 (KST) From: Rahul Sharma To: dri-devel@lists.freedesktop.org, linux-samsung-soc@vger.kernel.org Cc: inki.dae@samsung.com, seanpaul@google.com, r.sh.open@gmail.com, sw0312.kim@samsung.com, joshi@samsung.com, Rahul Sharma Subject: [PATCH 1/4] drm/exynos: hdmi: move hdmi subsystem registration to drm common hdmi Date: Mon, 29 Apr 2013 20:20:50 +0530 Message-id: <1367247053-17105-2-git-send-email-rahul.sharma@samsung.com> X-Mailer: git-send-email 1.7.10.4 In-reply-to: <1367247053-17105-1-git-send-email-rahul.sharma@samsung.com> References: <1367247053-17105-1-git-send-email-rahul.sharma@samsung.com> X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFvrBLMWRmVeSWpSXmKPExsWyRsSkVjeguS7QYO5cYYsrX9+zWUy6P4HF 4vuuL+wWM87vY7JY+CLeYsqiw6wWcw/mWsyY/JLNgcNj56y77B4LNpV63O8+zuTRt2UVo8fn TXIBrFFcNimpOZllqUX6dglcGd1vf7AWrDarOPLoB3sD4xO9LkZODgkBE4mP5+YxQdhiEhfu rWfrYuTiEBJYyiix/N9kli5GDrCi9R/iIeLTGSVaP/axQzizmSTOLr/FCNLNJqArMfvgMzBb RMBNounwTFaQImaBWYwSd6Y0sIJMEhaIkXi+XAikhkVAVaLxwXNWEJtXwEPiylGYKxQlup9N YAOxOQU8Jb4+uMsCYgsB1ZzdsR3sOgmBVewSfbcWsUIMEpD4NvkQ1KWyEpsOMEPMkZQ4uOIG ywRG4QWMDKsYRVMLkguKk9KLTPSKE3OLS/PS9ZLzczcxAkP99L9nE3Yw3jtgfYgxGWjcRGYp 0eR8YKzklcQbGpsZWZiamBobmVuakSasJM6r3mIdKCSQnliSmp2aWpBaFF9UmpNafIiRiYNT qoGx+cHkku7F3pad51/V39Xf/LRnzmsflYiY+p7VT5pcLa/+ZxY4KP09JnWFYUSR0bELGZJa XHEaXaFWU5udEqPlf3L6bljDZhDx4fbSeSoe7r8+HdiYNqeuoVXzVUuzQcaJ1z3yqW83196z meS+40FbXoby3AJNq7n7hGRkmtfGP/512WbyrX9KLMUZiYZazEXFiQD1/idqiwIAAA== X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFrrKIsWRmVeSWpSXmKPExsVy+t9jQd2A5rpAg28d3BZXvr5ns5h0fwKL xfddX9gtZpzfx2Sx8EW8xZRFh1kt5h7MtZgx+SWbA4fHzll32T0WbCr1uN99nMmjb8sqRo/P m+QCWKMaGG0yUhNTUosUUvOS81My89JtlbyD453jTc0MDHUNLS3MlRTyEnNTbZVcfAJ03TJz gC5RUihLzCkFCgUkFhcr6dthmhAa4qZrAdMYoesbEgTXY2SABhLWMGZ0v/3BWrDarOLIox/s DYxP9LoYOTgkBEwk1n+I72LkBDLFJC7cW8/WxcjFISQwnVGi9WMfO4Qzm0ni7PJbjCBVbAK6 ErMPPgOzRQTcJJoOz2QFKWIWmMUocWdKAyvIVGGBGInny4VAalgEVCUaHzxnBbF5BTwkrhyd xwSxTVGi+9kENhCbU8BT4uuDuywgthBQzdkd29kmMPIuYGRYxSiaWpBcUJyUnmukV5yYW1ya l66XnJ+7iREcSc+kdzCuarA4xCjAwajEwxuwuTZQiDWxrLgy9xCjBAezkgjvlci6QCHelMTK qtSi/Pii0pzU4kOMyUBXTWSWEk3OB0Z5Xkm8obGJuamxqaWJhYmZJWnCSuK8B1utA4UE0hNL UrNTUwtSi2C2MHFwSjUwdoge/1T9Rfv1pKYr65rvuX90vGR15V76jlXf+9N/rl53dcbe5iXZ t29yR2pOuXi06rqh3p7k5W9vn9tZc3fVTQf7TGHj5gchNYKN8/ZnzrTYLnR8wbIlW9fumO7m tGXh6t1Tls6NuCNvwfRCaOvzx+/f7C85rWzRtqvVxG1b8/Iw5VlGn6ztP5xVYinOSDTUYi4q TgQAkwu+4egCAAA= DLP-Filter: Pass X-MTR: 20000000000000000@CPGS X-CFilter-Loop: Reflected Sender: linux-samsung-soc-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-samsung-soc@vger.kernel.org Exynos hdmi sub-system consists of mixer, hdmi ip, hdmi-phy and hdmi-ddc components. Currently, drivers for these components are getting registered in exynos_drm_drv.c, which is meant for registration of drm sub-drivers. In this patch, registration of drm hdmi sub-driver and device, drivers for hdmi sub-system components are moved to exynos_drm_hdmi.c. This ensures limited & relevant exposure of hdmi-sub-system components to exynos_drm_drv.c. It will also help in handling the hdmi-sub-system diversities within the exynos-common-hdmi. Signed-off-by: Rahul Sharma --- drivers/gpu/drm/exynos/exynos_drm_drv.c | 25 ++-------------- drivers/gpu/drm/exynos/exynos_drm_drv.h | 14 ++++----- drivers/gpu/drm/exynos/exynos_drm_hdmi.c | 46 ++++++++++++++++++++++++------ drivers/gpu/drm/exynos/exynos_drm_hdmi.h | 3 ++ 4 files changed, 49 insertions(+), 39 deletions(-) diff --git a/drivers/gpu/drm/exynos/exynos_drm_drv.c b/drivers/gpu/drm/exynos/exynos_drm_drv.c index ba6d995..4eabb6e 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_drv.c +++ b/drivers/gpu/drm/exynos/exynos_drm_drv.c @@ -331,19 +331,9 @@ static int __init exynos_drm_init(void) #endif #ifdef CONFIG_DRM_EXYNOS_HDMI - ret = platform_driver_register(&hdmi_driver); + ret = exynos_common_hdmi_register(); if (ret < 0) goto out_hdmi; - ret = platform_driver_register(&mixer_driver); - if (ret < 0) - goto out_mixer; - ret = platform_driver_register(&exynos_drm_common_hdmi_driver); - if (ret < 0) - goto out_common_hdmi; - - ret = exynos_platform_device_hdmi_register(); - if (ret < 0) - goto out_common_hdmi_dev; #endif #ifdef CONFIG_DRM_EXYNOS_VIDI @@ -436,13 +426,7 @@ out_vidi: #endif #ifdef CONFIG_DRM_EXYNOS_HDMI - exynos_platform_device_hdmi_unregister(); -out_common_hdmi_dev: - platform_driver_unregister(&exynos_drm_common_hdmi_driver); -out_common_hdmi: - platform_driver_unregister(&mixer_driver); -out_mixer: - platform_driver_unregister(&hdmi_driver); + exynos_common_hdmi_unregister(); out_hdmi: #endif @@ -483,10 +467,7 @@ static void __exit exynos_drm_exit(void) #endif #ifdef CONFIG_DRM_EXYNOS_HDMI - exynos_platform_device_hdmi_unregister(); - platform_driver_unregister(&exynos_drm_common_hdmi_driver); - platform_driver_unregister(&mixer_driver); - platform_driver_unregister(&hdmi_driver); + exynos_common_hdmi_unregister(); #endif #ifdef CONFIG_DRM_EXYNOS_VIDI diff --git a/drivers/gpu/drm/exynos/exynos_drm_drv.h b/drivers/gpu/drm/exynos/exynos_drm_drv.h index eaa1966..34aa36d 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_drv.h +++ b/drivers/gpu/drm/exynos/exynos_drm_drv.h @@ -319,15 +319,16 @@ int exynos_drm_subdrv_open(struct drm_device *dev, struct drm_file *file); void exynos_drm_subdrv_close(struct drm_device *dev, struct drm_file *file); /* - * this function registers exynos drm hdmi platform device. It ensures only one - * instance of the device is created. + * this function registers exynos drm hdmi platform driver and singleton + * device. It also registers subdrivers like mixer, hdmi and hdmiphy. */ -int exynos_platform_device_hdmi_register(void); +int exynos_common_hdmi_register(void); /* - * this function unregisters exynos drm hdmi platform device if it exists. + * this function unregisters exynos drm hdmi platform driver and device, + * subdrivers for mixer, hdmi and hdmiphy. */ -void exynos_platform_device_hdmi_unregister(void); +void exynos_common_hdmi_unregister(void); /* * this function registers exynos drm ipp platform device. @@ -340,9 +341,6 @@ int exynos_platform_device_ipp_register(void); void exynos_platform_device_ipp_unregister(void); extern struct platform_driver fimd_driver; -extern struct platform_driver hdmi_driver; -extern struct platform_driver mixer_driver; -extern struct platform_driver exynos_drm_common_hdmi_driver; extern struct platform_driver vidi_driver; extern struct platform_driver g2d_driver; extern struct platform_driver fimc_driver; diff --git a/drivers/gpu/drm/exynos/exynos_drm_hdmi.c b/drivers/gpu/drm/exynos/exynos_drm_hdmi.c index 060fbe8..7ab5f9f 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_hdmi.c +++ b/drivers/gpu/drm/exynos/exynos_drm_hdmi.c @@ -41,6 +41,8 @@ static struct exynos_drm_hdmi_context *mixer_ctx; static struct exynos_hdmi_ops *hdmi_ops; static struct exynos_mixer_ops *mixer_ops; +struct platform_driver exynos_drm_common_hdmi_driver; + struct drm_hdmi_context { struct exynos_drm_subdrv subdrv; struct exynos_drm_hdmi_context *hdmi_ctx; @@ -49,29 +51,55 @@ struct drm_hdmi_context { bool enabled[MIXER_WIN_NR]; }; -int exynos_platform_device_hdmi_register(void) +int exynos_common_hdmi_register(void) { struct platform_device *pdev; + int ret; if (exynos_drm_hdmi_pdev) return -EEXIST; + ret = platform_driver_register(&hdmi_driver); + if (ret < 0) + goto out_hdmi; + + ret = platform_driver_register(&mixer_driver); + if (ret < 0) + goto out_mixer; + + ret = platform_driver_register(&exynos_drm_common_hdmi_driver); + if (ret < 0) + goto out_common_hdmi; + pdev = platform_device_register_simple( "exynos-drm-hdmi", -1, NULL, 0); - if (IS_ERR(pdev)) - return PTR_ERR(pdev); + if (IS_ERR(pdev)) { + ret = PTR_ERR(pdev); + goto out_common_hdmi_dev; + } exynos_drm_hdmi_pdev = pdev; - return 0; + +out_common_hdmi_dev: + platform_driver_unregister(&exynos_drm_common_hdmi_driver); +out_common_hdmi: + platform_driver_unregister(&mixer_driver); +out_mixer: + platform_driver_unregister(&hdmi_driver); +out_hdmi: + return ret; } -void exynos_platform_device_hdmi_unregister(void) +void exynos_common_hdmi_unregister(void) { - if (exynos_drm_hdmi_pdev) { - platform_device_unregister(exynos_drm_hdmi_pdev); - exynos_drm_hdmi_pdev = NULL; - } + if (!exynos_drm_hdmi_pdev) + return; + platform_device_unregister(exynos_drm_hdmi_pdev); + platform_driver_unregister(&exynos_drm_common_hdmi_driver); + platform_driver_unregister(&mixer_driver); + platform_driver_unregister(&hdmi_driver); + exynos_drm_hdmi_pdev = NULL; } void exynos_hdmi_drv_attach(struct exynos_drm_hdmi_context *ctx) diff --git a/drivers/gpu/drm/exynos/exynos_drm_hdmi.h b/drivers/gpu/drm/exynos/exynos_drm_hdmi.h index 724cab1..8861b90 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_hdmi.h +++ b/drivers/gpu/drm/exynos/exynos_drm_hdmi.h @@ -60,6 +60,9 @@ struct exynos_mixer_ops { int (*check_mode)(void *ctx, struct drm_display_mode *mode); }; +extern struct platform_driver hdmi_driver; +extern struct platform_driver mixer_driver; + void exynos_hdmi_drv_attach(struct exynos_drm_hdmi_context *ctx); void exynos_mixer_drv_attach(struct exynos_drm_hdmi_context *ctx); void exynos_hdmi_ops_register(struct exynos_hdmi_ops *ops);