From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-ed1-f44.google.com (mail-ed1-f44.google.com [209.85.208.44]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 6203A456E01 for ; Tue, 28 Jul 2026 15:44:23 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.44 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785253466; cv=none; b=Qf/4z2J+u2qw6lY8MBuOoKfiZ13nZE8JSB1WmgkxkFKkQPKjMiZixeRxXEiW8rboLZvMMHosTTVgyzummLZZupkSPcGLPtFwak7Kw9Hw0NPY2T8BnEtfzohfz+nNqRjSWAj/XWhkBrrhgVGHYQE32WuPVsK/XPNrrAD0YPedEJo= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785253466; c=relaxed/simple; bh=B+iy6kp9ASXr8Q315XpH1lU+dHe0l3ofKkdBIdlMNz8=; h=From:To:Cc:Subject:Date:Message-Id:MIME-Version; b=o9DWTmcGXZFNIPBWUn2IfPKe1ZHaaMT56+8cictyGQ8WestigZ2+ztXM27swYNe6Xk9R6/d7usFGbAPZ4bgKAp2Y26Nw48xGe9rAiUQiH+yS4Bm7R+/f292++IrIRQ0947kt+WPUYGo46KxrUJJ++qrh7d4hkIS5AbNugMPm1wg= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=baylibre.com; spf=pass smtp.mailfrom=baylibre.com; dkim=pass (2048-bit key) header.d=baylibre.com header.i=@baylibre.com header.b=QikZo11i; arc=none smtp.client-ip=209.85.208.44 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=baylibre.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=baylibre.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=baylibre.com header.i=@baylibre.com header.b="QikZo11i" Received: by mail-ed1-f44.google.com with SMTP id 4fb4d7f45d1cf-69fc9f25118so3313039a12.2 for ; Tue, 28 Jul 2026 08:44:23 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre.com; s=google; t=1785253461; x=1785858261; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to:content-type; bh=GVqoC0PvlsYqdavWQBkILSRZgUpiUZ64ta6tc5vlUjs=; b=QikZo11iiDLG/MEEmJkm2zY4QoSViMFJBglWVlQz5YI+EpB793c8cj5aLbMmrKoPZg RDQxzWJCL2/OsaiwzPDDImSZKqreqrvOmFOBEg/dsh/S87/ja/q6Ibd9BpK+z1nCnDAZ WK/+SNPRa3LTli0ZObk0JtwtReCQ8L0dZo28CrNSPcqjNu5V1t9Yen+/oU+uyFHFch+H SeLSa4ucHsZ5TLpkkfjI9K6Cy03yKAvvqpyYcoTz6QDAEUuWY7x2n+fDv0A3rRWjgt6+ uy2K60r66AurJUgQ7RGRPIhjB+Zp9oHSOXYGUOdH4hdPR4ZFhFNcEzZOncG+mjtz5GW6 6O6A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1785253461; x=1785858261; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to:content-type; bh=GVqoC0PvlsYqdavWQBkILSRZgUpiUZ64ta6tc5vlUjs=; b=o3Ed0+EBdFAXfbgGqNucECwY/NL1t2E6YmsxIEF5iTk0XsE26tQ/O1iaL/iI3IZ2LC HCDQRJyv2N9iWqZzU+qXZFT8BqGYWqarXv5sKsWxNuktC28ElGjs91Vh5TQ3WrODwLqw qVJWduLMiK/YjIxYaRdf5mPSuw9Fzp2gidWhQB0/ZLmipGvxtzF5NPpRSnLZ3Oc4epTZ Lf1H/XOxdI+R6b2k+YlIh6tiFPH6AURHP8smknGfY6xc1PSlU520lZGKnvldzNLggW65 DmLEPayBxE/Acp9GFNKwTnK20XsBFVqlclirUMblT/68izGPr+1cBezPrCIzLILY8R5+ wlRg== X-Forwarded-Encrypted: i=1; AHgh+Rr/JMJzPavxywGKJEMzrdCf5eWe8BIjK+9IfitVScgofFvUgisp6zQkmPZQ3484fnkpoMO/L0uPBdWc648=@vger.kernel.org X-Gm-Message-State: AOJu0Yw6x8Zgerq5ar/1tVjwAXb4mByGM7CTZtPvfuV6wjRMWSfEMiST F55Y98IdPEDkZQm7EljmerNT7r0IKCF79HFL8kGlroUo3loQmv59QRM3PqUwb3RUKe4= X-Gm-Gg: AR+sD135ZQjj2tJBZdwDyXE3ldXN6vNi7Be1yLfUsr+pJIiAIXGpcryYhpvlJFp9L6P fWEmNuJJ2OQPbm017Vi5j86qkNn0aDbIn2wLEdluswOl6qLJZp/93BRQrtAymzEG6lGH6a0SAxq x3Kr0vNKviZo1qTQgGaa6VmPlbkf8A7NY7pNcrXbClDyC0RxX+igbdNmigI04XcGxDRog4Xr7bL OH0u4DlNQkUzKlgHzXEy6xwKL/BM00lf/t3OFsn3MTWw/UEuzXPQuyKLb76k6+kQ8asiUD2lFAC w5BSFJoEYbQ0Xwg1dlOISI/bahIam44yeW2iwhj9Wzgm4R/vk+ws7EpF9oM+wTUJFsCzIN2Sa/N yiUI4oZ2P6rVMcfPnSTQzK6UgWPsyJljNJIfdrN0R7JwT2JVf8ZhQEKQiLynfS63/wgBroYDpt8 Bu8fQW99fznr3v5kUzOG5PqOHgWsn7Cg== X-Received: by 2002:a05:6402:a5ca:10b0:69e:9213:11b with SMTP id 4fb4d7f45d1cf-6a0349ec6e2mr1041065a12.13.1785253461681; Tue, 28 Jul 2026 08:44:21 -0700 (PDT) Received: from localhost (mob-176-247-26-234.net.vodafone.it. [176.247.26.234]) by smtp.gmail.com with ESMTPSA id 4fb4d7f45d1cf-69fb594622asm4573764a12.26.2026.07.28.08.44.20 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 28 Jul 2026 08:44:21 -0700 (PDT) From: Francesco Lavra To: Minas Harutyunyan , Greg Kroah-Hartman , Felipe Balbi , Grigor Tovmasyan , John Youn , Vardan Mikayelyan , linux-usb@vger.kernel.org, linux-kernel@vger.kernel.org Cc: stable@vger.kernel.org Subject: [PATCH] usb: dwc2: gadget: Exit partial power down state when changing USB pull-up Date: Tue, 28 Jul 2026 17:44:20 +0200 Message-Id: <20260728154420.2021519-1-flavra@baylibre.com> X-Mailer: git-send-email 2.39.5 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Developer-Signature: v=1; a=openpgp-sha256; l=2172; i=flavra@baylibre.com; h=from:subject; bh=B+iy6kp9ASXr8Q315XpH1lU+dHe0l3ofKkdBIdlMNz8=; b=owEB7QES/pANAwAKAe3xO3POlDZfAcsmYgBqaM3FFIxZ52DW+l5DVb8R5uXZTXBCixZJH5yrH thUlmkLyl2JAbMEAAEKAB0WIQSGV4VPlTvcox7DFObt8TtzzpQ2XwUCamjNxQAKCRDt8TtzzpQ2 X65rC/90A/JWtrbWO3amiFS3C69FigY24thsO2QSDfyfhnA/9Hnzss5k7S91fueUhsk3QHIQa2e fsEg8vjXEox6ALrpoHK6H/mAOF9HbbmOyz6vrNWiYGyo9W5A7dN5b36FeHut1X9M1a4WkbnBV8S yTfBrbmfYBDrAbj65iRbPXfmVFvZBgn/dFXX5V3yoXL8IapBlV6YS1GSglyuDk1p3jeUfRKbloC 8ecpO+vMvK2SOn0bpKoJwPXhubO/VVHpKu8KnJo1KjGoKgoDMyT9DGChOX2W5wYylYa3KFJQCdc sJxzGpd+e75/0ru266yJJ4MBlBvJKA3giuZKxMou9vw3SIEiMNta77pQAK4mGrUBP0fiiZ5SbYP N/FoV1yijn6+cRGr1H697PdWuhYxu3pAIPTyC5NbWaPZAXAkNrdBafQbnzN/zjFpSqL4jsOP6R0 GWJh19Gvpn9Y6P75rGaXJI0YQkVTLzaSOQ5akz8+5xIIdz4hJm8jc51CErrKU4EvbCJDE= X-Developer-Key: i=flavra@baylibre.com; a=openpgp; fpr=8657854F953BDCA31EC314E6EDF13B73CE94365F Content-Transfer-Encoding: 8bit When a USB host suspends a connected device, the DWC2 USB device controller enters a partial power down state where controller registers are not accessible. If the USB gadget is then disconnected or deactivated (e.g. when a gadget function is unbound from the controller), the `pullup` callback in struct usb_gadget_ops is invoked; if the controller is kept in partial power down, the register write in dwc2_hsotg_core_disconnect() does not take effect; as a result, the USB host keeps seeing the device as connected, even though the device is disabled. Properly exit partial power down state in the pullup callback, so that the USB host detects a device disconnection as intended. Fixes: 97861781daff ("usb: dwc2: Allow entering hibernation from USB_SUSPEND interrupt") Cc: stable@vger.kernel.org Signed-off-by: Francesco Lavra --- drivers/usb/dwc2/gadget.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/drivers/usb/dwc2/gadget.c b/drivers/usb/dwc2/gadget.c index c8b02c27d27d..102169b40419 100644 --- a/drivers/usb/dwc2/gadget.c +++ b/drivers/usb/dwc2/gadget.c @@ -4680,6 +4680,7 @@ static int dwc2_hsotg_pullup(struct usb_gadget *gadget, int is_on) { struct dwc2_hsotg *hsotg = to_hsotg(gadget); unsigned long flags; + int ret = 0; dev_dbg(hsotg->dev, "%s: is_on: %d op_state: %d\n", __func__, is_on, hsotg->op_state); @@ -4691,6 +4692,13 @@ static int dwc2_hsotg_pullup(struct usb_gadget *gadget, int is_on) } spin_lock_irqsave(&hsotg->lock, flags); + if (hsotg->in_ppd) { + ret = dwc2_exit_partial_power_down(hsotg, 0, true); + if (ret) { + dev_err(hsotg->dev, "exit partial_power_down failed\n"); + goto exit; + } + } if (is_on) { hsotg->enabled = 1; dwc2_hsotg_core_init_disconnected(hsotg, false); @@ -4704,9 +4712,10 @@ static int dwc2_hsotg_pullup(struct usb_gadget *gadget, int is_on) } hsotg->gadget.speed = USB_SPEED_UNKNOWN; +exit: spin_unlock_irqrestore(&hsotg->lock, flags); - return 0; + return ret; } static int dwc2_hsotg_vbus_session(struct usb_gadget *gadget, int is_active) -- 2.39.5