| # |
| # (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. |