Lines Matching +full:fine +full:- +full:tuning

1 // SPDX-License-Identifier: GPL-2.0
3 * phy-rtk-usb3.c RTK usb3.0 phy driver
15 #include <linux/nvmem-consumer.h>
107 return -ETIMEDOUT; in utmi_wait_register()
115 return utmi_wait_register(phy_reg->reg_mdio_ctl, USB_MDIO_CTRL_PHY_BUSY, 0); in rtk_phy3_wait_vbusy()
125 writel(tmp, phy_reg->reg_mdio_ctl); in rtk_phy_read()
129 value = readl(phy_reg->reg_mdio_ctl); in rtk_phy_read()
143 writel(val, phy_reg->reg_mdio_ctl); in rtk_phy_write()
152 struct phy_cfg *phy_cfg = rtk_phy->phy_cfg; in do_rtk_usb3_phy_toggle()
160 phy_parameter = &((struct phy_parameter *)rtk_phy->phy_parameter)[index]; in do_rtk_usb3_phy_toggle()
161 phy_reg = &phy_parameter->phy_reg; in do_rtk_usb3_phy_toggle()
163 if (!phy_cfg->do_toggle) in do_rtk_usb3_phy_toggle()
167 phy_data = phy_cfg->param + i; in do_rtk_usb3_phy_toggle()
168 addr = phy_data->addr; in do_rtk_usb3_phy_toggle()
169 data = phy_data->data; in do_rtk_usb3_phy_toggle()
174 phy_data->addr = addr; in do_rtk_usb3_phy_toggle()
175 phy_data->data = data; in do_rtk_usb3_phy_toggle()
190 phy_cfg = rtk_phy->phy_cfg; in do_rtk_phy_init()
191 phy_parameter = &((struct phy_parameter *)rtk_phy->phy_parameter)[index]; in do_rtk_phy_init()
192 phy_reg = &phy_parameter->phy_reg; in do_rtk_phy_init()
194 if (phy_cfg->use_default_parameter) in do_rtk_phy_init()
197 for (i = 0; i < phy_cfg->param_size; i++) { in do_rtk_phy_init()
198 struct phy_data *phy_data = phy_cfg->param + i; in do_rtk_phy_init()
199 u8 addr = phy_data->addr; in do_rtk_phy_init()
200 u16 data = phy_data->data; in do_rtk_phy_init()
209 if (phy_cfg->do_toggle_once) in do_rtk_phy_init()
210 phy_cfg->do_toggle = true; in do_rtk_phy_init()
214 if (phy_cfg->do_toggle_once) { in do_rtk_phy_init()
234 if (count-- < 0) in do_rtk_phy_init()
239 dev_info(rtk_phy->dev, "toggle fail addr=0x%02x, data=0x%04x\n", in do_rtk_phy_init()
246 phy_cfg->do_toggle = false; in do_rtk_phy_init()
249 if (phy_cfg->check_rx_front_end_offset) { in do_rtk_phy_init()
262 …dev_warn(rtk_phy->dev, "Don't update rx_offset_range (rx_offset_code=0x%x, rx_offset_range=0x%x)\n… in do_rtk_phy_init()
289 for (i = 0; i < rtk_phy->num_phy; i++) in rtk_phy_init()
292 dev_dbg(rtk_phy->dev, "Initialized RTK USB 3.0 PHY (take %dms)\n", in rtk_phy_init()
293 jiffies_to_msecs(jiffies - phy_init_time)); in rtk_phy_init()
307 if (index > rtk_phy->num_phy) { in rtk_phy_toggle()
308 dev_err(rtk_phy->dev, "%s: The port=%d is not in usb phy (num_phy=%d)\n", in rtk_phy_toggle()
309 __func__, index, rtk_phy->num_phy); in rtk_phy_toggle()
320 dev_dbg(rtk_phy->dev, "%s port=%d\n", __func__, port); in rtk_phy_connect()
330 dev_dbg(rtk_phy->dev, "%s port=%d\n", __func__, port); in rtk_phy_disconnect()
358 struct rtk_phy *rtk_phy = s->private; in rtk_usb3_parameter_show()
362 phy_cfg = rtk_phy->phy_cfg; in rtk_usb3_parameter_show()
366 phy_cfg->check_efuse ? "Enable" : "Disable"); in rtk_usb3_parameter_show()
368 phy_cfg->do_toggle ? "Enable" : "Disable"); in rtk_usb3_parameter_show()
370 phy_cfg->do_toggle_once ? "Enable" : "Disable"); in rtk_usb3_parameter_show()
372 phy_cfg->use_default_parameter ? "Enable" : "Disable"); in rtk_usb3_parameter_show()
374 for (index = 0; index < rtk_phy->num_phy; index++) { in rtk_usb3_parameter_show()
378 phy_parameter = &((struct phy_parameter *)rtk_phy->phy_parameter)[index]; in rtk_usb3_parameter_show()
379 phy_reg = &phy_parameter->phy_reg; in rtk_usb3_parameter_show()
383 for (i = 0; i < phy_cfg->param_size; i++) { in rtk_usb3_parameter_show()
384 struct phy_data *phy_data = phy_cfg->param + i; in rtk_usb3_parameter_show()
386 u16 data = phy_data->data; in rtk_usb3_parameter_show()
388 if (!phy_data->addr && !data) in rtk_usb3_parameter_show()
398 (int)phy_parameter->efuse_usb_u3_tx_lfps_swing_trim); in rtk_usb3_parameter_show()
400 (int)phy_parameter->amplitude_control_coarse); in rtk_usb3_parameter_show()
402 (int)phy_parameter->amplitude_control_fine); in rtk_usb3_parameter_show()
418 rtk_phy->debug_dir = debugfs_create_dir(dev_name(rtk_phy->dev), phy_debug_root); in create_debug_files()
420 debugfs_create_file("parameter", 0444, rtk_phy->debug_dir, rtk_phy, in create_debug_files()
426 debugfs_remove_recursive(rtk_phy->debug_dir); in remove_debug_files()
436 struct phy_cfg *phy_cfg = rtk_phy->phy_cfg; in get_phy_data_by_efuse()
440 if (!phy_cfg->check_efuse) in get_phy_data_by_efuse()
443 cell = nvmem_cell_get(rtk_phy->dev, "usb_u3_tx_lfps_swing_trim"); in get_phy_data_by_efuse()
445 dev_dbg(rtk_phy->dev, "%s no usb_u3_tx_lfps_swing_trim: %ld\n", in get_phy_data_by_efuse()
460 phy_parameter->efuse_usb_u3_tx_lfps_swing_trim = 0x8; in get_phy_data_by_efuse()
462 phy_parameter->efuse_usb_u3_tx_lfps_swing_trim = (u8)value; in get_phy_data_by_efuse()
474 phy_reg = &phy_parameter->phy_reg; in update_amplitude_control_value()
475 phy_cfg = rtk_phy->phy_cfg; in update_amplitude_control_value()
477 if (phy_parameter->amplitude_control_coarse != AMPLITUDE_CONTROL_COARSE_DEFAULT) { in update_amplitude_control_value()
481 if (!phy_cfg->param[PHY_ADDR_0X20].addr && !phy_cfg->param[PHY_ADDR_0X20].data) { in update_amplitude_control_value()
482 phy_cfg->param[PHY_ADDR_0X20].addr = PHY_ADDR_0X20; in update_amplitude_control_value()
485 data = phy_cfg->param[PHY_ADDR_0X20].data; in update_amplitude_control_value()
489 data |= (phy_parameter->amplitude_control_coarse & val_mask); in update_amplitude_control_value()
491 phy_cfg->param[PHY_ADDR_0X20].data = data; in update_amplitude_control_value()
494 if (phy_parameter->efuse_usb_u3_tx_lfps_swing_trim) { in update_amplitude_control_value()
495 u8 efuse_val = phy_parameter->efuse_usb_u3_tx_lfps_swing_trim; in update_amplitude_control_value()
500 if (!phy_cfg->param[PHY_ADDR_0X20].addr && !phy_cfg->param[PHY_ADDR_0X20].data) { in update_amplitude_control_value()
501 phy_cfg->param[PHY_ADDR_0X20].addr = PHY_ADDR_0X20; in update_amplitude_control_value()
504 data = phy_cfg->param[PHY_ADDR_0X20].data; in update_amplitude_control_value()
510 phy_cfg->param[PHY_ADDR_0X20].data = data; in update_amplitude_control_value()
513 if (phy_parameter->amplitude_control_fine != AMPLITUDE_CONTROL_FINE_DEFAULT) { in update_amplitude_control_value()
516 if (!phy_cfg->param[PHY_ADDR_0X21].addr && !phy_cfg->param[PHY_ADDR_0X21].data) in update_amplitude_control_value()
517 phy_cfg->param[PHY_ADDR_0X21].addr = PHY_ADDR_0X21; in update_amplitude_control_value()
519 phy_cfg->param[PHY_ADDR_0X21].data = in update_amplitude_control_value()
520 phy_parameter->amplitude_control_fine & val_mask; in update_amplitude_control_value()
526 struct device *dev = rtk_phy->dev; in parse_phy_data()
531 rtk_phy->phy_parameter = devm_kzalloc(dev, sizeof(struct phy_parameter) * in parse_phy_data()
532 rtk_phy->num_phy, GFP_KERNEL); in parse_phy_data()
533 if (!rtk_phy->phy_parameter) in parse_phy_data()
534 return -ENOMEM; in parse_phy_data()
536 for (index = 0; index < rtk_phy->num_phy; index++) { in parse_phy_data()
537 phy_parameter = &((struct phy_parameter *)rtk_phy->phy_parameter)[index]; in parse_phy_data()
539 phy_parameter->phy_reg.reg_mdio_ctl = of_iomap(dev->of_node, 0) + index; in parse_phy_data()
542 if (of_property_read_u32(dev->of_node, "realtek,amplitude-control-coarse-tuning", in parse_phy_data()
543 &phy_parameter->amplitude_control_coarse)) in parse_phy_data()
544 phy_parameter->amplitude_control_coarse = AMPLITUDE_CONTROL_COARSE_DEFAULT; in parse_phy_data()
547 if (of_property_read_u32(dev->of_node, "realtek,amplitude-control-fine-tuning", in parse_phy_data()
548 &phy_parameter->amplitude_control_fine)) in parse_phy_data()
549 phy_parameter->amplitude_control_fine = AMPLITUDE_CONTROL_FINE_DEFAULT; in parse_phy_data()
562 struct device *dev = &pdev->dev; in rtk_usb3phy_probe()
571 return -EINVAL; in rtk_usb3phy_probe()
576 return -ENOMEM; in rtk_usb3phy_probe()
578 rtk_phy->dev = &pdev->dev; in rtk_usb3phy_probe()
579 rtk_phy->phy_cfg = devm_kzalloc(dev, sizeof(*phy_cfg), GFP_KERNEL); in rtk_usb3phy_probe()
580 if (!rtk_phy->phy_cfg) in rtk_usb3phy_probe()
581 return -ENOMEM; in rtk_usb3phy_probe()
583 memcpy(rtk_phy->phy_cfg, phy_cfg, sizeof(*phy_cfg)); in rtk_usb3phy_probe()
585 rtk_phy->num_phy = 1; in rtk_usb3phy_probe()
593 generic_phy = devm_phy_create(rtk_phy->dev, NULL, &ops); in rtk_usb3phy_probe()
599 phy_provider = devm_of_phy_provider_register(rtk_phy->dev, of_phy_simple_xlate); in rtk_usb3phy_probe()
728 { .compatible = "realtek,rtd1295-usb3phy", .data = &rtd1295_phy_cfg },
729 { .compatible = "realtek,rtd1319-usb3phy", .data = &rtd1319_phy_cfg },
730 { .compatible = "realtek,rtd1319d-usb3phy", .data = &rtd1319d_phy_cfg },
731 { .compatible = "realtek,rtd1619-usb3phy", .data = &rtd1619_phy_cfg },
732 { .compatible = "realtek,rtd1619b-usb3phy", .data = &rtd1619b_phy_cfg },
741 .name = "rtk-usb3phy",