Lines Matching refs:qmp

1090 static void qmp_ufs_serdes_init(struct qmp_ufs *qmp, const struct qmp_phy_cfg_tbls *tbls)  in qmp_ufs_serdes_init()  argument
1092 void __iomem *serdes = qmp->serdes; in qmp_ufs_serdes_init()
1097 static void qmp_ufs_lanes_init(struct qmp_ufs *qmp, const struct qmp_phy_cfg_tbls *tbls) in qmp_ufs_lanes_init() argument
1099 const struct qmp_phy_cfg *cfg = qmp->cfg; in qmp_ufs_lanes_init()
1100 void __iomem *tx = qmp->tx; in qmp_ufs_lanes_init()
1101 void __iomem *rx = qmp->rx; in qmp_ufs_lanes_init()
1107 qmp_ufs_configure_lane(qmp->tx2, tbls->tx, tbls->tx_num, 2); in qmp_ufs_lanes_init()
1108 qmp_ufs_configure_lane(qmp->rx2, tbls->rx, tbls->rx_num, 2); in qmp_ufs_lanes_init()
1112 static void qmp_ufs_pcs_init(struct qmp_ufs *qmp, const struct qmp_phy_cfg_tbls *tbls) in qmp_ufs_pcs_init() argument
1114 void __iomem *pcs = qmp->pcs; in qmp_ufs_pcs_init()
1119 static void qmp_ufs_init_registers(struct qmp_ufs *qmp, const struct qmp_phy_cfg *cfg) in qmp_ufs_init_registers() argument
1121 qmp_ufs_serdes_init(qmp, &cfg->tbls); in qmp_ufs_init_registers()
1122 if (qmp->mode == PHY_MODE_UFS_HS_B) in qmp_ufs_init_registers()
1123 qmp_ufs_serdes_init(qmp, &cfg->tbls_hs_b); in qmp_ufs_init_registers()
1124 qmp_ufs_lanes_init(qmp, &cfg->tbls); in qmp_ufs_init_registers()
1125 if (qmp->submode == UFS_HS_G4) in qmp_ufs_init_registers()
1126 qmp_ufs_lanes_init(qmp, &cfg->tbls_hs_g4); in qmp_ufs_init_registers()
1127 qmp_ufs_pcs_init(qmp, &cfg->tbls); in qmp_ufs_init_registers()
1128 if (qmp->submode == UFS_HS_G4) in qmp_ufs_init_registers()
1129 qmp_ufs_pcs_init(qmp, &cfg->tbls_hs_g4); in qmp_ufs_init_registers()
1132 static int qmp_ufs_com_init(struct qmp_ufs *qmp) in qmp_ufs_com_init() argument
1134 const struct qmp_phy_cfg *cfg = qmp->cfg; in qmp_ufs_com_init()
1135 void __iomem *pcs = qmp->pcs; in qmp_ufs_com_init()
1138 ret = regulator_bulk_enable(cfg->num_vregs, qmp->vregs); in qmp_ufs_com_init()
1140 dev_err(qmp->dev, "failed to enable regulators, err=%d\n", ret); in qmp_ufs_com_init()
1144 ret = clk_bulk_prepare_enable(cfg->num_clks, qmp->clks); in qmp_ufs_com_init()
1153 regulator_bulk_disable(cfg->num_vregs, qmp->vregs); in qmp_ufs_com_init()
1158 static int qmp_ufs_com_exit(struct qmp_ufs *qmp) in qmp_ufs_com_exit() argument
1160 const struct qmp_phy_cfg *cfg = qmp->cfg; in qmp_ufs_com_exit()
1162 reset_control_assert(qmp->ufs_reset); in qmp_ufs_com_exit()
1164 clk_bulk_disable_unprepare(cfg->num_clks, qmp->clks); in qmp_ufs_com_exit()
1166 regulator_bulk_disable(cfg->num_vregs, qmp->vregs); in qmp_ufs_com_exit()
1173 struct qmp_ufs *qmp = phy_get_drvdata(phy); in qmp_ufs_init() local
1174 const struct qmp_phy_cfg *cfg = qmp->cfg; in qmp_ufs_init()
1176 dev_vdbg(qmp->dev, "Initializing QMP phy\n"); in qmp_ufs_init()
1184 if (!qmp->ufs_reset) { in qmp_ufs_init()
1185 qmp->ufs_reset = in qmp_ufs_init()
1186 devm_reset_control_get_exclusive(qmp->dev, in qmp_ufs_init()
1189 if (IS_ERR(qmp->ufs_reset)) { in qmp_ufs_init()
1190 ret = PTR_ERR(qmp->ufs_reset); in qmp_ufs_init()
1191 dev_err(qmp->dev, in qmp_ufs_init()
1195 qmp->ufs_reset = NULL; in qmp_ufs_init()
1200 ret = reset_control_assert(qmp->ufs_reset); in qmp_ufs_init()
1205 ret = qmp_ufs_com_init(qmp); in qmp_ufs_init()
1214 struct qmp_ufs *qmp = phy_get_drvdata(phy); in qmp_ufs_power_on() local
1215 const struct qmp_phy_cfg *cfg = qmp->cfg; in qmp_ufs_power_on()
1216 void __iomem *pcs = qmp->pcs; in qmp_ufs_power_on()
1221 qmp_ufs_init_registers(qmp, cfg); in qmp_ufs_power_on()
1223 ret = reset_control_deassert(qmp->ufs_reset); in qmp_ufs_power_on()
1238 dev_err(qmp->dev, "phy initialization timed-out\n"); in qmp_ufs_power_on()
1247 struct qmp_ufs *qmp = phy_get_drvdata(phy); in qmp_ufs_power_off() local
1248 const struct qmp_phy_cfg *cfg = qmp->cfg; in qmp_ufs_power_off()
1252 qphy_setbits(qmp->pcs, cfg->regs[QPHY_SW_RESET], SW_RESET); in qmp_ufs_power_off()
1255 qphy_clrbits(qmp->pcs, cfg->regs[QPHY_START_CTRL], SERDES_START); in qmp_ufs_power_off()
1258 qphy_clrbits(qmp->pcs, cfg->regs[QPHY_PCS_POWER_DOWN_CONTROL], in qmp_ufs_power_off()
1266 struct qmp_ufs *qmp = phy_get_drvdata(phy); in qmp_ufs_exit() local
1268 qmp_ufs_com_exit(qmp); in qmp_ufs_exit()
1300 struct qmp_ufs *qmp = phy_get_drvdata(phy); in qmp_ufs_set_mode() local
1302 qmp->mode = mode; in qmp_ufs_set_mode()
1303 qmp->submode = submode; in qmp_ufs_set_mode()
1315 static int qmp_ufs_vreg_init(struct qmp_ufs *qmp) in qmp_ufs_vreg_init() argument
1317 const struct qmp_phy_cfg *cfg = qmp->cfg; in qmp_ufs_vreg_init()
1318 struct device *dev = qmp->dev; in qmp_ufs_vreg_init()
1322 qmp->vregs = devm_kcalloc(dev, num, sizeof(*qmp->vregs), GFP_KERNEL); in qmp_ufs_vreg_init()
1323 if (!qmp->vregs) in qmp_ufs_vreg_init()
1327 qmp->vregs[i].supply = cfg->vreg_list[i]; in qmp_ufs_vreg_init()
1329 return devm_regulator_bulk_get(dev, num, qmp->vregs); in qmp_ufs_vreg_init()
1332 static int qmp_ufs_clk_init(struct qmp_ufs *qmp) in qmp_ufs_clk_init() argument
1334 const struct qmp_phy_cfg *cfg = qmp->cfg; in qmp_ufs_clk_init()
1335 struct device *dev = qmp->dev; in qmp_ufs_clk_init()
1339 qmp->clks = devm_kcalloc(dev, num, sizeof(*qmp->clks), GFP_KERNEL); in qmp_ufs_clk_init()
1340 if (!qmp->clks) in qmp_ufs_clk_init()
1344 qmp->clks[i].id = cfg->clk_list[i]; in qmp_ufs_clk_init()
1346 return devm_clk_bulk_get(dev, num, qmp->clks); in qmp_ufs_clk_init()
1356 static int qmp_ufs_register_clocks(struct qmp_ufs *qmp, struct device_node *np) in qmp_ufs_register_clocks() argument
1363 clk_data = devm_kzalloc(qmp->dev, in qmp_ufs_register_clocks()
1371 snprintf(name, sizeof(name), "%s::rx_symbol_0", dev_name(qmp->dev)); in qmp_ufs_register_clocks()
1372 hw = devm_clk_hw_register_fixed_rate(qmp->dev, name, NULL, 0, 0); in qmp_ufs_register_clocks()
1378 snprintf(name, sizeof(name), "%s::rx_symbol_1", dev_name(qmp->dev)); in qmp_ufs_register_clocks()
1379 hw = devm_clk_hw_register_fixed_rate(qmp->dev, name, NULL, 0, 0); in qmp_ufs_register_clocks()
1385 snprintf(name, sizeof(name), "%s::tx_symbol_0", dev_name(qmp->dev)); in qmp_ufs_register_clocks()
1386 hw = devm_clk_hw_register_fixed_rate(qmp->dev, name, NULL, 0, 0); in qmp_ufs_register_clocks()
1399 return devm_add_action_or_reset(qmp->dev, qmp_ufs_clk_release_provider, np); in qmp_ufs_register_clocks()
1402 static int qmp_ufs_parse_dt_legacy(struct qmp_ufs *qmp, struct device_node *np) in qmp_ufs_parse_dt_legacy() argument
1404 struct platform_device *pdev = to_platform_device(qmp->dev); in qmp_ufs_parse_dt_legacy()
1405 const struct qmp_phy_cfg *cfg = qmp->cfg; in qmp_ufs_parse_dt_legacy()
1406 struct device *dev = qmp->dev; in qmp_ufs_parse_dt_legacy()
1408 qmp->serdes = devm_platform_ioremap_resource(pdev, 0); in qmp_ufs_parse_dt_legacy()
1409 if (IS_ERR(qmp->serdes)) in qmp_ufs_parse_dt_legacy()
1410 return PTR_ERR(qmp->serdes); in qmp_ufs_parse_dt_legacy()
1418 qmp->tx = devm_of_iomap(dev, np, 0, NULL); in qmp_ufs_parse_dt_legacy()
1419 if (IS_ERR(qmp->tx)) in qmp_ufs_parse_dt_legacy()
1420 return PTR_ERR(qmp->tx); in qmp_ufs_parse_dt_legacy()
1422 qmp->rx = devm_of_iomap(dev, np, 1, NULL); in qmp_ufs_parse_dt_legacy()
1423 if (IS_ERR(qmp->rx)) in qmp_ufs_parse_dt_legacy()
1424 return PTR_ERR(qmp->rx); in qmp_ufs_parse_dt_legacy()
1426 qmp->pcs = devm_of_iomap(dev, np, 2, NULL); in qmp_ufs_parse_dt_legacy()
1427 if (IS_ERR(qmp->pcs)) in qmp_ufs_parse_dt_legacy()
1428 return PTR_ERR(qmp->pcs); in qmp_ufs_parse_dt_legacy()
1431 qmp->tx2 = devm_of_iomap(dev, np, 3, NULL); in qmp_ufs_parse_dt_legacy()
1432 if (IS_ERR(qmp->tx2)) in qmp_ufs_parse_dt_legacy()
1433 return PTR_ERR(qmp->tx2); in qmp_ufs_parse_dt_legacy()
1435 qmp->rx2 = devm_of_iomap(dev, np, 4, NULL); in qmp_ufs_parse_dt_legacy()
1436 if (IS_ERR(qmp->rx2)) in qmp_ufs_parse_dt_legacy()
1437 return PTR_ERR(qmp->rx2); in qmp_ufs_parse_dt_legacy()
1439 qmp->pcs_misc = devm_of_iomap(dev, np, 5, NULL); in qmp_ufs_parse_dt_legacy()
1441 qmp->pcs_misc = devm_of_iomap(dev, np, 3, NULL); in qmp_ufs_parse_dt_legacy()
1444 if (IS_ERR(qmp->pcs_misc)) in qmp_ufs_parse_dt_legacy()
1450 static int qmp_ufs_parse_dt(struct qmp_ufs *qmp) in qmp_ufs_parse_dt() argument
1452 struct platform_device *pdev = to_platform_device(qmp->dev); in qmp_ufs_parse_dt()
1453 const struct qmp_phy_cfg *cfg = qmp->cfg; in qmp_ufs_parse_dt()
1464 qmp->serdes = base + offs->serdes; in qmp_ufs_parse_dt()
1465 qmp->pcs = base + offs->pcs; in qmp_ufs_parse_dt()
1466 qmp->tx = base + offs->tx; in qmp_ufs_parse_dt()
1467 qmp->rx = base + offs->rx; in qmp_ufs_parse_dt()
1470 qmp->tx2 = base + offs->tx2; in qmp_ufs_parse_dt()
1471 qmp->rx2 = base + offs->rx2; in qmp_ufs_parse_dt()
1482 struct qmp_ufs *qmp; in qmp_ufs_probe() local
1485 qmp = devm_kzalloc(dev, sizeof(*qmp), GFP_KERNEL); in qmp_ufs_probe()
1486 if (!qmp) in qmp_ufs_probe()
1489 qmp->dev = dev; in qmp_ufs_probe()
1491 qmp->cfg = of_device_get_match_data(dev); in qmp_ufs_probe()
1492 if (!qmp->cfg) in qmp_ufs_probe()
1495 ret = qmp_ufs_clk_init(qmp); in qmp_ufs_probe()
1499 ret = qmp_ufs_vreg_init(qmp); in qmp_ufs_probe()
1506 ret = qmp_ufs_parse_dt_legacy(qmp, np); in qmp_ufs_probe()
1509 ret = qmp_ufs_parse_dt(qmp); in qmp_ufs_probe()
1514 ret = qmp_ufs_register_clocks(qmp, np); in qmp_ufs_probe()
1518 qmp->phy = devm_phy_create(dev, np, &qcom_qmp_ufs_phy_ops); in qmp_ufs_probe()
1519 if (IS_ERR(qmp->phy)) { in qmp_ufs_probe()
1520 ret = PTR_ERR(qmp->phy); in qmp_ufs_probe()
1525 phy_set_drvdata(qmp->phy, qmp); in qmp_ufs_probe()