Lines Matching +full:tx +full:- +full:atten
28 #include <linux/mfd/syscon/imx6q-iomuxc-gpr.h>
31 #include <linux/hwmon-sysfs.h>
35 #define DRV_NAME "ahci-imx"
38 /* Timer 1-ms Register */
124 MODULE_PARM_DESC(hotplug, "AHCI IMX hot-plug support (0=Don't support, 1=support)");
148 } while (--timeout); in imx_phy_crbit_assert()
150 return timeout ? 0 : -ETIMEDOUT; in imx_phy_crbit_assert()
238 struct imx_ahci_priv *imxpriv = hpriv->plat_data; in imx_sata_phy_reset()
239 void __iomem *mmio = hpriv->mmio; in imx_sata_phy_reset()
244 if (imxpriv->type == AHCI_IMX6QP) { in imx_sata_phy_reset()
246 regmap_update_bits(imxpriv->gpr, IOMUXC_GPR5, in imx_sata_phy_reset()
249 regmap_update_bits(imxpriv->gpr, IOMUXC_GPR5, in imx_sata_phy_reset()
252 regmap_update_bits(imxpriv->gpr, IOMUXC_GPR5, in imx_sata_phy_reset()
277 } while (--timeout); in imx_sata_phy_reset()
279 return timeout ? 0 : -ETIMEDOUT; in imx_sata_phy_reset()
347 void __iomem *mmio = hpriv->mmio; in sata_ahci_read_temperature()
349 /* check rd-wr to reg */ in sata_ahci_read_temperature()
424 a = (m2 - m1) / (m2/1000); in sata_ahci_read_temperature()
425 *temp = ((-559) * a * a) / 1000 + (1379) * a + (-458000); in sata_ahci_read_temperature()
460 struct imx_ahci_priv *imxpriv = hpriv->plat_data; in imx8_sata_enable()
461 struct device *dev = &imxpriv->ahci_pdev->dev; in imx8_sata_enable()
464 ret = clk_prepare_enable(imxpriv->phy_pclk0); in imx8_sata_enable()
469 ret = clk_prepare_enable(imxpriv->phy_pclk1); in imx8_sata_enable()
474 ret = clk_prepare_enable(imxpriv->epcs_tx_clk); in imx8_sata_enable()
479 ret = clk_prepare_enable(imxpriv->epcs_rx_clk); in imx8_sata_enable()
484 ret = clk_prepare_enable(imxpriv->phy_apbclk); in imx8_sata_enable()
490 regmap_read(imxpriv->gpr, IMX8QM_CSR_PCIEA_OFFSET + in imx8_sata_enable()
494 regmap_update_bits(imxpriv->gpr, in imx8_sata_enable()
501 regmap_read(imxpriv->gpr, IMX8QM_CSR_PCIEB_OFFSET + in imx8_sata_enable()
505 regmap_update_bits(imxpriv->gpr, in imx8_sata_enable()
514 regmap_update_bits(imxpriv->gpr, in imx8_sata_enable()
523 regmap_update_bits(imxpriv->gpr, in imx8_sata_enable()
527 regmap_update_bits(imxpriv->gpr, in imx8_sata_enable()
533 regmap_update_bits(imxpriv->gpr, in imx8_sata_enable()
542 regmap_update_bits(imxpriv->gpr, in imx8_sata_enable()
546 regmap_update_bits(imxpriv->gpr, in imx8_sata_enable()
550 regmap_update_bits(imxpriv->gpr, in imx8_sata_enable()
563 regmap_update_bits(imxpriv->gpr, in imx8_sata_enable()
575 regmap_update_bits(imxpriv->gpr, in imx8_sata_enable()
580 regmap_update_bits(imxpriv->gpr, in imx8_sata_enable()
585 /* CTRL RST: SET -> delay 1 us -> CLEAR -> SET */ in imx8_sata_enable()
586 regmap_update_bits(imxpriv->gpr, in imx8_sata_enable()
591 regmap_update_bits(imxpriv->gpr, in imx8_sata_enable()
595 regmap_update_bits(imxpriv->gpr, in imx8_sata_enable()
601 regmap_update_bits(imxpriv->gpr, in imx8_sata_enable()
609 regmap_read(imxpriv->gpr, reg, &val); in imx8_sata_enable()
617 dev_err(dev, "TX PLL of the PHY is not locked\n"); in imx8_sata_enable()
618 ret = -ENODEV; in imx8_sata_enable()
620 writeb(imxpriv->imped_ratio, imxpriv->phy_base + in imx8_sata_enable()
622 writeb(imxpriv->imped_ratio, imxpriv->phy_base + in imx8_sata_enable()
624 reg = readb(imxpriv->phy_base + in imx8_sata_enable()
626 if (unlikely(reg != imxpriv->imped_ratio)) in imx8_sata_enable()
628 reg = readb(imxpriv->phy_base + in imx8_sata_enable()
630 if (unlikely(reg != imxpriv->imped_ratio)) in imx8_sata_enable()
631 dev_info(dev, "Can't set PHY TX impedance ratio.\n"); in imx8_sata_enable()
638 clk_disable_unprepare(imxpriv->phy_apbclk); in imx8_sata_enable()
639 clk_disable_unprepare(imxpriv->phy_pclk1); in imx8_sata_enable()
640 clk_disable_unprepare(imxpriv->phy_pclk0); in imx8_sata_enable()
644 clk_disable_unprepare(imxpriv->phy_apbclk); in imx8_sata_enable()
646 clk_disable_unprepare(imxpriv->epcs_rx_clk); in imx8_sata_enable()
648 clk_disable_unprepare(imxpriv->epcs_tx_clk); in imx8_sata_enable()
650 clk_disable_unprepare(imxpriv->phy_pclk1); in imx8_sata_enable()
652 clk_disable_unprepare(imxpriv->phy_pclk0); in imx8_sata_enable()
659 struct imx_ahci_priv *imxpriv = hpriv->plat_data; in imx_sata_enable()
660 struct device *dev = &imxpriv->ahci_pdev->dev; in imx_sata_enable()
663 if (imxpriv->no_device) in imx_sata_enable()
670 ret = clk_prepare_enable(imxpriv->sata_ref_clk); in imx_sata_enable()
674 if (imxpriv->type == AHCI_IMX6Q || imxpriv->type == AHCI_IMX6QP) { in imx_sata_enable()
681 regmap_update_bits(imxpriv->gpr, IOMUXC_GPR13, in imx_sata_enable()
692 imxpriv->phy_params); in imx_sata_enable()
693 regmap_update_bits(imxpriv->gpr, IOMUXC_GPR13, in imx_sata_enable()
704 } else if (imxpriv->type == AHCI_IMX8QM) { in imx_sata_enable()
713 clk_disable_unprepare(imxpriv->sata_ref_clk); in imx_sata_enable()
722 struct imx_ahci_priv *imxpriv = hpriv->plat_data; in imx_sata_disable()
724 if (imxpriv->no_device) in imx_sata_disable()
727 switch (imxpriv->type) { in imx_sata_disable()
729 regmap_update_bits(imxpriv->gpr, IOMUXC_GPR5, in imx_sata_disable()
732 regmap_update_bits(imxpriv->gpr, IOMUXC_GPR13, in imx_sata_disable()
738 regmap_update_bits(imxpriv->gpr, IOMUXC_GPR13, in imx_sata_disable()
744 clk_disable_unprepare(imxpriv->epcs_rx_clk); in imx_sata_disable()
745 clk_disable_unprepare(imxpriv->epcs_tx_clk); in imx_sata_disable()
752 clk_disable_unprepare(imxpriv->sata_ref_clk); in imx_sata_disable()
761 struct ata_host *host = dev_get_drvdata(ap->dev); in ahci_imx_error_handler()
762 struct ahci_host_priv *hpriv = host->private_data; in ahci_imx_error_handler()
763 void __iomem *mmio = hpriv->mmio; in ahci_imx_error_handler()
764 struct imx_ahci_priv *imxpriv = hpriv->plat_data; in ahci_imx_error_handler()
768 if (!(imxpriv->first_time) || ahci_imx_hotplug) in ahci_imx_error_handler()
771 imxpriv->first_time = false; in ahci_imx_error_handler()
773 ata_for_each_dev(dev, &ap->link, ENABLED) in ahci_imx_error_handler()
783 imxpriv->no_device = true; in ahci_imx_error_handler()
785 dev_info(ap->dev, "no device found, disabling link.\n"); in ahci_imx_error_handler()
786 dev_info(ap->dev, "pass " MODULE_PARAM_PREFIX ".hotplug=1 to enable hotplug\n"); in ahci_imx_error_handler()
792 struct ata_port *ap = link->ap; in ahci_imx_softreset()
793 struct ata_host *host = dev_get_drvdata(ap->dev); in ahci_imx_softreset()
794 struct ahci_host_priv *hpriv = host->private_data; in ahci_imx_softreset()
795 struct imx_ahci_priv *imxpriv = hpriv->plat_data; in ahci_imx_softreset()
796 int ret = -EIO; in ahci_imx_softreset()
798 if (imxpriv->type == AHCI_IMX53) in ahci_imx_softreset()
821 { .compatible = "fsl,imx53-ahci", .data = (void *)AHCI_IMX53 },
822 { .compatible = "fsl,imx6q-ahci", .data = (void *)AHCI_IMX6Q },
823 { .compatible = "fsl,imx6qp-ahci", .data = (void *)AHCI_IMX6QP },
824 { .compatible = "fsl,imx8qm-ahci", .data = (void *)AHCI_IMX8QM },
918 .name = "fsl,transmit-level-mV",
923 .name = "fsl,transmit-boost-mdB",
928 .name = "fsl,transmit-atten-16ths",
933 .name = "fsl,receive-eq-mdB",
938 .name = "fsl,no-spread-spectrum",
947 struct device_node *np = dev->of_node; in imx_ahci_parse_props()
954 if (prop->num_values == 0) { in imx_ahci_parse_props()
955 if (of_property_read_bool(np, prop->name)) in imx_ahci_parse_props()
956 reg_value |= prop->set_value; in imx_ahci_parse_props()
958 reg_value |= prop->def_value; in imx_ahci_parse_props()
962 if (of_property_read_u32(np, prop->name, &of_val)) { in imx_ahci_parse_props()
964 prop->name, prop->def_value); in imx_ahci_parse_props()
965 reg_value |= prop->def_value; in imx_ahci_parse_props()
969 for (j = 0; j < prop->num_values; j++) { in imx_ahci_parse_props()
970 if (prop->values[j].of_value == of_val) { in imx_ahci_parse_props()
972 prop->name, of_val, prop->values[j].reg_value); in imx_ahci_parse_props()
973 reg_value |= prop->values[j].reg_value; in imx_ahci_parse_props()
978 if (j == prop->num_values) { in imx_ahci_parse_props()
980 prop->name); in imx_ahci_parse_props()
981 reg_value |= prop->def_value; in imx_ahci_parse_props()
996 struct platform_device *pdev = imxpriv->ahci_pdev; in imx8_sata_probe()
997 struct device_node *np = dev->of_node; in imx8_sata_probe()
999 if (of_property_read_u32(np, "fsl,phy-imp", &imxpriv->imped_ratio)) in imx8_sata_probe()
1000 imxpriv->imped_ratio = IMX8QM_SATA_PHY_IMPED_RATIO_85OHM; in imx8_sata_probe()
1003 imxpriv->phy_base = devm_ioremap(dev, phy_res->start, in imx8_sata_probe()
1005 if (!imxpriv->phy_base) { in imx8_sata_probe()
1007 return -ENOMEM; in imx8_sata_probe()
1011 return -ENOMEM; in imx8_sata_probe()
1013 imxpriv->gpr = in imx8_sata_probe()
1015 if (IS_ERR(imxpriv->gpr)) { in imx8_sata_probe()
1017 return PTR_ERR(imxpriv->gpr); in imx8_sata_probe()
1020 imxpriv->epcs_tx_clk = devm_clk_get(dev, "epcs_tx"); in imx8_sata_probe()
1021 if (IS_ERR(imxpriv->epcs_tx_clk)) { in imx8_sata_probe()
1023 return PTR_ERR(imxpriv->epcs_tx_clk); in imx8_sata_probe()
1025 imxpriv->epcs_rx_clk = devm_clk_get(dev, "epcs_rx"); in imx8_sata_probe()
1026 if (IS_ERR(imxpriv->epcs_rx_clk)) { in imx8_sata_probe()
1028 return PTR_ERR(imxpriv->epcs_rx_clk); in imx8_sata_probe()
1030 imxpriv->phy_pclk0 = devm_clk_get(dev, "phy_pclk0"); in imx8_sata_probe()
1031 if (IS_ERR(imxpriv->phy_pclk0)) { in imx8_sata_probe()
1033 return PTR_ERR(imxpriv->phy_pclk0); in imx8_sata_probe()
1035 imxpriv->phy_pclk1 = devm_clk_get(dev, "phy_pclk1"); in imx8_sata_probe()
1036 if (IS_ERR(imxpriv->phy_pclk1)) { in imx8_sata_probe()
1038 return PTR_ERR(imxpriv->phy_pclk1); in imx8_sata_probe()
1040 imxpriv->phy_apbclk = devm_clk_get(dev, "phy_apbclk"); in imx8_sata_probe()
1041 if (IS_ERR(imxpriv->phy_apbclk)) { in imx8_sata_probe()
1043 return PTR_ERR(imxpriv->phy_apbclk); in imx8_sata_probe()
1047 imxpriv->clkreq_gpio = of_get_named_gpio(np, "clkreq-gpio", 0); in imx8_sata_probe()
1048 if (gpio_is_valid(imxpriv->clkreq_gpio)) { in imx8_sata_probe()
1049 ret = devm_gpio_request_one(dev, imxpriv->clkreq_gpio, in imx8_sata_probe()
1052 if (ret == -EBUSY) { in imx8_sata_probe()
1058 } else if (imxpriv->clkreq_gpio == -EPROBE_DEFER) { in imx8_sata_probe()
1059 return imxpriv->clkreq_gpio; in imx8_sata_probe()
1067 struct device *dev = &pdev->dev; in imx_ahci_probe()
1076 return -EINVAL; in imx_ahci_probe()
1080 return -ENOMEM; in imx_ahci_probe()
1082 imxpriv->ahci_pdev = pdev; in imx_ahci_probe()
1083 imxpriv->no_device = false; in imx_ahci_probe()
1084 imxpriv->first_time = true; in imx_ahci_probe()
1085 imxpriv->type = (enum ahci_imx_type)of_id->data; in imx_ahci_probe()
1087 imxpriv->sata_clk = devm_clk_get(dev, "sata"); in imx_ahci_probe()
1088 if (IS_ERR(imxpriv->sata_clk)) { in imx_ahci_probe()
1090 return PTR_ERR(imxpriv->sata_clk); in imx_ahci_probe()
1093 imxpriv->sata_ref_clk = devm_clk_get(dev, "sata_ref"); in imx_ahci_probe()
1094 if (IS_ERR(imxpriv->sata_ref_clk)) { in imx_ahci_probe()
1096 return PTR_ERR(imxpriv->sata_ref_clk); in imx_ahci_probe()
1099 imxpriv->ahb_clk = devm_clk_get(dev, "ahb"); in imx_ahci_probe()
1100 if (IS_ERR(imxpriv->ahb_clk)) { in imx_ahci_probe()
1102 return PTR_ERR(imxpriv->ahb_clk); in imx_ahci_probe()
1105 if (imxpriv->type == AHCI_IMX6Q || imxpriv->type == AHCI_IMX6QP) { in imx_ahci_probe()
1108 imxpriv->gpr = syscon_regmap_lookup_by_compatible( in imx_ahci_probe()
1109 "fsl,imx6q-iomuxc-gpr"); in imx_ahci_probe()
1110 if (IS_ERR(imxpriv->gpr)) { in imx_ahci_probe()
1112 "failed to find fsl,imx6q-iomux-gpr regmap\n"); in imx_ahci_probe()
1113 return PTR_ERR(imxpriv->gpr); in imx_ahci_probe()
1119 imxpriv->phy_params = in imx_ahci_probe()
1124 } else if (imxpriv->type == AHCI_IMX8QM) { in imx_ahci_probe()
1134 hpriv->plat_data = imxpriv; in imx_ahci_probe()
1136 ret = clk_prepare_enable(imxpriv->sata_clk); in imx_ahci_probe()
1140 if (imxpriv->type == AHCI_IMX53 && in imx_ahci_probe()
1170 reg_val = readl(hpriv->mmio + HOST_CAP); in imx_ahci_probe()
1173 writel(reg_val, hpriv->mmio + HOST_CAP); in imx_ahci_probe()
1175 reg_val = readl(hpriv->mmio + HOST_PORTS_IMPL); in imx_ahci_probe()
1178 writel(reg_val, hpriv->mmio + HOST_PORTS_IMPL); in imx_ahci_probe()
1181 reg_val = clk_get_rate(imxpriv->ahb_clk) / 1000; in imx_ahci_probe()
1182 writel(reg_val, hpriv->mmio + IMX_TIMER1MS); in imx_ahci_probe()
1194 clk_disable_unprepare(imxpriv->sata_clk); in imx_ahci_probe()
1200 struct ahci_host_priv *hpriv = host->private_data; in ahci_imx_host_stop()
1201 struct imx_ahci_priv *imxpriv = hpriv->plat_data; in ahci_imx_host_stop()
1204 clk_disable_unprepare(imxpriv->sata_clk); in ahci_imx_host_stop()
1211 struct ahci_host_priv *hpriv = host->private_data; in imx_ahci_suspend()
1226 struct ahci_host_priv *hpriv = host->private_data; in imx_ahci_resume()
1251 MODULE_AUTHOR("Richard Zhu <Hong-Xing.Zhu@freescale.com>");