Lines Matching +full:sw +full:- +full:enable +full:- +full:bit
1 // SPDX-License-Identifier: GPL-2.0+
16 #define PHY_CTRL0_REF_SSP_EN BIT(2)
21 #define PHY_CTRL1_RESET BIT(0)
22 #define PHY_CTRL1_COMMONONN BIT(1)
23 #define PHY_CTRL1_ATERESET BIT(3)
24 #define PHY_CTRL1_VDATSRCENB0 BIT(19)
25 #define PHY_CTRL1_VDATDETENB0 BIT(20)
28 #define PHY_CTRL2_TXENABLEN0 BIT(8)
29 #define PHY_CTRL2_OTG_DISABLE BIT(9)
42 #define PHY_CTRL5_DMPWD_OVERRIDE_SEL BIT(23)
43 #define PHY_CTRL5_DMPWD_OVERRIDE BIT(22)
44 #define PHY_CTRL5_DPPWD_OVERRIDE_SEL BIT(21)
45 #define PHY_CTRL5_DPPWD_OVERRIDE BIT(20)
49 #define PHY_CTRL6_ALT_CLK_EN BIT(1)
50 #define PHY_CTRL6_ALT_CLK_SEL BIT(0)
55 #define TCA_CLK_RST_SW BIT(9)
56 #define TCA_CLK_RST_REF_CLK_EN BIT(1)
57 #define TCA_CLK_RST_SUSPEND_CLK_EN BIT(0)
63 #define TCA_GCFG_ROLE_HSTDEV BIT(4)
69 #define TCA_TCPC_VALID BIT(4)
70 #define TCA_TCPC_LOW_POWER_EN BIT(3)
71 #define TCA_TCPC_ORIENTATION_NORMAL BIT(2)
77 #define TCA_SYSMODE_TCPC_DISABLE BIT(3)
78 #define TCA_SYSMODE_TCPC_FLIP BIT(2)
84 #define TCA_PSTATE_CM_STS BIT(4)
85 #define TCA_PSTATE_TX_STS BIT(3)
86 #define TCA_PSTATE_RX_PLL_STS BIT(2)
90 #define TCA_GEN_DEV_POR BIT(12)
91 #define TCA_GEN_REF_CLK_SEL BIT(8)
92 #define TCA_GEN_TYPEC_FLIP_INVERT BIT(4)
93 #define TCA_GEN_PHY_TYPEC_DISABLE BIT(3)
94 #define TCA_GEN_PHY_TYPEC_FLIP BIT(2)
102 struct typec_switch_dev *sw; member
129 static int tca_blk_typec_switch_set(struct typec_switch_dev *sw, in tca_blk_typec_switch_set() argument
132 struct imx8mq_usb_phy *imx_phy = typec_switch_get_drvdata(sw); in tca_blk_typec_switch_set()
133 struct tca_blk *tca = imx_phy->tca; in tca_blk_typec_switch_set()
136 if (tca->orientation == orientation) in tca_blk_typec_switch_set()
139 ret = clk_prepare_enable(imx_phy->clk); in tca_blk_typec_switch_set()
144 clk_disable_unprepare(imx_phy->clk); in tca_blk_typec_switch_set()
152 struct device *dev = &pdev->dev; in tca_blk_get_typec_switch()
153 struct typec_switch_dev *sw; in tca_blk_get_typec_switch() local
157 sw_desc.fwnode = dev->fwnode; in tca_blk_get_typec_switch()
161 sw = typec_switch_register(dev, &sw_desc); in tca_blk_get_typec_switch()
162 if (IS_ERR(sw)) { in tca_blk_get_typec_switch()
164 PTR_ERR(sw)); in tca_blk_get_typec_switch()
168 return sw; in tca_blk_get_typec_switch()
171 static void tca_blk_put_typec_switch(struct typec_switch_dev *sw) in tca_blk_put_typec_switch() argument
173 typec_switch_unregister(sw); in tca_blk_put_typec_switch()
184 static void tca_blk_put_typec_switch(struct typec_switch_dev *sw) {} in tca_blk_put_typec_switch() argument
193 mutex_lock(&tca->mutex); in tca_blk_orientation_set()
197 * use Controller Synced Mode for TCA low power enable and in tca_blk_orientation_set()
201 writel(val, tca->base + TCA_GCFG); in tca_blk_orientation_set()
204 writel(val, tca->base + TCA_TCPC); in tca_blk_orientation_set()
211 writel(val, tca->base + TCA_GCFG); in tca_blk_orientation_set()
214 val = readl(tca->base + TCA_SYSMODE_CFG); in tca_blk_orientation_set()
216 writel(val, tca->base + TCA_SYSMODE_CFG); in tca_blk_orientation_set()
223 writel(val, tca->base + TCA_SYSMODE_CFG); in tca_blk_orientation_set()
225 /* Enable TCA module */ in tca_blk_orientation_set()
227 writel(val, tca->base + TCA_SYSMODE_CFG); in tca_blk_orientation_set()
230 tca->orientation = orientation; in tca_blk_orientation_set()
231 mutex_unlock(&tca->mutex); in tca_blk_orientation_set()
239 val = readl(tca->base + TCA_CLK_RST); in tca_blk_init()
241 writel(val, tca->base + TCA_CLK_RST); in tca_blk_init()
247 writel(val, tca->base + TCA_CLK_RST); in tca_blk_init()
249 tca_blk_orientation_set(tca, tca->orientation); in tca_blk_init()
255 struct device *dev = &pdev->dev; in imx95_usb_phy_get_tca()
265 return ERR_PTR(-ENOMEM); in imx95_usb_phy_get_tca()
267 tca->base = devm_ioremap_resource(&pdev->dev, res); in imx95_usb_phy_get_tca()
268 if (IS_ERR(tca->base)) in imx95_usb_phy_get_tca()
269 return ERR_CAST(tca->base); in imx95_usb_phy_get_tca()
271 mutex_init(&tca->mutex); in imx95_usb_phy_get_tca()
273 tca->orientation = TYPEC_ORIENTATION_NORMAL; in imx95_usb_phy_get_tca()
274 tca->sw = tca_blk_get_typec_switch(pdev, imx_phy); in imx95_usb_phy_get_tca()
281 struct tca_blk *tca = imx_phy->tca; in imx95_usb_phy_put_tca()
286 tca_blk_put_typec_switch(tca->sw); in imx95_usb_phy_put_tca()
293 return DIV_ROUND_CLOSEST(percent - 94U, 2); in phy_tx_vref_tune_from_property()
305 percent -= 91; in imx95_phy_tx_vref_tune_from_property()
308 percent -= 92; in imx95_phy_tx_vref_tune_from_property()
311 percent -= 93; in imx95_phy_tx_vref_tune_from_property()
403 percent -= 95; in imx95_phy_comp_dis_tune_from_property()
406 percent -= 96; in imx95_phy_comp_dis_tune_from_property()
409 percent -= 97; in imx95_phy_comp_dis_tune_from_property()
425 struct device *dev = imx_phy->phy->dev.parent; in imx8m_get_phy_tuning_data()
428 if (device_is_compatible(dev, "fsl,imx95-usb-phy")) in imx8m_get_phy_tuning_data()
431 if (device_property_read_u32(dev, "fsl,phy-tx-vref-tune-percent", in imx8m_get_phy_tuning_data()
432 &imx_phy->tx_vref_tune)) in imx8m_get_phy_tuning_data()
433 imx_phy->tx_vref_tune = PHY_TUNE_DEFAULT; in imx8m_get_phy_tuning_data()
435 imx_phy->tx_vref_tune = in imx8m_get_phy_tuning_data()
436 imx95_phy_tx_vref_tune_from_property(imx_phy->tx_vref_tune); in imx8m_get_phy_tuning_data()
438 imx_phy->tx_vref_tune = in imx8m_get_phy_tuning_data()
439 phy_tx_vref_tune_from_property(imx_phy->tx_vref_tune); in imx8m_get_phy_tuning_data()
441 if (device_property_read_u32(dev, "fsl,phy-tx-rise-tune-percent", in imx8m_get_phy_tuning_data()
442 &imx_phy->tx_rise_tune)) in imx8m_get_phy_tuning_data()
443 imx_phy->tx_rise_tune = PHY_TUNE_DEFAULT; in imx8m_get_phy_tuning_data()
445 imx_phy->tx_rise_tune = in imx8m_get_phy_tuning_data()
446 imx95_phy_tx_rise_tune_from_property(imx_phy->tx_rise_tune); in imx8m_get_phy_tuning_data()
448 imx_phy->tx_rise_tune = in imx8m_get_phy_tuning_data()
449 phy_tx_rise_tune_from_property(imx_phy->tx_rise_tune); in imx8m_get_phy_tuning_data()
451 if (device_property_read_u32(dev, "fsl,phy-tx-preemp-amp-tune-microamp", in imx8m_get_phy_tuning_data()
452 &imx_phy->tx_preemp_amp_tune)) in imx8m_get_phy_tuning_data()
453 imx_phy->tx_preemp_amp_tune = PHY_TUNE_DEFAULT; in imx8m_get_phy_tuning_data()
455 imx_phy->tx_preemp_amp_tune = in imx8m_get_phy_tuning_data()
456 phy_tx_preemp_amp_tune_from_property(imx_phy->tx_preemp_amp_tune); in imx8m_get_phy_tuning_data()
458 if (device_property_read_u32(dev, "fsl,phy-tx-vboost-level-microvolt", in imx8m_get_phy_tuning_data()
459 &imx_phy->tx_vboost_level)) in imx8m_get_phy_tuning_data()
460 imx_phy->tx_vboost_level = PHY_TUNE_DEFAULT; in imx8m_get_phy_tuning_data()
462 imx_phy->tx_vboost_level = in imx8m_get_phy_tuning_data()
463 phy_tx_vboost_level_from_property(imx_phy->tx_vboost_level); in imx8m_get_phy_tuning_data()
465 if (device_property_read_u32(dev, "fsl,phy-comp-dis-tune-percent", in imx8m_get_phy_tuning_data()
466 &imx_phy->comp_dis_tune)) in imx8m_get_phy_tuning_data()
467 imx_phy->comp_dis_tune = PHY_TUNE_DEFAULT; in imx8m_get_phy_tuning_data()
469 imx_phy->comp_dis_tune = in imx8m_get_phy_tuning_data()
470 imx95_phy_comp_dis_tune_from_property(imx_phy->comp_dis_tune); in imx8m_get_phy_tuning_data()
472 imx_phy->comp_dis_tune = in imx8m_get_phy_tuning_data()
473 phy_comp_dis_tune_from_property(imx_phy->comp_dis_tune); in imx8m_get_phy_tuning_data()
475 if (device_property_read_u32(dev, "fsl,phy-pcs-tx-deemph-3p5db-attenuation-db", in imx8m_get_phy_tuning_data()
476 &imx_phy->pcs_tx_deemph_3p5db)) in imx8m_get_phy_tuning_data()
477 imx_phy->pcs_tx_deemph_3p5db = PHY_TUNE_DEFAULT; in imx8m_get_phy_tuning_data()
479 imx_phy->pcs_tx_deemph_3p5db = in imx8m_get_phy_tuning_data()
480 phy_pcs_tx_deemph_3p5db_from_property(imx_phy->pcs_tx_deemph_3p5db); in imx8m_get_phy_tuning_data()
482 if (device_property_read_u32(dev, "fsl,phy-pcs-tx-swing-full-percent", in imx8m_get_phy_tuning_data()
483 &imx_phy->pcs_tx_swing_full)) in imx8m_get_phy_tuning_data()
484 imx_phy->pcs_tx_swing_full = PHY_TUNE_DEFAULT; in imx8m_get_phy_tuning_data()
486 imx_phy->pcs_tx_swing_full = in imx8m_get_phy_tuning_data()
487 phy_pcs_tx_swing_full_from_property(imx_phy->pcs_tx_swing_full); in imx8m_get_phy_tuning_data()
495 if (imx_phy->pcs_tx_deemph_3p5db != PHY_TUNE_DEFAULT) { in imx8m_phy_tune()
496 value = readl(imx_phy->base + PHY_CTRL4); in imx8m_phy_tune()
499 imx_phy->pcs_tx_deemph_3p5db); in imx8m_phy_tune()
500 writel(value, imx_phy->base + PHY_CTRL4); in imx8m_phy_tune()
503 if (imx_phy->pcs_tx_swing_full != PHY_TUNE_DEFAULT) { in imx8m_phy_tune()
504 value = readl(imx_phy->base + PHY_CTRL5); in imx8m_phy_tune()
506 imx_phy->pcs_tx_swing_full); in imx8m_phy_tune()
507 writel(value, imx_phy->base + PHY_CTRL5); in imx8m_phy_tune()
510 if ((imx_phy->tx_vref_tune & imx_phy->tx_rise_tune & in imx8m_phy_tune()
511 imx_phy->tx_preemp_amp_tune & imx_phy->comp_dis_tune & in imx8m_phy_tune()
512 imx_phy->tx_vboost_level) == PHY_TUNE_DEFAULT) in imx8m_phy_tune()
516 value = readl(imx_phy->base + PHY_CTRL3); in imx8m_phy_tune()
518 if (imx_phy->tx_vref_tune != PHY_TUNE_DEFAULT) { in imx8m_phy_tune()
521 imx_phy->tx_vref_tune); in imx8m_phy_tune()
524 if (imx_phy->tx_rise_tune != PHY_TUNE_DEFAULT) { in imx8m_phy_tune()
527 imx_phy->tx_rise_tune); in imx8m_phy_tune()
530 if (imx_phy->tx_preemp_amp_tune != PHY_TUNE_DEFAULT) { in imx8m_phy_tune()
533 imx_phy->tx_preemp_amp_tune); in imx8m_phy_tune()
536 if (imx_phy->comp_dis_tune != PHY_TUNE_DEFAULT) { in imx8m_phy_tune()
539 imx_phy->comp_dis_tune); in imx8m_phy_tune()
542 if (imx_phy->tx_vboost_level != PHY_TUNE_DEFAULT) { in imx8m_phy_tune()
545 imx_phy->tx_vboost_level); in imx8m_phy_tune()
548 writel(value, imx_phy->base + PHY_CTRL3); in imx8m_phy_tune()
556 value = readl(imx_phy->base + PHY_CTRL1); in imx8mq_usb_phy_init()
560 writel(value, imx_phy->base + PHY_CTRL1); in imx8mq_usb_phy_init()
562 value = readl(imx_phy->base + PHY_CTRL0); in imx8mq_usb_phy_init()
564 writel(value, imx_phy->base + PHY_CTRL0); in imx8mq_usb_phy_init()
566 value = readl(imx_phy->base + PHY_CTRL2); in imx8mq_usb_phy_init()
568 writel(value, imx_phy->base + PHY_CTRL2); in imx8mq_usb_phy_init()
570 value = readl(imx_phy->base + PHY_CTRL1); in imx8mq_usb_phy_init()
572 writel(value, imx_phy->base + PHY_CTRL1); in imx8mq_usb_phy_init()
583 value = readl(imx_phy->base + PHY_CTRL0); in imx8mp_usb_phy_init()
586 writel(value, imx_phy->base + PHY_CTRL0); in imx8mp_usb_phy_init()
589 value = readl(imx_phy->base + PHY_CTRL6); in imx8mp_usb_phy_init()
591 writel(value, imx_phy->base + PHY_CTRL6); in imx8mp_usb_phy_init()
593 value = readl(imx_phy->base + PHY_CTRL1); in imx8mp_usb_phy_init()
596 writel(value, imx_phy->base + PHY_CTRL1); in imx8mp_usb_phy_init()
598 value = readl(imx_phy->base + PHY_CTRL0); in imx8mp_usb_phy_init()
600 writel(value, imx_phy->base + PHY_CTRL0); in imx8mp_usb_phy_init()
602 value = readl(imx_phy->base + PHY_CTRL2); in imx8mp_usb_phy_init()
604 writel(value, imx_phy->base + PHY_CTRL2); in imx8mp_usb_phy_init()
608 value = readl(imx_phy->base + PHY_CTRL1); in imx8mp_usb_phy_init()
610 writel(value, imx_phy->base + PHY_CTRL1); in imx8mp_usb_phy_init()
614 if (imx_phy->tca) in imx8mp_usb_phy_init()
615 tca_blk_init(imx_phy->tca); in imx8mp_usb_phy_init()
625 ret = regulator_enable(imx_phy->vbus); in imx8mq_phy_power_on()
629 return clk_prepare_enable(imx_phy->clk); in imx8mq_phy_power_on()
636 clk_disable_unprepare(imx_phy->clk); in imx8mq_phy_power_off()
637 regulator_disable(imx_phy->vbus); in imx8mq_phy_power_off()
657 {.compatible = "fsl,imx8mq-usb-phy",
659 {.compatible = "fsl,imx8mp-usb-phy",
661 {.compatible = "fsl,imx95-usb-phy",
670 struct device *dev = &pdev->dev; in imx8mq_usb_phy_probe()
676 return -ENOMEM; in imx8mq_usb_phy_probe()
678 imx_phy->clk = devm_clk_get(dev, "phy"); in imx8mq_usb_phy_probe()
679 if (IS_ERR(imx_phy->clk)) { in imx8mq_usb_phy_probe()
681 return PTR_ERR(imx_phy->clk); in imx8mq_usb_phy_probe()
684 imx_phy->base = devm_platform_ioremap_resource(pdev, 0); in imx8mq_usb_phy_probe()
685 if (IS_ERR(imx_phy->base)) in imx8mq_usb_phy_probe()
686 return PTR_ERR(imx_phy->base); in imx8mq_usb_phy_probe()
690 return -EINVAL; in imx8mq_usb_phy_probe()
692 imx_phy->phy = devm_phy_create(dev, NULL, phy_ops); in imx8mq_usb_phy_probe()
693 if (IS_ERR(imx_phy->phy)) in imx8mq_usb_phy_probe()
694 return PTR_ERR(imx_phy->phy); in imx8mq_usb_phy_probe()
696 imx_phy->vbus = devm_regulator_get(dev, "vbus"); in imx8mq_usb_phy_probe()
697 if (IS_ERR(imx_phy->vbus)) in imx8mq_usb_phy_probe()
698 return dev_err_probe(dev, PTR_ERR(imx_phy->vbus), "failed to get vbus\n"); in imx8mq_usb_phy_probe()
700 phy_set_drvdata(imx_phy->phy, imx_phy); in imx8mq_usb_phy_probe()
702 imx_phy->tca = imx95_usb_phy_get_tca(pdev, imx_phy); in imx8mq_usb_phy_probe()
703 if (IS_ERR(imx_phy->tca)) in imx8mq_usb_phy_probe()
704 return dev_err_probe(dev, PTR_ERR(imx_phy->tca), in imx8mq_usb_phy_probe()
725 .name = "imx8mq-usb-phy",