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:
Родитель
4968f95191
Коммит
c73cee717e
|
@ -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,
|
||||
};
|
||||
|
|
|
@ -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 = {
|
||||
|
|
|
@ -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 = {
|
||||
|
|
|
@ -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",
|
||||
|
@ -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,
|
||||
|
|
|
@ -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 = {
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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",
|
||||
|
@ -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,
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
/*-------------------------------------------------------------------------*/
|
||||
|
||||
/*
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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 = {
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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",
|
||||
|
@ -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,
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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 = {
|
||||
|
|
|
@ -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 = {
|
||||
|
|
|
@ -280,7 +280,6 @@ 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;
|
||||
|
@ -288,12 +287,7 @@ static int tegra_ehci_setup(struct usb_hcd *hcd)
|
|||
/* 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 {
|
||||
|
|
|
@ -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 */
|
||||
|
|
Загрузка…
Ссылка в новой задаче