forked from ~ljy/RK356X_SDK_RELEASE

hc
2024-05-13 9d77db3c730780c8ef5ccd4b66403ff5675cfe4e
kernel/drivers/usb/host/ehci-fsl.c
....@@ -23,12 +23,13 @@
2323 #include <linux/platform_device.h>
2424 #include <linux/fsl_devices.h>
2525 #include <linux/of_platform.h>
26
+#include <linux/io.h>
2627
2728 #include "ehci.h"
2829 #include "ehci-fsl.h"
2930
3031 #define DRIVER_DESC "Freescale EHCI Host controller driver"
31
-#define DRV_NAME "ehci-fsl"
32
+#define DRV_NAME "fsl-ehci"
3233
3334 static struct hc_driver __read_mostly fsl_ehci_hc_driver;
3435
....@@ -50,6 +51,7 @@
5051 struct resource *res;
5152 int irq;
5253 int retval;
54
+ u32 tmp;
5355
5456 pr_debug("initializing FSL-SOC USB Controller\n");
5557
....@@ -114,17 +116,28 @@
114116 }
115117
116118 /* Enable USB controller, 83xx or 8536 */
117
- if (pdata->have_sysif_regs && pdata->controller_ver < FSL_USB_VER_1_6)
118
- clrsetbits_be32(hcd->regs + FSL_SOC_USB_CTRL,
119
- CONTROL_REGISTER_W1C_MASK, 0x4);
119
+ if (pdata->have_sysif_regs && pdata->controller_ver < FSL_USB_VER_1_6) {
120
+ tmp = ioread32be(hcd->regs + FSL_SOC_USB_CTRL);
121
+ tmp &= ~CONTROL_REGISTER_W1C_MASK;
122
+ tmp |= 0x4;
123
+ iowrite32be(tmp, hcd->regs + FSL_SOC_USB_CTRL);
124
+ }
125
+
126
+ /* Set USB_EN bit to select ULPI phy for USB controller version 2.5 */
127
+ if (pdata->controller_ver == FSL_USB_VER_2_5 &&
128
+ pdata->phy_mode == FSL_USB2_PHY_ULPI)
129
+ iowrite32be(USB_CTRL_USB_EN, hcd->regs + FSL_SOC_USB_CTRL);
120130
121131 /*
122132 * Enable UTMI phy and program PTS field in UTMI mode before asserting
123133 * controller reset for USB Controller version 2.5
124134 */
125135 if (pdata->has_fsl_erratum_a007792) {
126
- clrsetbits_be32(hcd->regs + FSL_SOC_USB_CTRL,
127
- CONTROL_REGISTER_W1C_MASK, CTRL_UTMI_PHY_EN);
136
+ tmp = ioread32be(hcd->regs + FSL_SOC_USB_CTRL);
137
+ tmp &= ~CONTROL_REGISTER_W1C_MASK;
138
+ tmp |= CTRL_UTMI_PHY_EN;
139
+ iowrite32be(tmp, hcd->regs + FSL_SOC_USB_CTRL);
140
+
128141 writel(PORT_PTS_UTMI, hcd->regs + FSL_SOC_USB_PORTSC1);
129142 }
130143
....@@ -170,11 +183,22 @@
170183 return retval;
171184 }
172185
186
+static bool usb_phy_clk_valid(struct usb_hcd *hcd)
187
+{
188
+ void __iomem *non_ehci = hcd->regs;
189
+ bool ret = true;
190
+
191
+ if (!(ioread32be(non_ehci + FSL_SOC_USB_CTRL) & PHY_CLK_VALID))
192
+ ret = false;
193
+
194
+ return ret;
195
+}
196
+
173197 static int ehci_fsl_setup_phy(struct usb_hcd *hcd,
174198 enum fsl_usb2_phy_modes phy_mode,
175199 unsigned int port_offset)
176200 {
177
- u32 portsc;
201
+ u32 portsc, tmp;
178202 struct ehci_hcd *ehci = hcd_to_ehci(hcd);
179203 void __iomem *non_ehci = hcd->regs;
180204 struct device *dev = hcd->self.controller;
....@@ -192,11 +216,16 @@
192216 case FSL_USB2_PHY_ULPI:
193217 if (pdata->have_sysif_regs && pdata->controller_ver) {
194218 /* controller version 1.6 or above */
195
- clrbits32(non_ehci + FSL_SOC_USB_CTRL,
196
- CONTROL_REGISTER_W1C_MASK | UTMI_PHY_EN);
197
- clrsetbits_be32(non_ehci + FSL_SOC_USB_CTRL,
198
- CONTROL_REGISTER_W1C_MASK,
199
- ULPI_PHY_CLK_SEL | USB_CTRL_USB_EN);
219
+ /* turn off UTMI PHY first */
220
+ tmp = ioread32be(non_ehci + FSL_SOC_USB_CTRL);
221
+ tmp &= ~(CONTROL_REGISTER_W1C_MASK | UTMI_PHY_EN);
222
+ iowrite32be(tmp, non_ehci + FSL_SOC_USB_CTRL);
223
+
224
+ /* then turn on ULPI and enable USB controller */
225
+ tmp = ioread32be(non_ehci + FSL_SOC_USB_CTRL);
226
+ tmp &= ~CONTROL_REGISTER_W1C_MASK;
227
+ tmp |= ULPI_PHY_CLK_SEL | USB_CTRL_USB_EN;
228
+ iowrite32be(tmp, non_ehci + FSL_SOC_USB_CTRL);
200229 }
201230 portsc |= PORT_PTS_ULPI;
202231 break;
....@@ -205,45 +234,66 @@
205234 break;
206235 case FSL_USB2_PHY_UTMI_WIDE:
207236 portsc |= PORT_PTS_PTW;
208
- /* fall through */
237
+ fallthrough;
209238 case FSL_USB2_PHY_UTMI:
239
+ /* Presence of this node "has_fsl_erratum_a006918"
240
+ * in device-tree is used to stop USB controller
241
+ * initialization in Linux
242
+ */
243
+ if (pdata->has_fsl_erratum_a006918) {
244
+ dev_warn(dev, "USB PHY clock invalid\n");
245
+ return -EINVAL;
246
+ }
247
+ fallthrough;
210248 case FSL_USB2_PHY_UTMI_DUAL:
249
+ /* PHY_CLK_VALID bit is de-featured from all controller
250
+ * versions below 2.4 and is to be checked only for
251
+ * internal UTMI phy
252
+ */
253
+ if (pdata->controller_ver > FSL_USB_VER_2_4 &&
254
+ pdata->have_sysif_regs && !usb_phy_clk_valid(hcd)) {
255
+ dev_err(dev, "USB PHY clock invalid\n");
256
+ return -EINVAL;
257
+ }
258
+
211259 if (pdata->have_sysif_regs && pdata->controller_ver) {
212260 /* controller version 1.6 or above */
213
- clrsetbits_be32(non_ehci + FSL_SOC_USB_CTRL,
214
- CONTROL_REGISTER_W1C_MASK, UTMI_PHY_EN);
261
+ tmp = ioread32be(non_ehci + FSL_SOC_USB_CTRL);
262
+ tmp &= ~CONTROL_REGISTER_W1C_MASK;
263
+ tmp |= UTMI_PHY_EN;
264
+ iowrite32be(tmp, non_ehci + FSL_SOC_USB_CTRL);
265
+
215266 mdelay(FSL_UTMI_PHY_DLY); /* Delay for UTMI PHY CLK to
216267 become stable - 10ms*/
217268 }
218269 /* enable UTMI PHY */
219
- if (pdata->have_sysif_regs)
220
- clrsetbits_be32(non_ehci + FSL_SOC_USB_CTRL,
221
- CONTROL_REGISTER_W1C_MASK,
222
- CTRL_UTMI_PHY_EN);
270
+ if (pdata->have_sysif_regs) {
271
+ tmp = ioread32be(non_ehci + FSL_SOC_USB_CTRL);
272
+ tmp &= ~CONTROL_REGISTER_W1C_MASK;
273
+ tmp |= CTRL_UTMI_PHY_EN;
274
+ iowrite32be(tmp, non_ehci + FSL_SOC_USB_CTRL);
275
+ }
223276 portsc |= PORT_PTS_UTMI;
224277 break;
225278 case FSL_USB2_PHY_NONE:
226279 break;
227280 }
228281
229
- /*
230
- * check PHY_CLK_VALID to determine phy clock presence before writing
231
- * to portsc
232
- */
233
- if (pdata->check_phy_clk_valid) {
234
- if (!(ioread32be(non_ehci + FSL_SOC_USB_CTRL) &
235
- PHY_CLK_VALID)) {
236
- dev_warn(hcd->self.controller,
237
- "USB PHY clock invalid\n");
238
- return -EINVAL;
239
- }
282
+ if (pdata->have_sysif_regs &&
283
+ pdata->controller_ver > FSL_USB_VER_1_6 &&
284
+ !usb_phy_clk_valid(hcd)) {
285
+ dev_warn(hcd->self.controller, "USB PHY clock invalid\n");
286
+ return -EINVAL;
240287 }
241288
242289 ehci_writel(ehci, portsc, &ehci->regs->port_status[port_offset]);
243290
244
- if (phy_mode != FSL_USB2_PHY_ULPI && pdata->have_sysif_regs)
245
- clrsetbits_be32(non_ehci + FSL_SOC_USB_CTRL,
246
- CONTROL_REGISTER_W1C_MASK, USB_CTRL_USB_EN);
291
+ if (phy_mode != FSL_USB2_PHY_ULPI && pdata->have_sysif_regs) {
292
+ tmp = ioread32be(non_ehci + FSL_SOC_USB_CTRL);
293
+ tmp &= ~CONTROL_REGISTER_W1C_MASK;
294
+ tmp |= USB_CTRL_USB_EN;
295
+ iowrite32be(tmp, non_ehci + FSL_SOC_USB_CTRL);
296
+ }
247297
248298 return 0;
249299 }
....@@ -284,14 +334,9 @@
284334 return -EINVAL;
285335
286336 if (pdata->operating_mode == FSL_USB2_MPH_HOST) {
287
- unsigned int chip, rev, svr;
288
-
289
- svr = mfspr(SPRN_SVR);
290
- chip = svr >> 16;
291
- rev = (svr >> 4) & 0xf;
292337
293338 /* Deal with USB Erratum #14 on MPC834x Rev 1.0 & 1.1 chips */
294
- if ((rev == 1) && (chip >= 0x8050) && (chip <= 0x8055))
339
+ if (pdata->has_fsl_erratum_14 == 1)
295340 ehci->has_fsl_port_bug = 1;
296341
297342 if (pdata->port_enables & FSL_USB2_PORT0_ENABLED)
....@@ -638,7 +683,7 @@
638683
639684 /**
640685 * fsl_ehci_drv_remove - shutdown processing for FSL-based HCDs
641
- * @dev: USB Host Controller being removed
686
+ * @pdev: USB Host Controller being removed
642687 * Context: !in_interrupt()
643688 *
644689 * Reverses the effect of usb_hcd_fsl_probe().