mirror of https://gitee.com/openkylin/linux.git
This is the remaining MFD fixes for 3.6, with 5 pending fixes:
- A tps65217 build error fix. - A lcp_ich regression fix caused by the MFD driver failing to initialize the watchdog sub device due to ACPI conflicts. - 2 MAX77693 interrupt handling bug fixes. - An MFD core fix, adding an IRQ domain argument to the MFD device addition API in order to prevent silent and potentially harmful remapping behaviour changes for drivers supporting non-DT platforms. -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.12 (GNU/Linux) iQIcBAABAgAGBQJQVQpwAAoJEIqAPN1PVmxKpnQP/iDPakfGT0m00nxk9VvuXfaA SlNxhhM1ZPxlZcBrVFULZ+dCVuUaBYIfwoT4Wwl2yZsmp8uYb62Rd6LGXDnjO+FH zKMg3b/KDHq/jicYxqFy4bVq3I850jTLN4Hti6hArn8HM6gxZJQxM810Poxt6M0T odud6oHSevGpCoL7GU4O+gmx1wKSDRrw6TZPokJDfXaQcFPJEt0YGGtI2zAO1sV+ iBPQE/bI3bF5r/kowbh9ro5WybGNyFrwiYtaTzJWntXoPKN1lmr0F2F2NaCEo1xj 2vJPFSCK3qC9Ft7sPQEBYxrSXzyzgu7G8HGgkcBG5SaSo+W3awe9DEaHfk5E7sdr iyc01kh4FmGlMAvHG/zcK3YvchR7GJdRI7BrR+MTQ03ZUv/ZrmTYFAHv5fAzBQ+N 6ZUoC/1bqPKpfeFPOKYpDeYJVnFBWLYr+t7McTqqg+kpxUuYnQ0HyJVjDh01ZVQT AtCjjW7R+Ka44B+xfMOartPZMqZZEHSJ0UjacyEyzMpAAY14eUDMtTqs/jtNp+8Z B0bZiA8ZhUmNVH7TZoT/u57FgEW34JnM8oH6jLVN+yjInpuugIvqpZn0TA90GL7V Fh2DALMgUN5z/TXduGSsSPg1hvXFPOujaS+4o78e8PWiVQd5XUk/mc8OOS/mrRwj +mILnzxJcp8iYrYqESbt =nP/y -----END PGP SIGNATURE----- Merge tag 'mfd-for-linus-3.6-2' of git://git.kernel.org/pub/scm/linux/kernel/git/sameo/mfd-2.6 Pull mfd fixes from Samuel Ortiz: "This is the remaining MFD fixes for 3.6, with 5 pending fixes: - A tps65217 build error fix. - A lcp_ich regression fix caused by the MFD driver failing to initialize the watchdog sub device due to ACPI conflicts. - 2 MAX77693 interrupt handling bug fixes. - An MFD core fix, adding an IRQ domain argument to the MFD device addition API in order to prevent silent and potentially harmful remapping behaviour changes for drivers supporting non-DT platforms." * tag 'mfd-for-linus-3.6-2' of git://git.kernel.org/pub/scm/linux/kernel/git/sameo/mfd-2.6: mfd: MAX77693: Fix NULL pointer error when initializing irqs mfd: MAX77693: Fix interrupt handling bug mfd: core: Push irqdomain mapping out into devices mfd: lpc_ich: Fix a 3.5 kernel regression for iTCO_wdt driver mfd: Move tps65217 regulator plat data handling to regulator
This commit is contained in:
commit
73f8be297e
|
@ -669,13 +669,18 @@ static int __devinit max77693_muic_probe(struct platform_device *pdev)
|
|||
}
|
||||
info->dev = &pdev->dev;
|
||||
info->max77693 = max77693;
|
||||
info->max77693->regmap_muic = regmap_init_i2c(info->max77693->muic,
|
||||
&max77693_muic_regmap_config);
|
||||
if (IS_ERR(info->max77693->regmap_muic)) {
|
||||
ret = PTR_ERR(info->max77693->regmap_muic);
|
||||
dev_err(max77693->dev,
|
||||
"failed to allocate register map: %d\n", ret);
|
||||
goto err_regmap;
|
||||
if (info->max77693->regmap_muic)
|
||||
dev_dbg(&pdev->dev, "allocate register map\n");
|
||||
else {
|
||||
info->max77693->regmap_muic = devm_regmap_init_i2c(
|
||||
info->max77693->muic,
|
||||
&max77693_muic_regmap_config);
|
||||
if (IS_ERR(info->max77693->regmap_muic)) {
|
||||
ret = PTR_ERR(info->max77693->regmap_muic);
|
||||
dev_err(max77693->dev,
|
||||
"failed to allocate register map: %d\n", ret);
|
||||
goto err_regmap;
|
||||
}
|
||||
}
|
||||
platform_set_drvdata(pdev, info);
|
||||
mutex_init(&info->mutex);
|
||||
|
|
|
@ -470,7 +470,8 @@ static int __devinit device_800_init(struct pm80x_chip *chip,
|
|||
|
||||
ret =
|
||||
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) {
|
||||
dev_err(chip->dev, "Failed to add onkey subdev\n");
|
||||
goto out_dev;
|
||||
|
@ -481,7 +482,7 @@ static int __devinit device_800_init(struct pm80x_chip *chip,
|
|||
rtc_devs[0].platform_data = pdata->rtc;
|
||||
rtc_devs[0].pdata_size = sizeof(struct pm80x_rtc_pdata);
|
||||
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) {
|
||||
dev_err(chip->dev, "Failed to add rtc subdev\n");
|
||||
goto out_dev;
|
||||
|
|
|
@ -216,7 +216,8 @@ static int __devinit device_805_init(struct pm80x_chip *chip)
|
|||
}
|
||||
|
||||
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) {
|
||||
dev_err(chip->dev, "Failed to add codec subdev\n");
|
||||
goto out_codec;
|
||||
|
|
|
@ -637,7 +637,7 @@ static void __devinit device_bk_init(struct pm860x_chip *chip,
|
|||
bk_devs[i].resources = &bk_resources[j];
|
||||
ret = mfd_add_devices(chip->dev, 0,
|
||||
&bk_devs[i], 1,
|
||||
&bk_resources[j], 0);
|
||||
&bk_resources[j], 0, NULL);
|
||||
if (ret < 0) {
|
||||
dev_err(chip->dev, "Failed to add "
|
||||
"backlight subdev\n");
|
||||
|
@ -672,7 +672,7 @@ static void __devinit device_led_init(struct pm860x_chip *chip,
|
|||
led_devs[i].resources = &led_resources[j],
|
||||
ret = mfd_add_devices(chip->dev, 0,
|
||||
&led_devs[i], 1,
|
||||
&led_resources[j], 0);
|
||||
&led_resources[j], 0, NULL);
|
||||
if (ret < 0) {
|
||||
dev_err(chip->dev, "Failed to add "
|
||||
"led subdev\n");
|
||||
|
@ -709,7 +709,7 @@ static void __devinit device_regulator_init(struct pm860x_chip *chip,
|
|||
regulator_devs[i].resources = ®ulator_resources[seq];
|
||||
|
||||
ret = mfd_add_devices(chip->dev, 0, ®ulator_devs[i], 1,
|
||||
®ulator_resources[seq], 0);
|
||||
®ulator_resources[seq], 0, NULL);
|
||||
if (ret < 0) {
|
||||
dev_err(chip->dev, "Failed to add regulator subdev\n");
|
||||
goto out;
|
||||
|
@ -733,7 +733,7 @@ static void __devinit device_rtc_init(struct pm860x_chip *chip,
|
|||
rtc_devs[0].resources = &rtc_resources[0];
|
||||
ret = mfd_add_devices(chip->dev, 0, &rtc_devs[0],
|
||||
ARRAY_SIZE(rtc_devs), &rtc_resources[0],
|
||||
chip->irq_base);
|
||||
chip->irq_base, NULL);
|
||||
if (ret < 0)
|
||||
dev_err(chip->dev, "Failed to add rtc subdev\n");
|
||||
}
|
||||
|
@ -752,7 +752,7 @@ static void __devinit device_touch_init(struct pm860x_chip *chip,
|
|||
touch_devs[0].resources = &touch_resources[0];
|
||||
ret = mfd_add_devices(chip->dev, 0, &touch_devs[0],
|
||||
ARRAY_SIZE(touch_devs), &touch_resources[0],
|
||||
chip->irq_base);
|
||||
chip->irq_base, NULL);
|
||||
if (ret < 0)
|
||||
dev_err(chip->dev, "Failed to add touch subdev\n");
|
||||
}
|
||||
|
@ -770,7 +770,7 @@ static void __devinit device_power_init(struct pm860x_chip *chip,
|
|||
power_devs[0].num_resources = ARRAY_SIZE(battery_resources);
|
||||
power_devs[0].resources = &battery_resources[0],
|
||||
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)
|
||||
dev_err(chip->dev, "Failed to add battery subdev\n");
|
||||
|
||||
|
@ -779,7 +779,7 @@ static void __devinit device_power_init(struct pm860x_chip *chip,
|
|||
power_devs[1].num_resources = ARRAY_SIZE(charger_resources);
|
||||
power_devs[1].resources = &charger_resources[0],
|
||||
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)
|
||||
dev_err(chip->dev, "Failed to add charger subdev\n");
|
||||
|
||||
|
@ -788,7 +788,7 @@ static void __devinit device_power_init(struct pm860x_chip *chip,
|
|||
power_devs[2].num_resources = ARRAY_SIZE(preg_resources);
|
||||
power_devs[2].resources = &preg_resources[0],
|
||||
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)
|
||||
dev_err(chip->dev, "Failed to add preg subdev\n");
|
||||
}
|
||||
|
@ -802,7 +802,7 @@ static void __devinit device_onkey_init(struct pm860x_chip *chip,
|
|||
onkey_devs[0].resources = &onkey_resources[0],
|
||||
ret = mfd_add_devices(chip->dev, 0, &onkey_devs[0],
|
||||
ARRAY_SIZE(onkey_devs), &onkey_resources[0],
|
||||
chip->irq_base);
|
||||
chip->irq_base, NULL);
|
||||
if (ret < 0)
|
||||
dev_err(chip->dev, "Failed to add onkey subdev\n");
|
||||
}
|
||||
|
@ -815,7 +815,8 @@ static void __devinit device_codec_init(struct pm860x_chip *chip,
|
|||
codec_devs[0].num_resources = ARRAY_SIZE(codec_resources);
|
||||
codec_devs[0].resources = &codec_resources[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)
|
||||
dev_err(chip->dev, "Failed to add codec subdev\n");
|
||||
}
|
||||
|
|
|
@ -424,7 +424,7 @@ static int aat2870_i2c_probe(struct i2c_client *client,
|
|||
}
|
||||
|
||||
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) {
|
||||
dev_err(aat2870->dev, "Failed to add subdev: %d\n", ret);
|
||||
goto out_disable;
|
||||
|
|
|
@ -946,7 +946,7 @@ static int __devinit ab3100_probe(struct i2c_client *client,
|
|||
}
|
||||
|
||||
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);
|
||||
|
||||
|
|
|
@ -1418,25 +1418,25 @@ static int __devinit ab8500_probe(struct platform_device *pdev)
|
|||
|
||||
ret = mfd_add_devices(ab8500->dev, 0, abx500_common_devs,
|
||||
ARRAY_SIZE(abx500_common_devs), NULL,
|
||||
ab8500->irq_base);
|
||||
ab8500->irq_base, ab8500->domain);
|
||||
if (ret)
|
||||
goto out_freeirq;
|
||||
|
||||
if (is_ab9540(ab8500))
|
||||
ret = mfd_add_devices(ab8500->dev, 0, ab9540_devs,
|
||||
ARRAY_SIZE(ab9540_devs), NULL,
|
||||
ab8500->irq_base);
|
||||
ab8500->irq_base, ab8500->domain);
|
||||
else
|
||||
ret = mfd_add_devices(ab8500->dev, 0, ab8500_devs,
|
||||
ARRAY_SIZE(ab8500_devs), NULL,
|
||||
ab8500->irq_base);
|
||||
ab8500->irq_base, ab8500->domain);
|
||||
if (ret)
|
||||
goto out_freeirq;
|
||||
|
||||
if (is_ab9540(ab8500) || is_ab8505(ab8500))
|
||||
ret = mfd_add_devices(ab8500->dev, 0, ab9540_ab8505_devs,
|
||||
ARRAY_SIZE(ab9540_ab8505_devs), NULL,
|
||||
ab8500->irq_base);
|
||||
ab8500->irq_base, ab8500->domain);
|
||||
if (ret)
|
||||
goto out_freeirq;
|
||||
|
||||
|
@ -1444,7 +1444,7 @@ static int __devinit ab8500_probe(struct platform_device *pdev)
|
|||
/* Add battery management devices */
|
||||
ret = mfd_add_devices(ab8500->dev, 0, ab8500_bm_devs,
|
||||
ARRAY_SIZE(ab8500_bm_devs), NULL,
|
||||
ab8500->irq_base);
|
||||
ab8500->irq_base, ab8500->domain);
|
||||
if (ret)
|
||||
dev_err(ab8500->dev, "error adding bm devices\n");
|
||||
}
|
||||
|
|
|
@ -316,7 +316,7 @@ int __devinit arizona_dev_init(struct arizona *arizona)
|
|||
}
|
||||
|
||||
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) {
|
||||
dev_err(dev, "Failed to add early children: %d\n", ret);
|
||||
return ret;
|
||||
|
@ -516,11 +516,11 @@ int __devinit arizona_dev_init(struct arizona *arizona)
|
|||
switch (arizona->type) {
|
||||
case WM5102:
|
||||
ret = mfd_add_devices(arizona->dev, -1, wm5102_devs,
|
||||
ARRAY_SIZE(wm5102_devs), NULL, 0);
|
||||
ARRAY_SIZE(wm5102_devs), NULL, 0, NULL);
|
||||
break;
|
||||
case WM5110:
|
||||
ret = mfd_add_devices(arizona->dev, -1, wm5110_devs,
|
||||
ARRAY_SIZE(wm5102_devs), NULL, 0);
|
||||
ARRAY_SIZE(wm5102_devs), NULL, 0, NULL);
|
||||
break;
|
||||
}
|
||||
|
||||
|
|
|
@ -913,14 +913,14 @@ static int __init asic3_mfd_probe(struct platform_device *pdev,
|
|||
if (pdata->clock_rate) {
|
||||
ds1wm_pdata.clock_rate = pdata->clock_rate;
|
||||
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)
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (mem_sdio && (irq >= 0)) {
|
||||
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)
|
||||
goto out;
|
||||
}
|
||||
|
@ -934,7 +934,7 @@ static int __init asic3_mfd_probe(struct platform_device *pdev,
|
|||
asic3_cell_leds[i].pdata_size = sizeof(pdata->leds[i]);
|
||||
}
|
||||
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:
|
||||
|
|
|
@ -149,7 +149,7 @@ static int __devinit cs5535_mfd_probe(struct pci_dev *pdev,
|
|||
}
|
||||
|
||||
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) {
|
||||
dev_err(&pdev->dev, "MFD add devices failed: %d\n", err);
|
||||
goto err_disable;
|
||||
|
|
|
@ -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);
|
||||
|
||||
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)
|
||||
goto err;
|
||||
|
||||
|
|
|
@ -129,7 +129,7 @@ static int __init davinci_vc_probe(struct platform_device *pdev)
|
|||
cell->pdata_size = sizeof(*davinci_vc);
|
||||
|
||||
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) {
|
||||
dev_err(&pdev->dev, "fail to register client devices\n");
|
||||
goto fail4;
|
||||
|
|
|
@ -3010,7 +3010,7 @@ static int __devinit db8500_prcmu_probe(struct platform_device *pdev)
|
|||
prcmu_config_esram0_deep_sleep(ESRAM0_DEEP_SLEEP_STATE_RET);
|
||||
|
||||
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) {
|
||||
pr_err("prcmu: Failed to add subdevices\n");
|
||||
return err;
|
||||
|
|
|
@ -168,7 +168,7 @@ static int __init pasic3_probe(struct platform_device *pdev)
|
|||
/* the first 5 PASIC3 registers control the DS1WM */
|
||||
ds1wm_resources[0].end = (5 << asic->bus_shift) - 1;
|
||||
ret = mfd_add_devices(&pdev->dev, pdev->id,
|
||||
&ds1wm_cell, 1, r, irq);
|
||||
&ds1wm_cell, 1, r, irq, NULL);
|
||||
if (ret < 0)
|
||||
dev_warn(dev, "failed to register DS1WM\n");
|
||||
}
|
||||
|
@ -176,7 +176,8 @@ static int __init pasic3_probe(struct platform_device *pdev)
|
|||
if (pdata && pdata->led_pdata) {
|
||||
led_cell.platform_data = pdata->led_pdata;
|
||||
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)
|
||||
dev_warn(dev, "failed to register LED device\n");
|
||||
}
|
||||
|
|
|
@ -344,13 +344,13 @@ static int __devinit intel_msic_init_devices(struct intel_msic *msic)
|
|||
continue;
|
||||
|
||||
ret = mfd_add_devices(&pdev->dev, -1, &msic_devs[i], 1, NULL,
|
||||
pdata->irq[i]);
|
||||
pdata->irq[i], NULL);
|
||||
if (ret)
|
||||
goto fail;
|
||||
}
|
||||
|
||||
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)
|
||||
goto fail;
|
||||
|
||||
|
|
|
@ -147,7 +147,7 @@ static int __devinit cmodio_probe_submodules(struct cmodio_device *priv)
|
|||
}
|
||||
|
||||
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)
|
|||
writeb(0xff, adc->base + JZ_REG_ADC_CTRL);
|
||||
|
||||
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)
|
||||
goto err_clk_put;
|
||||
|
||||
|
|
|
@ -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].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) {
|
||||
dev_err(lm3533->dev, "failed to add ALS device\n");
|
||||
return ret;
|
||||
|
@ -422,7 +423,7 @@ static int __devinit lm3533_device_bl_init(struct lm3533 *lm3533)
|
|||
}
|
||||
|
||||
ret = mfd_add_devices(lm3533->dev, 0, lm3533_bl_devs,
|
||||
pdata->num_backlights, NULL, 0);
|
||||
pdata->num_backlights, NULL, 0, NULL);
|
||||
if (ret) {
|
||||
dev_err(lm3533->dev, "failed to add backlight devices\n");
|
||||
return ret;
|
||||
|
@ -451,7 +452,7 @@ static int __devinit lm3533_device_led_init(struct lm3533 *lm3533)
|
|||
}
|
||||
|
||||
ret = mfd_add_devices(lm3533->dev, 0, lm3533_led_devs,
|
||||
pdata->num_leds, NULL, 0);
|
||||
pdata->num_leds, NULL, 0, NULL);
|
||||
if (ret) {
|
||||
dev_err(lm3533->dev, "failed to add LED devices\n");
|
||||
return ret;
|
||||
|
|
|
@ -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);
|
||||
ret = mfd_add_devices(&dev->dev, -1, &lpc_ich_cells[LPC_GPIO],
|
||||
1, NULL, 0);
|
||||
1, NULL, 0, NULL);
|
||||
|
||||
gpio_done:
|
||||
if (acpi_conflict)
|
||||
|
@ -765,7 +765,6 @@ static int __devinit lpc_ich_init_wdt(struct pci_dev *dev,
|
|||
u32 base_addr_cfg;
|
||||
u32 base_addr;
|
||||
int ret;
|
||||
bool acpi_conflict = false;
|
||||
struct resource *res;
|
||||
|
||||
/* Setup power management base register */
|
||||
|
@ -780,20 +779,11 @@ static int __devinit lpc_ich_init_wdt(struct pci_dev *dev,
|
|||
res = wdt_io_res(ICH_RES_IO_TCO);
|
||||
res->start = base_addr + ACPIBASE_TCO_OFF;
|
||||
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->start = base_addr + ACPIBASE_SMI_OFF;
|
||||
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);
|
||||
|
||||
/*
|
||||
|
@ -813,21 +803,13 @@ static int __devinit lpc_ich_init_wdt(struct pci_dev *dev,
|
|||
res = wdt_mem_res(ICH_RES_MEM_GCS);
|
||||
res->start = base_addr + ACPIBASE_GCS_OFF;
|
||||
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);
|
||||
ret = mfd_add_devices(&dev->dev, -1, &lpc_ich_cells[LPC_WDT],
|
||||
1, NULL, 0);
|
||||
1, NULL, 0, NULL);
|
||||
|
||||
wdt_done:
|
||||
if (acpi_conflict)
|
||||
pr_warn("Resource conflict(s) found affecting %s\n",
|
||||
lpc_ich_cells[LPC_WDT].name);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
|
@ -127,7 +127,8 @@ static int __devinit lpc_sch_probe(struct pci_dev *dev,
|
|||
lpc_sch_cells[i].id = id->device;
|
||||
|
||||
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)
|
||||
goto out_dev;
|
||||
|
||||
|
@ -153,7 +154,8 @@ static int __devinit lpc_sch_probe(struct pci_dev *dev,
|
|||
tunnelcreek_cells[i].id = id->device;
|
||||
|
||||
ret = mfd_add_devices(&dev->dev, 0, tunnelcreek_cells,
|
||||
ARRAY_SIZE(tunnelcreek_cells), NULL, 0);
|
||||
ARRAY_SIZE(tunnelcreek_cells), NULL,
|
||||
0, NULL);
|
||||
}
|
||||
|
||||
return ret;
|
||||
|
|
|
@ -126,7 +126,7 @@ static int max77686_i2c_probe(struct i2c_client *i2c,
|
|||
max77686_irq_init(max77686);
|
||||
|
||||
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)
|
||||
goto err_mfd;
|
||||
|
|
|
@ -137,6 +137,9 @@ static void max77693_irq_mask(struct irq_data *data)
|
|||
const struct max77693_irq_data *irq_data =
|
||||
irq_to_max77693_irq(max77693, data->irq);
|
||||
|
||||
if (irq_data->group >= MAX77693_IRQ_GROUP_NR)
|
||||
return;
|
||||
|
||||
if (irq_data->group >= MUIC_INT1 && irq_data->group <= MUIC_INT3)
|
||||
max77693->irq_masks_cur[irq_data->group] &= ~irq_data->mask;
|
||||
else
|
||||
|
@ -149,6 +152,9 @@ static void max77693_irq_unmask(struct irq_data *data)
|
|||
const struct max77693_irq_data *irq_data =
|
||||
irq_to_max77693_irq(max77693, data->irq);
|
||||
|
||||
if (irq_data->group >= MAX77693_IRQ_GROUP_NR)
|
||||
return;
|
||||
|
||||
if (irq_data->group >= MUIC_INT1 && irq_data->group <= MUIC_INT3)
|
||||
max77693->irq_masks_cur[irq_data->group] |= irq_data->mask;
|
||||
else
|
||||
|
@ -200,7 +206,7 @@ static irqreturn_t max77693_irq_thread(int irq, void *data)
|
|||
|
||||
if (irq_src & MAX77693_IRQSRC_MUIC)
|
||||
/* MUIC INT1 ~ INT3 */
|
||||
max77693_bulk_read(max77693->regmap, MAX77693_MUIC_REG_INT1,
|
||||
max77693_bulk_read(max77693->regmap_muic, MAX77693_MUIC_REG_INT1,
|
||||
MAX77693_NUM_IRQ_MUIC_REGS, &irq_reg[MUIC_INT1]);
|
||||
|
||||
/* Apply masking */
|
||||
|
@ -255,7 +261,8 @@ int max77693_irq_init(struct max77693_dev *max77693)
|
|||
{
|
||||
struct irq_domain *domain;
|
||||
int i;
|
||||
int ret;
|
||||
int ret = 0;
|
||||
u8 intsrc_mask;
|
||||
|
||||
mutex_init(&max77693->irqlock);
|
||||
|
||||
|
@ -287,19 +294,38 @@ int max77693_irq_init(struct max77693_dev *max77693)
|
|||
&max77693_irq_domain_ops, max77693);
|
||||
if (!domain) {
|
||||
dev_err(max77693->dev, "could not create irq domain\n");
|
||||
return -ENODEV;
|
||||
ret = -ENODEV;
|
||||
goto err_irq;
|
||||
}
|
||||
max77693->irq_domain = domain;
|
||||
|
||||
/* Unmask max77693 interrupt */
|
||||
ret = max77693_read_reg(max77693->regmap,
|
||||
MAX77693_PMIC_REG_INTSRC_MASK, &intsrc_mask);
|
||||
if (ret < 0) {
|
||||
dev_err(max77693->dev, "fail to read PMIC register\n");
|
||||
goto err_irq;
|
||||
}
|
||||
|
||||
intsrc_mask &= ~(MAX77693_IRQSRC_CHG);
|
||||
intsrc_mask &= ~(MAX77693_IRQSRC_FLASH);
|
||||
intsrc_mask &= ~(MAX77693_IRQSRC_MUIC);
|
||||
ret = max77693_write_reg(max77693->regmap,
|
||||
MAX77693_PMIC_REG_INTSRC_MASK, intsrc_mask);
|
||||
if (ret < 0) {
|
||||
dev_err(max77693->dev, "fail to write PMIC register\n");
|
||||
goto err_irq;
|
||||
}
|
||||
|
||||
ret = request_threaded_irq(max77693->irq, NULL, max77693_irq_thread,
|
||||
IRQF_TRIGGER_FALLING | IRQF_ONESHOT,
|
||||
"max77693-irq", max77693);
|
||||
|
||||
if (ret)
|
||||
dev_err(max77693->dev, "Failed to request IRQ %d: %d\n",
|
||||
max77693->irq, ret);
|
||||
|
||||
return 0;
|
||||
err_irq:
|
||||
return ret;
|
||||
}
|
||||
|
||||
void max77693_irq_exit(struct max77693_dev *max77693)
|
||||
|
|
|
@ -152,6 +152,20 @@ static int max77693_i2c_probe(struct i2c_client *i2c,
|
|||
max77693->haptic = i2c_new_dummy(i2c->adapter, I2C_ADDR_HAPTIC);
|
||||
i2c_set_clientdata(max77693->haptic, max77693);
|
||||
|
||||
/*
|
||||
* Initialize register map for MUIC device because use regmap-muic
|
||||
* instance of MUIC device when irq of max77693 is initialized
|
||||
* before call max77693-muic probe() function.
|
||||
*/
|
||||
max77693->regmap_muic = devm_regmap_init_i2c(max77693->muic,
|
||||
&max77693_regmap_config);
|
||||
if (IS_ERR(max77693->regmap_muic)) {
|
||||
ret = PTR_ERR(max77693->regmap_muic);
|
||||
dev_err(max77693->dev,
|
||||
"failed to allocate register map: %d\n", ret);
|
||||
goto err_regmap;
|
||||
}
|
||||
|
||||
ret = max77693_irq_init(max77693);
|
||||
if (ret < 0)
|
||||
goto err_irq;
|
||||
|
@ -159,7 +173,7 @@ static int max77693_i2c_probe(struct i2c_client *i2c,
|
|||
pm_runtime_set_active(max77693->dev);
|
||||
|
||||
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)
|
||||
goto err_mfd;
|
||||
|
||||
|
|
|
@ -598,7 +598,7 @@ int __devinit max8925_device_init(struct max8925_chip *chip,
|
|||
|
||||
ret = mfd_add_devices(chip->dev, 0, &rtc_devs[0],
|
||||
ARRAY_SIZE(rtc_devs),
|
||||
&rtc_resources[0], chip->irq_base);
|
||||
&rtc_resources[0], chip->irq_base, NULL);
|
||||
if (ret < 0) {
|
||||
dev_err(chip->dev, "Failed to add rtc subdev\n");
|
||||
goto out;
|
||||
|
@ -606,7 +606,7 @@ int __devinit max8925_device_init(struct max8925_chip *chip,
|
|||
|
||||
ret = mfd_add_devices(chip->dev, 0, &onkey_devs[0],
|
||||
ARRAY_SIZE(onkey_devs),
|
||||
&onkey_resources[0], 0);
|
||||
&onkey_resources[0], 0, NULL);
|
||||
if (ret < 0) {
|
||||
dev_err(chip->dev, "Failed to add onkey subdev\n");
|
||||
goto out_dev;
|
||||
|
@ -615,7 +615,7 @@ int __devinit max8925_device_init(struct max8925_chip *chip,
|
|||
if (pdata) {
|
||||
ret = mfd_add_devices(chip->dev, 0, ®ulator_devs[0],
|
||||
ARRAY_SIZE(regulator_devs),
|
||||
®ulator_resources[0], 0);
|
||||
®ulator_resources[0], 0, NULL);
|
||||
if (ret < 0) {
|
||||
dev_err(chip->dev, "Failed to add regulator subdev\n");
|
||||
goto out_dev;
|
||||
|
@ -625,7 +625,7 @@ int __devinit max8925_device_init(struct max8925_chip *chip,
|
|||
if (pdata && pdata->backlight) {
|
||||
ret = mfd_add_devices(chip->dev, 0, &backlight_devs[0],
|
||||
ARRAY_SIZE(backlight_devs),
|
||||
&backlight_resources[0], 0);
|
||||
&backlight_resources[0], 0, NULL);
|
||||
if (ret < 0) {
|
||||
dev_err(chip->dev, "Failed to add backlight subdev\n");
|
||||
goto out_dev;
|
||||
|
@ -635,7 +635,7 @@ int __devinit max8925_device_init(struct max8925_chip *chip,
|
|||
if (pdata && pdata->power) {
|
||||
ret = mfd_add_devices(chip->dev, 0, &power_devs[0],
|
||||
ARRAY_SIZE(power_devs),
|
||||
&power_supply_resources[0], 0);
|
||||
&power_supply_resources[0], 0, NULL);
|
||||
if (ret < 0) {
|
||||
dev_err(chip->dev, "Failed to add power supply "
|
||||
"subdev\n");
|
||||
|
@ -646,7 +646,7 @@ int __devinit max8925_device_init(struct max8925_chip *chip,
|
|||
if (pdata && pdata->touch) {
|
||||
ret = mfd_add_devices(chip->dev, 0, &touch_devs[0],
|
||||
ARRAY_SIZE(touch_devs),
|
||||
&touch_resources[0], 0);
|
||||
&touch_resources[0], 0, NULL);
|
||||
if (ret < 0) {
|
||||
dev_err(chip->dev, "Failed to add touch subdev\n");
|
||||
goto out_dev;
|
||||
|
|
|
@ -160,7 +160,7 @@ static int max8997_i2c_probe(struct i2c_client *i2c,
|
|||
|
||||
mfd_add_devices(max8997->dev, -1, max8997_devs,
|
||||
ARRAY_SIZE(max8997_devs),
|
||||
NULL, 0);
|
||||
NULL, 0, NULL);
|
||||
|
||||
/*
|
||||
* TODO: enable others (flash, muic, rtc, battery, ...) and
|
||||
|
|
|
@ -161,13 +161,13 @@ static int max8998_i2c_probe(struct i2c_client *i2c,
|
|||
switch (id->driver_data) {
|
||||
case TYPE_LP3974:
|
||||
ret = mfd_add_devices(max8998->dev, -1,
|
||||
lp3974_devs, ARRAY_SIZE(lp3974_devs),
|
||||
NULL, 0);
|
||||
lp3974_devs, ARRAY_SIZE(lp3974_devs),
|
||||
NULL, 0, NULL);
|
||||
break;
|
||||
case TYPE_MAX8998:
|
||||
ret = mfd_add_devices(max8998->dev, -1,
|
||||
max8998_devs, ARRAY_SIZE(max8998_devs),
|
||||
NULL, 0);
|
||||
max8998_devs, ARRAY_SIZE(max8998_devs),
|
||||
NULL, 0, NULL);
|
||||
break;
|
||||
default:
|
||||
ret = -EINVAL;
|
||||
|
|
|
@ -612,7 +612,7 @@ static int mc13xxx_add_subdevice_pdata(struct mc13xxx *mc13xxx,
|
|||
if (!cell.name)
|
||||
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)
|
||||
|
|
|
@ -74,12 +74,11 @@ static int mfd_platform_add_cell(struct platform_device *pdev,
|
|||
static int mfd_add_device(struct device *parent, int id,
|
||||
const struct mfd_cell *cell,
|
||||
struct resource *mem_base,
|
||||
int irq_base)
|
||||
int irq_base, struct irq_domain *domain)
|
||||
{
|
||||
struct resource *res;
|
||||
struct platform_device *pdev;
|
||||
struct device_node *np = NULL;
|
||||
struct irq_domain *domain = NULL;
|
||||
int ret = -ENOMEM;
|
||||
int r;
|
||||
|
||||
|
@ -97,7 +96,6 @@ static int mfd_add_device(struct device *parent, int id,
|
|||
for_each_child_of_node(parent->of_node, np) {
|
||||
if (of_device_is_compatible(np, cell->of_compatible)) {
|
||||
pdev->dev.of_node = np;
|
||||
domain = irq_find_host(parent->of_node);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -177,7 +175,7 @@ static int mfd_add_device(struct device *parent, int id,
|
|||
int mfd_add_devices(struct device *parent, int id,
|
||||
struct mfd_cell *cells, int n_devs,
|
||||
struct resource *mem_base,
|
||||
int irq_base)
|
||||
int irq_base, struct irq_domain *domain)
|
||||
{
|
||||
int i;
|
||||
int ret = 0;
|
||||
|
@ -191,7 +189,8 @@ int mfd_add_devices(struct device *parent, int id,
|
|||
for (i = 0; i < n_devs; i++) {
|
||||
atomic_set(&cnts[i], 0);
|
||||
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)
|
||||
break;
|
||||
}
|
||||
|
@ -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++) {
|
||||
cell_entry.name = clones[i];
|
||||
/* 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",
|
||||
clones[i]);
|
||||
}
|
||||
|
|
|
@ -453,7 +453,8 @@ static int __devinit palmas_i2c_probe(struct i2c_client *i2c,
|
|||
|
||||
ret = mfd_add_devices(palmas->dev, -1,
|
||||
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);
|
||||
|
||||
if (ret < 0)
|
||||
|
|
|
@ -289,7 +289,7 @@ static int __devinit rc5t583_i2c_probe(struct i2c_client *i2c,
|
|||
}
|
||||
|
||||
ret = mfd_add_devices(rc5t583->dev, -1, rc5t583_subdevs,
|
||||
ARRAY_SIZE(rc5t583_subdevs), NULL, 0);
|
||||
ARRAY_SIZE(rc5t583_subdevs), NULL, 0, NULL);
|
||||
if (ret) {
|
||||
dev_err(&i2c->dev, "add mfd devices failed: %d\n", ret);
|
||||
goto err_add_devs;
|
||||
|
|
|
@ -87,7 +87,8 @@ static int __devinit rdc321x_sb_probe(struct pci_dev *pdev,
|
|||
rdc321x_wdt_pdata.sb_pdev = pdev;
|
||||
|
||||
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)
|
||||
|
|
|
@ -141,19 +141,19 @@ static int sec_pmic_probe(struct i2c_client *i2c,
|
|||
switch (sec_pmic->device_type) {
|
||||
case S5M8751X:
|
||||
ret = mfd_add_devices(sec_pmic->dev, -1, s5m8751_devs,
|
||||
ARRAY_SIZE(s5m8751_devs), NULL, 0);
|
||||
ARRAY_SIZE(s5m8751_devs), NULL, 0, NULL);
|
||||
break;
|
||||
case S5M8763X:
|
||||
ret = mfd_add_devices(sec_pmic->dev, -1, s5m8763_devs,
|
||||
ARRAY_SIZE(s5m8763_devs), NULL, 0);
|
||||
ARRAY_SIZE(s5m8763_devs), NULL, 0, NULL);
|
||||
break;
|
||||
case S5M8767X:
|
||||
ret = mfd_add_devices(sec_pmic->dev, -1, s5m8767_devs,
|
||||
ARRAY_SIZE(s5m8767_devs), NULL, 0);
|
||||
ARRAY_SIZE(s5m8767_devs), NULL, 0, NULL);
|
||||
break;
|
||||
case S2MPS11X:
|
||||
ret = mfd_add_devices(sec_pmic->dev, -1, s2mps11_devs,
|
||||
ARRAY_SIZE(s2mps11_devs), NULL, 0);
|
||||
ARRAY_SIZE(s2mps11_devs), NULL, 0, NULL);
|
||||
break;
|
||||
default:
|
||||
/* If this happens the probe function is problem */
|
||||
|
|
|
@ -407,7 +407,7 @@ static int __devinit sta2x11_mfd_probe(struct pci_dev *pdev,
|
|||
sta2x11_mfd_bar0,
|
||||
ARRAY_SIZE(sta2x11_mfd_bar0),
|
||||
&pdev->resource[0],
|
||||
0);
|
||||
0, NULL);
|
||||
if (err) {
|
||||
dev_err(&pdev->dev, "mfd_add_devices[0] failed: %d\n", err);
|
||||
goto err_disable;
|
||||
|
@ -417,7 +417,7 @@ static int __devinit sta2x11_mfd_probe(struct pci_dev *pdev,
|
|||
sta2x11_mfd_bar1,
|
||||
ARRAY_SIZE(sta2x11_mfd_bar1),
|
||||
&pdev->resource[1],
|
||||
0);
|
||||
0, NULL);
|
||||
if (err) {
|
||||
dev_err(&pdev->dev, "mfd_add_devices[1] failed: %d\n", err);
|
||||
goto err_disable;
|
||||
|
|
|
@ -962,7 +962,7 @@ static int __devinit stmpe_add_device(struct stmpe *stmpe,
|
|||
struct mfd_cell *cell, int irq)
|
||||
{
|
||||
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)
|
||||
|
|
|
@ -388,7 +388,7 @@ static int t7l66xb_probe(struct platform_device *dev)
|
|||
|
||||
ret = mfd_add_devices(&dev->dev, dev->id,
|
||||
t7l66xb_cells, ARRAY_SIZE(t7l66xb_cells),
|
||||
iomem, t7l66xb->irq_base);
|
||||
iomem, t7l66xb->irq_base, NULL);
|
||||
|
||||
if (!ret)
|
||||
return 0;
|
||||
|
|
|
@ -262,8 +262,8 @@ static int __devinit tc3589x_device_init(struct tc3589x *tc3589x)
|
|||
|
||||
if (blocks & TC3589x_BLOCK_GPIO) {
|
||||
ret = mfd_add_devices(tc3589x->dev, -1, tc3589x_dev_gpio,
|
||||
ARRAY_SIZE(tc3589x_dev_gpio), NULL,
|
||||
tc3589x->irq_base);
|
||||
ARRAY_SIZE(tc3589x_dev_gpio), NULL,
|
||||
tc3589x->irq_base, NULL);
|
||||
if (ret) {
|
||||
dev_err(tc3589x->dev, "failed to add gpio child\n");
|
||||
return ret;
|
||||
|
@ -273,8 +273,8 @@ static int __devinit tc3589x_device_init(struct tc3589x *tc3589x)
|
|||
|
||||
if (blocks & TC3589x_BLOCK_KEYPAD) {
|
||||
ret = mfd_add_devices(tc3589x->dev, -1, tc3589x_dev_keypad,
|
||||
ARRAY_SIZE(tc3589x_dev_keypad), NULL,
|
||||
tc3589x->irq_base);
|
||||
ARRAY_SIZE(tc3589x_dev_keypad), NULL,
|
||||
tc3589x->irq_base, NULL);
|
||||
if (ret) {
|
||||
dev_err(tc3589x->dev, "failed to keypad child\n");
|
||||
return ret;
|
||||
|
|
|
@ -192,7 +192,7 @@ static int __devinit tc6387xb_probe(struct platform_device *dev)
|
|||
printk(KERN_INFO "Toshiba tc6387xb initialised\n");
|
||||
|
||||
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)
|
||||
return 0;
|
||||
|
|
|
@ -700,8 +700,8 @@ static int __devinit tc6393xb_probe(struct platform_device *dev)
|
|||
tc6393xb_cells[TC6393XB_CELL_FB].pdata_size = sizeof(*tcpd->fb_data);
|
||||
|
||||
ret = mfd_add_devices(&dev->dev, dev->id,
|
||||
tc6393xb_cells, ARRAY_SIZE(tc6393xb_cells),
|
||||
iomem, tcpd->irq_base);
|
||||
tc6393xb_cells, ARRAY_SIZE(tc6393xb_cells),
|
||||
iomem, tcpd->irq_base, NULL);
|
||||
|
||||
if (!ret)
|
||||
return 0;
|
||||
|
|
|
@ -412,7 +412,7 @@ static int __devinit ti_ssp_probe(struct platform_device *pdev)
|
|||
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) {
|
||||
dev_err(dev, "cannot add mfd cells\n");
|
||||
goto error_enable;
|
||||
|
|
|
@ -757,25 +757,25 @@ static int __devinit timb_probe(struct pci_dev *dev,
|
|||
err = mfd_add_devices(&dev->dev, -1,
|
||||
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;
|
||||
case TIMB_HW_VER1:
|
||||
err = mfd_add_devices(&dev->dev, -1,
|
||||
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;
|
||||
case TIMB_HW_VER2:
|
||||
err = mfd_add_devices(&dev->dev, -1,
|
||||
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;
|
||||
case TIMB_HW_VER3:
|
||||
err = mfd_add_devices(&dev->dev, -1,
|
||||
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;
|
||||
default:
|
||||
dev_err(&dev->dev, "Uknown IP setup: %d.%d.%d\n",
|
||||
|
@ -792,7 +792,7 @@ static int __devinit timb_probe(struct pci_dev *dev,
|
|||
|
||||
err = mfd_add_devices(&dev->dev, 0,
|
||||
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) {
|
||||
dev_err(&dev->dev, "mfd_add_devices failed: %d\n", err);
|
||||
goto err_mfd2;
|
||||
|
@ -803,7 +803,7 @@ static int __devinit timb_probe(struct pci_dev *dev,
|
|||
((priv->fw.config & TIMB_HW_VER_MASK) == TIMB_HW_VER3)) {
|
||||
err = mfd_add_devices(&dev->dev, 1, 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) {
|
||||
dev_err(&dev->dev, "mfd_add_devices failed: %d\n", err);
|
||||
goto err_mfd2;
|
||||
|
|
|
@ -188,7 +188,7 @@ static int __devinit tps6105x_probe(struct i2c_client *client,
|
|||
}
|
||||
|
||||
ret = mfd_add_devices(&client->dev, 0, tps6105x_cells,
|
||||
ARRAY_SIZE(tps6105x_cells), NULL, 0);
|
||||
ARRAY_SIZE(tps6105x_cells), NULL, 0, NULL);
|
||||
if (ret)
|
||||
goto fail;
|
||||
|
||||
|
|
|
@ -100,7 +100,7 @@ static int tps6507x_i2c_probe(struct i2c_client *i2c,
|
|||
|
||||
ret = mfd_add_devices(tps6507x->dev, -1,
|
||||
tps6507x_devs, ARRAY_SIZE(tps6507x_devs),
|
||||
NULL, 0);
|
||||
NULL, 0, NULL);
|
||||
|
||||
if (ret < 0)
|
||||
goto err;
|
||||
|
|
|
@ -292,7 +292,7 @@ static int __devinit tps65090_i2c_probe(struct i2c_client *client,
|
|||
}
|
||||
|
||||
ret = mfd_add_devices(tps65090->dev, -1, tps65090s,
|
||||
ARRAY_SIZE(tps65090s), NULL, 0);
|
||||
ARRAY_SIZE(tps65090s), NULL, 0, NULL);
|
||||
if (ret) {
|
||||
dev_err(&client->dev, "add mfd devices failed with err: %d\n",
|
||||
ret);
|
||||
|
|
|
@ -24,11 +24,18 @@
|
|||
#include <linux/slab.h>
|
||||
#include <linux/regmap.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/tps65217.h>
|
||||
|
||||
static struct mfd_cell tps65217s[] = {
|
||||
{
|
||||
.name = "tps65217-pmic",
|
||||
},
|
||||
};
|
||||
|
||||
/**
|
||||
* tps65217_reg_read: Read a single tps65217 register.
|
||||
*
|
||||
|
@ -133,83 +140,48 @@ int tps65217_clear_bits(struct tps65217 *tps, unsigned int reg,
|
|||
}
|
||||
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 = {
|
||||
.reg_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,
|
||||
const struct i2c_device_id *ids)
|
||||
{
|
||||
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 chip_id = ids->driver_data;
|
||||
const struct of_device_id *match;
|
||||
int ret;
|
||||
|
||||
if (!pdata && client->dev.of_node)
|
||||
pdata = tps65217_parse_dt(client);
|
||||
if (client->dev.of_node) {
|
||||
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);
|
||||
if (!tps)
|
||||
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);
|
||||
if (IS_ERR(tps->regmap)) {
|
||||
ret = PTR_ERR(tps->regmap);
|
||||
|
@ -218,8 +190,12 @@ static int __devinit tps65217_probe(struct i2c_client *client,
|
|||
return ret;
|
||||
}
|
||||
|
||||
i2c_set_clientdata(client, tps);
|
||||
tps->dev = &client->dev;
|
||||
ret = mfd_add_devices(tps->dev, -1, tps65217s,
|
||||
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);
|
||||
if (ret < 0) {
|
||||
|
@ -232,41 +208,21 @@ static int __devinit tps65217_probe(struct i2c_client *client,
|
|||
(version & TPS65217_CHIPID_CHIP_MASK) >> 4,
|
||||
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;
|
||||
}
|
||||
|
||||
static int __devexit tps65217_remove(struct i2c_client *client)
|
||||
{
|
||||
struct tps65217 *tps = i2c_get_clientdata(client);
|
||||
int i;
|
||||
|
||||
for (i = 0; i < TPS65217_NUM_REGULATOR; i++)
|
||||
platform_device_unregister(tps->regulator_pdev[i]);
|
||||
mfd_remove_devices(tps->dev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct i2c_device_id tps65217_id_table[] = {
|
||||
{"tps65217", 0xF0},
|
||||
{/* end of list */}
|
||||
{"tps65217", TPS65217},
|
||||
{ /* sentinel */ }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(i2c, tps65217_id_table);
|
||||
|
||||
|
|
|
@ -493,7 +493,8 @@ static int __devinit tps6586x_i2c_probe(struct i2c_client *client,
|
|||
}
|
||||
|
||||
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) {
|
||||
dev_err(&client->dev, "mfd_add_devices failed: %d\n", ret);
|
||||
goto err_mfd_add;
|
||||
|
|
|
@ -254,7 +254,7 @@ static __devinit int tps65910_i2c_probe(struct i2c_client *i2c,
|
|||
|
||||
ret = mfd_add_devices(tps65910->dev, -1,
|
||||
tps65910s, ARRAY_SIZE(tps65910s),
|
||||
NULL, 0);
|
||||
NULL, 0, NULL);
|
||||
if (ret < 0) {
|
||||
dev_err(&i2c->dev, "mfd_add_devices failed: %d\n", ret);
|
||||
return ret;
|
||||
|
|
|
@ -146,7 +146,7 @@ int tps65912_device_init(struct tps65912 *tps65912)
|
|||
|
||||
ret = mfd_add_devices(tps65912->dev, -1,
|
||||
tps65912s, ARRAY_SIZE(tps65912s),
|
||||
NULL, 0);
|
||||
NULL, 0, NULL);
|
||||
if (ret < 0)
|
||||
goto err;
|
||||
|
||||
|
|
|
@ -223,7 +223,7 @@ static int __devinit twl4030_audio_probe(struct platform_device *pdev)
|
|||
|
||||
if (childs)
|
||||
ret = mfd_add_devices(&pdev->dev, pdev->id, audio->cells,
|
||||
childs, NULL, 0);
|
||||
childs, NULL, 0, NULL);
|
||||
else {
|
||||
dev_err(&pdev->dev, "No platform data found for childs\n");
|
||||
ret = -ENODEV;
|
||||
|
|
|
@ -632,7 +632,7 @@ static int __devinit twl6040_probe(struct i2c_client *client,
|
|||
}
|
||||
|
||||
ret = mfd_add_devices(&client->dev, -1, twl6040->cells, children,
|
||||
NULL, 0);
|
||||
NULL, 0, NULL);
|
||||
if (ret)
|
||||
goto mfd_err;
|
||||
|
||||
|
|
|
@ -102,7 +102,7 @@ static __devinit int vx855_probe(struct pci_dev *pdev,
|
|||
vx855_gpio_resources[1].end = vx855_gpio_resources[1].start + 3;
|
||||
|
||||
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
|
||||
* drivers like old, not-yet-platform_device ported i2c-viapro */
|
||||
|
|
|
@ -241,7 +241,7 @@ static int __devinit wl1273_core_probe(struct i2c_client *client,
|
|||
__func__, children);
|
||||
|
||||
r = mfd_add_devices(&client->dev, -1, core->cells,
|
||||
children, NULL, 0);
|
||||
children, NULL, 0, NULL);
|
||||
if (r)
|
||||
goto err;
|
||||
|
||||
|
|
|
@ -1813,27 +1813,27 @@ int wm831x_device_init(struct wm831x *wm831x, unsigned long id, int irq)
|
|||
case WM8310:
|
||||
ret = mfd_add_devices(wm831x->dev, wm831x_num,
|
||||
wm8310_devs, ARRAY_SIZE(wm8310_devs),
|
||||
NULL, 0);
|
||||
NULL, 0, NULL);
|
||||
break;
|
||||
|
||||
case WM8311:
|
||||
ret = mfd_add_devices(wm831x->dev, wm831x_num,
|
||||
wm8311_devs, ARRAY_SIZE(wm8311_devs),
|
||||
NULL, 0);
|
||||
NULL, 0, NULL);
|
||||
if (!pdata || !pdata->disable_touch)
|
||||
mfd_add_devices(wm831x->dev, wm831x_num,
|
||||
touch_devs, ARRAY_SIZE(touch_devs),
|
||||
NULL, 0);
|
||||
NULL, 0, NULL);
|
||||
break;
|
||||
|
||||
case WM8312:
|
||||
ret = mfd_add_devices(wm831x->dev, wm831x_num,
|
||||
wm8312_devs, ARRAY_SIZE(wm8312_devs),
|
||||
NULL, 0);
|
||||
NULL, 0, NULL);
|
||||
if (!pdata || !pdata->disable_touch)
|
||||
mfd_add_devices(wm831x->dev, wm831x_num,
|
||||
touch_devs, ARRAY_SIZE(touch_devs),
|
||||
NULL, 0);
|
||||
NULL, 0, NULL);
|
||||
break;
|
||||
|
||||
case WM8320:
|
||||
|
@ -1842,7 +1842,7 @@ int wm831x_device_init(struct wm831x *wm831x, unsigned long id, int irq)
|
|||
case WM8326:
|
||||
ret = mfd_add_devices(wm831x->dev, wm831x_num,
|
||||
wm8320_devs, ARRAY_SIZE(wm8320_devs),
|
||||
NULL, 0);
|
||||
NULL, 0, NULL);
|
||||
break;
|
||||
|
||||
default:
|
||||
|
@ -1867,7 +1867,7 @@ int wm831x_device_init(struct wm831x *wm831x, unsigned long id, int irq)
|
|||
if (ret & WM831X_XTAL_ENA) {
|
||||
ret = mfd_add_devices(wm831x->dev, wm831x_num,
|
||||
rtc_devs, ARRAY_SIZE(rtc_devs),
|
||||
NULL, 0);
|
||||
NULL, 0, NULL);
|
||||
if (ret != 0) {
|
||||
dev_err(wm831x->dev, "Failed to add RTC: %d\n", ret);
|
||||
goto err_irq;
|
||||
|
@ -1880,7 +1880,7 @@ int wm831x_device_init(struct wm831x *wm831x, unsigned long id, int irq)
|
|||
/* Treat errors as non-critical */
|
||||
ret = mfd_add_devices(wm831x->dev, wm831x_num, backlight_devs,
|
||||
ARRAY_SIZE(backlight_devs), NULL,
|
||||
0);
|
||||
0, NULL);
|
||||
if (ret < 0)
|
||||
dev_err(wm831x->dev, "Failed to add backlight: %d\n",
|
||||
ret);
|
||||
|
|
|
@ -70,7 +70,7 @@ static int wm8400_register_codec(struct wm8400 *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)
|
|||
ret = mfd_add_devices(wm8994->dev, -1,
|
||||
wm8994_regulator_devs,
|
||||
ARRAY_SIZE(wm8994_regulator_devs),
|
||||
NULL, 0);
|
||||
NULL, 0, NULL);
|
||||
if (ret != 0) {
|
||||
dev_err(wm8994->dev, "Failed to add children: %d\n", ret);
|
||||
goto err;
|
||||
|
@ -648,7 +648,7 @@ static __devinit int wm8994_device_init(struct wm8994 *wm8994, int irq)
|
|||
|
||||
ret = mfd_add_devices(wm8994->dev, -1,
|
||||
wm8994_devs, ARRAY_SIZE(wm8994_devs),
|
||||
NULL, 0);
|
||||
NULL, 0, NULL);
|
||||
if (ret != 0) {
|
||||
dev_err(wm8994->dev, "Failed to add children: %d\n", ret);
|
||||
goto err_irq;
|
||||
|
|
|
@ -22,6 +22,7 @@
|
|||
#include <linux/err.h>
|
||||
#include <linux/platform_device.h>
|
||||
|
||||
#include <linux/regulator/of_regulator.h>
|
||||
#include <linux/regulator/driver.h>
|
||||
#include <linux/regulator/machine.h>
|
||||
#include <linux/mfd/tps65217.h>
|
||||
|
@ -281,37 +282,130 @@ static const struct regulator_desc regulators[] = {
|
|||
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)
|
||||
{
|
||||
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 tps65217 *tps;
|
||||
struct tps_info *info = &tps65217_pmic_regs[pdev->id];
|
||||
struct regulator_config config = { };
|
||||
int i, ret;
|
||||
|
||||
/* Already set by core driver */
|
||||
tps = dev_to_tps65217(pdev->dev.parent);
|
||||
tps->info[pdev->id] = info;
|
||||
if (tps->dev->of_node)
|
||||
pdata = tps65217_parse_dt(pdev);
|
||||
|
||||
config.dev = &pdev->dev;
|
||||
config.of_node = pdev->dev.of_node;
|
||||
config.init_data = pdev->dev.platform_data;
|
||||
config.driver_data = tps;
|
||||
if (!pdata) {
|
||||
dev_err(&pdev->dev, "Platform data not found\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
rdev = regulator_register(®ulators[pdev->id], &config);
|
||||
if (IS_ERR(rdev))
|
||||
return PTR_ERR(rdev);
|
||||
if (tps65217_chip_id(tps) != TPS65217) {
|
||||
dev_err(&pdev->dev, "Invalid tps chip version\n");
|
||||
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(®ulators[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;
|
||||
|
||||
err_unregister_regulator:
|
||||
while (--i >= 0)
|
||||
regulator_unregister(tps->rdev[i]);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
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);
|
||||
regulator_unregister(rdev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -837,7 +837,7 @@ static int __devinit tegra_nvec_probe(struct platform_device *pdev)
|
|||
}
|
||||
|
||||
ret = mfd_add_devices(nvec->dev, -1, nvec_devices,
|
||||
ARRAY_SIZE(nvec_devices), base, 0);
|
||||
ARRAY_SIZE(nvec_devices), base, 0, NULL);
|
||||
if (ret)
|
||||
dev_err(nvec->dev, "error adding subdevices\n");
|
||||
|
||||
|
|
|
@ -16,6 +16,8 @@
|
|||
|
||||
#include <linux/platform_device.h>
|
||||
|
||||
struct irq_domain;
|
||||
|
||||
/*
|
||||
* This struct describes the MFD part ("cell").
|
||||
* 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)
|
|||
extern int mfd_add_devices(struct device *parent, int id,
|
||||
struct mfd_cell *cells, int n_devs,
|
||||
struct resource *mem_base,
|
||||
int irq_base);
|
||||
int irq_base, struct irq_domain *irq_domain);
|
||||
|
||||
extern void mfd_remove_devices(struct device *parent);
|
||||
|
||||
|
|
|
@ -22,6 +22,9 @@
|
|||
#include <linux/regulator/driver.h>
|
||||
#include <linux/regulator/machine.h>
|
||||
|
||||
/* TPS chip id list */
|
||||
#define TPS65217 0xF0
|
||||
|
||||
/* I2C ID for TPS65217 part */
|
||||
#define TPS65217_I2C_ID 0x24
|
||||
|
||||
|
@ -248,13 +251,11 @@ struct tps_info {
|
|||
struct tps65217 {
|
||||
struct device *dev;
|
||||
struct tps65217_board *pdata;
|
||||
unsigned int id;
|
||||
struct regulator_desc desc[TPS65217_NUM_REGULATOR];
|
||||
struct regulator_dev *rdev[TPS65217_NUM_REGULATOR];
|
||||
struct tps_info *info[TPS65217_NUM_REGULATOR];
|
||||
struct regmap *regmap;
|
||||
|
||||
/* Client devices */
|
||||
struct platform_device *regulator_pdev[TPS65217_NUM_REGULATOR];
|
||||
};
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
static inline int tps65217_chip_id(struct tps65217 *tps65217)
|
||||
{
|
||||
return tps65217->id;
|
||||
}
|
||||
|
||||
int tps65217_reg_read(struct tps65217 *tps, unsigned int reg,
|
||||
unsigned int *val);
|
||||
int tps65217_reg_write(struct tps65217 *tps, unsigned int reg,
|
||||
|
|
Loading…
Reference in New Issue