diff options
-rw-r--r-- | Documentation/devicetree/bindings/phy/brcm,nsp-usb3-phy.txt | 39 | ||||
-rw-r--r-- | drivers/phy/Kconfig | 9 | ||||
-rw-r--r-- | drivers/phy/Makefile | 1 | ||||
-rw-r--r-- | drivers/phy/phy-bcm-nsp-usb3.c | 177 | ||||
-rw-r--r-- | drivers/phy/phy-exynos-pcie.c | 4 |
5 files changed, 3 insertions, 227 deletions
diff --git a/Documentation/devicetree/bindings/phy/brcm,nsp-usb3-phy.txt b/Documentation/devicetree/bindings/phy/brcm,nsp-usb3-phy.txt deleted file mode 100644 index e68ae5dec9c9..000000000000 --- a/Documentation/devicetree/bindings/phy/brcm,nsp-usb3-phy.txt +++ /dev/null | |||
@@ -1,39 +0,0 @@ | |||
1 | Broadcom USB3 phy binding for northstar plus SoC | ||
2 | The USB3 phy is internal to the SoC and is accessed using mdio interface. | ||
3 | |||
4 | Required mdio bus properties: | ||
5 | - reg: Should be 0x0 for SoC internal USB3 phy | ||
6 | - #address-cells: must be 1 | ||
7 | - #size-cells: must be 0 | ||
8 | |||
9 | Required USB3 PHY properties: | ||
10 | - compatible: should be "brcm,nsp-usb3-phy" | ||
11 | - reg: USB3 Phy address on SoC internal MDIO bus and it should be 0x10. | ||
12 | - usb3-ctrl-syscon: handler of syscon node defining physical address | ||
13 | of usb3 control register. | ||
14 | - #phy-cells: must be 0 | ||
15 | |||
16 | Required usb3 control properties: | ||
17 | - compatible: should be "brcm,nsp-usb3-ctrl" | ||
18 | - reg: offset and length of the control registers | ||
19 | |||
20 | Example: | ||
21 | |||
22 | mdio@0 { | ||
23 | reg = <0x0>; | ||
24 | #address-cells = <1>; | ||
25 | #size-cells = <0>; | ||
26 | |||
27 | usb3_phy: usb-phy@10 { | ||
28 | compatible = "brcm,nsp-usb3-phy"; | ||
29 | reg = <0x10>; | ||
30 | usb3-ctrl-syscon = <&usb3_ctrl>; | ||
31 | #phy-cells = <0>; | ||
32 | status = "disabled"; | ||
33 | }; | ||
34 | }; | ||
35 | |||
36 | usb3_ctrl: syscon@104408 { | ||
37 | compatible = "brcm,nsp-usb3-ctrl", "syscon"; | ||
38 | reg = <0x104408 0x3fc>; | ||
39 | }; | ||
diff --git a/drivers/phy/Kconfig b/drivers/phy/Kconfig index dc5277ad1b5a..005cadb7a3f8 100644 --- a/drivers/phy/Kconfig +++ b/drivers/phy/Kconfig | |||
@@ -449,6 +449,7 @@ config PHY_QCOM_UFS | |||
449 | config PHY_QCOM_USB_HS | 449 | config PHY_QCOM_USB_HS |
450 | tristate "Qualcomm USB HS PHY module" | 450 | tristate "Qualcomm USB HS PHY module" |
451 | depends on USB_ULPI_BUS | 451 | depends on USB_ULPI_BUS |
452 | depends on EXTCON || !EXTCON # if EXTCON=m, this cannot be built-in | ||
452 | select GENERIC_PHY | 453 | select GENERIC_PHY |
453 | help | 454 | help |
454 | Support for the USB high-speed ULPI compliant phy on Qualcomm | 455 | Support for the USB high-speed ULPI compliant phy on Qualcomm |
@@ -510,12 +511,4 @@ config PHY_MESON8B_USB2 | |||
510 | and GXBB SoCs. | 511 | and GXBB SoCs. |
511 | If unsure, say N. | 512 | If unsure, say N. |
512 | 513 | ||
513 | config PHY_NSP_USB3 | ||
514 | tristate "Broadcom NorthStar plus USB3 PHY driver" | ||
515 | depends on OF && (ARCH_BCM_NSP || COMPILE_TEST) | ||
516 | select GENERIC_PHY | ||
517 | default ARCH_BCM_NSP | ||
518 | help | ||
519 | Enable this to support the Broadcom Northstar plus USB3 PHY. | ||
520 | If unsure, say N. | ||
521 | endmenu | 514 | endmenu |
diff --git a/drivers/phy/Makefile b/drivers/phy/Makefile index e7b0feb1e125..dd8f3b5d2918 100644 --- a/drivers/phy/Makefile +++ b/drivers/phy/Makefile | |||
@@ -62,4 +62,3 @@ obj-$(CONFIG_PHY_CYGNUS_PCIE) += phy-bcm-cygnus-pcie.o | |||
62 | obj-$(CONFIG_ARCH_TEGRA) += tegra/ | 62 | obj-$(CONFIG_ARCH_TEGRA) += tegra/ |
63 | obj-$(CONFIG_PHY_NS2_PCIE) += phy-bcm-ns2-pcie.o | 63 | obj-$(CONFIG_PHY_NS2_PCIE) += phy-bcm-ns2-pcie.o |
64 | obj-$(CONFIG_PHY_MESON8B_USB2) += phy-meson8b-usb2.o | 64 | obj-$(CONFIG_PHY_MESON8B_USB2) += phy-meson8b-usb2.o |
65 | obj-$(CONFIG_PHY_NSP_USB3) += phy-bcm-nsp-usb3.o | ||
diff --git a/drivers/phy/phy-bcm-nsp-usb3.c b/drivers/phy/phy-bcm-nsp-usb3.c deleted file mode 100644 index 49024eaa5545..000000000000 --- a/drivers/phy/phy-bcm-nsp-usb3.c +++ /dev/null | |||
@@ -1,177 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2016 Broadcom | ||
3 | * | ||
4 | * This program is free software; you can redistribute it and/or | ||
5 | * modify it under the terms of the GNU General Public License as | ||
6 | * published by the Free Software Foundation version 2. | ||
7 | * | ||
8 | * This program is distributed "as is" WITHOUT ANY WARRANTY of any | ||
9 | * kind, whether express or implied; without even the implied warranty | ||
10 | * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
11 | * GNU General Public License for more details. | ||
12 | */ | ||
13 | |||
14 | #include <linux/delay.h> | ||
15 | #include <linux/io.h> | ||
16 | #include <linux/kernel.h> | ||
17 | #include <linux/mfd/syscon.h> | ||
18 | #include <linux/mdio.h> | ||
19 | #include <linux/module.h> | ||
20 | #include <linux/of.h> | ||
21 | #include <linux/of_address.h> | ||
22 | #include <linux/phy/phy.h> | ||
23 | #include <linux/regmap.h> | ||
24 | |||
25 | #define NSP_USB3_RST_CTRL_OFFSET 0x3f8 | ||
26 | |||
27 | /* mdio reg access */ | ||
28 | #define NSP_USB3_PHY_BASE_ADDR_REG 0x1f | ||
29 | |||
30 | #define NSP_USB3_PHY_PLL30_BLOCK 0x8000 | ||
31 | #define NSP_USB3_PLL_CONTROL 0x01 | ||
32 | #define NSP_USB3_PLLA_CONTROL0 0x0a | ||
33 | #define NSP_USB3_PLLA_CONTROL1 0x0b | ||
34 | |||
35 | #define NSP_USB3_PHY_TX_PMD_BLOCK 0x8040 | ||
36 | #define NSP_USB3_TX_PMD_CONTROL1 0x01 | ||
37 | |||
38 | #define NSP_USB3_PHY_PIPE_BLOCK 0x8060 | ||
39 | #define NSP_USB3_LFPS_CMP 0x02 | ||
40 | #define NSP_USB3_LFPS_DEGLITCH 0x03 | ||
41 | |||
42 | struct nsp_usb3_phy { | ||
43 | struct regmap *usb3_ctrl; | ||
44 | struct phy *phy; | ||
45 | struct mdio_device *mdiodev; | ||
46 | }; | ||
47 | |||
48 | static int nsp_usb3_phy_init(struct phy *phy) | ||
49 | { | ||
50 | struct nsp_usb3_phy *iphy = phy_get_drvdata(phy); | ||
51 | struct mii_bus *bus = iphy->mdiodev->bus; | ||
52 | int addr = iphy->mdiodev->addr; | ||
53 | u32 data; | ||
54 | int rc; | ||
55 | |||
56 | rc = regmap_read(iphy->usb3_ctrl, 0, &data); | ||
57 | if (rc) | ||
58 | return rc; | ||
59 | data |= 1; | ||
60 | rc = regmap_write(iphy->usb3_ctrl, 0, data); | ||
61 | if (rc) | ||
62 | return rc; | ||
63 | |||
64 | rc = regmap_write(iphy->usb3_ctrl, NSP_USB3_RST_CTRL_OFFSET, 1); | ||
65 | if (rc) | ||
66 | return rc; | ||
67 | |||
68 | rc = mdiobus_write(bus, addr, NSP_USB3_PHY_BASE_ADDR_REG, | ||
69 | NSP_USB3_PHY_PLL30_BLOCK); | ||
70 | if (rc) | ||
71 | return rc; | ||
72 | |||
73 | rc = mdiobus_write(bus, addr, NSP_USB3_PLL_CONTROL, 0x1000); | ||
74 | if (rc) | ||
75 | return rc; | ||
76 | |||
77 | rc = mdiobus_write(bus, addr, NSP_USB3_PLLA_CONTROL0, 0x6400); | ||
78 | if (rc) | ||
79 | return rc; | ||
80 | |||
81 | rc = mdiobus_write(bus, addr, NSP_USB3_PLLA_CONTROL1, 0xc000); | ||
82 | if (rc) | ||
83 | return rc; | ||
84 | |||
85 | rc = mdiobus_write(bus, addr, NSP_USB3_PLLA_CONTROL1, 0x8000); | ||
86 | if (rc) | ||
87 | return rc; | ||
88 | |||
89 | rc = regmap_write(iphy->usb3_ctrl, NSP_USB3_RST_CTRL_OFFSET, 0); | ||
90 | if (rc) | ||
91 | return rc; | ||
92 | |||
93 | rc = mdiobus_write(bus, addr, NSP_USB3_PLL_CONTROL, 0x9000); | ||
94 | if (rc) | ||
95 | return rc; | ||
96 | |||
97 | rc = mdiobus_write(bus, addr, NSP_USB3_PHY_BASE_ADDR_REG, | ||
98 | NSP_USB3_PHY_PIPE_BLOCK); | ||
99 | if (rc) | ||
100 | return rc; | ||
101 | |||
102 | rc = mdiobus_write(bus, addr, NSP_USB3_LFPS_CMP, 0xf30d); | ||
103 | if (rc) | ||
104 | return rc; | ||
105 | |||
106 | rc = mdiobus_write(bus, addr, NSP_USB3_LFPS_DEGLITCH, 0x6302); | ||
107 | if (rc) | ||
108 | return rc; | ||
109 | |||
110 | rc = mdiobus_write(bus, addr, NSP_USB3_PHY_BASE_ADDR_REG, | ||
111 | NSP_USB3_PHY_TX_PMD_BLOCK); | ||
112 | if (rc) | ||
113 | return rc; | ||
114 | |||
115 | rc = mdiobus_write(bus, addr, NSP_USB3_TX_PMD_CONTROL1, 0x1003); | ||
116 | |||
117 | return rc; | ||
118 | } | ||
119 | |||
120 | static struct phy_ops nsp_usb3_phy_ops = { | ||
121 | .init = nsp_usb3_phy_init, | ||
122 | .owner = THIS_MODULE, | ||
123 | }; | ||
124 | |||
125 | static int nsp_usb3_phy_probe(struct mdio_device *mdiodev) | ||
126 | { | ||
127 | struct device *dev = &mdiodev->dev; | ||
128 | struct phy_provider *provider; | ||
129 | struct nsp_usb3_phy *iphy; | ||
130 | |||
131 | iphy = devm_kzalloc(dev, sizeof(*iphy), GFP_KERNEL); | ||
132 | if (!iphy) | ||
133 | return -ENOMEM; | ||
134 | iphy->mdiodev = mdiodev; | ||
135 | |||
136 | iphy->usb3_ctrl = syscon_regmap_lookup_by_phandle(dev->of_node, | ||
137 | "usb3-ctrl-syscon"); | ||
138 | if (IS_ERR(iphy->usb3_ctrl)) | ||
139 | return PTR_ERR(iphy->usb3_ctrl); | ||
140 | |||
141 | iphy->phy = devm_phy_create(dev, dev->of_node, &nsp_usb3_phy_ops); | ||
142 | if (IS_ERR(iphy->phy)) { | ||
143 | dev_err(dev, "failed to create PHY\n"); | ||
144 | return PTR_ERR(iphy->phy); | ||
145 | } | ||
146 | |||
147 | phy_set_drvdata(iphy->phy, iphy); | ||
148 | |||
149 | provider = devm_of_phy_provider_register(dev, of_phy_simple_xlate); | ||
150 | if (IS_ERR(provider)) { | ||
151 | dev_err(dev, "could not register PHY provider\n"); | ||
152 | return PTR_ERR(provider); | ||
153 | } | ||
154 | |||
155 | return 0; | ||
156 | } | ||
157 | |||
158 | static const struct of_device_id nsp_usb3_phy_of_match[] = { | ||
159 | {.compatible = "brcm,nsp-usb3-phy",}, | ||
160 | { /* sentinel */ } | ||
161 | }; | ||
162 | |||
163 | static struct mdio_driver nsp_usb3_phy_driver = { | ||
164 | .mdiodrv = { | ||
165 | .driver = { | ||
166 | .name = "nsp-usb3-phy", | ||
167 | .of_match_table = nsp_usb3_phy_of_match, | ||
168 | }, | ||
169 | }, | ||
170 | .probe = nsp_usb3_phy_probe, | ||
171 | }; | ||
172 | |||
173 | mdio_module_driver(nsp_usb3_phy_driver); | ||
174 | |||
175 | MODULE_DESCRIPTION("Broadcom NSP USB3 PHY driver"); | ||
176 | MODULE_LICENSE("GPL v2"); | ||
177 | MODULE_AUTHOR("Yendapally Reddy Dhananjaya Reddy <yendapally.reddy@broadcom.com"); | ||
diff --git a/drivers/phy/phy-exynos-pcie.c b/drivers/phy/phy-exynos-pcie.c index 4f60b83641d5..60baf25d98e2 100644 --- a/drivers/phy/phy-exynos-pcie.c +++ b/drivers/phy/phy-exynos-pcie.c | |||
@@ -254,8 +254,8 @@ static int exynos_pcie_phy_probe(struct platform_device *pdev) | |||
254 | 254 | ||
255 | res = platform_get_resource(pdev, IORESOURCE_MEM, 1); | 255 | res = platform_get_resource(pdev, IORESOURCE_MEM, 1); |
256 | exynos_phy->blk_base = devm_ioremap_resource(dev, res); | 256 | exynos_phy->blk_base = devm_ioremap_resource(dev, res); |
257 | if (IS_ERR(exynos_phy->phy_base)) | 257 | if (IS_ERR(exynos_phy->blk_base)) |
258 | return PTR_ERR(exynos_phy->phy_base); | 258 | return PTR_ERR(exynos_phy->blk_base); |
259 | 259 | ||
260 | exynos_phy->drv_data = drv_data; | 260 | exynos_phy->drv_data = drv_data; |
261 | 261 | ||