From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753514AbcG2SO3 (ORCPT ); Fri, 29 Jul 2016 14:14:29 -0400 Received: from glaubenleben.de ([85.214.105.140]:45809 "EHLO glaubenleben.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751695AbcG2SO1 (ORCPT ); Fri, 29 Jul 2016 14:14:27 -0400 X-Greylist: delayed 1876 seconds by postgrey-1.27 at vger.kernel.org; Fri, 29 Jul 2016 14:14:26 EDT From: Andreas Kemnade To: Bin Liu , Greg Kroah-Hartman , linux-usb@vger.kernel.org, linux-omap@vger.kernel.org, linux-kernel@vger.kernel.org, letux-kernel@openphoenux.org Cc: Andreas Kemnade Subject: [PATCH] musb: omap2430: do not assume balanced enable()/disable() Date: Fri, 29 Jul 2016 19:42:31 +0200 Message-Id: <1469814151-2571-1-git-send-email-andreas@kemnade.info> X-Mailer: git-send-email 2.1.4 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org The code assumes that omap2430_musb_enable() and omap2430_musb_disable() is called in a balanced way. The That fact is broken by the fact that musb_init_controller() calls musb_platform_disable() to switch from unknown state to off state. That means that phy_power_off() is called first so that phy->power_count gets -1 and the phy is not enabled on phy_power_on(). In the probably common case of using the phy_twl4030, that prevents also charging the battery and so makes further kernel debugging hard. The patch prevents phy_power_off() from being called when it is already off. Signed-off-by: Andreas Kemnade --- drivers/usb/musb/omap2430.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/drivers/usb/musb/omap2430.c b/drivers/usb/musb/omap2430.c index aecb934..c7ae117 100644 --- a/drivers/usb/musb/omap2430.c +++ b/drivers/usb/musb/omap2430.c @@ -415,9 +415,10 @@ static void omap2430_musb_disable(struct musb *musb) struct device *dev = musb->controller; struct omap2430_glue *glue = dev_get_drvdata(dev->parent); - if (!WARN_ON(!musb->phy)) - phy_power_off(musb->phy); - + if (glue->enabled) { + if (!WARN_ON(!musb->phy)) + phy_power_off(musb->phy); + } if (glue->status != MUSB_UNKNOWN) omap_control_usb_set_mode(glue->control_otghs, USB_MODE_DISCONNECT); -- 2.1.4