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