Commit 18766f09 authored by Anton Vorontsov's avatar Anton Vorontsov

Merge with upstream to accommodate with MFD changes

commit 0848c94f ("mfd: core: Push irqdomain mapping out into devices")
that appeared in v3.6-rc6 adds another argument to the mfd_add_devices()
call, and that makes commit a830d28b ("power_supply: Enable
battery-charger for 88pm860x", which is battery tree) no longer compatible
with the latest kernels.

This commit is used to merge upstream back into battery tree and
accommodate 88pm860x driver for the latest changes in MFD core.
Signed-off-by: default avatarStephen Rothwell <sfr@canb.auug.org.au>
Reported-by: default avatarFengguang Wu <fengguang.wu@intel.com>
Reported-by: default avatarSamuel Ortiz <sameo@linux.intel.com>
Signed-off-by: default avatarAnton Vorontsov <anton.vorontsov@linaro.org>
parents c10a002a 0848c94f
...@@ -470,7 +470,8 @@ static int __devinit device_800_init(struct pm80x_chip *chip, ...@@ -470,7 +470,8 @@ static int __devinit device_800_init(struct pm80x_chip *chip,
ret = ret =
mfd_add_devices(chip->dev, 0, &onkey_devs[0], mfd_add_devices(chip->dev, 0, &onkey_devs[0],
ARRAY_SIZE(onkey_devs), &onkey_resources[0], 0); ARRAY_SIZE(onkey_devs), &onkey_resources[0], 0,
NULL);
if (ret < 0) { if (ret < 0) {
dev_err(chip->dev, "Failed to add onkey subdev\n"); dev_err(chip->dev, "Failed to add onkey subdev\n");
goto out_dev; goto out_dev;
...@@ -481,7 +482,7 @@ static int __devinit device_800_init(struct pm80x_chip *chip, ...@@ -481,7 +482,7 @@ static int __devinit device_800_init(struct pm80x_chip *chip,
rtc_devs[0].platform_data = pdata->rtc; rtc_devs[0].platform_data = pdata->rtc;
rtc_devs[0].pdata_size = sizeof(struct pm80x_rtc_pdata); rtc_devs[0].pdata_size = sizeof(struct pm80x_rtc_pdata);
ret = mfd_add_devices(chip->dev, 0, &rtc_devs[0], ret = mfd_add_devices(chip->dev, 0, &rtc_devs[0],
ARRAY_SIZE(rtc_devs), NULL, 0); ARRAY_SIZE(rtc_devs), NULL, 0, NULL);
if (ret < 0) { if (ret < 0) {
dev_err(chip->dev, "Failed to add rtc subdev\n"); dev_err(chip->dev, "Failed to add rtc subdev\n");
goto out_dev; goto out_dev;
......
...@@ -216,7 +216,8 @@ static int __devinit device_805_init(struct pm80x_chip *chip) ...@@ -216,7 +216,8 @@ static int __devinit device_805_init(struct pm80x_chip *chip)
} }
ret = mfd_add_devices(chip->dev, 0, &codec_devs[0], ret = mfd_add_devices(chip->dev, 0, &codec_devs[0],
ARRAY_SIZE(codec_devs), &codec_resources[0], 0); ARRAY_SIZE(codec_devs), &codec_resources[0], 0,
NULL);
if (ret < 0) { if (ret < 0) {
dev_err(chip->dev, "Failed to add codec subdev\n"); dev_err(chip->dev, "Failed to add codec subdev\n");
goto out_codec; goto out_codec;
......
...@@ -644,7 +644,7 @@ static void __devinit device_bk_init(struct pm860x_chip *chip, ...@@ -644,7 +644,7 @@ static void __devinit device_bk_init(struct pm860x_chip *chip,
bk_devs[i].resources = &bk_resources[j]; bk_devs[i].resources = &bk_resources[j];
ret = mfd_add_devices(chip->dev, 0, ret = mfd_add_devices(chip->dev, 0,
&bk_devs[i], 1, &bk_devs[i], 1,
&bk_resources[j], 0); &bk_resources[j], 0, NULL);
if (ret < 0) { if (ret < 0) {
dev_err(chip->dev, "Failed to add " dev_err(chip->dev, "Failed to add "
"backlight subdev\n"); "backlight subdev\n");
...@@ -679,7 +679,7 @@ static void __devinit device_led_init(struct pm860x_chip *chip, ...@@ -679,7 +679,7 @@ static void __devinit device_led_init(struct pm860x_chip *chip,
led_devs[i].resources = &led_resources[j], led_devs[i].resources = &led_resources[j],
ret = mfd_add_devices(chip->dev, 0, ret = mfd_add_devices(chip->dev, 0,
&led_devs[i], 1, &led_devs[i], 1,
&led_resources[j], 0); &led_resources[j], 0, NULL);
if (ret < 0) { if (ret < 0) {
dev_err(chip->dev, "Failed to add " dev_err(chip->dev, "Failed to add "
"led subdev\n"); "led subdev\n");
...@@ -716,7 +716,7 @@ static void __devinit device_regulator_init(struct pm860x_chip *chip, ...@@ -716,7 +716,7 @@ static void __devinit device_regulator_init(struct pm860x_chip *chip,
regulator_devs[i].resources = &regulator_resources[seq]; regulator_devs[i].resources = &regulator_resources[seq];
ret = mfd_add_devices(chip->dev, 0, &regulator_devs[i], 1, ret = mfd_add_devices(chip->dev, 0, &regulator_devs[i], 1,
&regulator_resources[seq], 0); &regulator_resources[seq], 0, NULL);
if (ret < 0) { if (ret < 0) {
dev_err(chip->dev, "Failed to add regulator subdev\n"); dev_err(chip->dev, "Failed to add regulator subdev\n");
goto out; goto out;
...@@ -740,7 +740,7 @@ static void __devinit device_rtc_init(struct pm860x_chip *chip, ...@@ -740,7 +740,7 @@ static void __devinit device_rtc_init(struct pm860x_chip *chip,
rtc_devs[0].resources = &rtc_resources[0]; rtc_devs[0].resources = &rtc_resources[0];
ret = mfd_add_devices(chip->dev, 0, &rtc_devs[0], ret = mfd_add_devices(chip->dev, 0, &rtc_devs[0],
ARRAY_SIZE(rtc_devs), &rtc_resources[0], ARRAY_SIZE(rtc_devs), &rtc_resources[0],
chip->irq_base); chip->irq_base, NULL);
if (ret < 0) if (ret < 0)
dev_err(chip->dev, "Failed to add rtc subdev\n"); dev_err(chip->dev, "Failed to add rtc subdev\n");
} }
...@@ -759,7 +759,7 @@ static void __devinit device_touch_init(struct pm860x_chip *chip, ...@@ -759,7 +759,7 @@ static void __devinit device_touch_init(struct pm860x_chip *chip,
touch_devs[0].resources = &touch_resources[0]; touch_devs[0].resources = &touch_resources[0];
ret = mfd_add_devices(chip->dev, 0, &touch_devs[0], ret = mfd_add_devices(chip->dev, 0, &touch_devs[0],
ARRAY_SIZE(touch_devs), &touch_resources[0], ARRAY_SIZE(touch_devs), &touch_resources[0],
chip->irq_base); chip->irq_base, NULL);
if (ret < 0) if (ret < 0)
dev_err(chip->dev, "Failed to add touch subdev\n"); dev_err(chip->dev, "Failed to add touch subdev\n");
} }
...@@ -777,7 +777,7 @@ static void __devinit device_power_init(struct pm860x_chip *chip, ...@@ -777,7 +777,7 @@ static void __devinit device_power_init(struct pm860x_chip *chip,
power_devs[0].num_resources = ARRAY_SIZE(battery_resources); power_devs[0].num_resources = ARRAY_SIZE(battery_resources);
power_devs[0].resources = &battery_resources[0], power_devs[0].resources = &battery_resources[0],
ret = mfd_add_devices(chip->dev, 0, &power_devs[0], 1, ret = mfd_add_devices(chip->dev, 0, &power_devs[0], 1,
&battery_resources[0], chip->irq_base); &battery_resources[0], chip->irq_base, NULL);
if (ret < 0) if (ret < 0)
dev_err(chip->dev, "Failed to add battery subdev\n"); dev_err(chip->dev, "Failed to add battery subdev\n");
...@@ -786,7 +786,7 @@ static void __devinit device_power_init(struct pm860x_chip *chip, ...@@ -786,7 +786,7 @@ static void __devinit device_power_init(struct pm860x_chip *chip,
power_devs[1].num_resources = ARRAY_SIZE(charger_resources); power_devs[1].num_resources = ARRAY_SIZE(charger_resources);
power_devs[1].resources = &charger_resources[0], power_devs[1].resources = &charger_resources[0],
ret = mfd_add_devices(chip->dev, 0, &power_devs[1], 1, ret = mfd_add_devices(chip->dev, 0, &power_devs[1], 1,
&charger_resources[0], chip->irq_base); &charger_resources[0], chip->irq_base, NULL);
if (ret < 0) if (ret < 0)
dev_err(chip->dev, "Failed to add charger subdev\n"); dev_err(chip->dev, "Failed to add charger subdev\n");
...@@ -795,7 +795,7 @@ static void __devinit device_power_init(struct pm860x_chip *chip, ...@@ -795,7 +795,7 @@ static void __devinit device_power_init(struct pm860x_chip *chip,
power_devs[2].num_resources = ARRAY_SIZE(preg_resources); power_devs[2].num_resources = ARRAY_SIZE(preg_resources);
power_devs[2].resources = &preg_resources[0], power_devs[2].resources = &preg_resources[0],
ret = mfd_add_devices(chip->dev, 0, &power_devs[2], 1, ret = mfd_add_devices(chip->dev, 0, &power_devs[2], 1,
&preg_resources[0], chip->irq_base); &preg_resources[0], chip->irq_base, NULL);
if (ret < 0) if (ret < 0)
dev_err(chip->dev, "Failed to add preg subdev\n"); dev_err(chip->dev, "Failed to add preg subdev\n");
...@@ -807,7 +807,7 @@ static void __devinit device_power_init(struct pm860x_chip *chip, ...@@ -807,7 +807,7 @@ static void __devinit device_power_init(struct pm860x_chip *chip,
power_devs[3].platform_data = pdata->chg_desc; power_devs[3].platform_data = pdata->chg_desc;
power_devs[3].pdata_size = sizeof(*pdata->chg_desc); power_devs[3].pdata_size = sizeof(*pdata->chg_desc);
ret = mfd_add_devices(chip->dev, 0, &power_devs[3], 1, ret = mfd_add_devices(chip->dev, 0, &power_devs[3], 1,
NULL, chip->irq_base); NULL, chip->irq_base, NULL);
if (ret < 0) if (ret < 0)
dev_err(chip->dev, "Failed to add chg-manager subdev\n"); dev_err(chip->dev, "Failed to add chg-manager subdev\n");
} }
...@@ -822,7 +822,7 @@ static void __devinit device_onkey_init(struct pm860x_chip *chip, ...@@ -822,7 +822,7 @@ static void __devinit device_onkey_init(struct pm860x_chip *chip,
onkey_devs[0].resources = &onkey_resources[0], onkey_devs[0].resources = &onkey_resources[0],
ret = mfd_add_devices(chip->dev, 0, &onkey_devs[0], ret = mfd_add_devices(chip->dev, 0, &onkey_devs[0],
ARRAY_SIZE(onkey_devs), &onkey_resources[0], ARRAY_SIZE(onkey_devs), &onkey_resources[0],
chip->irq_base); chip->irq_base, NULL);
if (ret < 0) if (ret < 0)
dev_err(chip->dev, "Failed to add onkey subdev\n"); dev_err(chip->dev, "Failed to add onkey subdev\n");
} }
...@@ -835,7 +835,8 @@ static void __devinit device_codec_init(struct pm860x_chip *chip, ...@@ -835,7 +835,8 @@ static void __devinit device_codec_init(struct pm860x_chip *chip,
codec_devs[0].num_resources = ARRAY_SIZE(codec_resources); codec_devs[0].num_resources = ARRAY_SIZE(codec_resources);
codec_devs[0].resources = &codec_resources[0], codec_devs[0].resources = &codec_resources[0],
ret = mfd_add_devices(chip->dev, 0, &codec_devs[0], ret = mfd_add_devices(chip->dev, 0, &codec_devs[0],
ARRAY_SIZE(codec_devs), &codec_resources[0], 0); ARRAY_SIZE(codec_devs), &codec_resources[0], 0,
NULL);
if (ret < 0) if (ret < 0)
dev_err(chip->dev, "Failed to add codec subdev\n"); dev_err(chip->dev, "Failed to add codec subdev\n");
} }
......
...@@ -424,7 +424,7 @@ static int aat2870_i2c_probe(struct i2c_client *client, ...@@ -424,7 +424,7 @@ static int aat2870_i2c_probe(struct i2c_client *client,
} }
ret = mfd_add_devices(aat2870->dev, 0, aat2870_devs, ret = mfd_add_devices(aat2870->dev, 0, aat2870_devs,
ARRAY_SIZE(aat2870_devs), NULL, 0); ARRAY_SIZE(aat2870_devs), NULL, 0, NULL);
if (ret != 0) { if (ret != 0) {
dev_err(aat2870->dev, "Failed to add subdev: %d\n", ret); dev_err(aat2870->dev, "Failed to add subdev: %d\n", ret);
goto out_disable; goto out_disable;
......
...@@ -946,7 +946,7 @@ static int __devinit ab3100_probe(struct i2c_client *client, ...@@ -946,7 +946,7 @@ static int __devinit ab3100_probe(struct i2c_client *client,
} }
err = mfd_add_devices(&client->dev, 0, ab3100_devs, err = mfd_add_devices(&client->dev, 0, ab3100_devs,
ARRAY_SIZE(ab3100_devs), NULL, 0); ARRAY_SIZE(ab3100_devs), NULL, 0, NULL);
ab3100_setup_debugfs(ab3100); ab3100_setup_debugfs(ab3100);
......
...@@ -1418,25 +1418,25 @@ static int __devinit ab8500_probe(struct platform_device *pdev) ...@@ -1418,25 +1418,25 @@ static int __devinit ab8500_probe(struct platform_device *pdev)
ret = mfd_add_devices(ab8500->dev, 0, abx500_common_devs, ret = mfd_add_devices(ab8500->dev, 0, abx500_common_devs,
ARRAY_SIZE(abx500_common_devs), NULL, ARRAY_SIZE(abx500_common_devs), NULL,
ab8500->irq_base); ab8500->irq_base, ab8500->domain);
if (ret) if (ret)
goto out_freeirq; goto out_freeirq;
if (is_ab9540(ab8500)) if (is_ab9540(ab8500))
ret = mfd_add_devices(ab8500->dev, 0, ab9540_devs, ret = mfd_add_devices(ab8500->dev, 0, ab9540_devs,
ARRAY_SIZE(ab9540_devs), NULL, ARRAY_SIZE(ab9540_devs), NULL,
ab8500->irq_base); ab8500->irq_base, ab8500->domain);
else else
ret = mfd_add_devices(ab8500->dev, 0, ab8500_devs, ret = mfd_add_devices(ab8500->dev, 0, ab8500_devs,
ARRAY_SIZE(ab8500_devs), NULL, ARRAY_SIZE(ab8500_devs), NULL,
ab8500->irq_base); ab8500->irq_base, ab8500->domain);
if (ret) if (ret)
goto out_freeirq; goto out_freeirq;
if (is_ab9540(ab8500) || is_ab8505(ab8500)) if (is_ab9540(ab8500) || is_ab8505(ab8500))
ret = mfd_add_devices(ab8500->dev, 0, ab9540_ab8505_devs, ret = mfd_add_devices(ab8500->dev, 0, ab9540_ab8505_devs,
ARRAY_SIZE(ab9540_ab8505_devs), NULL, ARRAY_SIZE(ab9540_ab8505_devs), NULL,
ab8500->irq_base); ab8500->irq_base, ab8500->domain);
if (ret) if (ret)
goto out_freeirq; goto out_freeirq;
...@@ -1444,7 +1444,7 @@ static int __devinit ab8500_probe(struct platform_device *pdev) ...@@ -1444,7 +1444,7 @@ static int __devinit ab8500_probe(struct platform_device *pdev)
/* Add battery management devices */ /* Add battery management devices */
ret = mfd_add_devices(ab8500->dev, 0, ab8500_bm_devs, ret = mfd_add_devices(ab8500->dev, 0, ab8500_bm_devs,
ARRAY_SIZE(ab8500_bm_devs), NULL, ARRAY_SIZE(ab8500_bm_devs), NULL,
ab8500->irq_base); ab8500->irq_base, ab8500->domain);
if (ret) if (ret)
dev_err(ab8500->dev, "error adding bm devices\n"); dev_err(ab8500->dev, "error adding bm devices\n");
} }
......
...@@ -316,7 +316,7 @@ int __devinit arizona_dev_init(struct arizona *arizona) ...@@ -316,7 +316,7 @@ int __devinit arizona_dev_init(struct arizona *arizona)
} }
ret = mfd_add_devices(arizona->dev, -1, early_devs, ret = mfd_add_devices(arizona->dev, -1, early_devs,
ARRAY_SIZE(early_devs), NULL, 0); ARRAY_SIZE(early_devs), NULL, 0, NULL);
if (ret != 0) { if (ret != 0) {
dev_err(dev, "Failed to add early children: %d\n", ret); dev_err(dev, "Failed to add early children: %d\n", ret);
return ret; return ret;
...@@ -516,11 +516,11 @@ int __devinit arizona_dev_init(struct arizona *arizona) ...@@ -516,11 +516,11 @@ int __devinit arizona_dev_init(struct arizona *arizona)
switch (arizona->type) { switch (arizona->type) {
case WM5102: case WM5102:
ret = mfd_add_devices(arizona->dev, -1, wm5102_devs, ret = mfd_add_devices(arizona->dev, -1, wm5102_devs,
ARRAY_SIZE(wm5102_devs), NULL, 0); ARRAY_SIZE(wm5102_devs), NULL, 0, NULL);
break; break;
case WM5110: case WM5110:
ret = mfd_add_devices(arizona->dev, -1, wm5110_devs, ret = mfd_add_devices(arizona->dev, -1, wm5110_devs,
ARRAY_SIZE(wm5102_devs), NULL, 0); ARRAY_SIZE(wm5102_devs), NULL, 0, NULL);
break; break;
} }
......
...@@ -913,14 +913,14 @@ static int __init asic3_mfd_probe(struct platform_device *pdev, ...@@ -913,14 +913,14 @@ static int __init asic3_mfd_probe(struct platform_device *pdev,
if (pdata->clock_rate) { if (pdata->clock_rate) {
ds1wm_pdata.clock_rate = pdata->clock_rate; ds1wm_pdata.clock_rate = pdata->clock_rate;
ret = mfd_add_devices(&pdev->dev, pdev->id, ret = mfd_add_devices(&pdev->dev, pdev->id,
&asic3_cell_ds1wm, 1, mem, asic->irq_base); &asic3_cell_ds1wm, 1, mem, asic->irq_base, NULL);
if (ret < 0) if (ret < 0)
goto out; goto out;
} }
if (mem_sdio && (irq >= 0)) { if (mem_sdio && (irq >= 0)) {
ret = mfd_add_devices(&pdev->dev, pdev->id, ret = mfd_add_devices(&pdev->dev, pdev->id,
&asic3_cell_mmc, 1, mem_sdio, irq); &asic3_cell_mmc, 1, mem_sdio, irq, NULL);
if (ret < 0) if (ret < 0)
goto out; goto out;
} }
...@@ -934,7 +934,7 @@ static int __init asic3_mfd_probe(struct platform_device *pdev, ...@@ -934,7 +934,7 @@ static int __init asic3_mfd_probe(struct platform_device *pdev,
asic3_cell_leds[i].pdata_size = sizeof(pdata->leds[i]); asic3_cell_leds[i].pdata_size = sizeof(pdata->leds[i]);
} }
ret = mfd_add_devices(&pdev->dev, 0, ret = mfd_add_devices(&pdev->dev, 0,
asic3_cell_leds, ASIC3_NUM_LEDS, NULL, 0); asic3_cell_leds, ASIC3_NUM_LEDS, NULL, 0, NULL);
} }
out: out:
......
...@@ -149,7 +149,7 @@ static int __devinit cs5535_mfd_probe(struct pci_dev *pdev, ...@@ -149,7 +149,7 @@ static int __devinit cs5535_mfd_probe(struct pci_dev *pdev,
} }
err = mfd_add_devices(&pdev->dev, -1, cs5535_mfd_cells, err = mfd_add_devices(&pdev->dev, -1, cs5535_mfd_cells,
ARRAY_SIZE(cs5535_mfd_cells), NULL, 0); ARRAY_SIZE(cs5535_mfd_cells), NULL, 0, NULL);
if (err) { if (err) {
dev_err(&pdev->dev, "MFD add devices failed: %d\n", err); dev_err(&pdev->dev, "MFD add devices failed: %d\n", err);
goto err_disable; goto err_disable;
......
...@@ -803,7 +803,7 @@ int __devinit da9052_device_init(struct da9052 *da9052, u8 chip_id) ...@@ -803,7 +803,7 @@ int __devinit da9052_device_init(struct da9052 *da9052, u8 chip_id)
dev_err(da9052->dev, "DA9052 ADC IRQ failed ret=%d\n", ret); dev_err(da9052->dev, "DA9052 ADC IRQ failed ret=%d\n", ret);
ret = mfd_add_devices(da9052->dev, -1, da9052_subdev_info, ret = mfd_add_devices(da9052->dev, -1, da9052_subdev_info,
ARRAY_SIZE(da9052_subdev_info), NULL, 0); ARRAY_SIZE(da9052_subdev_info), NULL, 0, NULL);
if (ret) if (ret)
goto err; goto err;
......
...@@ -129,7 +129,7 @@ static int __init davinci_vc_probe(struct platform_device *pdev) ...@@ -129,7 +129,7 @@ static int __init davinci_vc_probe(struct platform_device *pdev)
cell->pdata_size = sizeof(*davinci_vc); cell->pdata_size = sizeof(*davinci_vc);
ret = mfd_add_devices(&pdev->dev, pdev->id, davinci_vc->cells, ret = mfd_add_devices(&pdev->dev, pdev->id, davinci_vc->cells,
DAVINCI_VC_CELLS, NULL, 0); DAVINCI_VC_CELLS, NULL, 0, NULL);
if (ret != 0) { if (ret != 0) {
dev_err(&pdev->dev, "fail to register client devices\n"); dev_err(&pdev->dev, "fail to register client devices\n");
goto fail4; goto fail4;
......
...@@ -3010,7 +3010,7 @@ static int __devinit db8500_prcmu_probe(struct platform_device *pdev) ...@@ -3010,7 +3010,7 @@ static int __devinit db8500_prcmu_probe(struct platform_device *pdev)
prcmu_config_esram0_deep_sleep(ESRAM0_DEEP_SLEEP_STATE_RET); prcmu_config_esram0_deep_sleep(ESRAM0_DEEP_SLEEP_STATE_RET);
err = mfd_add_devices(&pdev->dev, 0, db8500_prcmu_devs, err = mfd_add_devices(&pdev->dev, 0, db8500_prcmu_devs,
ARRAY_SIZE(db8500_prcmu_devs), NULL, 0); ARRAY_SIZE(db8500_prcmu_devs), NULL, 0, NULL);
if (err) { if (err) {
pr_err("prcmu: Failed to add subdevices\n"); pr_err("prcmu: Failed to add subdevices\n");
return err; return err;
......
...@@ -168,7 +168,7 @@ static int __init pasic3_probe(struct platform_device *pdev) ...@@ -168,7 +168,7 @@ static int __init pasic3_probe(struct platform_device *pdev)
/* the first 5 PASIC3 registers control the DS1WM */ /* the first 5 PASIC3 registers control the DS1WM */
ds1wm_resources[0].end = (5 << asic->bus_shift) - 1; ds1wm_resources[0].end = (5 << asic->bus_shift) - 1;
ret = mfd_add_devices(&pdev->dev, pdev->id, ret = mfd_add_devices(&pdev->dev, pdev->id,
&ds1wm_cell, 1, r, irq); &ds1wm_cell, 1, r, irq, NULL);
if (ret < 0) if (ret < 0)
dev_warn(dev, "failed to register DS1WM\n"); dev_warn(dev, "failed to register DS1WM\n");
} }
...@@ -176,7 +176,8 @@ static int __init pasic3_probe(struct platform_device *pdev) ...@@ -176,7 +176,8 @@ static int __init pasic3_probe(struct platform_device *pdev)
if (pdata && pdata->led_pdata) { if (pdata && pdata->led_pdata) {
led_cell.platform_data = pdata->led_pdata; led_cell.platform_data = pdata->led_pdata;
led_cell.pdata_size = sizeof(struct pasic3_leds_machinfo); led_cell.pdata_size = sizeof(struct pasic3_leds_machinfo);
ret = mfd_add_devices(&pdev->dev, pdev->id, &led_cell, 1, r, 0); ret = mfd_add_devices(&pdev->dev, pdev->id, &led_cell, 1, r,
0, NULL);
if (ret < 0) if (ret < 0)
dev_warn(dev, "failed to register LED device\n"); dev_warn(dev, "failed to register LED device\n");
} }
......
...@@ -344,13 +344,13 @@ static int __devinit intel_msic_init_devices(struct intel_msic *msic) ...@@ -344,13 +344,13 @@ static int __devinit intel_msic_init_devices(struct intel_msic *msic)
continue; continue;
ret = mfd_add_devices(&pdev->dev, -1, &msic_devs[i], 1, NULL, ret = mfd_add_devices(&pdev->dev, -1, &msic_devs[i], 1, NULL,
pdata->irq[i]); pdata->irq[i], NULL);
if (ret) if (ret)
goto fail; goto fail;
} }
ret = mfd_add_devices(&pdev->dev, 0, msic_other_devs, ret = mfd_add_devices(&pdev->dev, 0, msic_other_devs,
ARRAY_SIZE(msic_other_devs), NULL, 0); ARRAY_SIZE(msic_other_devs), NULL, 0, NULL);
if (ret) if (ret)
goto fail; goto fail;
......
...@@ -147,7 +147,7 @@ static int __devinit cmodio_probe_submodules(struct cmodio_device *priv) ...@@ -147,7 +147,7 @@ static int __devinit cmodio_probe_submodules(struct cmodio_device *priv)
} }
return mfd_add_devices(&pdev->dev, 0, priv->cells, return mfd_add_devices(&pdev->dev, 0, priv->cells,
num_probed, NULL, pdev->irq); num_probed, NULL, pdev->irq, NULL);
} }
/* /*
......
...@@ -287,7 +287,8 @@ static int __devinit jz4740_adc_probe(struct platform_device *pdev) ...@@ -287,7 +287,8 @@ static int __devinit jz4740_adc_probe(struct platform_device *pdev)
writeb(0xff, adc->base + JZ_REG_ADC_CTRL); writeb(0xff, adc->base + JZ_REG_ADC_CTRL);
ret = mfd_add_devices(&pdev->dev, 0, jz4740_adc_cells, ret = mfd_add_devices(&pdev->dev, 0, jz4740_adc_cells,
ARRAY_SIZE(jz4740_adc_cells), mem_base, irq_base); ARRAY_SIZE(jz4740_adc_cells), mem_base,
irq_base, NULL);
if (ret < 0) if (ret < 0)
goto err_clk_put; goto err_clk_put;
......
...@@ -393,7 +393,8 @@ static int __devinit lm3533_device_als_init(struct lm3533 *lm3533) ...@@ -393,7 +393,8 @@ static int __devinit lm3533_device_als_init(struct lm3533 *lm3533)
lm3533_als_devs[0].platform_data = pdata->als; lm3533_als_devs[0].platform_data = pdata->als;
lm3533_als_devs[0].pdata_size = sizeof(*pdata->als); lm3533_als_devs[0].pdata_size = sizeof(*pdata->als);
ret = mfd_add_devices(lm3533->dev, 0, lm3533_als_devs, 1, NULL, 0); ret = mfd_add_devices(lm3533->dev, 0, lm3533_als_devs, 1, NULL,
0, NULL);
if (ret) { if (ret) {
dev_err(lm3533->dev, "failed to add ALS device\n"); dev_err(lm3533->dev, "failed to add ALS device\n");
return ret; return ret;
...@@ -422,7 +423,7 @@ static int __devinit lm3533_device_bl_init(struct lm3533 *lm3533) ...@@ -422,7 +423,7 @@ static int __devinit lm3533_device_bl_init(struct lm3533 *lm3533)
} }
ret = mfd_add_devices(lm3533->dev, 0, lm3533_bl_devs, ret = mfd_add_devices(lm3533->dev, 0, lm3533_bl_devs,
pdata->num_backlights, NULL, 0); pdata->num_backlights, NULL, 0, NULL);
if (ret) { if (ret) {
dev_err(lm3533->dev, "failed to add backlight devices\n"); dev_err(lm3533->dev, "failed to add backlight devices\n");
return ret; return ret;
...@@ -451,7 +452,7 @@ static int __devinit lm3533_device_led_init(struct lm3533 *lm3533) ...@@ -451,7 +452,7 @@ static int __devinit lm3533_device_led_init(struct lm3533 *lm3533)
} }
ret = mfd_add_devices(lm3533->dev, 0, lm3533_led_devs, ret = mfd_add_devices(lm3533->dev, 0, lm3533_led_devs,
pdata->num_leds, NULL, 0); pdata->num_leds, NULL, 0, NULL);
if (ret) { if (ret) {
dev_err(lm3533->dev, "failed to add LED devices\n"); dev_err(lm3533->dev, "failed to add LED devices\n");
return ret; return ret;
......
...@@ -750,7 +750,7 @@ static int __devinit lpc_ich_init_gpio(struct pci_dev *dev, ...@@ -750,7 +750,7 @@ static int __devinit lpc_ich_init_gpio(struct pci_dev *dev,
lpc_ich_finalize_cell(&lpc_ich_cells[LPC_GPIO], id); lpc_ich_finalize_cell(&lpc_ich_cells[LPC_GPIO], id);
ret = mfd_add_devices(&dev->dev, -1, &lpc_ich_cells[LPC_GPIO], ret = mfd_add_devices(&dev->dev, -1, &lpc_ich_cells[LPC_GPIO],
1, NULL, 0); 1, NULL, 0, NULL);
gpio_done: gpio_done:
if (acpi_conflict) if (acpi_conflict)
...@@ -765,7 +765,6 @@ static int __devinit lpc_ich_init_wdt(struct pci_dev *dev, ...@@ -765,7 +765,6 @@ static int __devinit lpc_ich_init_wdt(struct pci_dev *dev,
u32 base_addr_cfg; u32 base_addr_cfg;
u32 base_addr; u32 base_addr;
int ret; int ret;
bool acpi_conflict = false;
struct resource *res; struct resource *res;
/* Setup power management base register */ /* Setup power management base register */
...@@ -780,20 +779,11 @@ static int __devinit lpc_ich_init_wdt(struct pci_dev *dev, ...@@ -780,20 +779,11 @@ static int __devinit lpc_ich_init_wdt(struct pci_dev *dev,
res = wdt_io_res(ICH_RES_IO_TCO); res = wdt_io_res(ICH_RES_IO_TCO);
res->start = base_addr + ACPIBASE_TCO_OFF; res->start = base_addr + ACPIBASE_TCO_OFF;
res->end = base_addr + ACPIBASE_TCO_END; res->end = base_addr + ACPIBASE_TCO_END;
ret = acpi_check_resource_conflict(res);
if (ret) {
acpi_conflict = true;
goto wdt_done;
}
res = wdt_io_res(ICH_RES_IO_SMI); res = wdt_io_res(ICH_RES_IO_SMI);
res->start = base_addr + ACPIBASE_SMI_OFF; res->start = base_addr + ACPIBASE_SMI_OFF;
res->end = base_addr + ACPIBASE_SMI_END; res->end = base_addr + ACPIBASE_SMI_END;
ret = acpi_check_resource_conflict(res);
if (ret) {
acpi_conflict = true;
goto wdt_done;
}
lpc_ich_enable_acpi_space(dev); lpc_ich_enable_acpi_space(dev);
/* /*
...@@ -813,21 +803,13 @@ static int __devinit lpc_ich_init_wdt(struct pci_dev *dev, ...@@ -813,21 +803,13 @@ static int __devinit lpc_ich_init_wdt(struct pci_dev *dev,
res = wdt_mem_res(ICH_RES_MEM_GCS); res = wdt_mem_res(ICH_RES_MEM_GCS);
res->start = base_addr + ACPIBASE_GCS_OFF; res->start = base_addr + ACPIBASE_GCS_OFF;
res->end = base_addr + ACPIBASE_GCS_END; res->end = base_addr + ACPIBASE_GCS_END;
ret = acpi_check_resource_conflict(res);
if (ret) {
acpi_conflict = true;
goto wdt_done;
}
} }
lpc_ich_finalize_cell(&lpc_ich_cells[LPC_WDT], id); lpc_ich_finalize_cell(&lpc_ich_cells[LPC_WDT], id);
ret = mfd_add_devices(&dev->dev, -1, &lpc_ich_cells[LPC_WDT], ret = mfd_add_devices(&dev->dev, -1, &lpc_ich_cells[LPC_WDT],
1, NULL, 0); 1, NULL, 0, NULL);
wdt_done: wdt_done:
if (acpi_conflict)
pr_warn("Resource conflict(s) found affecting %s\n",
lpc_ich_cells[LPC_WDT].name);
return ret; return ret;
} }
......
...@@ -127,7 +127,8 @@ static int __devinit lpc_sch_probe(struct pci_dev *dev, ...@@ -127,7 +127,8 @@ static int __devinit lpc_sch_probe(struct pci_dev *dev,
lpc_sch_cells[i].id = id->device; lpc_sch_cells[i].id = id->device;
ret = mfd_add_devices(&dev->dev, 0, ret = mfd_add_devices(&dev->dev, 0,
lpc_sch_cells, ARRAY_SIZE(lpc_sch_cells), NULL, 0); lpc_sch_cells, ARRAY_SIZE(lpc_sch_cells), NULL,
0, NULL);
if (ret) if (ret)
goto out_dev; goto out_dev;
...@@ -153,7 +154,8 @@ static int __devinit lpc_sch_probe(struct pci_dev *dev, ...@@ -153,7 +154,8 @@ static int __devinit lpc_sch_probe(struct pci_dev *dev,
tunnelcreek_cells[i].id = id->device; tunnelcreek_cells[i].id = id->device;
ret = mfd_add_devices(&dev->dev, 0, tunnelcreek_cells, ret = mfd_add_devices(&dev->dev, 0, tunnelcreek_cells,
ARRAY_SIZE(tunnelcreek_cells), NULL, 0); ARRAY_SIZE(tunnelcreek_cells), NULL,
0, NULL);
} }
return ret; return ret;
......
...@@ -126,7 +126,7 @@ static int max77686_i2c_probe(struct i2c_client *i2c, ...@@ -126,7 +126,7 @@ static int max77686_i2c_probe(struct i2c_client *i2c,
max77686_irq_init(max77686); max77686_irq_init(max77686);
ret = mfd_add_devices(max77686->dev, -1, max77686_devs, ret = mfd_add_devices(max77686->dev, -1, max77686_devs,
ARRAY_SIZE(max77686_devs), NULL, 0); ARRAY_SIZE(max77686_devs), NULL, 0, NULL);
if (ret < 0) if (ret < 0)
goto err_mfd; goto err_mfd;
......
...@@ -159,7 +159,7 @@ static int max77693_i2c_probe(struct i2c_client *i2c, ...@@ -159,7 +159,7 @@ static int max77693_i2c_probe(struct i2c_client *i2c,
pm_runtime_set_active(max77693->dev); pm_runtime_set_active(max77693->dev);
ret = mfd_add_devices(max77693->dev, -1, max77693_devs, ret = mfd_add_devices(max77693->dev, -1, max77693_devs,
ARRAY_SIZE(max77693_devs), NULL, 0); ARRAY_SIZE(max77693_devs), NULL, 0, NULL);
if (ret < 0) if (ret < 0)
goto err_mfd; goto err_mfd;
......
...@@ -598,7 +598,7 @@ int __devinit max8925_device_init(struct max8925_chip *chip, ...@@ -598,7 +598,7 @@ int __devinit max8925_device_init(struct max8925_chip *chip,
ret = mfd_add_devices(chip->dev, 0, &rtc_devs[0], ret = mfd_add_devices(chip->dev, 0, &rtc_devs[0],
ARRAY_SIZE(rtc_devs), ARRAY_SIZE(rtc_devs),
&rtc_resources[0], chip->irq_base); &rtc_resources[0], chip->irq_base, NULL);
if (ret < 0) { if (ret < 0) {
dev_err(chip->dev, "Failed to add rtc subdev\n"); dev_err(chip->dev, "Failed to add rtc subdev\n");
goto out; goto out;
...@@ -606,7 +606,7 @@ int __devinit max8925_device_init(struct max8925_chip *chip, ...@@ -606,7 +606,7 @@ int __devinit max8925_device_init(struct max8925_chip *chip,
ret = mfd_add_devices(chip->dev, 0, &onkey_devs[0], ret = mfd_add_devices(chip->dev, 0, &onkey_devs[0],
ARRAY_SIZE(onkey_devs), ARRAY_SIZE(onkey_devs),
&onkey_resources[0], 0); &onkey_resources[0], 0, NULL);
if (ret < 0) { if (ret < 0) {
dev_err(chip->dev, "Failed to add onkey subdev\n"); dev_err(chip->dev, "Failed to add onkey subdev\n");
goto out_dev; goto out_dev;
...@@ -615,7 +615,7 @@ int __devinit max8925_device_init(struct max8925_chip *chip, ...@@ -615,7 +615,7 @@ int __devinit max8925_device_init(struct max8925_chip *chip,
if (pdata) { if (pdata) {
ret = mfd_add_devices(chip->dev, 0, &regulator_devs[0], ret = mfd_add_devices(chip->dev, 0, &regulator_devs[0],
ARRAY_SIZE(regulator_devs), ARRAY_SIZE(regulator_devs),
&regulator_resources[0], 0); &regulator_resources[0], 0, NULL);
if (ret < 0) { if (ret < 0) {
dev_err(chip->dev, "Failed to add regulator subdev\n"); dev_err(chip->dev, "Failed to add regulator subdev\n");
goto out_dev; goto out_dev;
...@@ -625,7 +625,7 @@ int __devinit max8925_device_init(struct max8925_chip *chip, ...@@ -625,7 +625,7 @@ int __devinit max8925_device_init(struct max8925_chip *chip,
if (pdata && pdata->backlight) { if (pdata && pdata->backlight) {
ret = mfd_add_devices(chip->dev, 0, &backlight_devs[0], ret = mfd_add_devices(chip->dev, 0, &backlight_devs[0],
ARRAY_SIZE(backlight_devs), ARRAY_SIZE(backlight_devs),
&backlight_resources[0], 0); &backlight_resources[0], 0, NULL);
if (ret < 0) { if (ret < 0) {
dev_err(chip->dev, "Failed to add backlight subdev\n"); dev_err(chip->dev, "Failed to add backlight subdev\n");
goto out_dev; goto out_dev;
...@@ -635,7 +635,7 @@ int __devinit max8925_device_init(struct max8925_chip *chip, ...@@ -635,7 +635,7 @@ int __devinit max8925_device_init(struct max8925_chip *chip,
if (pdata && pdata->power) { if (pdata && pdata->power) {
ret = mfd_add_devices(chip->dev, 0, &power_devs[0], ret = mfd_add_devices(chip->dev, 0, &power_devs[0],
ARRAY_SIZE(power_devs), ARRAY_SIZE(power_devs),
&power_supply_resources[0], 0); &power_supply_resources[0], 0, NULL);
if (ret < 0) { if (ret < 0) {
dev_err(chip->dev, "Failed to add power supply " dev_err(chip->dev, "Failed to add power supply "
"subdev\n"); "subdev\n");
...@@ -646,7 +646,7 @@ int __devinit max8925_device_init(struct max8925_chip *chip, ...@@ -646,7 +646,7 @@ int __devinit max8925_device_init(struct max8925_chip *chip,
if (pdata && pdata->touch) { if (pdata && pdata->touch) {
ret = mfd_add_devices(chip->dev, 0, &touch_devs[0], ret = mfd_add_devices(chip->dev, 0, &touch_devs[0],
ARRAY_SIZE(touch_devs), ARRAY_SIZE(touch_devs),
&touch_resources[0], 0); &touch_resources[0], 0, NULL);
if (ret < 0) { if (ret < 0) {
dev_err(chip->dev, "Failed to add touch subdev\n"); dev_err(chip->dev, "Failed to add touch subdev\n");
goto out_dev; goto out_dev;
......
...@@ -160,7 +160,7 @@ static int max8997_i2c_probe(struct i2c_client *i2c, ...@@ -160,7 +160,7 @@ static int max8997_i2c_probe(struct i2c_client *i2c,
mfd_add_devices(max8997->dev, -1, max8997_devs, mfd_add_devices(max8997->dev, -1, max8997_devs,
ARRAY_SIZE(max8997_devs), ARRAY_SIZE(max8997_devs),
NULL, 0); NULL, 0, NULL);
/* /*
* TODO: enable others (flash, muic, rtc, battery, ...) and * TODO: enable others (flash, muic, rtc, battery, ...) and
......
...@@ -161,13 +161,13 @@ static int max8998_i2c_probe(struct i2c_client *i2c, ...@@ -161,13 +161,13 @@ static int max8998_i2c_probe(struct i2c_client *i2c,
switch (id->driver_data) { switch (id->driver_data) {
case TYPE_LP3974: case TYPE_LP3974:
ret = mfd_add_devices(max8998->dev, -1, ret = mfd_add_devices(max8998->dev, -1,
lp3974_devs, ARRAY_SIZE(lp3974_devs), lp3974_devs, ARRAY_SIZE(lp3974_devs),
NULL, 0); NULL, 0, NULL);
break; break;
case TYPE_MAX8998: case TYPE_MAX8998:
ret = mfd_add_devices(max8998->dev, -1, ret = mfd_add_devices(max8998->dev, -1,
max8998_devs, ARRAY_SIZE(max8998_devs), max8998_devs, ARRAY_SIZE(max8998_devs),
NULL, 0); NULL, 0, NULL);
break; break;
default: default:
ret = -EINVAL; ret = -EINVAL;
......
...@@ -612,7 +612,7 @@ static int mc13xxx_add_subdevice_pdata(struct mc13xxx *mc13xxx, ...@@ -612,7 +612,7 @@ static int mc13xxx_add_subdevice_pdata(struct mc13xxx *mc13xxx,
if (!cell.name) if (!cell.name)
return -ENOMEM; return -ENOMEM;
return mfd_add_devices(mc13xxx->dev, -1, &cell, 1, NULL, 0); return mfd_add_devices(mc13xxx->dev, -1, &cell, 1, NULL, 0, NULL);
} }
static int mc13xxx_add_subdevice(struct mc13xxx *mc13xxx, const char *format) static int mc13xxx_add_subdevice(struct mc13xxx *mc13xxx, const char *format)
......
...@@ -74,12 +74,11 @@ static int mfd_platform_add_cell(struct platform_device *pdev, ...@@ -74,12 +74,11 @@ static int mfd_platform_add_cell(struct platform_device *pdev,
static int mfd_add_device(struct device *parent, int id, static int mfd_add_device(struct device *parent, int id,
const struct mfd_cell *cell, const struct mfd_cell *cell,
struct resource *mem_base, struct resource *mem_base,
int irq_base) int irq_base, struct irq_domain *domain)
{ {
struct resource *res; struct resource *res;
struct platform_device *pdev; struct platform_device *pdev;
struct device_node *np = NULL; struct device_node *np = NULL;
struct irq_domain *domain = NULL;
int ret = -ENOMEM; int ret = -ENOMEM;
int r; int r;
...@@ -97,7 +96,6 @@ static int mfd_add_device(struct device *parent, int id, ...@@ -97,7 +96,6 @@ static int mfd_add_device(struct device *parent, int id,
for_each_child_of_node(parent->of_node, np) { for_each_child_of_node(parent->of_node, np) {
if (of_device_is_compatible(np, cell->of_compatible)) { if (of_device_is_compatible(np, cell->of_compatible)) {
pdev->dev.of_node = np; pdev->dev.of_node = np;
domain = irq_find_host(parent->of_node);
break; break;
} }
} }
...@@ -177,7 +175,7 @@ static int mfd_add_device(struct device *parent, int id, ...@@ -177,7 +175,7 @@ static int mfd_add_device(struct device *parent, int id,
int mfd_add_devices(struct device *parent, int id, int mfd_add_devices(struct device *parent, int id,
struct mfd_cell *cells, int n_devs, struct mfd_cell *cells, int n_devs,
struct resource *mem_base, struct resource *mem_base,
int irq_base) int irq_base, struct irq_domain *domain)
{ {
int i; int i;
int ret = 0; int ret = 0;
...@@ -191,7 +189,8 @@ int mfd_add_devices(struct device *parent, int id, ...@@ -191,7 +189,8 @@ int mfd_add_devices(struct device *parent, int id,
for (i = 0; i < n_devs; i++) { for (i = 0; i < n_devs; i++) {
atomic_set(&cnts[i], 0); atomic_set(&cnts[i], 0);
cells[i].usage_count = &cnts[i]; cells[i].usage_count = &cnts[i];
ret = mfd_add_device(parent, id, cells + i, mem_base, irq_base); ret = mfd_add_device(parent, id, cells + i, mem_base,
irq_base, domain);
if (ret) if (ret)
break; break;
} }
...@@ -247,7 +246,8 @@ int mfd_clone_cell(const char *cell, const char **clones, size_t n_clones) ...@@ -247,7 +246,8 @@ int mfd_clone_cell(const char *cell, const char **clones, size_t n_clones)
for (i = 0; i < n_clones; i++) { for (i = 0; i < n_clones; i++) {
cell_entry.name = clones[i]; cell_entry.name = clones[i];
/* don't give up if a single call fails; just report error */ /* don't give up if a single call fails; just report error */
if (mfd_add_device(pdev->dev.parent, -1, &cell_entry, NULL, 0)) if (mfd_add_device(pdev->dev.parent, -1, &cell_entry, NULL, 0,
NULL))
dev_err(dev, "failed to create platform device '%s'\n", dev_err(dev, "failed to create platform device '%s'\n",
clones[i]); clones[i]);
} }
......
...@@ -453,7 +453,8 @@ static int __devinit palmas_i2c_probe(struct i2c_client *i2c, ...@@ -453,7 +453,8 @@ static int __devinit palmas_i2c_probe(struct i2c_client *i2c,
ret = mfd_add_devices(palmas->dev, -1, ret = mfd_add_devices(palmas->dev, -1,
children, ARRAY_SIZE(palmas_children), children, ARRAY_SIZE(palmas_children),
NULL, regmap_irq_chip_get_base(palmas->irq_data)); NULL, regmap_irq_chip_get_base(palmas->irq_data),
NULL);
kfree(children); kfree(children);
if (ret < 0) if (ret < 0)
......
...@@ -289,7 +289,7 @@ static int __devinit rc5t583_i2c_probe(struct i2c_client *i2c, ...@@ -289,7 +289,7 @@ static int __devinit rc5t583_i2c_probe(struct i2c_client *i2c,
} }
ret = mfd_add_devices(rc5t583->dev, -1, rc5t583_subdevs, ret = mfd_add_devices(rc5t583->dev, -1, rc5t583_subdevs,
ARRAY_SIZE(rc5t583_subdevs), NULL, 0); ARRAY_SIZE(rc5t583_subdevs), NULL, 0, NULL);
if (ret) { if (ret) {
dev_err(&i2c->dev, "add mfd devices failed: %d\n", ret); dev_err(&i2c->dev, "add mfd devices failed: %d\n", ret);
goto err_add_devs; goto err_add_devs;
......
...@@ -87,7 +87,8 @@ static int __devinit rdc321x_sb_probe(struct pci_dev *pdev, ...@@ -87,7 +87,8 @@ static int __devinit rdc321x_sb_probe(struct pci_dev *pdev,
rdc321x_wdt_pdata.sb_pdev = pdev; rdc321x_wdt_pdata.sb_pdev = pdev;
return mfd_add_devices(&pdev->dev, -1, return mfd_add_devices(&pdev->dev, -1,
rdc321x_sb_cells, ARRAY_SIZE(rdc321x_sb_cells), NULL, 0); rdc321x_sb_cells, ARRAY_SIZE(rdc321x_sb_cells),
NULL, 0, NULL);
} }
static void __devexit rdc321x_sb_remove(struct pci_dev *pdev) static void __devexit rdc321x_sb_remove(struct pci_dev *pdev)
......
...@@ -141,19 +141,19 @@ static int sec_pmic_probe(struct i2c_client *i2c, ...@@ -141,19 +141,19 @@ static int sec_pmic_probe(struct i2c_client *i2c,
switch (sec_pmic->device_type) { switch (sec_pmic->device_type) {
case S5M8751X: case S5M8751X:
ret = mfd_add_devices(sec_pmic->dev, -1, s5m8751_devs, ret = mfd_add_devices(sec_pmic->dev, -1, s5m8751_devs,
ARRAY_SIZE(s5m8751_devs), NULL, 0); ARRAY_SIZE(s5m8751_devs), NULL, 0, NULL);
break; break;
case S5M8763X: case S5M8763X:
ret = mfd_add_devices(sec_pmic->dev, -1, s5m8763_devs, ret = mfd_add_devices(sec_pmic->dev, -1, s5m8763_devs,
ARRAY_SIZE(s5m8763_devs), NULL, 0); ARRAY_SIZE(s5m8763_devs), NULL, 0, NULL);
break; break;
case S5M8767X: case S5M8767X:
ret = mfd_add_devices(sec_pmic->dev, -1, s5m8767_devs, ret = mfd_add_devices(sec_pmic->dev, -1, s5m8767_devs,
ARRAY_SIZE(s5m8767_devs), NULL, 0); ARRAY_SIZE(s5m8767_devs), NULL, 0, NULL);
break; break;
case S2MPS11X: case S2MPS11X:
ret = mfd_add_devices(sec_pmic->dev, -1, s2mps11_devs, ret = mfd_add_devices(sec_pmic->dev, -1, s2mps11_devs,
ARRAY_SIZE(s2mps11_devs), NULL, 0); ARRAY_SIZE(s2mps11_devs), NULL, 0, NULL);
break; break;
default: default:
/* If this happens the probe function is problem */ /* If this happens the probe function is problem */
......
...@@ -407,7 +407,7 @@ static int __devinit sta2x11_mfd_probe(struct pci_dev *pdev, ...@@ -407,7 +407,7 @@ static int __devinit sta2x11_mfd_probe(struct pci_dev *pdev,
sta2x11_mfd_bar0, sta2x11_mfd_bar0,
ARRAY_SIZE(sta2x11_mfd_bar0), ARRAY_SIZE(sta2x11_mfd_bar0),
&pdev->resource[0], &pdev->resource[0],
0); 0, NULL);
if (err) { if (err) {
dev_err(&pdev->dev, "mfd_add_devices[0] failed: %d\n", err); dev_err(&pdev->dev, "mfd_add_devices[0] failed: %d\n", err);
goto err_disable; goto err_disable;
...@@ -417,7 +417,7 @@ static int __devinit sta2x11_mfd_probe(struct pci_dev *pdev, ...@@ -417,7 +417,7 @@ static int __devinit sta2x11_mfd_probe(struct pci_dev *pdev,
sta2x11_mfd_bar1, sta2x11_mfd_bar1,
ARRAY_SIZE(sta2x11_mfd_bar1), ARRAY_SIZE(sta2x11_mfd_bar1),
&pdev->resource[1], &pdev->resource[1],
0); 0, NULL);
if (err) { if (err) {
dev_err(&pdev->dev, "mfd_add_devices[1] failed: %d\n", err); dev_err(&pdev->dev, "mfd_add_devices[1] failed: %d\n", err);
goto err_disable; goto err_disable;
......
...@@ -962,7 +962,7 @@ static int __devinit stmpe_add_device(struct stmpe *stmpe, ...@@ -962,7 +962,7 @@ static int __devinit stmpe_add_device(struct stmpe *stmpe,
struct mfd_cell *cell, int irq) struct mfd_cell *cell, int irq)
{ {
return mfd_add_devices(stmpe->dev, stmpe->pdata->id, cell, 1, return mfd_add_devices(stmpe->dev, stmpe->pdata->id, cell, 1,
NULL, stmpe->irq_base + irq); NULL, stmpe->irq_base + irq, NULL);
} }
static int __devinit stmpe_devices_init(struct stmpe *stmpe) static int __devinit stmpe_devices_init(struct stmpe *stmpe)
......
...@@ -388,7 +388,7 @@ static int t7l66xb_probe(struct platform_device *dev) ...@@ -388,7 +388,7 @@ static int t7l66xb_probe(struct platform_device *dev)
ret = mfd_add_devices(&dev->dev, dev->id, ret = mfd_add_devices(&dev->dev, dev->id,
t7l66xb_cells, ARRAY_SIZE(t7l66xb_cells), t7l66xb_cells, ARRAY_SIZE(t7l66xb_cells),
iomem, t7l66xb->irq_base); iomem, t7l66xb->irq_base, NULL);
if (!ret) if (!ret)
return 0; return 0;
......
...@@ -262,8 +262,8 @@ static int __devinit tc3589x_device_init(struct tc3589x *tc3589x) ...@@ -262,8 +262,8 @@ static int __devinit tc3589x_device_init(struct tc3589x *tc3589x)
if (blocks & TC3589x_BLOCK_GPIO) { if (blocks & TC3589x_BLOCK_GPIO) {
ret = mfd_add_devices(tc3589x->dev, -1, tc3589x_dev_gpio, ret = mfd_add_devices(tc3589x->dev, -1, tc3589x_dev_gpio,
ARRAY_SIZE(tc3589x_dev_gpio), NULL, ARRAY_SIZE(tc3589x_dev_gpio), NULL,
tc3589x->irq_base); tc3589x->irq_base, NULL);
if (ret) { if (ret) {
dev_err(tc3589x->dev, "failed to add gpio child\n"); dev_err(tc3589x->dev, "failed to add gpio child\n");
return ret; return ret;
...@@ -273,8 +273,8 @@ static int __devinit tc3589x_device_init(struct tc3589x *tc3589x) ...@@ -273,8 +273,8 @@ static int __devinit tc3589x_device_init(struct tc3589x *tc3589x)
if (blocks & TC3589x_BLOCK_KEYPAD) { if (blocks & TC3589x_BLOCK_KEYPAD) {
ret = mfd_add_devices(tc3589x->dev, -1, tc3589x_dev_keypad, ret = mfd_add_devices(tc3589x->dev, -1, tc3589x_dev_keypad,
ARRAY_SIZE(tc3589x_dev_keypad), NULL, ARRAY_SIZE(tc3589x_dev_keypad), NULL,
tc3589x->irq_base); tc3589x->irq_base, NULL);
if (ret) { if (ret) {
dev_err(tc3589x->dev, "failed to keypad child\n"); dev_err(tc3589x->dev, "failed to keypad child\n");
return ret; return ret;
......
...@@ -192,7 +192,7 @@ static int __devinit tc6387xb_probe(struct platform_device *dev) ...@@ -192,7 +192,7 @@ static int __devinit tc6387xb_probe(struct platform_device *dev)
printk(KERN_INFO "Toshiba tc6387xb initialised\n"); printk(KERN_INFO "Toshiba tc6387xb initialised\n");
ret = mfd_add_devices(&dev->dev, dev->id, tc6387xb_cells, ret = mfd_add_devices(&dev->dev, dev->id, tc6387xb_cells,
ARRAY_SIZE(tc6387xb_cells), iomem, irq); ARRAY_SIZE(tc6387xb_cells), iomem, irq, NULL);
if (!ret) if (!ret)
return 0; return 0;
......
...@@ -700,8 +700,8 @@ static int __devinit tc6393xb_probe(struct platform_device *dev) ...@@ -700,8 +700,8 @@ static int __devinit tc6393xb_probe(struct platform_device *dev)
tc6393xb_cells[TC6393XB_CELL_FB].pdata_size = sizeof(*tcpd->fb_data); tc6393xb_cells[TC6393XB_CELL_FB].pdata_size = sizeof(*tcpd->fb_data);
ret = mfd_add_devices(&dev->dev, dev->id, ret = mfd_add_devices(&dev->dev, dev->id,
tc6393xb_cells, ARRAY_SIZE(tc6393xb_cells), tc6393xb_cells, ARRAY_SIZE(tc6393xb_cells),
iomem, tcpd->irq_base); iomem, tcpd->irq_base, NULL);
if (!ret) if (!ret)
return 0; return 0;
......
...@@ -412,7 +412,7 @@ static int __devinit ti_ssp_probe(struct platform_device *pdev) ...@@ -412,7 +412,7 @@ static int __devinit ti_ssp_probe(struct platform_device *pdev)
cells[id].data_size = data->pdata_size; cells[id].data_size = data->pdata_size;
} }
error = mfd_add_devices(dev, 0, cells, 2, NULL, 0); error = mfd_add_devices(dev, 0, cells, 2, NULL, 0, NULL);
if (error < 0) { if (error < 0) {
dev_err(dev, "cannot add mfd cells\n"); dev_err(dev, "cannot add mfd cells\n");
goto error_enable; goto error_enable;
......
...@@ -757,25 +757,25 @@ static int __devinit timb_probe(struct pci_dev *dev, ...@@ -757,25 +757,25 @@ static int __devinit timb_probe(struct pci_dev *dev,
err = mfd_add_devices(&dev->dev, -1, err = mfd_add_devices(&dev->dev, -1,
timberdale_cells_bar0_cfg0, timberdale_cells_bar0_cfg0,
ARRAY_SIZE(timberdale_cells_bar0_cfg0), ARRAY_SIZE(timberdale_cells_bar0_cfg0),
&dev->resource[0], msix_entries[0].vector); &dev->resource[0], msix_entries[0].vector, NULL);
break; break;
case TIMB_HW_VER1: case TIMB_HW_VER1:
err = mfd_add_devices(&dev->dev, -1, err = mfd_add_devices(&dev->dev, -1,
timberdale_cells_bar0_cfg1, timberdale_cells_bar0_cfg1,
ARRAY_SIZE(timberdale_cells_bar0_cfg1), ARRAY_SIZE(timberdale_cells_bar0_cfg1),
&dev->resource[0], msix_entries[0].vector); &dev->resource[0], msix_entries[0].vector, NULL);
break; break;
case TIMB_HW_VER2: case TIMB_HW_VER2:
err = mfd_add_devices(&dev->dev, -1, err = mfd_add_devices(&dev->dev, -1,
timberdale_cells_bar0_cfg2, timberdale_cells_bar0_cfg2,
ARRAY_SIZE(timberdale_cells_bar0_cfg2), ARRAY_SIZE(timberdale_cells_bar0_cfg2),
&dev->resource[0], msix_entries[0].vector); &dev->resource[0], msix_entries[0].vector, NULL);
break; break;
case TIMB_HW_VER3: case TIMB_HW_VER3:
err = mfd_add_devices(&dev->dev, -1, err = mfd_add_devices(&dev->dev, -1,
timberdale_cells_bar0_cfg3, timberdale_cells_bar0_cfg3,
ARRAY_SIZE(timberdale_cells_bar0_cfg3), ARRAY_SIZE(timberdale_cells_bar0_cfg3),
&dev->resource[0], msix_entries[0].vector); &dev->resource[0], msix_entries[0].vector, NULL);
break; break;
default: default:
dev_err(&dev->dev, "Uknown IP setup: %d.%d.%d\n", dev_err(&dev->dev, "Uknown IP setup: %d.%d.%d\n",
...@@ -792,7 +792,7 @@ static int __devinit timb_probe(struct pci_dev *dev, ...@@ -792,7 +792,7 @@ static int __devinit timb_probe(struct pci_dev *dev,
err = mfd_add_devices(&dev->dev, 0, err = mfd_add_devices(&dev->dev, 0,
timberdale_cells_bar1, ARRAY_SIZE(timberdale_cells_bar1), timberdale_cells_bar1, ARRAY_SIZE(timberdale_cells_bar1),
&dev->resource[1], msix_entries[0].vector); &dev->resource[1], msix_entries[0].vector, NULL);
if (err) { if (err) {
dev_err(&dev->dev, "mfd_add_devices failed: %d\n", err); dev_err(&dev->dev, "mfd_add_devices failed: %d\n", err);
goto err_mfd2; goto err_mfd2;
...@@ -803,7 +803,7 @@ static int __devinit timb_probe(struct pci_dev *dev, ...@@ -803,7 +803,7 @@ static int __devinit timb_probe(struct pci_dev *dev,
((priv->fw.config & TIMB_HW_VER_MASK) == TIMB_HW_VER3)) { ((priv->fw.config & TIMB_HW_VER_MASK) == TIMB_HW_VER3)) {
err = mfd_add_devices(&dev->dev, 1, timberdale_cells_bar2, err = mfd_add_devices(&dev->dev, 1, timberdale_cells_bar2,
ARRAY_SIZE(timberdale_cells_bar2), ARRAY_SIZE(timberdale_cells_bar2),
&dev->resource[2], msix_entries[0].vector); &dev->resource[2], msix_entries[0].vector, NULL);
if (err) { if (err) {
dev_err(&dev->dev, "mfd_add_devices failed: %d\n", err); dev_err(&dev->dev, "mfd_add_devices failed: %d\n", err);
goto err_mfd2; goto err_mfd2;
......
...@@ -188,7 +188,7 @@ static int __devinit tps6105x_probe(struct i2c_client *client, ...@@ -188,7 +188,7 @@ static int __devinit tps6105x_probe(struct i2c_client *client,
} }
ret = mfd_add_devices(&client->dev, 0, tps6105x_cells, ret = mfd_add_devices(&client->dev, 0, tps6105x_cells,
ARRAY_SIZE(tps6105x_cells), NULL, 0); ARRAY_SIZE(tps6105x_cells), NULL, 0, NULL);
if (ret) if (ret)
goto fail; goto fail;
......
...@@ -100,7 +100,7 @@ static int tps6507x_i2c_probe(struct i2c_client *i2c, ...@@ -100,7 +100,7 @@ static int tps6507x_i2c_probe(struct i2c_client *i2c,
ret = mfd_add_devices(tps6507x->dev, -1, ret = mfd_add_devices(tps6507x->dev, -1,
tps6507x_devs, ARRAY_SIZE(tps6507x_devs), tps6507x_devs, ARRAY_SIZE(tps6507x_devs),
NULL, 0); NULL, 0, NULL);
if (ret < 0) if (ret < 0)
goto err; goto err;
......
...@@ -292,7 +292,7 @@ static int __devinit tps65090_i2c_probe(struct i2c_client *client, ...@@ -292,7 +292,7 @@ static int __devinit tps65090_i2c_probe(struct i2c_client *client,
} }
ret = mfd_add_devices(tps65090->dev, -1, tps65090s, ret = mfd_add_devices(tps65090->dev, -1, tps65090s,
ARRAY_SIZE(tps65090s), NULL, 0); ARRAY_SIZE(tps65090s), NULL, 0, NULL);
if (ret) { if (ret) {
dev_err(&client->dev, "add mfd devices failed with err: %d\n", dev_err(&client->dev, "add mfd devices failed with err: %d\n",
ret); ret);
......
...@@ -24,11 +24,18 @@ ...@@ -24,11 +24,18 @@
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/regmap.h> #include <linux/regmap.h>
#include <linux/err.h> #include <linux/err.h>
#include <linux/regulator/of_regulator.h> #include <linux/of.h>
#include <linux/of_device.h>
#include <linux/mfd/core.h> #include <linux/mfd/core.h>
#include <linux/mfd/tps65217.h> #include <linux/mfd/tps65217.h>
static struct mfd_cell tps65217s[] = {
{
.name = "tps65217-pmic",
},
};
/** /**
* tps65217_reg_read: Read a single tps65217 register. * tps65217_reg_read: Read a single tps65217 register.
* *
...@@ -133,83 +140,48 @@ int tps65217_clear_bits(struct tps65217 *tps, unsigned int reg, ...@@ -133,83 +140,48 @@ int tps65217_clear_bits(struct tps65217 *tps, unsigned int reg,
} }
EXPORT_SYMBOL_GPL(tps65217_clear_bits); EXPORT_SYMBOL_GPL(tps65217_clear_bits);
#ifdef CONFIG_OF
static struct of_regulator_match reg_matches[] = {
{ .name = "dcdc1", .driver_data = (void *)TPS65217_DCDC_1 },
{ .name = "dcdc2", .driver_data = (void *)TPS65217_DCDC_2 },
{ .name = "dcdc3", .driver_data = (void *)TPS65217_DCDC_3 },
{ .name = "ldo1", .driver_data = (void *)TPS65217_LDO_1 },
{ .name = "ldo2", .driver_data = (void *)TPS65217_LDO_2 },
{ .name = "ldo3", .driver_data = (void *)TPS65217_LDO_3 },
{ .name = "ldo4", .driver_data = (void *)TPS65217_LDO_4 },
};
static struct tps65217_board *tps65217_parse_dt(struct i2c_client *client)
{
struct device_node *node = client->dev.of_node;
struct tps65217_board *pdata;
struct device_node *regs;
int count = ARRAY_SIZE(reg_matches);
int ret, i;
regs = of_find_node_by_name(node, "regulators");
if (!regs)
return NULL;
ret = of_regulator_match(&client->dev, regs, reg_matches, count);
of_node_put(regs);
if ((ret < 0) || (ret > count))
return NULL;
count = ret;
pdata = devm_kzalloc(&client->dev, count * sizeof(*pdata), GFP_KERNEL);
if (!pdata)
return NULL;
for (i = 0; i < count; i++) {
if (!reg_matches[i].init_data || !reg_matches[i].of_node)
continue;
pdata->tps65217_init_data[i] = reg_matches[i].init_data;
pdata->of_node[i] = reg_matches[i].of_node;
}
return pdata;
}
static struct of_device_id tps65217_of_match[] = {
{ .compatible = "ti,tps65217", },
{ },
};
#else
static struct tps65217_board *tps65217_parse_dt(struct i2c_client *client)
{
return NULL;
}
#endif
static struct regmap_config tps65217_regmap_config = { static struct regmap_config tps65217_regmap_config = {
.reg_bits = 8, .reg_bits = 8,
.val_bits = 8, .val_bits = 8,
}; };
static const struct of_device_id tps65217_of_match[] = {
{ .compatible = "ti,tps65217", .data = (void *)TPS65217 },
{ /* sentinel */ },
};
static int __devinit tps65217_probe(struct i2c_client *client, static int __devinit tps65217_probe(struct i2c_client *client,
const struct i2c_device_id *ids) const struct i2c_device_id *ids)
{ {
struct tps65217 *tps; struct tps65217 *tps;
struct regulator_init_data *reg_data;
struct tps65217_board *pdata = client->dev.platform_data;
int i, ret;
unsigned int version; unsigned int version;
unsigned int chip_id = ids->driver_data;
const struct of_device_id *match;
int ret;
if (!pdata && client->dev.of_node) if (client->dev.of_node) {
pdata = tps65217_parse_dt(client); match = of_match_device(tps65217_of_match, &client->dev);
if (!match) {
dev_err(&client->dev,
"Failed to find matching dt id\n");
return -EINVAL;
}
chip_id = (unsigned int)match->data;
}
if (!chip_id) {
dev_err(&client->dev, "id is null.\n");
return -ENODEV;
}
tps = devm_kzalloc(&client->dev, sizeof(*tps), GFP_KERNEL); tps = devm_kzalloc(&client->dev, sizeof(*tps), GFP_KERNEL);
if (!tps) if (!tps)
return -ENOMEM; return -ENOMEM;
tps->pdata = pdata; i2c_set_clientdata(client, tps);
tps->dev = &client->dev;
tps->id = chip_id;
tps->regmap = devm_regmap_init_i2c(client, &tps65217_regmap_config); tps->regmap = devm_regmap_init_i2c(client, &tps65217_regmap_config);
if (IS_ERR(tps->regmap)) { if (IS_ERR(tps->regmap)) {
ret = PTR_ERR(tps->regmap); ret = PTR_ERR(tps->regmap);
...@@ -218,8 +190,12 @@ static int __devinit tps65217_probe(struct i2c_client *client, ...@@ -218,8 +190,12 @@ static int __devinit tps65217_probe(struct i2c_client *client,
return ret; return ret;
} }
i2c_set_clientdata(client, tps); ret = mfd_add_devices(tps->dev, -1, tps65217s,
tps->dev = &client->dev; ARRAY_SIZE(tps65217s), NULL, 0, NULL);
if (ret < 0) {
dev_err(tps->dev, "mfd_add_devices failed: %d\n", ret);
return ret;
}
ret = tps65217_reg_read(tps, TPS65217_REG_CHIPID, &version); ret = tps65217_reg_read(tps, TPS65217_REG_CHIPID, &version);
if (ret < 0) { if (ret < 0) {
...@@ -232,41 +208,21 @@ static int __devinit tps65217_probe(struct i2c_client *client, ...@@ -232,41 +208,21 @@ static int __devinit tps65217_probe(struct i2c_client *client,
(version & TPS65217_CHIPID_CHIP_MASK) >> 4, (version & TPS65217_CHIPID_CHIP_MASK) >> 4,
version & TPS65217_CHIPID_REV_MASK); version & TPS65217_CHIPID_REV_MASK);
for (i = 0; i < TPS65217_NUM_REGULATOR; i++) {
struct platform_device *pdev;
pdev = platform_device_alloc("tps65217-pmic", i);
if (!pdev) {
dev_err(tps->dev, "Cannot create regulator %d\n", i);
continue;
}
pdev->dev.parent = tps->dev;
pdev->dev.of_node = pdata->of_node[i];
reg_data = pdata->tps65217_init_data[i];
platform_device_add_data(pdev, reg_data, sizeof(*reg_data));
tps->regulator_pdev[i] = pdev;
platform_device_add(pdev);
}
return 0; return 0;
} }
static int __devexit tps65217_remove(struct i2c_client *client) static int __devexit tps65217_remove(struct i2c_client *client)
{ {
struct tps65217 *tps = i2c_get_clientdata(client); struct tps65217 *tps = i2c_get_clientdata(client);
int i;
for (i = 0; i < TPS65217_NUM_REGULATOR; i++) mfd_remove_devices(tps->dev);
platform_device_unregister(tps->regulator_pdev[i]);
return 0; return 0;
} }
static const struct i2c_device_id tps65217_id_table[] = { static const struct i2c_device_id tps65217_id_table[] = {
{"tps65217", 0xF0}, {"tps65217", TPS65217},
{/* end of list */} { /* sentinel */ }
}; };
MODULE_DEVICE_TABLE(i2c, tps65217_id_table); MODULE_DEVICE_TABLE(i2c, tps65217_id_table);
......
...@@ -493,7 +493,8 @@ static int __devinit tps6586x_i2c_probe(struct i2c_client *client, ...@@ -493,7 +493,8 @@ static int __devinit tps6586x_i2c_probe(struct i2c_client *client,
} }
ret = mfd_add_devices(tps6586x->dev, -1, ret = mfd_add_devices(tps6586x->dev, -1,
tps6586x_cell, ARRAY_SIZE(tps6586x_cell), NULL, 0); tps6586x_cell, ARRAY_SIZE(tps6586x_cell),
NULL, 0, NULL);
if (ret < 0) { if (ret < 0) {
dev_err(&client->dev, "mfd_add_devices failed: %d\n", ret); dev_err(&client->dev, "mfd_add_devices failed: %d\n", ret);
goto err_mfd_add; goto err_mfd_add;
......
...@@ -254,7 +254,7 @@ static __devinit int tps65910_i2c_probe(struct i2c_client *i2c, ...@@ -254,7 +254,7 @@ static __devinit int tps65910_i2c_probe(struct i2c_client *i2c,
ret = mfd_add_devices(tps65910->dev, -1, ret = mfd_add_devices(tps65910->dev, -1,
tps65910s, ARRAY_SIZE(tps65910s), tps65910s, ARRAY_SIZE(tps65910s),
NULL, 0); NULL, 0, NULL);
if (ret < 0) { if (ret < 0) {
dev_err(&i2c->dev, "mfd_add_devices failed: %d\n", ret); dev_err(&i2c->dev, "mfd_add_devices failed: %d\n", ret);
return ret; return ret;
......
...@@ -146,7 +146,7 @@ int tps65912_device_init(struct tps65912 *tps65912) ...@@ -146,7 +146,7 @@ int tps65912_device_init(struct tps65912 *tps65912)
ret = mfd_add_devices(tps65912->dev, -1, ret = mfd_add_devices(tps65912->dev, -1,
tps65912s, ARRAY_SIZE(tps65912s), tps65912s, ARRAY_SIZE(tps65912s),
NULL, 0); NULL, 0, NULL);
if (ret < 0) if (ret < 0)
goto err; goto err;
......
...@@ -223,7 +223,7 @@ static int __devinit twl4030_audio_probe(struct platform_device *pdev) ...@@ -223,7 +223,7 @@ static int __devinit twl4030_audio_probe(struct platform_device *pdev)
if (childs) if (childs)
ret = mfd_add_devices(&pdev->dev, pdev->id, audio->cells, ret = mfd_add_devices(&pdev->dev, pdev->id, audio->cells,
childs, NULL, 0); childs, NULL, 0, NULL);
else { else {
dev_err(&pdev->dev, "No platform data found for childs\n"); dev_err(&pdev->dev, "No platform data found for childs\n");
ret = -ENODEV; ret = -ENODEV;
......
...@@ -632,7 +632,7 @@ static int __devinit twl6040_probe(struct i2c_client *client, ...@@ -632,7 +632,7 @@ static int __devinit twl6040_probe(struct i2c_client *client,
} }
ret = mfd_add_devices(&client->dev, -1, twl6040->cells, children, ret = mfd_add_devices(&client->dev, -1, twl6040->cells, children,
NULL, 0); NULL, 0, NULL);
if (ret) if (ret)
goto mfd_err; goto mfd_err;
......
...@@ -102,7 +102,7 @@ static __devinit int vx855_probe(struct pci_dev *pdev, ...@@ -102,7 +102,7 @@ static __devinit int vx855_probe(struct pci_dev *pdev,
vx855_gpio_resources[1].end = vx855_gpio_resources[1].start + 3; vx855_gpio_resources[1].end = vx855_gpio_resources[1].start + 3;
ret = mfd_add_devices(&pdev->dev, -1, vx855_cells, ARRAY_SIZE(vx855_cells), ret = mfd_add_devices(&pdev->dev, -1, vx855_cells, ARRAY_SIZE(vx855_cells),
NULL, 0); NULL, 0, NULL);
/* we always return -ENODEV here in order to enable other /* we always return -ENODEV here in order to enable other
* drivers like old, not-yet-platform_device ported i2c-viapro */ * drivers like old, not-yet-platform_device ported i2c-viapro */
......
...@@ -241,7 +241,7 @@ static int __devinit wl1273_core_probe(struct i2c_client *client, ...@@ -241,7 +241,7 @@ static int __devinit wl1273_core_probe(struct i2c_client *client,
__func__, children); __func__, children);
r = mfd_add_devices(&client->dev, -1, core->cells, r = mfd_add_devices(&client->dev, -1, core->cells,
children, NULL, 0); children, NULL, 0, NULL);
if (r) if (r)
goto err; goto err;
......
...@@ -1813,27 +1813,27 @@ int wm831x_device_init(struct wm831x *wm831x, unsigned long id, int irq) ...@@ -1813,27 +1813,27 @@ int wm831x_device_init(struct wm831x *wm831x, unsigned long id, int irq)
case WM8310: case WM8310:
ret = mfd_add_devices(wm831x->dev, wm831x_num, ret = mfd_add_devices(wm831x->dev, wm831x_num,
wm8310_devs, ARRAY_SIZE(wm8310_devs), wm8310_devs, ARRAY_SIZE(wm8310_devs),
NULL, 0); NULL, 0, NULL);
break; break;
case WM8311: case WM8311:
ret = mfd_add_devices(wm831x->dev, wm831x_num, ret = mfd_add_devices(wm831x->dev, wm831x_num,
wm8311_devs, ARRAY_SIZE(wm8311_devs), wm8311_devs, ARRAY_SIZE(wm8311_devs),
NULL, 0); NULL, 0, NULL);
if (!pdata || !pdata->disable_touch) if (!pdata || !pdata->disable_touch)
mfd_add_devices(wm831x->dev, wm831x_num, mfd_add_devices(wm831x->dev, wm831x_num,
touch_devs, ARRAY_SIZE(touch_devs), touch_devs, ARRAY_SIZE(touch_devs),
NULL, 0); NULL, 0, NULL);
break; break;
case WM8312: case WM8312:
ret = mfd_add_devices(wm831x->dev, wm831x_num, ret = mfd_add_devices(wm831x->dev, wm831x_num,
wm8312_devs, ARRAY_SIZE(wm8312_devs), wm8312_devs, ARRAY_SIZE(wm8312_devs),
NULL, 0); NULL, 0, NULL);
if (!pdata || !pdata->disable_touch) if (!pdata || !pdata->disable_touch)
mfd_add_devices(wm831x->dev, wm831x_num, mfd_add_devices(wm831x->dev, wm831x_num,
touch_devs, ARRAY_SIZE(touch_devs), touch_devs, ARRAY_SIZE(touch_devs),
NULL, 0); NULL, 0, NULL);
break; break;
case WM8320: case WM8320:
...@@ -1842,7 +1842,7 @@ int wm831x_device_init(struct wm831x *wm831x, unsigned long id, int irq) ...@@ -1842,7 +1842,7 @@ int wm831x_device_init(struct wm831x *wm831x, unsigned long id, int irq)
case WM8326: case WM8326:
ret = mfd_add_devices(wm831x->dev, wm831x_num, ret = mfd_add_devices(wm831x->dev, wm831x_num,
wm8320_devs, ARRAY_SIZE(wm8320_devs), wm8320_devs, ARRAY_SIZE(wm8320_devs),
NULL, 0); NULL, 0, NULL);
break; break;
default: default:
...@@ -1867,7 +1867,7 @@ int wm831x_device_init(struct wm831x *wm831x, unsigned long id, int irq) ...@@ -1867,7 +1867,7 @@ int wm831x_device_init(struct wm831x *wm831x, unsigned long id, int irq)
if (ret & WM831X_XTAL_ENA) { if (ret & WM831X_XTAL_ENA) {
ret = mfd_add_devices(wm831x->dev, wm831x_num, ret = mfd_add_devices(wm831x->dev, wm831x_num,
rtc_devs, ARRAY_SIZE(rtc_devs), rtc_devs, ARRAY_SIZE(rtc_devs),
NULL, 0); NULL, 0, NULL);
if (ret != 0) { if (ret != 0) {
dev_err(wm831x->dev, "Failed to add RTC: %d\n", ret); dev_err(wm831x->dev, "Failed to add RTC: %d\n", ret);
goto err_irq; goto err_irq;
...@@ -1880,7 +1880,7 @@ int wm831x_device_init(struct wm831x *wm831x, unsigned long id, int irq) ...@@ -1880,7 +1880,7 @@ int wm831x_device_init(struct wm831x *wm831x, unsigned long id, int irq)
/* Treat errors as non-critical */ /* Treat errors as non-critical */
ret = mfd_add_devices(wm831x->dev, wm831x_num, backlight_devs, ret = mfd_add_devices(wm831x->dev, wm831x_num, backlight_devs,
ARRAY_SIZE(backlight_devs), NULL, ARRAY_SIZE(backlight_devs), NULL,
0); 0, NULL);
if (ret < 0) if (ret < 0)
dev_err(wm831x->dev, "Failed to add backlight: %d\n", dev_err(wm831x->dev, "Failed to add backlight: %d\n",
ret); ret);
......
...@@ -70,7 +70,7 @@ static int wm8400_register_codec(struct wm8400 *wm8400) ...@@ -70,7 +70,7 @@ static int wm8400_register_codec(struct wm8400 *wm8400)
.pdata_size = sizeof(*wm8400), .pdata_size = sizeof(*wm8400),
}; };
return mfd_add_devices(wm8400->dev, -1, &cell, 1, NULL, 0); return mfd_add_devices(wm8400->dev, -1, &cell, 1, NULL, 0, NULL);
} }
/* /*
......
...@@ -414,7 +414,7 @@ static __devinit int wm8994_device_init(struct wm8994 *wm8994, int irq) ...@@ -414,7 +414,7 @@ static __devinit int wm8994_device_init(struct wm8994 *wm8994, int irq)
ret = mfd_add_devices(wm8994->dev, -1, ret = mfd_add_devices(wm8994->dev, -1,
wm8994_regulator_devs, wm8994_regulator_devs,
ARRAY_SIZE(wm8994_regulator_devs), ARRAY_SIZE(wm8994_regulator_devs),
NULL, 0); NULL, 0, NULL);
if (ret != 0) { if (ret != 0) {
dev_err(wm8994->dev, "Failed to add children: %d\n", ret); dev_err(wm8994->dev, "Failed to add children: %d\n", ret);
goto err; goto err;
...@@ -648,7 +648,7 @@ static __devinit int wm8994_device_init(struct wm8994 *wm8994, int irq) ...@@ -648,7 +648,7 @@ static __devinit int wm8994_device_init(struct wm8994 *wm8994, int irq)
ret = mfd_add_devices(wm8994->dev, -1, ret = mfd_add_devices(wm8994->dev, -1,
wm8994_devs, ARRAY_SIZE(wm8994_devs), wm8994_devs, ARRAY_SIZE(wm8994_devs),
NULL, 0); NULL, 0, NULL);
if (ret != 0) { if (ret != 0) {
dev_err(wm8994->dev, "Failed to add children: %d\n", ret); dev_err(wm8994->dev, "Failed to add children: %d\n", ret);
goto err_irq; goto err_irq;
......
...@@ -22,6 +22,7 @@ ...@@ -22,6 +22,7 @@
#include <linux/err.h> #include <linux/err.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/regulator/of_regulator.h>
#include <linux/regulator/driver.h> #include <linux/regulator/driver.h>
#include <linux/regulator/machine.h> #include <linux/regulator/machine.h>
#include <linux/mfd/tps65217.h> #include <linux/mfd/tps65217.h>
...@@ -281,37 +282,130 @@ static const struct regulator_desc regulators[] = { ...@@ -281,37 +282,130 @@ static const struct regulator_desc regulators[] = {
NULL), NULL),
}; };
#ifdef CONFIG_OF
static struct of_regulator_match reg_matches[] = {
{ .name = "dcdc1", .driver_data = (void *)TPS65217_DCDC_1 },
{ .name = "dcdc2", .driver_data = (void *)TPS65217_DCDC_2 },
{ .name = "dcdc3", .driver_data = (void *)TPS65217_DCDC_3 },
{ .name = "ldo1", .driver_data = (void *)TPS65217_LDO_1 },
{ .name = "ldo2", .driver_data = (void *)TPS65217_LDO_2 },
{ .name = "ldo3", .driver_data = (void *)TPS65217_LDO_3 },
{ .name = "ldo4", .driver_data = (void *)TPS65217_LDO_4 },
};
static struct tps65217_board *tps65217_parse_dt(struct platform_device *pdev)
{
struct tps65217 *tps = dev_get_drvdata(pdev->dev.parent);
struct device_node *node = tps->dev->of_node;
struct tps65217_board *pdata;
struct device_node *regs;
int i, count;
regs = of_find_node_by_name(node, "regulators");
if (!regs)
return NULL;
count = of_regulator_match(pdev->dev.parent, regs,
reg_matches, TPS65217_NUM_REGULATOR);
of_node_put(regs);
if ((count < 0) || (count > TPS65217_NUM_REGULATOR))
return NULL;
pdata = devm_kzalloc(&pdev->dev, sizeof(*pdata), GFP_KERNEL);
if (!pdata)
return NULL;
for (i = 0; i < count; i++) {
if (!reg_matches[i].init_data || !reg_matches[i].of_node)
continue;
pdata->tps65217_init_data[i] = reg_matches[i].init_data;
pdata->of_node[i] = reg_matches[i].of_node;
}
return pdata;
}
#else
static struct tps65217_board *tps65217_parse_dt(struct platform_device *pdev)
{
return NULL;
}
#endif
static int __devinit tps65217_regulator_probe(struct platform_device *pdev) static int __devinit tps65217_regulator_probe(struct platform_device *pdev)
{ {
struct tps65217 *tps = dev_get_drvdata(pdev->dev.parent);
struct tps65217_board *pdata = dev_get_platdata(tps->dev);
struct regulator_init_data *reg_data;
struct regulator_dev *rdev; struct regulator_dev *rdev;
struct tps65217 *tps;
struct tps_info *info = &tps65217_pmic_regs[pdev->id];
struct regulator_config config = { }; struct regulator_config config = { };
int i, ret;
/* Already set by core driver */ if (tps->dev->of_node)
tps = dev_to_tps65217(pdev->dev.parent); pdata = tps65217_parse_dt(pdev);
tps->info[pdev->id] = info;
config.dev = &pdev->dev; if (!pdata) {
config.of_node = pdev->dev.of_node; dev_err(&pdev->dev, "Platform data not found\n");
config.init_data = pdev->dev.platform_data; return -EINVAL;
config.driver_data = tps; }
rdev = regulator_register(&regulators[pdev->id], &config); if (tps65217_chip_id(tps) != TPS65217) {
if (IS_ERR(rdev)) dev_err(&pdev->dev, "Invalid tps chip version\n");
return PTR_ERR(rdev); return -ENODEV;
}
platform_set_drvdata(pdev, rdev); platform_set_drvdata(pdev, tps);
for (i = 0; i < TPS65217_NUM_REGULATOR; i++) {
reg_data = pdata->tps65217_init_data[i];
/*
* Regulator API handles empty constraints but not NULL
* constraints
*/
if (!reg_data)
continue;
/* Register the regulators */
tps->info[i] = &tps65217_pmic_regs[i];
config.dev = tps->dev;
config.init_data = reg_data;
config.driver_data = tps;
config.regmap = tps->regmap;
if (tps->dev->of_node)
config.of_node = pdata->of_node[i];
rdev = regulator_register(&regulators[i], &config);
if (IS_ERR(rdev)) {
dev_err(tps->dev, "failed to register %s regulator\n",
pdev->name);
ret = PTR_ERR(rdev);
goto err_unregister_regulator;
}
/* Save regulator for cleanup */
tps->rdev[i] = rdev;
}
return 0; return 0;
err_unregister_regulator:
while (--i >= 0)
regulator_unregister(tps->rdev[i]);
return ret;
} }
static int __devexit tps65217_regulator_remove(struct platform_device *pdev) static int __devexit tps65217_regulator_remove(struct platform_device *pdev)
{ {
struct regulator_dev *rdev = platform_get_drvdata(pdev); struct tps65217 *tps = platform_get_drvdata(pdev);
unsigned int i;
for (i = 0; i < TPS65217_NUM_REGULATOR; i++)
regulator_unregister(tps->rdev[i]);
platform_set_drvdata(pdev, NULL); platform_set_drvdata(pdev, NULL);
regulator_unregister(rdev);
return 0; return 0;
} }
......
...@@ -837,7 +837,7 @@ static int __devinit tegra_nvec_probe(struct platform_device *pdev) ...@@ -837,7 +837,7 @@ static int __devinit tegra_nvec_probe(struct platform_device *pdev)
} }
ret = mfd_add_devices(nvec->dev, -1, nvec_devices, ret = mfd_add_devices(nvec->dev, -1, nvec_devices,
ARRAY_SIZE(nvec_devices), base, 0); ARRAY_SIZE(nvec_devices), base, 0, NULL);
if (ret) if (ret)
dev_err(nvec->dev, "error adding subdevices\n"); dev_err(nvec->dev, "error adding subdevices\n");
......
...@@ -16,6 +16,8 @@ ...@@ -16,6 +16,8 @@
#include <linux/platform_device.h> #include <linux/platform_device.h>
struct irq_domain;
/* /*
* This struct describes the MFD part ("cell"). * This struct describes the MFD part ("cell").
* After registration the copy of this structure will become the platform data * After registration the copy of this structure will become the platform data
...@@ -98,7 +100,7 @@ static inline const struct mfd_cell *mfd_get_cell(struct platform_device *pdev) ...@@ -98,7 +100,7 @@ static inline const struct mfd_cell *mfd_get_cell(struct platform_device *pdev)
extern int mfd_add_devices(struct device *parent, int id, extern int mfd_add_devices(struct device *parent, int id,
struct mfd_cell *cells, int n_devs, struct mfd_cell *cells, int n_devs,
struct resource *mem_base, struct resource *mem_base,
int irq_base); int irq_base, struct irq_domain *irq_domain);
extern void mfd_remove_devices(struct device *parent); extern void mfd_remove_devices(struct device *parent);
......
...@@ -22,6 +22,9 @@ ...@@ -22,6 +22,9 @@
#include <linux/regulator/driver.h> #include <linux/regulator/driver.h>
#include <linux/regulator/machine.h> #include <linux/regulator/machine.h>
/* TPS chip id list */
#define TPS65217 0xF0
/* I2C ID for TPS65217 part */ /* I2C ID for TPS65217 part */
#define TPS65217_I2C_ID 0x24 #define TPS65217_I2C_ID 0x24
...@@ -248,13 +251,11 @@ struct tps_info { ...@@ -248,13 +251,11 @@ struct tps_info {
struct tps65217 { struct tps65217 {
struct device *dev; struct device *dev;
struct tps65217_board *pdata; struct tps65217_board *pdata;
unsigned int id;
struct regulator_desc desc[TPS65217_NUM_REGULATOR]; struct regulator_desc desc[TPS65217_NUM_REGULATOR];
struct regulator_dev *rdev[TPS65217_NUM_REGULATOR]; struct regulator_dev *rdev[TPS65217_NUM_REGULATOR];
struct tps_info *info[TPS65217_NUM_REGULATOR]; struct tps_info *info[TPS65217_NUM_REGULATOR];
struct regmap *regmap; struct regmap *regmap;
/* Client devices */
struct platform_device *regulator_pdev[TPS65217_NUM_REGULATOR];
}; };
static inline struct tps65217 *dev_to_tps65217(struct device *dev) static inline struct tps65217 *dev_to_tps65217(struct device *dev)
...@@ -262,6 +263,11 @@ static inline struct tps65217 *dev_to_tps65217(struct device *dev) ...@@ -262,6 +263,11 @@ static inline struct tps65217 *dev_to_tps65217(struct device *dev)
return dev_get_drvdata(dev); return dev_get_drvdata(dev);
} }
static inline int tps65217_chip_id(struct tps65217 *tps65217)
{
return tps65217->id;
}
int tps65217_reg_read(struct tps65217 *tps, unsigned int reg, int tps65217_reg_read(struct tps65217 *tps, unsigned int reg,
unsigned int *val); unsigned int *val);
int tps65217_reg_write(struct tps65217 *tps, unsigned int reg, int tps65217_reg_write(struct tps65217 *tps, unsigned int reg,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment