Hi, On 05/12/2014 11:14 AM, Chen-Yu Tsai wrote: > Hi, > > On Sat, May 10, 2014 at 8:56 PM, Maxime Ripard > <maxime.ripard@xxxxxxxxxxxxxxxxxx> wrote: >> The USB phy controller in the A31 differs mostly from the older controllers >> because it has a clock dedicated for each phy, while the older ones were having >> a single clock for all the phys. >> >> Signed-off-by: Maxime Ripard <maxime.ripard@xxxxxxxxxxxxxxxxxx> >> Reviewed-by: Hans de Goede <hdegoede@xxxxxxxxxx> >> --- >> drivers/phy/phy-sun4i-usb.c | 35 ++++++++++++++++++++++++++--------- >> 1 file changed, 26 insertions(+), 9 deletions(-) >> >> diff --git a/drivers/phy/phy-sun4i-usb.c b/drivers/phy/phy-sun4i-usb.c >> index e6e6c4ba7145..8bd89430d945 100644 >> --- a/drivers/phy/phy-sun4i-usb.c >> +++ b/drivers/phy/phy-sun4i-usb.c >> @@ -61,7 +61,6 @@ >> #define MAX_PHYS 3 >> >> struct sun4i_usb_phy_data { >> - struct clk *clk; >> void __iomem *base; >> struct mutex mutex; >> int num_phys; >> @@ -71,6 +70,7 @@ struct sun4i_usb_phy_data { >> void __iomem *pmu; >> struct regulator *vbus; >> struct reset_control *reset; >> + struct clk *clk; >> int index; >> } phys[MAX_PHYS]; >> }; >> @@ -146,13 +146,13 @@ static int sun4i_usb_phy_init(struct phy *_phy) >> struct sun4i_usb_phy_data *data = to_sun4i_usb_phy_data(phy); >> int ret; >> >> - ret = clk_prepare_enable(data->clk); >> + ret = clk_prepare_enable(phy->clk); >> if (ret) >> return ret; >> >> ret = reset_control_deassert(phy->reset); >> if (ret) { >> - clk_disable_unprepare(data->clk); >> + clk_disable_unprepare(phy->clk); >> return ret; >> } >> >> @@ -170,11 +170,10 @@ static int sun4i_usb_phy_init(struct phy *_phy) >> static int sun4i_usb_phy_exit(struct phy *_phy) >> { >> struct sun4i_usb_phy *phy = phy_get_drvdata(_phy); >> - struct sun4i_usb_phy_data *data = to_sun4i_usb_phy_data(phy); >> >> sun4i_usb_phy_passby(phy, 0); >> reset_control_assert(phy->reset); >> - clk_disable_unprepare(data->clk); >> + clk_disable_unprepare(phy->clk); >> >> return 0; >> } >> @@ -228,8 +227,10 @@ static int sun4i_usb_phy_probe(struct platform_device *pdev) >> struct phy_provider *phy_provider; >> struct reset_control *reset; >> struct regulator *vbus; >> + bool dedicated_clocks; > > No default? > >> struct resource *res; >> struct phy *phy; >> + struct clk *clk; >> char name[16]; >> int i; >> >> @@ -249,15 +250,20 @@ static int sun4i_usb_phy_probe(struct platform_device *pdev) >> else >> data->disc_thresh = 2; >> >> + if (of_device_is_compatible(np, "allwinner,sun6i-a31-usb-phy")) >> + dedicated_clocks = true; >> + > > dedicated_clocks is more than likely to be true from leftover data > on the stack. This results in the usb phy driver probe failing, and > the usb host drivers left in perpetual probe deferral on my Cubietruck. > > Adding an else section fixes this. Good catch, fixed this in the sunxi-devel branch for now (until Maxime sends a new version). Regards, Hans -- 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