regulator: mc13783: Add device tree probe support

Patch adds device tree probe support for mc13783-regulator driver.

Signed-off-by: Alexander Shiyan <shc_work@mail.ru>
Signed-off-by: Mark Brown <broonie@sirena.org.uk>
This commit is contained in:
Alexander Shiyan 2013-04-27 10:29:25 +04:00 committed by Mark Brown
parent eb0d8e7a14
commit 86b139f0f3
2 changed files with 61 additions and 17 deletions

View File

@ -10,10 +10,40 @@ Optional properties:
- fsl,mc13xxx-uses-touch : Indicate the touchscreen controller is being used - fsl,mc13xxx-uses-touch : Indicate the touchscreen controller is being used
Sub-nodes: Sub-nodes:
- regulators : Contain the regulator nodes. The MC13892 regulators are - regulators : Contain the regulator nodes. The regulators are bound using
bound using their names as listed below with their registers and bits their names as listed below with their registers and bits for enabling.
for enabling.
MC13783 regulators:
sw1a : regulator SW1A (register 24, bit 0)
sw1b : regulator SW1B (register 25, bit 0)
sw2a : regulator SW2A (register 26, bit 0)
sw2b : regulator SW2B (register 27, bit 0)
sw3 : regulator SW3 (register 29, bit 20)
vaudio : regulator VAUDIO (register 32, bit 0)
viohi : regulator VIOHI (register 32, bit 3)
violo : regulator VIOLO (register 32, bit 6)
vdig : regulator VDIG (register 32, bit 9)
vgen : regulator VGEN (register 32, bit 12)
vrfdig : regulator VRFDIG (register 32, bit 15)
vrfref : regulator VRFREF (register 32, bit 18)
vrfcp : regulator VRFCP (register 32, bit 21)
vsim : regulator VSIM (register 33, bit 0)
vesim : regulator VESIM (register 33, bit 3)
vcam : regulator VCAM (register 33, bit 6)
vrfbg : regulator VRFBG (register 33, bit 9)
vvib : regulator VVIB (register 33, bit 11)
vrf1 : regulator VRF1 (register 33, bit 12)
vrf2 : regulator VRF2 (register 33, bit 15)
vmmc1 : regulator VMMC1 (register 33, bit 18)
vmmc2 : regulator VMMC2 (register 33, bit 21)
gpo1 : regulator GPO1 (register 34, bit 6)
gpo2 : regulator GPO2 (register 34, bit 8)
gpo3 : regulator GPO3 (register 34, bit 10)
gpo4 : regulator GPO4 (register 34, bit 12)
pwgt1spi : regulator PWGT1SPI (register 34, bit 15)
pwgt2spi : regulator PWGT2SPI (register 34, bit 16)
MC13892 regulators:
vcoincell : regulator VCOINCELL (register 13, bit 23) vcoincell : regulator VCOINCELL (register 13, bit 23)
sw1 : regulator SW1 (register 24, bit 0) sw1 : regulator SW1 (register 24, bit 0)
sw2 : regulator SW2 (register 25, bit 0) sw2 : regulator SW2 (register 25, bit 0)

View File

@ -398,33 +398,51 @@ static int mc13783_regulator_probe(struct platform_device *pdev)
struct mc13xxx *mc13783 = dev_get_drvdata(pdev->dev.parent); struct mc13xxx *mc13783 = dev_get_drvdata(pdev->dev.parent);
struct mc13xxx_regulator_platform_data *pdata = struct mc13xxx_regulator_platform_data *pdata =
dev_get_platdata(&pdev->dev); dev_get_platdata(&pdev->dev);
struct mc13xxx_regulator_init_data *init_data; struct mc13xxx_regulator_init_data *mc13xxx_data;
struct regulator_config config = { }; struct regulator_config config = { };
int i, ret; int i, ret, num_regulators;
dev_dbg(&pdev->dev, "%s id %d\n", __func__, pdev->id); num_regulators = mc13xxx_get_num_regulators_dt(pdev);
if (!pdata) if (num_regulators <= 0 && pdata)
num_regulators = pdata->num_regulators;
if (num_regulators <= 0)
return -EINVAL; return -EINVAL;
priv = devm_kzalloc(&pdev->dev, sizeof(*priv) + priv = devm_kzalloc(&pdev->dev, sizeof(*priv) +
pdata->num_regulators * sizeof(priv->regulators[0]), num_regulators * sizeof(priv->regulators[0]),
GFP_KERNEL); GFP_KERNEL);
if (!priv) if (!priv)
return -ENOMEM; return -ENOMEM;
priv->num_regulators = num_regulators;
priv->mc13xxx_regulators = mc13783_regulators; priv->mc13xxx_regulators = mc13783_regulators;
priv->mc13xxx = mc13783; priv->mc13xxx = mc13783;
platform_set_drvdata(pdev, priv);
for (i = 0; i < pdata->num_regulators; i++) { mc13xxx_data = mc13xxx_parse_regulators_dt(pdev, mc13783_regulators,
ARRAY_SIZE(mc13783_regulators));
for (i = 0; i < priv->num_regulators; i++) {
struct regulator_init_data *init_data;
struct regulator_desc *desc; struct regulator_desc *desc;
struct device_node *node = NULL;
int id;
init_data = &pdata->regulators[i]; if (mc13xxx_data) {
desc = &mc13783_regulators[init_data->id].desc; 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 = &mc13783_regulators[id].desc;
config.dev = &pdev->dev; config.dev = &pdev->dev;
config.init_data = init_data->init_data; config.init_data = init_data;
config.driver_data = priv; config.driver_data = priv;
config.of_node = node;
priv->regulators[i] = regulator_register(desc, &config); priv->regulators[i] = regulator_register(desc, &config);
if (IS_ERR(priv->regulators[i])) { if (IS_ERR(priv->regulators[i])) {
@ -435,8 +453,6 @@ static int mc13783_regulator_probe(struct platform_device *pdev)
} }
} }
platform_set_drvdata(pdev, priv);
return 0; return 0;
err: err:
while (--i >= 0) while (--i >= 0)
@ -448,13 +464,11 @@ err:
static int mc13783_regulator_remove(struct platform_device *pdev) static int mc13783_regulator_remove(struct platform_device *pdev)
{ {
struct mc13xxx_regulator_priv *priv = platform_get_drvdata(pdev); struct mc13xxx_regulator_priv *priv = platform_get_drvdata(pdev);
struct mc13xxx_regulator_platform_data *pdata =
dev_get_platdata(&pdev->dev);
int i; int i;
platform_set_drvdata(pdev, NULL); 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]); regulator_unregister(priv->regulators[i]);
return 0; return 0;