All of lore.kernel.org
 help / color / mirror / Atom feed
From: Krzysztof Kozlowski <k.kozlowski@samsung.com>
To: Sangbeom Kim <sbkim73@samsung.com>,
	Samuel Ortiz <sameo@linux.intel.com>,
	Lee Jones <lee.jones@linaro.org>,
	linux-kernel@vger.kernel.org, linux-samsung-soc@vger.kernel.org
Cc: Kyungmin Park <kyungmin.park@samsung.com>,
	Marek Szyprowski <m.szyprowski@samsung.com>,
	Bartlomiej Zolnierkiewicz <b.zolnierkie@samsung.com>,
	Krzysztof Kozlowski <k.kozlowski@samsung.com>,
	Chanwoo Choi <cw00.choi@samsung.com>,
	Mark Brown <broonie@kernel.org>,
	Liam Girdwood <lgirdwood@gmail.com>,
	Yadwinder Singh Brar <yadi.brar01@gmail.com>
Subject: [PATCH 07/14] regulator: s2mps11: Copy supported regulators from initconst
Date: Thu, 13 Feb 2014 13:37:03 +0100	[thread overview]
Message-ID: <1392295024-4862-1-git-send-email-k.kozlowski@samsung.com> (raw)
In-Reply-To: <CAKew6eUtuQEHJJ9G+g54LRoH8sXzqixDBUEjCjFyRDJTRP00Nw@mail.gmail.com>

Add __initconst to 'regulator_desc' array with supported regulators.
During probe choose how many and which regulators will be supported
according to device ID. Then copy the 'regulator_desc' array to
allocated memory so the regulator core can use it.

Additionally allocate array of of_regulator_match() dynamically (based
on 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.

Code for supporting the S2MPS14 device will add its own array of
'regulator_desc' (also marked as __initconst). This way memory footprint
of the driver will be reduced (approximately 'regulators_desc' array for
S2MPS11 occupies 5 kB on 32-bit ARM, for S2MPS14 will occupy 3 kB).

Signed-off-by: Krzysztof Kozlowski <k.kozlowski@samsung.com>
Signed-off-by: Chanwoo Choi <cw00.choi@samsung.com>
Cc: Mark Brown <broonie@kernel.org>
Cc: Liam Girdwood <lgirdwood@gmail.com>
Cc: Yadwinder Singh Brar <yadi.brar01@gmail.com>
Reviewed-by: Yadwinder Singh Brar <yadi.brar@samsung.com>
---
 drivers/regulator/s2mps11.c |   75 +++++++++++++++++++++++++++++++++++++------
 1 file changed, 65 insertions(+), 10 deletions(-)

diff --git a/drivers/regulator/s2mps11.c b/drivers/regulator/s2mps11.c
index d44bd5b3fe8e..8504ab29aa9f 100644
--- a/drivers/regulator/s2mps11.c
+++ b/drivers/regulator/s2mps11.c
@@ -25,10 +25,9 @@
 #include <linux/mfd/samsung/core.h>
 #include <linux/mfd/samsung/s2mps11.h>
 
-#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[] __initconst = {
 	regulator_desc_ldo2(1),
 	regulator_desc_ldo1(2),
 	regulator_desc_ldo1(3),
@@ -396,21 +395,62 @@ static const struct regulator_desc regulators[] = {
 	regulator_desc_buck10,
 };
 
+/*
+ * Allocates memory under 'regulators' pointer and copies there array
+ * of regulator_desc for given device.
+ *
+ * Returns number of regulators or negative ERRNO on error.
+ */
+static int __init
+s2mps11_pmic_init_regulators_desc(struct platform_device *pdev,
+		struct regulator_desc **regulators)
+{
+	const struct regulator_desc *regulators_init;
+	enum sec_device_type dev_type;
+	int rdev_num;
+
+	dev_type = platform_get_device_id(pdev)->driver_data;
+	switch (dev_type) {
+	case S2MPS11X:
+		rdev_num = ARRAY_SIZE(s2mps11_regulators);
+		regulators_init = s2mps11_regulators;
+		break;
+	default:
+		dev_err(&pdev->dev, "Invalid device type: %u\n", dev_type);
+		return -EINVAL;
+	};
+
+	*regulators = devm_kzalloc(&pdev->dev,
+			sizeof(**regulators) * rdev_num, GFP_KERNEL);
+	if (!*regulators)
+		return -ENOMEM;
+
+	memcpy(*regulators, regulators_init, sizeof(**regulators) * rdev_num);
+
+	return rdev_num;
+}
+
 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;
+	struct regulator_desc *regulators = NULL;
+	unsigned int rdev_num;
 
 	s2mps11 = devm_kzalloc(&pdev->dev, sizeof(struct s2mps11_info),
 				GFP_KERNEL);
 	if (!s2mps11)
 		return -ENOMEM;
 
+	rdev_num = s2mps11_pmic_init_regulators_desc(pdev, &regulators);
+	if (rdev_num < 0)
+		return rdev_num;
+
 	if (!iodev->dev->of_node) {
 		if (pdata) {
 			goto common_reg;
@@ -421,7 +461,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) * rdev_num, GFP_KERNEL);
+	if (!s2mps11->rdev)
+		return -ENOMEM;
+
+	rdata = devm_kzalloc(&pdev->dev, sizeof(*rdata) * rdev_num,
+			GFP_KERNEL);
+	if (!rdata)
+		return -ENOMEM;
+
+	for (i = 0; i < rdev_num; i++)
 		rdata[i].name = regulators[i].name;
 
 	reg_np = of_find_node_by_name(iodev->dev->of_node, "regulators");
@@ -430,15 +480,16 @@ 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, rdev_num);
 
 common_reg:
 	platform_set_drvdata(pdev, s2mps11);
