mirror of
https://github.com/FEX-Emu/linux.git
synced 2024-12-23 09:56:00 +00:00
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:
parent
4968f95191
commit
c73cee717e
@ -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,
|
||||||
};
|
};
|
||||||
|
@ -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 = {
|
||||||
|
@ -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 = {
|
||||||
|
@ -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,
|
||||||
|
@ -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 = {
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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,
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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);
|
||||||
|
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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 = {
|
||||||
|
@ -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();
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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,
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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 = {
|
||||||
|
@ -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 = {
|
||||||
|
@ -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 {
|
||||||
|
@ -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 */
|
||||||
|
Loading…
Reference in New Issue
Block a user