xref: /openbmc/u-boot/doc/README.power-framework (revision e7f9350525d73233d4eaf1793f8fe618e9fd4910)
1*ccfc89cbSŁukasz Majewski#
2*ccfc89cbSŁukasz Majewski# (C) Copyright 2014 Samsung Electronics
3*ccfc89cbSŁukasz Majewski# Lukasz Majewski <l.majewski@samsung.com>
4*ccfc89cbSŁukasz Majewski#
5*ccfc89cbSŁukasz Majewski# SPDX-License-Identifier:      GPL-2.0+
6*ccfc89cbSŁukasz Majewski#
7*ccfc89cbSŁukasz Majewski
8*ccfc89cbSŁukasz MajewskiIntroduction
9*ccfc89cbSŁukasz Majewski------------
10*ccfc89cbSŁukasz Majewski
11*ccfc89cbSŁukasz MajewskiThis document describes the second version of the u-boot's PMIC (Power
12*ccfc89cbSŁukasz MajewskiManagement IC) framework. As a reference boards please consider Samsungs' Trats
13*ccfc89cbSŁukasz Majewskiand Trats2.
14*ccfc89cbSŁukasz Majewski
15*ccfc89cbSŁukasz MajewskiBackground
16*ccfc89cbSŁukasz Majewski----------
17*ccfc89cbSŁukasz Majewski
18*ccfc89cbSŁukasz MajewskiBoards supported by u-boot are getting increasingly complex. Developers and
19*ccfc89cbSŁukasz Majewskidesigners strive to cut down power consumption. Hence several different types of
20*ccfc89cbSŁukasz Majewskidevices are now available on the board - namely power managers (PMIC), fuel
21*ccfc89cbSŁukasz Majewskigauges (FG), micro USB interface controllers (MUIC), batteries, multi-function
22*ccfc89cbSŁukasz Majewskidevices (MFD).
23*ccfc89cbSŁukasz Majewski
24*ccfc89cbSŁukasz MajewskiExplanation of key design decisions
25*ccfc89cbSŁukasz Majewski-----------------------------------
26*ccfc89cbSŁukasz Majewski
27*ccfc89cbSŁukasz MajewskiOne package can integrate PMIC and MUIC with different addresses on the I2C bus.
28*ccfc89cbSŁukasz MajewskiThe same device - e.g. MAX8997 uses two different I2C busses and addresses.
29*ccfc89cbSŁukasz Majewski
30*ccfc89cbSŁukasz MajewskiPower devices use not only I2C for communication, but SPI as well. Additionally
31*ccfc89cbSŁukasz Majewskidifferent ICs use different endianess. For this reason struct pmic holds
32*ccfc89cbSŁukasz Majewskiinformation about I2C/SPI transmission, which is used with generic
33*ccfc89cbSŁukasz Majewskipmic_req_write() function.
34*ccfc89cbSŁukasz Majewski
35*ccfc89cbSŁukasz MajewskiThe "flat" hierarchy for power devices works well when each device performs only
36*ccfc89cbSŁukasz Majewskione operation - e.g. PMIC enables LDO.
37*ccfc89cbSŁukasz Majewski
38*ccfc89cbSŁukasz MajewskiThe problem emerges when we have a device (battery) which conceptually shall be
39*ccfc89cbSŁukasz Majewskithe master and uses methods exported by other devices. We need to control MUIC
40*ccfc89cbSŁukasz Majewskito start charging the battery, use PMIC to reduce board's overall power
41*ccfc89cbSŁukasz Majewskiconsumption (by disabling not needed LDOs, BUCKs) and get current state of
42*ccfc89cbSŁukasz Majewskienergy on the battery from FG.
43*ccfc89cbSŁukasz MajewskiUp till now u-boot doesn't support device model, so a simple one had to be
44*ccfc89cbSŁukasz Majewskiadded.
45*ccfc89cbSŁukasz Majewski
46*ccfc89cbSŁukasz MajewskiThe directory hierarchy has following structure:
47*ccfc89cbSŁukasz Majewski./include/power/<device_name>_<device_function>.h
48*ccfc89cbSŁukasz Majewskie.g. ./include/power/max8997_pmic.h
49*ccfc89cbSŁukasz Majewski
50*ccfc89cbSŁukasz Majewski./drivers/power/pmic/power_{core files}.c
51*ccfc89cbSŁukasz Majewskie.g. ./drivers/power/pmic/power_core.c
52*ccfc89cbSŁukasz Majewski
53*ccfc89cbSŁukasz Majewski./drivers/power/pmic/<device_function>/<device_function>_<device_name>.c
54*ccfc89cbSŁukasz Majewskie.g. ./drivers/power/pmic/pmic_max8997.c
55*ccfc89cbSŁukasz Majewskie.g. ./drivers/power/battery/trats/bat_trats.c
56*ccfc89cbSŁukasz Majewskie.g. ./drivers/power/fuel_gauge/fg_max17042.c
57*ccfc89cbSŁukasz Majewski
58*ccfc89cbSŁukasz MajewskiThe framework classifies devices by their function - separate directories should
59*ccfc89cbSŁukasz Majewskibe maintained for different classes of devices.
60*ccfc89cbSŁukasz Majewski
61*ccfc89cbSŁukasz MajewskiCurrent design
62*ccfc89cbSŁukasz Majewski--------------
63*ccfc89cbSŁukasz Majewski
64*ccfc89cbSŁukasz MajewskiEverything is a power device described by struct pmic. Even battery is
65*ccfc89cbSŁukasz Majewskiconsidered as a valid power device. This helps for better management of those
66*ccfc89cbSŁukasz Majewskidevices.
67*ccfc89cbSŁukasz Majewski
68*ccfc89cbSŁukasz Majewski- Block diagram of the hierarchy:
69*ccfc89cbSŁukasz Majewski			-----------------
70*ccfc89cbSŁukasz Majewski		--------| BAT           |------------
71*ccfc89cbSŁukasz Majewski		|       |               |           |
72*ccfc89cbSŁukasz Majewski		|       -----------------           |
73*ccfc89cbSŁukasz Majewski		|               |                   |
74*ccfc89cbSŁukasz Majewski	       \|/             \|/                 \|/
75*ccfc89cbSŁukasz Majewski	-----------     -----------------       ---------
76*ccfc89cbSŁukasz Majewski	|FG       |     |MUIC           |       |CHRG   |
77*ccfc89cbSŁukasz Majewski	|         |     |               |       |       |
78*ccfc89cbSŁukasz Majewski	-----------     -----------------       ---------
79*ccfc89cbSŁukasz Majewski
80*ccfc89cbSŁukasz Majewski
81*ccfc89cbSŁukasz Majewski1. When hierarchy is not needed (no complex battery charge):
82*ccfc89cbSŁukasz Majewski
83*ccfc89cbSŁukasz MajewskiDefinition of the struct pmic is only required with proper name and parameters
84*ccfc89cbSŁukasz Majewskifor communication. This is enough to use the "pmic" command in the u-boot
85*ccfc89cbSŁukasz Majewskiprompt to change values of device's register (enable/disable LDO, BUCK).
86*ccfc89cbSŁukasz Majewski
87*ccfc89cbSŁukasz MajewskiThe PG, MUIC and CHRG above are regarded to be in the same level in the
88*ccfc89cbSŁukasz Majewskihierarchy.
89*ccfc89cbSŁukasz Majewski
90*ccfc89cbSŁukasz Majewski2. Complex battery charging.
91*ccfc89cbSŁukasz Majewski
92*ccfc89cbSŁukasz MajewskiTo charge a battery, information from several "abstract" power devices is
93*ccfc89cbSŁukasz Majewskineeded (defined at ./include/power/pmic.h):
94*ccfc89cbSŁukasz Majewski- FG device (struct power_fg):
95*ccfc89cbSŁukasz Majewski	     -- *fg_battery_check - check if battery is not above its limits
96*ccfc89cbSŁukasz Majewski	     -- *fg_battery_update - update the pmic framework with current
97*ccfc89cbSŁukasz Majewski				     battery state(voltage and current capacity)
98*ccfc89cbSŁukasz Majewski
99*ccfc89cbSŁukasz Majewski- Charger device (struct power_chrq):
100*ccfc89cbSŁukasz Majewski	     -- *chrg_type - type/capacity of the charger (including information
101*ccfc89cbSŁukasz Majewski			     about USB cable disconnection)
102*ccfc89cbSŁukasz Majewski	     -- *chrg_bat_present - detection if battery to be charged is
103*ccfc89cbSŁukasz Majewski				    present
104*ccfc89cbSŁukasz Majewski	     -- *chrg_state - status of the charger - if it is enabled or
105*ccfc89cbSŁukasz Majewski			      disabled
106*ccfc89cbSŁukasz Majewski
107*ccfc89cbSŁukasz Majewski- Battery device (struct power_battery):
108*ccfc89cbSŁukasz Majewski	     -- *battery_init - assign proper callbacks to be used by top
109*ccfc89cbSŁukasz Majewski				hierarchy battery device
110*ccfc89cbSŁukasz Majewski	     -- *battery_charge - called from "pmic" command, responsible
111*ccfc89cbSŁukasz Majewski				  for performing the charging
112*ccfc89cbSŁukasz Majewski
113*ccfc89cbSŁukasz MajewskiNow two batteries are supported; trats and trats2 [*]. Those differ in the way
114*ccfc89cbSŁukasz Majewskihow they handle the exact charging. Trats uses polling (MAX8997) and trats2
115*ccfc89cbSŁukasz Majewskirelies on the PMIC/MUIC HW completely (MAX77693).
116*ccfc89cbSŁukasz Majewski
117*ccfc89cbSŁukasz Majewski__Example for trats (this can be very different for other board):__
118*ccfc89cbSŁukasz Majewski	     -- *fg_battery_check       -> FG device (fg_max17042.c)
119*ccfc89cbSŁukasz Majewski	     -- *fg_battery_update      -> FG device (fg_max17042.c)
120*ccfc89cbSŁukasz Majewski	     -- *chrg_type              -> MUIC device (muic_max8997.c)
121*ccfc89cbSŁukasz Majewski	     -- *chrg_bat_present       -> PMIC device (pmic_max8997.c)
122*ccfc89cbSŁukasz Majewski	     -- *chrg_state             -> PMIC device (pmic_max8997.c)
123*ccfc89cbSŁukasz Majewski	     -- *battery_init           -> BAT device (bat_trats.c)
124*ccfc89cbSŁukasz Majewski	     -- *battery_charge         -> BAT device (bat_trats.c)
125*ccfc89cbSŁukasz Majewski
126*ccfc89cbSŁukasz MajewskiAlso the struct pmic holds method (*low_power_mode) for reducing board's
127*ccfc89cbSŁukasz Majewskipower consumption when one calls "pmic BAT_TRATS bat charge" command.
128*ccfc89cbSŁukasz Majewski
129*ccfc89cbSŁukasz MajewskiHow to add a new power device
130*ccfc89cbSŁukasz Majewski-----------------------------
131*ccfc89cbSŁukasz Majewski
132*ccfc89cbSŁukasz Majewski1. Simple device should be added with creation of file
133*ccfc89cbSŁukasz Majewski<pmic_function>_<pmic_name>.c, <pmic_name>_<pmic_function>.h  according to the
134*ccfc89cbSŁukasz Majewskiproposed and described above scheme.
135*ccfc89cbSŁukasz Majewski
136*ccfc89cbSŁukasz MajewskiThen "pmic" command supports reading/writing/dump of device's internal
137*ccfc89cbSŁukasz Majewskiregisters.
138*ccfc89cbSŁukasz Majewski
139*ccfc89cbSŁukasz Majewski2. Charging battery with hierarchy
140*ccfc89cbSŁukasz MajewskiDefine devices as listed at 1.
141*ccfc89cbSŁukasz Majewski
142*ccfc89cbSŁukasz MajewskiDefine battery file (bat_<board>.c). Please also note that one might need a
143*ccfc89cbSŁukasz Majewskicorresponding battery model description for FG.
144*ccfc89cbSŁukasz Majewski
145*ccfc89cbSŁukasz MajewskiFor points 1 and 2 use a generic function power_init_board() to initialise the
146*ccfc89cbSŁukasz Majewskipower framework on your board.
147*ccfc89cbSŁukasz Majewski
148*ccfc89cbSŁukasz MajewskiFor reference, please look into the trats/trats2 boards.
149*ccfc89cbSŁukasz Majewski
150*ccfc89cbSŁukasz MajewskiTO DO list (for PMICv3) - up till v2014.04
151*ccfc89cbSŁukasz Majewski------------------------------------------
152*ccfc89cbSŁukasz Majewski
153*ccfc89cbSŁukasz Majewski1. Description of the devices related to power via device tree is not available.
154*ccfc89cbSŁukasz MajewskiThis is the main problem when a developer tries to build a multi-boot u-boot
155*ccfc89cbSŁukasz Majewskibinary. The best would be to parse the DTS from Linux kernel.
156*ccfc89cbSŁukasz Majewski
157*ccfc89cbSŁukasz Majewski2. To support many instances of the same IC, like two MAX8997, one needs to
158*ccfc89cbSŁukasz Majewskicopy the corresponding pmic_max8997.c file with changed name to "MAX8997_PMICX",
159*ccfc89cbSŁukasz Majewskiwhere X is the device number. This problem will be addressed when extended
160*ccfc89cbSŁukasz Majewskipmic_core.c will support storing available devices in a list.
161*ccfc89cbSŁukasz Majewski
162*ccfc89cbSŁukasz Majewski3. Definition of batteries [*] (for trats/trats2) should be excluded from the
163*ccfc89cbSŁukasz Majewskicode responsible for charging them and since it in fact describes the charging
164*ccfc89cbSŁukasz Majewskiprofile it should be put to a separate file.
165*ccfc89cbSŁukasz Majewski
166*ccfc89cbSŁukasz Majewski4. Adjust the framework to work with the device model.
167