+	s2mps11->rdev_num = rdev_num;
 
 	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 < rdev_num; i++) {
 		if (!reg_np) {
 			config.init_data = pdata->regulators[i].initdata;
 			config.of_node = pdata->regulators[i].reg_node;
@@ -457,11 +508,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);
-- 
1.7.9.5


  parent reply	other threads:[~2014-02-13 12:37 UTC|newest]

Thread overview: 43+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-02-13  9:13 [PATCH v2 00/14] mfd/regulator/rtc: sec: Add support for S2MPS14 Krzysztof Kozlowski
2014-02-13  9:13 ` [PATCH v2 01/14] mfd: sec: Add maximum RTC register for regmap config Krzysztof Kozlowski
2014-02-13  9:13 ` [PATCH v2 02/14] mfd: sec: Select different RTC regmaps for devices Krzysztof Kozlowski
2014-02-13  9:13 ` [PATCH v2 03/14] mfd/rtc: sec/s5m: Rename SEC* symbols to S5M Krzysztof Kozlowski
2014-02-13 10:11   ` Lee Jones
2014-02-13  9:13 ` [PATCH v2 04/14] rtc: s5m: Remove undocumented time init on first boot Krzysztof Kozlowski
2014-02-13  9:13 ` [PATCH v2 05/14] mfd: sec: Use consistent S2MPS11 RTC alarm interrupt indexes Krzysztof Kozlowski
2014-02-13  9:13 ` [PATCH v2 06/14] regulator: s2mps11: Constify regulator_desc array Krzysztof Kozlowski
2014-02-13  9:14 ` [PATCH v2 07/14] regulator: s2mps11: Copy supported regulators from initconst Krzysztof Kozlowski
2014-02-13 12:21   ` Yadwinder Singh Brar
2014-02-13 12:35     ` Krzysztof Kozlowski
2014-02-13 12:37     ` Krzysztof Kozlowski [this message]
2014-02-13 18:05       ` [PATCH " Mark Brown
2014-02-13 19:07   ` [PATCH v2 " Mark Brown
2014-02-14  7:46     ` Krzysztof Kozlowski
2014-02-13  9:14 ` [PATCH v2 08/14] mfd: sec: Add support for S2MPS14 Krzysztof Kozlowski
2014-02-13  9:14 ` [PATCH v2 09/14] regulator: s2mps11: Add support for S2MPS14 regulators Krzysztof Kozlowski
2014-02-13 12:24   ` Yadwinder Singh Brar
2014-02-13 19:10   ` Mark Brown
2014-02-14  7:33     ` Krzysztof Kozlowski
2014-02-13  9:14 ` [PATCH v2 10/14] Documentation: mfd: s2mps11: Document support for S2MPS14 Krzysztof Kozlowski
2014-02-13 14:55   ` Tomasz Figa
2014-02-13  9:14 ` [PATCH v2 11/14] regulator: s2mps11: Add opmode for S2MPS14 regulators Krzysztof Kozlowski
2014-02-13 12:16   ` Yadwinder Singh Brar
2014-02-14 13:05     ` Krzysztof Kozlowski
2014-02-14 21:05       ` Mark Brown
2014-02-17  8:07         ` Krzysztof Kozlowski
2014-02-18  0:35           ` Mark Brown
2014-02-18  8:12             ` Krzysztof Kozlowski
2014-02-19  4:08               ` Mark Brown
2014-02-19 10:09                 ` Krzysztof Kozlowski
2014-02-19 12:16                   ` Mark Brown
2014-02-19 14:19                 ` Krzysztof Kozlowski
2014-02-19 15:07                   ` Mark Brown
2014-02-13 12:43   ` Lee Jones
2014-02-13 13:00     ` Krzysztof Kozlowski
2014-02-13 19:28   ` Mark Brown
2014-02-14  8:15     ` Krzysztof Kozlowski
2014-02-14 20:59       ` Mark Brown
2014-02-17  8:09         ` Krzysztof Kozlowski
2014-02-13  9:14 ` [PATCH v2 12/14] Documentation: mfd/regulator: s2mps11: Document the "op_mode" bindings Krzysztof Kozlowski
2014-02-13  9:14 ` [PATCH v2 13/14] rtc: s5m: Support different register layout Krzysztof Kozlowski
2014-02-13  9:14 ` [PATCH v2 14/14] rtc: s5m: Add support for S2MPS14 RTC Krzysztof Kozlowski

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1392295024-4862-1-git-send-email-k.kozlowski@samsung.com \
    --to=k.kozlowski@samsung.com \
    --cc=b.zolnierkie@samsung.com \
    --cc=broonie@kernel.org \
    --cc=cw00.choi@samsung.com \
    --cc=kyungmin.park@samsung.com \
    --cc=lee.jones@linaro.org \
    --cc=lgirdwood@gmail.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-samsung-soc@vger.kernel.org \
    --cc=m.szyprowski@samsung.com \
    --cc=sameo@linux.intel.com \
    --cc=sbkim73@samsung.com \
    --cc=yadi.brar01@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.