From patchwork Wed Sep 21 09:05:58 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Marcin Wojtas X-Patchwork-Id: 9343101 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 1A9E3607D0 for ; Wed, 21 Sep 2016 09:09:13 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 0738C2A392 for ; Wed, 21 Sep 2016 09:09:13 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id EFC912A3D3; Wed, 21 Sep 2016 09:09:12 +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.3 required=2.0 tests=BAYES_00,DKIM_SIGNED, RCVD_IN_DNSWL_HI, RCVD_IN_SORBS_SPAM, 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 955BF2A392 for ; Wed, 21 Sep 2016 09:09:12 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753817AbcIUJHJ (ORCPT ); Wed, 21 Sep 2016 05:07:09 -0400 Received: from mail-lf0-f46.google.com ([209.85.215.46]:36244 "EHLO mail-lf0-f46.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755627AbcIUJGg (ORCPT ); Wed, 21 Sep 2016 05:06:36 -0400 Received: by mail-lf0-f46.google.com with SMTP id g62so34721796lfe.3 for ; Wed, 21 Sep 2016 02:06:23 -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=f8/SbFtWtcEibJaDUca4WaYGG0QBajlHgozxNDpKeDM=; b=Gx4FR68PuaKucUAOP67XGMF7M7R9WkdCacGCqyeNDnPguqZ2huWCvUyaH+KsJK9FmS SulUcs867zwlJXTNR0HNgPwgjXK1whWClB4OWP36RademendZeDLEXdO9DcX69ZhU3uX 6x6vQ6O8R7VKeAkIlYr6DJMFuOrLKcG4XX8X9mPy3Bw6ynYXaMrxf2UDDHxVH80NtmSy YF3kcEVGhgN6I5RWuxqQwlGzLbMlBV2UdZJsQMWA1s/8L2UhMRtTseUB/3KxXnIq7ZQ+ bpkZTu1VP0tmty6khZYhH52Jg2KCaaOKMkOWgWnXv/rEtxOc+jBZPjJ7+Buyv1bkIwHz Ck0g== 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=f8/SbFtWtcEibJaDUca4WaYGG0QBajlHgozxNDpKeDM=; b=RtTcImiBdceV+J41yuon4A02cJkkHT7uLyAIizM6ZGN4bpghe66EeJGC5WtNMNxvbt apbqmt4iV+xfRxkXOHa05Wp6t9n3H+lw+Z6EDVgZb9rGv1hAPI57PAieuOvuo9eijCrC bUzDJ9ppEDdJyx5KjeDr8ARPzHnDLqo3doG/ALrWchAcFjQxx9CuXZ/K6KEF0ZesgUYU f6BEbZpdWDB9TCJE6Bu3CzyBHQ9vjJzsNN0gv7MNro58WN6Qp+0l2f9HS0ssL229i2d9 8VGN946nRAz9/XYbbfBS78eflTUOT+i1lM0d8jaE3KD5pZsv3G9TfYL6BBuMVcCNkDlZ H2Qw== X-Gm-Message-State: AE9vXwPRYVwbwbdaTmOwMauVd/FhdJih2GKP/QfnhUVnOfLbHjnotPg2mPwgcQcFud3idA== X-Received: by 10.25.43.149 with SMTP id r143mr14820679lfr.22.1474448782329; Wed, 21 Sep 2016 02:06:22 -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 n14sm6547294lfn.7.2016.09.21.02.06.20 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 21 Sep 2016 02:06:21 -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 v3 2/3] clk: mvebu: dynamically allocate resources in Armada CP110 system controller Date: Wed, 21 Sep 2016 11:05:58 +0200 Message-Id: <1474448759-24482-3-git-send-email-mw@semihalf.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1474448759-24482-1-git-send-email-mw@semihalf.com> References: <1474448759-24482-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 Reviewed-by: Thomas Petazzoni CC: --- 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 59fe76e..f2303da 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; @@ -196,7 +189,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; @@ -209,6 +203,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 (!cp110_clks) + return -ENOMEM; + + cp110_clk_data = devm_kzalloc(&pdev->dev, + sizeof(*cp110_clk_data), + GFP_KERNEL); + if (!cp110_clk_data) + return -ENOMEM; + + 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); @@ -336,10 +344,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: @@ -366,6 +376,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);