USB: EHCI: remove ehci_port_power() routine

This patch (as1623) removes the ehci_port_power() routine and all the
places that call it.  There's no reason for ehci-hcd to change the
port power settings; the hub driver takes care of all that stuff.

There is one exception: When the controller is resumed from
hibernation or following a loss of power, the ports that are supposed
to be handed over to a companion controller must be powered on first.
Otherwise the handover won't work.  This process is not visible to the
hub driver, so it has to be handled in ehci-hcd.

Signed-off-by: Alan Stern <stern@rowland.harvard.edu>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
Alan Stern 2012-10-31 13:21:06 -04:00 committed by Greg Kroah-Hartman
parent 4968f95191
commit c73cee717e
21 changed files with 21 additions and 129 deletions

View File

@ -162,7 +162,6 @@ static void csn3xxx_usb_power_off(struct platform_device *pdev)
} }
static struct usb_ehci_pdata cns3xxx_usb_ehci_pdata = { static struct usb_ehci_pdata cns3xxx_usb_ehci_pdata = {
.port_power_off = 1,
.power_on = csn3xxx_usb_power_on, .power_on = csn3xxx_usb_power_on,
.power_off = csn3xxx_usb_power_off, .power_off = csn3xxx_usb_power_off,
}; };

View File

@ -50,13 +50,11 @@ static u64 ath79_ehci_dmamask = DMA_BIT_MASK(32);
static struct usb_ehci_pdata ath79_ehci_pdata_v1 = { static struct usb_ehci_pdata ath79_ehci_pdata_v1 = {
.has_synopsys_hc_bug = 1, .has_synopsys_hc_bug = 1,
.port_power_off = 1,
}; };
static struct usb_ehci_pdata ath79_ehci_pdata_v2 = { static struct usb_ehci_pdata ath79_ehci_pdata_v2 = {
.caps_offset = 0x100, .caps_offset = 0x100,
.has_tt = 1, .has_tt = 1,
.port_power_off = 1,
}; };
static struct platform_device ath79_ehci_device = { static struct platform_device ath79_ehci_device = {

View File

@ -109,7 +109,6 @@ static struct resource ls1x_ehci_resources[] = {
}; };
static struct usb_ehci_pdata ls1x_ehci_pdata = { static struct usb_ehci_pdata ls1x_ehci_pdata = {
.port_power_off = 1,
}; };
struct platform_device ls1x_ehci_device = { struct platform_device ls1x_ehci_device = {

View File

@ -31,22 +31,6 @@
#include "bits.h" #include "bits.h"
#include "host.h" #include "host.h"
static int ci_ehci_setup(struct usb_hcd *hcd)
{
struct ehci_hcd *ehci = hcd_to_ehci(hcd);
int ret;
hcd->has_tt = 1;
ret = ehci_setup(hcd);
if (ret)
return ret;
ehci_port_power(ehci, 0);
return ret;
}
static const struct hc_driver ci_ehci_hc_driver = { static const struct hc_driver ci_ehci_hc_driver = {
.description = "ehci_hcd", .description = "ehci_hcd",
.product_desc = "ChipIdea HDRC EHCI", .product_desc = "ChipIdea HDRC EHCI",
@ -61,7 +45,7 @@ static const struct hc_driver ci_ehci_hc_driver = {
/* /*
* basic lifecycle operations * basic lifecycle operations
*/ */
.reset = ci_ehci_setup, .reset = ehci_setup,
.start = ehci_run, .start = ehci_run,
.stop = ehci_stop, .stop = ehci_stop,
.shutdown = ehci_shutdown, .shutdown = ehci_shutdown,

View File

@ -53,18 +53,11 @@ static void atmel_stop_ehci(struct platform_device *pdev)
static int ehci_atmel_setup(struct usb_hcd *hcd) static int ehci_atmel_setup(struct usb_hcd *hcd)
{ {
struct ehci_hcd *ehci = hcd_to_ehci(hcd); struct ehci_hcd *ehci = hcd_to_ehci(hcd);
int retval;
/* registers start at offset 0x0 */ /* registers start at offset 0x0 */
ehci->caps = hcd->regs; ehci->caps = hcd->regs;
retval = ehci_setup(hcd); return ehci_setup(hcd);
if (retval)
return retval;
ehci_port_power(ehci, 0);
return retval;
} }
static const struct hc_driver ehci_atmel_hc_driver = { static const struct hc_driver ehci_atmel_hc_driver = {

View File

@ -349,7 +349,6 @@ static int ehci_fsl_reinit(struct ehci_hcd *ehci)
{ {
if (ehci_fsl_usb_setup(ehci)) if (ehci_fsl_usb_setup(ehci))
return -EINVAL; return -EINVAL;
ehci_port_power(ehci, 0);
return 0; return 0;
} }

View File

@ -34,22 +34,6 @@
#define GRUSBHC_HCIVERSION 0x0100 /* Known value of cap. reg. HCIVERSION */ #define GRUSBHC_HCIVERSION 0x0100 /* Known value of cap. reg. HCIVERSION */
/* called during probe() after chip reset completes */
static int ehci_grlib_setup(struct usb_hcd *hcd)
{
struct ehci_hcd *ehci = hcd_to_ehci(hcd);
int retval;
retval = ehci_setup(hcd);
if (retval)
return retval;
ehci_port_power(ehci, 1);
return retval;
}
static const struct hc_driver ehci_grlib_hc_driver = { static const struct hc_driver ehci_grlib_hc_driver = {
.description = hcd_name, .description = hcd_name,
.product_desc = "GRLIB GRUSBHC EHCI", .product_desc = "GRLIB GRUSBHC EHCI",
@ -64,7 +48,7 @@ static const struct hc_driver ehci_grlib_hc_driver = {
/* /*
* basic lifecycle operations * basic lifecycle operations
*/ */
.reset = ehci_grlib_setup, .reset = ehci_setup,
.start = ehci_run, .start = ehci_run,
.stop = ehci_stop, .stop = ehci_stop,
.shutdown = ehci_shutdown, .shutdown = ehci_shutdown,

View File

@ -371,24 +371,6 @@ static void ehci_shutdown(struct usb_hcd *hcd)
hrtimer_cancel(&ehci->hrtimer); hrtimer_cancel(&ehci->hrtimer);
} }
static void ehci_port_power (struct ehci_hcd *ehci, int is_on)
{
unsigned port;
if (!HCS_PPC (ehci->hcs_params))
return;
ehci_dbg (ehci, "...power%s ports...\n", is_on ? "up" : "down");
for (port = HCS_N_PORTS (ehci->hcs_params); port > 0; )
(void) ehci_hub_control(ehci_to_hcd(ehci),
is_on ? SetPortFeature : ClearPortFeature,
USB_PORT_FEAT_POWER,
port--, NULL, 0);
/* Flush those writes */
ehci_readl(ehci, &ehci->regs->command);
msleep(20);
}
/*-------------------------------------------------------------------------*/ /*-------------------------------------------------------------------------*/
/* /*
@ -1184,9 +1166,6 @@ static int __maybe_unused ehci_resume(struct usb_hcd *hcd, bool hibernated)
ehci->rh_state = EHCI_RH_SUSPENDED; ehci->rh_state = EHCI_RH_SUSPENDED;
spin_unlock_irq(&ehci->lock); spin_unlock_irq(&ehci->lock);
/* here we "know" root ports should always stay powered */
ehci_port_power(ehci, 1);
return 1; return 1;
} }

View File

@ -56,6 +56,19 @@ static void ehci_handover_companion_ports(struct ehci_hcd *ehci)
if (!ehci->owned_ports) if (!ehci->owned_ports)
return; return;
/* Make sure the ports are powered */
port = HCS_N_PORTS(ehci->hcs_params);
while (port--) {
if (test_bit(port, &ehci->owned_ports)) {
reg = &ehci->regs->port_status[port];
status = ehci_readl(ehci, reg) & ~PORT_RWC_BITS;
if (!(status & PORT_POWER)) {
status |= PORT_POWER;
ehci_writel(ehci, status, reg);
}
}
}
/* Give the connections some time to appear */ /* Give the connections some time to appear */
msleep(20); msleep(20);

View File

@ -53,7 +53,6 @@ static int ehci_msm_reset(struct usb_hcd *hcd)
/* Disable streaming mode and select host mode */ /* Disable streaming mode and select host mode */
writel(0x13, USB_USBMODE); writel(0x13, USB_USBMODE);
ehci_port_power(ehci, 1);
return 0; return 0;
} }

View File

@ -40,16 +40,10 @@ struct ehci_mxc_priv {
static int ehci_mxc_setup(struct usb_hcd *hcd) static int ehci_mxc_setup(struct usb_hcd *hcd)
{ {
struct ehci_hcd *ehci = hcd_to_ehci(hcd); struct ehci_hcd *ehci = hcd_to_ehci(hcd);
int retval;
hcd->has_tt = 1; hcd->has_tt = 1;
retval = ehci_setup(hcd); return ehci_setup(hcd);
if (retval)
return retval;
ehci_port_power(ehci, 0);
return 0;
} }
static const struct hc_driver ehci_mxc_hc_driver = { static const struct hc_driver ehci_mxc_hc_driver = {

View File

@ -159,9 +159,6 @@ static int ehci_octeon_drv_probe(struct platform_device *pdev)
platform_set_drvdata(pdev, hcd); platform_set_drvdata(pdev, hcd);
/* root ports should always stay powered */
ehci_port_power(ehci, 1);
return 0; return 0;
err3: err3:
ehci_octeon_stop(); ehci_octeon_stop();

View File

@ -146,9 +146,6 @@ static int omap_ehci_init(struct usb_hcd *hcd)
gpio_set_value_cansleep(pdata->reset_gpio_port[1], 1); gpio_set_value_cansleep(pdata->reset_gpio_port[1], 1);
} }
/* root ports should always stay powered */
ehci_port_power(ehci, 1);
return rc; return rc;
} }

View File

@ -101,20 +101,6 @@ static void orion_usb_phy_v1_setup(struct usb_hcd *hcd)
wrl(USB_MODE, 0x13); wrl(USB_MODE, 0x13);
} }
static int ehci_orion_setup(struct usb_hcd *hcd)
{
struct ehci_hcd *ehci = hcd_to_ehci(hcd);
int retval;
retval = ehci_setup(hcd);
if (retval)
return retval;
ehci_port_power(ehci, 0);
return retval;
}
static const struct hc_driver ehci_orion_hc_driver = { static const struct hc_driver ehci_orion_hc_driver = {
.description = hcd_name, .description = hcd_name,
.product_desc = "Marvell Orion EHCI", .product_desc = "Marvell Orion EHCI",
@ -129,7 +115,7 @@ static const struct hc_driver ehci_orion_hc_driver = {
/* /*
* basic lifecycle operations * basic lifecycle operations
*/ */
.reset = ehci_orion_setup, .reset = ehci_setup,
.start = ehci_run, .start = ehci_run,
.stop = ehci_stop, .stop = ehci_stop,
.shutdown = ehci_shutdown, .shutdown = ehci_shutdown,

View File

@ -297,7 +297,6 @@ static int ehci_pci_setup(struct usb_hcd *hcd)
ehci_warn(ehci, "selective suspend/wakeup unavailable\n"); ehci_warn(ehci, "selective suspend/wakeup unavailable\n");
#endif #endif
ehci_port_power(ehci, 1);
retval = ehci_pci_reinit(ehci, pdev); retval = ehci_pci_reinit(ehci, pdev);
done: done:
return retval; return retval;

View File

@ -40,11 +40,6 @@ static int ehci_platform_reset(struct usb_hcd *hcd)
if (pdata->no_io_watchdog) if (pdata->no_io_watchdog)
ehci->need_io_watchdog = 0; ehci->need_io_watchdog = 0;
if (pdata->port_power_on)
ehci_port_power(ehci, 1);
if (pdata->port_power_off)
ehci_port_power(ehci, 0);
return 0; return 0;
} }

View File

@ -90,7 +90,6 @@ static int ehci_msp_setup(struct usb_hcd *hcd)
return retval; return retval;
usb_hcd_tdi_set_mode(ehci); usb_hcd_tdi_set_mode(ehci);
ehci_port_power(ehci, 0);
return retval; return retval;
} }

View File

@ -21,17 +21,10 @@ struct ehci_sh_priv {
static int ehci_sh_reset(struct usb_hcd *hcd) static int ehci_sh_reset(struct usb_hcd *hcd)
{ {
struct ehci_hcd *ehci = hcd_to_ehci(hcd); struct ehci_hcd *ehci = hcd_to_ehci(hcd);
int ret;
ehci->caps = hcd->regs; ehci->caps = hcd->regs;
ret = ehci_setup(hcd); return ehci_setup(hcd);
if (unlikely(ret))
return ret;
ehci_port_power(ehci, 0);
return ret;
} }
static const struct hc_driver ehci_sh_hc_driver = { static const struct hc_driver ehci_sh_hc_driver = {

View File

@ -37,18 +37,11 @@ static void spear_stop_ehci(struct spear_ehci *ehci)
static int ehci_spear_setup(struct usb_hcd *hcd) static int ehci_spear_setup(struct usb_hcd *hcd)
{ {
struct ehci_hcd *ehci = hcd_to_ehci(hcd); struct ehci_hcd *ehci = hcd_to_ehci(hcd);
int retval = 0;
/* registers start at offset 0x0 */ /* registers start at offset 0x0 */
ehci->caps = hcd->regs; ehci->caps = hcd->regs;
retval = ehci_setup(hcd); return ehci_setup(hcd);
if (retval)
return retval;
ehci_port_power(ehci, 0);
return retval;
} }
static const struct hc_driver ehci_spear_hc_driver = { static const struct hc_driver ehci_spear_hc_driver = {

View File

@ -280,7 +280,6 @@ static void tegra_ehci_shutdown(struct usb_hcd *hcd)
static int tegra_ehci_setup(struct usb_hcd *hcd) static int tegra_ehci_setup(struct usb_hcd *hcd)
{ {
struct ehci_hcd *ehci = hcd_to_ehci(hcd); struct ehci_hcd *ehci = hcd_to_ehci(hcd);
int retval;
/* EHCI registers start at offset 0x100 */ /* EHCI registers start at offset 0x100 */
ehci->caps = hcd->regs + 0x100; ehci->caps = hcd->regs + 0x100;
@ -288,12 +287,7 @@ static int tegra_ehci_setup(struct usb_hcd *hcd)
/* switch to host mode */ /* switch to host mode */
hcd->has_tt = 1; hcd->has_tt = 1;
retval = ehci_setup(hcd); return ehci_setup(hcd);
if (retval)
return retval;
ehci_port_power(ehci, 1);
return retval;
} }
struct dma_aligned_buffer { struct dma_aligned_buffer {

View File

@ -41,8 +41,6 @@ struct usb_ehci_pdata {
unsigned has_synopsys_hc_bug:1; unsigned has_synopsys_hc_bug:1;
unsigned big_endian_desc:1; unsigned big_endian_desc:1;
unsigned big_endian_mmio:1; unsigned big_endian_mmio:1;
unsigned port_power_on:1;
unsigned port_power_off:1;
unsigned no_io_watchdog:1; unsigned no_io_watchdog:1;
/* Turn on all power and clocks */ /* Turn on all power and clocks */