Skip to content

Commit

Permalink
USB: EHCI: remove ehci_port_power() routine
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Alan Stern authored and Greg Kroah-Hartman committed Oct 31, 2012
1 parent 4968f95 commit c73cee7
Show file tree
Hide file tree
Showing 21 changed files with 21 additions and 129 deletions.
1 change: 0 additions & 1 deletion arch/arm/mach-cns3xxx/cns3420vb.c
Original file line number Diff line number Diff line change
Expand Up @@ -162,7 +162,6 @@ static void csn3xxx_usb_power_off(struct platform_device *pdev)
}

static struct usb_ehci_pdata cns3xxx_usb_ehci_pdata = {
.port_power_off = 1,
.power_on = csn3xxx_usb_power_on,
.power_off = csn3xxx_usb_power_off,
};
Expand Down
2 changes: 0 additions & 2 deletions arch/mips/ath79/dev-usb.c
Original file line number Diff line number Diff line change
Expand Up @@ -50,13 +50,11 @@ static u64 ath79_ehci_dmamask = DMA_BIT_MASK(32);

static struct usb_ehci_pdata ath79_ehci_pdata_v1 = {
.has_synopsys_hc_bug = 1,
.port_power_off = 1,
};

static struct usb_ehci_pdata ath79_ehci_pdata_v2 = {
.caps_offset = 0x100,
.has_tt = 1,
.port_power_off = 1,
};

