Lines Matching +full:usb3 +full:- +full:if
60 int (*phy_write)(struct bcm_ns_usb3 *usb3, u16 reg, u16 value);
65 .compatible = "brcm,ns-ax-usb3-phy",
69 .compatible = "brcm,ns-bx-usb3-phy",
76 static int bcm_ns_usb3_mdio_phy_write(struct bcm_ns_usb3 *usb3, u16 reg, in bcm_ns_usb3_mdio_phy_write() argument
79 return usb3->phy_write(usb3, reg, value); in bcm_ns_usb3_mdio_phy_write()
82 static int bcm_ns_usb3_phy_init_ns_bx(struct bcm_ns_usb3 *usb3) in bcm_ns_usb3_phy_init_ns_bx() argument
86 /* USB3 PLL Block */ in bcm_ns_usb3_phy_init_ns_bx()
87 err = bcm_ns_usb3_mdio_phy_write(usb3, BCM_NS_USB3_PHY_BASE_ADDR_REG, in bcm_ns_usb3_phy_init_ns_bx()
89 if (err < 0) in bcm_ns_usb3_phy_init_ns_bx()
93 bcm_ns_usb3_mdio_phy_write(usb3, BCM_NS_USB3_PLL_CONTROL, 0x1000); in bcm_ns_usb3_phy_init_ns_bx()
96 bcm_ns_usb3_mdio_phy_write(usb3, BCM_NS_USB3_PLLA_CONTROL0, 0x6400); in bcm_ns_usb3_phy_init_ns_bx()
99 bcm_ns_usb3_mdio_phy_write(usb3, BCM_NS_USB3_PLLA_CONTROL1, 0xc000); in bcm_ns_usb3_phy_init_ns_bx()
102 bcm_ns_usb3_mdio_phy_write(usb3, BCM_NS_USB3_PLLA_CONTROL1, 0x8000); in bcm_ns_usb3_phy_init_ns_bx()
104 /* Deasserting USB3 system reset */ in bcm_ns_usb3_phy_init_ns_bx()
105 writel(0, usb3->dmp + BCMA_RESET_CTL); in bcm_ns_usb3_phy_init_ns_bx()
108 bcm_ns_usb3_mdio_phy_write(usb3, BCM_NS_USB3_PLL_CONTROL, 0x9000); in bcm_ns_usb3_phy_init_ns_bx()
111 bcm_ns_usb3_mdio_phy_write(usb3, BCM_NS_USB3_PHY_BASE_ADDR_REG, in bcm_ns_usb3_phy_init_ns_bx()
115 bcm_ns_usb3_mdio_phy_write(usb3, BCM_NS_USB3_LFPS_CMP, 0xf30d); in bcm_ns_usb3_phy_init_ns_bx()
118 bcm_ns_usb3_mdio_phy_write(usb3, BCM_NS_USB3_LFPS_DEGLITCH, 0x6302); in bcm_ns_usb3_phy_init_ns_bx()
121 bcm_ns_usb3_mdio_phy_write(usb3, BCM_NS_USB3_PHY_BASE_ADDR_REG, in bcm_ns_usb3_phy_init_ns_bx()
125 bcm_ns_usb3_mdio_phy_write(usb3, BCM_NS_USB3_TX_PMD_CONTROL1, 0x1003); in bcm_ns_usb3_phy_init_ns_bx()
130 static int bcm_ns_usb3_phy_init_ns_ax(struct bcm_ns_usb3 *usb3) in bcm_ns_usb3_phy_init_ns_ax() argument
135 err = bcm_ns_usb3_mdio_phy_write(usb3, BCM_NS_USB3_PHY_BASE_ADDR_REG, in bcm_ns_usb3_phy_init_ns_ax()
137 if (err < 0) in bcm_ns_usb3_phy_init_ns_ax()
140 bcm_ns_usb3_mdio_phy_write(usb3, BCM_NS_USB3_PLLA_CONTROL0, 0x6400); in bcm_ns_usb3_phy_init_ns_ax()
142 bcm_ns_usb3_mdio_phy_write(usb3, BCM_NS_USB3_PHY_BASE_ADDR_REG, 0x80e0); in bcm_ns_usb3_phy_init_ns_ax()
144 bcm_ns_usb3_mdio_phy_write(usb3, 0x02, 0x009c); in bcm_ns_usb3_phy_init_ns_ax()
147 bcm_ns_usb3_mdio_phy_write(usb3, BCM_NS_USB3_PHY_BASE_ADDR_REG, in bcm_ns_usb3_phy_init_ns_ax()
150 bcm_ns_usb3_mdio_phy_write(usb3, 0x02, 0x21d3); in bcm_ns_usb3_phy_init_ns_ax()
152 bcm_ns_usb3_mdio_phy_write(usb3, BCM_NS_USB3_TX_PMD_CONTROL1, 0x1003); in bcm_ns_usb3_phy_init_ns_ax()
154 /* Deasserting USB3 system reset */ in bcm_ns_usb3_phy_init_ns_ax()
155 writel(0, usb3->dmp + BCMA_RESET_CTL); in bcm_ns_usb3_phy_init_ns_ax()
162 struct bcm_ns_usb3 *usb3 = phy_get_drvdata(phy); in bcm_ns_usb3_phy_init() local
165 /* Perform USB3 system soft reset */ in bcm_ns_usb3_phy_init()
166 writel(BCMA_RESET_CTL_RESET, usb3->dmp + BCMA_RESET_CTL); in bcm_ns_usb3_phy_init()
168 switch (usb3->family) { in bcm_ns_usb3_phy_init()
170 err = bcm_ns_usb3_phy_init_ns_ax(usb3); in bcm_ns_usb3_phy_init()
173 err = bcm_ns_usb3_phy_init_ns_bx(usb3); in bcm_ns_usb3_phy_init()
177 err = -ENOTSUPP; in bcm_ns_usb3_phy_init()
192 static int bcm_ns_usb3_mdiodev_phy_write(struct bcm_ns_usb3 *usb3, u16 reg, in bcm_ns_usb3_mdiodev_phy_write() argument
195 struct mdio_device *mdiodev = usb3->mdiodev; in bcm_ns_usb3_mdiodev_phy_write()
197 return mdiobus_write(mdiodev->bus, mdiodev->addr, reg, value); in bcm_ns_usb3_mdiodev_phy_write()
202 struct device *dev = &mdiodev->dev; in bcm_ns_usb3_mdio_probe()
206 struct bcm_ns_usb3 *usb3; in bcm_ns_usb3_mdio_probe() local
210 usb3 = devm_kzalloc(dev, sizeof(*usb3), GFP_KERNEL); in bcm_ns_usb3_mdio_probe()
211 if (!usb3) in bcm_ns_usb3_mdio_probe()
212 return -ENOMEM; in bcm_ns_usb3_mdio_probe()
214 usb3->dev = dev; in bcm_ns_usb3_mdio_probe()
215 usb3->mdiodev = mdiodev; in bcm_ns_usb3_mdio_probe()
218 if (!of_id) in bcm_ns_usb3_mdio_probe()
219 return -EINVAL; in bcm_ns_usb3_mdio_probe()
220 usb3->family = (enum bcm_ns_family)of_id->data; in bcm_ns_usb3_mdio_probe()
222 syscon_np = of_parse_phandle(dev->of_node, "usb3-dmp-syscon", 0); in bcm_ns_usb3_mdio_probe()
225 if (err) in bcm_ns_usb3_mdio_probe()
228 usb3->dmp = devm_ioremap_resource(dev, &res); in bcm_ns_usb3_mdio_probe()
229 if (IS_ERR(usb3->dmp)) { in bcm_ns_usb3_mdio_probe()
231 return PTR_ERR(usb3->dmp); in bcm_ns_usb3_mdio_probe()
234 usb3->phy_write = bcm_ns_usb3_mdiodev_phy_write; in bcm_ns_usb3_mdio_probe()
236 usb3->phy = devm_phy_create(dev, NULL, &ops); in bcm_ns_usb3_mdio_probe()
237 if (IS_ERR(usb3->phy)) { in bcm_ns_usb3_mdio_probe()
239 return PTR_ERR(usb3->phy); in bcm_ns_usb3_mdio_probe()
242 phy_set_drvdata(usb3->phy, usb3); in bcm_ns_usb3_mdio_probe()
263 static int bcm_ns_usb3_wait_reg(struct bcm_ns_usb3 *usb3, void __iomem *addr, in bcm_ns_usb3_wait_reg() argument
271 if ((val & mask) == value) in bcm_ns_usb3_wait_reg()
277 dev_err(usb3->dev, "Timeout waiting for register %p\n", addr); in bcm_ns_usb3_wait_reg()
279 return -EBUSY; in bcm_ns_usb3_wait_reg()
282 static inline int bcm_ns_usb3_mii_mng_wait_idle(struct bcm_ns_usb3 *usb3) in bcm_ns_usb3_mii_mng_wait_idle() argument
284 return bcm_ns_usb3_wait_reg(usb3, usb3->ccb_mii + BCMA_CCB_MII_MNG_CTL, in bcm_ns_usb3_mii_mng_wait_idle()
289 static int bcm_ns_usb3_platform_phy_write(struct bcm_ns_usb3 *usb3, u16 reg, in bcm_ns_usb3_platform_phy_write() argument
295 err = bcm_ns_usb3_mii_mng_wait_idle(usb3); in bcm_ns_usb3_platform_phy_write()
296 if (err < 0) { in bcm_ns_usb3_platform_phy_write()
297 dev_err(usb3->dev, "Couldn't write 0x%08x value\n", value); in bcm_ns_usb3_platform_phy_write()
305 writel(tmp, usb3->ccb_mii + BCMA_CCB_MII_MNG_CMD_DATA); in bcm_ns_usb3_platform_phy_write()
307 return bcm_ns_usb3_mii_mng_wait_idle(usb3); in bcm_ns_usb3_platform_phy_write()
312 struct device *dev = &pdev->dev; in bcm_ns_usb3_probe()
314 struct bcm_ns_usb3 *usb3; in bcm_ns_usb3_probe() local
318 usb3 = devm_kzalloc(dev, sizeof(*usb3), GFP_KERNEL); in bcm_ns_usb3_probe()
319 if (!usb3) in bcm_ns_usb3_probe()
320 return -ENOMEM; in bcm_ns_usb3_probe()
322 usb3->dev = dev; in bcm_ns_usb3_probe()
325 if (!of_id) in bcm_ns_usb3_probe()
326 return -EINVAL; in bcm_ns_usb3_probe()
327 usb3->family = (enum bcm_ns_family)of_id->data; in bcm_ns_usb3_probe()
330 usb3->dmp = devm_ioremap_resource(dev, res); in bcm_ns_usb3_probe()
331 if (IS_ERR(usb3->dmp)) { in bcm_ns_usb3_probe()
333 return PTR_ERR(usb3->dmp); in bcm_ns_usb3_probe()
336 res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "ccb-mii"); in bcm_ns_usb3_probe()
337 usb3->ccb_mii = devm_ioremap_resource(dev, res); in bcm_ns_usb3_probe()
338 if (IS_ERR(usb3->ccb_mii)) { in bcm_ns_usb3_probe()
340 return PTR_ERR(usb3->ccb_mii); in bcm_ns_usb3_probe()
344 writel(0x0000009a, usb3->ccb_mii + BCMA_CCB_MII_MNG_CTL); in bcm_ns_usb3_probe()
349 usb3->phy_write = bcm_ns_usb3_platform_phy_write; in bcm_ns_usb3_probe()
351 usb3->phy = devm_phy_create(dev, NULL, &ops); in bcm_ns_usb3_probe()
352 if (IS_ERR(usb3->phy)) { in bcm_ns_usb3_probe()
354 return PTR_ERR(usb3->phy); in bcm_ns_usb3_probe()
357 phy_set_drvdata(usb3->phy, usb3); in bcm_ns_usb3_probe()
358 platform_set_drvdata(pdev, usb3); in bcm_ns_usb3_probe()
361 if (!IS_ERR(phy_provider)) in bcm_ns_usb3_probe()
387 if (err) in bcm_ns_usb3_module_init()
391 if (err) in bcm_ns_usb3_module_init()