Lines Matching +full:axg +full:- +full:pcie +full:- +full:phy

1 // SPDX-License-Identifier: GPL-2.0
3 * Amlogic AXG MIPI + PCIE analog PHY driver
10 #include <linux/phy/phy.h>
15 #include <dt-bindings/phy/phy.h>
48 struct phy *phy; member
58 regmap_update_bits(priv->regmap, HHI_MIPI_CNTL0, in phy_bandgap_enable()
61 regmap_update_bits(priv->regmap, HHI_MIPI_CNTL0, in phy_bandgap_enable()
67 regmap_update_bits(priv->regmap, HHI_MIPI_CNTL0, in phy_bandgap_disable()
69 regmap_update_bits(priv->regmap, HHI_MIPI_CNTL0, in phy_bandgap_disable()
77 regmap_update_bits(priv->regmap, HHI_MIPI_CNTL0, in phy_dsi_analog_enable()
80 regmap_update_bits(priv->regmap, HHI_MIPI_CNTL0, in phy_dsi_analog_enable()
82 regmap_update_bits(priv->regmap, HHI_MIPI_CNTL0, in phy_dsi_analog_enable()
86 regmap_write(priv->regmap, HHI_MIPI_CNTL1, 0x001e); in phy_dsi_analog_enable()
88 regmap_write(priv->regmap, HHI_MIPI_CNTL2, in phy_dsi_analog_enable()
92 switch (priv->config.lanes) { in phy_dsi_analog_enable()
109 regmap_update_bits(priv->regmap, HHI_MIPI_CNTL2, in phy_dsi_analog_enable()
113 priv->dsi_enabled = true; in phy_dsi_analog_enable()
118 regmap_update_bits(priv->regmap, HHI_MIPI_CNTL0, in phy_dsi_analog_disable()
121 regmap_update_bits(priv->regmap, HHI_MIPI_CNTL0, BIT(31), 0); in phy_dsi_analog_disable()
122 regmap_update_bits(priv->regmap, HHI_MIPI_CNTL0, in phy_dsi_analog_disable()
125 regmap_write(priv->regmap, HHI_MIPI_CNTL1, 0x6); in phy_dsi_analog_disable()
127 regmap_write(priv->regmap, HHI_MIPI_CNTL2, 0x00200000); in phy_dsi_analog_disable()
129 priv->dsi_enabled = false; in phy_dsi_analog_disable()
132 static int phy_axg_mipi_pcie_analog_configure(struct phy *phy, in phy_axg_mipi_pcie_analog_configure() argument
135 struct phy_axg_mipi_pcie_analog_priv *priv = phy_get_drvdata(phy); in phy_axg_mipi_pcie_analog_configure()
138 ret = phy_mipi_dphy_config_validate(&opts->mipi_dphy); in phy_axg_mipi_pcie_analog_configure()
142 memcpy(&priv->config, opts, sizeof(priv->config)); in phy_axg_mipi_pcie_analog_configure()
144 priv->dsi_configured = true; in phy_axg_mipi_pcie_analog_configure()
146 /* If PHY was already powered on, setup the DSI analog part */ in phy_axg_mipi_pcie_analog_configure()
147 if (priv->powered) { in phy_axg_mipi_pcie_analog_configure()
149 if (priv->dsi_enabled) in phy_axg_mipi_pcie_analog_configure()
160 static int phy_axg_mipi_pcie_analog_power_on(struct phy *phy) in phy_axg_mipi_pcie_analog_power_on() argument
162 struct phy_axg_mipi_pcie_analog_priv *priv = phy_get_drvdata(phy); in phy_axg_mipi_pcie_analog_power_on()
166 if (priv->dsi_configured) in phy_axg_mipi_pcie_analog_power_on()
169 priv->powered = true; in phy_axg_mipi_pcie_analog_power_on()
174 static int phy_axg_mipi_pcie_analog_power_off(struct phy *phy) in phy_axg_mipi_pcie_analog_power_off() argument
176 struct phy_axg_mipi_pcie_analog_priv *priv = phy_get_drvdata(phy); in phy_axg_mipi_pcie_analog_power_off()
180 if (priv->dsi_enabled) in phy_axg_mipi_pcie_analog_power_off()
183 priv->powered = false; in phy_axg_mipi_pcie_analog_power_off()
197 struct phy_provider *phy; in phy_axg_mipi_pcie_analog_probe() local
198 struct device *dev = &pdev->dev; in phy_axg_mipi_pcie_analog_probe()
200 struct device_node *np = dev->of_node; in phy_axg_mipi_pcie_analog_probe()
206 return -ENOMEM; in phy_axg_mipi_pcie_analog_probe()
209 map = syscon_node_to_regmap(of_get_parent(dev->of_node)); in phy_axg_mipi_pcie_analog_probe()
216 priv->regmap = map; in phy_axg_mipi_pcie_analog_probe()
218 priv->phy = devm_phy_create(dev, np, &phy_axg_mipi_pcie_analog_ops); in phy_axg_mipi_pcie_analog_probe()
219 if (IS_ERR(priv->phy)) { in phy_axg_mipi_pcie_analog_probe()
220 ret = PTR_ERR(priv->phy); in phy_axg_mipi_pcie_analog_probe()
221 if (ret != -EPROBE_DEFER) in phy_axg_mipi_pcie_analog_probe()
222 dev_err(dev, "failed to create PHY\n"); in phy_axg_mipi_pcie_analog_probe()
226 phy_set_drvdata(priv->phy, priv); in phy_axg_mipi_pcie_analog_probe()
229 phy = devm_of_phy_provider_register(dev, of_phy_simple_xlate); in phy_axg_mipi_pcie_analog_probe()
231 return PTR_ERR_OR_ZERO(phy); in phy_axg_mipi_pcie_analog_probe()
236 .compatible = "amlogic,axg-mipi-pcie-analog-phy",
245 .name = "phy-axg-mipi-pcie-analog",
252 MODULE_DESCRIPTION("Amlogic AXG MIPI + PCIE analog PHY driver");