From: Greg KH <greg@kroah.com>
To: "Anoop P.A" <anoop.pa@gmail.com>
Cc: gregkh@suse.de, dbrownell@users.sourceforge.net, ust@denx.de,
pkondeti@codeaurora.org, stern@rowland.harvard.edu,
gadiyar@ti.com, alek.du@intel.com, jacob.jun.pan@intel.com,
linux-usb@vger.kernel.org, linux-kernel@vger.kernel.org,
linux-mips@linux-mips.org, ralf@linux-mips.org
Subject: Re: [PATCH v3] EHCI bus glue for on-chip PMC MSP USB controller.
Date: Fri, 4 Feb 2011 11:56:24 -0800 [thread overview]
Message-ID: <20110204195624.GA27680@kroah.com> (raw)
In-Reply-To: <1296127736-28208-1-git-send-email-anoop.pa@gmail.com>
On Thu, Jan 27, 2011 at 04:58:56PM +0530, Anoop P.A wrote:
> From: Anoop P A <anoop.pa@gmail.com>
>
> Signed-off-by: Anoop P A <anoop.pa@gmail.com>
> Tested-by: Shane McDonald <mcdonald.shane@gmail.com>
Care to provide a "real" changelog comment for this patch? We need
something here.
> ---
> drivers/usb/host/Kconfig | 15 +-
> drivers/usb/host/ehci-hcd.c | 7 +
> drivers/usb/host/ehci-pmcmsp.c | 552 ++++++++++++++++++++++++++++++++++++++++
> drivers/usb/host/ehci.h | 3 +
> 4 files changed, 575 insertions(+), 2 deletions(-)
> create mode 100644 drivers/usb/host/ehci-pmcmsp.c
>
> diff --git a/drivers/usb/host/Kconfig b/drivers/usb/host/Kconfig
> index 24046c0..1f73127 100644
> --- a/drivers/usb/host/Kconfig
> +++ b/drivers/usb/host/Kconfig
> @@ -91,17 +91,28 @@ config USB_EHCI_TT_NEWSCHED
>
> If unsure, say Y.
>
> +config USB_EHCI_HCD_PMC_MSP
> + tristate "EHCI support for on-chip PMC MSP USB controller"
> + depends on USB_EHCI_HCD && MSP_HAS_USB
> + default y
> + select USB_EHCI_BIG_ENDIAN_DESC
> + select USB_EHCI_BIG_ENDIAN_MMIO
> + ---help---
> + Enables support for the onchip USB controller on the PMC_MSP7100 Family SoC's.
> + If unsure, say N.
> +
> config USB_EHCI_BIG_ENDIAN_MMIO
> bool
> depends on USB_EHCI_HCD && (PPC_CELLEB || PPC_PS3 || 440EPX || \
> ARCH_IXP4XX || XPS_USB_HCD_XILINX || \
> - PPC_MPC512x || CPU_CAVIUM_OCTEON)
> + PPC_MPC512x || CPU_CAVIUM_OCTEON || \
> + PMC_MSP)
> default y
>
> config USB_EHCI_BIG_ENDIAN_DESC
> bool
> depends on USB_EHCI_HCD && (440EPX || ARCH_IXP4XX || XPS_USB_HCD_XILINX || \
> - PPC_MPC512x)
> + PPC_MPC512x || PMC_MSP)
> default y
>
> config XPS_USB_HCD_XILINX
> diff --git a/drivers/usb/host/ehci-hcd.c b/drivers/usb/host/ehci-hcd.c
> index 6fee3cd..a591890 100644
> --- a/drivers/usb/host/ehci-hcd.c
> +++ b/drivers/usb/host/ehci-hcd.c
> @@ -262,6 +262,8 @@ static void tdi_reset (struct ehci_hcd *ehci)
> if (ehci_big_endian_mmio(ehci))
> tmp |= USBMODE_BE;
> ehci_writel(ehci, tmp, reg_ptr);
> + if (ehci->pmc_msp_tdi)
> + usb_hcd_tdi_set_mode(ehci);
> }
>
> /* reset a non-running (STS_HALT == 1) controller */
> @@ -1249,6 +1251,11 @@ MODULE_LICENSE ("GPL");
> #define PLATFORM_DRIVER ehci_msm_driver
> #endif
>
> +#ifdef CONFIG_USB_EHCI_HCD_PMC_MSP
> +#include "ehci-pmcmsp.c"
> +#define PLATFORM_DRIVER ehci_hcd_msp_driver
> +#endif
> +
> #if !defined(PCI_DRIVER) && !defined(PLATFORM_DRIVER) && \
> !defined(PS3_SYSTEM_BUS_DRIVER) && !defined(OF_PLATFORM_DRIVER) && \
> !defined(XILINX_OF_PLATFORM_DRIVER)
> diff --git a/drivers/usb/host/ehci-pmcmsp.c b/drivers/usb/host/ehci-pmcmsp.c
> new file mode 100644
> index 0000000..28dd26c
> --- /dev/null
> +++ b/drivers/usb/host/ehci-pmcmsp.c
> @@ -0,0 +1,552 @@
> +/*
> + * PMC MSP EHCI (Host Controller Driver) for USB.
> + *
> + * (C) Copyright 2006-2010 PMC-Sierra Inc
> + *
> + * This program is free software; you can redistribute it and/or modify it
> + * under the terms of the GNU General Public License as published by the
> + * Free Software Foundation; either version 2 of the License, or (at your
> + * option) any later version.
Are you sure about "any later version"? Is this acceptable to your
company lawyers?
> + *
> + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
> + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
> + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
> + * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
> + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
> + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
> + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
> + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
> + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
> + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
> + *
> + * You should have received a copy of the GNU General Public License along
> + * with this program; if not, write to the Free Software Foundation, Inc.,
> + * 675 Mass Ave, Cambridge, MA 02139, USA.
These two paragraphs are not needed, please remove them.
> + */
> +
> +#include <linux/platform_device.h>
> +#include <linux/gpio.h>
> +#include <msp_usb.h>
> +
> +/* includes */
Um, includes for what? Are we writing comments for the previous lines?
> +#define USB_CTRL_MODE_HOST 0x3
> + /* host mode */
> +#define USB_CTRL_MODE_BIG_ENDIAN 0x4
> + /* big endian */
> +#define USB_CTRL_MODE_STREAM_DISABLE 0x10
> + /* stream disable*/
> +#define USB_CTRL_FIFO_THRESH 0x00300000
> + /* thresh hold */
> +#define USB_EHCI_REG_USB_MODE 0x68
> + /* register offset for usb_mode */
> +#define USB_EHCI_REG_USB_FIFO 0x24
> + /* register offset for usb fifo */
> +#define USB_EHCI_REG_USB_STATUS 0x44
> + /* register offset for usb status */
> +#define USB_EHCI_REG_BIT_STAT_STS (1<<29)
> + /* serial/parallel transceiver */
> +#define MSP_PIN_USB0_HOST_DEV 49
> + /* TWI USB0 host device pin */
> +#define MSP_PIN_USB1_HOST_DEV 50
> + /* TWI USB1 host device pin */
Ok, I see we are. That's horrible, please fix it up.
> +
> +extern int usb_disabled(void);
Why is this in a .c file? externs should never be in a .c file.
> +
> +void usb_hcd_tdi_set_mode(struct ehci_hcd *ehci)
> +{
> + u8 *base;
> + u8 *statreg;
> + u8 *fiforeg;
> + u32 val;
> + struct ehci_regs *reg_base = ehci->regs;
> +
> + /* get register base */
> + base = (u8 *)reg_base + USB_EHCI_REG_USB_MODE;
> + statreg = (u8 *)reg_base + USB_EHCI_REG_USB_STATUS;
> + fiforeg = (u8 *)reg_base + USB_EHCI_REG_USB_FIFO;
> +
> + /* set the controller to host mode and BIG ENDIAN */
> + ehci_writel(ehci, (USB_CTRL_MODE_HOST | USB_CTRL_MODE_BIG_ENDIAN
> + | USB_CTRL_MODE_STREAM_DISABLE), (u32 *)base);
> +
> + /* clear STS to select parallel transceiver interface */
> + val = ehci_readl(ehci, (u32 *)statreg);
> + val = val & ~USB_EHCI_REG_BIT_STAT_STS;
> + ehci_writel(ehci, val, (u32 *)statreg);
> +
> + /* write to set the proper fifo threshold */
> + ehci_writel(ehci, USB_CTRL_FIFO_THRESH, (u32 *)fiforeg);
> +
> + /* set TWI GPIO USB_HOST_DEV pin high */
> + gpio_direction_output(MSP_PIN_USB0_HOST_DEV, 1);
> +#ifdef CONFIG_MSP_HAS_DUAL_USB
> + gpio_direction_output(MSP_PIN_USB1_HOST_DEV, 1);
> +#endif
Please don't put #defines in .c files.
> +}
> +
> +/* called after powerup, by probe or system-pm "wakeup" */
> +static int ehci_msp_reinit(struct ehci_hcd *ehci)
> +{
> + ehci_port_power(ehci, 0);
> +
> + return 0;
> +}
> +
> +/* called during probe() after chip reset completes */
> +static int ehci_msp_setup(struct usb_hcd *hcd)
> +{
> + struct ehci_hcd *ehci = hcd_to_ehci(hcd);
> + u32 temp;
> + int retval;
> + ehci->big_endian_mmio = 1;
> + ehci->big_endian_desc = 1;
> + ehci->pmc_msp_tdi = 1;
> +
> + ehci->caps = hcd->regs;
> + ehci->regs = hcd->regs +
> + HC_LENGTH(ehci_readl(ehci, &ehci->caps->hc_capbase));
> + dbg_hcs_params(ehci, "reset");
> + dbg_hcc_params(ehci, "reset");
> +
> + /* cache this readonly data; minimize chip reads */
> + ehci->hcs_params = ehci_readl(ehci, &ehci->caps->hcs_params);
> + hcd->has_tt = 1;
> + tdi_reset(ehci);
> +
> + retval = ehci_halt(ehci);
> + if (retval)
> + return retval;
> +
> + ehci_reset(ehci);
> +
> + /* data structure init */
> + retval = ehci_init(hcd);
> + if (retval)
> + return retval;
> +
> + temp = HCS_N_CC(ehci->hcs_params) * HCS_N_PCC(ehci->hcs_params);
> + temp &= 0x0f;
> + if (temp && HCS_N_PORTS(ehci->hcs_params) > temp) {
> + ehci_dbg(ehci, "bogus port configuration: "
> + "cc=%d x pcc=%d < ports=%d\n",
> + HCS_N_CC(ehci->hcs_params),
> + HCS_N_PCC(ehci->hcs_params),
> + HCS_N_PORTS(ehci->hcs_params));
> + }
> +
> + retval = ehci_msp_reinit(ehci);
> +
> + return retval;
> +}
> +
> +/*-------------------------------------------------------------------------*/
> +
> +static void msp_start_hc(struct platform_device *dev)
> +{
> + printk(KERN_DEBUG __FILE__
> + ": starting PMC MSP EHCI USB Controller\n");
Why? Who really cares? And, if you _really_ want to do this, please
use a dev_dbg() call instead, which ties it properly into the dynamic
printk system _and_ properly identifies this deivce.
> +
> + /*
> + * Now, carefully enable the USB clock, and take
> + * the USB host controller out of reset.
> + */
> + printk(KERN_DEBUG __FILE__
> + ": Clock to USB host has been enabled\n");
> +}
You never enabled anything, yet you said you did? Somethings wrong
here.
> +
> +static void msp_stop_hc(struct platform_device *dev)
> +{
> + printk(KERN_DEBUG __FILE__
> + ": stopping PMC MSP EHCI USB Controller\n");
> +}
Same for this printk, you didn't stop anything.
Also fix it up and don't use printk, see above.
> +
> +
> +/*-------------------------------------------------------------------------*/
> +
> +/*-------------------------------------------------------------------------*/
> +
> +#ifdef CONFIG_PM
> +
> +/* suspend/resume, section 4.3 */
> +
> +/* These routines rely on the bus glue
> + * to handle powerdown and wakeup, and currently also on
> + * transceivers that don't need any software attention to set up
> + * the right sort of wakeup.
> + * Also they depend on separate root hub suspend/resume.
> + */
> +static int ehci_msp_suspend(struct device *dev)
> +{
> + struct usb_hcd *hcd = dev_get_drvdata(dev);
> + struct ehci_hcd *ehci = hcd_to_ehci(hcd);
> + unsigned long flags;
> + int rc;
> +
> + return 0;
> + rc = 0;
> +
> + if (time_before(jiffies, ehci->next_statechange))
> + msleep(10);
Short sleep, why?
> +
> + /* Root hub was already suspended. Disable irq emission and
> + * mark HW unaccessible. The PM and USB cores make sure that
> + * the root hub is either suspended or stopped.
> + */
> + spin_lock_irqsave(&ehci->lock, flags);
> + ehci_prepare_ports_for_controller_suspend(ehci, device_may_wakeup(dev));
> + ehci_writel(ehci, 0, &ehci->regs->intr_enable);
> + (void)ehci_readl(ehci, &ehci->regs->intr_enable);
> +
> + clear_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags);
> + spin_unlock_irqrestore(&ehci->lock, flags);
> +
> + /* could save FLADJ in case of Vaux power loss
> + ... we'd only use it to handle clock skew */
Huh?
> +
> + return rc;
> +}
> +
> +static int ehci_msp_resume(struct device *dev)
> +{
> + struct usb_hcd *hcd = dev_get_drvdata(dev);
> + struct ehci_hcd *ehci = hcd_to_ehci(hcd);
> +
> +
> + /* maybe restore FLADJ */
Don't you know?
> +
> + if (time_before(jiffies, ehci->next_statechange))
> + msleep(100);
That's a long sleep, are you sure that's ok on the resume path?
> +
> + /* Mark hardware accessible again as we are out of D3 state by now */
> + set_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags);
> +
> + /* If CF is still set, we maintained PCI Vaux power.
> + * Just undo the effect of ehci_pci_suspend().
> + */
> + if (ehci_readl(ehci, &ehci->regs->configured_flag) == FLAG_CF) {
> + int mask = INTR_MASK;
> +
> + ehci_prepare_ports_for_controller_resume(ehci);
> + if (!hcd->self.root_hub->do_remote_wakeup)
> + mask &= ~STS_PCD;
> + ehci_writel(ehci, mask, &ehci->regs->intr_enable);
> + ehci_readl(ehci, &ehci->regs->intr_enable);
> + return 0;
> + }
> +
> + ehci_dbg(ehci, "lost power, restarting\n");
> + usb_root_hub_lost_power(hcd->self.root_hub);
> +
> + /* Else reset, to cope with power loss or flush-to-storage
> + * style "resume" having let BIOS kick in during reboot.
> + */
> + (void) ehci_halt(ehci);
> + (void) ehci_reset(ehci);
> + (void) ehci_msp_reinit(ehci);
> +
> + /* emptying the schedule aborts any urbs */
> + spin_lock_irq(&ehci->lock);
> + if (ehci->reclaim)
> + end_unlink_async(ehci);
> + ehci_work(ehci);
> + spin_unlock_irq(&ehci->lock);
> +
> + ehci_writel(ehci, ehci->command, &ehci->regs->command);
> + ehci_writel(ehci, FLAG_CF, &ehci->regs->configured_flag);
> + ehci_readl(ehci, &ehci->regs->command); /* unblock posted writes */
> +
> + /* here we "know" root ports should always stay powered */
> + ehci_port_power(ehci, 1);
> +
> + hcd->state = HC_STATE_SUSPENDED;
> +
> + return 0;
> +}
> +
> +static const struct dev_pm_ops ehci_msp_pmops = {
> + .suspend = ehci_msp_suspend,
> + .resume = ehci_msp_resume,
> +};
> +#endif
> +
> +
> +/* configure so an HC device and id are always provided */
> +/* always called with process context; sleeping is OK */
> +
> +static int usb_hcd_msp_map_regs(struct mspusb_device *dev)
> +{
> + struct resource *res;
> + struct platform_device *pdev = &dev->dev;
> + u32 res_len;
> + int retval;
> +
> + /* MAB register space */
> + res = platform_get_resource(pdev, IORESOURCE_MEM, 1);
> + if (res == NULL)
> + return -ENOMEM;
> + res_len = res->end - res->start + 1;
> + if (!request_mem_region(res->start, res_len, "mab regs"))
> + return -EBUSY;
> +
> + dev->mab_regs = ioremap_nocache(res->start, res_len);
> + if (dev->mab_regs == NULL) {
> + retval = -ENOMEM;
> + goto err1;
> + }
> +
> + /* MSP USB register space */
> + res = platform_get_resource(pdev, IORESOURCE_MEM, 2);
> + if (res == NULL) {
> + retval = -ENOMEM;
> + goto err2;
> + }
> + res_len = res->end - res->start + 1;
> + if (!request_mem_region(res->start, res_len, "usbid regs")) {
> + retval = -EBUSY;
> + goto err2;
> + }
> + dev->usbid_regs = ioremap_nocache(res->start, res_len);
> + if (dev->usbid_regs == NULL) {
> + retval = -ENOMEM;
> + goto err3;
> + }
> +
> + return 0;
> +err3:
> + res = platform_get_resource(pdev, IORESOURCE_MEM, 2);
> + res_len = res->end - res->start + 1;
> + release_mem_region(res->start, res_len);
> +err2:
> + iounmap(dev->mab_regs);
> +err1:
> + res = platform_get_resource(pdev, IORESOURCE_MEM, 1);
> + res_len = res->end - res->start + 1;
> + release_mem_region(res->start, res_len);
> + dev_err(&pdev->dev, "Failed to map non-EHCI regs.\n");
> + return retval;
> +}
> +
> +/**
> + * usb_hcd_msp_probe - initialize PMC MSP-based HCDs
> + * Context: !in_interrupt()
> + *
> + * Allocates basic resources for this USB host controller, and
> + * then invokes the start() method for the HCD associated with it
> + * through the hotplug entry's driver_data.
> + *
> + */
> +int usb_hcd_msp_probe(const struct hc_driver *driver,
> + struct platform_device *dev)
> +{
> + int retval;
> + struct usb_hcd *hcd;
> + struct resource *res;
> + struct ehci_hcd *ehci ;
> +
> + hcd = usb_create_hcd(driver, &dev->dev, "pmcmsp");
> + if (!hcd)
> + return -ENOMEM;
> +
> + res = platform_get_resource(dev, IORESOURCE_MEM, 0);
> + if (res == NULL) {
> + pr_debug("No IOMEM resource info for %s.\n", dev->name);
> + retval = -ENOMEM;
> + goto err1;
> + }
> + hcd->rsrc_start = res->start;
> + hcd->rsrc_len = res->end - res->start + 1;
> + if (!request_mem_region(hcd->rsrc_start, hcd->rsrc_len, dev->name)) {
> + retval = -EBUSY;
> + goto err1;
> + }
> + hcd->regs = ioremap_nocache(hcd->rsrc_start, hcd->rsrc_len);
> + if (!hcd->regs) {
> + pr_debug("ioremap failed");
> + retval = -ENOMEM;
> + goto err2;
> + }
> + msp_start_hc(dev);
> +
> + res = platform_get_resource(dev, IORESOURCE_IRQ, 0);
> + if (res == NULL) {
> + dev_err(&dev->dev, "No IRQ resource info for %s.\n", dev->name);
> + retval = -ENOMEM;
> + goto err3;
> + }
> +
> + /* Map non-EHCI register spaces */
> + retval = usb_hcd_msp_map_regs(to_mspusb_device(dev));
> + if (retval != 0)
> + goto err3;
> +
> + ehci = hcd_to_ehci(hcd);
> + ehci->big_endian_mmio = 1;
> + ehci->big_endian_desc = 1;
> +
> +
> + retval = usb_add_hcd(hcd, res->start, IRQF_SHARED);
> + if (retval == 0)
> + return 0;
> +
> + usb_remove_hcd(hcd);
> +err3:
> + msp_stop_hc(dev);
> + iounmap(hcd->regs);
> +err2:
> + release_mem_region(hcd->rsrc_start, hcd->rsrc_len);
> +err1:
> + usb_put_hcd(hcd);
> +
> + return retval;
> +}
> +
> +
> +/* may be called without controller electrically present */
> +/* may be called with controller, bus, and devices active */
> +
What may be called?
> +/**
> + * usb_hcd_msp_remove - shutdown processing for PMC MSP-based HCDs
> + * @dev: USB Host Controller being removed
> + * Context: !in_interrupt()
> + *
> + * Reverses the effect of usb_hcd_msp_probe(), first invoking
> + * the HCD's stop() method. It is always called from a thread
> + * context, normally "rmmod", "apmd", or something similar.
> + *
> + */
> +void usb_hcd_msp_remove(struct usb_hcd *hcd, struct platform_device *dev)
> +{
> + usb_remove_hcd(hcd);
> + msp_stop_hc(dev);
> + iounmap(hcd->regs);
> + release_mem_region(hcd->rsrc_start, hcd->rsrc_len);
> + usb_put_hcd(hcd);
> +}
> +
> +#ifdef CONFIG_MSP_HAS_DUAL_USB
> +/*-------------------------------------------------------------------------*/
> +/*
> + * Wrapper around the main ehci_irq. Since both USB host controllers are
> + * sharing the same IRQ, need to first determine whether we're the intended
> + * recipient of this interrupt.
> + */
> +static irqreturn_t ehci_msp_irq(struct usb_hcd *hcd)
> +{
> + u32 int_src;
> + struct device *dev = hcd->self.controller;
> + struct platform_device *pdev;
> + struct mspusb_device *mdev;
> + struct ehci_hcd *ehci = hcd_to_ehci(hcd);
> +
> + /* need to reverse-map a couple of containers to get our device */
> + pdev = to_platform_device(dev);
> + mdev = to_mspusb_device(pdev);
> +
> + /* Check to see if this interrupt is for this host controller */
> + int_src = ehci_readl(ehci, &mdev->mab_regs->int_stat);
> + if (int_src & (1 << pdev->id))
> + return ehci_irq(hcd);
> +
> + /* Not for this device */
> + return IRQ_NONE;
> +}
> +/*-------------------------------------------------------------------------*/
> +#endif /* DUAL_USB */
> +
> +static const struct hc_driver ehci_msp_hc_driver = {
> + .description = hcd_name,
> + .product_desc = "PMC MSP EHCI",
> + .hcd_priv_size = sizeof(struct ehci_hcd),
> +
> + /*
> + * generic hardware linkage
> + */
> +#ifdef CONFIG_MSP_HAS_DUAL_USB
> + .irq = ehci_msp_irq,
> +#else
> + .irq = ehci_irq,
> +#endif
> + .flags = HCD_MEMORY | HCD_USB2,
> +
> + /*
> + * basic lifecycle operations
> + */
> + .reset = ehci_msp_setup,
> + .start = ehci_run,
> + .shutdown = ehci_shutdown,
> + .start = ehci_run,
> + .stop = ehci_stop,
> +
> + /*
> + * managing i/o requests and associated device resources
> + */
> + .urb_enqueue = ehci_urb_enqueue,
> + .urb_dequeue = ehci_urb_dequeue,
> + .endpoint_disable = ehci_endpoint_disable,
> + .endpoint_reset = ehci_endpoint_reset,
> +
> + /*
> + * scheduling support
> + */
> + .get_frame_number = ehci_get_frame,
> +
> + /*
> + * root hub support
> + */
> + .hub_status_data = ehci_hub_status_data,
> + .hub_control = ehci_hub_control,
> + .bus_suspend = ehci_bus_suspend,
> + .bus_resume = ehci_bus_resume,
> + .relinquish_port = ehci_relinquish_port,
> + .port_handed_over = ehci_port_handed_over,
> +
> + .clear_tt_buffer_complete = ehci_clear_tt_buffer_complete,
> +};
> +
> +static int ehci_hcd_msp_drv_probe(struct platform_device *pdev)
> +{
> + int ret;
> +
> + pr_debug("In ehci_hcd_msp_drv_probe");
> +
> + if (usb_disabled())
> + return -ENODEV;
> +
> + gpio_request(MSP_PIN_USB0_HOST_DEV, "USB0_HOST_DEV_GPIO");
> +#ifdef CONFIG_MSP_HAS_DUAL_USB
> + gpio_request(MSP_PIN_USB1_HOST_DEV, "USB1_HOST_DEV_GPIO");
> +#endif
> +
> + ret = usb_hcd_msp_probe(&ehci_msp_hc_driver, pdev);
> +
> + return ret;
> +}
> +
> +static int ehci_hcd_msp_drv_remove(struct platform_device *pdev)
> +{
> + struct usb_hcd *hcd = platform_get_drvdata(pdev);
> +
> + usb_hcd_msp_remove(hcd, pdev);
> +
> + /* free TWI GPIO USB_HOST_DEV pin */
> + gpio_free(MSP_PIN_USB0_HOST_DEV);
> +#ifdef CONFIG_MSP_HAS_DUAL_USB
> + gpio_free(MSP_PIN_USB1_HOST_DEV);
> +#endif
> +
> + return 0;
> +}
> +
> +MODULE_ALIAS("pmcmsp-ehci");
> +
> +static struct platform_driver ehci_hcd_msp_driver = {
> + .probe = ehci_hcd_msp_drv_probe,
> + .remove = ehci_hcd_msp_drv_remove,
> + .driver = {
> + .name = "pmcmsp-ehci",
> + .owner = THIS_MODULE,
> +#ifdef CONFIG_PM
> + .pm = &ehci_msp_pmops,
> +#endif
> + },
> +};
> diff --git a/drivers/usb/host/ehci.h b/drivers/usb/host/ehci.h
> index 799ac16..1b71d6a 100644
> --- a/drivers/usb/host/ehci.h
> +++ b/drivers/usb/host/ehci.h
> @@ -134,6 +134,7 @@ struct ehci_hcd { /* one per controller */
> unsigned amd_l1_fix:1;
> unsigned fs_i_thresh:1; /* Intel iso scheduling */
> unsigned use_dummy_qh:1; /* AMD Frame List table quirk*/
> + unsigned pmc_msp_tdi:1; /* PMC MSP tdi quirk*/
This part of the patch doesn't apply cleanly anymore, care to refresh it
against linux-next, and make all of the other fixes and resend it?
thanks,
greg k-h
next prev parent reply other threads:[~2011-02-04 19:59 UTC|newest]
Thread overview: 29+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-12-21 11:06 [PATCH] EHCI support for on-chip PMC MSP USB controller Anoop P
2010-12-21 16:00 ` Alan Stern
2010-12-21 16:00 ` Alan Stern
2010-12-21 17:59 ` Greg KH
2010-12-22 14:34 ` [PATCH V2 0/2] " Anoop P.A
2010-12-22 14:36 ` [PATCH V2 1/2] " Anoop P.A
2010-12-22 14:58 ` Anoop P A
2010-12-24 9:44 ` Shane McDonald
2011-01-27 11:28 ` [PATCH v3] EHCI bus glue " Anoop P.A
2011-02-04 19:56 ` Greg KH [this message]
2011-02-09 14:12 ` Anoop P A
2011-02-09 17:20 ` Greg KH
2011-02-09 15:10 ` Matthieu CASTET
2011-02-09 15:44 ` Anoop P A
2011-02-15 10:43 ` [PATCH v4] " Anoop P.A
2011-02-15 17:44 ` Matthieu CASTET
2011-02-22 15:35 ` [PATCH v5] " Anoop P.A
2011-02-22 20:04 ` Dan Carpenter
2011-02-23 13:22 ` Anoop P A
2011-02-23 17:02 ` Dan Carpenter
2011-02-24 10:19 ` Anoop P A
2011-02-24 11:28 ` Dan Carpenter
2011-02-24 13:56 ` [PATCH] " Anoop P.A
2010-12-22 14:36 ` [PATCH V2 2/2] MSP onchip root hub over current quirk Anoop P.A
2010-12-23 2:18 ` Alan Stern
2010-12-23 2:18 ` Alan Stern
2010-12-23 9:29 ` Anoop P A
2010-12-23 16:08 ` Alan Stern
2010-12-23 16:08 ` Alan Stern
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20110204195624.GA27680@kroah.com \
--to=greg@kroah.com \
--cc=alek.du@intel.com \
--cc=anoop.pa@gmail.com \
--cc=dbrownell@users.sourceforge.net \
--cc=gadiyar@ti.com \
--cc=gregkh@suse.de \
--cc=jacob.jun.pan@intel.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mips@linux-mips.org \
--cc=linux-usb@vger.kernel.org \
--cc=pkondeti@codeaurora.org \
--cc=ralf@linux-mips.org \
--cc=stern@rowland.harvard.edu \
--cc=ust@denx.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.