|
@@ -527,18 +527,27 @@ static int __devinit mc13892_regulator_probe(struct platform_device *pdev)
|
|
|
struct mc13xxx *mc13892 = dev_get_drvdata(pdev->dev.parent);
|
|
|
struct mc13xxx_regulator_platform_data *pdata =
|
|
|
dev_get_platdata(&pdev->dev);
|
|
|
- struct mc13xxx_regulator_init_data *init_data;
|
|
|
+ struct mc13xxx_regulator_init_data *mc13xxx_data;
|
|
|
int i, ret;
|
|
|
+ int num_regulators = 0;
|
|
|
u32 val;
|
|
|
|
|
|
+ num_regulators = mc13xxx_get_num_regulators_dt(pdev);
|
|
|
+ if (num_regulators <= 0 && pdata)
|
|
|
+ num_regulators = pdata->num_regulators;
|
|
|
+ if (num_regulators <= 0)
|
|
|
+ return -EINVAL;
|
|
|
+
|
|
|
priv = kzalloc(sizeof(*priv) +
|
|
|
- pdata->num_regulators * sizeof(priv->regulators[0]),
|
|
|
+ num_regulators * sizeof(priv->regulators[0]),
|
|
|
GFP_KERNEL);
|
|
|
if (!priv)
|
|
|
return -ENOMEM;
|
|
|
|
|
|
+ priv->num_regulators = num_regulators;
|
|
|
priv->mc13xxx_regulators = mc13892_regulators;
|
|
|
priv->mc13xxx = mc13892;
|
|
|
+ platform_set_drvdata(pdev, priv);
|
|
|
|
|
|
mc13xxx_lock(mc13892);
|
|
|
ret = mc13xxx_reg_read(mc13892, MC13892_REVISION, &val);
|
|
@@ -569,11 +578,27 @@ static int __devinit mc13892_regulator_probe(struct platform_device *pdev)
|
|
|
= mc13892_vcam_set_mode;
|
|
|
mc13892_regulators[MC13892_VCAM].desc.ops->get_mode
|
|
|
= mc13892_vcam_get_mode;
|
|
|
- for (i = 0; i < pdata->num_regulators; i++) {
|
|
|
- init_data = &pdata->regulators[i];
|
|
|
+
|
|
|
+ mc13xxx_data = mc13xxx_parse_regulators_dt(pdev, mc13892_regulators,
|
|
|
+ ARRAY_SIZE(mc13892_regulators));
|
|
|
+ for (i = 0; i < num_regulators; i++) {
|
|
|
+ struct regulator_init_data *init_data;
|
|
|
+ struct regulator_desc *desc;
|
|
|
+ struct device_node *node = NULL;
|
|
|
+ int id;
|
|
|
+
|
|
|
+ if (mc13xxx_data) {
|
|
|
+ id = mc13xxx_data[i].id;
|
|
|
+ init_data = mc13xxx_data[i].init_data;
|
|
|
+ node = mc13xxx_data[i].node;
|
|
|
+ } else {
|
|
|
+ id = pdata->regulators[i].id;
|
|
|
+ init_data = pdata->regulators[i].init_data;
|
|
|
+ }
|
|
|
+ desc = &mc13892_regulators[id].desc;
|
|
|
+
|
|
|
priv->regulators[i] = regulator_register(
|
|
|
- &mc13892_regulators[init_data->id].desc,
|
|
|
- &pdev->dev, init_data->init_data, priv, NULL);
|
|
|
+ desc, &pdev->dev, init_data, priv, node);
|
|
|
|
|
|
if (IS_ERR(priv->regulators[i])) {
|
|
|
dev_err(&pdev->dev, "failed to register regulator %s\n",
|
|
@@ -583,8 +608,6 @@ static int __devinit mc13892_regulator_probe(struct platform_device *pdev)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- platform_set_drvdata(pdev, priv);
|
|
|
-
|
|
|
return 0;
|
|
|
err:
|
|
|
while (--i >= 0)
|
|
@@ -600,13 +623,11 @@ err_free:
|
|
|
static int __devexit mc13892_regulator_remove(struct platform_device *pdev)
|
|
|
{
|
|
|
struct mc13xxx_regulator_priv *priv = platform_get_drvdata(pdev);
|
|
|
- struct mc13xxx_regulator_platform_data *pdata =
|
|
|
- dev_get_platdata(&pdev->dev);
|
|
|
int i;
|
|
|
|
|
|
platform_set_drvdata(pdev, NULL);
|
|
|
|
|
|
- for (i = 0; i < pdata->num_regulators; i++)
|
|
|
+ for (i = 0; i < priv->num_regulators; i++)
|
|
|
regulator_unregister(priv->regulators[i]);
|
|
|
|
|
|
kfree(priv);
|