From patchwork Tue Feb 11 13:03:50 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Krzysztof Kozlowski X-Patchwork-Id: 3627111 Return-Path: X-Original-To: patchwork-linux-samsung-soc@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork2.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.19.201]) by patchwork2.web.kernel.org (Postfix) with ESMTP id 67EEDBF418 for ; Tue, 11 Feb 2014 13:07:35 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 7C6B420203 for ; Tue, 11 Feb 2014 13:07:34 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 85C25201FE for ; Tue, 11 Feb 2014 13:07:33 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752267AbaBKNG4 (ORCPT ); Tue, 11 Feb 2014 08:06:56 -0500 Received: from mailout4.w1.samsung.com ([210.118.77.14]:34136 "EHLO mailout4.w1.samsung.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751885AbaBKNER (ORCPT ); Tue, 11 Feb 2014 08:04:17 -0500 Received: from eucpsbgm1.samsung.com (unknown [203.254.199.244]) by mailout4.w1.samsung.com (Oracle Communications Messaging Server 7u4-24.01(7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTP id <0N0U00G3X1N4QB50@mailout4.w1.samsung.com>; Tue, 11 Feb 2014 13:04:16 +0000 (GMT) X-AuditID: cbfec7f4-b7f796d000005a13-97-52fa1fcf970b Received: from eusync2.samsung.com ( [203.254.199.212]) by eucpsbgm1.samsung.com (EUCPMTA) with SMTP id 27.12.23059.FCF1AF25; Tue, 11 Feb 2014 13:04:15 +0000 (GMT) Received: from AMDC1943.digital.local ([106.116.151.171]) by eusync2.samsung.com (Oracle Communications Messaging Server 7u4-23.01(7.0.4.23.0) 64bit (built Aug 10 2011)) with ESMTPA id <0N0U006ES1MWRN80@eusync2.samsung.com>; Tue, 11 Feb 2014 13:04:15 +0000 (GMT) From: Krzysztof Kozlowski To: Sangbeom Kim , Samuel Ortiz , Lee Jones , linux-kernel@vger.kernel.org, linux-samsung-soc@vger.kernel.org Cc: Kyungmin Park , Marek Szyprowski , Bartlomiej Zolnierkiewicz , Krzysztof Kozlowski , Chanwoo Choi , Mark Brown , Liam Girdwood Subject: [PATCH 07/14] regulator: s2mps11: Choose number of supported regulators during probe Date: Tue, 11 Feb 2014 14:03:50 +0100 Message-id: <1392123837-5517-8-git-send-email-k.kozlowski@samsung.com> X-Mailer: git-send-email 1.7.9.5 In-reply-to: <1392123837-5517-1-git-send-email-k.kozlowski@samsung.com> References: <1392123837-5517-1-git-send-email-k.kozlowski@samsung.com> X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFprALMWRmVeSWpSXmKPExsVy+t/xK7rn5X8FGSxtF7HYOGM9q8XUh0/Y LK5/ec5q8fqFocXZpjfsFve/HmW0+Halg8ni8q45bBYzzu9jslh75C67xeluVouLK74wOfB4 7Jx1l91j06pONo871/awecw7GejRt2UVo8fnTXIBbFFcNimpOZllqUX6dglcGZsevWMpOKhY sW3xI9YGxqfSXYycHBICJhINi3awQ9hiEhfurWfrYuTiEBJYyigxu/86C4TTxyTR/fEhE0gV m4CxxOblS8CqRAQ2M0os/n6VFcRhFtjKJPF5/UZmkCphgXiJnhufgeZycLAIqEqc3pUHEuYV cJM4tKiNDSQsIaAgMWeSDUiYU8Bdou/Tf7CwEFDJ8v7YCYy8CxgZVjGKppYmFxQnpeca6hUn 5haX5qXrJefnbmKEhOKXHYyLj1kdYhTgYFTi4d2g+DNIiDWxrLgy9xCjBAezkgjvF+FfQUK8 KYmVValF+fFFpTmpxYcYmTg4pRoYkxNWZry7wTVZ2/M2W0aKzO/E/1O9fwu0mDkeVjmbeaPh qRcfg9sOhSwZlXCmrxIhKRu7qgRztB0aS65qK8a+MzJdsIdz5kw2Lw2zpERDuW/mjc4+Cf7X +jaorNq0xOHOM8YXHW/73bOEVF+Hbtq0w5Rvi/DRJVV6SkISLjeOVP7xrVpw8L0SS3FGoqEW c1FxIgBOnhhEIwIAAA== Sender: linux-samsung-soc-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-samsung-soc@vger.kernel.org X-Spam-Status: No, score=-4.5 required=5.0 tests=BAYES_00,KHOP_BIG_TO_CC, RCVD_IN_DNSWL_HI, RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP During probe choose how many regulators will be supported according to device ID. Allocate array of of_regulator_match() dynamically (based number of regulators) instead of allocation on the stack. This is needed for supporting different devices in s2mps11 driver and actually prepares the regulator driver for supporting the S2MPS14 device. Signed-off-by: Krzysztof Kozlowski Signed-off-by: Chanwoo Choi Cc: Mark Brown Cc: Liam Girdwood --- drivers/regulator/s2mps11.c | 46 +++++++++++++++++++++++++++++++++---------- 1 file changed, 36 insertions(+), 10 deletions(-) diff --git a/drivers/regulator/s2mps11.c b/drivers/regulator/s2mps11.c index d44bd5b3fe8e..43a2eefb9aa4 100644 --- a/drivers/regulator/s2mps11.c +++ b/drivers/regulator/s2mps11.c @@ -25,10 +25,9 @@ #include #include -#define S2MPS11_REGULATOR_CNT ARRAY_SIZE(regulators) - struct s2mps11_info { - struct regulator_dev *rdev[S2MPS11_REGULATOR_MAX]; + struct regulator_dev **rdev; + unsigned int rdev_num; int ramp_delay2; int ramp_delay34; @@ -345,7 +344,7 @@ static struct regulator_ops s2mps11_buck_ops = { .enable_mask = S2MPS11_ENABLE_MASK \ } -static const struct regulator_desc regulators[] = { +static const struct regulator_desc s2mps11_regulators[] = { regulator_desc_ldo2(1), regulator_desc_ldo1(2), regulator_desc_ldo1(3), @@ -399,18 +398,31 @@ static const struct regulator_desc regulators[] = { static int s2mps11_pmic_probe(struct platform_device *pdev) { struct sec_pmic_dev *iodev = dev_get_drvdata(pdev->dev.parent); - struct sec_platform_data *pdata = dev_get_platdata(iodev->dev); - struct of_regulator_match rdata[S2MPS11_REGULATOR_MAX]; + struct sec_platform_data *pdata = iodev->pdata; + struct of_regulator_match *rdata = NULL; struct device_node *reg_np = NULL; struct regulator_config config = { }; struct s2mps11_info *s2mps11; int i, ret; + const struct regulator_desc *regulators; + enum sec_device_type dev_type; s2mps11 = devm_kzalloc(&pdev->dev, sizeof(struct s2mps11_info), GFP_KERNEL); if (!s2mps11) return -ENOMEM; + dev_type = platform_get_device_id(pdev)->driver_data; + switch (dev_type) { + case S2MPS11X: + s2mps11->rdev_num = ARRAY_SIZE(s2mps11_regulators); + regulators = s2mps11_regulators; + break; + default: + dev_err(&pdev->dev, "Invalid device type: %u\n", dev_type); + return -EINVAL; + }; + if (!iodev->dev->of_node) { if (pdata) { goto common_reg; @@ -421,7 +433,17 @@ static int s2mps11_pmic_probe(struct platform_device *pdev) } } - for (i = 0; i < S2MPS11_REGULATOR_CNT; i++) + s2mps11->rdev = devm_kzalloc(&pdev->dev, + sizeof(*s2mps11->rdev)*s2mps11->rdev_num, GFP_KERNEL); + if (!s2mps11->rdev) + return -ENOMEM; + + rdata = devm_kzalloc(&pdev->dev, sizeof(*rdata)*s2mps11->rdev_num, + GFP_KERNEL); + if (!rdata) + return -ENOMEM; + + for (i = 0; i < s2mps11->rdev_num; i++) rdata[i].name = regulators[i].name; reg_np = of_find_node_by_name(iodev->dev->of_node, "regulators"); @@ -430,7 +452,7 @@ static int s2mps11_pmic_probe(struct platform_device *pdev) return -EINVAL; } - of_regulator_match(&pdev->dev, reg_np, rdata, S2MPS11_REGULATOR_MAX); + of_regulator_match(&pdev->dev, reg_np, rdata, s2mps11->rdev_num); common_reg: platform_set_drvdata(pdev, s2mps11); @@ -438,7 +460,7 @@ common_reg: config.dev = &pdev->dev; config.regmap = iodev->regmap_pmic; config.driver_data = s2mps11; - for (i = 0; i < S2MPS11_REGULATOR_MAX; i++) { + for (i = 0; i < s2mps11->rdev_num; i++) { if (!reg_np) { config.init_data = pdata->regulators[i].initdata; config.of_node = pdata->regulators[i].reg_node; @@ -457,11 +479,15 @@ common_reg: } } + /* rdata was needed only for of_regulator_match() during probe */ + if (rdata) + devm_kfree(&pdev->dev, rdata); + return 0; } static const struct platform_device_id s2mps11_pmic_id[] = { - { "s2mps11-pmic", 0}, + { "s2mps11-pmic", S2MPS11X}, { }, }; MODULE_DEVICE_TABLE(platform, s2mps11_pmic_id);