Re: [PATCH] OMAP: USB : Fix the EHCI enumeration and core retention issue

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Thu, Jun 21, 2012 at 7:12 PM, Keshava Munegowda
<keshava_mgowda@xxxxxx> wrote:
> This commit 354ab8567ae3107a8cbe7228c3181990ba598aac titled
> "Fix OMAP EHCI suspend/resume failure (i693)" is causing
> the usb hub and device detection fails in beagle XM
> causeing NFS not functional. This affects the core retention too.
> The same commit logic needs to be revisted adhering to hwmod and
> device tree framework.
> for now, this commit id 354ab8567ae3107a8cbe7228c3181990ba598aac
> titled "Fix OMAP EHCI suspend/resume failure (i693)" reverted.
>
> This patch is validated on BeagleXM with NFS support over
> usb ethernet and USB mass storage and other device detection.
>
> Signed-off-by: Keshava Munegowda <keshava_mgowda@xxxxxx>
> ---
>  drivers/usb/host/ehci-omap.c |  164 +-----------------------------------------
>  1 file changed, 1 insertion(+), 163 deletions(-)
>
> diff --git a/drivers/usb/host/ehci-omap.c b/drivers/usb/host/ehci-omap.c
> index 17cfb8a..272e661 100644
> --- a/drivers/usb/host/ehci-omap.c
> +++ b/drivers/usb/host/ehci-omap.c
> @@ -56,15 +56,6 @@
>  #define        EHCI_INSNREG05_ULPI_EXTREGADD_SHIFT             8
>  #define        EHCI_INSNREG05_ULPI_WRDATA_SHIFT                0
>
> -/* Errata i693 */
> -static struct clk      *utmi_p1_fck;
> -static struct clk      *utmi_p2_fck;
> -static struct clk      *xclk60mhsp1_ck;
> -static struct clk      *xclk60mhsp2_ck;
> -static struct clk      *usbhost_p1_fck;
> -static struct clk      *usbhost_p2_fck;
> -static struct clk      *init_60m_fclk;
> -
>  /*-------------------------------------------------------------------------*/
>
>  static const struct hc_driver ehci_omap_hc_driver;
> @@ -80,40 +71,6 @@ static inline u32 ehci_read(void __iomem *base, u32 reg)
>        return __raw_readl(base + reg);
>  }
>
> -/* Erratum i693 workaround sequence */
> -static void omap_ehci_erratum_i693(struct ehci_hcd *ehci)
> -{
> -       int ret = 0;
> -
> -       /* Switch to the internal 60 MHz clock */
> -       ret = clk_set_parent(utmi_p1_fck, init_60m_fclk);
> -       if (ret != 0)
> -               ehci_err(ehci, "init_60m_fclk set parent"
> -                       "failed error:%d\n", ret);
> -
> -       ret = clk_set_parent(utmi_p2_fck, init_60m_fclk);
> -       if (ret != 0)
> -               ehci_err(ehci, "init_60m_fclk set parent"
> -                       "failed error:%d\n", ret);
> -
> -       clk_enable(usbhost_p1_fck);
> -       clk_enable(usbhost_p2_fck);
> -
> -       /* Wait 1ms and switch back to the external clock */
> -       mdelay(1);
> -       ret = clk_set_parent(utmi_p1_fck, xclk60mhsp1_ck);
> -       if (ret != 0)
> -               ehci_err(ehci, "xclk60mhsp1_ck set parent"
> -                       "failed error:%d\n", ret);
> -
> -       ret = clk_set_parent(utmi_p2_fck, xclk60mhsp2_ck);
> -       if (ret != 0)
> -               ehci_err(ehci, "xclk60mhsp2_ck set parent"
> -                       "failed error:%d\n", ret);
> -
> -       clk_disable(usbhost_p1_fck);
> -       clk_disable(usbhost_p2_fck);
> -}
>
>  static void omap_ehci_soft_phy_reset(struct platform_device *pdev, u8 port)
>  {
> @@ -145,50 +102,6 @@ static void omap_ehci_soft_phy_reset(struct platform_device *pdev, u8 port)
>        }
>  }
>
> -static int omap_ehci_hub_control(
> -       struct usb_hcd  *hcd,
> -       u16             typeReq,
> -       u16             wValue,
> -       u16             wIndex,
> -       char            *buf,
> -       u16             wLength
> -)
> -{
> -       struct ehci_hcd *ehci = hcd_to_ehci(hcd);
> -       u32 __iomem *status_reg = &ehci->regs->port_status[
> -                               (wIndex & 0xff) - 1];
> -       u32             temp;
> -       unsigned long   flags;
> -       int             retval = 0;
> -
> -       spin_lock_irqsave(&ehci->lock, flags);
> -
> -       if (typeReq == SetPortFeature && wValue == USB_PORT_FEAT_SUSPEND) {
> -               temp = ehci_readl(ehci, status_reg);
> -               if ((temp & PORT_PE) == 0 || (temp & PORT_RESET) != 0) {
> -                       retval = -EPIPE;
> -                       goto done;
> -               }
> -
> -               temp &= ~PORT_WKCONN_E;
> -               temp |= PORT_WKDISC_E | PORT_WKOC_E;
> -               ehci_writel(ehci, temp | PORT_SUSPEND, status_reg);
> -
> -               omap_ehci_erratum_i693(ehci);
> -
> -               set_bit((wIndex & 0xff) - 1, &ehci->suspended_ports);
> -               goto done;
> -       }
> -
> -       spin_unlock_irqrestore(&ehci->lock, flags);
> -
> -       /* Handle the hub control events here */
> -       return ehci_hub_control(hcd, typeReq, wValue, wIndex, buf, wLength);
> -done:
> -       spin_unlock_irqrestore(&ehci->lock, flags);
> -       return retval;
> -}
> -
>  static void disable_put_regulator(
>                struct ehci_hcd_omap_platform_data *pdata)
>  {
> @@ -353,76 +266,9 @@ static int ehci_hcd_omap_probe(struct platform_device *pdev)
>        /* root ports should always stay powered */
>        ehci_port_power(omap_ehci, 1);
>
> -       /* get clocks */
> -       utmi_p1_fck = clk_get(dev, "utmi_p1_gfclk");
> -       if (IS_ERR(utmi_p1_fck)) {
> -               ret = PTR_ERR(utmi_p1_fck);
> -               dev_err(dev, "utmi_p1_gfclk failed error:%d\n", ret);
> -               goto err_add_hcd;
> -       }
> -
> -       xclk60mhsp1_ck = clk_get(dev, "xclk60mhsp1_ck");
> -       if (IS_ERR(xclk60mhsp1_ck)) {
> -               ret = PTR_ERR(xclk60mhsp1_ck);
> -               dev_err(dev, "xclk60mhsp1_ck failed error:%d\n", ret);
> -               goto err_utmi_p1_fck;
> -       }
> -
> -       utmi_p2_fck = clk_get(dev, "utmi_p2_gfclk");
> -       if (IS_ERR(utmi_p2_fck)) {
> -               ret = PTR_ERR(utmi_p2_fck);
> -               dev_err(dev, "utmi_p2_gfclk failed error:%d\n", ret);
> -               goto err_xclk60mhsp1_ck;
> -       }
> -
> -       xclk60mhsp2_ck = clk_get(dev, "xclk60mhsp2_ck");
> -       if (IS_ERR(xclk60mhsp2_ck)) {
> -               ret = PTR_ERR(xclk60mhsp2_ck);
> -               dev_err(dev, "xclk60mhsp2_ck failed error:%d\n", ret);
> -               goto err_utmi_p2_fck;
> -       }
> -
> -       usbhost_p1_fck = clk_get(dev, "usb_host_hs_utmi_p1_clk");
> -       if (IS_ERR(usbhost_p1_fck)) {
> -               ret = PTR_ERR(usbhost_p1_fck);
> -               dev_err(dev, "usbhost_p1_fck failed error:%d\n", ret);
> -               goto err_xclk60mhsp2_ck;
> -       }
> -
> -       usbhost_p2_fck = clk_get(dev, "usb_host_hs_utmi_p2_clk");
> -       if (IS_ERR(usbhost_p2_fck)) {
> -               ret = PTR_ERR(usbhost_p2_fck);
> -               dev_err(dev, "usbhost_p2_fck failed error:%d\n", ret);
> -               goto err_usbhost_p1_fck;
> -       }
> -
> -       init_60m_fclk = clk_get(dev, "init_60m_fclk");
> -       if (IS_ERR(init_60m_fclk)) {
> -               ret = PTR_ERR(init_60m_fclk);
> -               dev_err(dev, "init_60m_fclk failed error:%d\n", ret);
> -               goto err_usbhost_p2_fck;
> -       }
>
>        return 0;
>
> -err_usbhost_p2_fck:
> -       clk_put(usbhost_p2_fck);
> -
> -err_usbhost_p1_fck:
> -       clk_put(usbhost_p1_fck);
> -
> -err_xclk60mhsp2_ck:
> -       clk_put(xclk60mhsp2_ck);
> -
> -err_utmi_p2_fck:
> -       clk_put(utmi_p2_fck);
> -
> -err_xclk60mhsp1_ck:
> -       clk_put(xclk60mhsp1_ck);
> -
> -err_utmi_p1_fck:
> -       clk_put(utmi_p1_fck);
> -
>  err_add_hcd:
>        disable_put_regulator(pdata);
>        pm_runtime_put_sync(dev);
> @@ -452,14 +298,6 @@ static int ehci_hcd_omap_remove(struct platform_device *pdev)
>        iounmap(hcd->regs);
>        usb_put_hcd(hcd);
>
> -       clk_put(utmi_p1_fck);
> -       clk_put(utmi_p2_fck);
> -       clk_put(xclk60mhsp1_ck);
> -       clk_put(xclk60mhsp2_ck);
> -       clk_put(usbhost_p1_fck);
> -       clk_put(usbhost_p2_fck);
> -       clk_put(init_60m_fclk);
> -
>        pm_runtime_put_sync(dev);
>        pm_runtime_disable(dev);
>
> @@ -530,7 +368,7 @@ static const struct hc_driver ehci_omap_hc_driver = {
>         * root hub support
>         */
>        .hub_status_data        = ehci_hub_status_data,
> -       .hub_control            = omap_ehci_hub_control,
> +       .hub_control            = ehci_hub_control,
>        .bus_suspend            = ehci_bus_suspend,
>        .bus_resume             = ehci_bus_resume,
>
> --
> 1.7.9.5
>

hi kevin

here is pm count log on beagle XM with the above patch:

 cat ./debug/pm_debug/count
usbhost_pwrdm (ON),OFF:0,RET:3,INA:0,ON:4,RET-LOGIC-OFF:0,RET-MEMBANK1-OFF:0
sgx_pwrdm (OFF),OFF:1,RET:0,INA:0,ON:1,RET-LOGIC-OFF:0,RET-MEMBANK1-OFF:0
core_pwrdm (ON),OFF:0,RET:0,INA:0,ON:1,RET-LOGIC-OFF:0,RET-MEMBANK1-OFF:0,RET-MEMBANK2-OFF:0
per_pwrdm (ON),OFF:0,RET:0,INA:0,ON:1,RET-LOGIC-OFF:0,RET-MEMBANK1-OFF:0
dss_pwrdm (ON),OFF:0,RET:1254,INA:0,ON:1255,RET-LOGIC-OFF:0,RET-MEMBANK1-OFF:0
cam_pwrdm (RET),OFF:0,RET:1,INA:0,ON:1,RET-LOGIC-OFF:0,RET-MEMBANK1-OFF:0
neon_pwrdm (ON),OFF:0,RET:1254,INA:0,ON:1255,RET-LOGIC-OFF:0
mpu_pwrdm (ON),OFF:0,RET:1254,INA:0,ON:1255,RET-LOGIC-OFF:0,RET-MEMBANK1-OFF:0
iva2_pwrdm (RET),OFF:0,RET:1,INA:0,ON:1,RET-LOGIC-OFF:0,RET-MEMBANK1-OFF:0,RET-MEMBANK2-OFF:0,RET-MEMBANK3-OFF:0,RET-MEMBANK4-OFF:0
usbhost_clkdm->usbhost_pwrdm (3)
sgx_clkdm->sgx_pwrdm (0)
per_clkdm->per_pwrdm (19)
cam_clkdm->cam_pwrdm (0)
dss_clkdm->dss_pwrdm (1)
core_l4_clkdm->core_pwrdm (25)
core_l3_clkdm->core_pwrdm (4)
d2d_clkdm->core_pwrdm (0)
iva2_clkdm->iva2_pwrdm (0)
neon_clkdm->neon_pwrdm (0)
mpu_clkdm->mpu_pwrdm (0)
prm_clkdm->wkup_pwrdm (0)
cm_clkdm->core_pwrdm (0)


regards
keshava
--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Linux Media]     [Linux Input]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Old Linux USB Devel Archive]

  Powered by Linux