/* * 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 #include #include #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; }