1 // SPDX-License-Identifier: GPL-2.0+ 2 /* 3 * Copyright 2005-2009 MontaVista Software, Inc. 4 * Copyright 2008,2012,2015 Freescale Semiconductor, Inc. 5 * 6 * Ported to 834x by Randy Vinson <rvinson@mvista.com> using code provided 7 * by Hunter Wu. 8 * Power Management support by Dave Liu <daveliu@freescale.com>, 9 * Jerry Huang <Chang-Ming.Huang@freescale.com> and 10 * Anton Vorontsov <avorontsov@ru.mvista.com>. 11 */ 12 13 #include <linux/kernel.h> 14 #include <linux/module.h> 15 #include <linux/types.h> 16 #include <linux/delay.h> 17 #include <linux/pm.h> 18 #include <linux/err.h> 19 #include <linux/usb.h> 20 #include <linux/usb/ehci_def.h> 21 #include <linux/usb/hcd.h> 22 #include <linux/usb/otg.h> 23 #include <linux/platform_device.h> 24 #include <linux/fsl_devices.h> 25 #include <linux/of_platform.h> 26 #include <linux/io.h> 27 28 #include "ehci.h" 29 #include "ehci-fsl.h" 30 31 #define DRIVER_DESC "Freescale EHCI Host controller driver" 32 #define DRV_NAME "fsl-ehci" 33 34 static struct hc_driver __read_mostly fsl_ehci_hc_driver; 35 36 /* configure so an HC device and id are always provided */ 37 /* always called with process context; sleeping is OK */ 38 39 /* 40 * fsl_ehci_drv_probe - initialize FSL-based HCDs 41 * @pdev: USB Host Controller being probed 42 * 43 * Context: task context, might sleep 44 * 45 * Allocates basic resources for this USB host controller. 46 */ 47 static int fsl_ehci_drv_probe(struct platform_device *pdev) 48 { 49 struct fsl_usb2_platform_data *pdata; 50 struct usb_hcd *hcd; 51 struct resource *res; 52 int irq; 53 int retval; 54 u32 tmp; 55 56 pr_debug("initializing FSL-SOC USB Controller\n"); 57 58 /* Need platform data for setup */ 59 pdata = dev_get_platdata(&pdev->dev); 60 if (!pdata) { 61 dev_err(&pdev->dev, 62 "No platform data for %s.\n", dev_name(&pdev->dev)); 63 return -ENODEV; 64 } 65 66 /* 67 * This is a host mode driver, verify that we're supposed to be 68 * in host mode. 69 */ 70 if (!((pdata->operating_mode == FSL_USB2_DR_HOST) || 71 (pdata->operating_mode == FSL_USB2_MPH_HOST) || 72 (pdata->operating_mode == FSL_USB2_DR_OTG))) { 73 dev_err(&pdev->dev, 74 "Non Host Mode configured for %s. Wrong driver linked.\n", 75 dev_name(&pdev->dev)); 76 return -ENODEV; 77 } 78 79 irq = platform_get_irq(pdev, 0); 80 if (irq < 0) 81 return irq; 82 83 hcd = __usb_create_hcd(&fsl_ehci_hc_driver, pdev->dev.parent, 84 &pdev->dev, dev_name(&pdev->dev), NULL); 85 if (!hcd) { 86 retval = -ENOMEM; 87 goto err1; 88 } 89 90 res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 91 hcd->regs = devm_ioremap_resource(&pdev->dev, res); 92 if (IS_ERR(hcd->regs)) { 93 retval = PTR_ERR(hcd->regs); 94 goto err2; 95 } 96 97 hcd->rsrc_start = res->start; 98 hcd->rsrc_len = resource_size(res); 99 100 pdata->regs = hcd->regs; 101 102 if (pdata->power_budget) 103 hcd->power_budget = pdata->power_budget; 104 105 /* 106 * do platform specific init: check the clock, grab/config pins, etc. 107 */ 108 if (pdata->init && pdata->init(pdev)) { 109 retval = -ENODEV; 110 goto err2; 111 } 112 113 /* Enable USB controller, 83xx or 8536 */ 114 if (pdata->have_sysif_regs && pdata->controller_ver < FSL_USB_VER_1_6) { 115 tmp = ioread32be(hcd->regs + FSL_SOC_USB_CTRL); 116 tmp &= ~CONTROL_REGISTER_W1C_MASK; 117 tmp |= 0x4; 118 iowrite32be(tmp, hcd->regs + FSL_SOC_USB_CTRL); 119 } 120 121 /* Set USB_EN bit to select ULPI phy for USB controller version 2.5 */ 122 if (pdata->controller_ver == FSL_USB_VER_2_5 && 123 pdata->phy_mode == FSL_USB2_PHY_ULPI) 124 iowrite32be(USB_CTRL_USB_EN, hcd->regs + FSL_SOC_USB_CTRL); 125 126 /* 127 * Enable UTMI phy and program PTS field in UTMI mode before asserting 128 * controller reset for USB Controller version 2.5 129 */ 130 if (pdata->has_fsl_erratum_a007792) { 131 tmp = ioread32be(hcd->regs + FSL_SOC_USB_CTRL); 132 tmp &= ~CONTROL_REGISTER_W1C_MASK; 133 tmp |= CTRL_UTMI_PHY_EN; 134 iowrite32be(tmp, hcd->regs + FSL_SOC_USB_CTRL); 135 136 writel(PORT_PTS_UTMI, hcd->regs + FSL_SOC_USB_PORTSC1); 137 } 138 139 /* Don't need to set host mode here. It will be done by tdi_reset() */ 140 141 retval = usb_add_hcd(hcd, irq, IRQF_SHARED); 142 if (retval != 0) 143 goto err2; 144 device_wakeup_enable(hcd->self.controller); 145 146 #ifdef CONFIG_USB_OTG 147 if (pdata->operating_mode == FSL_USB2_DR_OTG) { 148 struct ehci_hcd *ehci = hcd_to_ehci(hcd); 149 150 hcd->usb_phy = usb_get_phy(USB_PHY_TYPE_USB2); 151 dev_dbg(&pdev->dev, "hcd=0x%p ehci=0x%p, phy=0x%p\n", 152 hcd, ehci, hcd->usb_phy); 153 154 if (!IS_ERR_OR_NULL(hcd->usb_phy)) { 155 retval = otg_set_host(hcd->usb_phy->otg, 156 &ehci_to_hcd(ehci)->self); 157 if (retval) { 158 usb_put_phy(hcd->usb_phy); 159 goto err2; 160 } 161 } else { 162 dev_err(&pdev->dev, "can't find phy\n"); 163 retval = -ENODEV; 164 goto err2; 165 } 166 167 hcd->skip_phy_initialization = 1; 168 } 169 #endif 170 return retval; 171 172 err2: 173 usb_put_hcd(hcd); 174 err1: 175 dev_err(&pdev->dev, "init %s fail, %d\n", dev_name(&pdev->dev), retval); 176 if (pdata->exit) 177 pdata->exit(pdev); 178 return retval; 179 } 180 181 static bool usb_phy_clk_valid(struct usb_hcd *hcd) 182 { 183 void __iomem *non_ehci = hcd->regs; 184 bool ret = true; 185 186 if (!(ioread32be(non_ehci + FSL_SOC_USB_CTRL) & PHY_CLK_VALID)) 187 ret = false; 188 189 return ret; 190 } 191 192 static int ehci_fsl_setup_phy(struct usb_hcd *hcd, 193 enum fsl_usb2_phy_modes phy_mode, 194 unsigned int port_offset) 195 { 196 u32 portsc, tmp; 197 struct ehci_hcd *ehci = hcd_to_ehci(hcd); 198 void __iomem *non_ehci = hcd->regs; 199 struct device *dev = hcd->self.controller; 200 struct fsl_usb2_platform_data *pdata = dev_get_platdata(dev); 201 202 if (pdata->controller_ver < 0) { 203 dev_warn(hcd->self.controller, "Could not get controller version\n"); 204 return -ENODEV; 205 } 206 207 portsc = ehci_readl(ehci, &ehci->regs->port_status[port_offset]); 208 portsc &= ~(PORT_PTS_MSK | PORT_PTS_PTW); 209 210 switch (phy_mode) { 211 case FSL_USB2_PHY_ULPI: 212 if (pdata->have_sysif_regs && pdata->controller_ver) { 213 /* controller version 1.6 or above */ 214 /* turn off UTMI PHY first */ 215 tmp = ioread32be(non_ehci + FSL_SOC_USB_CTRL); 216 tmp &= ~(CONTROL_REGISTER_W1C_MASK | UTMI_PHY_EN); 217 iowrite32be(tmp, non_ehci + FSL_SOC_USB_CTRL); 218 219 /* then turn on ULPI and enable USB controller */ 220 tmp = ioread32be(non_ehci + FSL_SOC_USB_CTRL); 221 tmp &= ~CONTROL_REGISTER_W1C_MASK; 222 tmp |= ULPI_PHY_CLK_SEL | USB_CTRL_USB_EN; 223 iowrite32be(tmp, non_ehci + FSL_SOC_USB_CTRL); 224 } 225 portsc |= PORT_PTS_ULPI; 226 break; 227 case FSL_USB2_PHY_SERIAL: 228 portsc |= PORT_PTS_SERIAL; 229 break; 230 case FSL_USB2_PHY_UTMI_WIDE: 231 portsc |= PORT_PTS_PTW; 232 fallthrough; 233 case FSL_USB2_PHY_UTMI: 234 /* Presence of this node "has_fsl_erratum_a006918" 235 * in device-tree is used to stop USB controller 236 * initialization in Linux 237 */ 238 if (pdata->has_fsl_erratum_a006918) { 239 dev_warn(dev, "USB PHY clock invalid\n"); 240 return -EINVAL; 241 } 242 fallthrough; 243 case FSL_USB2_PHY_UTMI_DUAL: 244 /* PHY_CLK_VALID bit is de-featured from all controller 245 * versions below 2.4 and is to be checked only for 246 * internal UTMI phy 247 */ 248 if (pdata->controller_ver > FSL_USB_VER_2_4 && 249 pdata->have_sysif_regs && !usb_phy_clk_valid(hcd)) { 250 dev_err(dev, "USB PHY clock invalid\n"); 251 return -EINVAL; 252 } 253 254 if (pdata->have_sysif_regs && pdata->controller_ver) { 255 /* controller version 1.6 or above */ 256 tmp = ioread32be(non_ehci + FSL_SOC_USB_CTRL); 257 tmp &= ~CONTROL_REGISTER_W1C_MASK; 258 tmp |= UTMI_PHY_EN; 259 iowrite32be(tmp, non_ehci + FSL_SOC_USB_CTRL); 260 261 mdelay(FSL_UTMI_PHY_DLY); /* Delay for UTMI PHY CLK to 262 become stable - 10ms*/ 263 } 264 /* enable UTMI PHY */ 265 if (pdata->have_sysif_regs) { 266 tmp = ioread32be(non_ehci + FSL_SOC_USB_CTRL); 267 tmp &= ~CONTROL_REGISTER_W1C_MASK; 268 tmp |= CTRL_UTMI_PHY_EN; 269 iowrite32be(tmp, non_ehci + FSL_SOC_USB_CTRL); 270 } 271 portsc |= PORT_PTS_UTMI; 272 break; 273 case FSL_USB2_PHY_NONE: 274 break; 275 } 276 277 if (pdata->have_sysif_regs && 278 pdata->controller_ver > FSL_USB_VER_1_6 && 279 !usb_phy_clk_valid(hcd)) { 280 dev_warn(hcd->self.controller, "USB PHY clock invalid\n"); 281 return -EINVAL; 282 } 283 284 ehci_writel(ehci, portsc, &ehci->regs->port_status[port_offset]); 285 286 if (phy_mode != FSL_USB2_PHY_ULPI && pdata->have_sysif_regs) { 287 tmp = ioread32be(non_ehci + FSL_SOC_USB_CTRL); 288 tmp &= ~CONTROL_REGISTER_W1C_MASK; 289 tmp |= USB_CTRL_USB_EN; 290 iowrite32be(tmp, non_ehci + FSL_SOC_USB_CTRL); 291 } 292 293 return 0; 294 } 295 296 static int ehci_fsl_usb_setup(struct ehci_hcd *ehci) 297 { 298 struct usb_hcd *hcd = ehci_to_hcd(ehci); 299 struct fsl_usb2_platform_data *pdata; 300 void __iomem *non_ehci = hcd->regs; 301 302 pdata = dev_get_platdata(hcd->self.controller); 303 304 if (pdata->have_sysif_regs) { 305 /* 306 * Turn on cache snooping hardware, since some PowerPC platforms 307 * wholly rely on hardware to deal with cache coherent 308 */ 309 310 /* Setup Snooping for all the 4GB space */ 311 /* SNOOP1 starts from 0x0, size 2G */ 312 iowrite32be(0x0 | SNOOP_SIZE_2GB, 313 non_ehci + FSL_SOC_USB_SNOOP1); 314 /* SNOOP2 starts from 0x80000000, size 2G */ 315 iowrite32be(0x80000000 | SNOOP_SIZE_2GB, 316 non_ehci + FSL_SOC_USB_SNOOP2); 317 } 318 319 /* Deal with USB erratum A-005275 */ 320 if (pdata->has_fsl_erratum_a005275 == 1) 321 ehci->has_fsl_hs_errata = 1; 322 323 if (pdata->has_fsl_erratum_a005697 == 1) 324 ehci->has_fsl_susp_errata = 1; 325 326 if ((pdata->operating_mode == FSL_USB2_DR_HOST) || 327 (pdata->operating_mode == FSL_USB2_DR_OTG)) 328 if (ehci_fsl_setup_phy(hcd, pdata->phy_mode, 0)) 329 return -EINVAL; 330 331 if (pdata->operating_mode == FSL_USB2_MPH_HOST) { 332 333 /* Deal with USB Erratum #14 on MPC834x Rev 1.0 & 1.1 chips */ 334 if (pdata->has_fsl_erratum_14 == 1) 335 ehci->has_fsl_port_bug = 1; 336 337 if (pdata->port_enables & FSL_USB2_PORT0_ENABLED) 338 if (ehci_fsl_setup_phy(hcd, pdata->phy_mode, 0)) 339 return -EINVAL; 340 341 if (pdata->port_enables & FSL_USB2_PORT1_ENABLED) 342 if (ehci_fsl_setup_phy(hcd, pdata->phy_mode, 1)) 343 return -EINVAL; 344 } 345 346 if (pdata->have_sysif_regs) { 347 #ifdef CONFIG_FSL_SOC_BOOKE 348 iowrite32be(0x00000008, non_ehci + FSL_SOC_USB_PRICTRL); 349 iowrite32be(0x00000080, non_ehci + FSL_SOC_USB_AGECNTTHRSH); 350 #else 351 iowrite32be(0x0000000c, non_ehci + FSL_SOC_USB_PRICTRL); 352 iowrite32be(0x00000040, non_ehci + FSL_SOC_USB_AGECNTTHRSH); 353 #endif 354 iowrite32be(0x00000001, non_ehci + FSL_SOC_USB_SICTRL); 355 } 356 357 return 0; 358 } 359 360 /* called after powerup, by probe or system-pm "wakeup" */ 361 static int ehci_fsl_reinit(struct ehci_hcd *ehci) 362 { 363 if (ehci_fsl_usb_setup(ehci)) 364 return -EINVAL; 365 366 return 0; 367 } 368 369 /* called during probe() after chip reset completes */ 370 static int ehci_fsl_setup(struct usb_hcd *hcd) 371 { 372 struct ehci_hcd *ehci = hcd_to_ehci(hcd); 373 int retval; 374 struct fsl_usb2_platform_data *pdata; 375 struct device *dev; 376 377 dev = hcd->self.controller; 378 pdata = dev_get_platdata(hcd->self.controller); 379 ehci->big_endian_desc = pdata->big_endian_desc; 380 ehci->big_endian_mmio = pdata->big_endian_mmio; 381 382 /* EHCI registers start at offset 0x100 */ 383 ehci->caps = hcd->regs + 0x100; 384 385 #if defined(CONFIG_PPC_83xx) || defined(CONFIG_PPC_85xx) 386 /* 387 * Deal with MPC834X/85XX that need port power to be cycled 388 * after the power fault condition is removed. Otherwise the 389 * state machine does not reflect PORTSC[CSC] correctly. 390 */ 391 ehci->need_oc_pp_cycle = 1; 392 #endif 393 394 hcd->has_tt = 1; 395 396 retval = ehci_setup(hcd); 397 if (retval) 398 return retval; 399 400 if (of_device_is_compatible(dev->parent->of_node, 401 "fsl,mpc5121-usb2-dr")) { 402 /* 403 * set SBUSCFG:AHBBRST so that control msgs don't 404 * fail when doing heavy PATA writes. 405 */ 406 ehci_writel(ehci, SBUSCFG_INCR8, 407 hcd->regs + FSL_SOC_USB_SBUSCFG); 408 } 409 410 retval = ehci_fsl_reinit(ehci); 411 return retval; 412 } 413 414 struct ehci_fsl { 415 struct ehci_hcd ehci; 416 417 #ifdef CONFIG_PM 418 /* Saved USB PHY settings, need to restore after deep sleep. */ 419 u32 usb_ctrl; 420 #endif 421 }; 422 423 #ifdef CONFIG_PM 424 425 #ifdef CONFIG_PPC_MPC512x 426 static int ehci_fsl_mpc512x_drv_suspend(struct device *dev) 427 { 428 struct usb_hcd *hcd = dev_get_drvdata(dev); 429 struct ehci_hcd *ehci = hcd_to_ehci(hcd); 430 struct fsl_usb2_platform_data *pdata = dev_get_platdata(dev); 431 u32 tmp; 432 433 #ifdef CONFIG_DYNAMIC_DEBUG 434 u32 mode = ehci_readl(ehci, hcd->regs + FSL_SOC_USB_USBMODE); 435 mode &= USBMODE_CM_MASK; 436 tmp = ehci_readl(ehci, hcd->regs + 0x140); /* usbcmd */ 437 438 dev_dbg(dev, "suspend=%d already_suspended=%d " 439 "mode=%d usbcmd %08x\n", pdata->suspended, 440 pdata->already_suspended, mode, tmp); 441 #endif 442 443 /* 444 * If the controller is already suspended, then this must be a 445 * PM suspend. Remember this fact, so that we will leave the 446 * controller suspended at PM resume time. 447 */ 448 if (pdata->suspended) { 449 dev_dbg(dev, "already suspended, leaving early\n"); 450 pdata->already_suspended = 1; 451 return 0; 452 } 453 454 dev_dbg(dev, "suspending...\n"); 455 456 ehci->rh_state = EHCI_RH_SUSPENDED; 457 dev->power.power_state = PMSG_SUSPEND; 458 459 /* ignore non-host interrupts */ 460 clear_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags); 461 462 /* stop the controller */ 463 tmp = ehci_readl(ehci, &ehci->regs->command); 464 tmp &= ~CMD_RUN; 465 ehci_writel(ehci, tmp, &ehci->regs->command); 466 467 /* save EHCI registers */ 468 pdata->pm_command = ehci_readl(ehci, &ehci->regs->command); 469 pdata->pm_command &= ~CMD_RUN; 470 pdata->pm_status = ehci_readl(ehci, &ehci->regs->status); 471 pdata->pm_intr_enable = ehci_readl(ehci, &ehci->regs->intr_enable); 472 pdata->pm_frame_index = ehci_readl(ehci, &ehci->regs->frame_index); 473 pdata->pm_segment = ehci_readl(ehci, &ehci->regs->segment); 474 pdata->pm_frame_list = ehci_readl(ehci, &ehci->regs->frame_list); 475 pdata->pm_async_next = ehci_readl(ehci, &ehci->regs->async_next); 476 pdata->pm_configured_flag = 477 ehci_readl(ehci, &ehci->regs->configured_flag); 478 pdata->pm_portsc = ehci_readl(ehci, &ehci->regs->port_status[0]); 479 pdata->pm_usbgenctrl = ehci_readl(ehci, 480 hcd->regs + FSL_SOC_USB_USBGENCTRL); 481 482 /* clear the W1C bits */ 483 pdata->pm_portsc &= cpu_to_hc32(ehci, ~PORT_RWC_BITS); 484 485 pdata->suspended = 1; 486 487 /* clear PP to cut power to the port */ 488 tmp = ehci_readl(ehci, &ehci->regs->port_status[0]); 489 tmp &= ~PORT_POWER; 490 ehci_writel(ehci, tmp, &ehci->regs->port_status[0]); 491 492 return 0; 493 } 494 495 static int ehci_fsl_mpc512x_drv_resume(struct device *dev) 496 { 497 struct usb_hcd *hcd = dev_get_drvdata(dev); 498 struct ehci_hcd *ehci = hcd_to_ehci(hcd); 499 struct fsl_usb2_platform_data *pdata = dev_get_platdata(dev); 500 u32 tmp; 501 502 dev_dbg(dev, "suspend=%d already_suspended=%d\n", 503 pdata->suspended, pdata->already_suspended); 504 505 /* 506 * If the controller was already suspended at suspend time, 507 * then don't resume it now. 508 */ 509 if (pdata->already_suspended) { 510 dev_dbg(dev, "already suspended, leaving early\n"); 511 pdata->already_suspended = 0; 512 return 0; 513 } 514 515 if (!pdata->suspended) { 516 dev_dbg(dev, "not suspended, leaving early\n"); 517 return 0; 518 } 519 520 pdata->suspended = 0; 521 522 dev_dbg(dev, "resuming...\n"); 523 524 /* set host mode */ 525 tmp = USBMODE_CM_HOST | (pdata->es ? USBMODE_ES : 0); 526 ehci_writel(ehci, tmp, hcd->regs + FSL_SOC_USB_USBMODE); 527 528 ehci_writel(ehci, pdata->pm_usbgenctrl, 529 hcd->regs + FSL_SOC_USB_USBGENCTRL); 530 ehci_writel(ehci, ISIPHYCTRL_PXE | ISIPHYCTRL_PHYE, 531 hcd->regs + FSL_SOC_USB_ISIPHYCTRL); 532 533 ehci_writel(ehci, SBUSCFG_INCR8, hcd->regs + FSL_SOC_USB_SBUSCFG); 534 535 /* restore EHCI registers */ 536 ehci_writel(ehci, pdata->pm_command, &ehci->regs->command); 537 ehci_writel(ehci, pdata->pm_intr_enable, &ehci->regs->intr_enable); 538 ehci_writel(ehci, pdata->pm_frame_index, &ehci->regs->frame_index); 539 ehci_writel(ehci, pdata->pm_segment, &ehci->regs->segment); 540 ehci_writel(ehci, pdata->pm_frame_list, &ehci->regs->frame_list); 541 ehci_writel(ehci, pdata->pm_async_next, &ehci->regs->async_next); 542 ehci_writel(ehci, pdata->pm_configured_flag, 543 &ehci->regs->configured_flag); 544 ehci_writel(ehci, pdata->pm_portsc, &ehci->regs->port_status[0]); 545 546 set_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags); 547 ehci->rh_state = EHCI_RH_RUNNING; 548 dev->power.power_state = PMSG_ON; 549 550 tmp = ehci_readl(ehci, &ehci->regs->command); 551 tmp |= CMD_RUN; 552 ehci_writel(ehci, tmp, &ehci->regs->command); 553 554 usb_hcd_resume_root_hub(hcd); 555 556 return 0; 557 } 558 #else 559 static inline int ehci_fsl_mpc512x_drv_suspend(struct device *dev) 560 { 561 return 0; 562 } 563 564 static inline int ehci_fsl_mpc512x_drv_resume(struct device *dev) 565 { 566 return 0; 567 } 568 #endif /* CONFIG_PPC_MPC512x */ 569 570 static struct ehci_fsl *hcd_to_ehci_fsl(struct usb_hcd *hcd) 571 { 572 struct ehci_hcd *ehci = hcd_to_ehci(hcd); 573 574 return container_of(ehci, struct ehci_fsl, ehci); 575 } 576 577 static int ehci_fsl_drv_suspend(struct device *dev) 578 { 579 struct usb_hcd *hcd = dev_get_drvdata(dev); 580 struct ehci_fsl *ehci_fsl = hcd_to_ehci_fsl(hcd); 581 void __iomem *non_ehci = hcd->regs; 582 583 if (of_device_is_compatible(dev->parent->of_node, 584 "fsl,mpc5121-usb2-dr")) { 585 return ehci_fsl_mpc512x_drv_suspend(dev); 586 } 587 588 ehci_prepare_ports_for_controller_suspend(hcd_to_ehci(hcd), 589 device_may_wakeup(dev)); 590 if (!fsl_deep_sleep()) 591 return 0; 592 593 ehci_fsl->usb_ctrl = ioread32be(non_ehci + FSL_SOC_USB_CTRL); 594 return 0; 595 } 596 597 static int ehci_fsl_drv_resume(struct device *dev) 598 { 599 struct usb_hcd *hcd = dev_get_drvdata(dev); 600 struct ehci_fsl *ehci_fsl = hcd_to_ehci_fsl(hcd); 601 struct ehci_hcd *ehci = hcd_to_ehci(hcd); 602 void __iomem *non_ehci = hcd->regs; 603 604 if (of_device_is_compatible(dev->parent->of_node, 605 "fsl,mpc5121-usb2-dr")) { 606 return ehci_fsl_mpc512x_drv_resume(dev); 607 } 608 609 ehci_prepare_ports_for_controller_resume(ehci); 610 if (!fsl_deep_sleep()) 611 return 0; 612 613 usb_root_hub_lost_power(hcd->self.root_hub); 614 615 /* Restore USB PHY settings and enable the controller. */ 616 iowrite32be(ehci_fsl->usb_ctrl, non_ehci + FSL_SOC_USB_CTRL); 617 618 ehci_reset(ehci); 619 ehci_fsl_reinit(ehci); 620 621 return 0; 622 } 623 624 static int ehci_fsl_drv_restore(struct device *dev) 625 { 626 struct usb_hcd *hcd = dev_get_drvdata(dev); 627 628 usb_root_hub_lost_power(hcd->self.root_hub); 629 return 0; 630 } 631 632 static const struct dev_pm_ops ehci_fsl_pm_ops = { 633 .suspend = ehci_fsl_drv_suspend, 634 .resume = ehci_fsl_drv_resume, 635 .restore = ehci_fsl_drv_restore, 636 }; 637 638 #define EHCI_FSL_PM_OPS (&ehci_fsl_pm_ops) 639 #else 640 #define EHCI_FSL_PM_OPS NULL 641 #endif /* CONFIG_PM */ 642 643 #ifdef CONFIG_USB_OTG 644 static int ehci_start_port_reset(struct usb_hcd *hcd, unsigned port) 645 { 646 struct ehci_hcd *ehci = hcd_to_ehci(hcd); 647 u32 status; 648 649 if (!port) 650 return -EINVAL; 651 652 port--; 653 654 /* start port reset before HNP protocol time out */ 655 status = readl(&ehci->regs->port_status[port]); 656 if (!(status & PORT_CONNECT)) 657 return -ENODEV; 658 659 /* hub_wq will finish the reset later */ 660 if (ehci_is_TDI(ehci)) { 661 writel(PORT_RESET | 662 (status & ~(PORT_CSC | PORT_PEC | PORT_OCC)), 663 &ehci->regs->port_status[port]); 664 } else { 665 writel(PORT_RESET, &ehci->regs->port_status[port]); 666 } 667 668 return 0; 669 } 670 #else 671 #define ehci_start_port_reset NULL 672 #endif /* CONFIG_USB_OTG */ 673 674 static const struct ehci_driver_overrides ehci_fsl_overrides __initconst = { 675 .extra_priv_size = sizeof(struct ehci_fsl), 676 .reset = ehci_fsl_setup, 677 }; 678 679 /** 680 * fsl_ehci_drv_remove - shutdown processing for FSL-based HCDs 681 * @pdev: USB Host Controller being removed 682 * 683 * Context: task context, might sleep 684 * 685 * Reverses the effect of usb_hcd_fsl_probe(). 686 */ 687 static int fsl_ehci_drv_remove(struct platform_device *pdev) 688 { 689 struct fsl_usb2_platform_data *pdata = dev_get_platdata(&pdev->dev); 690 struct usb_hcd *hcd = platform_get_drvdata(pdev); 691 692 if (!IS_ERR_OR_NULL(hcd->usb_phy)) { 693 otg_set_host(hcd->usb_phy->otg, NULL); 694 usb_put_phy(hcd->usb_phy); 695 } 696 697 usb_remove_hcd(hcd); 698 699 /* 700 * do platform specific un-initialization: 701 * release iomux pins, disable clock, etc. 702 */ 703 if (pdata->exit) 704 pdata->exit(pdev); 705 usb_put_hcd(hcd); 706 707 return 0; 708 } 709 710 static struct platform_driver ehci_fsl_driver = { 711 .probe = fsl_ehci_drv_probe, 712 .remove = fsl_ehci_drv_remove, 713 .shutdown = usb_hcd_platform_shutdown, 714 .driver = { 715 .name = DRV_NAME, 716 .pm = EHCI_FSL_PM_OPS, 717 }, 718 }; 719 720 static int __init ehci_fsl_init(void) 721 { 722 if (usb_disabled()) 723 return -ENODEV; 724 725 ehci_init_driver(&fsl_ehci_hc_driver, &ehci_fsl_overrides); 726 727 fsl_ehci_hc_driver.product_desc = 728 "Freescale On-Chip EHCI Host Controller"; 729 fsl_ehci_hc_driver.start_port_reset = ehci_start_port_reset; 730 731 732 return platform_driver_register(&ehci_fsl_driver); 733 } 734 module_init(ehci_fsl_init); 735 736 static void __exit ehci_fsl_cleanup(void) 737 { 738 platform_driver_unregister(&ehci_fsl_driver); 739 } 740 module_exit(ehci_fsl_cleanup); 741 742 MODULE_DESCRIPTION(DRIVER_DESC); 743 MODULE_LICENSE("GPL"); 744 MODULE_ALIAS("platform:" DRV_NAME); 745