Lines Matching +full:ipq806x +full:- +full:sata +full:- +full:phy
1 // SPDX-License-Identifier: GPL-2.0-only
16 #include <linux/phy/phy.h>
53 static int qcom_ipq806x_sata_phy_init(struct phy *generic_phy) in qcom_ipq806x_sata_phy_init()
55 struct qcom_ipq806x_sata_phy *phy = phy_get_drvdata(generic_phy); in qcom_ipq806x_sata_phy_init() local
59 reg = readl_relaxed(phy->mmio + SATA_PHY_P0_PARAM3); in qcom_ipq806x_sata_phy_init()
61 writel_relaxed(reg, phy->mmio + SATA_PHY_P0_PARAM3); in qcom_ipq806x_sata_phy_init()
63 reg = readl_relaxed(phy->mmio + SATA_PHY_P0_PARAM0) & in qcom_ipq806x_sata_phy_init()
68 writel_relaxed(reg, phy->mmio + SATA_PHY_P0_PARAM0); in qcom_ipq806x_sata_phy_init()
70 reg = readl_relaxed(phy->mmio + SATA_PHY_P0_PARAM1) & in qcom_ipq806x_sata_phy_init()
77 writel_relaxed(reg, phy->mmio + SATA_PHY_P0_PARAM1); in qcom_ipq806x_sata_phy_init()
79 reg = readl_relaxed(phy->mmio + SATA_PHY_P0_PARAM2) & in qcom_ipq806x_sata_phy_init()
82 writel_relaxed(reg, phy->mmio + SATA_PHY_P0_PARAM2); in qcom_ipq806x_sata_phy_init()
85 reg = readl_relaxed(phy->mmio + SATA_PHY_P0_PARAM4); in qcom_ipq806x_sata_phy_init()
87 writel_relaxed(reg, phy->mmio + SATA_PHY_P0_PARAM4); in qcom_ipq806x_sata_phy_init()
90 reg = readl_relaxed(phy->mmio + SATA_PHY_P0_PARAM4); in qcom_ipq806x_sata_phy_init()
92 writel_relaxed(reg, phy->mmio + SATA_PHY_P0_PARAM4); in qcom_ipq806x_sata_phy_init()
94 /* make sure all changes complete before we let the PHY out of reset */ in qcom_ipq806x_sata_phy_init()
101 reg = readl_relaxed(phy->mmio + SATA_PHY_P0_PARAM4); in qcom_ipq806x_sata_phy_init()
103 writel_relaxed(reg, phy->mmio + SATA_PHY_P0_PARAM4); in qcom_ipq806x_sata_phy_init()
108 static int qcom_ipq806x_sata_phy_exit(struct phy *generic_phy) in qcom_ipq806x_sata_phy_exit()
110 struct qcom_ipq806x_sata_phy *phy = phy_get_drvdata(generic_phy); in qcom_ipq806x_sata_phy_exit() local
114 reg = readl_relaxed(phy->mmio + SATA_PHY_P0_PARAM4); in qcom_ipq806x_sata_phy_exit()
116 writel_relaxed(reg, phy->mmio + SATA_PHY_P0_PARAM4); in qcom_ipq806x_sata_phy_exit()
129 struct qcom_ipq806x_sata_phy *phy; in qcom_ipq806x_sata_phy_probe() local
130 struct device *dev = &pdev->dev; in qcom_ipq806x_sata_phy_probe()
132 struct phy *generic_phy; in qcom_ipq806x_sata_phy_probe()
135 phy = devm_kzalloc(dev, sizeof(*phy), GFP_KERNEL); in qcom_ipq806x_sata_phy_probe()
136 if (!phy) in qcom_ipq806x_sata_phy_probe()
137 return -ENOMEM; in qcom_ipq806x_sata_phy_probe()
139 phy->mmio = devm_platform_ioremap_resource(pdev, 0); in qcom_ipq806x_sata_phy_probe()
140 if (IS_ERR(phy->mmio)) in qcom_ipq806x_sata_phy_probe()
141 return PTR_ERR(phy->mmio); in qcom_ipq806x_sata_phy_probe()
145 dev_err(dev, "%s: failed to create phy\n", __func__); in qcom_ipq806x_sata_phy_probe()
149 phy->dev = dev; in qcom_ipq806x_sata_phy_probe()
150 phy_set_drvdata(generic_phy, phy); in qcom_ipq806x_sata_phy_probe()
151 platform_set_drvdata(pdev, phy); in qcom_ipq806x_sata_phy_probe()
153 phy->cfg_clk = devm_clk_get(dev, "cfg"); in qcom_ipq806x_sata_phy_probe()
154 if (IS_ERR(phy->cfg_clk)) { in qcom_ipq806x_sata_phy_probe()
155 dev_err(dev, "Failed to get sata cfg clock\n"); in qcom_ipq806x_sata_phy_probe()
156 return PTR_ERR(phy->cfg_clk); in qcom_ipq806x_sata_phy_probe()
159 ret = clk_prepare_enable(phy->cfg_clk); in qcom_ipq806x_sata_phy_probe()
165 clk_disable_unprepare(phy->cfg_clk); in qcom_ipq806x_sata_phy_probe()
166 dev_err(dev, "%s: failed to register phy\n", __func__); in qcom_ipq806x_sata_phy_probe()
175 struct qcom_ipq806x_sata_phy *phy = platform_get_drvdata(pdev); in qcom_ipq806x_sata_phy_remove() local
177 clk_disable_unprepare(phy->cfg_clk); in qcom_ipq806x_sata_phy_remove()
181 { .compatible = "qcom,ipq806x-sata-phy" },
190 .name = "qcom-ipq806x-sata-phy",
196 MODULE_DESCRIPTION("QCOM IPQ806x SATA PHY driver");