| # | |
| # (C) Copyright 2014 Samsung Electronics | |
| # Lukasz Majewski <l.majewski@samsung.com> | |
| # | |
| # SPDX-License-Identifier: GPL-2.0+ | |
| # | |
| Introduction | |
| ------------ | |
| This document describes the second version of the u-boot's PMIC (Power | |
| Management IC) framework. As a reference boards please consider Samsungs' Trats | |
| and Trats2. | |
| Background | |
| ---------- | |
| Boards supported by u-boot are getting increasingly complex. Developers and | |
| designers strive to cut down power consumption. Hence several different types of | |
| devices are now available on the board - namely power managers (PMIC), fuel | |
| gauges (FG), micro USB interface controllers (MUIC), batteries, multi-function | |
| devices (MFD). | |
| Explanation of key design decisions | |
| ----------------------------------- | |
| One package can integrate PMIC and MUIC with different addresses on the I2C bus. | |
| The same device - e.g. MAX8997 uses two different I2C busses and addresses. | |
| Power devices use not only I2C for communication, but SPI as well. Additionally | |
| different ICs use different endianess. For this reason struct pmic holds | |
| information about I2C/SPI transmission, which is used with generic | |
| pmic_req_write() function. | |
| The "flat" hierarchy for power devices works well when each device performs only | |
| one operation - e.g. PMIC enables LDO. | |
| The problem emerges when we have a device (battery) which conceptually shall be | |
| the master and uses methods exported by other devices. We need to control MUIC | |
| to start charging the battery, use PMIC to reduce board's overall power | |
| consumption (by disabling not needed LDOs, BUCKs) and get current state of | |
| energy on the battery from FG. | |
| Up till now u-boot doesn't support device model, so a simple one had to be | |
| added. | |
| The directory hierarchy has following structure: | |
| ./include/power/<device_name>_<device_function>.h | |
| e.g. ./include/power/max8997_pmic.h | |
| ./drivers/power/pmic/power_{core files}.c | |
| e.g. ./drivers/power/pmic/power_core.c | |
| ./drivers/power/pmic/<device_function>/<device_function>_<device_name>.c | |
| e.g. ./drivers/power/pmic/pmic_max8997.c | |
| e.g. ./drivers/power/battery/trats/bat_trats.c | |
| e.g. ./drivers/power/fuel_gauge/fg_max17042.c | |
| The framework classifies devices by their function - separate directories should | |
| be maintained for different classes of devices. | |
| Current design | |
| -------------- | |
| Everything is a power device described by struct pmic. Even battery is | |
| considered as a valid power device. This helps for better management of those | |
| devices. | |
| - Block diagram of the hierarchy: | |
| ----------------- | |
| --------| BAT |------------ | |
| | | | | | |
| | ----------------- | | |
| | | | | |
| \|/ \|/ \|/ | |
| ----------- ----------------- --------- | |
| |FG | |MUIC | |CHRG | | |
| | | | | | | | |
| ----------- ----------------- --------- | |
| 1. When hierarchy is not needed (no complex battery charge): | |
| Definition of the struct pmic is only required with proper name and parameters | |
| for communication. This is enough to use the "pmic" command in the u-boot | |
| prompt to change values of device's register (enable/disable LDO, BUCK). | |
| The PG, MUIC and CHRG above are regarded to be in the same level in the | |
| hierarchy. | |
| 2. Complex battery charging. | |
| To charge a battery, information from several "abstract" power devices is | |
| needed (defined at ./include/power/pmic.h): | |
| - FG device (struct power_fg): | |
| -- *fg_battery_check - check if battery is not above its limits | |
| -- *fg_battery_update - update the pmic framework with current | |
| battery state(voltage and current capacity) | |
| - Charger device (struct power_chrq): | |
| -- *chrg_type - type/capacity of the charger (including information | |
| about USB cable disconnection) | |
| -- *chrg_bat_present - detection if battery to be charged is | |
| present | |
| -- *chrg_state - status of the charger - if it is enabled or | |
| disabled | |
| - Battery device (struct power_battery): | |
| -- *battery_init - assign proper callbacks to be used by top | |
| hierarchy battery device | |
| -- *battery_charge - called from "pmic" command, responsible | |
| for performing the charging | |
| Now two batteries are supported; trats and trats2 [*]. Those differ in the way | |
| how they handle the exact charging. Trats uses polling (MAX8997) and trats2 | |
| relies on the PMIC/MUIC HW completely (MAX77693). | |
| __Example for trats (this can be very different for other board):__ | |
| -- *fg_battery_check -> FG device (fg_max17042.c) | |
| -- *fg_battery_update -> FG device (fg_max17042.c) | |
| -- *chrg_type -> MUIC device (muic_max8997.c) | |
| -- *chrg_bat_present -> PMIC device (pmic_max8997.c) | |
| -- *chrg_state -> PMIC device (pmic_max8997.c) | |
| -- *battery_init -> BAT device (bat_trats.c) | |
| -- *battery_charge -> BAT device (bat_trats.c) | |
| Also the struct pmic holds method (*low_power_mode) for reducing board's | |
| power consumption when one calls "pmic BAT_TRATS bat charge" command. | |
| How to add a new power device | |
| ----------------------------- | |
| 1. Simple device should be added with creation of file | |
| <pmic_function>_<pmic_name>.c, <pmic_name>_<pmic_function>.h according to the | |
| proposed and described above scheme. | |
| Then "pmic" command supports reading/writing/dump of device's internal | |
| registers. | |
| 2. Charging battery with hierarchy | |
| Define devices as listed at 1. | |
| Define battery file (bat_<board>.c). Please also note that one might need a | |
| corresponding battery model description for FG. | |
| For points 1 and 2 use a generic function power_init_board() to initialise the | |
| power framework on your board. | |
| For reference, please look into the trats/trats2 boards. | |
| TO DO list (for PMICv3) - up till v2014.04 | |
| ------------------------------------------ | |
| 1. Description of the devices related to power via device tree is not available. | |
| This is the main problem when a developer tries to build a multi-boot u-boot | |
| binary. The best would be to parse the DTS from Linux kernel. | |
| 2. To support many instances of the same IC, like two MAX8997, one needs to | |
| copy the corresponding pmic_max8997.c file with changed name to "MAX8997_PMICX", | |
| where X is the device number. This problem will be addressed when extended | |
| pmic_core.c will support storing available devices in a list. | |
| 3. Definition of batteries [*] (for trats/trats2) should be excluded from the | |
| code responsible for charging them and since it in fact describes the charging | |
| profile it should be put to a separate file. | |
| 4. Adjust the framework to work with the device model. |