blob: 084c7087ce86f975754d528df45db2a2ac342c94 [file] [log] [blame]
Introduction
============
The QPNP linear charger driver implements input and external peripheral power management for 8916 chipsets. The input can be supplied to the device via USB path. Output paths is the VPH_PWR rail.
Software description
====================
Design
======
Design Goals:
The qpnp-linear-charger driver interacts as a consumer and producer for
various input and output power information, as well as relaying information
to userspace.
Given the abundance of configurations for different board designs it is
important to distinguish between configurations which are required versus
those available to be configured at compile and at run time. The target
of this design is to achieve this as follows:
1. Compile time options are defined in the devicetree documentation.
Documentation/devicetree/bindings/power/qpnp-linear-charger.txt
2. Runtime configuration is implemented via the power supply framework.
3. Chipset dependent features and workarounds are configured via
runtime subtype detection and are typically not changed.
Power Supply Property Implementations
-------------------------------------
While the power supply framework implementation supplies basic definitions
of each property this documentation will define the ones used in more detail.
The notification model in the power supply framework is used to notify other
consumers of information conveyed by the charger driver as outlined below.
Each notification is handled via the supply supplicant relationship.
Whenever a supply is changed and the power_supply_changed API is called the
external_power_supply_changed callback will be invoked at the supplicant.
One can picture the notification as one directional.
power_supply_changed()
+----------------------+ +------------+
| | external_power_supply_changed() | |
| supply |------------------------------------->| supplicant |
| | | |
+----------------------+ +------------+
Registered supplies in qpnp-linear-charger:
* battery
Other supplies in other drivers:
* bms: registered in the Battery Management (BMS) qpnp-vm-bms.c driver.
* usb: registered in the corresponding dwc3 or msm_otg driver.
Battery:
* supplicants: bms
* supplies: bms, usb
* writable properties:
- POWER_SUPPLY_PROP_CHARGING_ENABLED
This bit allows to disable current from entering the battery
as well as disabling any current being drawn from external inputs.
- POWER_SUPPLY_PROP_SYSTEM_TEMP_LEVEL
The temperature level is used by the thermal daemon to configure
the maximum battery current input limit to reduce heat produced
from the battery when charging.
- POWER_SUPPLY_PROP_VOLTAGE_MIN
The minimum input voltage for a given input to the charger.
- POWER_SUPPLY_PROP_COOL_TEMP
Allows to configure a cool threshold notification which is
configured via the ADC battery temperature monitoring API.
- POWER_SUPPLY_PROP_WARM_TEMP
Allows to configure a warm threshold notification which is
configured via the ADC battery temperature monitoring API.
- POWER_SUPPLY_PROP_STATUS
This property is set by BMS wheneverBMS detects end of charge
condition. Charger driver uses this to sto p charging.
- POWER_SUPPLY_PROP_CAPACITY
This property is set by the BMS supply whenever the capacity of the
battery is changed. If there is no BMS supply present a default
value is returned. This property can also be manually overridden
from userspace to set a fake capacity. This feature allows for test
environments to prevent certain userspaces from shutting down the
device.
* other notable properties:
- POWER_SUPPLY_PROP_PRESENT:
Indicates whether valid voltage has been detected on either
BATT_THERM or BATT_ID.
Note that the Battery Management (BMS) supply is a special case as there is
a circular notification requirement of the STATUS (battery) and the CAPACITY
(bms) properties.
The battery power supply is also a supplicant to BMS because of userspace
not being aware of the BMS power supply type. Thus the CAPACITY property needs
to be relayed through the appropriate battery supply type.
Config options
==============
CONFIG_QPNP_LINEAR_CHARGER - Enables QPNP charger support.
User space utilities
====================
The power supply framework sends uevents whenever power_supply_changed is
invoked. Said event contains the name of the supply changed as well as all
implemented power supply properties.
The qpnp-linear-charger driver takes advantage of the framework to notify
userspace. There are a few userspace applications which take advantage of
this information to track things like battery capacity, presence and health.