static struct platform_device ath79_ehci_device = {
Expand Down
1 change: 0 additions & 1 deletion arch/mips/loongson1/common/platform.c
Original file line number Diff line number Diff line change
Expand Up @@ -109,7 +109,6 @@ static struct resource ls1x_ehci_resources[] = {
};

static struct usb_ehci_pdata ls1x_ehci_pdata = {
.port_power_off = 1,
};

struct platform_device ls1x_ehci_device = {
Expand Down
18 changes: 1 addition & 17 deletions drivers/usb/chipidea/host.c
Original file line number Diff line number Diff line change
Expand Up @@ -31,22 +31,6 @@
#include "bits.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 = {
.description = "ehci_hcd",
.product_desc = "ChipIdea HDRC EHCI",
Expand All @@ -61,7 +45,7 @@ static const struct hc_driver ci_ehci_hc_driver = {
/*
* basic lifecycle operations
*/
.reset = ci_ehci_setup,
.reset = ehci_setup,
.start = ehci_run,
.stop = ehci_stop,
.shutdown = ehci_shutdown,
Expand Down
9 changes: 1 addition & 8 deletions drivers/usb/host/ehci-atmel.c
Original file line number Diff line number Diff line change
Expand Up @@ -53,18 +53,11 @@ static void atmel_stop_ehci(struct platform_device *pdev)
static int ehci_atmel_setup(struct usb_hcd *hcd)
{
struct ehci_hcd *ehci = hcd_to_ehci(hcd);
int retval;

/* registers start at offset 0x0 */
ehci->caps = hcd->regs;

retval = ehci_setup(hcd);
if (retval)
return retval;

ehci_port_power(ehci, 0);

return retval;
return ehci_setup(hcd);
}

static const struct hc_driver ehci_atmel_hc_driver = {
Expand Down
1 change: 0 additions & 1 deletion drivers/usb/host/ehci-fsl.c
Original file line number Diff line number Diff line change
Expand Up @@ -349,7 +349,6 @@ static int ehci_fsl_reinit(struct ehci_hcd *ehci)
{
if (ehci_fsl_usb_setup(ehci))
return -EINVAL;
ehci_port_power(ehci, 0);

return 0;
}
Expand Down
18 changes: 1 addition & 17 deletions drivers/usb/host/ehci-grlib.c
Original file line number Diff line number Diff line change
Expand Up @@ -34,22 +34,6 @@

#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 = {
.description = hcd_name,
.product_desc = "GRLIB GRUSBHC EHCI",
Expand All @@ -64,7 +48,7 @@ static const struct hc_driver ehci_grlib_hc_driver = {
/*
* basic lifecycle operations
*/
.reset = ehci_grlib_setup,
.reset = ehci_setup,
.start = ehci_run,
.stop = ehci_stop,
.shutdown = ehci_shutdown,
Expand Down
21 changes: 0 additions & 21 deletions drivers/usb/host/ehci-hcd.c
Original file line number Diff line number Diff line change
Expand Up @@ -371,24 +371,6 @@ static void ehci_shutdown(struct usb_hcd *hcd)
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);
}

/*-------------------------------------------------------------------------*/

/*
Expand Down Expand Up @@ -1184,9 +1166,6 @@ static int __maybe_unused ehci_resume(struct usb_hcd *hcd, bool hibernated)
ehci->rh_state = EHCI_RH_SUSPENDED;
spin_unlock_irq(&ehci->lock);

/* here we "know" root ports should always stay powered */
ehci_port_power(ehci, 1);

return 1;
}

Expand Down
13 changes: 13 additions & 0 deletions drivers/usb/host/ehci-hub.c
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,19 @@ static void ehci_handover_companion_ports(struct ehci_hcd *ehci)
if (!ehci->owned_ports)
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 */
msleep(20);

Expand Down
1 change: 0 additions & 1 deletion drivers/usb/host/ehci-msm.c
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,6 @@ static int ehci_msm_reset(struct usb_hcd *hcd)
/* Disable streaming mode and select host mode */
writel(0x13, USB_USBMODE);

ehci_port_power(ehci, 1);
return 0;
}

Expand Down
8 changes: 1 addition & 7 deletions drivers/usb/host/ehci-mxc.c
Original file line number Diff line number Diff line change
Expand Up @@ -40,16 +40,10 @@ struct ehci_mxc_priv {
static int ehci_mxc_setup(struct usb_hcd *hcd)
{
struct ehci_hcd *ehci = hcd_to_ehci(hcd);
int retval;

hcd->has_tt = 1;

retval = ehci_setup(hcd);
if (retval)
return retval;

ehci_port_power(ehci, 0);
return 0;
return ehci_setup(hcd);
}

static const struct hc_driver ehci_mxc_hc_driver = {
Expand Down
3 changes: 0 additions & 3 deletions drivers/usb/host/ehci-octeon.c
Original file line number Diff line number Diff line change
Expand Up @@ -159,9 +159,6 @@ static int ehci_octeon_drv_probe(struct platform_device *pdev)

platform_set_drvdata(pdev, hcd);

/* root ports should always stay powered */
ehci_port_power(ehci, 1);

return 0;
err3:
ehci_octeon_stop();
Expand Down
3 changes: 0 additions & 3 deletions drivers/usb/host/ehci-omap.c
Original file line number Diff line number Diff line change
Expand Up @@ -146,9 +146,6 @@ static int omap_ehci_init(struct usb_hcd *hcd)
gpio_set_value_cansleep(pdata->reset_gpio_port[1], 1);
}

/* root ports should always stay powered */
ehci_port_power(ehci, 1);

return rc;
}

Expand Down
16 changes: 1 addition & 15 deletions drivers/usb/host/ehci-orion.c
Original file line number Diff line number Diff line change
Expand Up @@ -101,20 +101,6 @@ static void orion_usb_phy_v1_setup(struct usb_hcd *hcd)
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 = {
.description = hcd_name,
.product_desc = "Marvell Orion EHCI",
Expand All @@ -129,7 +115,7 @@ static const struct hc_driver ehci_orion_hc_driver = {
/*
* basic lifecycle operations
*/
.reset = ehci_orion_setup,
.reset = ehci_setup,
.start = ehci_run,
.stop = ehci_stop,
.shutdown = ehci_shutdown,
Expand Down
1 change: 0 additions & 1 deletion drivers/usb/host/ehci-pci.c
Original file line number Diff line number Diff line change
Expand Up @@ -297,7 +297,6 @@ static int ehci_pci_setup(struct usb_hcd *hcd)
ehci_warn(ehci, "selective suspend/wakeup unavailable\n");
#endif

ehci_port_power(ehci, 1);
retval = ehci_pci_reinit(ehci, pdev);
done:
return retval;
Expand Down
5 changes: 0 additions & 5 deletions drivers/usb/host/ehci-platform.c
Original file line number Diff line number Diff line change
Expand Up @@ -40,11 +40,6 @@ static int ehci_platform_reset(struct usb_hcd *hcd)

if (pdata->no_io_watchdog)
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;
}

Expand Down
1 change: 0 additions & 1 deletion drivers/usb/host/ehci-pmcmsp.c
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,6 @@ static int ehci_msp_setup(struct usb_hcd *hcd)
return retval;

usb_hcd_tdi_set_mode(ehci);
ehci_port_power(ehci, 0);

return retval;
}
Expand Down
9 changes: 1 addition & 8 deletions drivers/usb/host/ehci-sh.c
Original file line number Diff line number Diff line change
Expand Up @@ -21,17 +21,10 @@ struct ehci_sh_priv {
static int ehci_sh_reset(struct usb_hcd *hcd)
{
struct ehci_hcd *ehci = hcd_to_ehci(hcd);
int ret;

ehci->caps = hcd->regs;

ret = ehci_setup(hcd);
if (unlikely(ret))
return ret;

ehci_port_power(ehci, 0);

return ret;
return ehci_setup(hcd);
}

static const struct hc_driver ehci_sh_hc_driver = {
Expand Down
9 changes: 1 addition & 8 deletions drivers/usb/host/ehci-spear.c
Original file line number Diff line number Diff line change
Expand Up @@ -37,18 +37,11 @@ static void spear_stop_ehci(struct spear_ehci *ehci)
static int ehci_spear_setup(struct usb_hcd *hcd)
{
struct ehci_hcd *ehci = hcd_to_ehci(hcd);
int retval = 0;

/* registers start at offset 0x0 */
ehci->caps = hcd->regs;

retval = ehci_setup(hcd);
if (retval)
return retval;

ehci_port_power(ehci, 0);

return retval;
return ehci_setup(hcd);
}

static const struct hc_driver ehci_spear_hc_driver = {
Expand Down
8 changes: 1 addition & 7 deletions drivers/usb/host/ehci-tegra.c
Original file line number Diff line number Diff line change
Expand Up @@ -280,20 +280,14 @@ static void tegra_ehci_shutdown(struct usb_hcd *hcd)
static int tegra_ehci_setup(struct usb_hcd *hcd)
{
struct ehci_hcd *ehci = hcd_to_ehci(hcd);
int retval;

/* EHCI registers start at offset 0x100 */
ehci->caps = hcd->regs + 0x100;

/* switch to host mode */
hcd->has_tt = 1;

retval = ehci_setup(hcd);
if (retval)
return retval;

ehci_port_power(ehci, 1);
return retval;
return ehci_setup(hcd);
}

struct dma_aligned_buffer {
Expand Down
2 changes: 0 additions & 2 deletions include/linux/usb/ehci_pdriver.h
Original file line number Diff line number Diff line change
Expand Up @@ -41,8 +41,6 @@ struct usb_ehci_pdata {
unsigned has_synopsys_hc_bug:1;
unsigned big_endian_desc:1;
unsigned big_endian_mmio:1;
unsigned port_power_on:1;
unsigned port_power_off:1;
unsigned no_io_watchdog:1;

/* Turn on all power and clocks */
Expand Down

0 comments on commit c73cee7

Please sign in to comment.