usb: typec: tcpm: fix panic when pd disabled in dt

The pd revision can't be initialized when the 'pd-disable' property
is added in DT, and the negotiated_rev becomes be invalid, which
causes kernel panics.

The Kernel panic has the following stack trace:

[    4.262221][  T182] Unable to handle kernel paging request at virtual address ffffffc8096bf508
[    4.264702][  T182] Mem abort info:
[    4.265014][  T182]   ESR = 0x0000000096000005
[    4.265411][  T182]   EC = 0x25: DABT (current EL), IL = 32 bits
[    4.265939][  T182]   SET = 0, FnV = 0
[    4.266271][  T182]   EA = 0, S1PTW = 0
[    4.266612][  T182]   FSC = 0x05: level 1 translation fault
[    4.267107][  T182] Data abort info:
[    4.267426][  T182]   ISV = 0, ISS = 0x00000005
[    4.267823][  T182]   CM = 0, WnR = 0
[    4.268152][  T182] swapper pgtable: 4k pages, 39-bit VAs, pgdp=000000004217e000
[    4.268802][  T182] [ffffffc8096bf508] pgd=0000000000000000, p4d=0000000000000000, pud=0000000000000000
[    4.269633][  T182] Internal error: Oops: 0000000096000005 [#1] PREEMPT SMP
[    4.270250][  T182] Modules linked in:
[    4.270584][  T182] CPU: 5 PID: 182 Comm: 2-004e Not tainted 6.1.99 #7
[    4.271158][  T182] Hardware name: Rockchip RK3576 EVB1 V10 Board (DT)
[    4.271730][  T182] pstate: 60400005 (nZCv daif +PAN -UAO -TCO -DIT -SSBS BTYPE=--)
[    4.272402][  T182] pc : tcpm_set_state+0x6c/0x11c
[    4.272834][  T182] lr : tcpm_set_state+0x40/0x11c
[    4.273254][  T182] sp : ffffffc00beebd70
[    4.273606][  T182] x29: ffffffc00beebd70 x28: 0000000000000000 x27: ffffffc009f59e00
[    4.274303][  T182] x26: ffffffc009f27008 x25: 0000000000000001 x24: ffffff80c7dc7148
[    4.274996][  T182] x23: ffffffc008c22ee8 x22: 0000000000000011 x21: 0000000000000000
[    4.275689][  T182] x20: 0000000000000012 x19: ffffff80c4f8c040 x18: ffffffc00bd45028
[    4.276372][  T182] x17: 3a736d61202c312d x16: ffffffffffffffff x15: 0000000000000004
[    4.277065][  T182] x14: ffffffc009fdc100 x13: 0000000000003fff x12: 0000000000000003
[    4.277757][  T182] x11: ffffffc0096bf510 x10: 00000000ffffffff x9 : ffffffc0096bf528
[    4.278450][  T182] x8 : 0000000000000000 x7 : 205b5d3430323236 x6 : 322e34202020205b
[    4.279143][  T182] x5 : ffffffc00a3fb617 x4 : ffffffc00beebac7 x3 : ffffffc009ba7471
[    4.279836][  T182] x2 : ffffffc009bc41de x1 : ffffffc00beebb30 x0 : 0000000000000058
[    4.280528][  T182] Call trace:
[    4.280805][  T182]  tcpm_set_state+0x6c/0x11c
[    4.281204][  T182]  run_state_machine+0x108c/0x1908
[    4.281645][  T182]  tcpm_state_machine_work+0x84/0xcc
[    4.282097][  T182]  kthread_worker_fn+0xf4/0x228
[    4.282517][  T182]  kthread+0xec/0x1b8
[    4.282860][  T182]  ret_from_fork+0x10/0x20

Signed-off-by: Frank Wang <frank.wang@rock-chips.com>
Change-Id: I7039c541039e17199f1db6b42ecf23af7f317963
This commit is contained in:
Frank Wang
2025-04-28 17:55:51 +08:00
parent 809e70e641
commit 1b2b4749bc

View File

@@ -6408,7 +6408,7 @@ static int tcpm_fw_get_caps(struct tcpm_port *port, struct fwnode_handle *fwnode
unsigned int nr_src_pdo, nr_snk_pdo;
const char *opmode_str;
u32 *src_pdo, *snk_pdo;
u32 uw, frs_current;
u32 uw, frs_current, pd_revision;
int ret = 0, i;
int mode;
@@ -6439,12 +6439,8 @@ static int tcpm_fw_get_caps(struct tcpm_port *port, struct fwnode_handle *fwnode
port->port_type = port->typec_caps.type;
port->pd_supported = !fwnode_property_read_bool(fwnode, "pd-disable");
if (port->pd_supported) {
u32 pd_revision;
ret = fwnode_property_read_u32(fwnode, "pd-revision", &pd_revision);
port->typec_caps.pd_revision = !ret ? pd_revision & 0xffff : 0x0300;
}
ret = fwnode_property_read_u32(fwnode, "pd-revision", &pd_revision);
port->typec_caps.pd_revision = !ret ? pd_revision & 0xffff : 0x0300;
port->slow_charger_loop = fwnode_property_read_bool(fwnode, "slow-charger-loop");
port->self_powered = fwnode_property_read_bool(fwnode, "self-powered");