From patchwork Wed Nov 9 14:29:38 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Marek Szyprowski X-Patchwork-Id: 81504 Delivered-To: patch@linaro.org Received: by 10.140.97.165 with SMTP id m34csp225486qge; Wed, 9 Nov 2016 06:30:11 -0800 (PST) X-Received: by 10.98.192.148 with SMTP id g20mr33757736pfk.36.1478701811813; Wed, 09 Nov 2016 06:30:11 -0800 (PST) Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id f192si42353895pfa.60.2016.11.09.06.30.08; Wed, 09 Nov 2016 06:30:11 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-media-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-media-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-media-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753276AbcKIOaA (ORCPT + 4 others); Wed, 9 Nov 2016 09:30:00 -0500 Received: from mailout2.w1.samsung.com ([210.118.77.12]:11054 "EHLO mailout2.w1.samsung.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932867AbcKIO3z (ORCPT ); Wed, 9 Nov 2016 09:29:55 -0500 Received: from eucas1p2.samsung.com (unknown [182.198.249.207]) by mailout2.w1.samsung.com (Oracle Communications Messaging Server 7.0.5.31.0 64bit (built May 5 2014)) with ESMTP id <0OGD0021YPLSZA50@mailout2.w1.samsung.com>; Wed, 09 Nov 2016 14:29:52 +0000 (GMT) Received: from eusmges3.samsung.com (unknown [203.254.199.242]) by eucas1p2.samsung.com (KnoxPortal) with ESMTP id 20161109142951eucas1p2774afd9d9d14e9971b8f052ecb52cfdc~FZ3H3875j2663626636eucas1p2g; Wed, 9 Nov 2016 14:29:51 +0000 (GMT) Received: from eucas1p1.samsung.com ( [182.198.249.206]) by eusmges3.samsung.com (EUCPMTA) with SMTP id F3.CD.11330.FD233285; Wed, 9 Nov 2016 14:29:51 +0000 (GMT) Received: from eusmgms2.samsung.com (unknown [182.198.249.180]) by eucas1p2.samsung.com (KnoxPortal) with ESMTP id 20161109142951eucas1p25ea07a6d0ba507b26df345f3888b4539~FZ3HTOH5D2663626636eucas1p2d; Wed, 9 Nov 2016 14:29:51 +0000 (GMT) X-AuditID: cbfec7f2-f79556d000002c42-91-582332df33c4 Received: from eusync1.samsung.com ( [203.254.199.211]) by eusmgms2.samsung.com (EUCPMTA) with SMTP id 45.9E.10494.2C233285; Wed, 9 Nov 2016 14:29:22 +0000 (GMT) Received: from AMDC2765.digital.local ([106.116.147.25]) by eusync1.samsung.com (Oracle Communications Messaging Server 7.0.5.31.0 64bit (built May 5 2014)) with ESMTPA id <0OGD0093PPLM3080@eusync1.samsung.com>; Wed, 09 Nov 2016 14:29:50 +0000 (GMT) From: Marek Szyprowski To: linux-media@vger.kernel.org, linux-samsung-soc@vger.kernel.org Cc: Marek Szyprowski , Sylwester Nawrocki , Krzysztof Kozlowski , Bartlomiej Zolnierkiewicz , Javier Martinez Canillas Subject: [PATCH 2/2] exynos-gsc: Add support for Exynos5433 specific version Date: Wed, 09 Nov 2016 15:29:38 +0100 Message-id: <1478701778-29452-3-git-send-email-m.szyprowski@samsung.com> X-Mailer: git-send-email 1.9.1 In-reply-to: <1478701778-29452-1-git-send-email-m.szyprowski@samsung.com> X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFjrCIsWRmVeSWpSXmKPExsWy7djPc7r3jZQjDO7NUrHYOGM9q8Wbt2uY LM6f38Bu0bNhK6vFjPP7mCzWHrnLbnH4TTurA7vHplWdbB5b+u+ye/RtWcXo8XmTXABLFJdN SmpOZllqkb5dAlfGgb3sBf9NKi68OsnUwDhNu4uRk0NCwETi/I3DTBC2mMSFe+vZuhi5OIQE ljJKTF6/gwnC+cwocWjvLzaYjntT97NDJJYxSpz48BHKaWCS+Dx7HzNIFZuAoUTX2y6wDhEB J4mFs/6CFTELfGKUWLfuJViRsICPxLeXz9lBbBYBVYn/ZxaBxXkFPCS2XWtgh1gnJ3Hy2GRW EJtTwFPiQ8dTsEESAs/ZJL5PPAzkcAA5shKbDjBD1LtInOvZDWULS7w6vgVqjozE5cndLBB2 P6NEUys0AGYwSpx7ywthW0scPn4RbBezAJ/EpG3TmSHG80p0tAlBlHhINC56BzXGUeLyvL3Q 8JrDKNHc95JpAqPMAkaGVYwiqaXFuempxcZ6xYm5xaV56XrJ+bmbGIFxe/rf8U87GL+esDrE KMDBqMTD26GpHCHEmlhWXJl7iFGCg1lJhJcVGPVCvCmJlVWpRfnxRaU5qcWHGKU5WJTEefcs uBIuJJCeWJKanZpakFoEk2Xi4JRqYNyQv1WRXf1EW1XVycKVaW/3HWSZOevH4xn7/ua8er6J 8a5QW99FQ/1JgTwBTv+UWe36d+uzWayMecHucVX7WqVdoUgzz+nDR3eucOaZfsBC6dD5xsBd i1aIXLK4LBXeY95+7f2MP/sW93zt15m+I+2Tzk1un0b79vnyS620L5/RU/x24oLZ1DYlluKM REMt5qLiRAA7RMN71wIAAA== X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFnrCLMWRmVeSWpSXmKPExsVy+t/xy7qHjJQjDD4s47HYOGM9q8Wbt2uY LM6f38Bu0bNhK6vFjPP7mCzWHrnLbnH4TTurA7vHplWdbB5b+u+ye/RtWcXo8XmTXABLlJtN RmpiSmqRQmpecn5KZl66rVJoiJuuhZJCXmJuqq1ShK5vSJCSQlliTimQZ2SABhycA9yDlfTt EtwyDuxlL/hvUnHh1UmmBsZp2l2MnBwSAiYS96buZ4ewxSQu3FvP1sXIxSEksIRR4s7548wQ ThOTxOOpc1lBqtgEDCW63naxgdgiAk4SC2f9ZQcpYhb4wijxdd4OFpCEsICPxLeXz8HGsgio Svw/s4gZxOYV8JDYdq0Bap2cxMljk8GGcgp4SnzoeAoWFwKqudJ7h3UCI+8CRoZVjCKppcW5 6bnFRnrFibnFpXnpesn5uZsYgSG87djPLTsYu94FH2IU4GBU4uHt0FSOEGJNLCuuzD3EKMHB rCTC6wyMACHelMTKqtSi/Pii0pzU4kOMpkBHTWSWEk3OB8ZXXkm8oYmhuaWhkbGFhbmRkZI4 79QPV8KFBNITS1KzU1MLUotg+pg4OKUaGONW7PjBKLZX4Hx44CrfrTkNFXqF7n/7vnG+1ZgZ 6XrdLXSF2L5dvz6ZndpkusiFO2X6dmedz6WJKwxOHE1cLF65oPYhY0ZCVUw/5z2XGfe0PGM4 5ycXe2lnCGzK2PZrc0xXTXup8en5hzkXbstP/L5n2uki/j9TRXSDlF8eaJkXL1HiVfzfUYml OCPRUIu5qDgRAGopW7l3AgAA X-MTR: 20000000000000000@CPGS X-CMS-MailID: 20161109142951eucas1p25ea07a6d0ba507b26df345f3888b4539 X-Msg-Generator: CA X-Sender-IP: 182.198.249.180 X-Local-Sender: =?UTF-8?B?TWFyZWsgU3p5cHJvd3NraRtTUlBPTC1LZXJuZWwgKFRQKRs=?= =?UTF-8?B?7IK87ISx7KCE7J6QG1NlbmlvciBTb2Z0d2FyZSBFbmdpbmVlcg==?= X-Global-Sender: =?UTF-8?B?TWFyZWsgU3p5cHJvd3NraRtTUlBPTC1LZXJuZWwgKFRQKRtT?= =?UTF-8?B?YW1zdW5nIEVsZWN0cm9uaWNzG1NlbmlvciBTb2Z0d2FyZSBFbmdpbmVlcg==?= X-Sender-Code: =?UTF-8?B?QzEwG0VIURtDMTBDRDAyQ0QwMjczOTI=?= CMS-TYPE: 201P X-HopCount: 7 X-CMS-RootMailID: 20161109142951eucas1p25ea07a6d0ba507b26df345f3888b4539 X-RootMTR: 20161109142951eucas1p25ea07a6d0ba507b26df345f3888b4539 References: <1478701778-29452-1-git-send-email-m.szyprowski@samsung.com> Sender: linux-media-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-media@vger.kernel.org This patch add support for Exynos5433 specific version of GScaller module. The main difference is between Exynos 5433 and earlier is addition of new clocks that have to be controlled. Signed-off-by: Marek Szyprowski --- .../devicetree/bindings/media/exynos5-gsc.txt | 3 +- drivers/media/platform/exynos-gsc/gsc-core.c | 74 ++++++++++++++++------ drivers/media/platform/exynos-gsc/gsc-core.h | 6 +- 3 files changed, 62 insertions(+), 21 deletions(-) -- 1.9.1 -- To unsubscribe from this list: send the line "unsubscribe linux-media" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Acked-by: Krzysztof Kozlowski diff --git a/Documentation/devicetree/bindings/media/exynos5-gsc.txt b/Documentation/devicetree/bindings/media/exynos5-gsc.txt index 5fe9372..26ca25b 100644 --- a/Documentation/devicetree/bindings/media/exynos5-gsc.txt +++ b/Documentation/devicetree/bindings/media/exynos5-gsc.txt @@ -3,7 +3,8 @@ G-Scaler is used for scaling and color space conversion on EXYNOS5 SoCs. Required properties: -- compatible: should be "samsung,exynos5-gsc" +- compatible: should be "samsung,exynos5-gsc" (for Exynos 5250, 5420 and + 5422 SoCs) or "samsung,exynos5433-gsc" (Exynos 5433) - reg: should contain G-Scaler physical address location and length. - interrupts: should contain G-Scaler interrupt number diff --git a/drivers/media/platform/exynos-gsc/gsc-core.c b/drivers/media/platform/exynos-gsc/gsc-core.c index 664398c..827c1bb 100644 --- a/drivers/media/platform/exynos-gsc/gsc-core.c +++ b/drivers/media/platform/exynos-gsc/gsc-core.c @@ -29,8 +29,6 @@ #include "gsc-core.h" -#define GSC_CLOCK_GATE_NAME "gscl" - static const struct gsc_fmt gsc_formats[] = { { .name = "RGB565", @@ -965,6 +963,19 @@ static irqreturn_t gsc_irq_handler(int irq, void *priv) [3] = &gsc_v_100_variant, }, .num_entities = 4, + .clk_names = { "gscl" }, + .num_clocks = 1, +}; + +static struct gsc_driverdata gsc_5433_drvdata = { + .variant = { + [0] = &gsc_v_100_variant, + [1] = &gsc_v_100_variant, + [2] = &gsc_v_100_variant, + }, + .num_entities = 3, + .clk_names = { "pclk", "aclk", "aclk_xiu", "aclk_gsclbend" }, + .num_clocks = 4, }; static const struct of_device_id exynos_gsc_match[] = { @@ -972,6 +983,10 @@ static irqreturn_t gsc_irq_handler(int irq, void *priv) .compatible = "samsung,exynos5-gsc", .data = &gsc_v_100_drvdata, }, + { + .compatible = "samsung,exynos5433-gsc", + .data = &gsc_5433_drvdata, + }, {}, }; MODULE_DEVICE_TABLE(of, exynos_gsc_match); @@ -983,6 +998,7 @@ static int gsc_probe(struct platform_device *pdev) struct device *dev = &pdev->dev; const struct gsc_driverdata *drv_data = of_device_get_match_data(dev); int ret; + int i; gsc = devm_kzalloc(dev, sizeof(struct gsc_dev), GFP_KERNEL); if (!gsc) @@ -998,6 +1014,7 @@ static int gsc_probe(struct platform_device *pdev) return -EINVAL; } + gsc->num_clocks = drv_data->num_clocks; gsc->variant = drv_data->variant[gsc->id]; gsc->pdev = pdev; @@ -1016,18 +1033,24 @@ static int gsc_probe(struct platform_device *pdev) return -ENXIO; } - gsc->clock = devm_clk_get(dev, GSC_CLOCK_GATE_NAME); - if (IS_ERR(gsc->clock)) { - dev_err(dev, "failed to get clock~~~: %s\n", - GSC_CLOCK_GATE_NAME); - return PTR_ERR(gsc->clock); + for (i = 0; i < gsc->num_clocks; i++) { + gsc->clock[i] = devm_clk_get(dev, drv_data->clk_names[i]); + if (IS_ERR(gsc->clock[i])) { + dev_err(dev, "failed to get clock: %s\n", + drv_data->clk_names[i]); + return PTR_ERR(gsc->clock[i]); + } } - ret = clk_prepare_enable(gsc->clock); - if (ret) { - dev_err(&gsc->pdev->dev, "clock prepare failed for clock: %s\n", - GSC_CLOCK_GATE_NAME); - return ret; + for (i = 0; i < gsc->num_clocks; i++) { + ret = clk_prepare_enable(gsc->clock[i]); + if (ret) { + dev_err(dev, "clock prepare failed for clock: %s\n", + drv_data->clk_names[i]); + while (--i >= 0) + clk_disable_unprepare(gsc->clock[i]); + return ret; + } } ret = devm_request_irq(dev, res->start, gsc_irq_handler, @@ -1062,13 +1085,15 @@ static int gsc_probe(struct platform_device *pdev) err_v4l2: v4l2_device_unregister(&gsc->v4l2_dev); err_clk: - clk_disable_unprepare(gsc->clock); + for (i = gsc->num_clocks - 1; i >= 0; i--) + clk_disable_unprepare(gsc->clock[i]); return ret; } static int gsc_remove(struct platform_device *pdev) { struct gsc_dev *gsc = platform_get_drvdata(pdev); + int i; pm_runtime_get_sync(&pdev->dev); @@ -1076,7 +1101,8 @@ static int gsc_remove(struct platform_device *pdev) v4l2_device_unregister(&gsc->v4l2_dev); vb2_dma_contig_clear_max_seg_size(&pdev->dev); - clk_disable_unprepare(gsc->clock); + for (i = 0; i < gsc->num_clocks; i++) + clk_disable_unprepare(gsc->clock[i]); pm_runtime_put_noidle(&pdev->dev); @@ -1126,12 +1152,18 @@ static int gsc_runtime_resume(struct device *dev) { struct gsc_dev *gsc = dev_get_drvdata(dev); int ret = 0; + int i; pr_debug("gsc%d: state: 0x%lx\n", gsc->id, gsc->state); - ret = clk_prepare_enable(gsc->clock); - if (ret) - return ret; + for (i = 0; i < gsc->num_clocks; i++) { + ret = clk_prepare_enable(gsc->clock[i]); + if (ret) { + while (--i >= 0) + clk_disable_unprepare(gsc->clock[i]); + return ret; + } + } gsc_hw_set_sw_reset(gsc); gsc_wait_reset(gsc); @@ -1144,10 +1176,14 @@ static int gsc_runtime_suspend(struct device *dev) { struct gsc_dev *gsc = dev_get_drvdata(dev); int ret = 0; + int i; ret = gsc_m2m_suspend(gsc); - if (!ret) - clk_disable_unprepare(gsc->clock); + if (ret) + return ret; + + for (i = gsc->num_clocks - 1; i >= 0; i--) + clk_disable_unprepare(gsc->clock[i]); pr_debug("gsc%d: state: 0x%lx\n", gsc->id, gsc->state); return ret; diff --git a/drivers/media/platform/exynos-gsc/gsc-core.h b/drivers/media/platform/exynos-gsc/gsc-core.h index e5aa8f4..696217e 100644 --- a/drivers/media/platform/exynos-gsc/gsc-core.h +++ b/drivers/media/platform/exynos-gsc/gsc-core.h @@ -33,6 +33,7 @@ #define GSC_SHUTDOWN_TIMEOUT ((100*HZ)/1000) #define GSC_MAX_DEVS 4 +#define GSC_MAX_CLOCKS 4 #define GSC_M2M_BUF_NUM 0 #define GSC_MAX_CTRL_NUM 10 #define GSC_SC_ALIGN_4 4 @@ -307,6 +308,8 @@ struct gsc_variant { */ struct gsc_driverdata { struct gsc_variant *variant[GSC_MAX_DEVS]; + const char *clk_names[GSC_MAX_CLOCKS]; + int num_clocks; int num_entities; }; @@ -330,7 +333,8 @@ struct gsc_dev { struct platform_device *pdev; struct gsc_variant *variant; u16 id; - struct clk *clock; + int num_clocks; + struct clk *clock[GSC_MAX_CLOCKS]; void __iomem *regs; wait_queue_head_t irq_queue; struct gsc_m2m_device m2m;