From patchwork Tue Aug 23 06:26:49 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Marcin Wojtas X-Patchwork-Id: 9295033 X-Patchwork-Delegate: sboyd@codeaurora.org Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id D4C6E608A7 for ; Tue, 23 Aug 2016 06:28:35 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id C847A28B5C for ; Tue, 23 Aug 2016 06:28:35 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id BB5D128B79; Tue, 23 Aug 2016 06:28:35 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.8 required=2.0 tests=BAYES_00,DKIM_SIGNED, RCVD_IN_DNSWL_HI,T_DKIM_INVALID autolearn=unavailable version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id B7F2428B61 for ; Tue, 23 Aug 2016 06:28:34 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755113AbcHWG21 (ORCPT ); Tue, 23 Aug 2016 02:28:27 -0400 Received: from mail-lf0-f41.google.com ([209.85.215.41]:33070 "EHLO mail-lf0-f41.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1756950AbcHWG20 (ORCPT ); Tue, 23 Aug 2016 02:28:26 -0400 Received: by mail-lf0-f41.google.com with SMTP id b199so93737801lfe.0 for ; Mon, 22 Aug 2016 23:28:25 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=semihalf-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=e0G1Ioy2xULIgT7G9GTCwOAVJiz+fIov5/pAm8615tI=; b=d1b/azK69vdN9Qx8mVgHDKI7k6Kf7MbYDUFqHJw8KcTBLQVozU0oxMV1N1QUGsFhie RSOZNkbxXANHip8Q5zGGjXQTtMUKzvRmkvmTsSK0s1IaKth3EzDYzGl8/ncD5+8G+nQ/ WLrbnDJ9Vbn6aAy9kcKi647QURdsbDJ3laXw7fcxqQqFYtUYDDPYUvUR7h/xDPbgEnL/ A+6oy6dh2LQQW4ff4dUTdtFTsarcmNQDdzuHtqaDnnu+IC5PH7T6q71P63UUmMH2wLYr KmjlxHuw031ct9zBqhivh7NcT/GMuI1Hz4Mk6nM2rTHPnx53jTTq9S9JMQyGVSjjXBIS mLiw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=e0G1Ioy2xULIgT7G9GTCwOAVJiz+fIov5/pAm8615tI=; b=EazaSjzhfZwC7sC7c/sA718DAtSRfVnNhSTibBcxNOCfLpKz9sHPVfjs8mXKnq7pNy DKATvw+hXvoM+xb+XVQaFfZjmzh/bgoQrQvOY1W53TC29ENWDmy1o4EvnY9jXehqNMqH 72knG/l0WDRzyufFthqZn/mCwvABmuU1sHUDINlVXaiT3DOqxEvB2aOpojI7p6LSzwa7 yOE3QpcLf4Z3QHa1KIkofYnxYpWdt+TIIvUgL3KicF/w6W21hxGsVElT/fmx1t2qmdG4 KesQ2OWwRvJbj8u/DORYCQW2fEYJ4Y+ysf6oWvOD6UBa/WJPCAgoN1WP+TPGvPTarGcz sGPw== X-Gm-Message-State: AEkoouvH5NyUWMQUYR4phDta9spzls9m9rAfimuzM95nl1q6dhIpUJHAInwwA6L6mmYoTQ== X-Received: by 10.25.15.98 with SMTP id e95mr7063212lfi.55.1471933219717; Mon, 22 Aug 2016 23:20:19 -0700 (PDT) Received: from enkidu.semihalf.local (31-172-191-173.noc.fibertech.net.pl. [31.172.191.173]) by smtp.gmail.com with ESMTPSA id d15sm419335lfg.0.2016.08.22.23.20.17 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 22 Aug 2016 23:20:19 -0700 (PDT) From: Marcin Wojtas To: linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-clk@vger.kernel.org, sboyd@codeaurora.org, mturquette@baylibre.com Cc: sebastian.hesselbarth@gmail.com, andrew@lunn.ch, jason@lakedaemon.net, thomas.petazzoni@free-electrons.com, gregory.clement@free-electrons.com, nadavh@marvell.com, alior@marvell.com, tn@semihalf.com, jaz@semihalf.com, Marcin Wojtas Subject: [PATCH 2/2] clk: mvebu: dynamically allocate resources in Armada CP110 system controller Date: Tue, 23 Aug 2016 08:26:49 +0200 Message-Id: <1471933609-8456-3-git-send-email-mw@semihalf.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1471933609-8456-1-git-send-email-mw@semihalf.com> References: <1471933609-8456-1-git-send-email-mw@semihalf.com> Sender: linux-clk-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-clk@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Original commit, which added support for Armada CP110 system controller used global variables for storing all clock information. It worked fine for Armada 7k SoC, with single CP110 block. After dual-CP110 Armada 8k was introduced, the data got overwritten and corrupted. This patch fixes the issue by allocating resources dynamically in the driver probe and storing it as platform drvdata. Fixes: d3da3eaef7f4 ("clk: mvebu: new driver for Armada CP110 system ...") Signed-off-by: Marcin Wojtas Tested-by: Thomas Petazzoni Reviewed-by: Thomas Petazzoni --- drivers/clk/mvebu/cp110-system-controller.c | 29 ++++++++++++++++++++--------- 1 file changed, 20 insertions(+), 9 deletions(-) diff --git a/drivers/clk/mvebu/cp110-system-controller.c b/drivers/clk/mvebu/cp110-system-controller.c index 0835e1d..2bd87d2 100644 --- a/drivers/clk/mvebu/cp110-system-controller.c +++ b/drivers/clk/mvebu/cp110-system-controller.c @@ -81,13 +81,6 @@ enum { #define CP110_GATE_EIP150 25 #define CP110_GATE_EIP197 26 -static struct clk *cp110_clks[CP110_CLK_NUM]; - -static struct clk_onecell_data cp110_clk_data = { - .clks = cp110_clks, - .clk_num = CP110_CLK_NUM, -}; - struct cp110_gate_clk { struct clk_hw hw; struct regmap *regmap; @@ -195,7 +188,8 @@ static int cp110_syscon_clk_probe(struct platform_device *pdev) struct regmap *regmap; struct device_node *np = pdev->dev.of_node; const char *ppv2_name, *apll_name, *core_name, *eip_name, *nand_name; - struct clk *clk; + struct clk_onecell_data *cp110_clk_data; + struct clk *clk, **cp110_clks; u32 nand_clk_ctrl; int i, ret; @@ -208,6 +202,20 @@ static int cp110_syscon_clk_probe(struct platform_device *pdev) if (ret) return ret; + cp110_clks = devm_kcalloc(&pdev->dev, sizeof(struct clk *), + CP110_CLK_NUM, GFP_KERNEL); + if (IS_ERR(cp110_clks)) + return PTR_ERR(cp110_clks); + + cp110_clk_data = devm_kzalloc(&pdev->dev, + sizeof(struct clk_onecell_data), + GFP_KERNEL); + if (IS_ERR(cp110_clk_data)) + return PTR_ERR(cp110_clk_data); + + cp110_clk_data->clks = cp110_clks; + cp110_clk_data->clk_num = CP110_CLK_NUM; + /* Register the APLL which is the root of the clk tree */ of_property_read_string_index(np, "core-clock-output-names", CP110_CORE_APLL, &apll_name); @@ -335,10 +343,12 @@ static int cp110_syscon_clk_probe(struct platform_device *pdev) cp110_clks[CP110_MAX_CORE_CLOCKS + i] = clk; } - ret = of_clk_add_provider(np, cp110_of_clk_get, &cp110_clk_data); + ret = of_clk_add_provider(np, cp110_of_clk_get, cp110_clk_data); if (ret) goto fail_clk_add; + platform_set_drvdata(pdev, cp110_clks); + return 0; fail_clk_add: @@ -365,6 +375,7 @@ fail0: static int cp110_syscon_clk_remove(struct platform_device *pdev) { + struct clk **cp110_clks = platform_get_drvdata(pdev); int i; of_clk_del_provider(pdev->dev.of_node);