0001
0002
0003
0004
0005
0006
0007
0008
0009
0010 #include <linux/bitfield.h>
0011 #include <linux/bitops.h>
0012 #include <linux/clk.h>
0013 #include <linux/module.h>
0014 #include <linux/of_device.h>
0015 #include <linux/phy/phy.h>
0016 #include <linux/regmap.h>
0017 #include <linux/reset.h>
0018 #include <linux/platform_device.h>
0019 #include <dt-bindings/phy/phy.h>
0020
0021 #define PHY_R0 0x00
0022 #define PHY_R0_PCIE_POWER_STATE GENMASK(4, 0)
0023 #define PHY_R0_PCIE_USB3_SWITCH GENMASK(6, 5)
0024
0025 #define PHY_R1 0x04
0026 #define PHY_R1_PHY_TX1_TERM_OFFSET GENMASK(4, 0)
0027 #define PHY_R1_PHY_TX0_TERM_OFFSET GENMASK(9, 5)
0028 #define PHY_R1_PHY_RX1_EQ GENMASK(12, 10)
0029 #define PHY_R1_PHY_RX0_EQ GENMASK(15, 13)
0030 #define PHY_R1_PHY_LOS_LEVEL GENMASK(20, 16)
0031 #define PHY_R1_PHY_LOS_BIAS GENMASK(23, 21)
0032 #define PHY_R1_PHY_REF_CLKDIV2 BIT(24)
0033 #define PHY_R1_PHY_MPLL_MULTIPLIER GENMASK(31, 25)
0034
0035 #define PHY_R2 0x08
0036 #define PHY_R2_PCS_TX_DEEMPH_GEN2_6DB GENMASK(5, 0)
0037 #define PHY_R2_PCS_TX_DEEMPH_GEN2_3P5DB GENMASK(11, 6)
0038 #define PHY_R2_PCS_TX_DEEMPH_GEN1 GENMASK(17, 12)
0039 #define PHY_R2_PHY_TX_VBOOST_LVL GENMASK(20, 18)
0040
0041 #define PHY_R4 0x10
0042 #define PHY_R4_PHY_CR_WRITE BIT(0)
0043 #define PHY_R4_PHY_CR_READ BIT(1)
0044 #define PHY_R4_PHY_CR_DATA_IN GENMASK(17, 2)
0045 #define PHY_R4_PHY_CR_CAP_DATA BIT(18)
0046 #define PHY_R4_PHY_CR_CAP_ADDR BIT(19)
0047
0048 #define PHY_R5 0x14
0049 #define PHY_R5_PHY_CR_DATA_OUT GENMASK(15, 0)
0050 #define PHY_R5_PHY_CR_ACK BIT(16)
0051 #define PHY_R5_PHY_BS_OUT BIT(17)
0052
0053 #define PCIE_RESET_DELAY 500
0054
0055 struct phy_g12a_usb3_pcie_priv {
0056 struct regmap *regmap;
0057 struct regmap *regmap_cr;
0058 struct clk *clk_ref;
0059 struct reset_control *reset;
0060 struct phy *phy;
0061 unsigned int mode;
0062 };
0063
0064 static const struct regmap_config phy_g12a_usb3_pcie_regmap_conf = {
0065 .reg_bits = 8,
0066 .val_bits = 32,
0067 .reg_stride = 4,
0068 .max_register = PHY_R5,
0069 };
0070
0071 static int phy_g12a_usb3_pcie_cr_bus_addr(struct phy_g12a_usb3_pcie_priv *priv,
0072 unsigned int addr)
0073 {
0074 unsigned int val, reg;
0075 int ret;
0076
0077 reg = FIELD_PREP(PHY_R4_PHY_CR_DATA_IN, addr);
0078
0079 regmap_write(priv->regmap, PHY_R4, reg);
0080 regmap_write(priv->regmap, PHY_R4, reg);
0081
0082 regmap_write(priv->regmap, PHY_R4, reg | PHY_R4_PHY_CR_CAP_ADDR);
0083
0084 ret = regmap_read_poll_timeout(priv->regmap, PHY_R5, val,
0085 (val & PHY_R5_PHY_CR_ACK),
0086 5, 1000);
0087 if (ret)
0088 return ret;
0089
0090 regmap_write(priv->regmap, PHY_R4, reg);
0091
0092 ret = regmap_read_poll_timeout(priv->regmap, PHY_R5, val,
0093 !(val & PHY_R5_PHY_CR_ACK),
0094 5, 1000);
0095 if (ret)
0096 return ret;
0097
0098 return 0;
0099 }
0100
0101 static int phy_g12a_usb3_pcie_cr_bus_read(void *context, unsigned int addr,
0102 unsigned int *data)
0103 {
0104 struct phy_g12a_usb3_pcie_priv *priv = context;
0105 unsigned int val;
0106 int ret;
0107
0108 ret = phy_g12a_usb3_pcie_cr_bus_addr(priv, addr);
0109 if (ret)
0110 return ret;
0111
0112 regmap_write(priv->regmap, PHY_R4, 0);
0113 regmap_write(priv->regmap, PHY_R4, PHY_R4_PHY_CR_READ);
0114
0115 ret = regmap_read_poll_timeout(priv->regmap, PHY_R5, val,
0116 (val & PHY_R5_PHY_CR_ACK),
0117 5, 1000);
0118 if (ret)
0119 return ret;
0120
0121 *data = FIELD_GET(PHY_R5_PHY_CR_DATA_OUT, val);
0122
0123 regmap_write(priv->regmap, PHY_R4, 0);
0124
0125 ret = regmap_read_poll_timeout(priv->regmap, PHY_R5, val,
0126 !(val & PHY_R5_PHY_CR_ACK),
0127 5, 1000);
0128 if (ret)
0129 return ret;
0130
0131 return 0;
0132 }
0133
0134 static int phy_g12a_usb3_pcie_cr_bus_write(void *context, unsigned int addr,
0135 unsigned int data)
0136 {
0137 struct phy_g12a_usb3_pcie_priv *priv = context;
0138 unsigned int val, reg;
0139 int ret;
0140
0141 ret = phy_g12a_usb3_pcie_cr_bus_addr(priv, addr);
0142 if (ret)
0143 return ret;
0144
0145 reg = FIELD_PREP(PHY_R4_PHY_CR_DATA_IN, data);
0146
0147 regmap_write(priv->regmap, PHY_R4, reg);
0148 regmap_write(priv->regmap, PHY_R4, reg);
0149
0150 regmap_write(priv->regmap, PHY_R4, reg | PHY_R4_PHY_CR_CAP_DATA);
0151
0152 ret = regmap_read_poll_timeout(priv->regmap, PHY_R5, val,
0153 (val & PHY_R5_PHY_CR_ACK),
0154 5, 1000);
0155 if (ret)
0156 return ret;
0157
0158 regmap_write(priv->regmap, PHY_R4, reg);
0159
0160 ret = regmap_read_poll_timeout(priv->regmap, PHY_R5, val,
0161 (val & PHY_R5_PHY_CR_ACK) == 0,
0162 5, 1000);
0163 if (ret)
0164 return ret;
0165
0166 regmap_write(priv->regmap, PHY_R4, reg);
0167
0168 regmap_write(priv->regmap, PHY_R4, reg | PHY_R4_PHY_CR_WRITE);
0169
0170 ret = regmap_read_poll_timeout(priv->regmap, PHY_R5, val,
0171 (val & PHY_R5_PHY_CR_ACK),
0172 5, 1000);
0173 if (ret)
0174 return ret;
0175
0176 regmap_write(priv->regmap, PHY_R4, reg);
0177
0178 ret = regmap_read_poll_timeout(priv->regmap, PHY_R5, val,
0179 (val & PHY_R5_PHY_CR_ACK) == 0,
0180 5, 1000);
0181 if (ret)
0182 return ret;
0183
0184 return 0;
0185 }
0186
0187 static const struct regmap_config phy_g12a_usb3_pcie_cr_regmap_conf = {
0188 .reg_bits = 16,
0189 .val_bits = 16,
0190 .reg_read = phy_g12a_usb3_pcie_cr_bus_read,
0191 .reg_write = phy_g12a_usb3_pcie_cr_bus_write,
0192 .max_register = 0xffff,
0193 .disable_locking = true,
0194 };
0195
0196 static int phy_g12a_usb3_init(struct phy *phy)
0197 {
0198 struct phy_g12a_usb3_pcie_priv *priv = phy_get_drvdata(phy);
0199 int data, ret;
0200
0201 ret = reset_control_reset(priv->reset);
0202 if (ret)
0203 return ret;
0204
0205
0206
0207 regmap_update_bits(priv->regmap, PHY_R0,
0208 PHY_R0_PCIE_USB3_SWITCH,
0209 PHY_R0_PCIE_USB3_SWITCH);
0210
0211
0212
0213
0214
0215
0216
0217
0218 ret = regmap_update_bits(priv->regmap_cr, 0x102d, BIT(7), BIT(7));
0219 if (ret)
0220 return ret;
0221
0222 ret = regmap_update_bits(priv->regmap_cr, 0x1010, 0xff0, 20);
0223 if (ret)
0224 return ret;
0225
0226
0227
0228
0229
0230
0231
0232
0233 ret = regmap_read(priv->regmap_cr, 0x1006, &data);
0234 if (ret)
0235 return ret;
0236
0237 data &= ~BIT(6);
0238 data |= BIT(7);
0239 data &= ~(0x7 << 8);
0240 data |= (0x3 << 8);
0241 data |= (1 << 11);
0242 ret = regmap_write(priv->regmap_cr, 0x1006, data);
0243 if (ret)
0244 return ret;
0245
0246
0247
0248
0249
0250
0251
0252 ret = regmap_read(priv->regmap_cr, 0x1002, &data);
0253 if (ret)
0254 return ret;
0255
0256 data &= ~0x3f80;
0257 data |= (0x16 << 7);
0258 data &= ~0x7f;
0259 data |= (0x7f | BIT(14));
0260 ret = regmap_write(priv->regmap_cr, 0x1002, data);
0261 if (ret)
0262 return ret;
0263
0264
0265 ret = regmap_update_bits(priv->regmap_cr, 0x30, 0xf << 4, 8 << 4);
0266 if (ret)
0267 return ret;
0268
0269 regmap_update_bits(priv->regmap, PHY_R2,
0270 PHY_R2_PHY_TX_VBOOST_LVL,
0271 FIELD_PREP(PHY_R2_PHY_TX_VBOOST_LVL, 0x4));
0272
0273 regmap_update_bits(priv->regmap, PHY_R1,
0274 PHY_R1_PHY_LOS_BIAS | PHY_R1_PHY_LOS_LEVEL,
0275 FIELD_PREP(PHY_R1_PHY_LOS_BIAS, 4) |
0276 FIELD_PREP(PHY_R1_PHY_LOS_LEVEL, 9));
0277
0278 return 0;
0279 }
0280
0281 static int phy_g12a_usb3_pcie_power_on(struct phy *phy)
0282 {
0283 struct phy_g12a_usb3_pcie_priv *priv = phy_get_drvdata(phy);
0284
0285 if (priv->mode == PHY_TYPE_USB3)
0286 return 0;
0287
0288 regmap_update_bits(priv->regmap, PHY_R0,
0289 PHY_R0_PCIE_POWER_STATE,
0290 FIELD_PREP(PHY_R0_PCIE_POWER_STATE, 0x1c));
0291
0292 return 0;
0293 }
0294
0295 static int phy_g12a_usb3_pcie_power_off(struct phy *phy)
0296 {
0297 struct phy_g12a_usb3_pcie_priv *priv = phy_get_drvdata(phy);
0298
0299 if (priv->mode == PHY_TYPE_USB3)
0300 return 0;
0301
0302 regmap_update_bits(priv->regmap, PHY_R0,
0303 PHY_R0_PCIE_POWER_STATE,
0304 FIELD_PREP(PHY_R0_PCIE_POWER_STATE, 0x1d));
0305
0306 return 0;
0307 }
0308
0309 static int phy_g12a_usb3_pcie_reset(struct phy *phy)
0310 {
0311 struct phy_g12a_usb3_pcie_priv *priv = phy_get_drvdata(phy);
0312 int ret;
0313
0314 if (priv->mode == PHY_TYPE_USB3)
0315 return 0;
0316
0317 ret = reset_control_assert(priv->reset);
0318 if (ret)
0319 return ret;
0320
0321 udelay(PCIE_RESET_DELAY);
0322
0323 ret = reset_control_deassert(priv->reset);
0324 if (ret)
0325 return ret;
0326
0327 udelay(PCIE_RESET_DELAY);
0328
0329 return 0;
0330 }
0331
0332 static int phy_g12a_usb3_pcie_init(struct phy *phy)
0333 {
0334 struct phy_g12a_usb3_pcie_priv *priv = phy_get_drvdata(phy);
0335
0336 if (priv->mode == PHY_TYPE_USB3)
0337 return phy_g12a_usb3_init(phy);
0338
0339 return 0;
0340 }
0341
0342 static int phy_g12a_usb3_pcie_exit(struct phy *phy)
0343 {
0344 struct phy_g12a_usb3_pcie_priv *priv = phy_get_drvdata(phy);
0345
0346 if (priv->mode == PHY_TYPE_USB3)
0347 return reset_control_reset(priv->reset);
0348
0349 return 0;
0350 }
0351
0352 static struct phy *phy_g12a_usb3_pcie_xlate(struct device *dev,
0353 struct of_phandle_args *args)
0354 {
0355 struct phy_g12a_usb3_pcie_priv *priv = dev_get_drvdata(dev);
0356 unsigned int mode;
0357
0358 if (args->args_count < 1) {
0359 dev_err(dev, "invalid number of arguments\n");
0360 return ERR_PTR(-EINVAL);
0361 }
0362
0363 mode = args->args[0];
0364
0365 if (mode != PHY_TYPE_USB3 && mode != PHY_TYPE_PCIE) {
0366 dev_err(dev, "invalid phy mode select argument\n");
0367 return ERR_PTR(-EINVAL);
0368 }
0369
0370 priv->mode = mode;
0371
0372 return priv->phy;
0373 }
0374
0375 static const struct phy_ops phy_g12a_usb3_pcie_ops = {
0376 .init = phy_g12a_usb3_pcie_init,
0377 .exit = phy_g12a_usb3_pcie_exit,
0378 .power_on = phy_g12a_usb3_pcie_power_on,
0379 .power_off = phy_g12a_usb3_pcie_power_off,
0380 .reset = phy_g12a_usb3_pcie_reset,
0381 .owner = THIS_MODULE,
0382 };
0383
0384 static int phy_g12a_usb3_pcie_probe(struct platform_device *pdev)
0385 {
0386 struct device *dev = &pdev->dev;
0387 struct device_node *np = dev->of_node;
0388 struct phy_g12a_usb3_pcie_priv *priv;
0389 struct phy_provider *phy_provider;
0390 void __iomem *base;
0391 int ret;
0392
0393 priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
0394 if (!priv)
0395 return -ENOMEM;
0396
0397 base = devm_platform_ioremap_resource(pdev, 0);
0398 if (IS_ERR(base))
0399 return PTR_ERR(base);
0400
0401 priv->regmap = devm_regmap_init_mmio(dev, base,
0402 &phy_g12a_usb3_pcie_regmap_conf);
0403 if (IS_ERR(priv->regmap))
0404 return PTR_ERR(priv->regmap);
0405
0406 priv->regmap_cr = devm_regmap_init(dev, NULL, priv,
0407 &phy_g12a_usb3_pcie_cr_regmap_conf);
0408 if (IS_ERR(priv->regmap_cr))
0409 return PTR_ERR(priv->regmap_cr);
0410
0411 priv->clk_ref = devm_clk_get(dev, "ref_clk");
0412 if (IS_ERR(priv->clk_ref))
0413 return PTR_ERR(priv->clk_ref);
0414
0415 ret = clk_prepare_enable(priv->clk_ref);
0416 if (ret)
0417 return ret;
0418
0419 priv->reset = devm_reset_control_array_get_exclusive(dev);
0420 if (IS_ERR(priv->reset)) {
0421 ret = PTR_ERR(priv->reset);
0422 goto err_disable_clk_ref;
0423 }
0424
0425 priv->phy = devm_phy_create(dev, np, &phy_g12a_usb3_pcie_ops);
0426 if (IS_ERR(priv->phy)) {
0427 ret = PTR_ERR(priv->phy);
0428 dev_err_probe(dev, ret, "failed to create PHY\n");
0429 goto err_disable_clk_ref;
0430 }
0431
0432 phy_set_drvdata(priv->phy, priv);
0433 dev_set_drvdata(dev, priv);
0434
0435 phy_provider = devm_of_phy_provider_register(dev,
0436 phy_g12a_usb3_pcie_xlate);
0437 if (IS_ERR(phy_provider)) {
0438 ret = PTR_ERR(phy_provider);
0439 goto err_disable_clk_ref;
0440 }
0441
0442 return 0;
0443
0444 err_disable_clk_ref:
0445 clk_disable_unprepare(priv->clk_ref);
0446
0447 return ret;
0448 }
0449
0450 static const struct of_device_id phy_g12a_usb3_pcie_of_match[] = {
0451 { .compatible = "amlogic,g12a-usb3-pcie-phy", },
0452 { },
0453 };
0454 MODULE_DEVICE_TABLE(of, phy_g12a_usb3_pcie_of_match);
0455
0456 static struct platform_driver phy_g12a_usb3_pcie_driver = {
0457 .probe = phy_g12a_usb3_pcie_probe,
0458 .driver = {
0459 .name = "phy-g12a-usb3-pcie",
0460 .of_match_table = phy_g12a_usb3_pcie_of_match,
0461 },
0462 };
0463 module_platform_driver(phy_g12a_usb3_pcie_driver);
0464
0465 MODULE_AUTHOR("Neil Armstrong <narmstrong@baylibre.com>");
0466 MODULE_DESCRIPTION("Amlogic G12A USB3 + PCIE Combo PHY driver");
0467 MODULE_LICENSE("GPL v2");