Lines Matching +full:usb2 +full:- +full:3
1 // SPDX-License-Identifier: GPL-2.0-only
3 * Meson8, Meson8b and GXBB USB2 PHY driver
23 #define REG_CONFIG_CLK_SEL_MASK GENMASK(3, 1)
31 #define REG_CTRL_SS_SCALEDOWN_MODE_MASK GENMASK(3, 2)
49 /* bits [31:26], [24:21] and [15:3] seem to be read-only */
54 #define REG_ADP_BC_ID_PULLUP BIT(3)
83 #define REG_DBG_UART_BYPASS_DM_DATA BIT(3)
93 #define REG_TEST_DATA_IN_MASK GENMASK(3, 0)
104 #define REG_TUNE_TX_HSXV_TUNE_MASK GENMASK(3, 2)
145 if (!IS_ERR_OR_NULL(priv->reset)) { in phy_meson8b_usb2_power_on()
146 ret = reset_control_reset(priv->reset); in phy_meson8b_usb2_power_on()
148 dev_err(&phy->dev, "Failed to trigger USB reset\n"); in phy_meson8b_usb2_power_on()
153 ret = clk_prepare_enable(priv->clk_usb_general); in phy_meson8b_usb2_power_on()
155 dev_err(&phy->dev, "Failed to enable USB general clock\n"); in phy_meson8b_usb2_power_on()
156 reset_control_rearm(priv->reset); in phy_meson8b_usb2_power_on()
160 ret = clk_prepare_enable(priv->clk_usb); in phy_meson8b_usb2_power_on()
162 dev_err(&phy->dev, "Failed to enable USB DDR clock\n"); in phy_meson8b_usb2_power_on()
163 clk_disable_unprepare(priv->clk_usb_general); in phy_meson8b_usb2_power_on()
164 reset_control_rearm(priv->reset); in phy_meson8b_usb2_power_on()
168 regmap_set_bits(priv->regmap, REG_CONFIG, REG_CONFIG_CLK_32k_ALTSEL); in phy_meson8b_usb2_power_on()
170 regmap_update_bits(priv->regmap, REG_CTRL, REG_CTRL_REF_CLK_SEL_MASK, in phy_meson8b_usb2_power_on()
173 regmap_update_bits(priv->regmap, REG_CTRL, REG_CTRL_FSEL_MASK, in phy_meson8b_usb2_power_on()
177 regmap_set_bits(priv->regmap, REG_CTRL, REG_CTRL_POWER_ON_RESET); in phy_meson8b_usb2_power_on()
179 regmap_clear_bits(priv->regmap, REG_CTRL, REG_CTRL_POWER_ON_RESET); in phy_meson8b_usb2_power_on()
182 regmap_set_bits(priv->regmap, REG_CTRL, REG_CTRL_SOF_TOGGLE_OUT); in phy_meson8b_usb2_power_on()
184 if (priv->dr_mode == USB_DR_MODE_HOST) { in phy_meson8b_usb2_power_on()
185 regmap_clear_bits(priv->regmap, REG_DBG_UART, in phy_meson8b_usb2_power_on()
188 if (priv->match->host_enable_aca) { in phy_meson8b_usb2_power_on()
189 regmap_set_bits(priv->regmap, REG_ADP_BC, in phy_meson8b_usb2_power_on()
194 regmap_read(priv->regmap, REG_ADP_BC, ®); in phy_meson8b_usb2_power_on()
196 dev_warn(&phy->dev, "USB ID detect failed!\n"); in phy_meson8b_usb2_power_on()
197 clk_disable_unprepare(priv->clk_usb); in phy_meson8b_usb2_power_on()
198 clk_disable_unprepare(priv->clk_usb_general); in phy_meson8b_usb2_power_on()
199 reset_control_rearm(priv->reset); in phy_meson8b_usb2_power_on()
200 return -EINVAL; in phy_meson8b_usb2_power_on()
212 if (priv->dr_mode == USB_DR_MODE_HOST) in phy_meson8b_usb2_power_off()
213 regmap_set_bits(priv->regmap, REG_DBG_UART, in phy_meson8b_usb2_power_off()
216 clk_disable_unprepare(priv->clk_usb); in phy_meson8b_usb2_power_off()
217 clk_disable_unprepare(priv->clk_usb_general); in phy_meson8b_usb2_power_off()
218 reset_control_rearm(priv->reset); in phy_meson8b_usb2_power_off()
221 regmap_set_bits(priv->regmap, REG_CTRL, REG_CTRL_POWER_ON_RESET); in phy_meson8b_usb2_power_off()
239 priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL); in phy_meson8b_usb2_probe()
241 return -ENOMEM; in phy_meson8b_usb2_probe()
247 priv->match = device_get_match_data(&pdev->dev); in phy_meson8b_usb2_probe()
248 if (!priv->match) in phy_meson8b_usb2_probe()
249 return -ENODEV; in phy_meson8b_usb2_probe()
251 priv->regmap = devm_regmap_init_mmio(&pdev->dev, base, in phy_meson8b_usb2_probe()
253 if (IS_ERR(priv->regmap)) in phy_meson8b_usb2_probe()
254 return PTR_ERR(priv->regmap); in phy_meson8b_usb2_probe()
256 priv->clk_usb_general = devm_clk_get(&pdev->dev, "usb_general"); in phy_meson8b_usb2_probe()
257 if (IS_ERR(priv->clk_usb_general)) in phy_meson8b_usb2_probe()
258 return PTR_ERR(priv->clk_usb_general); in phy_meson8b_usb2_probe()
260 priv->clk_usb = devm_clk_get(&pdev->dev, "usb"); in phy_meson8b_usb2_probe()
261 if (IS_ERR(priv->clk_usb)) in phy_meson8b_usb2_probe()
262 return PTR_ERR(priv->clk_usb); in phy_meson8b_usb2_probe()
264 priv->reset = devm_reset_control_get_optional_shared(&pdev->dev, NULL); in phy_meson8b_usb2_probe()
265 if (IS_ERR(priv->reset)) in phy_meson8b_usb2_probe()
266 return dev_err_probe(&pdev->dev, PTR_ERR(priv->reset), in phy_meson8b_usb2_probe()
269 priv->dr_mode = of_usb_get_dr_mode_by_phy(pdev->dev.of_node, -1); in phy_meson8b_usb2_probe()
270 if (priv->dr_mode == USB_DR_MODE_UNKNOWN) { in phy_meson8b_usb2_probe()
271 dev_err(&pdev->dev, in phy_meson8b_usb2_probe()
273 return -EINVAL; in phy_meson8b_usb2_probe()
276 phy = devm_phy_create(&pdev->dev, NULL, &phy_meson8b_usb2_ops); in phy_meson8b_usb2_probe()
278 return dev_err_probe(&pdev->dev, PTR_ERR(phy), in phy_meson8b_usb2_probe()
285 devm_of_phy_provider_register(&pdev->dev, of_phy_simple_xlate); in phy_meson8b_usb2_probe()
300 .compatible = "amlogic,meson8-usb2-phy",
304 .compatible = "amlogic,meson8b-usb2-phy",
308 .compatible = "amlogic,meson8m2-usb2-phy",
312 .compatible = "amlogic,meson-gxbb-usb2-phy",
322 .name = "phy-meson-usb2",
329 MODULE_DESCRIPTION("Meson8, Meson8b, Meson8m2 and GXBB USB2 PHY driver");