From nobody Tue Jun 16 02:37:54 2026 Received: from mail-pl1-f173.google.com (mail-pl1-f173.google.com [209.85.214.173]) (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 EF43123372C for ; Wed, 15 Apr 2026 09:34:48 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.173 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776245693; cv=none; b=OsOFGDcXzUyFUHb9Nzen8/UMo+d9nGlQnhXpfF/Ox4AFVhp2xEtFlYqy/JsDCUV6b8SxbpMXw1EKfcEAI8XOwD/EwV6zHvlKEQh0Ghz1o8ucfCKpI/AxwZ3spkaAU+2LQBxVUsBxoqH0snlqdLUvrn+XYwwfTrWIzgq8QTr0f28= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776245693; c=relaxed/simple; bh=jVmeTwzk9PJAUrS4SAHiGQddsG+3lg47R5zNpb3K/Rg=; h=From:To:Cc:Subject:Date:Message-Id:MIME-Version; b=iHsEcvXYGf7ZOAup/GouUYLCPFd5ENRyVvVlA1v32gCZatdeKWR4nG5aOVEjb/ejoThVmqy37s3dFbKp9bYd148d/j5rr65rCoQ31ja4gFNEks3paPiTD9Ix+Vd8Ls78XdbYz4O4D1W/Nt8blQOEVKoLZqwvaF1OYITgobxScN0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=snu.ac.kr; spf=pass smtp.mailfrom=snu.ac.kr; dkim=pass (1024-bit key) header.d=snu.ac.kr header.i=@snu.ac.kr header.b=lpHlEmA7; arc=none smtp.client-ip=209.85.214.173 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=snu.ac.kr Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=snu.ac.kr Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=snu.ac.kr header.i=@snu.ac.kr header.b="lpHlEmA7" Received: by mail-pl1-f173.google.com with SMTP id d9443c01a7336-2b23fcf90b2so62439325ad.3 for ; Wed, 15 Apr 2026 02:34:48 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=snu.ac.kr; s=google; t=1776245688; x=1776850488; 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; bh=b3b8a9yRsPwuBMnRE7k+9xNpDjqVfRCXwrD7bmNetW0=; b=lpHlEmA7YmA1epbGH1jUegZ0n+QtskT70HqAu8QGrffpuFldfQUXkjAHQPl9O8pMsS o7ikp5TCm/Dw65Kur990XAr0Sib6svkgm2H7NZfZMIggIL2Am/m1NJ/SqknCVVDzBvUz nrofrnlaDjXQN1p4j4TGJ3Dfcj4Fs2FR0So0E= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1776245688; x=1776850488; 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; bh=b3b8a9yRsPwuBMnRE7k+9xNpDjqVfRCXwrD7bmNetW0=; b=UxxCUtozMkbuqvZYo3vOqqa83fXgym0WxckoTh/FmLt11VSjsrVfwgN+fCxvvLeYBl TXXANB64JRqKyXCKCmAe9NEp2hdOsFX8CEiAynTgvDcOaigEmgZfAzQvOxo8Pl042R8R Cqa/+wtbnePOQa1ki0KaBP4W6FenmosWgrPkd2tDhQ2I0e8W6AXJ29GT+CRn3HSsPOe9 Ib/falixvlzwD+G1aBkQAq+X8RT9DyYhQzoOCLFjigEujNQiJDfnqRS3WeHloKL8BWfG GN2aHAZV7EjwG9mHh8BYDtmgIh8f/3ywigd8cUrBYrpIGkNQOzPPfNi89xbmEe/+fLTY ewfw== X-Forwarded-Encrypted: i=1; AFNElJ8k0RtcHQCsHw4zsvifnS82ya/rxhh5mk+7t8Kl0zm0FxZ2gNI7KQPu2bRS5s4xC02JeqZWQGU7OaoePnI=@vger.kernel.org X-Gm-Message-State: AOJu0YyqpydFthWFi7gEnFic7NCLAEtJDQM2rkLirC0HUf7ZclLlqqrc zsbJhhkM+u4LzoI7uMNehdIdjdWlJZdQJisvtwgaahfyq7YJV5EWeet1Rsm32jJ2MRU= X-Gm-Gg: AeBDieuVW+OZAFd/Z1WK1/e5GSGfO6jO9eQY0SOD6Y906yHqvTK3s2UN8+9EHkGKhJW HO/g7lDS6cR7LmTo6klD68QIHp/abNSGpEdQjlpwmZosP3QDj7Kg4z/IlcStYtEDA1Eis4S0cy0 v/6SMvz8pZKaP1w1TSHAQqy30waH16M4Qc6OorlpdickAjKzsEAQILz/NPe5axfcnOA1xXY95Sm 5HMSDursoz9SgULcw4TY4h8BSgO3c0kgFvGaLZ+1uFZrDcZR73EENuYLNAf4iCBDmulwDvvpIbg ZlK1Zz9fp3BW/HB6l+WuesgBosQsY5PwnptdBtreRkuWbouRL5KFv3/b/cnHGqqr4Z8W8gzslYZ xVQrABifc05cN4dS7gKOrF+Z8V57TH/nFGZhH/01oCqPaYwfquiQQBKIvVIW6dBfW1+Jysu0vV/ bU0+o3K79K2bejyW/pC0TzqtO4SOgOC0n556v6J1SqRAJSGbjtPh6As26thcqDMRN3Vrpvk3ARt yFgG6Ws X-Received: by 2002:a17:902:d507:b0:2b4:5cd0:b6c3 with SMTP id d9443c01a7336-2b45cd0bb63mr148252015ad.29.1776245688376; Wed, 15 Apr 2026 02:34:48 -0700 (PDT) Received: from nunu.. (nunu.snu.ac.kr. [147.46.112.82]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2b47826e1b7sm15311575ad.49.2026.04.15.02.34.45 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 15 Apr 2026 02:34:47 -0700 (PDT) From: Sangyun Kim To: ukleinek@kernel.org Cc: nicolas.ferre@microchip.com, alexandre.belloni@bootlin.com, claudiu.beznea@tuxon.dev, linux-pwm@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org Subject: [PATCH] pwm: atmel-tcb: Fix sleeping function called from invalid context Date: Wed, 15 Apr 2026 18:34:33 +0900 Message-Id: <20260415093433.2359955-1-sangyun.kim@snu.ac.kr> X-Mailer: git-send-email 2.34.1 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" atmel_tcb_pwm_apply() holds tcbpwmc->lock as a spinlock via guard(spinlock)() and then calls atmel_tcb_pwm_config(), which calls clk_get_rate() twice. clk_get_rate() acquires clk_prepare_lock (a mutex), so this is a sleep-in-atomic-context violation. On CONFIG_DEBUG_ATOMIC_SLEEP kernels every pwm_apply_state() that enables or reconfigures the PWM triggers a "BUG: sleeping function called from invalid context" warning. All callers of tcbpwmc->lock (the .request and .apply callbacks) run in process context and only need mutual exclusion against each other, so use a mutex instead of a spinlock and allow the sleeping calls inside atmel_tcb_pwm_config(). Fixes: 37f7707077f5 ("pwm: atmel-tcb: Fix race condition and convert to gua= rds") Signed-off-by: Sangyun Kim --- drivers/pwm/pwm-atmel-tcb.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/drivers/pwm/pwm-atmel-tcb.c b/drivers/pwm/pwm-atmel-tcb.c index f9ff78ba122d..6405e82d9f10 100644 --- a/drivers/pwm/pwm-atmel-tcb.c +++ b/drivers/pwm/pwm-atmel-tcb.c @@ -17,6 +17,7 @@ #include #include #include +#include #include #include #include @@ -47,7 +48,7 @@ struct atmel_tcb_channel { }; =20 struct atmel_tcb_pwm_chip { - spinlock_t lock; + struct mutex lock; u8 channel; u8 width; struct regmap *regmap; @@ -81,7 +82,7 @@ static int atmel_tcb_pwm_request(struct pwm_chip *chip, tcbpwm->period =3D 0; tcbpwm->div =3D 0; =20 - guard(spinlock)(&tcbpwmc->lock); + guard(mutex)(&tcbpwmc->lock); =20 regmap_read(tcbpwmc->regmap, ATMEL_TC_REG(tcbpwmc->channel, CMR), &cmr); /* @@ -335,7 +336,7 @@ static int atmel_tcb_pwm_apply(struct pwm_chip *chip, s= truct pwm_device *pwm, int duty_cycle, period; int ret; =20 - guard(spinlock)(&tcbpwmc->lock); + guard(mutex)(&tcbpwmc->lock); =20 if (!state->enabled) { atmel_tcb_pwm_disable(chip, pwm, state->polarity); @@ -438,7 +439,7 @@ static int atmel_tcb_pwm_probe(struct platform_device *= pdev) if (err) goto err_gclk; =20 - spin_lock_init(&tcbpwmc->lock); + mutex_init(&tcbpwmc->lock); =20 err =3D pwmchip_add(chip); if (err < 0) --=20 2.34.1