Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

phy: qcom-qmp-ufs: Add PHY and PLL regulator load

Add phy and pll regulator load voting support for all supported
platforms by introducing dedicated regulator bulk data arrays
with their load values.

This ensures stable operation and proper power management for these
platforms where regulators are shared between the QMP UFS PHY and
other IP blocks by setting appropriate regulator load currents during
PHY operations.

Signed-off-by: Nitin Rawat <quic_nitirawa@quicinc.com>
Acked-by: Manivannan Sadhasivam <mani@kernel.org>
Link: https://lore.kernel.org/r/20250830070353.2694-3-nitin.rawat@oss.qualcomm.com
Signed-off-by: Vinod Koul <vkoul@kernel.org>

authored by

Nitin Rawat and committed by
Vinod Koul
df4beac9 0c4916aa

+104 -34
+104 -34
drivers/phy/qualcomm/phy-qcom-qmp-ufs.c
··· 1164 1164 readl(base + offset); 1165 1165 } 1166 1166 1167 - /* Default regulator bulk data (no load used) */ 1168 - static const struct regulator_bulk_data qmp_phy_vreg_l[] = { 1169 - { .supply = "vdda-phy" }, 1170 - { .supply = "vdda-pll" }, 1167 + /* Regulator bulk data with load values for specific configurations */ 1168 + static const struct regulator_bulk_data msm8996_ufsphy_vreg_l[] = { 1169 + { .supply = "vdda-phy", .init_load_uA = 51400 }, 1170 + { .supply = "vdda-pll", .init_load_uA = 14600 }, 1171 + }; 1172 + 1173 + static const struct regulator_bulk_data sa8775p_ufsphy_vreg_l[] = { 1174 + { .supply = "vdda-phy", .init_load_uA = 137000 }, 1175 + { .supply = "vdda-pll", .init_load_uA = 18300 }, 1176 + }; 1177 + 1178 + static const struct regulator_bulk_data sc7280_ufsphy_vreg_l[] = { 1179 + { .supply = "vdda-phy", .init_load_uA = 97500 }, 1180 + { .supply = "vdda-pll", .init_load_uA = 18400 }, 1181 + }; 1182 + 1183 + static const struct regulator_bulk_data sc8280xp_ufsphy_vreg_l[] = { 1184 + { .supply = "vdda-phy", .init_load_uA = 85700 }, 1185 + { .supply = "vdda-pll", .init_load_uA = 18300 }, 1186 + }; 1187 + 1188 + static const struct regulator_bulk_data sdm845_ufsphy_vreg_l[] = { 1189 + { .supply = "vdda-phy", .init_load_uA = 51400 }, 1190 + { .supply = "vdda-pll", .init_load_uA = 14600 }, 1191 + }; 1192 + 1193 + static const struct regulator_bulk_data sm6115_ufsphy_vreg_l[] = { 1194 + { .supply = "vdda-phy", .init_load_uA = 51400 }, 1195 + { .supply = "vdda-pll", .init_load_uA = 14200 }, 1196 + }; 1197 + 1198 + static const struct regulator_bulk_data sm7150_ufsphy_vreg_l[] = { 1199 + { .supply = "vdda-phy", .init_load_uA = 62900 }, 1200 + { .supply = "vdda-pll", .init_load_uA = 18300 }, 1201 + }; 1202 + 1203 + static const struct regulator_bulk_data sm8150_ufsphy_vreg_l[] = { 1204 + { .supply = "vdda-phy", .init_load_uA = 90200 }, 1205 + { .supply = "vdda-pll", .init_load_uA = 19000 }, 1206 + }; 1207 + 1208 + static const struct regulator_bulk_data sm8250_ufsphy_vreg_l[] = { 1209 + { .supply = "vdda-phy", .init_load_uA = 89900 }, 1210 + { .supply = "vdda-pll", .init_load_uA = 18800 }, 1211 + }; 1212 + 1213 + static const struct regulator_bulk_data sm8350_ufsphy_vreg_l[] = { 1214 + { .supply = "vdda-phy", .init_load_uA = 91600 }, 1215 + { .supply = "vdda-pll", .init_load_uA = 19000 }, 1216 + }; 1217 + 1218 + static const struct regulator_bulk_data sm8450_ufsphy_vreg_l[] = { 1219 + { .supply = "vdda-phy", .init_load_uA = 173000 }, 1220 + { .supply = "vdda-pll", .init_load_uA = 24900 }, 1221 + }; 1222 + 1223 + static const struct regulator_bulk_data sm8475_ufsphy_vreg_l[] = { 1224 + { .supply = "vdda-phy", .init_load_uA = 213030 }, 1225 + { .supply = "vdda-pll", .init_load_uA = 18340 }, 1226 + }; 1227 + 1228 + static const struct regulator_bulk_data sm8550_ufsphy_vreg_l[] = { 1229 + { .supply = "vdda-phy", .init_load_uA = 188000 }, 1230 + { .supply = "vdda-pll", .init_load_uA = 18300 }, 1231 + }; 1232 + 1233 + static const struct regulator_bulk_data sm8650_ufsphy_vreg_l[] = { 1234 + { .supply = "vdda-phy", .init_load_uA = 205000 }, 1235 + { .supply = "vdda-pll", .init_load_uA = 17500 }, 1236 + }; 1237 + 1238 + static const struct regulator_bulk_data sm8750_ufsphy_vreg_l[] = { 1239 + { .supply = "vdda-phy", .init_load_uA = 213000 }, 1240 + { .supply = "vdda-pll", .init_load_uA = 18300 }, 1171 1241 }; 1172 1242 1173 1243 static const struct qmp_ufs_offsets qmp_ufs_offsets = { ··· 1273 1203 .rx_num = ARRAY_SIZE(msm8996_ufsphy_rx), 1274 1204 }, 1275 1205 1276 - .vreg_list = qmp_phy_vreg_l, 1277 - .num_vregs = ARRAY_SIZE(qmp_phy_vreg_l), 1206 + .vreg_list = msm8996_ufsphy_vreg_l, 1207 + .num_vregs = ARRAY_SIZE(msm8996_ufsphy_vreg_l), 1278 1208 1279 1209 .regs = ufsphy_v2_regs_layout, 1280 1210 ··· 1310 1240 .pcs_num = ARRAY_SIZE(sm8350_ufsphy_g4_pcs), 1311 1241 .max_gear = UFS_HS_G4, 1312 1242 }, 1313 - .vreg_list = qmp_phy_vreg_l, 1314 - .num_vregs = ARRAY_SIZE(qmp_phy_vreg_l), 1243 + .vreg_list = sa8775p_ufsphy_vreg_l, 1244 + .num_vregs = ARRAY_SIZE(sa8775p_ufsphy_vreg_l), 1315 1245 .regs = ufsphy_v5_regs_layout, 1316 1246 }; 1317 1247 ··· 1344 1274 .pcs_num = ARRAY_SIZE(sm8150_ufsphy_hs_g4_pcs), 1345 1275 .max_gear = UFS_HS_G4, 1346 1276 }, 1347 - .vreg_list = qmp_phy_vreg_l, 1348 - .num_vregs = ARRAY_SIZE(qmp_phy_vreg_l), 1277 + .vreg_list = sc7280_ufsphy_vreg_l, 1278 + .num_vregs = ARRAY_SIZE(sc7280_ufsphy_vreg_l), 1349 1279 .regs = ufsphy_v4_regs_layout, 1350 1280 }; 1351 1281 ··· 1378 1308 .pcs_num = ARRAY_SIZE(sm8350_ufsphy_g4_pcs), 1379 1309 .max_gear = UFS_HS_G4, 1380 1310 }, 1381 - .vreg_list = qmp_phy_vreg_l, 1382 - .num_vregs = ARRAY_SIZE(qmp_phy_vreg_l), 1311 + .vreg_list = sc8280xp_ufsphy_vreg_l, 1312 + .num_vregs = ARRAY_SIZE(sc8280xp_ufsphy_vreg_l), 1383 1313 .regs = ufsphy_v5_regs_layout, 1384 1314 }; 1385 1315 ··· 1403 1333 .serdes = sdm845_ufsphy_hs_b_serdes, 1404 1334 .serdes_num = ARRAY_SIZE(sdm845_ufsphy_hs_b_serdes), 1405 1335 }, 1406 - .vreg_list = qmp_phy_vreg_l, 1407 - .num_vregs = ARRAY_SIZE(qmp_phy_vreg_l), 1336 + .vreg_list = sdm845_ufsphy_vreg_l, 1337 + .num_vregs = ARRAY_SIZE(sdm845_ufsphy_vreg_l), 1408 1338 .regs = ufsphy_v3_regs_layout, 1409 1339 1410 1340 .no_pcs_sw_reset = true, ··· 1430 1360 .serdes = sm6115_ufsphy_hs_b_serdes, 1431 1361 .serdes_num = ARRAY_SIZE(sm6115_ufsphy_hs_b_serdes), 1432 1362 }, 1433 - .vreg_list = qmp_phy_vreg_l, 1434 - .num_vregs = ARRAY_SIZE(qmp_phy_vreg_l), 1363 + .vreg_list = sm6115_ufsphy_vreg_l, 1364 + .num_vregs = ARRAY_SIZE(sm6115_ufsphy_vreg_l), 1435 1365 .regs = ufsphy_v2_regs_layout, 1436 1366 1437 1367 .no_pcs_sw_reset = true, ··· 1457 1387 .serdes = sdm845_ufsphy_hs_b_serdes, 1458 1388 .serdes_num = ARRAY_SIZE(sdm845_ufsphy_hs_b_serdes), 1459 1389 }, 1460 - .vreg_list = qmp_phy_vreg_l, 1461 - .num_vregs = ARRAY_SIZE(qmp_phy_vreg_l), 1390 + .vreg_list = sm7150_ufsphy_vreg_l, 1391 + .num_vregs = ARRAY_SIZE(sm7150_ufsphy_vreg_l), 1462 1392 .regs = ufsphy_v3_regs_layout, 1463 1393 1464 1394 .no_pcs_sw_reset = true, ··· 1493 1423 .pcs_num = ARRAY_SIZE(sm8150_ufsphy_hs_g4_pcs), 1494 1424 .max_gear = UFS_HS_G4, 1495 1425 }, 1496 - .vreg_list = qmp_phy_vreg_l, 1497 - .num_vregs = ARRAY_SIZE(qmp_phy_vreg_l), 1426 + .vreg_list = sm8150_ufsphy_vreg_l, 1427 + .num_vregs = ARRAY_SIZE(sm8150_ufsphy_vreg_l), 1498 1428 .regs = ufsphy_v4_regs_layout, 1499 1429 }; 1500 1430 ··· 1527 1457 .pcs_num = ARRAY_SIZE(sm8150_ufsphy_hs_g4_pcs), 1528 1458 .max_gear = UFS_HS_G4, 1529 1459 }, 1530 - .vreg_list = qmp_phy_vreg_l, 1531 - .num_vregs = ARRAY_SIZE(qmp_phy_vreg_l), 1460 + .vreg_list = sm8250_ufsphy_vreg_l, 1461 + .num_vregs = ARRAY_SIZE(sm8250_ufsphy_vreg_l), 1532 1462 .regs = ufsphy_v4_regs_layout, 1533 1463 }; 1534 1464 ··· 1561 1491 .pcs_num = ARRAY_SIZE(sm8350_ufsphy_g4_pcs), 1562 1492 .max_gear = UFS_HS_G4, 1563 1493 }, 1564 - .vreg_list = qmp_phy_vreg_l, 1565 - .num_vregs = ARRAY_SIZE(qmp_phy_vreg_l), 1494 + .vreg_list = sm8350_ufsphy_vreg_l, 1495 + .num_vregs = ARRAY_SIZE(sm8350_ufsphy_vreg_l), 1566 1496 .regs = ufsphy_v5_regs_layout, 1567 1497 }; 1568 1498 ··· 1595 1525 .pcs_num = ARRAY_SIZE(sm8350_ufsphy_g4_pcs), 1596 1526 .max_gear = UFS_HS_G4, 1597 1527 }, 1598 - .vreg_list = qmp_phy_vreg_l, 1599 - .num_vregs = ARRAY_SIZE(qmp_phy_vreg_l), 1528 + .vreg_list = sm8450_ufsphy_vreg_l, 1529 + .num_vregs = ARRAY_SIZE(sm8450_ufsphy_vreg_l), 1600 1530 .regs = ufsphy_v5_regs_layout, 1601 1531 }; 1602 1532 ··· 1631 1561 .pcs_num = ARRAY_SIZE(sm8475_ufsphy_g4_pcs), 1632 1562 .max_gear = UFS_HS_G4, 1633 1563 }, 1634 - .vreg_list = qmp_phy_vreg_l, 1635 - .num_vregs = ARRAY_SIZE(qmp_phy_vreg_l), 1564 + .vreg_list = sm8475_ufsphy_vreg_l, 1565 + .num_vregs = ARRAY_SIZE(sm8475_ufsphy_vreg_l), 1636 1566 .regs = ufsphy_v6_regs_layout, 1637 1567 }; 1638 1568 ··· 1676 1606 .pcs_num = ARRAY_SIZE(sm8550_ufsphy_g5_pcs), 1677 1607 .max_gear = UFS_HS_G5, 1678 1608 }, 1679 - .vreg_list = qmp_phy_vreg_l, 1680 - .num_vregs = ARRAY_SIZE(qmp_phy_vreg_l), 1609 + .vreg_list = sm8550_ufsphy_vreg_l, 1610 + .num_vregs = ARRAY_SIZE(sm8550_ufsphy_vreg_l), 1681 1611 .regs = ufsphy_v6_regs_layout, 1682 1612 }; 1683 1613 ··· 1708 1638 .max_gear = UFS_HS_G5, 1709 1639 }, 1710 1640 1711 - .vreg_list = qmp_phy_vreg_l, 1712 - .num_vregs = ARRAY_SIZE(qmp_phy_vreg_l), 1641 + .vreg_list = sm8650_ufsphy_vreg_l, 1642 + .num_vregs = ARRAY_SIZE(sm8650_ufsphy_vreg_l), 1713 1643 .regs = ufsphy_v6_regs_layout, 1714 1644 }; 1715 1645 ··· 1746 1676 .max_gear = UFS_HS_G5, 1747 1677 }, 1748 1678 1749 - .vreg_list = qmp_phy_vreg_l, 1750 - .num_vregs = ARRAY_SIZE(qmp_phy_vreg_l), 1679 + .vreg_list = sm8750_ufsphy_vreg_l, 1680 + .num_vregs = ARRAY_SIZE(sm8750_ufsphy_vreg_l), 1751 1681 .regs = ufsphy_v6_regs_layout, 1752 1682 1753 1683 };