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