mirror of
https://github.com/AsahiLinux/u-boot
synced 2024-12-05 11:00:15 +00:00
ccfc89cb16
Well written documentation for PMIC framework was missing and hence it has been probably difficult and time consuming for other developers to understand rationale for key design decisions and overall design structure. This commit provides proper documentation entry. Signed-off-by: Lukasz Majewski <l.majewski@samsung.com> Acked-by: Simon Glass <sjg@chromium.org>
166 lines
6.5 KiB
Text
166 lines
6.5 KiB
Text
#
|
|
# (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.
|