All voltagedomains that have support for vc and vp are now automatically registered with SMPS regulator driver. Voltage.c builds a platform device structure for this purpose during late init. Signed-off-by: Tero Kristo <t-kristo@xxxxxx> --- arch/arm/mach-omap2/voltage.c | 81 +++++++++++++++++++++++++++++++++++++++++ 1 files changed, 81 insertions(+), 0 deletions(-) diff --git a/arch/arm/mach-omap2/voltage.c b/arch/arm/mach-omap2/voltage.c index cebc8b1..30102a4 100644 --- a/arch/arm/mach-omap2/voltage.c +++ b/arch/arm/mach-omap2/voltage.c @@ -25,6 +25,9 @@ #include <linux/debugfs.h> #include <linux/slab.h> #include <linux/clk.h> +#include <linux/platform_device.h> +#include <linux/regulator/machine.h> +#include <linux/regulator/omap-smps.h> #include <plat/common.h> @@ -238,6 +241,42 @@ void omap_change_voltscale_method(struct voltagedomain *voltdm, } } +static void smps_add_regulator_info(struct platform_device *smps_dev, + struct voltagedomain *voltdm) +{ + struct omap_smps_platform_data *info; + struct regulator_init_data *init_data; + struct regulator_consumer_supply *supply; + + if (!smps_dev || !voltdm) + return; + + info = smps_dev->dev.platform_data; + + init_data = kzalloc(sizeof(struct regulator_init_data), GFP_KERNEL); + supply = kzalloc(sizeof(struct regulator_consumer_supply), GFP_KERNEL); + + if (!init_data || !supply) { + kfree(init_data); + kfree(supply); + return; + } + supply->supply = "vcc"; + supply->dev_name = voltdm->proc_dev; + init_data->constraints.min_uV = + voltdm->pmic->vsel_to_uv(voltdm->pmic->vp_vddmin); + init_data->constraints.max_uV = + voltdm->pmic->vsel_to_uv(voltdm->pmic->vp_vddmax); + init_data->constraints.valid_modes_mask = REGULATOR_MODE_NORMAL; + init_data->constraints.valid_ops_mask = REGULATOR_CHANGE_VOLTAGE; + init_data->num_consumer_supplies = 1; + init_data->consumer_supplies = supply; + init_data->driver_data = voltdm; + + info->regulators[info->num_regulators++] = init_data; +} + + /** * omap_voltage_late_init() - Init the various voltage parameters * @@ -248,6 +287,11 @@ void omap_change_voltscale_method(struct voltagedomain *voltdm, int __init omap_voltage_late_init(void) { struct voltagedomain *voltdm; + struct platform_device *smps_dev; + struct omap_smps_platform_data *smps_pdata; + struct regulator_init_data **reg_list; + int num_smps = 0; + int ret; if (list_empty(&voltdm_list)) { pr_err("%s: Voltage driver support not added\n", @@ -279,8 +323,45 @@ int __init omap_voltage_late_init(void) voltdm->scale = omap_vp_forceupdate_scale; omap_vp_init(voltdm); } + + if (voltdm->vc && voltdm->vp) + num_smps++; } + if (num_smps) { + smps_dev = platform_device_alloc("omap-smps", -1); + + if (!smps_dev) + return -ENOMEM; + + smps_pdata = kzalloc(sizeof(struct omap_smps_platform_data), + GFP_KERNEL); + reg_list = kzalloc(sizeof(void *) * num_smps, GFP_KERNEL); + + if (!smps_pdata || !reg_list) { + kfree(smps_pdata); + kfree(reg_list); + return -ENOMEM; + } + + smps_pdata->regulators = reg_list; + + ret = platform_device_add_data(smps_dev, smps_pdata, + sizeof(struct omap_smps_platform_data)); + + if (ret) { + kfree(smps_pdata); + kfree(reg_list); + platform_device_put(smps_dev); + return ret; + } + + list_for_each_entry(voltdm, &voltdm_list, node) + if (voltdm->vp && voltdm->vc) + smps_add_regulator_info(smps_dev, voltdm); + + platform_device_add(smps_dev); + } return 0; } -- 1.7.4.1 Texas Instruments Oy, Tekniikantie 12, 02150 Espoo. Y-tunnus: 0115040-6. Kotipaikka: Helsinki -- To unsubscribe from this list: send the line "unsubscribe linux-omap" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html