Hi, On Monday 12 May 2014 05:29 PM, Hans de Goede wrote: > 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). so I wont be taking this patch in my tree. Anyway FWIW Acked-by: Kishon Vijay Abraham I <kishon@xxxxxx> > > 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