From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753319AbeBSPr2 (ORCPT ); Mon, 19 Feb 2018 10:47:28 -0500 Received: from mailout1.w1.samsung.com ([210.118.77.11]:57023 "EHLO mailout1.w1.samsung.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753034AbeBSPpI (ORCPT ); Mon, 19 Feb 2018 10:45:08 -0500 DKIM-Filter: OpenDKIM Filter v2.11.0 mailout1.w1.samsung.com 20180219154505euoutp010817fab2eab4d7b4734491fe59b59a12~UxJIN4JWN0897708977euoutp01f X-AuditID: cbfec7f4-b4fc79c0000043e4-5b-5a8af0fd11c1 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 4/8] drm/exynos/dsi: Use clk bulk API Date: Mon, 19 Feb 2018 16:44:02 +0100 Message-id: <1519055046-2399-5-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: H4sIAAAAAAAAAzVSWUxTQRR13t6G6lhImFRDtHELBgSDZqKGSFzyNHzon/IhVnyhrCV9goIG tyBQNygqhRjFgICoWGpdQEEsS11BBImALIa4VCtLqkSwoF3w79xzzj3nTjIcKbfSCi4u+YCg TVYlKhkpdb91sj1oekwXFXLFrMS91W00Ptv2nMDFtmwK1xju0Ljr1yiDx/KLAB6t0DFYP5hH 4b57Rgrbf9wicPPtdwT+OtBB4aJn2TQ+P/ydxO3tRha/PmFnsWm4m8bjZwZo3Fl3mcFnjPdo bGhvILDlYj3AJbZeCt9u7mdxuclJ4I4XW3CT3RUy011DYUOBjcGORj25MYDv7O4g+dH3WSx/ 4U8NzdcW97O8qSqX4R9MDNH84Gkrwd8tO8qbz7v4c+YqwDtMAXxX83F2h0+UdMN+ITEuTdCu Ct8rVX/Ms9IpH0IO5bbomGNgbLkOSDgEw9DNiUHKjeWwEqCKUkIHpC7sAMj81UL8N3X/nmS8 QjlA36e+kN7hL0BllQWugeMYGIhuZUe7F/xgK0BXaiPdHhJOsChv6ilwC75wDcq+fs6TSsGl qCo/17Mrg5vQ1R7OWxaAetrctISTwM1o6FG9pxjBARaNPG8DXtNmNDJdMHudL/pmNbNevBB1 FpymvPgw6vhVx3jxEXS8zzjrWY8cerOngIRzkf5+oecGBGUo55Tca+HR65LJ2fgINFDUMvv4 QoDe1HaSeUBRAuZUAX8hVUyKFcTVycLBYFGVJKYmxwbHaJJMwPW9Xs5Yfz4Edc59FgA5oPSR wX5dlJxWpYnpSRaAOFLpJ4t876Jk+1XpGYJWE61NTRREC1jAUUp/2Z4VmVFyGKs6ICQIQoqg /a8SnERxDGwLO5Xa2MfmTp3c5jSHb+91xPsURo7bT7wLPWtQ/tgZYeqLKWYyxED4acdnxcpd eo2iSZpyrUXd4KdZ8irTaS3V+JZ2vSgO2lr3OKH6ks0i2T0TvXZxjnqeKMvJNy8azox4OxjP OzP8K3vimGXT8xcZ4m9kPZkMPxkSve7PRgOlpES1KjSQ1Iqqfyp1vcZaAwAA X-Brightmail-Tracker: H4sIAAAAAAAAAzWRe0hTcRTH+93X7sYWt2V0UZAYiCCpswf8AgnpQZcoKvonVmkrLyo6tV0n zYhUkLFlOs1iziCxmTB8bc2ZlVrzscpyTG2oOXWsQvExRXrYlrQh/fc5n3O+5/xxSFRsxKLJ nPwiVpkvz5MQAmxky+lJDK7pZFJf3S443T6Kw/uj7xFoXNRg0GLowOHEjwAB12rqAQy06AhY O6fH4JeuTgwur7QicLDtMwIXZt0YrH+nwWG1fwmFLlcnD34qX+ZBq9+Dw/XKWRyOv3xMwMrO LhwaXH0IdDzsBbBxcRqDbYNeHnxmDSHQ/eEkHFgOL9nyWDBoeLBIwI03tWhaLDPucaNMYLKC x9QFLTjTY/TyGKtZSzDdP+dxZu6eE2Gem+4ytuqwr7KZAbNhjWUmBst454UyQWomm5dTzCqT j14TZPv0TrxwRnpLO6QjSsFavA7wSZo6RHt+bxI6ICDFlAnQG1obtl2UIbTDWY7oAEkSVALd qsmI+ChqGNC+mad4JI1SIR5dVVoY4d3UYVrTXIVEGKPiaHONFo1kRdRx+skUuX0slp4ajWg+ yadO0POveokIi8MjrrkxQg+EjWCHGUSxKk6RpeAOJHFyBafKz0q6UaCwgvDH7MObthdAt3rR ASgSSIQiyquTiXF5MadWOABNopIo0ZnJsBJlytUlrLIgQ6nKYzkHiCExyV6RS6qWiakseRGb y7KFrPJ/FyH50aXAtP5Nfaz3UmW07NeYrwVrOpU6n/zWHmyoaM7lEq5aWuOE+9uP8AKh/tql kGZFeVs98MjBd/sbbtbvWyC6vwqn9NWnz61e6HI2qexNO2kjGnP5z1lh8IqnpKgjpa9n4I7U /vFvf/qQ9+B3kz/tevp6IhaXPZLY8tqQI43fUzckwbhseUoCquTk/wAAL7MrrQIAAA== X-CMS-MailID: 20180219154459eucas1p147525b88de5d34f646aa25cb8de1f1d0 X-Msg-Generator: CA CMS-TYPE: 201P X-CMS-RootMailID: 20180219154459eucas1p147525b88de5d34f646aa25cb8de1f1d0 X-RootMTR: 20180219154459eucas1p147525b88de5d34f646aa25cb8de1f1d0 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. In order to achieve consistency with other drivers, define clock names in driver's variants structures. Signed-off-by: Maciej Purski --- drivers/gpu/drm/exynos/exynos_drm_dsi.c | 68 +++++++++++++++------------------ 1 file changed, 30 insertions(+), 38 deletions(-) diff --git a/drivers/gpu/drm/exynos/exynos_drm_dsi.c b/drivers/gpu/drm/exynos/exynos_drm_dsi.c index 7904ffa..46a8b5c 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_dsi.c +++ b/drivers/gpu/drm/exynos/exynos_drm_dsi.c @@ -209,11 +209,7 @@ #define DSI_XFER_TIMEOUT_MS 100 #define DSI_RX_FIFO_EMPTY 0x30800002 -#define OLD_SCLK_MIPI_CLK_NAME "pll_clk" - -static char *clk_names[5] = { "bus_clk", "sclk_mipi", - "phyclk_mipidphy0_bitclkdiv8", "phyclk_mipidphy0_rxclkesc0", - "sclk_rgb_vclk_to_dsim0" }; +#define DSI_MAX_CLOCKS 5 enum exynos_dsi_transfer_type { EXYNOS_DSI_TX, @@ -243,6 +239,7 @@ struct exynos_dsi_driver_data { unsigned int plltmr_reg; unsigned int has_freqband:1; unsigned int has_clklane_stop:1; + const char *clock_names[DSI_MAX_CLOCKS]; unsigned int num_clks; unsigned int max_freq; unsigned int wait_for_reset; @@ -259,7 +256,7 @@ struct exynos_dsi { void __iomem *reg_base; struct phy *phy; - struct clk **clks; + struct clk_bulk_data *clks; struct regulator_bulk_data supplies[2]; int irq; int te_gpio; @@ -453,6 +450,7 @@ static const struct exynos_dsi_driver_data exynos3_dsi_driver_data = { .plltmr_reg = 0x50, .has_freqband = 1, .has_clklane_stop = 1, + .clock_names = {"bus_clk", "pll_clk"}, .num_clks = 2, .max_freq = 1000, .wait_for_reset = 1, @@ -465,6 +463,7 @@ static const struct exynos_dsi_driver_data exynos4_dsi_driver_data = { .plltmr_reg = 0x50, .has_freqband = 1, .has_clklane_stop = 1, + .clock_names = {"bus_clk", "sclk_mipi"}, .num_clks = 2, .max_freq = 1000, .wait_for_reset = 1, @@ -475,6 +474,7 @@ static const struct exynos_dsi_driver_data exynos4_dsi_driver_data = { static const struct exynos_dsi_driver_data exynos5_dsi_driver_data = { .reg_ofs = exynos_reg_ofs, .plltmr_reg = 0x58, + .clock_names = {"bus_clk", "pll_clk"}, .num_clks = 2, .max_freq = 1000, .wait_for_reset = 1, @@ -486,6 +486,10 @@ static const struct exynos_dsi_driver_data exynos5433_dsi_driver_data = { .reg_ofs = exynos5433_reg_ofs, .plltmr_reg = 0xa0, .has_clklane_stop = 1, + .clock_names = {"bus_clk", "phyclk_mipidphy0_bitclkdiv8", + "phyclk_mipidphy0_rxclkesc0", + "sclk_rgb_vclk_to_dsim0", + "sclk_mipi"}, .num_clks = 5, .max_freq = 1500, .wait_for_reset = 0, @@ -497,6 +501,7 @@ static const struct exynos_dsi_driver_data exynos5422_dsi_driver_data = { .reg_ofs = exynos5433_reg_ofs, .plltmr_reg = 0xa0, .has_clklane_stop = 1, + .clock_names = {"bus_clk", "pll_clk"}, .num_clks = 2, .max_freq = 1500, .wait_for_reset = 1, @@ -1711,7 +1716,7 @@ static int exynos_dsi_probe(struct platform_device *pdev) struct device *dev = &pdev->dev; struct resource *res; struct exynos_dsi *dsi; - int ret, i; + int ret; dsi = devm_kzalloc(dev, sizeof(*dsi), GFP_KERNEL); if (!dsi) @@ -1743,26 +1748,15 @@ static int exynos_dsi_probe(struct platform_device *pdev) return -EPROBE_DEFER; } - dsi->clks = devm_kzalloc(dev, - sizeof(*dsi->clks) * dsi->driver_data->num_clks, - GFP_KERNEL); - if (!dsi->clks) - return -ENOMEM; + dsi->clks = devm_clk_bulk_alloc(dev, dsi->driver_data->num_clks, + dsi->driver_data->clock_names); + if (IS_ERR(dsi->clks)) + return PTR_ERR(dsi->clks); - for (i = 0; i < dsi->driver_data->num_clks; i++) { - dsi->clks[i] = devm_clk_get(dev, clk_names[i]); - if (IS_ERR(dsi->clks[i])) { - if (strcmp(clk_names[i], "sclk_mipi") == 0) { - strcpy(clk_names[i], OLD_SCLK_MIPI_CLK_NAME); - i--; - continue; - } - - dev_info(dev, "failed to get the clock: %s\n", - clk_names[i]); - return PTR_ERR(dsi->clks[i]); - } - } + ret = devm_clk_bulk_get(dev, dsi->driver_data->num_clks, + dsi->clks); + if (ret < 0) + return ret; res = platform_get_resource(pdev, IORESOURCE_MEM, 0); dsi->reg_base = devm_ioremap_resource(dev, res); @@ -1817,7 +1811,7 @@ static int __maybe_unused exynos_dsi_suspend(struct device *dev) struct drm_encoder *encoder = dev_get_drvdata(dev); struct exynos_dsi *dsi = encoder_to_dsi(encoder); const struct exynos_dsi_driver_data *driver_data = dsi->driver_data; - int ret, i; + int ret; usleep_range(10000, 20000); @@ -1833,8 +1827,7 @@ static int __maybe_unused exynos_dsi_suspend(struct device *dev) phy_power_off(dsi->phy); - for (i = driver_data->num_clks - 1; i > -1; i--) - clk_disable_unprepare(dsi->clks[i]); + clk_bulk_disable_unprepare(driver_data->num_clks, dsi->clks); ret = regulator_bulk_disable(ARRAY_SIZE(dsi->supplies), dsi->supplies); if (ret < 0) @@ -1848,7 +1841,7 @@ static int __maybe_unused exynos_dsi_resume(struct device *dev) struct drm_encoder *encoder = dev_get_drvdata(dev); struct exynos_dsi *dsi = encoder_to_dsi(encoder); const struct exynos_dsi_driver_data *driver_data = dsi->driver_data; - int ret, i; + int ret; ret = regulator_bulk_enable(ARRAY_SIZE(dsi->supplies), dsi->supplies); if (ret < 0) { @@ -1856,23 +1849,22 @@ static int __maybe_unused exynos_dsi_resume(struct device *dev) return ret; } - for (i = 0; i < driver_data->num_clks; i++) { - ret = clk_prepare_enable(dsi->clks[i]); - if (ret < 0) - goto err_clk; - } + ret = clk_bulk_prepare_enable(driver_data->num_clks, dsi->clks); + if (ret < 0) + goto err_clk; ret = phy_power_on(dsi->phy); if (ret < 0) { dev_err(dsi->dev, "cannot enable phy %d\n", ret); - goto err_clk; + goto err_phy; } return 0; +err_phy: + clk_bulk_disable_unprepare(driver_data->num_clks, dsi->clks); + err_clk: - while (--i > -1) - clk_disable_unprepare(dsi->clks[i]); regulator_bulk_disable(ARRAY_SIZE(dsi->supplies), dsi->supplies); return ret; -- 2.7.4 From mboxrd@z Thu Jan 1 00:00:00 1970 From: Maciej Purski Subject: [PATCH 4/8] drm/exynos/dsi: Use clk bulk API Date: Mon, 19 Feb 2018 16:44:02 +0100 Message-ID: <1519055046-2399-5-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 cmF5IG9mIGNsa3MuCgpJbiBvcmRlciB0byBhY2hpZXZlIGNvbnNpc3RlbmN5IHdpdGggb3RoZXIg ZHJpdmVycywgZGVmaW5lIGNsb2NrIG5hbWVzCmluIGRyaXZlcidzIHZhcmlhbnRzIHN0cnVjdHVy ZXMuCgpTaWduZWQtb2ZmLWJ5OiBNYWNpZWogUHVyc2tpIDxtLnB1cnNraUBzYW1zdW5nLmNvbT4K LS0tCiBkcml2ZXJzL2dwdS9kcm0vZXh5bm9zL2V4eW5vc19kcm1fZHNpLmMgfCA2OCArKysrKysr KysrKysrKystLS0tLS0tLS0tLS0tLS0tLS0KIDEgZmlsZSBjaGFuZ2VkLCAzMCBpbnNlcnRpb25z KCspLCAzOCBkZWxldGlvbnMoLSkKCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vZXh5bm9z L2V4eW5vc19kcm1fZHNpLmMgYi9kcml2ZXJzL2dwdS9kcm0vZXh5bm9zL2V4eW5vc19kcm1fZHNp LmMKaW5kZXggNzkwNGZmYS4uNDZhOGI1YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2V4 eW5vcy9leHlub3NfZHJtX2RzaS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9leHlub3MvZXh5bm9z X2RybV9kc2kuYwpAQCAtMjA5LDExICsyMDksNyBAQAogI2RlZmluZSBEU0lfWEZFUl9USU1FT1VU X01TCQkxMDAKICNkZWZpbmUgRFNJX1JYX0ZJRk9fRU1QVFkJCTB4MzA4MDAwMDIKIAotI2RlZmlu ZSBPTERfU0NMS19NSVBJX0NMS19OQU1FICJwbGxfY2xrIgotCi1zdGF0aWMgY2hhciAqY2xrX25h bWVzWzVdID0geyAiYnVzX2NsayIsICJzY2xrX21pcGkiLAotCSJwaHljbGtfbWlwaWRwaHkwX2Jp dGNsa2RpdjgiLCAicGh5Y2xrX21pcGlkcGh5MF9yeGNsa2VzYzAiLAotCSJzY2xrX3JnYl92Y2xr X3RvX2RzaW0wIiB9OworI2RlZmluZSBEU0lfTUFYX0NMT0NLUwkJCTUKIAogZW51bSBleHlub3Nf ZHNpX3RyYW5zZmVyX3R5cGUgewogCUVYWU5PU19EU0lfVFgsCkBAIC0yNDMsNiArMjM5LDcgQEAg c3RydWN0IGV4eW5vc19kc2lfZHJpdmVyX2RhdGEgewogCXVuc2lnbmVkIGludCBwbGx0bXJfcmVn OwogCXVuc2lnbmVkIGludCBoYXNfZnJlcWJhbmQ6MTsKIAl1bnNpZ25lZCBpbnQgaGFzX2Nsa2xh bmVfc3RvcDoxOworCWNvbnN0IGNoYXIgKmNsb2NrX25hbWVzW0RTSV9NQVhfQ0xPQ0tTXTsKIAl1 bnNpZ25lZCBpbnQgbnVtX2Nsa3M7CiAJdW5zaWduZWQgaW50IG1heF9mcmVxOwogCXVuc2lnbmVk IGludCB3YWl0X2Zvcl9yZXNldDsKQEAgLTI1OSw3ICsyNTYsNyBAQCBzdHJ1Y3QgZXh5bm9zX2Rz aSB7CiAKIAl2b2lkIF9faW9tZW0gKnJlZ19iYXNlOwogCXN0cnVjdCBwaHkgKnBoeTsKLQlzdHJ1 Y3QgY2xrICoqY2xrczsKKwlzdHJ1Y3QgY2xrX2J1bGtfZGF0YSAqY2xrczsKIAlzdHJ1Y3QgcmVn dWxhdG9yX2J1bGtfZGF0YSBzdXBwbGllc1syXTsKIAlpbnQgaXJxOwogCWludCB0ZV9ncGlvOwpA QCAtNDUzLDYgKzQ1MCw3IEBAIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZXh5bm9zX2RzaV9kcml2ZXJf ZGF0YSBleHlub3MzX2RzaV9kcml2ZXJfZGF0YSA9IHsKIAkucGxsdG1yX3JlZyA9IDB4NTAsCiAJ Lmhhc19mcmVxYmFuZCA9IDEsCiAJLmhhc19jbGtsYW5lX3N0b3AgPSAxLAorCS5jbG9ja19uYW1l cyA9IHsiYnVzX2NsayIsICJwbGxfY2xrIn0sCiAJLm51bV9jbGtzID0gMiwKIAkubWF4X2ZyZXEg PSAxMDAwLAogCS53YWl0X2Zvcl9yZXNldCA9IDEsCkBAIC00NjUsNiArNDYzLDcgQEAgc3RhdGlj IGNvbnN0IHN0cnVjdCBleHlub3NfZHNpX2RyaXZlcl9kYXRhIGV4eW5vczRfZHNpX2RyaXZlcl9k YXRhID0gewogCS5wbGx0bXJfcmVnID0gMHg1MCwKIAkuaGFzX2ZyZXFiYW5kID0gMSwKIAkuaGFz X2Nsa2xhbmVfc3RvcCA9IDEsCisJLmNsb2NrX25hbWVzID0geyJidXNfY2xrIiwgInNjbGtfbWlw aSJ9LAogCS5udW1fY2xrcyA9IDIsCiAJLm1heF9mcmVxID0gMTAwMCwKIAkud2FpdF9mb3JfcmVz ZXQgPSAxLApAQCAtNDc1LDYgKzQ3NCw3IEBAIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZXh5bm9zX2Rz aV9kcml2ZXJfZGF0YSBleHlub3M0X2RzaV9kcml2ZXJfZGF0YSA9IHsKIHN0YXRpYyBjb25zdCBz dHJ1Y3QgZXh5bm9zX2RzaV9kcml2ZXJfZGF0YSBleHlub3M1X2RzaV9kcml2ZXJfZGF0YSA9IHsK IAkucmVnX29mcyA9IGV4eW5vc19yZWdfb2ZzLAogCS5wbGx0bXJfcmVnID0gMHg1OCwKKwkuY2xv Y2tfbmFtZXMgPSB7ImJ1c19jbGsiLCAicGxsX2NsayJ9LAogCS5udW1fY2xrcyA9IDIsCiAJLm1h eF9mcmVxID0gMTAwMCwKIAkud2FpdF9mb3JfcmVzZXQgPSAxLApAQCAtNDg2LDYgKzQ4NiwxMCBA QCBzdGF0aWMgY29uc3Qgc3RydWN0IGV4eW5vc19kc2lfZHJpdmVyX2RhdGEgZXh5bm9zNTQzM19k c2lfZHJpdmVyX2RhdGEgPSB7CiAJLnJlZ19vZnMgPSBleHlub3M1NDMzX3JlZ19vZnMsCiAJLnBs bHRtcl9yZWcgPSAweGEwLAogCS5oYXNfY2xrbGFuZV9zdG9wID0gMSwKKwkuY2xvY2tfbmFtZXMg PSB7ImJ1c19jbGsiLCAicGh5Y2xrX21pcGlkcGh5MF9iaXRjbGtkaXY4IiwKKwkJCSJwaHljbGtf bWlwaWRwaHkwX3J4Y2xrZXNjMCIsCisJCQkic2Nsa19yZ2JfdmNsa190b19kc2ltMCIsCisJCQki c2Nsa19taXBpIn0sCiAJLm51bV9jbGtzID0gNSwKIAkubWF4X2ZyZXEgPSAxNTAwLAogCS53YWl0 X2Zvcl9yZXNldCA9IDAsCkBAIC00OTcsNiArNTAxLDcgQEAgc3RhdGljIGNvbnN0IHN0cnVjdCBl eHlub3NfZHNpX2RyaXZlcl9kYXRhIGV4eW5vczU0MjJfZHNpX2RyaXZlcl9kYXRhID0gewogCS5y ZWdfb2ZzID0gZXh5bm9zNTQzM19yZWdfb2ZzLAogCS5wbGx0bXJfcmVnID0gMHhhMCwKIAkuaGFz X2Nsa2xhbmVfc3RvcCA9IDEsCisJLmNsb2NrX25hbWVzID0geyJidXNfY2xrIiwgInBsbF9jbGsi fSwKIAkubnVtX2Nsa3MgPSAyLAogCS5tYXhfZnJlcSA9IDE1MDAsCiAJLndhaXRfZm9yX3Jlc2V0 ID0gMSwKQEAgLTE3MTEsNyArMTcxNiw3IEBAIHN0YXRpYyBpbnQgZXh5bm9zX2RzaV9wcm9iZShz dHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwZGV2 LT5kZXY7CiAJc3RydWN0IHJlc291cmNlICpyZXM7CiAJc3RydWN0IGV4eW5vc19kc2kgKmRzaTsK LQlpbnQgcmV0LCBpOworCWludCByZXQ7CiAKIAlkc2kgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXpl b2YoKmRzaSksIEdGUF9LRVJORUwpOwogCWlmICghZHNpKQpAQCAtMTc0MywyNiArMTc0OCwxNSBA QCBzdGF0aWMgaW50IGV4eW5vc19kc2lfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRl dikKIAkJcmV0dXJuIC1FUFJPQkVfREVGRVI7CiAJfQogCi0JZHNpLT5jbGtzID0gZGV2bV9remFs bG9jKGRldiwKLQkJCXNpemVvZigqZHNpLT5jbGtzKSAqIGRzaS0+ZHJpdmVyX2RhdGEtPm51bV9j bGtzLAotCQkJR0ZQX0tFUk5FTCk7Ci0JaWYgKCFkc2ktPmNsa3MpCi0JCXJldHVybiAtRU5PTUVN OworCWRzaS0+Y2xrcyA9IGRldm1fY2xrX2J1bGtfYWxsb2MoZGV2LCBkc2ktPmRyaXZlcl9kYXRh LT5udW1fY2xrcywKKwkJCQkJZHNpLT5kcml2ZXJfZGF0YS0+Y2xvY2tfbmFtZXMpOworCWlmIChJ U19FUlIoZHNpLT5jbGtzKSkKKwkJcmV0dXJuIFBUUl9FUlIoZHNpLT5jbGtzKTsKIAotCWZvciAo aSA9IDA7IGkgPCBkc2ktPmRyaXZlcl9kYXRhLT5udW1fY2xrczsgaSsrKSB7Ci0JCWRzaS0+Y2xr c1tpXSA9IGRldm1fY2xrX2dldChkZXYsIGNsa19uYW1lc1tpXSk7Ci0JCWlmIChJU19FUlIoZHNp LT5jbGtzW2ldKSkgewotCQkJaWYgKHN0cmNtcChjbGtfbmFtZXNbaV0sICJzY2xrX21pcGkiKSA9 PSAwKSB7Ci0JCQkJc3RyY3B5KGNsa19uYW1lc1tpXSwgT0xEX1NDTEtfTUlQSV9DTEtfTkFNRSk7 Ci0JCQkJaS0tOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQlkZXZfaW5mbyhkZXYsICJmYWls ZWQgdG8gZ2V0IHRoZSBjbG9jazogJXNcbiIsCi0JCQkJCWNsa19uYW1lc1tpXSk7Ci0JCQlyZXR1 cm4gUFRSX0VSUihkc2ktPmNsa3NbaV0pOwotCQl9Ci0JfQorCXJldCA9IGRldm1fY2xrX2J1bGtf Z2V0KGRldiwgZHNpLT5kcml2ZXJfZGF0YS0+bnVtX2Nsa3MsCisJCQkJZHNpLT5jbGtzKTsKKwlp ZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKIAogCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJj ZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CiAJZHNpLT5yZWdfYmFzZSA9IGRldm1faW9yZW1h cF9yZXNvdXJjZShkZXYsIHJlcyk7CkBAIC0xODE3LDcgKzE4MTEsNyBAQCBzdGF0aWMgaW50IF9f bWF5YmVfdW51c2VkIGV4eW5vc19kc2lfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCiAJc3Ry dWN0IGRybV9lbmNvZGVyICplbmNvZGVyID0gZGV2X2dldF9kcnZkYXRhKGRldik7CiAJc3RydWN0 IGV4eW5vc19kc2kgKmRzaSA9IGVuY29kZXJfdG9fZHNpKGVuY29kZXIpOwogCWNvbnN0IHN0cnVj dCBleHlub3NfZHNpX2RyaXZlcl9kYXRhICpkcml2ZXJfZGF0YSA9IGRzaS0+ZHJpdmVyX2RhdGE7 Ci0JaW50IHJldCwgaTsKKwlpbnQgcmV0OwogCiAJdXNsZWVwX3JhbmdlKDEwMDAwLCAyMDAwMCk7 CiAKQEAgLTE4MzMsOCArMTgyNyw3IEBAIHN0YXRpYyBpbnQgX19tYXliZV91bnVzZWQgZXh5bm9z X2RzaV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKIAogCXBoeV9wb3dlcl9vZmYoZHNpLT5w aHkpOwogCi0JZm9yIChpID0gZHJpdmVyX2RhdGEtPm51bV9jbGtzIC0gMTsgaSA+IC0xOyBpLS0p Ci0JCWNsa19kaXNhYmxlX3VucHJlcGFyZShkc2ktPmNsa3NbaV0pOworCWNsa19idWxrX2Rpc2Fi bGVfdW5wcmVwYXJlKGRyaXZlcl9kYXRhLT5udW1fY2xrcywgZHNpLT5jbGtzKTsKIAogCXJldCA9 IHJlZ3VsYXRvcl9idWxrX2Rpc2FibGUoQVJSQVlfU0laRShkc2ktPnN1cHBsaWVzKSwgZHNpLT5z dXBwbGllcyk7CiAJaWYgKHJldCA8IDApCkBAIC0xODQ4LDcgKzE4NDEsNyBAQCBzdGF0aWMgaW50 IF9fbWF5YmVfdW51c2VkIGV4eW5vc19kc2lfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKIAlz dHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAlzdHJ1 Y3QgZXh5bm9zX2RzaSAqZHNpID0gZW5jb2Rlcl90b19kc2koZW5jb2Rlcik7CiAJY29uc3Qgc3Ry dWN0IGV4eW5vc19kc2lfZHJpdmVyX2RhdGEgKmRyaXZlcl9kYXRhID0gZHNpLT5kcml2ZXJfZGF0 YTsKLQlpbnQgcmV0LCBpOworCWludCByZXQ7CiAKIAlyZXQgPSByZWd1bGF0b3JfYnVsa19lbmFi bGUoQVJSQVlfU0laRShkc2ktPnN1cHBsaWVzKSwgZHNpLT5zdXBwbGllcyk7CiAJaWYgKHJldCA8 IDApIHsKQEAgLTE4NTYsMjMgKzE4NDksMjIgQEAgc3RhdGljIGludCBfX21heWJlX3VudXNlZCBl eHlub3NfZHNpX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCiAJCXJldHVybiByZXQ7CiAJfQog Ci0JZm9yIChpID0gMDsgaSA8IGRyaXZlcl9kYXRhLT5udW1fY2xrczsgaSsrKSB7Ci0JCXJldCA9 IGNsa19wcmVwYXJlX2VuYWJsZShkc2ktPmNsa3NbaV0pOwotCQlpZiAocmV0IDwgMCkKLQkJCWdv dG8gZXJyX2NsazsKLQl9CisJcmV0ID0gY2xrX2J1bGtfcHJlcGFyZV9lbmFibGUoZHJpdmVyX2Rh dGEtPm51bV9jbGtzLCBkc2ktPmNsa3MpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycl9jbGs7 CiAKIAlyZXQgPSBwaHlfcG93ZXJfb24oZHNpLT5waHkpOwogCWlmIChyZXQgPCAwKSB7CiAJCWRl dl9lcnIoZHNpLT5kZXYsICJjYW5ub3QgZW5hYmxlIHBoeSAlZFxuIiwgcmV0KTsKLQkJZ290byBl cnJfY2xrOworCQlnb3RvIGVycl9waHk7CiAJfQogCiAJcmV0dXJuIDA7CiAKK2Vycl9waHk6CisJ Y2xrX2J1bGtfZGlzYWJsZV91bnByZXBhcmUoZHJpdmVyX2RhdGEtPm51bV9jbGtzLCBkc2ktPmNs a3MpOworCiBlcnJfY2xrOgotCXdoaWxlICgtLWkgPiAtMSkKLQkJY2xrX2Rpc2FibGVfdW5wcmVw YXJlKGRzaS0+Y2xrc1tpXSk7CiAJcmVndWxhdG9yX2J1bGtfZGlzYWJsZShBUlJBWV9TSVpFKGRz aS0+c3VwcGxpZXMpLCBkc2ktPnN1cHBsaWVzKTsKIAogCXJldHVybiByZXQ7Ci0tIAoyLjcuNAoK X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KZHJpLWRldmVs IG1haWxpbmcgbGlzdApkcmktZGV2ZWxAbGlzdHMuZnJlZWRlc2t0b3Aub3JnCmh0dHBzOi8vbGlz dHMuZnJlZWRlc2t0b3Aub3JnL21haWxtYW4vbGlzdGluZm8vZHJpLWRldmVsCg== From mboxrd@z Thu Jan 1 00:00:00 1970 From: m.purski@samsung.com (Maciej Purski) Date: Mon, 19 Feb 2018 16:44:02 +0100 Subject: [PATCH 4/8] drm/exynos/dsi: 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-5-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. In order to achieve consistency with other drivers, define clock names in driver's variants structures. Signed-off-by: Maciej Purski --- drivers/gpu/drm/exynos/exynos_drm_dsi.c | 68 +++++++++++++++------------------ 1 file changed, 30 insertions(+), 38 deletions(-) diff --git a/drivers/gpu/drm/exynos/exynos_drm_dsi.c b/drivers/gpu/drm/exynos/exynos_drm_dsi.c index 7904ffa..46a8b5c 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_dsi.c +++ b/drivers/gpu/drm/exynos/exynos_drm_dsi.c @@ -209,11 +209,7 @@ #define DSI_XFER_TIMEOUT_MS 100 #define DSI_RX_FIFO_EMPTY 0x30800002 -#define OLD_SCLK_MIPI_CLK_NAME "pll_clk" - -static char *clk_names[5] = { "bus_clk", "sclk_mipi", - "phyclk_mipidphy0_bitclkdiv8", "phyclk_mipidphy0_rxclkesc0", - "sclk_rgb_vclk_to_dsim0" }; +#define DSI_MAX_CLOCKS 5 enum exynos_dsi_transfer_type { EXYNOS_DSI_TX, @@ -243,6 +239,7 @@ struct exynos_dsi_driver_data { unsigned int plltmr_reg; unsigned int has_freqband:1; unsigned int has_clklane_stop:1; + const char *clock_names[DSI_MAX_CLOCKS]; unsigned int num_clks; unsigned int max_freq; unsigned int wait_for_reset; @@ -259,7 +256,7 @@ struct exynos_dsi { void __iomem *reg_base; struct phy *phy; - struct clk **clks; + struct clk_bulk_data *clks; struct regulator_bulk_data supplies[2]; int irq; int te_gpio; @@ -453,6 +450,7 @@ static const struct exynos_dsi_driver_data exynos3_dsi_driver_data = { .plltmr_reg = 0x50, .has_freqband = 1, .has_clklane_stop = 1, + .clock_names = {"bus_clk", "pll_clk"}, .num_clks = 2, .max_freq = 1000, .wait_for_reset = 1, @@ -465,6 +463,7 @@ static const struct exynos_dsi_driver_data exynos4_dsi_driver_data = { .plltmr_reg = 0x50, .has_freqband = 1, .has_clklane_stop = 1, + .clock_names = {"bus_clk", "sclk_mipi"}, .num_clks = 2, .max_freq = 1000, .wait_for_reset = 1, @@ -475,6 +474,7 @@ static const struct exynos_dsi_driver_data exynos4_dsi_driver_data = { static const struct exynos_dsi_driver_data exynos5_dsi_driver_data = { .reg_ofs = exynos_reg_ofs, .plltmr_reg = 0x58, + .clock_names = {"bus_clk", "pll_clk"}, .num_clks = 2, .max_freq = 1000, .wait_for_reset = 1, @@ -486,6 +486,10 @@ static const struct exynos_dsi_driver_data exynos5433_dsi_driver_data = { .reg_ofs = exynos5433_reg_ofs, .plltmr_reg = 0xa0, .has_clklane_stop = 1, + .clock_names = {"bus_clk", "phyclk_mipidphy0_bitclkdiv8", + "phyclk_mipidphy0_rxclkesc0", + "sclk_rgb_vclk_to_dsim0", + "sclk_mipi"}, .num_clks = 5, .max_freq = 1500, .wait_for_reset = 0, @@ -497,6 +501,7 @@ static const struct exynos_dsi_driver_data exynos5422_dsi_driver_data = { .reg_ofs = exynos5433_reg_ofs, .plltmr_reg = 0xa0, .has_clklane_stop = 1, + .clock_names = {"bus_clk", "pll_clk"}, .num_clks = 2, .max_freq = 1500, .wait_for_reset = 1, @@ -1711,7 +1716,7 @@ static int exynos_dsi_probe(struct platform_device *pdev) struct device *dev = &pdev->dev; struct resource *res; struct exynos_dsi *dsi; - int ret, i; + int ret; dsi = devm_kzalloc(dev, sizeof(*dsi), GFP_KERNEL); if (!dsi) @@ -1743,26 +1748,15 @@ static int exynos_dsi_probe(struct platform_device *pdev) return -EPROBE_DEFER; } - dsi->clks = devm_kzalloc(dev, - sizeof(*dsi->clks) * dsi->driver_data->num_clks, - GFP_KERNEL); - if (!dsi->clks) - return -ENOMEM; + dsi->clks = devm_clk_bulk_alloc(dev, dsi->driver_data->num_clks, + dsi->driver_data->clock_names); + if (IS_ERR(dsi->clks)) + return PTR_ERR(dsi->clks); - for (i = 0; i < dsi->driver_data->num_clks; i++) { - dsi->clks[i] = devm_clk_get(dev, clk_names[i]); - if (IS_ERR(dsi->clks[i])) { - if (strcmp(clk_names[i], "sclk_mipi") == 0) { - strcpy(clk_names[i], OLD_SCLK_MIPI_CLK_NAME); - i--; - continue; - } - - dev_info(dev, "failed to get the clock: %s\n", - clk_names[i]); - return PTR_ERR(dsi->clks[i]); - } - } + ret = devm_clk_bulk_get(dev, dsi->driver_data->num_clks, + dsi->clks); + if (ret < 0) + return ret; res = platform_get_resource(pdev, IORESOURCE_MEM, 0); dsi->reg_base = devm_ioremap_resource(dev, res); @@ -1817,7 +1811,7 @@ static int __maybe_unused exynos_dsi_suspend(struct device *dev) struct drm_encoder *encoder = dev_get_drvdata(dev); struct exynos_dsi *dsi = encoder_to_dsi(encoder); const struct exynos_dsi_driver_data *driver_data = dsi->driver_data; - int ret, i; + int ret; usleep_range(10000, 20000); @@ -1833,8 +1827,7 @@ static int __maybe_unused exynos_dsi_suspend(struct device *dev) phy_power_off(dsi->phy); - for (i = driver_data->num_clks - 1; i > -1; i--) - clk_disable_unprepare(dsi->clks[i]); + clk_bulk_disable_unprepare(driver_data->num_clks, dsi->clks); ret = regulator_bulk_disable(ARRAY_SIZE(dsi->supplies), dsi->supplies); if (ret < 0) @@ -1848,7 +1841,7 @@ static int __maybe_unused exynos_dsi_resume(struct device *dev) struct drm_encoder *encoder = dev_get_drvdata(dev); struct exynos_dsi *dsi = encoder_to_dsi(encoder); const struct exynos_dsi_driver_data *driver_data = dsi->driver_data; - int ret, i; + int ret; ret = regulator_bulk_enable(ARRAY_SIZE(dsi->supplies), dsi->supplies); if (ret < 0) { @@ -1856,23 +1849,22 @@ static int __maybe_unused exynos_dsi_resume(struct device *dev) return ret; } - for (i = 0; i < driver_data->num_clks; i++) { - ret = clk_prepare_enable(dsi->clks[i]); - if (ret < 0) - goto err_clk; - } + ret = clk_bulk_prepare_enable(driver_data->num_clks, dsi->clks); + if (ret < 0) + goto err_clk; ret = phy_power_on(dsi->phy); if (ret < 0) { dev_err(dsi->dev, "cannot enable phy %d\n", ret); - goto err_clk; + goto err_phy; } return 0; +err_phy: + clk_bulk_disable_unprepare(driver_data->num_clks, dsi->clks); + err_clk: - while (--i > -1) - clk_disable_unprepare(dsi->clks[i]); regulator_bulk_disable(ARRAY_SIZE(dsi->supplies), dsi->supplies); return ret; -- 2.7.4