From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753269AbeBSPqP (ORCPT ); Mon, 19 Feb 2018 10:46:15 -0500 Received: from mailout1.w1.samsung.com ([210.118.77.11]:57043 "EHLO mailout1.w1.samsung.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752602AbeBSPpK (ORCPT ); Mon, 19 Feb 2018 10:45:10 -0500 DKIM-Filter: OpenDKIM Filter v2.11.0 mailout1.w1.samsung.com 20180219154507euoutp019c84ca9ebf5a0f91e92bfdcf2fbc9d17~UxJJw-GOP0897708977euoutp01h X-AuditID: cbfec7f4-b4fc79c0000043e4-67-5a8af0ff4669 From: Maciej Purski To: linux-media@vger.kernel.org, linux-samsung-soc@vger.kernel.org, linux-arm-kernel@lists.infradead.org, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux-clk@vger.kernel.org Cc: Michael Turquette , Stephen Boyd , Inki Dae , Joonyoung Shim , Seung-Woo Kim , Kyungmin Park , David Airlie , Kukjin Kim , Krzysztof Kozlowski , Mauro Carvalho Chehab , Andrzej Pietrasiewicz , Jacek Anaszewski , Kamil Debski , Jeongtae Park , Andrzej Hajda , Russell King , Sylwester Nawrocki , Thibault Saunier , Javier Martinez Canillas , Hans Verkuil , Hoegeun Kwon , Bartlomiej Zolnierkiewicz , Marek Szyprowski , Maciej Purski Subject: [PATCH 6/8] drm/exynos/hdmi: Use clk bulk API Date: Mon, 19 Feb 2018 16:44:04 +0100 Message-id: <1519055046-2399-7-git-send-email-m.purski@samsung.com> X-Mailer: git-send-email 2.7.4 In-reply-to: <1519055046-2399-1-git-send-email-m.purski@samsung.com> X-Brightmail-Tracker: H4sIAAAAAAAAAzWSe0hTURzHPbtPzdVlGh00jYZCFNmDHgeKSjO4f0REfxQMSldeVHTLtuxl pBNsejO1lWlWzkAslpZO3XKl5XzMik2WtmxmFlFpKnP5oIdorqv/fc738fudA4fGJB1ECJ2s PM2plPJUKRmAmzp/O9bPjfOyjZ6xSOR+5CDQVcdLESob1uKorvQxgXqnPCQav3YLIM99nkS6 wSIc9TfW4mh0rFqE2mveitDQRyeObnVpCVT4ZQRD3d21FLJnj1LI+MVFIG/+RwL1WO6QKL+2 kUCl3S0iZC1uBqhi2I2jmvYBClUZZ0TI+WofahudHzLrqsNR6fVhEk280GF7wtkelxNjPX05 FHvjbx3BNpUNUKzRkEey5ulPBDt4xSZi6ysz2YbCeb2gwQDYCWM429uuoQ4GygJ2JnCpyWc4 1YZd8QFJ/MOveFpvxDmj4QOWBQbDeOBPQ2YLbHF5SR4E0BLmAYB6nR0IhwkAh7vbicWUu6MD E4wqAB3fNbjPkDBzANpmxTygaZJZC6u1cT45mOkEsLxpvy+PMdMULPrTCnxGELMNan9dE/kY ZyKh3eugfF0xsxdO3l0t7AqH7x15mI/9mVj46WkzKehuCnrNywSOhXypAQgcBH/YGiiBV8Ke 61dwgTOgc8qy0L0INf21C5kdcELX8H8+xiyFOlMJ5rsCZMQw97JEiLDQYvEsVKPh7Yc3gfDa EgB72sKKQEgF8DOAFVy6WpHIqTcrubNRarlCna5MjDpxUmEE85/r9axt8gmwzBy3AoYG0kAx M8DLJIT8jPq8wgogjUmDxfv75iVxgvz8BU51Mk6VnsqprSCUxqUrxMfWXJJJmET5aS6F49I4 1aIrov1DssC5ggNfj7zT9yXZlMdbTsW2ftDbJd5HCj0ovq+JHtpW8ianq7JF5n6VYU0ZEVfn xn8zmzfdC05e0gxXOU0HzCVBaYdMadsrV0YYXJU5z+vB+IA9xpj5ekvIzz5+qPHxs+XLp6az Q/22ZsdoPutryr1jnqShwx2b/UyxN7U5u4+uk+LqJPmmtZhKLf8HgfjhL1gDAAA= X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFprJIsWRmVeSWpSXmKPExsVy+t/xa7p/P3RFGezcq2xxa905VovecyeZ LGa9bGex2DhjPavFla/v2Sw+TJzJaPF+eRebxaT7E1gsbm/dwGLx5u0aJosja68yWby4d5HF YuaJdlaL/sevmS3On9/AbnG26Q27xabH11gtPvbcY7W4vGsOm0XPhq2sFjPO72OyODR1L6PF gpe3WCzWHrnLbrFs0x8mi4unXC0OvwEa8u/aRhaLGZNfsll8PjCJ2UHO4/K1i8we72+0sntM +b2R1WPnrLvsHptWdbJ5bP/2gNXjfvdxJo/NS+o9tvQDxfu2rGL0+LxJzuPKkUb2AJ4oLpuU 1JzMstQifbsEroyu1U9ZCq6oVGxadYe5gfG+bBcjJ4eEgInEraNHmUFsIYEljBKXD/l1MXIB 2Y1MErtX3GftYuTgYBPQkljTHg8SFxE4xijx8M5iVpAGZoE/7BJ9DQUgtrCAmUT7j4lMIDaL gKrE2Y/n2EF6eQWcJb7MVYTYJSdx81wn2C5OAReJB7v3skHsdZY4f/8S2wRGngWMDKsYRVJL i3PTc4uN9IoTc4tL89L1kvNzNzECI2zbsZ9bdjB2vQs+xCjAwajEwytwtytKiDWxrLgy9xCj BAezkgivzw2gEG9KYmVValF+fFFpTmrxIUZpDhYlcd7zBpVRQgLpiSWp2ampBalFMFkmDk6p Bkav0h930i2dGLrm8mRtf/3w0ZPsJ9oJcTkTa3L87y6V1vf1sFQ/tXGjw0bL3pJfq9zbJi/h X/GlWUbEtndv2zXuUypzrae6xFrsZcpNiPjzg6fjSXGd+KLF1UETAwO79Q4cU9lS4MbErdXq 8LJG6YmL0iJO6Ze3Kqe8ULNiPlP6Lqp80mErFiWW4oxEQy3mouJEAJBFq2ysAgAA X-CMS-MailID: 20180219154501eucas1p1e16a883d2eb0c8a99bafce5d71656066 X-Msg-Generator: CA CMS-TYPE: 201P X-CMS-RootMailID: 20180219154501eucas1p1e16a883d2eb0c8a99bafce5d71656066 X-RootMTR: 20180219154501eucas1p1e16a883d2eb0c8a99bafce5d71656066 References: <1519055046-2399-1-git-send-email-m.purski@samsung.com> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Using bulk clk functions simplifies the driver's code. Use devm_clk_bulk functions instead of iterating over an array of clks. Signed-off-by: Maciej Purski --- drivers/gpu/drm/exynos/exynos_hdmi.c | 97 ++++++++++-------------------------- 1 file changed, 27 insertions(+), 70 deletions(-) diff --git a/drivers/gpu/drm/exynos/exynos_hdmi.c b/drivers/gpu/drm/exynos/exynos_hdmi.c index a4b75a4..6c208f7 100644 --- a/drivers/gpu/drm/exynos/exynos_hdmi.c +++ b/drivers/gpu/drm/exynos/exynos_hdmi.c @@ -136,8 +136,8 @@ struct hdmi_context { int irq; struct regmap *pmureg; struct regmap *sysreg; - struct clk **clk_gates; - struct clk **clk_muxes; + struct clk_bulk_data *clk_gates; + struct clk_bulk_data *clk_muxes; struct regulator_bulk_data regul_bulk[ARRAY_SIZE(supply)]; struct regulator *reg_hdmi_en; struct exynos_drm_clk phy_clk; @@ -739,43 +739,16 @@ static int hdmiphy_reg_write_buf(struct hdmi_context *hdata, } } -static int hdmi_clk_enable_gates(struct hdmi_context *hdata) -{ - int i, ret; - - for (i = 0; i < hdata->drv_data->clk_gates.count; ++i) { - ret = clk_prepare_enable(hdata->clk_gates[i]); - if (!ret) - continue; - - dev_err(hdata->dev, "Cannot enable clock '%s', %d\n", - hdata->drv_data->clk_gates.data[i], ret); - while (i--) - clk_disable_unprepare(hdata->clk_gates[i]); - return ret; - } - - return 0; -} - -static void hdmi_clk_disable_gates(struct hdmi_context *hdata) -{ - int i = hdata->drv_data->clk_gates.count; - - while (i--) - clk_disable_unprepare(hdata->clk_gates[i]); -} - static int hdmi_clk_set_parents(struct hdmi_context *hdata, bool to_phy) { struct device *dev = hdata->dev; int ret = 0; + struct clk_bulk_data *clk_muxes = hdata->clk_muxes; int i; for (i = 0; i < hdata->drv_data->clk_muxes.count; i += 3) { - struct clk **c = &hdata->clk_muxes[i]; - - ret = clk_set_parent(c[2], c[to_phy]); + ret = clk_set_parent(clk_muxes[i + 2].clk, + clk_muxes[i + to_phy].clk); if (!ret) continue; @@ -1655,54 +1628,36 @@ static irqreturn_t hdmi_irq_thread(int irq, void *arg) return IRQ_HANDLED; } -static int hdmi_clks_get(struct hdmi_context *hdata, - const struct string_array_spec *names, - struct clk **clks) +static struct clk_bulk_data *hdmi_clks_alloc_get(struct hdmi_context *hdata, + const struct string_array_spec *names) { - struct device *dev = hdata->dev; - int i; - - for (i = 0; i < names->count; ++i) { - struct clk *clk = devm_clk_get(dev, names->data[i]); - - if (IS_ERR(clk)) { - int ret = PTR_ERR(clk); + struct clk_bulk_data *ptr; + int ret; - dev_err(dev, "Cannot get clock %s, %d\n", - names->data[i], ret); + ptr = devm_clk_bulk_alloc(hdata->dev, names->count, names->data); + if (IS_ERR(ptr)) + return ptr; - return ret; - } - - clks[i] = clk; - } + ret = devm_clk_bulk_get(hdata->dev, names->count, ptr); + if (ret < 0) + return ERR_PTR(ret); - return 0; + return ptr; } static int hdmi_clk_init(struct hdmi_context *hdata) { const struct hdmi_driver_data *drv_data = hdata->drv_data; - int count = drv_data->clk_gates.count + drv_data->clk_muxes.count; - struct device *dev = hdata->dev; - struct clk **clks; - int ret; - if (!count) - return 0; - - clks = devm_kzalloc(dev, sizeof(*clks) * count, GFP_KERNEL); - if (!clks) - return -ENOMEM; + hdata->clk_muxes = hdmi_clks_alloc_get(hdata, &drv_data->clk_muxes); + if (IS_ERR(hdata->clk_muxes)) + return PTR_ERR(hdata->clk_muxes); - hdata->clk_gates = clks; - hdata->clk_muxes = clks + drv_data->clk_gates.count; + hdata->clk_gates = hdmi_clks_alloc_get(hdata, &drv_data->clk_gates); + if (IS_ERR(hdata->clk_gates)) + return PTR_ERR(hdata->clk_gates); - ret = hdmi_clks_get(hdata, &drv_data->clk_gates, hdata->clk_gates); - if (ret) - return ret; - - return hdmi_clks_get(hdata, &drv_data->clk_muxes, hdata->clk_muxes); + return 0; } @@ -2073,7 +2028,8 @@ static int __maybe_unused exynos_hdmi_suspend(struct device *dev) { struct hdmi_context *hdata = dev_get_drvdata(dev); - hdmi_clk_disable_gates(hdata); + clk_bulk_disable_unprepare(hdata->drv_data->clk_gates.count, + hdata->clk_gates); return 0; } @@ -2083,7 +2039,8 @@ static int __maybe_unused exynos_hdmi_resume(struct device *dev) struct hdmi_context *hdata = dev_get_drvdata(dev); int ret; - ret = hdmi_clk_enable_gates(hdata); + ret = clk_bulk_prepare_enable(hdata->drv_data->clk_gates.count, + hdata->clk_gates); if (ret < 0) return ret; -- 2.7.4 From mboxrd@z Thu Jan 1 00:00:00 1970 From: Maciej Purski Subject: [PATCH 6/8] drm/exynos/hdmi: Use clk bulk API Date: Mon, 19 Feb 2018 16:44:04 +0100 Message-ID: <1519055046-2399-7-git-send-email-m.purski@samsung.com> References: <1519055046-2399-1-git-send-email-m.purski@samsung.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-reply-to: <1519055046-2399-1-git-send-email-m.purski@samsung.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: linux-media@vger.kernel.org, linux-samsung-soc@vger.kernel.org, linux-arm-kernel@lists.infradead.org, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux-clk@vger.kernel.org Cc: David Airlie , Michael Turquette , Kamil Debski , Maciej Purski , Sylwester Nawrocki , Marek Szyprowski , Thibault Saunier , Russell King , Krzysztof Kozlowski , Javier Martinez Canillas , Kukjin Kim , Hoegeun Kwon , Bartlomiej Zolnierkiewicz , Jeongtae Park , Jacek Anaszewski , Andrzej Pietrasiewicz , Mauro Carvalho Chehab , Stephen Boyd , Seung-Woo Kim , Hans Verkuil , Kyungmin Park List-Id: linux-samsung-soc@vger.kernel.org VXNpbmcgYnVsayBjbGsgZnVuY3Rpb25zIHNpbXBsaWZpZXMgdGhlIGRyaXZlcidzIGNvZGUuIFVz ZSBkZXZtX2Nsa19idWxrCmZ1bmN0aW9ucyBpbnN0ZWFkIG9mIGl0ZXJhdGluZyBvdmVyIGFuIGFy cmF5IG9mIGNsa3MuCgpTaWduZWQtb2ZmLWJ5OiBNYWNpZWogUHVyc2tpIDxtLnB1cnNraUBzYW1z dW5nLmNvbT4KLS0tCiBkcml2ZXJzL2dwdS9kcm0vZXh5bm9zL2V4eW5vc19oZG1pLmMgfCA5NyAr KysrKysrKysrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIDEgZmlsZSBjaGFuZ2VkLCAyNyBp bnNlcnRpb25zKCspLCA3MCBkZWxldGlvbnMoLSkKCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9k cm0vZXh5bm9zL2V4eW5vc19oZG1pLmMgYi9kcml2ZXJzL2dwdS9kcm0vZXh5bm9zL2V4eW5vc19o ZG1pLmMKaW5kZXggYTRiNzVhNC4uNmMyMDhmNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJt L2V4eW5vcy9leHlub3NfaGRtaS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9leHlub3MvZXh5bm9z X2hkbWkuYwpAQCAtMTM2LDggKzEzNiw4IEBAIHN0cnVjdCBoZG1pX2NvbnRleHQgewogCWludAkJ CQlpcnE7CiAJc3RydWN0IHJlZ21hcAkJCSpwbXVyZWc7CiAJc3RydWN0IHJlZ21hcAkJCSpzeXNy ZWc7Ci0Jc3RydWN0IGNsawkJCSoqY2xrX2dhdGVzOwotCXN0cnVjdCBjbGsJCQkqKmNsa19tdXhl czsKKwlzdHJ1Y3QgY2xrX2J1bGtfZGF0YQkJKmNsa19nYXRlczsKKwlzdHJ1Y3QgY2xrX2J1bGtf ZGF0YQkJKmNsa19tdXhlczsKIAlzdHJ1Y3QgcmVndWxhdG9yX2J1bGtfZGF0YQlyZWd1bF9idWxr W0FSUkFZX1NJWkUoc3VwcGx5KV07CiAJc3RydWN0IHJlZ3VsYXRvcgkJKnJlZ19oZG1pX2VuOwog CXN0cnVjdCBleHlub3NfZHJtX2NsawkJcGh5X2NsazsKQEAgLTczOSw0MyArNzM5LDE2IEBAIHN0 YXRpYyBpbnQgaGRtaXBoeV9yZWdfd3JpdGVfYnVmKHN0cnVjdCBoZG1pX2NvbnRleHQgKmhkYXRh LAogCX0KIH0KIAotc3RhdGljIGludCBoZG1pX2Nsa19lbmFibGVfZ2F0ZXMoc3RydWN0IGhkbWlf Y29udGV4dCAqaGRhdGEpCi17Ci0JaW50IGksIHJldDsKLQotCWZvciAoaSA9IDA7IGkgPCBoZGF0 YS0+ZHJ2X2RhdGEtPmNsa19nYXRlcy5jb3VudDsgKytpKSB7Ci0JCXJldCA9IGNsa19wcmVwYXJl X2VuYWJsZShoZGF0YS0+Y2xrX2dhdGVzW2ldKTsKLQkJaWYgKCFyZXQpCi0JCQljb250aW51ZTsK LQotCQlkZXZfZXJyKGhkYXRhLT5kZXYsICJDYW5ub3QgZW5hYmxlIGNsb2NrICclcycsICVkXG4i LAotCQkJaGRhdGEtPmRydl9kYXRhLT5jbGtfZ2F0ZXMuZGF0YVtpXSwgcmV0KTsKLQkJd2hpbGUg KGktLSkKLQkJCWNsa19kaXNhYmxlX3VucHJlcGFyZShoZGF0YS0+Y2xrX2dhdGVzW2ldKTsKLQkJ cmV0dXJuIHJldDsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgaGRtaV9jbGtf ZGlzYWJsZV9nYXRlcyhzdHJ1Y3QgaGRtaV9jb250ZXh0ICpoZGF0YSkKLXsKLQlpbnQgaSA9IGhk YXRhLT5kcnZfZGF0YS0+Y2xrX2dhdGVzLmNvdW50OwotCi0Jd2hpbGUgKGktLSkKLQkJY2xrX2Rp c2FibGVfdW5wcmVwYXJlKGhkYXRhLT5jbGtfZ2F0ZXNbaV0pOwotfQotCiBzdGF0aWMgaW50IGhk bWlfY2xrX3NldF9wYXJlbnRzKHN0cnVjdCBoZG1pX2NvbnRleHQgKmhkYXRhLCBib29sIHRvX3Bo eSkKIHsKIAlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBoZGF0YS0+ZGV2OwogCWludCByZXQgPSAwOwor CXN0cnVjdCBjbGtfYnVsa19kYXRhICpjbGtfbXV4ZXMgPSBoZGF0YS0+Y2xrX211eGVzOwogCWlu dCBpOwogCiAJZm9yIChpID0gMDsgaSA8IGhkYXRhLT5kcnZfZGF0YS0+Y2xrX211eGVzLmNvdW50 OyBpICs9IDMpIHsKLQkJc3RydWN0IGNsayAqKmMgPSAmaGRhdGEtPmNsa19tdXhlc1tpXTsKLQot CQlyZXQgPSBjbGtfc2V0X3BhcmVudChjWzJdLCBjW3RvX3BoeV0pOworCQlyZXQgPSBjbGtfc2V0 X3BhcmVudChjbGtfbXV4ZXNbaSArIDJdLmNsaywKKwkJCQkgICAgIGNsa19tdXhlc1tpICsgdG9f cGh5XS5jbGspOwogCQlpZiAoIXJldCkKIAkJCWNvbnRpbnVlOwogCkBAIC0xNjU1LDU0ICsxNjI4 LDM2IEBAIHN0YXRpYyBpcnFyZXR1cm5fdCBoZG1pX2lycV90aHJlYWQoaW50IGlycSwgdm9pZCAq YXJnKQogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIAotc3RhdGljIGludCBoZG1pX2Nsa3NfZ2V0 KHN0cnVjdCBoZG1pX2NvbnRleHQgKmhkYXRhLAotCQkJIGNvbnN0IHN0cnVjdCBzdHJpbmdfYXJy YXlfc3BlYyAqbmFtZXMsCi0JCQkgc3RydWN0IGNsayAqKmNsa3MpCitzdGF0aWMgc3RydWN0IGNs a19idWxrX2RhdGEgKmhkbWlfY2xrc19hbGxvY19nZXQoc3RydWN0IGhkbWlfY29udGV4dCAqaGRh dGEsCisJCQkJCWNvbnN0IHN0cnVjdCBzdHJpbmdfYXJyYXlfc3BlYyAqbmFtZXMpCiB7Ci0Jc3Ry dWN0IGRldmljZSAqZGV2ID0gaGRhdGEtPmRldjsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkg PCBuYW1lcy0+Y291bnQ7ICsraSkgewotCQlzdHJ1Y3QgY2xrICpjbGsgPSBkZXZtX2Nsa19nZXQo ZGV2LCBuYW1lcy0+ZGF0YVtpXSk7Ci0KLQkJaWYgKElTX0VSUihjbGspKSB7Ci0JCQlpbnQgcmV0 ID0gUFRSX0VSUihjbGspOworCXN0cnVjdCBjbGtfYnVsa19kYXRhICpwdHI7CisJaW50IHJldDsK IAotCQkJZGV2X2VycihkZXYsICJDYW5ub3QgZ2V0IGNsb2NrICVzLCAlZFxuIiwKLQkJCQluYW1l cy0+ZGF0YVtpXSwgcmV0KTsKKwlwdHIgPSBkZXZtX2Nsa19idWxrX2FsbG9jKGhkYXRhLT5kZXYs IG5hbWVzLT5jb3VudCwgbmFtZXMtPmRhdGEpOworCWlmIChJU19FUlIocHRyKSkKKwkJcmV0dXJu IHB0cjsKIAotCQkJcmV0dXJuIHJldDsKLQkJfQotCi0JCWNsa3NbaV0gPSBjbGs7Ci0JfQorCXJl dCA9IGRldm1fY2xrX2J1bGtfZ2V0KGhkYXRhLT5kZXYsIG5hbWVzLT5jb3VudCwgcHRyKTsKKwlp ZiAocmV0IDwgMCkKKwkJcmV0dXJuIEVSUl9QVFIocmV0KTsKIAotCXJldHVybiAwOworCXJldHVy biBwdHI7CiB9CiAKIHN0YXRpYyBpbnQgaGRtaV9jbGtfaW5pdChzdHJ1Y3QgaGRtaV9jb250ZXh0 ICpoZGF0YSkKIHsKIAljb25zdCBzdHJ1Y3QgaGRtaV9kcml2ZXJfZGF0YSAqZHJ2X2RhdGEgPSBo ZGF0YS0+ZHJ2X2RhdGE7Ci0JaW50IGNvdW50ID0gZHJ2X2RhdGEtPmNsa19nYXRlcy5jb3VudCAr IGRydl9kYXRhLT5jbGtfbXV4ZXMuY291bnQ7Ci0Jc3RydWN0IGRldmljZSAqZGV2ID0gaGRhdGEt PmRldjsKLQlzdHJ1Y3QgY2xrICoqY2xrczsKLQlpbnQgcmV0OwogCi0JaWYgKCFjb3VudCkKLQkJ cmV0dXJuIDA7Ci0KLQljbGtzID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCpjbGtzKSAqIGNv dW50LCBHRlBfS0VSTkVMKTsKLQlpZiAoIWNsa3MpCi0JCXJldHVybiAtRU5PTUVNOworCWhkYXRh LT5jbGtfbXV4ZXMgPSBoZG1pX2Nsa3NfYWxsb2NfZ2V0KGhkYXRhLCAmZHJ2X2RhdGEtPmNsa19t dXhlcyk7CisJaWYgKElTX0VSUihoZGF0YS0+Y2xrX211eGVzKSkKKwkJcmV0dXJuIFBUUl9FUlIo aGRhdGEtPmNsa19tdXhlcyk7CiAKLQloZGF0YS0+Y2xrX2dhdGVzID0gY2xrczsKLQloZGF0YS0+ Y2xrX211eGVzID0gY2xrcyArIGRydl9kYXRhLT5jbGtfZ2F0ZXMuY291bnQ7CisJaGRhdGEtPmNs a19nYXRlcyA9IGhkbWlfY2xrc19hbGxvY19nZXQoaGRhdGEsICZkcnZfZGF0YS0+Y2xrX2dhdGVz KTsKKwlpZiAoSVNfRVJSKGhkYXRhLT5jbGtfZ2F0ZXMpKQorCQlyZXR1cm4gUFRSX0VSUihoZGF0 YS0+Y2xrX2dhdGVzKTsKIAotCXJldCA9IGhkbWlfY2xrc19nZXQoaGRhdGEsICZkcnZfZGF0YS0+ Y2xrX2dhdGVzLCBoZGF0YS0+Y2xrX2dhdGVzKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0Owot Ci0JcmV0dXJuIGhkbWlfY2xrc19nZXQoaGRhdGEsICZkcnZfZGF0YS0+Y2xrX211eGVzLCBoZGF0 YS0+Y2xrX211eGVzKTsKKwlyZXR1cm4gMDsKIH0KIAogCkBAIC0yMDczLDcgKzIwMjgsOCBAQCBz dGF0aWMgaW50IF9fbWF5YmVfdW51c2VkIGV4eW5vc19oZG1pX3N1c3BlbmQoc3RydWN0IGRldmlj ZSAqZGV2KQogewogCXN0cnVjdCBoZG1pX2NvbnRleHQgKmhkYXRhID0gZGV2X2dldF9kcnZkYXRh KGRldik7CiAKLQloZG1pX2Nsa19kaXNhYmxlX2dhdGVzKGhkYXRhKTsKKwljbGtfYnVsa19kaXNh YmxlX3VucHJlcGFyZShoZGF0YS0+ZHJ2X2RhdGEtPmNsa19nYXRlcy5jb3VudCwKKwkJCQkgICBo ZGF0YS0+Y2xrX2dhdGVzKTsKIAogCXJldHVybiAwOwogfQpAQCAtMjA4Myw3ICsyMDM5LDggQEAg c3RhdGljIGludCBfX21heWJlX3VudXNlZCBleHlub3NfaGRtaV9yZXN1bWUoc3RydWN0IGRldmlj ZSAqZGV2KQogCXN0cnVjdCBoZG1pX2NvbnRleHQgKmhkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRl dik7CiAJaW50IHJldDsKIAotCXJldCA9IGhkbWlfY2xrX2VuYWJsZV9nYXRlcyhoZGF0YSk7CisJ cmV0ID0gY2xrX2J1bGtfcHJlcGFyZV9lbmFibGUoaGRhdGEtPmRydl9kYXRhLT5jbGtfZ2F0ZXMu Y291bnQsCisJCQkJICAgICAgaGRhdGEtPmNsa19nYXRlcyk7CiAJaWYgKHJldCA8IDApCiAJCXJl dHVybiByZXQ7CiAKLS0gCjIuNy40CgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fXwpkcmktZGV2ZWwgbWFpbGluZyBsaXN0CmRyaS1kZXZlbEBsaXN0cy5mcmVl ZGVza3RvcC5vcmcKaHR0cHM6Ly9saXN0cy5mcmVlZGVza3RvcC5vcmcvbWFpbG1hbi9saXN0aW5m by9kcmktZGV2ZWwK From mboxrd@z Thu Jan 1 00:00:00 1970 From: m.purski@samsung.com (Maciej Purski) Date: Mon, 19 Feb 2018 16:44:04 +0100 Subject: [PATCH 6/8] drm/exynos/hdmi: Use clk bulk API In-Reply-To: <1519055046-2399-1-git-send-email-m.purski@samsung.com> References: <1519055046-2399-1-git-send-email-m.purski@samsung.com> Message-ID: <1519055046-2399-7-git-send-email-m.purski@samsung.com> To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org Using bulk clk functions simplifies the driver's code. Use devm_clk_bulk functions instead of iterating over an array of clks. Signed-off-by: Maciej Purski --- drivers/gpu/drm/exynos/exynos_hdmi.c | 97 ++++++++++-------------------------- 1 file changed, 27 insertions(+), 70 deletions(-) diff --git a/drivers/gpu/drm/exynos/exynos_hdmi.c b/drivers/gpu/drm/exynos/exynos_hdmi.c index a4b75a4..6c208f7 100644 --- a/drivers/gpu/drm/exynos/exynos_hdmi.c +++ b/drivers/gpu/drm/exynos/exynos_hdmi.c @@ -136,8 +136,8 @@ struct hdmi_context { int irq; struct regmap *pmureg; struct regmap *sysreg; - struct clk **clk_gates; - struct clk **clk_muxes; + struct clk_bulk_data *clk_gates; + struct clk_bulk_data *clk_muxes; struct regulator_bulk_data regul_bulk[ARRAY_SIZE(supply)]; struct regulator *reg_hdmi_en; struct exynos_drm_clk phy_clk; @@ -739,43 +739,16 @@ static int hdmiphy_reg_write_buf(struct hdmi_context *hdata, } } -static int hdmi_clk_enable_gates(struct hdmi_context *hdata) -{ - int i, ret; - - for (i = 0; i < hdata->drv_data->clk_gates.count; ++i) { - ret = clk_prepare_enable(hdata->clk_gates[i]); - if (!ret) - continue; - - dev_err(hdata->dev, "Cannot enable clock '%s', %d\n", - hdata->drv_data->clk_gates.data[i], ret); - while (i--) - clk_disable_unprepare(hdata->clk_gates[i]); - return ret; - } - - return 0; -} - -static void hdmi_clk_disable_gates(struct hdmi_context *hdata) -{ - int i = hdata->drv_data->clk_gates.count; - - while (i--) - clk_disable_unprepare(hdata->clk_gates[i]); -} - static int hdmi_clk_set_parents(struct hdmi_context *hdata, bool to_phy) { struct device *dev = hdata->dev; int ret = 0; + struct clk_bulk_data *clk_muxes = hdata->clk_muxes; int i; for (i = 0; i < hdata->drv_data->clk_muxes.count; i += 3) { - struct clk **c = &hdata->clk_muxes[i]; - - ret = clk_set_parent(c[2], c[to_phy]); + ret = clk_set_parent(clk_muxes[i + 2].clk, + clk_muxes[i + to_phy].clk); if (!ret) continue; @@ -1655,54 +1628,36 @@ static irqreturn_t hdmi_irq_thread(int irq, void *arg) return IRQ_HANDLED; } -static int hdmi_clks_get(struct hdmi_context *hdata, - const struct string_array_spec *names, - struct clk **clks) +static struct clk_bulk_data *hdmi_clks_alloc_get(struct hdmi_context *hdata, + const struct string_array_spec *names) { - struct device *dev = hdata->dev; - int i; - - for (i = 0; i < names->count; ++i) { - struct clk *clk = devm_clk_get(dev, names->data[i]); - - if (IS_ERR(clk)) { - int ret = PTR_ERR(clk); + struct clk_bulk_data *ptr; + int ret; - dev_err(dev, "Cannot get clock %s, %d\n", - names->data[i], ret); + ptr = devm_clk_bulk_alloc(hdata->dev, names->count, names->data); + if (IS_ERR(ptr)) + return ptr; - return ret; - } - - clks[i] = clk; - } + ret = devm_clk_bulk_get(hdata->dev, names->count, ptr); + if (ret < 0) + return ERR_PTR(ret); - return 0; + return ptr; } static int hdmi_clk_init(struct hdmi_context *hdata) { const struct hdmi_driver_data *drv_data = hdata->drv_data; - int count = drv_data->clk_gates.count + drv_data->clk_muxes.count; - struct device *dev = hdata->dev; - struct clk **clks; - int ret; - if (!count) - return 0; - - clks = devm_kzalloc(dev, sizeof(*clks) * count, GFP_KERNEL); - if (!clks) - return -ENOMEM; + hdata->clk_muxes = hdmi_clks_alloc_get(hdata, &drv_data->clk_muxes); + if (IS_ERR(hdata->clk_muxes)) + return PTR_ERR(hdata->clk_muxes); - hdata->clk_gates = clks; - hdata->clk_muxes = clks + drv_data->clk_gates.count; + hdata->clk_gates = hdmi_clks_alloc_get(hdata, &drv_data->clk_gates); + if (IS_ERR(hdata->clk_gates)) + return PTR_ERR(hdata->clk_gates); - ret = hdmi_clks_get(hdata, &drv_data->clk_gates, hdata->clk_gates); - if (ret) - return ret; - - return hdmi_clks_get(hdata, &drv_data->clk_muxes, hdata->clk_muxes); + return 0; } @@ -2073,7 +2028,8 @@ static int __maybe_unused exynos_hdmi_suspend(struct device *dev) { struct hdmi_context *hdata = dev_get_drvdata(dev); - hdmi_clk_disable_gates(hdata); + clk_bulk_disable_unprepare(hdata->drv_data->clk_gates.count, + hdata->clk_gates); return 0; } @@ -2083,7 +2039,8 @@ static int __maybe_unused exynos_hdmi_resume(struct device *dev) struct hdmi_context *hdata = dev_get_drvdata(dev); int ret; - ret = hdmi_clk_enable_gates(hdata); + ret = clk_bulk_prepare_enable(hdata->drv_data->clk_gates.count, + hdata->clk_gates); if (ret < 0) return ret; -- 2.7.4