The policy engine needs to be informed that its time to start
its activities when APSD results are available and/or PD_ALLOWED
is decided. USB type property shouldn't change after that.
Since HVDCP_TIMEOUT_VOTER is the last one to cast its allow vote
in the sequence, use it to reflect the PE_START property.
While at it since PE_START property is returned assuming an atomic
context, the read of PD_ALLOWED could be moved to its sleepable
variants. This aids in keeping the policy engine code simple and also
assures race free code.
Change-Id: Ib98ac10d87200a2fd5492e27399f696f2468eba6
Signed-off-by: Abhijeet Dharmapurikar <adharmap@codeaurora.org>
Make sure to properly clear the PD_IN_HARD_RESET property upon
reaching the SNK_Transition_to_default state to ensure that the
charger driver is notified that hard reset has completed. Move
the clearing of pd->hard_reset flag here as well for clarity.
Also clear the pd->in_pr_swap flag when initiating or receiving
hard reset signal as that should promptly abort any PR swap
operation in progress.
Change-Id: I967e3841af614ecd2129bf60dc08a1b19731c4e3
Signed-off-by: Jack Pham <jackp@codeaurora.org>
Support the new POWER_SUPPLY_PROP_PE_START property which
indicates when the policy engine state machine can begin.
This helps to simplify the psy_changed() routine as we can
now rely on this property to indicate that PROP_TYPEC_MODE
and PROP_TYPE are already settled. The state machine work
can now simply begin when seeing a change in TYPEC_MODE.
This replaces the previous use of PROP_PD_ALLOWED which prior
to commit 18da08334e ("usb: pd: Handle PD_ALLOWED within
state machine") was intended to be a marker to start up
the policy engine but now simply indicates whether or not to
start PD comms. We can now move reading of this property to
usbpd_set_state() as it is now only needed locally in the
SNK_STARTUP handling.
Change-Id: Ia0b9e5b011ae72e1afcaf5109b8253d124afc021
Signed-off-by: Jack Pham <jackp@codeaurora.org>
This property will be used to indicate to the policy engine that it
should start its activities.
Change-Id: I9deb48f7bff71b022c5899e6eff7617526d02324
Signed-off-by: Abhijeet Dharmapurikar <adharmap@codeaurora.org>
A merge conflict resolution caused a break statement to be dropped in
the case block for reporting input_current_limited property.
Fix this.
Change-Id: Ic5c9626628f05f3167f9f8d0b78b04b83446f413
Signed-off-by: Abhijeet Dharmapurikar <adharmap@codeaurora.org>
Correct the secure address threshold to 0x0A since Misc peripheral has
secure registers starting as early as 0x0A
CRs-Fixed: 1048242
Change-Id: Id7ec03919e2fd08540cd7e677bf5e4048d73c23d
Signed-off-by: Harry Yang <harryy@codeaurora.org>
Expose the parallel distribution percentage and allow it to be
modified.
Change-Id: I0c9221c6a748aff5e8fbe889316f729155eded3e
Signed-off-by: Nicholas Troast <ntroast@codeaurora.org>
Signed-off-by: Abhijeet Dharmapurikar <adharmap@codeaurora.org>
The parallel charger can collapse the input adapter. Impose a
power limit on the slave charger by limiting the slave FCC.
Change-Id: I02a3dc02911646240a1ecee41584903aab971d81
Signed-off-by: Nicholas Troast <ntroast@codeaurora.org>
Signed-off-by: Abhijeet Dharmapurikar <adharmap@codeaurora.org>
The parallel charging code has grown organically.
Clean up the following:
1. Use correct units for all unit based variables.
2. Use slave percent instead of master percent.
3. Remove parallel master module parameter.
4. Put PARALLEL_DISABLE where it belongs in battery psy.
5. Create a get_jeita_cc_delta function similar to get_step_cc_delta
function.
6. Print errors when returning error codes.
Change-Id: I27ec29c3a6c5f3aac31705e60e1b8cf3270322a1
Signed-off-by: Nicholas Troast <ntroast@codeaurora.org>
Signed-off-by: Abhijeet Dharmapurikar <adharmap@codeaurora.org>
Allow for changing the switching frequency via a power supply property.
The main charger will call this property to ensure optimal power
dissipation.
CRs-Fixed: 1048242
Change-Id: I17aeabe9c20388747dc1965bef22127bd054a828
Signed-off-by: Harry Yang <harryy@codeaurora.org>
Signed-off-by: Abhijeet Dharmapurikar <adharmap@codeaurora.org>
Modern battery chargers use a switching buck whose frequency
can be adjusted. Create a property to read/update it.
CRs-Fixed: 1048242
Change-Id: I7611e6b697222427303df47f837716005e013443
Signed-off-by: Harry Yang <harryy@codeaurora.org>
Signed-off-by: Abhijeet Dharmapurikar <adharmap@codeaurora.org>
There is a possibility where the driver fails to change
the usb type to Unknown when the cable is removed - in particular
when pd is not allowed.
Use the debounce done event of the typec change interrupt to update
the usb type to Unknown.
Change-Id: I7f201209101e54461e3d08d677bd7b266f971420
Signed-off-by: Abhijeet Dharmapurikar <adharmap@codeaurora.org>
Currently the driver uses the dev_ variants to print debug information.
This is not useful.
Instead print the function name and use pr_ variants to print debug
information.
Change-Id: I0eeb61e847b07ac9b7622ac521bace24a417bb14
Signed-off-by: Abhijeet Dharmapurikar <adharmap@codeaurora.org>
If an HVDCP charger is detected and it does not support PD, that means
it is likely a legacy QC2 or QC3 charger. Rerun APSD when PD sets us to
be inactive.
For cases when pd is not allowed, PD won't set inactive status. For such
cases use the hvdcp_timeout interrupt to rerun APSD.
Change-Id: Ibe03e1dc88700b605e2f43ee4bca266ce3dee92b
Signed-off-by: Abhijeet Dharmapurikar <adharmap@codeaurora.org>
Add support to set current limits from usb and pd.
Ensure that the limit from the pd is only enforced when pd is active
and that the limit from usb is enforced only when pd is inactive.
There is one situation when the input needs to be suspended as
per the usb driver's request when pd sets system_suspend_supported.
For that allow the usb voter to set that low current value to
suspend.
Also ensure that the pd and usb votes are nullified when source
is removed.
In addition, the return the individual valid votes from usb and pd
when their current_max are read.
Change-Id: I215e9e82f44061c4083a4df8cab400beadf6322d
Signed-off-by: Abhijeet Dharmapurikar <adharmap@codeaurora.org>
The current driver votes and unvotes for removal/insertion at
two interrupt handlers, debounce done and the type C detach.
The recommendation from hw teams is to use debounce done for both
insertion and removal. Update the code.
While at it, provide clean functions to vote and unvote for four
situations
a typec cable insertion
a typec cable removal
a source insertion
a source removal
Note that this allows us to cleanly handle PD hard resets where
the typec connection remains intact but the source (or vbus) related
state needs to be reset.
This also helps us in cleanly handling power sole swaps where the source
plugged and removed functions handle vbus related states while typec
functions handle the typec related states.
Change-Id: I49fccb1fcf8eaea8fea1ae186906689a628c02f8
Signed-off-by: Abhijeet Dharmapurikar <adharmap@codeaurora.org>
There could be cables where vbus and cc lines are shorted or connected
using a small resistor. Raising VBUS to higher values could cause CC
line to get damaged. CC line cannot tolerate a voltage higher than 6V.
So if such a cable is seen, prevent pd stack from running so there is no
opportunity to increase vbus by selecting a higher voltage profile. Also
disable HVDP too.
Also, prevent PD_ALLOWED if a legacy cable is seen - the spec mentions
that if VBUS is seen along with CC, the adapter is not pd capable.
Change-Id: I7411bd541ffe704dda97dd869a3dbd4dbfc99518
Signed-off-by: Abhijeet Dharmapurikar <adharmap@codeaurora.org>
Since the USB_PD type is no more set by the PD driver, it is
expected that the type be set based on pd_active property being
ACTIVE. So set the type and update the userspace when it changes.
Change-Id: I0f76f092d3e8de7a916e995e4d825fe0da79bf78
Signed-off-by: Abhijeet Dharmapurikar <adharmap@codeaurora.org>
While PD is under hard reset and the device is in sink mode, it
shouldn't leave sink mode because VBUS goes away. Instead it should
stay in sink mode while hard reset is being conducted and exit sink
mode only if CC gets detached.
Configure the exit state when hard reset is in progress. Also while
hard reset is in progress disable APSD else a APSD could run and
disturb SDP communication after VBUS recovers in hard reset procedure.
Change-Id: I7f5046d4822438e949658356e683e74acfa664f7
Signed-off-by: Abhijeet Dharmapurikar <adharmap@codeaurora.org>
Currently the code prevents pd if an hvdcp is detected. We want to
change that in that we want to prevent pd only while hvdcp detection
is in progress. Once completed, we need to enable pd even if an hvdcp
is detected. Enabling PD even for hvdcp allows us to detect a QC 4.0
which communicates over PD.
Currently we model the pd_allowed votable as an enable votable i.e.
if any one of the voters enable it, pd_allowed gets enabled.
Change that to a disable votable named pd_disallowed_votable,
which gets disabled when CC is detached, and hvdcp2.0 detection is not
yet completed.
Change-Id: I2ae261c71694695b41d8a31c4b40542d5e227c3a
Signed-off-by: Abhijeet Dharmapurikar <adharmap@codeaurora.org>
Some platforms do not support HVDCP charging. Provide means to
disable them.
Provide a votable for disabling HVDCP in preparation to handle
VBUS and CC line shorted situation.
Note that when hvdcp is disabled, we only disable voltage
negotiations i.e. qc 2.0 detection remains enabled since it
does not need voltage to change.
Change-Id: Id7eaa46f08ac451a918a550f7837efbef78ab6f6
Signed-off-by: Abhijeet Dharmapurikar <adharmap@codeaurora.org>
When a float charger is detected by APSD there are configuration options
that change the behavior of the charger. These options should be
configurable from the device tree. Add a DT parameter "qcom,float-option"
and configure it as follows:
1 - Treat as a DCP
2 - Treat as a SDP
3 - Disable charging
4 - Suspend USB input
Change-Id: Ia9219bc232f2092569dfb1a14f628e788173c4ff
Signed-off-by: Nicholas Troast <ntroast@codeaurora.org>
It is useful when debugging to force power supply changed events. Add
debugfs entries for each power supply to allow forcing power supply
changed events.
Change-Id: I018eb018de2a8119acc09824c82cca8ff1b52faa
Signed-off-by: Nicholas Troast <ntroast@codeaurora.org>
The PARALLEL_PERCENT property is used for the parallel distribution
percentage.
Change-Id: I7d2a7a775437770075ddbd2d1a36ce5d9e44a631
Signed-off-by: Nicholas Troast <ntroast@codeaurora.org>
900mA can be drawn from a USB 3.0 port that has been enumerated. Do it.
Change-Id: I94e5d36feb3cd54bcc46e8c56933340cad839c1f
Signed-off-by: Nicholas Troast <ntroast@codeaurora.org>
Signed-off-by: Abhijeet Dharmapurikar <adharmap@codeaurora.org>
The SMB138X TADC can provide the parallel charger with the
measured battery current. Enable it.
Change-Id: I32e5e5ed4ab3f09635f4fe512a1e9b75436ab88e
Signed-off-by: Nicholas Troast <ntroast@codeaurora.org>
Switch to setting the POWER_SUPPLY_PROP_PD_CURRENT_MAX for
indicating the current limit to the charger driver when
an explicit contract is established. Also set the
POWER_SUPPLY_PROP_PD_USB_SUSPEND_SUPPORTED property whenever
encountering the "USB Suspend Supported" bit in the first
PDO of a Source Capabilities message. This is an indication
to the charger that when the USB bus enters suspend state that
it should follow suspend rules according to USB 2.0/3.1 spec.
Change-Id: I665ec788a770632b4849b9beff8444d00e956ce1
Signed-off-by: Jack Pham <jackp@codeaurora.org>
Charger may be able to detect a legacy cable connection in which
PD is not supported however the state machine still needs to
run in order to send the EXTCON_USB notification to start the
USB controller in peripheral mode (assuming type is SDP or CDP).
Move checking of PD_ALLOWED to the state machine which can be used
to determine if moving beyond PE_SNK_STARTUP is allowed or not.
The psy_changed() callback should only queue the work when either
typec_mode or pd_allowed states have changed. Also move handling
of the in_pr_swap flag to this function by absorbing the
disconnect callback and clearing the flag when CC state indicates
it is reconnected.
Change-Id: I8879699531a49915e7286e4a166944709076fbd1
Signed-off-by: Jack Pham <jackp@codeaurora.org>
Set the POWER_SUPPLY_PROP_PD_IN_HARD_RESET when hard reset
has been issued and clear it when completed. This replaces
the previous use of PD_ACTIVE which is now used to indicate
assertively whether the port partner is PD capable or not.
As such, since charger driver now definitively knows, it is
also not necessary to explicitly change PROP_TYPE to USB_PD.
Change-Id: I4d8c9fcdf553d1cf1ae79c66932773834804d1a9
Signed-off-by: Jack Pham <jackp@codeaurora.org>
Add additional properties for USB PD usage:
- POWER_SUPPLY_PROP_PD_IN_HARD_RESET is set when PD is
undergoing a hard reset
- POWER_SUPPLY_PROP_PD_CURRENT_MAX used to indicate the
current limit as negotiated over PD
- POWER_SUPPLY_PROP_PD_USB_SUSPEND_SUPPORTED is set when
USB suspend current limit must be honored when USB bus
is suspended
Also add enums to distinguish PD activity state: inactive, active.
Change-Id: I0a3d98ac1e1202e5b655b2e3a8102691b61359c8
Signed-off-by: Jack Pham <jackp@codeaurora.org>
Support incoming VCONN Swap requests by accepting and turning
off/on VCONN.
Due to HW board limitations, if VCONN is being sourced from the
VBUS input we cannot support enabling VCONN while as a sink and
greater than 5V has been negotiated on VBUS. In that case, reject
the request. Add a device tree property that indicates whether
the board is configured for separate VCONN supply.
Change-Id: If3a9aa316ae08a80468631f3d536a1b345e21b18
Signed-off-by: Jack Pham <jackp@codeaurora.org>
With PM autosleep enabled, the system may aggressively enter
and re-enter suspend in between calls to queue_work() and
when the state machine function gets executed, which may
at best result in numerous suspend/resume cycles and at
worse starve the PD state machine from even executing.
Fix this by calling pm_stay_awake() whenever the work is
queued and relinquish with pm_relax() when no further work
is to be done.
Change-Id: I71d8ea0c69a7b174c2280f92d1f5342e5e50d9b0
Signed-off-by: Jack Pham <jackp@codeaurora.org>
VDMs, especially structured ones, are almost always handled
as requests and responses. Hence it does not make sense to
allow more than one outgoing VDM at a time, so get rid of the
vdm_tx_queue list and simplify it to a single-issued packet.
Because port partners can only have one VDM request/response in
flight, also handle the case when a new structured request is
received before the previous response has been sent. In that
case we simply discard the queued message as it's now invalid.
Change-Id: I144f8158dbf8be0babf5516b01d084fd053413c3
Signed-off-by: Jack Pham <jackp@codeaurora.org>
As UFP since the policy engine only responds to the Discover
Identity command, all other commands are unrecognized and
therefore should be NAKed. Fix the handling as follows:
- Ensure the standard Discover Identity was sent using
SID of 0xFF00, otherwise it is invalid
- Don't NAK incoming Attention messages
- When sending a NAK, respond with the same SVID of the
initiating command, whether it was correct or not
- Enter Mode is not supported in general, but the NAK
should also be sent back with the same mode index
- Re-issue Discover SVIDs when more than 12 SVIDs are returned
- Clean up macro name prefixes from 'VDM' to 'SVDM' to
emphasize they are accessing structured VDM specific bits
Change-Id: Id2590065a01e46f8da70733d55f3bfabff5b532d
Signed-off-by: Jack Pham <jackp@codeaurora.org>
Fix several issues which help address PD compliance testing:
- Soft reset should be issued instead of hard reset in cases
where an unexpected message is received.
- In source mode, send a Reject if the Request PDO object also
exceeds the advertised current capability. Fix the incorrect
bitmask in the PD_RDO_FIXED_CURR macro.
- Handle possibility of quick back-to-back RX messages by
flushing the sm worker to ensure the last message was fully
processed before overwriting the buffer.
- Discard PING messages as they are not applicable to Type-C.
- Respond to GET_SINK_CAP while in source mode, and vice
versa, respond to GET_SOURCE_CAP when in sink mode.
- Move pd->hard_reset=false to PE_SRC/SNK_TRANSITION_TO_DEFAULT
for consistency.
- Change default sink capabilities to advertise only 5V @ 900mA
since the policy engine will not automatically request higher
voltages. If userspace wants to request greater than 5V it should
also update the sink capabilities.
- Reset the protocol counters at the beginning of PE_SNK_STARTUP.
Change-Id: I44598eb0b49efd763f86f303c70e8b018fca994b
Signed-off-by: Jack Pham <jackp@codeaurora.org>