1 // SPDX-License-Identifier: GPL-2.0 2 /* 3 * Amlogic G12A USB3 + PCIE Combo PHY driver 4 * 5 * Copyright (C) 2017 Amlogic, Inc. All rights reserved 6 * Copyright (C) 2019 BayLibre, SAS 7 * Author: Neil Armstrong <narmstrong@baylibre.com> 8 */ 9 10 #include <linux/bitfield.h> 11 #include <linux/bitops.h> 12 #include <linux/clk.h> 13 #include <linux/module.h> 14 #include <linux/of_device.h> 15 #include <linux/phy/phy.h> 16 #include <linux/regmap.h> 17 #include <linux/reset.h> 18 #include <linux/platform_device.h> 19 #include <dt-bindings/phy/phy.h> 20 21 #define PHY_R0 0x00 22 #define PHY_R0_PCIE_POWER_STATE GENMASK(4, 0) 23 #define PHY_R0_PCIE_USB3_SWITCH GENMASK(6, 5) 24 25 #define PHY_R1 0x04 26 #define PHY_R1_PHY_TX1_TERM_OFFSET GENMASK(4, 0) 27 #define PHY_R1_PHY_TX0_TERM_OFFSET GENMASK(9, 5) 28 #define PHY_R1_PHY_RX1_EQ GENMASK(12, 10) 29 #define PHY_R1_PHY_RX0_EQ GENMASK(15, 13) 30 #define PHY_R1_PHY_LOS_LEVEL GENMASK(20, 16) 31 #define PHY_R1_PHY_LOS_BIAS GENMASK(23, 21) 32 #define PHY_R1_PHY_REF_CLKDIV2 BIT(24) 33 #define PHY_R1_PHY_MPLL_MULTIPLIER GENMASK(31, 25) 34 35 #define PHY_R2 0x08 36 #define PHY_R2_PCS_TX_DEEMPH_GEN2_6DB GENMASK(5, 0) 37 #define PHY_R2_PCS_TX_DEEMPH_GEN2_3P5DB GENMASK(11, 6) 38 #define PHY_R2_PCS_TX_DEEMPH_GEN1 GENMASK(17, 12) 39 #define PHY_R2_PHY_TX_VBOOST_LVL GENMASK(20, 18) 40 41 #define PHY_R4 0x10 42 #define PHY_R4_PHY_CR_WRITE BIT(0) 43 #define PHY_R4_PHY_CR_READ BIT(1) 44 #define PHY_R4_PHY_CR_DATA_IN GENMASK(17, 2) 45 #define PHY_R4_PHY_CR_CAP_DATA BIT(18) 46 #define PHY_R4_PHY_CR_CAP_ADDR BIT(19) 47 48 #define PHY_R5 0x14 49 #define PHY_R5_PHY_CR_DATA_OUT GENMASK(15, 0) 50 #define PHY_R5_PHY_CR_ACK BIT(16) 51 #define PHY_R5_PHY_BS_OUT BIT(17) 52 53 struct phy_g12a_usb3_pcie_priv { 54 struct regmap *regmap; 55 struct regmap *regmap_cr; 56 struct clk *clk_ref; 57 struct reset_control *reset; 58 struct phy *phy; 59 unsigned int mode; 60 }; 61 62 static const struct regmap_config phy_g12a_usb3_pcie_regmap_conf = { 63 .reg_bits = 8, 64 .val_bits = 32, 65 .reg_stride = 4, 66 .max_register = PHY_R5, 67 }; 68 69 static int phy_g12a_usb3_pcie_cr_bus_addr(struct phy_g12a_usb3_pcie_priv *priv, 70 unsigned int addr) 71 { 72 unsigned int val, reg; 73 int ret; 74 75 reg = FIELD_PREP(PHY_R4_PHY_CR_DATA_IN, addr); 76 77 regmap_write(priv->regmap, PHY_R4, reg); 78 regmap_write(priv->regmap, PHY_R4, reg); 79 80 regmap_write(priv->regmap, PHY_R4, reg | PHY_R4_PHY_CR_CAP_ADDR); 81 82 ret = regmap_read_poll_timeout(priv->regmap, PHY_R5, val, 83 (val & PHY_R5_PHY_CR_ACK), 84 5, 1000); 85 if (ret) 86 return ret; 87 88 regmap_write(priv->regmap, PHY_R4, reg); 89 90 ret = regmap_read_poll_timeout(priv->regmap, PHY_R5, val, 91 !(val & PHY_R5_PHY_CR_ACK), 92 5, 1000); 93 if (ret) 94 return ret; 95 96 return 0; 97 } 98 99 static int phy_g12a_usb3_pcie_cr_bus_read(void *context, unsigned int addr, 100 unsigned int *data) 101 { 102 struct phy_g12a_usb3_pcie_priv *priv = context; 103 unsigned int val; 104 int ret; 105 106 ret = phy_g12a_usb3_pcie_cr_bus_addr(priv, addr); 107 if (ret) 108 return ret; 109 110 regmap_write(priv->regmap, PHY_R4, 0); 111 regmap_write(priv->regmap, PHY_R4, PHY_R4_PHY_CR_READ); 112 113 ret = regmap_read_poll_timeout(priv->regmap, PHY_R5, val, 114 (val & PHY_R5_PHY_CR_ACK), 115 5, 1000); 116 if (ret) 117 return ret; 118 119 *data = FIELD_GET(PHY_R5_PHY_CR_DATA_OUT, val); 120 121 regmap_write(priv->regmap, PHY_R4, 0); 122 123 ret = regmap_read_poll_timeout(priv->regmap, PHY_R5, val, 124 !(val & PHY_R5_PHY_CR_ACK), 125 5, 1000); 126 if (ret) 127 return ret; 128 129 return 0; 130 } 131 132 static int phy_g12a_usb3_pcie_cr_bus_write(void *context, unsigned int addr, 133 unsigned int data) 134 { 135 struct phy_g12a_usb3_pcie_priv *priv = context; 136 unsigned int val, reg; 137 int ret; 138 139 ret = phy_g12a_usb3_pcie_cr_bus_addr(priv, addr); 140 if (ret) 141 return ret; 142 143 reg = FIELD_PREP(PHY_R4_PHY_CR_DATA_IN, data); 144 145 regmap_write(priv->regmap, PHY_R4, reg); 146 regmap_write(priv->regmap, PHY_R4, reg); 147 148 regmap_write(priv->regmap, PHY_R4, reg | PHY_R4_PHY_CR_CAP_DATA); 149 150 ret = regmap_read_poll_timeout(priv->regmap, PHY_R5, val, 151 (val & PHY_R5_PHY_CR_ACK), 152 5, 1000); 153 if (ret) 154 return ret; 155 156 regmap_write(priv->regmap, PHY_R4, reg); 157 158 ret = regmap_read_poll_timeout(priv->regmap, PHY_R5, val, 159 (val & PHY_R5_PHY_CR_ACK) == 0, 160 5, 1000); 161 if (ret) 162 return ret; 163 164 regmap_write(priv->regmap, PHY_R4, reg); 165 166 regmap_write(priv->regmap, PHY_R4, reg | PHY_R4_PHY_CR_WRITE); 167 168 ret = regmap_read_poll_timeout(priv->regmap, PHY_R5, val, 169 (val & PHY_R5_PHY_CR_ACK), 170 5, 1000); 171 if (ret) 172 return ret; 173 174 regmap_write(priv->regmap, PHY_R4, reg); 175 176 ret = regmap_read_poll_timeout(priv->regmap, PHY_R5, val, 177 (val & PHY_R5_PHY_CR_ACK) == 0, 178 5, 1000); 179 if (ret) 180 return ret; 181 182 return 0; 183 } 184 185 static const struct regmap_config phy_g12a_usb3_pcie_cr_regmap_conf = { 186 .reg_bits = 16, 187 .val_bits = 16, 188 .reg_read = phy_g12a_usb3_pcie_cr_bus_read, 189 .reg_write = phy_g12a_usb3_pcie_cr_bus_write, 190 .max_register = 0xffff, 191 .fast_io = true, 192 }; 193 194 static int phy_g12a_usb3_init(struct phy *phy) 195 { 196 struct phy_g12a_usb3_pcie_priv *priv = phy_get_drvdata(phy); 197 int data, ret; 198 199 /* Switch PHY to USB3 */ 200 /* TODO figure out how to handle when PCIe was set in the bootloader */ 201 regmap_update_bits(priv->regmap, PHY_R0, 202 PHY_R0_PCIE_USB3_SWITCH, 203 PHY_R0_PCIE_USB3_SWITCH); 204 205 /* 206 * WORKAROUND: There is SSPHY suspend bug due to 207 * which USB enumerates 208 * in HS mode instead of SS mode. Workaround it by asserting 209 * LANE0.TX_ALT_BLOCK.EN_ALT_BUS to enable TX to use alt bus 210 * mode 211 */ 212 ret = regmap_update_bits(priv->regmap_cr, 0x102d, BIT(7), BIT(7)); 213 if (ret) 214 return ret; 215 216 ret = regmap_update_bits(priv->regmap_cr, 0x1010, 0xff0, 20); 217 if (ret) 218 return ret; 219 220 /* 221 * Fix RX Equalization setting as follows 222 * LANE0.RX_OVRD_IN_HI. RX_EQ_EN set to 0 223 * LANE0.RX_OVRD_IN_HI.RX_EQ_EN_OVRD set to 1 224 * LANE0.RX_OVRD_IN_HI.RX_EQ set to 3 225 * LANE0.RX_OVRD_IN_HI.RX_EQ_OVRD set to 1 226 */ 227 ret = regmap_read(priv->regmap_cr, 0x1006, &data); 228 if (ret) 229 return ret; 230 231 data &= ~BIT(6); 232 data |= BIT(7); 233 data &= ~(0x7 << 8); 234 data |= (0x3 << 8); 235 data |= (1 << 11); 236 ret = regmap_write(priv->regmap_cr, 0x1006, data); 237 if (ret) 238 return ret; 239 240 /* 241 * Set EQ and TX launch amplitudes as follows 242 * LANE0.TX_OVRD_DRV_LO.PREEMPH set to 22 243 * LANE0.TX_OVRD_DRV_LO.AMPLITUDE set to 127 244 * LANE0.TX_OVRD_DRV_LO.EN set to 1. 245 */ 246 ret = regmap_read(priv->regmap_cr, 0x1002, &data); 247 if (ret) 248 return ret; 249 250 data &= ~0x3f80; 251 data |= (0x16 << 7); 252 data &= ~0x7f; 253 data |= (0x7f | BIT(14)); 254 ret = regmap_write(priv->regmap_cr, 0x1002, data); 255 if (ret) 256 return ret; 257 258 /* MPLL_LOOP_CTL.PROP_CNTRL = 8 */ 259 ret = regmap_update_bits(priv->regmap_cr, 0x30, 0xf << 4, 8 << 4); 260 if (ret) 261 return ret; 262 263 regmap_update_bits(priv->regmap, PHY_R2, 264 PHY_R2_PHY_TX_VBOOST_LVL, 265 FIELD_PREP(PHY_R2_PHY_TX_VBOOST_LVL, 0x4)); 266 267 regmap_update_bits(priv->regmap, PHY_R1, 268 PHY_R1_PHY_LOS_BIAS | PHY_R1_PHY_LOS_LEVEL, 269 FIELD_PREP(PHY_R1_PHY_LOS_BIAS, 4) | 270 FIELD_PREP(PHY_R1_PHY_LOS_LEVEL, 9)); 271 272 return 0; 273 } 274 275 static int phy_g12a_usb3_pcie_init(struct phy *phy) 276 { 277 struct phy_g12a_usb3_pcie_priv *priv = phy_get_drvdata(phy); 278 int ret; 279 280 ret = reset_control_reset(priv->reset); 281 if (ret) 282 return ret; 283 284 if (priv->mode == PHY_TYPE_USB3) 285 return phy_g12a_usb3_init(phy); 286 287 /* Power UP PCIE */ 288 /* TODO figure out when the bootloader has set USB3 mode before */ 289 regmap_update_bits(priv->regmap, PHY_R0, 290 PHY_R0_PCIE_POWER_STATE, 291 FIELD_PREP(PHY_R0_PCIE_POWER_STATE, 0x1c)); 292 293 return 0; 294 } 295 296 static int phy_g12a_usb3_pcie_exit(struct phy *phy) 297 { 298 struct phy_g12a_usb3_pcie_priv *priv = phy_get_drvdata(phy); 299 300 return reset_control_reset(priv->reset); 301 } 302 303 static struct phy *phy_g12a_usb3_pcie_xlate(struct device *dev, 304 struct of_phandle_args *args) 305 { 306 struct phy_g12a_usb3_pcie_priv *priv = dev_get_drvdata(dev); 307 unsigned int mode; 308 309 if (args->args_count < 1) { 310 dev_err(dev, "invalid number of arguments\n"); 311 return ERR_PTR(-EINVAL); 312 } 313 314 mode = args->args[0]; 315 316 if (mode != PHY_TYPE_USB3 && mode != PHY_TYPE_PCIE) { 317 dev_err(dev, "invalid phy mode select argument\n"); 318 return ERR_PTR(-EINVAL); 319 } 320 321 priv->mode = mode; 322 323 return priv->phy; 324 } 325 326 static const struct phy_ops phy_g12a_usb3_pcie_ops = { 327 .init = phy_g12a_usb3_pcie_init, 328 .exit = phy_g12a_usb3_pcie_exit, 329 .owner = THIS_MODULE, 330 }; 331 332 static int phy_g12a_usb3_pcie_probe(struct platform_device *pdev) 333 { 334 struct device *dev = &pdev->dev; 335 struct device_node *np = dev->of_node; 336 struct phy_g12a_usb3_pcie_priv *priv; 337 struct resource *res; 338 struct phy_provider *phy_provider; 339 void __iomem *base; 340 int ret; 341 342 priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL); 343 if (!priv) 344 return -ENOMEM; 345 346 res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 347 base = devm_ioremap_resource(dev, res); 348 if (IS_ERR(base)) 349 return PTR_ERR(base); 350 351 priv->regmap = devm_regmap_init_mmio(dev, base, 352 &phy_g12a_usb3_pcie_regmap_conf); 353 if (IS_ERR(priv->regmap)) 354 return PTR_ERR(priv->regmap); 355 356 priv->regmap_cr = devm_regmap_init(dev, NULL, priv, 357 &phy_g12a_usb3_pcie_cr_regmap_conf); 358 if (IS_ERR(priv->regmap_cr)) 359 return PTR_ERR(priv->regmap_cr); 360 361 priv->clk_ref = devm_clk_get(dev, "ref_clk"); 362 if (IS_ERR(priv->clk_ref)) 363 return PTR_ERR(priv->clk_ref); 364 365 ret = clk_prepare_enable(priv->clk_ref); 366 if (ret) 367 goto err_disable_clk_ref; 368 369 priv->reset = devm_reset_control_array_get(dev, false, false); 370 if (IS_ERR(priv->reset)) 371 return PTR_ERR(priv->reset); 372 373 priv->phy = devm_phy_create(dev, np, &phy_g12a_usb3_pcie_ops); 374 if (IS_ERR(priv->phy)) { 375 ret = PTR_ERR(priv->phy); 376 if (ret != -EPROBE_DEFER) 377 dev_err(dev, "failed to create PHY\n"); 378 379 return ret; 380 } 381 382 phy_set_drvdata(priv->phy, priv); 383 dev_set_drvdata(dev, priv); 384 385 phy_provider = devm_of_phy_provider_register(dev, 386 phy_g12a_usb3_pcie_xlate); 387 388 return PTR_ERR_OR_ZERO(phy_provider); 389 390 err_disable_clk_ref: 391 clk_disable_unprepare(priv->clk_ref); 392 393 return ret; 394 } 395 396 static const struct of_device_id phy_g12a_usb3_pcie_of_match[] = { 397 { .compatible = "amlogic,g12a-usb3-pcie-phy", }, 398 { }, 399 }; 400 MODULE_DEVICE_TABLE(of, phy_g12a_usb3_pcie_of_match); 401 402 static struct platform_driver phy_g12a_usb3_pcie_driver = { 403 .probe = phy_g12a_usb3_pcie_probe, 404 .driver = { 405 .name = "phy-g12a-usb3-pcie", 406 .of_match_table = phy_g12a_usb3_pcie_of_match, 407 }, 408 }; 409 module_platform_driver(phy_g12a_usb3_pcie_driver); 410 411 MODULE_AUTHOR("Neil Armstrong <narmstrong@baylibre.com>"); 412 MODULE_DESCRIPTION("Amlogic G12A USB3 + PCIE Combo PHY driver"); 413 MODULE_LICENSE("GPL v2"); 414