From nobody Sun May 24 22:34:04 2026 Received: from mail-vk1-f170.google.com (mail-vk1-f170.google.com [209.85.221.170]) (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 1CB4B1C69D for ; Thu, 21 May 2026 00:01:15 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.170 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779321677; cv=none; b=S9QcWtU0jKHkdOD8n0MlR1JLjKR2C69X1d0Ul6SKvavaw4hbdJMhqofrAtTwDPkRjY2r9iZcZLWno254fJrybvneB1rYwpJzbpsjr2Lu+38SvYj7zJmLcu4A5Y4okJpT34ceIlXXSP2NjLPOKzD6omxMO3+Q7LCdcOiHsQRikkE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779321677; c=relaxed/simple; bh=3Z1/s8TDKCJg12TEEASVieUkMtbUhhy151++MGS6sgU=; h=From:To:Cc:Subject:Date:Message-ID:MIME-Version; b=rKUzjdnK+hhavqdsPVkkMazGqTv/LxHZj+bMpBVbsBQikFo1AumUTwhwvaHOZqvyZjusSwxYrwUmEm/OrdRvDVW/ORrUSVLw+OxgJ2W0QpoZ8Euq9pd/cqRCBwZIZPUSWAOst4KsEFKyM/2jkcxDmQ6d0ghy+uLIpB6g3uReHYA= 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=LnzEF2is; arc=none smtp.client-ip=209.85.221.170 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="LnzEF2is" Received: by mail-vk1-f170.google.com with SMTP id 71dfb90a1353d-56f72d27e7eso6826414e0c.0 for ; Wed, 20 May 2026 17:01:14 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre.com; s=google; t=1779321674; x=1779926474; 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=Lg+UFUjX2TWBvKvhX5SvfRqht7iHN6Ihdh9sMBKt2/o=; b=LnzEF2isaSB/NOqY7hyYBDWDxrEx5PqfOY1sABqKNvXZgsoCRbeCeBvSeEF9ql5DN0 8F9U7SgnB30QRXZTfQvyqfmgKFOd0PYJIHbU/pgt4bn7D30AwHFPBWsCXslrjvZJZ0Ep uvXk4tQT+EA6SEGqqxaEXllojFh3dQ/bzjM+GY4E47DE5m+NBPTFVhWOi9/3AJAvOmBP M6cayqx/3vRAYEU0+NHOkbB93wEkaSHVbbQsHpjf4cKaD6imM4LudCCXegzSFea6GLHJ FqDc/7zXq6gwSh2vl2OVgmyQ2U8ZPc8iOLQnsc+Jr54lxGCwj9oPIE8G6PDGdb6QcZh9 R3dw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1779321674; x=1779926474; 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=Lg+UFUjX2TWBvKvhX5SvfRqht7iHN6Ihdh9sMBKt2/o=; b=Ibys1+gPwQcund8+5jIXEbSZUA4Kar2MYfgwg18d37kPLIVUU+Bowb91Z3Ep0xFe6I 4SQB401AttdbiKaB2jX3sK/HMZWvGo1sT2IRO0mhFxpwo5inXR80MMPm+yNhCeheCBnH 9wIWPtALWyeNKUc5/aUxoXJMQe7lGIFiZlfRPZn6jV+NGlMNVrtn088tyRfJgGLA1WRL dSv7+BSIuCTK8HIkCuo8Dl4B5314Krw60Kvj8KnjgML8aUNDMUYeOqJqwBDYA4p40DhZ 5xTre1y1HGw2Z4NkGCub04J+B33M1K8rkM2+QFRY9P9ZrbPSDUOb10KCqJJ6PVyHLUxo KJNw== X-Forwarded-Encrypted: i=1; AFNElJ+K02V6PonQWjy5Mi+GGsf9FL/hGcoNhnXRTXNo9rduHtEJ63o4kTq+M7el3qUbsIUHNEK19AuD/g4P1VE=@vger.kernel.org X-Gm-Message-State: AOJu0YymEyLyAarg0jViRNwmEcDaUSxBfM1M3hhQNEirrm4n7r5adV3r M9KrSZCdlF0dEeHSFTW9tJcmM9AeS9BwaFEW7FqvoCH+ppRQ9SnNSb86kJhiBFG84D0= X-Gm-Gg: Acq92OFyX8syUX/YQL3pqtU25LKY3sbGIvAZtIC+mOF98z3VRhk38LC5MXvu44NLgWp Kz1pOmbmkDpnPT5lh/50C1u/515hSa204q8gZERLhUvlI8A8y/EYd3T8icwFkaEMyTYIEp9Q+m/ Fnze6Q2jWWuGgYvRPmTHZFSfuVRAbMPZuHJ4VOfHtmkYRWwtDbqqv2DkVilGBx7yLgIffj21RLR KdVZ5hgb40XBLPuEGXXmHSL2dS30WMfAdBgJvETmy3sXJU8X8V+DOdXZHPK5l3O6QGYz488XMtL ySeKuaGYa4zYAJ6b/lVdsC2UdCU4TnxSHsWgqzMef7yQKIFcIb8EE8f74HRqCQLjEijuEB2xiKS g/bYutBRpVHK2wP0WXmNdHw+y6TAfgETmwlhyDzWWbfgVZA5ZPnRGVrlPZVzv9Y7NOFpFBGmISG kCmEPe/weCu+0+VxSgBIvYPzFB3r0kyhN/kDn0qsCUrA== X-Received: by 2002:a05:6122:235:b0:575:fa0b:bc23 with SMTP id 71dfb90a1353d-5841b77d3bemr288066e0c.2.1779321673711; Wed, 20 May 2026 17:01:13 -0700 (PDT) Received: from acer-e1.tail6c460f.ts.net ([2804:7f0:7542:7b16:2880:ed6d:f5c:8b9e]) by smtp.gmail.com with ESMTPSA id a1e0cc1a2514c-95fc2d278a8sm10206321241.6.2026.05.20.17.01.09 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 20 May 2026 17:01:12 -0700 (PDT) From: Ronaldo Nunez To: linux-pwm@vger.kernel.org Cc: =?UTF-8?q?Uwe=20Kleine-K=C3=B6nig?= , Frank Li , Sascha Hauer , Pengutronix Kernel Team , Fabio Estevam , imx@lists.linux.dev, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Ronaldo Nunez Subject: [PATCH] pwm: imx27: Fix variable truncation in .apply() Date: Wed, 20 May 2026 21:00:54 -0300 Message-ID: <20260521000054.4790-1-rnunez@baylibre.com> X-Mailer: git-send-email 2.53.0 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" This patch fixes a variable truncation when calculating period in microseconds as part of the solution for the ERR051198 in .apply() callback. The problem was identified when reducing the duty cycle through sysfs, with enable set to 1. The condition to fix errata ERR051198 for period smaller than 2us is always being met, due to a truncation on tmp, variable from .apply() callback, caused by the multiplication of NSEC_PER_SEC, PWMPR (period register) and the prescaler which can easily overflow u32. Declaring tmp as u64 makes it large enough to accommodate larger multiplication results. Testing: - Hardware: Udoo Neo Extended with iMX6SoloX SoC - Tools: Verified with a logic analyzer Signed-off-by: Ronaldo Nunez --- drivers/pwm/pwm-imx27.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/drivers/pwm/pwm-imx27.c b/drivers/pwm/pwm-imx27.c index 3d34cdc4a3a5..c8b801fcb525 100644 --- a/drivers/pwm/pwm-imx27.c +++ b/drivers/pwm/pwm-imx27.c @@ -200,7 +200,7 @@ static void pwm_imx27_wait_fifo_slot(struct pwm_chip *c= hip, static int pwm_imx27_apply(struct pwm_chip *chip, struct pwm_device *pwm, const struct pwm_state *state) { - unsigned long period_cycles, duty_cycles, prescale, period_us, tmp; + unsigned long period_cycles, duty_cycles, prescale, period_us; struct pwm_imx27_chip *imx =3D to_pwm_imx27_chip(chip); unsigned long long c; unsigned long long clkrate; @@ -208,6 +208,7 @@ static int pwm_imx27_apply(struct pwm_chip *chip, struc= t pwm_device *pwm, int val; int ret; u32 cr; + u64 tmp; =20 clkrate =3D clk_get_rate(imx->clks[PWM_IMX27_PER].clk); c =3D clkrate * state->period; @@ -249,6 +250,11 @@ static int pwm_imx27_apply(struct pwm_chip *chip, stru= ct pwm_device *pwm, val =3D readl(imx->mmio_base + MX3_PWMPR); val =3D val >=3D MX3_PWMPR_MAX ? MX3_PWMPR_MAX : val; cr =3D readl(imx->mmio_base + MX3_PWMCR); + + /* + * tmp stores period in nanoseconds. Result fits in u64 since + * val <=3D 0xfffe and prescaler in [1, 0x1000]. + */ tmp =3D NSEC_PER_SEC * (u64)(val + 2) * MX3_PWMCR_PRESCALER_GET(cr); tmp =3D DIV_ROUND_UP_ULL(tmp, clkrate); period_us =3D DIV_ROUND_UP_ULL(tmp, 1000); --=20 2.53.0