Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at v3.1-rc9 787 lines 20 kB view raw
1/* 2 * EHCI-compliant USB host controller driver for NVIDIA Tegra SoCs 3 * 4 * Copyright (C) 2010 Google, Inc. 5 * Copyright (C) 2009 NVIDIA Corporation 6 * 7 * This program is free software; you can redistribute it and/or modify it 8 * under the terms of the GNU General Public License as published by the 9 * Free Software Foundation; either version 2 of the License, or (at your 10 * option) any later version. 11 * 12 * This program is distributed in the hope that it will be useful, but WITHOUT 13 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 14 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 15 * more details. 16 * 17 */ 18 19#include <linux/clk.h> 20#include <linux/platform_device.h> 21#include <linux/platform_data/tegra_usb.h> 22#include <linux/irq.h> 23#include <linux/usb/otg.h> 24#include <mach/usb_phy.h> 25 26#define TEGRA_USB_DMA_ALIGN 32 27 28struct tegra_ehci_hcd { 29 struct ehci_hcd *ehci; 30 struct tegra_usb_phy *phy; 31 struct clk *clk; 32 struct clk *emc_clk; 33 struct otg_transceiver *transceiver; 34 int host_resumed; 35 int bus_suspended; 36 int port_resuming; 37 int power_down_on_bus_suspend; 38 enum tegra_usb_phy_port_speed port_speed; 39}; 40 41static void tegra_ehci_power_up(struct usb_hcd *hcd) 42{ 43 struct tegra_ehci_hcd *tegra = dev_get_drvdata(hcd->self.controller); 44 45 clk_enable(tegra->emc_clk); 46 clk_enable(tegra->clk); 47 tegra_usb_phy_power_on(tegra->phy); 48 tegra->host_resumed = 1; 49} 50 51static void tegra_ehci_power_down(struct usb_hcd *hcd) 52{ 53 struct tegra_ehci_hcd *tegra = dev_get_drvdata(hcd->self.controller); 54 55 tegra->host_resumed = 0; 56 tegra_usb_phy_power_off(tegra->phy); 57 clk_disable(tegra->clk); 58 clk_disable(tegra->emc_clk); 59} 60 61static int tegra_ehci_internal_port_reset( 62 struct ehci_hcd *ehci, 63 u32 __iomem *portsc_reg 64) 65{ 66 u32 temp; 67 unsigned long flags; 68 int retval = 0; 69 int i, tries; 70 u32 saved_usbintr; 71 72 spin_lock_irqsave(&ehci->lock, flags); 73 saved_usbintr = ehci_readl(ehci, &ehci->regs->intr_enable); 74 /* disable USB interrupt */ 75 ehci_writel(ehci, 0, &ehci->regs->intr_enable); 76 spin_unlock_irqrestore(&ehci->lock, flags); 77 78 /* 79 * Here we have to do Port Reset at most twice for 80 * Port Enable bit to be set. 81 */ 82 for (i = 0; i < 2; i++) { 83 temp = ehci_readl(ehci, portsc_reg); 84 temp |= PORT_RESET; 85 ehci_writel(ehci, temp, portsc_reg); 86 mdelay(10); 87 temp &= ~PORT_RESET; 88 ehci_writel(ehci, temp, portsc_reg); 89 mdelay(1); 90 tries = 100; 91 do { 92 mdelay(1); 93 /* 94 * Up to this point, Port Enable bit is 95 * expected to be set after 2 ms waiting. 96 * USB1 usually takes extra 45 ms, for safety, 97 * we take 100 ms as timeout. 98 */ 99 temp = ehci_readl(ehci, portsc_reg); 100 } while (!(temp & PORT_PE) && tries--); 101 if (temp & PORT_PE) 102 break; 103 } 104 if (i == 2) 105 retval = -ETIMEDOUT; 106 107 /* 108 * Clear Connect Status Change bit if it's set. 109 * We can't clear PORT_PEC. It will also cause PORT_PE to be cleared. 110 */ 111 if (temp & PORT_CSC) 112 ehci_writel(ehci, PORT_CSC, portsc_reg); 113 114 /* 115 * Write to clear any interrupt status bits that might be set 116 * during port reset. 117 */ 118 temp = ehci_readl(ehci, &ehci->regs->status); 119 ehci_writel(ehci, temp, &ehci->regs->status); 120 121 /* restore original interrupt enable bits */ 122 ehci_writel(ehci, saved_usbintr, &ehci->regs->intr_enable); 123 return retval; 124} 125 126static int tegra_ehci_hub_control( 127 struct usb_hcd *hcd, 128 u16 typeReq, 129 u16 wValue, 130 u16 wIndex, 131 char *buf, 132 u16 wLength 133) 134{ 135 struct ehci_hcd *ehci = hcd_to_ehci(hcd); 136 struct tegra_ehci_hcd *tegra = dev_get_drvdata(hcd->self.controller); 137 u32 __iomem *status_reg; 138 u32 temp; 139 unsigned long flags; 140 int retval = 0; 141 142 status_reg = &ehci->regs->port_status[(wIndex & 0xff) - 1]; 143 144 spin_lock_irqsave(&ehci->lock, flags); 145 146 /* 147 * In ehci_hub_control() for USB_PORT_FEAT_ENABLE clears the other bits 148 * that are write on clear, by writing back the register read value, so 149 * USB_PORT_FEAT_ENABLE is handled by masking the set on clear bits 150 */ 151 if (typeReq == ClearPortFeature && wValue == USB_PORT_FEAT_ENABLE) { 152 temp = ehci_readl(ehci, status_reg) & ~PORT_RWC_BITS; 153 ehci_writel(ehci, temp & ~PORT_PE, status_reg); 154 goto done; 155 } 156 157 else if (typeReq == GetPortStatus) { 158 temp = ehci_readl(ehci, status_reg); 159 if (tegra->port_resuming && !(temp & PORT_SUSPEND)) { 160 /* Resume completed, re-enable disconnect detection */ 161 tegra->port_resuming = 0; 162 tegra_usb_phy_postresume(tegra->phy); 163 } 164 } 165 166 else if (typeReq == SetPortFeature && wValue == USB_PORT_FEAT_SUSPEND) { 167 temp = ehci_readl(ehci, status_reg); 168 if ((temp & PORT_PE) == 0 || (temp & PORT_RESET) != 0) { 169 retval = -EPIPE; 170 goto done; 171 } 172 173 temp &= ~PORT_WKCONN_E; 174 temp |= PORT_WKDISC_E | PORT_WKOC_E; 175 ehci_writel(ehci, temp | PORT_SUSPEND, status_reg); 176 177 /* 178 * If a transaction is in progress, there may be a delay in 179 * suspending the port. Poll until the port is suspended. 180 */ 181 if (handshake(ehci, status_reg, PORT_SUSPEND, 182 PORT_SUSPEND, 5000)) 183 pr_err("%s: timeout waiting for SUSPEND\n", __func__); 184 185 set_bit((wIndex & 0xff) - 1, &ehci->suspended_ports); 186 goto done; 187 } 188 189 /* For USB1 port we need to issue Port Reset twice internally */ 190 if (tegra->phy->instance == 0 && 191 (typeReq == SetPortFeature && wValue == USB_PORT_FEAT_RESET)) { 192 spin_unlock_irqrestore(&ehci->lock, flags); 193 return tegra_ehci_internal_port_reset(ehci, status_reg); 194 } 195 196 /* 197 * Tegra host controller will time the resume operation to clear the bit 198 * when the port control state switches to HS or FS Idle. This behavior 199 * is different from EHCI where the host controller driver is required 200 * to set this bit to a zero after the resume duration is timed in the 201 * driver. 202 */ 203 else if (typeReq == ClearPortFeature && 204 wValue == USB_PORT_FEAT_SUSPEND) { 205 temp = ehci_readl(ehci, status_reg); 206 if ((temp & PORT_RESET) || !(temp & PORT_PE)) { 207 retval = -EPIPE; 208 goto done; 209 } 210 211 if (!(temp & PORT_SUSPEND)) 212 goto done; 213 214 /* Disable disconnect detection during port resume */ 215 tegra_usb_phy_preresume(tegra->phy); 216 217 ehci->reset_done[wIndex-1] = jiffies + msecs_to_jiffies(25); 218 219 temp &= ~(PORT_RWC_BITS | PORT_WAKE_BITS); 220 /* start resume signalling */ 221 ehci_writel(ehci, temp | PORT_RESUME, status_reg); 222 223 spin_unlock_irqrestore(&ehci->lock, flags); 224 msleep(20); 225 spin_lock_irqsave(&ehci->lock, flags); 226 227 /* Poll until the controller clears RESUME and SUSPEND */ 228 if (handshake(ehci, status_reg, PORT_RESUME, 0, 2000)) 229 pr_err("%s: timeout waiting for RESUME\n", __func__); 230 if (handshake(ehci, status_reg, PORT_SUSPEND, 0, 2000)) 231 pr_err("%s: timeout waiting for SUSPEND\n", __func__); 232 233 ehci->reset_done[wIndex-1] = 0; 234 235 tegra->port_resuming = 1; 236 goto done; 237 } 238 239 spin_unlock_irqrestore(&ehci->lock, flags); 240 241 /* Handle the hub control events here */ 242 return ehci_hub_control(hcd, typeReq, wValue, wIndex, buf, wLength); 243done: 244 spin_unlock_irqrestore(&ehci->lock, flags); 245 return retval; 246} 247 248static void tegra_ehci_restart(struct usb_hcd *hcd) 249{ 250 struct ehci_hcd *ehci = hcd_to_ehci(hcd); 251 252 ehci_reset(ehci); 253 254 /* setup the frame list and Async q heads */ 255 ehci_writel(ehci, ehci->periodic_dma, &ehci->regs->frame_list); 256 ehci_writel(ehci, (u32)ehci->async->qh_dma, &ehci->regs->async_next); 257 /* setup the command register and set the controller in RUN mode */ 258 ehci->command &= ~(CMD_LRESET|CMD_IAAD|CMD_PSE|CMD_ASE|CMD_RESET); 259 ehci->command |= CMD_RUN; 260 ehci_writel(ehci, ehci->command, &ehci->regs->command); 261 262 down_write(&ehci_cf_port_reset_rwsem); 263 ehci_writel(ehci, FLAG_CF, &ehci->regs->configured_flag); 264 /* flush posted writes */ 265 ehci_readl(ehci, &ehci->regs->command); 266 up_write(&ehci_cf_port_reset_rwsem); 267} 268 269static int tegra_usb_suspend(struct usb_hcd *hcd) 270{ 271 struct tegra_ehci_hcd *tegra = dev_get_drvdata(hcd->self.controller); 272 struct ehci_regs __iomem *hw = tegra->ehci->regs; 273 unsigned long flags; 274 275 spin_lock_irqsave(&tegra->ehci->lock, flags); 276 277 tegra->port_speed = (readl(&hw->port_status[0]) >> 26) & 0x3; 278 ehci_halt(tegra->ehci); 279 clear_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags); 280 281 spin_unlock_irqrestore(&tegra->ehci->lock, flags); 282 283 tegra_ehci_power_down(hcd); 284 return 0; 285} 286 287static int tegra_usb_resume(struct usb_hcd *hcd) 288{ 289 struct tegra_ehci_hcd *tegra = dev_get_drvdata(hcd->self.controller); 290 struct ehci_hcd *ehci = hcd_to_ehci(hcd); 291 struct ehci_regs __iomem *hw = ehci->regs; 292 unsigned long val; 293 294 set_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags); 295 tegra_ehci_power_up(hcd); 296 297 if (tegra->port_speed > TEGRA_USB_PHY_PORT_SPEED_HIGH) { 298 /* Wait for the phy to detect new devices 299 * before we restart the controller */ 300 msleep(10); 301 goto restart; 302 } 303 304 /* Force the phy to keep data lines in suspend state */ 305 tegra_ehci_phy_restore_start(tegra->phy, tegra->port_speed); 306 307 /* Enable host mode */ 308 tdi_reset(ehci); 309 310 /* Enable Port Power */ 311 val = readl(&hw->port_status[0]); 312 val |= PORT_POWER; 313 writel(val, &hw->port_status[0]); 314 udelay(10); 315 316 /* Check if the phy resume from LP0. When the phy resume from LP0 317 * USB register will be reset. */ 318 if (!readl(&hw->async_next)) { 319 /* Program the field PTC based on the saved speed mode */ 320 val = readl(&hw->port_status[0]); 321 val &= ~PORT_TEST(~0); 322 if (tegra->port_speed == TEGRA_USB_PHY_PORT_SPEED_HIGH) 323 val |= PORT_TEST_FORCE; 324 else if (tegra->port_speed == TEGRA_USB_PHY_PORT_SPEED_FULL) 325 val |= PORT_TEST(6); 326 else if (tegra->port_speed == TEGRA_USB_PHY_PORT_SPEED_LOW) 327 val |= PORT_TEST(7); 328 writel(val, &hw->port_status[0]); 329 udelay(10); 330 331 /* Disable test mode by setting PTC field to NORMAL_OP */ 332 val = readl(&hw->port_status[0]); 333 val &= ~PORT_TEST(~0); 334 writel(val, &hw->port_status[0]); 335 udelay(10); 336 } 337 338 /* Poll until CCS is enabled */ 339 if (handshake(ehci, &hw->port_status[0], PORT_CONNECT, 340 PORT_CONNECT, 2000)) { 341 pr_err("%s: timeout waiting for PORT_CONNECT\n", __func__); 342 goto restart; 343 } 344 345 /* Poll until PE is enabled */ 346 if (handshake(ehci, &hw->port_status[0], PORT_PE, 347 PORT_PE, 2000)) { 348 pr_err("%s: timeout waiting for USB_PORTSC1_PE\n", __func__); 349 goto restart; 350 } 351 352 /* Clear the PCI status, to avoid an interrupt taken upon resume */ 353 val = readl(&hw->status); 354 val |= STS_PCD; 355 writel(val, &hw->status); 356 357 /* Put controller in suspend mode by writing 1 to SUSP bit of PORTSC */ 358 val = readl(&hw->port_status[0]); 359 if ((val & PORT_POWER) && (val & PORT_PE)) { 360 val |= PORT_SUSPEND; 361 writel(val, &hw->port_status[0]); 362 363 /* Wait until port suspend completes */ 364 if (handshake(ehci, &hw->port_status[0], PORT_SUSPEND, 365 PORT_SUSPEND, 1000)) { 366 pr_err("%s: timeout waiting for PORT_SUSPEND\n", 367 __func__); 368 goto restart; 369 } 370 } 371 372 tegra_ehci_phy_restore_end(tegra->phy); 373 return 0; 374 375restart: 376 if (tegra->port_speed <= TEGRA_USB_PHY_PORT_SPEED_HIGH) 377 tegra_ehci_phy_restore_end(tegra->phy); 378 379 tegra_ehci_restart(hcd); 380 return 0; 381} 382 383static void tegra_ehci_shutdown(struct usb_hcd *hcd) 384{ 385 struct tegra_ehci_hcd *tegra = dev_get_drvdata(hcd->self.controller); 386 387 /* ehci_shutdown touches the USB controller registers, make sure 388 * controller has clocks to it */ 389 if (!tegra->host_resumed) 390 tegra_ehci_power_up(hcd); 391 392 ehci_shutdown(hcd); 393} 394 395static int tegra_ehci_setup(struct usb_hcd *hcd) 396{ 397 struct ehci_hcd *ehci = hcd_to_ehci(hcd); 398 int retval; 399 400 /* EHCI registers start at offset 0x100 */ 401 ehci->caps = hcd->regs + 0x100; 402 ehci->regs = hcd->regs + 0x100 + 403 HC_LENGTH(ehci, readl(&ehci->caps->hc_capbase)); 404 405 dbg_hcs_params(ehci, "reset"); 406 dbg_hcc_params(ehci, "reset"); 407 408 /* cache this readonly data; minimize chip reads */ 409 ehci->hcs_params = readl(&ehci->caps->hcs_params); 410 411 /* switch to host mode */ 412 hcd->has_tt = 1; 413 ehci_reset(ehci); 414 415 retval = ehci_halt(ehci); 416 if (retval) 417 return retval; 418 419 /* data structure init */ 420 retval = ehci_init(hcd); 421 if (retval) 422 return retval; 423 424 ehci->sbrn = 0x20; 425 426 ehci_port_power(ehci, 1); 427 return retval; 428} 429 430#ifdef CONFIG_PM 431static int tegra_ehci_bus_suspend(struct usb_hcd *hcd) 432{ 433 struct tegra_ehci_hcd *tegra = dev_get_drvdata(hcd->self.controller); 434 int error_status = 0; 435 436 error_status = ehci_bus_suspend(hcd); 437 if (!error_status && tegra->power_down_on_bus_suspend) { 438 tegra_usb_suspend(hcd); 439 tegra->bus_suspended = 1; 440 } 441 442 return error_status; 443} 444 445static int tegra_ehci_bus_resume(struct usb_hcd *hcd) 446{ 447 struct tegra_ehci_hcd *tegra = dev_get_drvdata(hcd->self.controller); 448 449 if (tegra->bus_suspended && tegra->power_down_on_bus_suspend) { 450 tegra_usb_resume(hcd); 451 tegra->bus_suspended = 0; 452 } 453 454 tegra_usb_phy_preresume(tegra->phy); 455 tegra->port_resuming = 1; 456 return ehci_bus_resume(hcd); 457} 458#endif 459 460struct temp_buffer { 461 void *kmalloc_ptr; 462 void *old_xfer_buffer; 463 u8 data[0]; 464}; 465 466static void free_temp_buffer(struct urb *urb) 467{ 468 enum dma_data_direction dir; 469 struct temp_buffer *temp; 470 471 if (!(urb->transfer_flags & URB_ALIGNED_TEMP_BUFFER)) 472 return; 473 474 dir = usb_urb_dir_in(urb) ? DMA_FROM_DEVICE : DMA_TO_DEVICE; 475 476 temp = container_of(urb->transfer_buffer, struct temp_buffer, 477 data); 478 479 if (dir == DMA_FROM_DEVICE) 480 memcpy(temp->old_xfer_buffer, temp->data, 481 urb->transfer_buffer_length); 482 urb->transfer_buffer = temp->old_xfer_buffer; 483 kfree(temp->kmalloc_ptr); 484 485 urb->transfer_flags &= ~URB_ALIGNED_TEMP_BUFFER; 486} 487 488static int alloc_temp_buffer(struct urb *urb, gfp_t mem_flags) 489{ 490 enum dma_data_direction dir; 491 struct temp_buffer *temp, *kmalloc_ptr; 492 size_t kmalloc_size; 493 494 if (urb->num_sgs || urb->sg || 495 urb->transfer_buffer_length == 0 || 496 !((uintptr_t)urb->transfer_buffer & (TEGRA_USB_DMA_ALIGN - 1))) 497 return 0; 498 499 dir = usb_urb_dir_in(urb) ? DMA_FROM_DEVICE : DMA_TO_DEVICE; 500 501 /* Allocate a buffer with enough padding for alignment */ 502 kmalloc_size = urb->transfer_buffer_length + 503 sizeof(struct temp_buffer) + TEGRA_USB_DMA_ALIGN - 1; 504 505 kmalloc_ptr = kmalloc(kmalloc_size, mem_flags); 506 if (!kmalloc_ptr) 507 return -ENOMEM; 508 509 /* Position our struct temp_buffer such that data is aligned */ 510 temp = PTR_ALIGN(kmalloc_ptr + 1, TEGRA_USB_DMA_ALIGN) - 1; 511 512 temp->kmalloc_ptr = kmalloc_ptr; 513 temp->old_xfer_buffer = urb->transfer_buffer; 514 if (dir == DMA_TO_DEVICE) 515 memcpy(temp->data, urb->transfer_buffer, 516 urb->transfer_buffer_length); 517 urb->transfer_buffer = temp->data; 518 519 urb->transfer_flags |= URB_ALIGNED_TEMP_BUFFER; 520 521 return 0; 522} 523 524static int tegra_ehci_map_urb_for_dma(struct usb_hcd *hcd, struct urb *urb, 525 gfp_t mem_flags) 526{ 527 int ret; 528 529 ret = alloc_temp_buffer(urb, mem_flags); 530 if (ret) 531 return ret; 532 533 ret = usb_hcd_map_urb_for_dma(hcd, urb, mem_flags); 534 if (ret) 535 free_temp_buffer(urb); 536 537 return ret; 538} 539 540static void tegra_ehci_unmap_urb_for_dma(struct usb_hcd *hcd, struct urb *urb) 541{ 542 usb_hcd_unmap_urb_for_dma(hcd, urb); 543 free_temp_buffer(urb); 544} 545 546static const struct hc_driver tegra_ehci_hc_driver = { 547 .description = hcd_name, 548 .product_desc = "Tegra EHCI Host Controller", 549 .hcd_priv_size = sizeof(struct ehci_hcd), 550 551 .flags = HCD_USB2 | HCD_MEMORY, 552 553 .reset = tegra_ehci_setup, 554 .irq = ehci_irq, 555 556 .start = ehci_run, 557 .stop = ehci_stop, 558 .shutdown = tegra_ehci_shutdown, 559 .urb_enqueue = ehci_urb_enqueue, 560 .urb_dequeue = ehci_urb_dequeue, 561 .map_urb_for_dma = tegra_ehci_map_urb_for_dma, 562 .unmap_urb_for_dma = tegra_ehci_unmap_urb_for_dma, 563 .endpoint_disable = ehci_endpoint_disable, 564 .endpoint_reset = ehci_endpoint_reset, 565 .get_frame_number = ehci_get_frame, 566 .hub_status_data = ehci_hub_status_data, 567 .hub_control = tegra_ehci_hub_control, 568 .clear_tt_buffer_complete = ehci_clear_tt_buffer_complete, 569#ifdef CONFIG_PM 570 .bus_suspend = tegra_ehci_bus_suspend, 571 .bus_resume = tegra_ehci_bus_resume, 572#endif 573 .relinquish_port = ehci_relinquish_port, 574 .port_handed_over = ehci_port_handed_over, 575}; 576 577static int tegra_ehci_probe(struct platform_device *pdev) 578{ 579 struct resource *res; 580 struct usb_hcd *hcd; 581 struct tegra_ehci_hcd *tegra; 582 struct tegra_ehci_platform_data *pdata; 583 int err = 0; 584 int irq; 585 int instance = pdev->id; 586 587 pdata = pdev->dev.platform_data; 588 if (!pdata) { 589 dev_err(&pdev->dev, "Platform data missing\n"); 590 return -EINVAL; 591 } 592 593 tegra = kzalloc(sizeof(struct tegra_ehci_hcd), GFP_KERNEL); 594 if (!tegra) 595 return -ENOMEM; 596 597 hcd = usb_create_hcd(&tegra_ehci_hc_driver, &pdev->dev, 598 dev_name(&pdev->dev)); 599 if (!hcd) { 600 dev_err(&pdev->dev, "Unable to create HCD\n"); 601 err = -ENOMEM; 602 goto fail_hcd; 603 } 604 605 platform_set_drvdata(pdev, tegra); 606 607 tegra->clk = clk_get(&pdev->dev, NULL); 608 if (IS_ERR(tegra->clk)) { 609 dev_err(&pdev->dev, "Can't get ehci clock\n"); 610 err = PTR_ERR(tegra->clk); 611 goto fail_clk; 612 } 613 614 err = clk_enable(tegra->clk); 615 if (err) 616 goto fail_clken; 617 618 tegra->emc_clk = clk_get(&pdev->dev, "emc"); 619 if (IS_ERR(tegra->emc_clk)) { 620 dev_err(&pdev->dev, "Can't get emc clock\n"); 621 err = PTR_ERR(tegra->emc_clk); 622 goto fail_emc_clk; 623 } 624 625 clk_enable(tegra->emc_clk); 626 clk_set_rate(tegra->emc_clk, 400000000); 627 628 res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 629 if (!res) { 630 dev_err(&pdev->dev, "Failed to get I/O memory\n"); 631 err = -ENXIO; 632 goto fail_io; 633 } 634 hcd->rsrc_start = res->start; 635 hcd->rsrc_len = resource_size(res); 636 hcd->regs = ioremap(res->start, resource_size(res)); 637 if (!hcd->regs) { 638 dev_err(&pdev->dev, "Failed to remap I/O memory\n"); 639 err = -ENOMEM; 640 goto fail_io; 641 } 642 643 tegra->phy = tegra_usb_phy_open(instance, hcd->regs, pdata->phy_config, 644 TEGRA_USB_PHY_MODE_HOST); 645 if (IS_ERR(tegra->phy)) { 646 dev_err(&pdev->dev, "Failed to open USB phy\n"); 647 err = -ENXIO; 648 goto fail_phy; 649 } 650 651 err = tegra_usb_phy_power_on(tegra->phy); 652 if (err) { 653 dev_err(&pdev->dev, "Failed to power on the phy\n"); 654 goto fail; 655 } 656 657 tegra->host_resumed = 1; 658 tegra->power_down_on_bus_suspend = pdata->power_down_on_bus_suspend; 659 tegra->ehci = hcd_to_ehci(hcd); 660 661 irq = platform_get_irq(pdev, 0); 662 if (!irq) { 663 dev_err(&pdev->dev, "Failed to get IRQ\n"); 664 err = -ENODEV; 665 goto fail; 666 } 667 set_irq_flags(irq, IRQF_VALID); 668 669#ifdef CONFIG_USB_OTG_UTILS 670 if (pdata->operating_mode == TEGRA_USB_OTG) { 671 tegra->transceiver = otg_get_transceiver(); 672 if (tegra->transceiver) 673 otg_set_host(tegra->transceiver, &hcd->self); 674 } 675#endif 676 677 err = usb_add_hcd(hcd, irq, IRQF_DISABLED | IRQF_SHARED); 678 if (err) { 679 dev_err(&pdev->dev, "Failed to add USB HCD\n"); 680 goto fail; 681 } 682 683 return err; 684 685fail: 686#ifdef CONFIG_USB_OTG_UTILS 687 if (tegra->transceiver) { 688 otg_set_host(tegra->transceiver, NULL); 689 otg_put_transceiver(tegra->transceiver); 690 } 691#endif 692 tegra_usb_phy_close(tegra->phy); 693fail_phy: 694 iounmap(hcd->regs); 695fail_io: 696 clk_disable(tegra->emc_clk); 697 clk_put(tegra->emc_clk); 698fail_emc_clk: 699 clk_disable(tegra->clk); 700fail_clken: 701 clk_put(tegra->clk); 702fail_clk: 703 usb_put_hcd(hcd); 704fail_hcd: 705 kfree(tegra); 706 return err; 707} 708 709#ifdef CONFIG_PM 710static int tegra_ehci_resume(struct platform_device *pdev) 711{ 712 struct tegra_ehci_hcd *tegra = platform_get_drvdata(pdev); 713 struct usb_hcd *hcd = ehci_to_hcd(tegra->ehci); 714 715 if (tegra->bus_suspended) 716 return 0; 717 718 return tegra_usb_resume(hcd); 719} 720 721static int tegra_ehci_suspend(struct platform_device *pdev, pm_message_t state) 722{ 723 struct tegra_ehci_hcd *tegra = platform_get_drvdata(pdev); 724 struct usb_hcd *hcd = ehci_to_hcd(tegra->ehci); 725 726 if (tegra->bus_suspended) 727 return 0; 728 729 if (time_before(jiffies, tegra->ehci->next_statechange)) 730 msleep(10); 731 732 return tegra_usb_suspend(hcd); 733} 734#endif 735 736static int tegra_ehci_remove(struct platform_device *pdev) 737{ 738 struct tegra_ehci_hcd *tegra = platform_get_drvdata(pdev); 739 struct usb_hcd *hcd = ehci_to_hcd(tegra->ehci); 740 741 if (tegra == NULL || hcd == NULL) 742 return -EINVAL; 743 744#ifdef CONFIG_USB_OTG_UTILS 745 if (tegra->transceiver) { 746 otg_set_host(tegra->transceiver, NULL); 747 otg_put_transceiver(tegra->transceiver); 748 } 749#endif 750 751 usb_remove_hcd(hcd); 752 usb_put_hcd(hcd); 753 754 tegra_usb_phy_close(tegra->phy); 755 iounmap(hcd->regs); 756 757 clk_disable(tegra->clk); 758 clk_put(tegra->clk); 759 760 clk_disable(tegra->emc_clk); 761 clk_put(tegra->emc_clk); 762 763 kfree(tegra); 764 return 0; 765} 766 767static void tegra_ehci_hcd_shutdown(struct platform_device *pdev) 768{ 769 struct tegra_ehci_hcd *tegra = platform_get_drvdata(pdev); 770 struct usb_hcd *hcd = ehci_to_hcd(tegra->ehci); 771 772 if (hcd->driver->shutdown) 773 hcd->driver->shutdown(hcd); 774} 775 776static struct platform_driver tegra_ehci_driver = { 777 .probe = tegra_ehci_probe, 778 .remove = tegra_ehci_remove, 779#ifdef CONFIG_PM 780 .suspend = tegra_ehci_suspend, 781 .resume = tegra_ehci_resume, 782#endif 783 .shutdown = tegra_ehci_hcd_shutdown, 784 .driver = { 785 .name = "tegra-ehci", 786 } 787};