On Mon, Dec 29, 2014 at 01:37:04PM +0100, gianluca wrote: > On 12/25/2014 03:55 AM, Peter Chen wrote: > >On Wed, Dec 24, 2014 at 01:51:32PM +0100, gianluca wrote: > >>On 12/23/2014 01:12 AM, Peter Chen wrote: > >>>Ok, then just try to get the working version, and find the difference. > >>>>From my mind, it should be PLL related. > >>> > >> > >>Here I am again ;-) > >> > >>The following log is taken by an automatic-script during bootup (rc.local). > >> > >>the smtp_device.c throw a time out, so the imx_ehci logs an error > >>during bootup: unable to init phy > >> > >>>=EE= HW_CLKCTRL_PLL1CTRL0: /dev/mem opened. > >>>Memory mapped at address 0xb6f30000. > >>>Value at address 0x80040020 (0xb6f30020): 0x60000 > >> > >>>=EE= HW_CLKCTRL_PLL1CTRL1: /dev/mem opened. > >>>Memory mapped at address 0xb6f34000. > >>>Value at address 0x80040030 (0xb6f34030): 0x800004B1 > >> > > > >First I would like to confirm, the "USB1" you said is the second > >USB controller, and will use dedicated PLL1, is it correct? > > > > Yes, it is correct. USB1 is the second USB controller. > Where can I find the PLL1 as dedicated PLL for USB1? Device-Tree stuff?? > Yes, PLL1 is the dedicated PLL for USB1, you can get it from Reference Manual. > > >If it is, you may need to print PLL1 at the code once the timeout > >occurs, since the PLL1 may be normal behavior after some times. > >You have mentioned, if it is built as module, every thing works ok, > >correct? > > > > The problem I am arising is the MMU-side stuff of doing thing. The > kernel probe function is passing the MMUmapped address and not the > real-hardware address so I cannot access directly the registers. The > only thing I can do is asking kernel to a mmapped address for the > right registers and print their values out in the dev_err() stuff... > Anything quicker?? > Define a global function to print PLL1, and call it at USB PHY driver. > But anyway, this morning I tried both static (Chipidea and > Host/Device Kconfig) and dynamic modules and it fails in both cases > 5/10% of the times during cold start. You said you only met this problem during the warm reset, not cold boot, right? I am just worried that the PLL is not locked at that time, maybe a delay-retest loop can also work? count = 0; do { rval = mxs_phy_hw_init(mxs_phy); if (!rval) { break; } else { count++; is_pll_locked(); msleep(50); } } while (count < 10) > > So, thinking about your hint (about PLLs) I rewrote the phy-mxs-usb > in that way: > > >--- a/drivers/usb/phy/phy-mxs-usb.c 2013-11-20 21:37:52.000000000 +0100 > >+++ b/drivers/usb/phy/phy-mxs-usb.c 2014-12-29 12:40:29.000000000 +0100 > >@@ -61,12 +61,35 @@ > > return 0; > > } > > > >+static void mxs_force_phy_reset(struct usb_phy *phy); > >+ > > static int mxs_phy_init(struct usb_phy *phy) > > { > >+ int rval; > > struct mxs_phy *mxs_phy = to_mxs_phy(phy); > >+ int count = 1, retry_count = 5; > >+ > >+ /* TODO: > >+ * Sometime for some obscure reason, the PLLs of the smtp block of > >+ * USBPHY USB1 is not working as expected so as a _quick_and_dirty_ > >+ * workaround we try to suspend and resume the phy and its related > >+ * clock-tree gates and retry to init itself. > >+ * If after retry_count times fails, the USB PHY will not usable > >+ * at all. Maybe another SoC reset will do the job. It will called > >+ * in a rc.local stuff... > >+ */ > >+ do { > >+ clk_prepare_enable(mxs_phy->clk); > >+ rval = mxs_phy_hw_init(mxs_phy); > >+ if (rval) { > >+ dev_warn(phy->dev, > >+ "device USBPHY is not responding, retry %d of %d\n", > >+ count, retry_count); > >+ mxs_force_phy_reset(phy); > >+ } > >+ } while (rval != 0 && count++ <= retry_count); > > > >- clk_prepare_enable(mxs_phy->clk); > >- return mxs_phy_hw_init(mxs_phy); > >+ return rval; > > } > > > > static void mxs_phy_shutdown(struct usb_phy *phy) > >@@ -98,6 +121,16 @@ > > return 0; > > } > > > >+static void mxs_force_phy_reset(struct usb_phy *phy) > >+{ > >+ mxs_phy_suspend(phy, 1 /* Suspend */); > >+ mdelay(2); > >+ mxs_phy_suspend(phy, 0 /* Resume */); > >+ mdelay(2); > >+ mxs_phy_shutdown(phy); /* Shutdown */ > >+ mdelay(2); > >+} > >+ > > static int mxs_phy_on_connect(struct usb_phy *phy, > > enum usb_device_speed speed) > > { > > In this case (both modular and static) I received 5/10% of the times > during cold-start the warning, but after issuing a > mxs_force_phy_reset() the problem went away and the USB1 is working > when the kernel reach its final state... > > All SoC chips are iMX286 (MCIMX286CVM4B-M06Z) and some boards are > powered by 5V only (4000mAmps), and others are powered by a 24Vdc > and a step-down regulator to achieve the 5V (4000mAmps) for the > SoC... > > Ah, just for your review: > The board which is powered by ONLY the 5V is refusing to boot from > SD Card (from BootROM Code I suppose) if the SDCard is SDHC mode. No > problem for other SD and/or sizes... Is it a issue to worth of? > > Best regards, > -- > ,,, > (o o) > ======oOO==(_)==OOo====== > > Gianluca Renzi > R&D > phone: +39.0542.609120 > fax: +39.0542.609212 > > .oooO Oooo. > ======( )==( )======= > \ ( ) / > \_) (_/ > > =================== > | I would like to | > | fix the world, | > | but they're not | > | giving me the | > \ source code! / > --------------- > ¯\_(".)_/¯ -- Best Regards, Peter Chen -- 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