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