diff options
Diffstat (limited to 'arch/arm/mach-omap2/omap_pmic.c')
-rw-r--r-- | arch/arm/mach-omap2/omap_pmic.c | 105 |
1 files changed, 105 insertions, 0 deletions
diff --git a/arch/arm/mach-omap2/omap_pmic.c b/arch/arm/mach-omap2/omap_pmic.c new file mode 100644 index 0000000..3271bfe --- /dev/null +++ b/arch/arm/mach-omap2/omap_pmic.c @@ -0,0 +1,105 @@ +/* + * Registration hooks for PMICs used with OMAP + * + * Copyright (C) 2011 Texas Instruments Incorporated - http://www.ti.com/ + * Nishanth Menon + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#include <linux/init.h> +#include <linux/kernel.h> +#include <linux/string.h> + +#include "voltage.h" + +#include "pm.h" + +/** + * omap_pmic_data_init() - trigger point for all PMIC initializers + */ +void __init omap_pmic_data_init(void) +{ + omap_twl_init(); + omap_tps6236x_init(); +} + +/** + * omap_pmic_register_data() - Register the PMIC information to OMAP mapping + * @omap_pmic_maps: array ending with a empty element representing the maps + * @desc: description for this PMIC. + */ +int __init omap_pmic_register_data(struct omap_pmic_map *omap_pmic_maps, + struct omap_pmic_description *desc) +{ + struct voltagedomain *voltdm; + struct omap_pmic_map *map; + int r; + + if (!omap_pmic_maps) + return 0; + + map = omap_pmic_maps; + + while (map->name) { + if (!omap_chip_is(map->omap_chip)) + goto next; + + /* The base PMIC is the one controlling core voltdm */ + if (desc && !strcmp(map->name, "core")) + omap_pm_set_pmic_lp_time(desc->pmic_lp_tstart, + desc->pmic_lp_tshut); + + voltdm = voltdm_lookup(map->name); + if (IS_ERR_OR_NULL(voltdm)) { + pr_err("%s: unable to find map %s\n", __func__, + map->name); + goto next; + } + if (IS_ERR_OR_NULL(map->pmic_data)) { + pr_warning("%s: domain[%s] has no pmic data\n", + __func__, map->name); + goto next; + } + + r = omap_voltage_register_pmic(voltdm, map->pmic_data); + if (r) { + pr_warning("%s: domain[%s] register returned %d\n", + __func__, map->name, r); + goto next; + } + if (map->special_action) { + r = map->special_action(voltdm); + WARN(r, "%s: domain[%s] action returned %d\n", __func__, + map->name, r); + } +next: + map++; + } + + return 0; +} + +int __init omap_pmic_update(struct omap_pmic_map *tmp_map, char *name, + u32 old_chip_id, u32 new_chip_id) +{ + while (tmp_map->name != NULL) { + if (!strcmp(tmp_map->name, name) && + (tmp_map->omap_chip.oc & new_chip_id)) { + WARN(1, "%s: this map already exists:%s-%x\n", + __func__, name, new_chip_id); + return -1; + } + if (!strcmp(tmp_map->name, name) && + (tmp_map->omap_chip.oc & old_chip_id)) + break; + tmp_map++; + } + if (tmp_map->name != NULL) { + tmp_map->omap_chip.oc = new_chip_id; + return 0; + } + return -ENOENT; +} |