From patchwork Mon Dec 31 16:03:05 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Sylwester Nawrocki/Kernel \\(PLT\\) /SRPOL/Staff Engineer/Samsung Electronics" X-Patchwork-Id: 1921561 Return-Path: X-Original-To: patchwork-linux-media@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 4963BDFF38 for ; Mon, 31 Dec 2012 16:04:01 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751414Ab2LaQD7 (ORCPT ); Mon, 31 Dec 2012 11:03:59 -0500 Received: from mailout3.samsung.com ([203.254.224.33]:63034 "EHLO mailout3.samsung.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751020Ab2LaQD6 (ORCPT ); Mon, 31 Dec 2012 11:03:58 -0500 Received: from epcpsbgm1.samsung.com (epcpsbgm1 [203.254.230.26]) by mailout3.samsung.com (Oracle Communications Messaging Server 7u4-24.01(7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTP id <0MFW004IRKLQG4C0@mailout3.samsung.com>; Tue, 01 Jan 2013 01:03:57 +0900 (KST) X-AuditID: cbfee61a-b7fa66d0000004cf-90-50e1b76d4d21 Received: from epmmp1.local.host ( [203.254.227.16]) by epcpsbgm1.samsung.com (EPCPMTA) with SMTP id ED.BA.01231.D67B1E05; Tue, 01 Jan 2013 01:03:57 +0900 (KST) Received: from amdc1344.digital.local ([106.116.147.32]) by mmp1.samsung.com (Oracle Communications Messaging Server 7u4-24.01 (7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTPA id <0MFW00BMQKLFE0A0@mmp1.samsung.com>; Tue, 01 Jan 2013 01:03:57 +0900 (KST) From: Sylwester Nawrocki To: linux-media@vger.kernel.org Cc: g.liakhovetski@gmx.de, grant.likely@secretlab.ca, rob.herring@calxeda.com, thomas.abraham@linaro.org, t.figa@samsung.com, sw0312.kim@samsung.com, kyungmin.park@samsung.com, devicetree-discuss@lists.ozlabs.org, linux-samsung-soc@vger.kernel.org, Sylwester Nawrocki Subject: [PATCH RFC v2 07/15] s5p-fimc: Support camera media device initialization on DT systems Date: Mon, 31 Dec 2012 17:03:05 +0100 Message-id: <1356969793-27268-8-git-send-email-s.nawrocki@samsung.com> X-Mailer: git-send-email 1.7.9.5 In-reply-to: <1356969793-27268-1-git-send-email-s.nawrocki@samsung.com> References: <1356969793-27268-1-git-send-email-s.nawrocki@samsung.com> X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFnrOJMWRmVeSWpSXmKPExsVy+t9jAd3c7Q8DDPr26lv0bNjKajHj/D4m ByaPz5vkAhijuGxSUnMyy1KL9O0SuDIuPb3GWDBDs+Lt1lWMDYy7lLoYOTkkBEwknj3dxQxh i0lcuLeerYuRi0NIYBGjxJXTL1kgnA4miTPzF7CBVLEJGEr0Hu1jBLFFBOQlnvTeAOtgFljF JDFj3xOwhLBAkkTX2TawsSwCqhK3+7+DxXkF3CQWPvoLNJUDaJ2CxJxJNiBhTgF3iW+vO5hA bCGgkl/f3rJOYORdwMiwilE0tSC5oDgpPddQrzgxt7g0L10vOT93EyPY+8+kdjCubLA4xCjA wajEw8vF9DBAiDWxrLgy9xCjBAezkghv0jKgEG9KYmVValF+fFFpTmrxIUZpDhYlcd5mj5QA IYH0xJLU7NTUgtQimCwTB6dUA2P780txV6ceq0sTkn8rvjDyZrUs+60qhVRnhRW5z9yfNvkI peW4Bsh9c5AwX9d1vH27iHDz988rv/dOFDgXnbT4XJfEpvNMc7jkpauDd/fdsFojoSLVZhn0 4Xujz/YpDG8uS+yZ8ctMJFZ6kz+LbdSGm/9ehhqyPtpzbSvre5Mfzziq63j2TVdiKc5INNRi LipOBADHDee6+gEAAA== Sender: linux-media-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-media@vger.kernel.org This patch add changes required for the main camera media device driver to be initialized on systems booted from the device tree. The platform devices corresponding to child dt nodes of the 'camera' node are looked up and and registered as sub-devices to the common media device. The main driver's probing is deferred if any of the sub-device drivers is not yet initialized and ready. An OF matching table is added for the main driver associated with the 'camera' node. Signed-off-by: Sylwester Nawrocki Signed-off-by: Kyungmin Park --- drivers/media/platform/s5p-fimc/fimc-core.c | 1 - drivers/media/platform/s5p-fimc/fimc-mdevice.c | 67 +++++++++++++++++++++--- drivers/media/platform/s5p-fimc/fimc-mdevice.h | 4 ++ 3 files changed, 65 insertions(+), 7 deletions(-) diff --git a/drivers/media/platform/s5p-fimc/fimc-core.c b/drivers/media/platform/s5p-fimc/fimc-core.c index e7eabb7..b02edac 100644 --- a/drivers/media/platform/s5p-fimc/fimc-core.c +++ b/drivers/media/platform/s5p-fimc/fimc-core.c @@ -1280,7 +1280,6 @@ static const struct platform_device_id fimc_driver_ids[] = { }, { }, }; -MODULE_DEVICE_TABLE(platform, fimc_driver_ids); static const struct of_device_id fimc_of_match[] __devinitconst = { { diff --git a/drivers/media/platform/s5p-fimc/fimc-mdevice.c b/drivers/media/platform/s5p-fimc/fimc-mdevice.c index bb73d17..105bb91 100644 --- a/drivers/media/platform/s5p-fimc/fimc-mdevice.c +++ b/drivers/media/platform/s5p-fimc/fimc-mdevice.c @@ -17,6 +17,8 @@ #include #include #include +#include +#include #include #include #include @@ -456,6 +458,43 @@ static int fimc_md_pdev_match(struct device *dev, void *data) return 0; } +/* Register FIMC, FIMC-LITE and CSIS media entities */ +#ifdef CONFIG_OF +static int fimc_md_register_of_platform_entities(struct fimc_md *fmd) +{ + struct device_node *node; + int ret = 0; + + for_each_available_child_of_node(fmd->pdev->dev.of_node, node) { + struct platform_device *pdev; + int plat_entity = -1; + + pdev = of_find_device_by_node(node); + if (!pdev) + return -ENODEV; + + /* If driver of any entity isn't ready try all again later. */ + if (!strcmp(node->name, CSIS_OF_NODE_NAME)) + plat_entity = IDX_CSIS; + else if (!strcmp(node->name, FIMC_LITE_OF_NODE_NAME)) + plat_entity = IDX_FLITE; + else if (!strcmp(node->name, FIMC_OF_NODE_NAME)) + plat_entity = IDX_FIMC; + + if (plat_entity >= 0) + ret = fimc_md_register_platform_entity(fmd, pdev, + plat_entity); + put_device(&pdev->dev); + if (ret < 0) + break; + } + + return ret; +} +#else +#define fimc_md_register_platform_entities(fmd) (-ENOSYS) +#endif + static void fimc_md_unregister_entities(struct fimc_md *fmd) { int i; @@ -928,8 +967,8 @@ static int fimc_md_probe(struct platform_device *pdev) v4l2_dev = &fmd->v4l2_dev; v4l2_dev->mdev = &fmd->media_dev; v4l2_dev->notify = fimc_sensor_notify; - snprintf(v4l2_dev->name, sizeof(v4l2_dev->name), "%s", - dev_name(&pdev->dev)); + strlcpy(v4l2_dev->name, "s5p-fimc-md", sizeof(v4l2_dev->name)); + ret = v4l2_device_register(&pdev->dev, &fmd->v4l2_dev); if (ret < 0) { @@ -950,8 +989,11 @@ static int fimc_md_probe(struct platform_device *pdev) /* Protect the media graph while we're registering entities */ mutex_lock(&fmd->media_dev.graph_mutex); - ret = bus_for_each_dev(&platform_bus_type, NULL, fmd, - fimc_md_pdev_match); + if (fmd->pdev->dev.of_node) + ret = fimc_md_register_of_platform_entities(fmd); + else + ret = bus_for_each_dev(&platform_bus_type, NULL, fmd, + fimc_md_pdev_match); if (ret) goto err_unlock; @@ -999,12 +1041,25 @@ static int __devexit fimc_md_remove(struct platform_device *pdev) return 0; } +static struct platform_device_id fimc_driver_ids[] __always_unused = { + { .name = "s5p-fimc-md" }, + { }, +}; +MODULE_DEVICE_TABLE(platform, fimc_driver_ids); + +static const struct of_device_id fimc_md_of_match[] __initconst = { + { .compatible = "samsung,fimc" }, + { }, +}; +MODULE_DEVICE_TABLE(of, fimc_md_of_match); + static struct platform_driver fimc_md_driver = { .probe = fimc_md_probe, .remove = __devexit_p(fimc_md_remove), .driver = { - .name = "s5p-fimc-md", - .owner = THIS_MODULE, + .of_match_table = fimc_md_of_match, + .name = "s5p-fimc-md", + .owner = THIS_MODULE, } }; diff --git a/drivers/media/platform/s5p-fimc/fimc-mdevice.h b/drivers/media/platform/s5p-fimc/fimc-mdevice.h index da7d992..1b7850c 100644 --- a/drivers/media/platform/s5p-fimc/fimc-mdevice.h +++ b/drivers/media/platform/s5p-fimc/fimc-mdevice.h @@ -21,6 +21,10 @@ #include "fimc-lite.h" #include "mipi-csis.h" +#define FIMC_OF_NODE_NAME "fimc" +#define FIMC_LITE_OF_NODE_NAME "fimc_lite" +#define CSIS_OF_NODE_NAME "csis" + /* Group IDs of sensor, MIPI-CSIS, FIMC-LITE and the writeback subdevs. */ #define GRP_ID_SENSOR (1 << 8) #define GRP_ID_FIMC_IS_SENSOR (1 << 9)