Lines Matching +full:imx6q +full:- +full:iomuxc +full:- +full:gpr

1 // SPDX-License-Identifier: GPL-2.0-only
17 #include <linux/mfd/syscon/imx6q-iomuxc-gpr.h>
20 #include <linux/hwmon-sysfs.h>
24 #define DRV_NAME "ahci-imx"
27 /* Timer 1-ms Register */
104 struct regmap *gpr; member
113 MODULE_PARM_DESC(hotplug, "AHCI IMX hot-plug support (0=Don't support, 1=support)");
137 } while (--timeout); in imx_phy_crbit_assert()
139 return timeout ? 0 : -ETIMEDOUT; in imx_phy_crbit_assert()
227 struct imx_ahci_priv *imxpriv = hpriv->plat_data; in imx_sata_phy_reset()
228 void __iomem *mmio = hpriv->mmio; in imx_sata_phy_reset()
233 if (imxpriv->type == AHCI_IMX6QP) { in imx_sata_phy_reset()
235 regmap_update_bits(imxpriv->gpr, IOMUXC_GPR5, in imx_sata_phy_reset()
238 regmap_update_bits(imxpriv->gpr, IOMUXC_GPR5, in imx_sata_phy_reset()
241 regmap_update_bits(imxpriv->gpr, IOMUXC_GPR5, in imx_sata_phy_reset()
266 } while (--timeout); in imx_sata_phy_reset()
268 return timeout ? 0 : -ETIMEDOUT; in imx_sata_phy_reset()
336 void __iomem *mmio = hpriv->mmio; in sata_ahci_read_temperature()
338 /* check rd-wr to reg */ in sata_ahci_read_temperature()
413 a = (m2 - m1) / (m2/1000); in sata_ahci_read_temperature()
414 *temp = ((-559) * a * a) / 1000 + (1379) * a + (-458000); in sata_ahci_read_temperature()
449 struct imx_ahci_priv *imxpriv = hpriv->plat_data; in imx8_sata_enable()
450 struct device *dev = &imxpriv->ahci_pdev->dev; in imx8_sata_enable()
453 ret = clk_prepare_enable(imxpriv->phy_pclk0); in imx8_sata_enable()
458 ret = clk_prepare_enable(imxpriv->phy_pclk1); in imx8_sata_enable()
463 ret = clk_prepare_enable(imxpriv->epcs_tx_clk); in imx8_sata_enable()
468 ret = clk_prepare_enable(imxpriv->epcs_rx_clk); in imx8_sata_enable()
473 ret = clk_prepare_enable(imxpriv->phy_apbclk); in imx8_sata_enable()
479 regmap_read(imxpriv->gpr, IMX8QM_CSR_PCIEA_OFFSET + in imx8_sata_enable()
483 regmap_update_bits(imxpriv->gpr, in imx8_sata_enable()
490 regmap_read(imxpriv->gpr, IMX8QM_CSR_PCIEB_OFFSET + in imx8_sata_enable()
494 regmap_update_bits(imxpriv->gpr, in imx8_sata_enable()
503 regmap_update_bits(imxpriv->gpr, in imx8_sata_enable()
512 regmap_update_bits(imxpriv->gpr, in imx8_sata_enable()
516 regmap_update_bits(imxpriv->gpr, in imx8_sata_enable()
522 regmap_update_bits(imxpriv->gpr, in imx8_sata_enable()
531 regmap_update_bits(imxpriv->gpr, in imx8_sata_enable()
535 regmap_update_bits(imxpriv->gpr, in imx8_sata_enable()
539 regmap_update_bits(imxpriv->gpr, in imx8_sata_enable()
552 regmap_update_bits(imxpriv->gpr, in imx8_sata_enable()
564 regmap_update_bits(imxpriv->gpr, in imx8_sata_enable()
569 regmap_update_bits(imxpriv->gpr, in imx8_sata_enable()
574 /* CTRL RST: SET -> delay 1 us -> CLEAR -> SET */ in imx8_sata_enable()
575 regmap_update_bits(imxpriv->gpr, in imx8_sata_enable()
580 regmap_update_bits(imxpriv->gpr, in imx8_sata_enable()
584 regmap_update_bits(imxpriv->gpr, in imx8_sata_enable()
590 regmap_update_bits(imxpriv->gpr, in imx8_sata_enable()
598 regmap_read(imxpriv->gpr, reg, &val); in imx8_sata_enable()
607 ret = -ENODEV; in imx8_sata_enable()
609 writeb(imxpriv->imped_ratio, imxpriv->phy_base + in imx8_sata_enable()
611 writeb(imxpriv->imped_ratio, imxpriv->phy_base + in imx8_sata_enable()
613 reg = readb(imxpriv->phy_base + in imx8_sata_enable()
615 if (unlikely(reg != imxpriv->imped_ratio)) in imx8_sata_enable()
617 reg = readb(imxpriv->phy_base + in imx8_sata_enable()
619 if (unlikely(reg != imxpriv->imped_ratio)) in imx8_sata_enable()
627 clk_disable_unprepare(imxpriv->phy_apbclk); in imx8_sata_enable()
628 clk_disable_unprepare(imxpriv->phy_pclk1); in imx8_sata_enable()
629 clk_disable_unprepare(imxpriv->phy_pclk0); in imx8_sata_enable()
633 clk_disable_unprepare(imxpriv->phy_apbclk); in imx8_sata_enable()
635 clk_disable_unprepare(imxpriv->epcs_rx_clk); in imx8_sata_enable()
637 clk_disable_unprepare(imxpriv->epcs_tx_clk); in imx8_sata_enable()
639 clk_disable_unprepare(imxpriv->phy_pclk1); in imx8_sata_enable()
641 clk_disable_unprepare(imxpriv->phy_pclk0); in imx8_sata_enable()
648 struct imx_ahci_priv *imxpriv = hpriv->plat_data; in imx_sata_enable()
649 struct device *dev = &imxpriv->ahci_pdev->dev; in imx_sata_enable()
652 if (imxpriv->no_device) in imx_sata_enable()
659 ret = clk_prepare_enable(imxpriv->sata_ref_clk); in imx_sata_enable()
663 if (imxpriv->type == AHCI_IMX6Q || imxpriv->type == AHCI_IMX6QP) { in imx_sata_enable()
670 regmap_update_bits(imxpriv->gpr, IOMUXC_GPR13, in imx_sata_enable()
681 imxpriv->phy_params); in imx_sata_enable()
682 regmap_update_bits(imxpriv->gpr, IOMUXC_GPR13, in imx_sata_enable()
693 } else if (imxpriv->type == AHCI_IMX8QM) { in imx_sata_enable()
702 clk_disable_unprepare(imxpriv->sata_ref_clk); in imx_sata_enable()
711 struct imx_ahci_priv *imxpriv = hpriv->plat_data; in imx_sata_disable()
713 if (imxpriv->no_device) in imx_sata_disable()
716 switch (imxpriv->type) { in imx_sata_disable()
718 regmap_update_bits(imxpriv->gpr, IOMUXC_GPR5, in imx_sata_disable()
721 regmap_update_bits(imxpriv->gpr, IOMUXC_GPR13, in imx_sata_disable()
727 regmap_update_bits(imxpriv->gpr, IOMUXC_GPR13, in imx_sata_disable()
733 clk_disable_unprepare(imxpriv->epcs_rx_clk); in imx_sata_disable()
734 clk_disable_unprepare(imxpriv->epcs_tx_clk); in imx_sata_disable()
741 clk_disable_unprepare(imxpriv->sata_ref_clk); in imx_sata_disable()
750 struct ata_host *host = dev_get_drvdata(ap->dev); in ahci_imx_error_handler()
751 struct ahci_host_priv *hpriv = host->private_data; in ahci_imx_error_handler()
752 void __iomem *mmio = hpriv->mmio; in ahci_imx_error_handler()
753 struct imx_ahci_priv *imxpriv = hpriv->plat_data; in ahci_imx_error_handler()
757 if (!(imxpriv->first_time) || ahci_imx_hotplug) in ahci_imx_error_handler()
760 imxpriv->first_time = false; in ahci_imx_error_handler()
762 ata_for_each_dev(dev, &ap->link, ENABLED) in ahci_imx_error_handler()
772 imxpriv->no_device = true; in ahci_imx_error_handler()
774 dev_info(ap->dev, "no device found, disabling link.\n"); in ahci_imx_error_handler()
775 dev_info(ap->dev, "pass " MODULE_PARAM_PREFIX ".hotplug=1 to enable hotplug\n"); in ahci_imx_error_handler()
781 struct ata_port *ap = link->ap; in ahci_imx_softreset()
782 struct ata_host *host = dev_get_drvdata(ap->dev); in ahci_imx_softreset()
783 struct ahci_host_priv *hpriv = host->private_data; in ahci_imx_softreset()
784 struct imx_ahci_priv *imxpriv = hpriv->plat_data; in ahci_imx_softreset()
787 if (imxpriv->type == AHCI_IMX53) in ahci_imx_softreset()
810 { .compatible = "fsl,imx53-ahci", .data = (void *)AHCI_IMX53 },
811 { .compatible = "fsl,imx6q-ahci", .data = (void *)AHCI_IMX6Q },
812 { .compatible = "fsl,imx6qp-ahci", .data = (void *)AHCI_IMX6QP },
813 { .compatible = "fsl,imx8qm-ahci", .data = (void *)AHCI_IMX8QM },
907 .name = "fsl,transmit-level-mV",
912 .name = "fsl,transmit-boost-mdB",
917 .name = "fsl,transmit-atten-16ths",
922 .name = "fsl,receive-eq-mdB",
927 .name = "fsl,no-spread-spectrum",
936 struct device_node *np = dev->of_node; in imx_ahci_parse_props()
943 if (prop->num_values == 0) { in imx_ahci_parse_props()
944 if (of_property_read_bool(np, prop->name)) in imx_ahci_parse_props()
945 reg_value |= prop->set_value; in imx_ahci_parse_props()
947 reg_value |= prop->def_value; in imx_ahci_parse_props()
951 if (of_property_read_u32(np, prop->name, &of_val)) { in imx_ahci_parse_props()
953 prop->name, prop->def_value); in imx_ahci_parse_props()
954 reg_value |= prop->def_value; in imx_ahci_parse_props()
958 for (j = 0; j < prop->num_values; j++) { in imx_ahci_parse_props()
959 if (prop->values[j].of_value == of_val) { in imx_ahci_parse_props()
961 prop->name, of_val, prop->values[j].reg_value); in imx_ahci_parse_props()
962 reg_value |= prop->values[j].reg_value; in imx_ahci_parse_props()
967 if (j == prop->num_values) { in imx_ahci_parse_props()
969 prop->name); in imx_ahci_parse_props()
970 reg_value |= prop->def_value; in imx_ahci_parse_props()
984 struct platform_device *pdev = imxpriv->ahci_pdev; in imx8_sata_probe()
985 struct device_node *np = dev->of_node; in imx8_sata_probe()
987 if (of_property_read_u32(np, "fsl,phy-imp", &imxpriv->imped_ratio)) in imx8_sata_probe()
988 imxpriv->imped_ratio = IMX8QM_SATA_PHY_IMPED_RATIO_85OHM; in imx8_sata_probe()
991 imxpriv->phy_base = devm_ioremap(dev, phy_res->start, in imx8_sata_probe()
993 if (!imxpriv->phy_base) { in imx8_sata_probe()
995 return -ENOMEM; in imx8_sata_probe()
999 return -ENOMEM; in imx8_sata_probe()
1001 imxpriv->gpr = in imx8_sata_probe()
1003 if (IS_ERR(imxpriv->gpr)) { in imx8_sata_probe()
1004 dev_err(dev, "unable to find gpr registers\n"); in imx8_sata_probe()
1005 return PTR_ERR(imxpriv->gpr); in imx8_sata_probe()
1008 imxpriv->epcs_tx_clk = devm_clk_get(dev, "epcs_tx"); in imx8_sata_probe()
1009 if (IS_ERR(imxpriv->epcs_tx_clk)) { in imx8_sata_probe()
1011 return PTR_ERR(imxpriv->epcs_tx_clk); in imx8_sata_probe()
1013 imxpriv->epcs_rx_clk = devm_clk_get(dev, "epcs_rx"); in imx8_sata_probe()
1014 if (IS_ERR(imxpriv->epcs_rx_clk)) { in imx8_sata_probe()
1016 return PTR_ERR(imxpriv->epcs_rx_clk); in imx8_sata_probe()
1018 imxpriv->phy_pclk0 = devm_clk_get(dev, "phy_pclk0"); in imx8_sata_probe()
1019 if (IS_ERR(imxpriv->phy_pclk0)) { in imx8_sata_probe()
1021 return PTR_ERR(imxpriv->phy_pclk0); in imx8_sata_probe()
1023 imxpriv->phy_pclk1 = devm_clk_get(dev, "phy_pclk1"); in imx8_sata_probe()
1024 if (IS_ERR(imxpriv->phy_pclk1)) { in imx8_sata_probe()
1026 return PTR_ERR(imxpriv->phy_pclk1); in imx8_sata_probe()
1028 imxpriv->phy_apbclk = devm_clk_get(dev, "phy_apbclk"); in imx8_sata_probe()
1029 if (IS_ERR(imxpriv->phy_apbclk)) { in imx8_sata_probe()
1031 return PTR_ERR(imxpriv->phy_apbclk); in imx8_sata_probe()
1035 imxpriv->clkreq_gpiod = devm_gpiod_get_optional(dev, "clkreq", in imx8_sata_probe()
1037 if (IS_ERR(imxpriv->clkreq_gpiod)) in imx8_sata_probe()
1038 return PTR_ERR(imxpriv->clkreq_gpiod); in imx8_sata_probe()
1039 if (imxpriv->clkreq_gpiod) in imx8_sata_probe()
1040 gpiod_set_consumer_name(imxpriv->clkreq_gpiod, "SATA CLKREQ"); in imx8_sata_probe()
1047 struct device *dev = &pdev->dev; in imx_ahci_probe()
1056 return -EINVAL; in imx_ahci_probe()
1060 return -ENOMEM; in imx_ahci_probe()
1062 imxpriv->ahci_pdev = pdev; in imx_ahci_probe()
1063 imxpriv->no_device = false; in imx_ahci_probe()
1064 imxpriv->first_time = true; in imx_ahci_probe()
1065 imxpriv->type = (enum ahci_imx_type)of_id->data; in imx_ahci_probe()
1067 imxpriv->sata_clk = devm_clk_get(dev, "sata"); in imx_ahci_probe()
1068 if (IS_ERR(imxpriv->sata_clk)) { in imx_ahci_probe()
1070 return PTR_ERR(imxpriv->sata_clk); in imx_ahci_probe()
1073 imxpriv->sata_ref_clk = devm_clk_get(dev, "sata_ref"); in imx_ahci_probe()
1074 if (IS_ERR(imxpriv->sata_ref_clk)) { in imx_ahci_probe()
1076 return PTR_ERR(imxpriv->sata_ref_clk); in imx_ahci_probe()
1079 imxpriv->ahb_clk = devm_clk_get(dev, "ahb"); in imx_ahci_probe()
1080 if (IS_ERR(imxpriv->ahb_clk)) { in imx_ahci_probe()
1082 return PTR_ERR(imxpriv->ahb_clk); in imx_ahci_probe()
1085 if (imxpriv->type == AHCI_IMX6Q || imxpriv->type == AHCI_IMX6QP) { in imx_ahci_probe()
1088 imxpriv->gpr = syscon_regmap_lookup_by_compatible( in imx_ahci_probe()
1089 "fsl,imx6q-iomuxc-gpr"); in imx_ahci_probe()
1090 if (IS_ERR(imxpriv->gpr)) { in imx_ahci_probe()
1092 "failed to find fsl,imx6q-iomux-gpr regmap\n"); in imx_ahci_probe()
1093 return PTR_ERR(imxpriv->gpr); in imx_ahci_probe()
1099 imxpriv->phy_params = in imx_ahci_probe()
1104 } else if (imxpriv->type == AHCI_IMX8QM) { in imx_ahci_probe()
1114 hpriv->plat_data = imxpriv; in imx_ahci_probe()
1116 ret = clk_prepare_enable(imxpriv->sata_clk); in imx_ahci_probe()
1120 if (imxpriv->type == AHCI_IMX53 && in imx_ahci_probe()
1150 reg_val = readl(hpriv->mmio + HOST_CAP); in imx_ahci_probe()
1153 writel(reg_val, hpriv->mmio + HOST_CAP); in imx_ahci_probe()
1155 reg_val = readl(hpriv->mmio + HOST_PORTS_IMPL); in imx_ahci_probe()
1158 writel(reg_val, hpriv->mmio + HOST_PORTS_IMPL); in imx_ahci_probe()
1161 reg_val = clk_get_rate(imxpriv->ahb_clk) / 1000; in imx_ahci_probe()
1162 writel(reg_val, hpriv->mmio + IMX_TIMER1MS); in imx_ahci_probe()
1174 clk_disable_unprepare(imxpriv->sata_clk); in imx_ahci_probe()
1180 struct ahci_host_priv *hpriv = host->private_data; in ahci_imx_host_stop()
1181 struct imx_ahci_priv *imxpriv = hpriv->plat_data; in ahci_imx_host_stop()
1184 clk_disable_unprepare(imxpriv->sata_clk); in ahci_imx_host_stop()
1191 struct ahci_host_priv *hpriv = host->private_data; in imx_ahci_suspend()
1206 struct ahci_host_priv *hpriv = host->private_data; in imx_ahci_resume()
1231 MODULE_AUTHOR("Richard Zhu <Hong-Xing.Zhu@freescale.com>");