From nobody Wed Jun 17 06:02:50 2026 Received: from mail-wr1-f49.google.com (mail-wr1-f49.google.com [209.85.221.49]) (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 88B3033B6FB for ; Thu, 23 Apr 2026 08:27:30 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.49 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776932852; cv=none; b=C3LJD3uCfXSFwp61vcyz75tb7Ky02TJ2TQlecQ72pzMwT8prL7O92lcIHNmROSyMwVMv3OvkJhR/iNpwlwb1xYc+9O0y03uib5eIj4cYRT1olCHHI9pSe2T5Hiu01xy1NLgP7MBs0c3PIFMu/ANcLwzaTF9t7x7NHO2OyGpIWKA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776932852; c=relaxed/simple; bh=Ca8dJCyW90j7hqP0A78f/8T/XkttlZt+kLnyxO/ThgQ=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=aERJbz/jThCMe0hQZdXKjxpH9jHiquIeJdMv9ouLDDCXobieSQTl1ZxB0tuJS2BNWTfjIMhQvWl6LbSBHrAOIbIUOlhEpoJaMKh1hiDcXL5OSRFR+jXZRhhMLB7xalp/K8YGw+8IWrYqgdmrmmkDaq8iJ9B1/nJ09W0WXukIvsY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=suse.com; spf=pass smtp.mailfrom=suse.com; dkim=pass (2048-bit key) header.d=suse.com header.i=@suse.com header.b=QLPiOoE+; arc=none smtp.client-ip=209.85.221.49 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=suse.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=suse.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=suse.com header.i=@suse.com header.b="QLPiOoE+" Received: by mail-wr1-f49.google.com with SMTP id ffacd0b85a97d-43cfce3a195so3705633f8f.2 for ; Thu, 23 Apr 2026 01:27:30 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.com; s=google; t=1776932849; x=1777537649; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=dtYIyyZaWf61k5kElg2az5B4nsfuSPsBrF1eNrN0vS4=; b=QLPiOoE+Jdb90FT4A5s51AmuLynWJq/68afm0UynKo8m68XzLo/dw6DSoiTv7YZwCc VfE9R2zbZ5YmYUsHZCNCLgtkY1Ov+mc0wzteasn2tE/+C0gYW1n4ClerTUGvAMOD4YcH P4a3vuCe4zLC6iCzcf5NS1NDVxzL09KuySOh64S3uRSadrLYoHk8YdOFmVkmxLSMAdf8 cwuxsxYHVm3ZKhPfyn3c4+0tTMsVy+brDj2J9ptKbbFnTq7CmcK4SXzoX60E0fmfoo+t g1gmgWyzIroeradqzL3cc8n03hlrF+GZSn3cOJs3Rla6cvm+ollEaVcRTs8deE5ObbYo Y9TA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1776932849; x=1777537649; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=dtYIyyZaWf61k5kElg2az5B4nsfuSPsBrF1eNrN0vS4=; b=G6ArwmhjYC79IcSBzBmq1Pg6htdzt4dYLAjO9s0kbxcL5Rev58fsBFSQjx9dr1Tcht G48hYY3xFyvSAXzL7FTJo+4WtbIQ/dmXV0RXllnHRGIZhaJuMA4Tvd7Dd5cuzGAxt8v/ ZRocWZH6HcHZ0V2/tUkDjGXGUMES8kbEkNb1i22Tmm+6mBxwfSLyJrWiZtgx80oWSGxv iC2H45wvZSer3rZXuZ2gcB0s9eRBlOtu4O25TKvIP3kMDF6bLHdxAX12aLU8hECutTf3 tX59DKTEeL7KBz+rbX1xf1Iww60Ha3zY3EO+jlw4g2D9PgHjQZSFoO7nPGC/F7P+Al5Z poDQ== X-Forwarded-Encrypted: i=1; AFNElJ/JsbEIRan+4TPqIFszYtN3QOSVDuCGuqC9awa75LZXc3ojmhEs+JSbpbinY0aL1yiGfJGVGSWheY95+4o=@vger.kernel.org X-Gm-Message-State: AOJu0Yx8b2gw3mGI12rI9iUz7GDq7ZvLxseTlEDodzJBAtlLbHe4+2h1 L6xiGrsrTlMwFz+6yq6McZtOnx3KYFOGewtijleUVFhDH3hAQlv1k6t3dG872ebU6FQ= X-Gm-Gg: AeBDietuaROknpPQDD4J2hw+Pz0dXv5q/80i1fINFXBjcSksWtpQqDcVuLM3dWMDJFA GbxjNDUEJkxMj+C8ldXg+HEVwW2/8oyZDFDI8NJO7QdtQ8IvlM8iSEi/R9A8/qNOcbeGVI/bwHl S2tH9Zv6wUdhBFxL65VHFJJGhIGjqBo9z+XMM36ljDvBOOkjzzvS7sTghA+XMZTDG7sw48IgfB0 BhQrxtuz2s17EPRnWsAq41cKbBX30m1iFb5cRUnNfuTLoz0UqZ7jbouR/6BAyud/DMIq1puUB/j +0Fd6VZpxBi6PvhLDBZQGgOTl+k/vIXhr+JJwk4XEca5b1djw8nfmu3Z9XFBKlbYEWrbl5SvLcv wLuiHwnBJu1j9ZQI+9X6AAF92zcrzJ4h+16YbuaN2G331EfPHt9kx6b28Ia+MMJFbEg0WknQ79e ZDE4wNFfBbyZsD4tNDQXwpbgWHuFVLSTruAqqwWJq+QbeslXg1Rnc/+sr2Hp5Joj7hWbXkUEAsp fa2KJY= X-Received: by 2002:a5d:5d13:0:b0:43f:e990:2f5d with SMTP id ffacd0b85a97d-43fe9902f8dmr34420482f8f.35.1776932848874; Thu, 23 Apr 2026 01:27:28 -0700 (PDT) Received: from localhost (host-79-33-140-232.retail.telecomitalia.it. [79.33.140.232]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-43fe4e3a174sm56836569f8f.18.2026.04.23.01.27.28 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 23 Apr 2026 01:27:28 -0700 (PDT) From: Andrea della Porta To: =?UTF-8?q?Uwe=20Kleine-K=C3=B6nig?= , linux-pwm@vger.kernel.org, Rob Herring , Krzysztof Kozlowski , Conor Dooley , Florian Fainelli , Broadcom internal kernel review list , Andrea della Porta , devicetree@vger.kernel.org, linux-rpi-kernel@lists.infradead.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Naushir Patuck , Stanimir Varbanov , mbrugger@suse.com Cc: Krzysztof Kozlowski Subject: [PATCH v3 1/3] dt-bindings: pwm: Add Raspberry Pi RP1 PWM controller Date: Thu, 23 Apr 2026 10:30:19 +0200 Message-ID: X-Mailer: git-send-email 2.51.0 In-Reply-To: References: 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" From: Naushir Patuck Add the devicetree binding documentation for the PWM controller found in the Raspberry Pi RP1 chipset. Signed-off-by: Naushir Patuck Co-developed-by: Stanimir Varbanov Signed-off-by: Stanimir Varbanov Signed-off-by: Andrea della Porta Reviewed-by: Krzysztof Kozlowski --- .../bindings/pwm/raspberrypi,rp1-pwm.yaml | 54 +++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 Documentation/devicetree/bindings/pwm/raspberrypi,rp1-p= wm.yaml diff --git a/Documentation/devicetree/bindings/pwm/raspberrypi,rp1-pwm.yaml= b/Documentation/devicetree/bindings/pwm/raspberrypi,rp1-pwm.yaml new file mode 100644 index 0000000000000..6f8461d0454f7 --- /dev/null +++ b/Documentation/devicetree/bindings/pwm/raspberrypi,rp1-pwm.yaml @@ -0,0 +1,54 @@ +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/pwm/raspberrypi,rp1-pwm.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Raspberry Pi RP1 PWM controller + +maintainers: + - Naushir Patuck + +allOf: + - $ref: pwm.yaml# + +description: | + The PWM peripheral is a flexible waveform generator with a + variety of operational modes. It has the following features: + - four independent output channels + - 32-bit counter widths + - Seven output generation modes + - Optional per-channel output inversion + - Optional duty-cycle data FIFO with DMA support + - Optional sigma-delta noise shaping engine + Serves as a fan speed provider to other nodes for a PWM-connected + fan using shared registers (syscon). + +properties: + compatible: + const: raspberrypi,rp1-pwm + + reg: + maxItems: 1 + + clocks: + maxItems: 1 + + "#pwm-cells": + const: 3 + +required: + - compatible + - reg + - clocks + +unevaluatedProperties: false + +examples: + - | + pwm@98000 { + compatible =3D "raspberrypi,rp1-pwm"; + reg =3D <0x98000 0x100>; + clocks =3D <&rp1_clocks 17>; + #pwm-cells =3D <3>; + }; --=20 2.35.3 From nobody Wed Jun 17 06:02:50 2026 Received: from mail-wm1-f48.google.com (mail-wm1-f48.google.com [209.85.128.48]) (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 DB2B237F8DC for ; Thu, 23 Apr 2026 08:27:31 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.48 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776932857; cv=none; b=km1qRC/8LDi9N2a+9pl3xooIGRe1IBUhMBhHTgVph9Z4BTjmk0AikXlYD4a9I0+XJ1/XJxkGqWtDegJpuFtFVgqR1xkMPSAyRHnLq6diBROoRawhlRGAAFXuEVgmVq+4ZtEBU+DV3ii2683B8ytWmNNovh/kbn1IWa6y50qS0Ss= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776932857; c=relaxed/simple; bh=dQQSW7BLJ1Fekwuai6OMg+wWXVtPkZuzfiSgoyBjNJU=; h=From:To:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=NxM6bof9quYX7fPt7+oyUXIVeIsbz3wyOsRyKcxenTZO+a6UuPsuKKt4Rr3zwXCr8fbPnWOx4V4un4Yd4DRzZtR+PtFDOEU7n0XLqjmKmelQvNTeSLhCOJCcIMVtqFlhvNSfeXBCjnLmPQp1YslCFqUskqXWNfjjNmgn9w9LGXE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=suse.com; spf=pass smtp.mailfrom=suse.com; dkim=pass (2048-bit key) header.d=suse.com header.i=@suse.com header.b=G4b6aTov; arc=none smtp.client-ip=209.85.128.48 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=suse.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=suse.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=suse.com header.i=@suse.com header.b="G4b6aTov" Received: by mail-wm1-f48.google.com with SMTP id 5b1f17b1804b1-488d2079582so74482865e9.2 for ; Thu, 23 Apr 2026 01:27:31 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.com; s=google; t=1776932850; x=1777537650; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:from:to:cc:subject:date:message-id :reply-to; bh=j/r+sxkDGMGerd40rxwnYytW5e5CyayQAfIXup8Qqkg=; b=G4b6aTovlufYwUAw2J2WT01Xm5NVqrf3Fb30YMSzmhhLiqid0yZtvzAYq8cffnriWP tWVhnoJQTPcOn+CvHOrhEtJ/jBEo4bNVrSBlJnS8DNhhwBy4inXRFiWK7LuU/LJUrh4O 3YgGu/IgcWFaXLBfa6EJYl+ZCYk0mAP/YA6D2YmN5KZ5xOgDHmhaeEsOuZc3JP+rrMo8 zX4h6At9aM96Ol/DUYsGDyTKc/GGOTrG37mYR+nsbDR1gOQdF+bZFE73YAyxffSndHdl IlyHh4o3KhGi5VHa+kyAKg+fa02f/fl/CE9qUc6hXFZJKWF5COnjWZ5BU21zcPasvGtA Tddw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1776932850; x=1777537650; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=j/r+sxkDGMGerd40rxwnYytW5e5CyayQAfIXup8Qqkg=; b=jv52VpKDzl8+XD7YOW9/ZcaGxJdJ+hAUSpedYze7faqj5I8ekshtamUk67eEUBK5uA E3Dz9t1MevUWaBJe+lyBwjHBdWaiRtXnfaJGzFgE7/jD0EXuUtJ5sNDHfr5ztJC5AxmE p8adyEPs85nyDI7+Mg4U/iVEpRFM7hpbELe6c4LeColjfZao1tUc9Zk6p6YFXblMUCld dHzj9o0MBKOF2JKqNgSVE2L6qtq+PKboFX6NnRODohJPaKoiCihDdZpGOBGlGDEq4B7C mFv2b+pDD1BGsF4E+a1J3FdFBGPA1rn2Y6S5FGJsIEoVPrHh+cFxPXyXqqGs+vw89Ewd izUw== X-Forwarded-Encrypted: i=1; AFNElJ+v7RrEl0gz4t4xqnxnamlzKH8j38AhBxWMVI4DIpBoCmO47WVgkXy3mEyA9elp1L/Xeu8LLABhT263r7Y=@vger.kernel.org X-Gm-Message-State: AOJu0YzSJK1X2Uzq+iwEd2Yw0JHUoIkzeOSKFcbJ/qjcVT79Y7V/hc4o v3Oq/RMtjFrmrKPsEv6xNoToNx5Egq+l6eMFBolskK72SXn+ZvuIi1qsAa5n1+Q2Ec0= X-Gm-Gg: AeBDieulWKXSeL1kG+dGDy+iRJC1EIBdOudaltxvCj76WbT03WWSivRpY5BndV9EuIu CY3JQfmgORzqIHanHRmyKp6PFFZVGf29Gs6/mmQhE0B1HLwEz+jqpH3RqFbYnHKhkBSoHzN/rEU EfcZCBPkzKk6GO3nAGn6OW/tXq7WCnZeLZGerrgsBpZFPB5YLwwRK79uWNpP48GJhfy5UElyToF GUAkOaR/cEhxhGiGOSd96LdsDymol2Guwvw2jdpaEc2tWKZABM8u/zI2xZm5xGo9rvXLOs+nsug 5VcfB4zrgaGkzlwcvMfGXe92r6xYUxPMMkgRHa1nu5n2kdPdMjCH95uWHIvt8o1w+6xqXoRvRPt QxuxEl3JbR0KZBGWds9/lAI8GULAMn1o9CCSvw9+EfgdH9zWKCf2RBuc9NCfk6cbIoyET8nYECo wOJxIYBKHtcGP0djccl9itnXGpErByCrw41U3ePGBREKDsbZgnlXKapY0URCUosdtkrdDBDDLNY XcYurU= X-Received: by 2002:a05:600c:64c7:b0:488:a2ac:a334 with SMTP id 5b1f17b1804b1-488fb73aa3bmr388775135e9.3.1776932850256; Thu, 23 Apr 2026 01:27:30 -0700 (PDT) Received: from localhost (host-79-33-140-232.retail.telecomitalia.it. [79.33.140.232]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-48a55b8baaesm280918355e9.10.2026.04.23.01.27.29 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 23 Apr 2026 01:27:29 -0700 (PDT) From: Andrea della Porta To: =?UTF-8?q?Uwe=20Kleine-K=C3=B6nig?= , linux-pwm@vger.kernel.org, Rob Herring , Krzysztof Kozlowski , Conor Dooley , Florian Fainelli , Broadcom internal kernel review list , Andrea della Porta , devicetree@vger.kernel.org, linux-rpi-kernel@lists.infradead.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Naushir Patuck , Stanimir Varbanov , mbrugger@suse.com Subject: [PATCH v3 2/3] pwm: rp1: Add RP1 PWM controller driver Date: Thu, 23 Apr 2026 10:30:20 +0200 Message-ID: X-Mailer: git-send-email 2.51.0 In-Reply-To: References: Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable From: Naushir Patuck The Raspberry Pi RP1 southbridge features an embedded PWM controller with 4 output channels, alongside an RPM interface to read the fan speed on the Raspberry Pi 5. Add the supporting driver. Signed-off-by: Naushir Patuck Co-developed-by: Stanimir Varbanov Signed-off-by: Stanimir Varbanov Signed-off-by: Andrea della Porta --- drivers/pwm/Kconfig | 9 + drivers/pwm/Makefile | 1 + drivers/pwm/pwm-rp1.c | 414 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 424 insertions(+) create mode 100644 drivers/pwm/pwm-rp1.c diff --git a/drivers/pwm/Kconfig b/drivers/pwm/Kconfig index 6f3147518376a..32031f2af75af 100644 --- a/drivers/pwm/Kconfig +++ b/drivers/pwm/Kconfig @@ -625,6 +625,15 @@ config PWM_ROCKCHIP Generic PWM framework driver for the PWM controller found on Rockchip SoCs. =20 +config PWM_RASPBERRYPI_RP1 + bool "RP1 PWM support" + depends on MISC_RP1 || COMPILE_TEST + depends on HAS_IOMEM + select REGMAP_MMIO + select MFD_SYSCON + help + PWM framework driver for Raspberry Pi RP1 controller. + config PWM_SAMSUNG tristate "Samsung PWM support" depends on PLAT_SAMSUNG || ARCH_S5PV210 || ARCH_EXYNOS || COMPILE_TEST diff --git a/drivers/pwm/Makefile b/drivers/pwm/Makefile index 0dc0d2b69025d..59f29f60f9123 100644 --- a/drivers/pwm/Makefile +++ b/drivers/pwm/Makefile @@ -56,6 +56,7 @@ obj-$(CONFIG_PWM_RENESAS_RZG2L_GPT) +=3D pwm-rzg2l-gpt.o obj-$(CONFIG_PWM_RENESAS_RZ_MTU3) +=3D pwm-rz-mtu3.o obj-$(CONFIG_PWM_RENESAS_TPU) +=3D pwm-renesas-tpu.o obj-$(CONFIG_PWM_ROCKCHIP) +=3D pwm-rockchip.o +obj-$(CONFIG_PWM_RASPBERRYPI_RP1) +=3D pwm-rp1.o obj-$(CONFIG_PWM_SAMSUNG) +=3D pwm-samsung.o obj-$(CONFIG_PWM_SIFIVE) +=3D pwm-sifive.o obj-$(CONFIG_PWM_SL28CPLD) +=3D pwm-sl28cpld.o diff --git a/drivers/pwm/pwm-rp1.c b/drivers/pwm/pwm-rp1.c new file mode 100644 index 0000000000000..15087917a18e9 --- /dev/null +++ b/drivers/pwm/pwm-rp1.c @@ -0,0 +1,414 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * pwm-rp1.c + * + * Raspberry Pi RP1 PWM. + * + * Copyright =C2=A9 2026 Raspberry Pi Ltd. + * + * Author: Naushir Patuck (naush@raspberrypi.com) + * + * Based on the pwm-bcm2835 driver by: + * Bart Tanghe + * + * Datasheet: https://pip-assets.raspberrypi.com/categories/892-raspberry-= pi-5/documents/RP-008370-DS-1-rp1-peripherals.pdf?disposition=3Dinline + * + * Limitations: + * - Channels can be enabled/disabled through a global update flag, while = the + * period and duty per-channel registers are independently updatable, and + * they are latched on the end of (specific channel) period strobe. + * This means that period and duty changes might result in glitches if t= he + * period/duty is changed exactly during an end of period strobe. + * - Since the duty/period registers are freely updatable (do not depend on + * the global update flag), setting one of them close to the period end = and + * the other right afterwards results in a mixed output for that cycle b= ecause + * the write ops are not atomic. + * - The global update flag prevents mis-sampling of multi-bit bus signals= in + * the PWM clock domain. This ensures that all PWM channel settings upda= te + * on the same PWM clock cycle. Channels start in sync only if they shar= e the + * same period. + * - If both duty and period are set to 0, the output is a constant low si= gnal + * if polarity is normal or a constant high signal if polarity is invers= ed. + * - When disabled the output is driven to 0 if polarity is normal, or to 1 + * if polarity is inversed. + * - Disabling the PWM stops the output immediately, without waiting for c= urrent + * period to complete first. + * - Channels are phase-capable, but on RPi5, the firmware can use a chann= el + * phase register to report the RPM of the fan connected to that PWM + * channel. As a result, phase control will be ignored for now. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define RP1_PWM_GLB_CTRL 0x000 +#define RP1_PWM_GLB_CTRL_CHANNEL_ENABLE(chan) BIT(chan) +#define RP1_PWM_GLB_CTRL_SET_UPDATE BIT(31) + +#define RP1_PWM_CHAN_CTRL(chan) (0x014 + ((chan) * 0x10)) +#define RP1_PWM_CHAN_CTRL_POLARITY BIT(3) +#define RP1_PWM_CHAN_CTRL_FIFO_POP_MASK BIT(8) +#define RP1_PWM_CHAN_CTRL_MODE GENMASK(2, 0) +enum rp1_pwm_ctrl_mode { + RP1_PWM_CHAN_CTRL_MODE_ZERO, + RP1_PWM_CHAN_CTRL_MODE_TE_MS, + RP1_PWM_CHAN_CTRL_MODE_PC_MS, + RP1_PWM_CHAN_CTRL_MODE_PD_ENC, + RP1_PWM_CHAN_CTRL_MODE_MSB_SER, + RP1_PWM_CHAN_CTRL_MODE_PPM, + RP1_PWM_CHAN_CTRL_MODE_LE_MS, + RP1_PWM_CHAN_CTRL_MODE_LSB_SER, +}; + +#define RP1_PWM_CHAN_CTRL_DEFAULT (RP1_PWM_CHAN_CTRL_FIFO_POP_MASK + \ + FIELD_PREP(RP1_PWM_CHAN_CTRL_MODE, \ + RP1_PWM_CHAN_CTRL_MODE_TE_MS)) + +#define RP1_PWM_RANGE(chan) (0x018 + ((chan) * 0x10)) +#define RP1_PWM_PHASE(chan) (0x01C + ((chan) * 0x10)) +#define RP1_PWM_DUTY(chan) (0x020 + ((chan) * 0x10)) + +#define RP1_PWM_NUM_PWMS 4 + +struct rp1_pwm { + struct regmap *regmap; + struct clk *clk; + unsigned long clk_rate; + bool clk_enabled; +}; + +struct rp1_pwm_waveform { + u32 period_ticks; + u32 duty_ticks; + bool enabled; + bool inverted_polarity; +}; + +static const struct regmap_config rp1_pwm_regmap_config =3D { + .reg_bits =3D 32, + .val_bits =3D 32, + .reg_stride =3D 4, + .max_register =3D 0x60, +}; + +static void rp1_pwm_apply_config(struct pwm_chip *chip, struct pwm_device = *pwm) +{ + struct rp1_pwm *rp1 =3D pwmchip_get_drvdata(chip); + u32 value; + + /* update the changed registers on the next strobe to avoid glitches */ + regmap_read(rp1->regmap, RP1_PWM_GLB_CTRL, &value); + value |=3D RP1_PWM_GLB_CTRL_SET_UPDATE; + regmap_write(rp1->regmap, RP1_PWM_GLB_CTRL, value); +} + +static int rp1_pwm_request(struct pwm_chip *chip, struct pwm_device *pwm) +{ + struct rp1_pwm *rp1 =3D pwmchip_get_drvdata(chip); + + /* init channel to reset defaults */ + regmap_write(rp1->regmap, RP1_PWM_CHAN_CTRL(pwm->hwpwm), RP1_PWM_CHAN_CTR= L_DEFAULT); + return 0; +} + +static int rp1_pwm_round_waveform_tohw(struct pwm_chip *chip, + struct pwm_device *pwm, + const struct pwm_waveform *wf, + void *_wfhw) +{ + struct rp1_pwm *rp1 =3D pwmchip_get_drvdata(chip); + u64 period_ticks, duty_ticks, offset_ticks; + struct rp1_pwm_waveform *wfhw =3D _wfhw; + u64 clk_rate =3D rp1->clk_rate; + int ret =3D 0; + + if (!wf->period_length_ns) { + wfhw->enabled =3D false; + return 0; + } + + period_ticks =3D mul_u64_u64_div_u64(wf->period_length_ns, clk_rate, NSEC= _PER_SEC); + + /* + * The period is limited to U32_MAX - 1 + * to allow 100% duty cycle. + */ + if (period_ticks > U32_MAX) { + period_ticks =3D U32_MAX - 1; + } else if (!period_ticks) { + period_ticks =3D 2; + ret =3D 1; + } + + duty_ticks =3D mul_u64_u64_div_u64(wf->duty_length_ns, clk_rate, NSEC_PER= _SEC); + offset_ticks =3D mul_u64_u64_div_u64(wf->duty_offset_ns, clk_rate, NSEC_P= ER_SEC); + if (duty_ticks && offset_ticks && + duty_ticks + offset_ticks >=3D period_ticks) { + wfhw->duty_ticks =3D period_ticks - duty_ticks; + wfhw->inverted_polarity =3D true; + } else { + wfhw->duty_ticks =3D duty_ticks; + wfhw->inverted_polarity =3D false; + } + /* Account for the extra tick at the end of the period */ + wfhw->period_ticks =3D period_ticks - 1; + + wfhw->enabled =3D true; + + return ret; +} + +static int rp1_pwm_round_waveform_fromhw(struct pwm_chip *chip, + struct pwm_device *pwm, + const void *_wfhw, + struct pwm_waveform *wf) +{ + struct rp1_pwm *rp1 =3D pwmchip_get_drvdata(chip); + const struct rp1_pwm_waveform *wfhw =3D _wfhw; + u64 clk_rate =3D rp1->clk_rate; + u32 ticks; + + *wf =3D (struct pwm_waveform){ }; + + if (!wfhw->enabled) + return 0; + + wf->period_length_ns =3D DIV_ROUND_UP_ULL((u64)(wfhw->period_ticks + 1) *= NSEC_PER_SEC, + clk_rate); + + if (!wfhw->inverted_polarity) { + wf->duty_length_ns =3D DIV_ROUND_UP_ULL((u64)wfhw->duty_ticks * NSEC_PER= _SEC, + clk_rate); + } else { + ticks =3D wfhw->period_ticks + 1 - wfhw->duty_ticks; + wf->duty_length_ns =3D DIV_ROUND_UP_ULL((u64)ticks * NSEC_PER_SEC, clk_r= ate); + wf->duty_offset_ns =3D wf->period_length_ns - wf->duty_length_ns; + } + + return 0; +} + +static int rp1_pwm_write_waveform(struct pwm_chip *chip, + struct pwm_device *pwm, + const void *_wfhw) +{ + struct rp1_pwm *rp1 =3D pwmchip_get_drvdata(chip); + const struct rp1_pwm_waveform *wfhw =3D _wfhw; + u32 value, ctrl; + + /* early exit if disabled */ + regmap_read(rp1->regmap, RP1_PWM_GLB_CTRL, &ctrl); + if (!wfhw->enabled) { + ctrl &=3D ~RP1_PWM_GLB_CTRL_CHANNEL_ENABLE(pwm->hwpwm); + goto exit_disable; + } + + /* set period and duty cycle */ + regmap_write(rp1->regmap, + RP1_PWM_RANGE(pwm->hwpwm), wfhw->period_ticks); + regmap_write(rp1->regmap, + RP1_PWM_DUTY(pwm->hwpwm), wfhw->duty_ticks); + + /* set polarity */ + regmap_read(rp1->regmap, RP1_PWM_CHAN_CTRL(pwm->hwpwm), &value); + if (!wfhw->inverted_polarity) + value &=3D ~RP1_PWM_CHAN_CTRL_POLARITY; + else + value |=3D RP1_PWM_CHAN_CTRL_POLARITY; + regmap_write(rp1->regmap, RP1_PWM_CHAN_CTRL(pwm->hwpwm), value); + + /* enable the channel */ + ctrl |=3D RP1_PWM_GLB_CTRL_CHANNEL_ENABLE(pwm->hwpwm); +exit_disable: + regmap_write(rp1->regmap, RP1_PWM_GLB_CTRL, ctrl); + + rp1_pwm_apply_config(chip, pwm); + + return 0; +} + +static int rp1_pwm_read_waveform(struct pwm_chip *chip, + struct pwm_device *pwm, + void *_wfhw) +{ + struct rp1_pwm *rp1 =3D pwmchip_get_drvdata(chip); + struct rp1_pwm_waveform *wfhw =3D _wfhw; + u32 value; + + regmap_read(rp1->regmap, RP1_PWM_GLB_CTRL, &value); + wfhw->enabled =3D !!(value & RP1_PWM_GLB_CTRL_CHANNEL_ENABLE(pwm->hwpwm)); + + regmap_read(rp1->regmap, RP1_PWM_CHAN_CTRL(pwm->hwpwm), &value); + wfhw->inverted_polarity =3D !!(value & RP1_PWM_CHAN_CTRL_POLARITY); + + if (wfhw->enabled) { + regmap_read(rp1->regmap, RP1_PWM_RANGE(pwm->hwpwm), &wfhw->period_ticks); + regmap_read(rp1->regmap, RP1_PWM_DUTY(pwm->hwpwm), &wfhw->duty_ticks); + } else { + wfhw->period_ticks =3D 0; + wfhw->duty_ticks =3D 0; + } + + return 0; +} + +static const struct pwm_ops rp1_pwm_ops =3D { + .sizeof_wfhw =3D sizeof(struct rp1_pwm_waveform), + .request =3D rp1_pwm_request, + .round_waveform_tohw =3D rp1_pwm_round_waveform_tohw, + .round_waveform_fromhw =3D rp1_pwm_round_waveform_fromhw, + .read_waveform =3D rp1_pwm_read_waveform, + .write_waveform =3D rp1_pwm_write_waveform, +}; + +static int rp1_pwm_probe(struct platform_device *pdev) +{ + struct device *dev =3D &pdev->dev; + struct device_node *np =3D dev->of_node; + unsigned long clk_rate; + struct pwm_chip *chip; + void __iomem *base; + struct rp1_pwm *rp1; + int ret; + + chip =3D devm_pwmchip_alloc(dev, RP1_PWM_NUM_PWMS, sizeof(*rp1)); + if (IS_ERR(chip)) + return PTR_ERR(chip); + + rp1 =3D pwmchip_get_drvdata(chip); + + base =3D devm_platform_ioremap_resource(pdev, 0); + if (IS_ERR(base)) + return PTR_ERR(base); + + rp1->regmap =3D devm_regmap_init_mmio(dev, base, &rp1_pwm_regmap_config); + if (IS_ERR(rp1->regmap)) + return dev_err_probe(dev, PTR_ERR(rp1->regmap), "Cannot initialize regma= p\n"); + + ret =3D of_syscon_register_regmap(np, rp1->regmap); + if (ret) + return dev_err_probe(dev, ret, "Failed to register syscon\n"); + + rp1->clk =3D devm_clk_get(dev, NULL); + if (IS_ERR(rp1->clk)) + return dev_err_probe(dev, PTR_ERR(rp1->clk), "Clock not found\n"); + + ret =3D clk_prepare_enable(rp1->clk); + if (ret) + return dev_err_probe(dev, ret, "Failed to enable clock\n"); + rp1->clk_enabled =3D true; + + ret =3D devm_clk_rate_exclusive_get(dev, rp1->clk); + if (ret) { + dev_err_probe(dev, ret, "Failed to get exclusive rate\n"); + goto err_disable_clk; + } + + clk_rate =3D clk_get_rate(rp1->clk); + if (!clk_rate) { + ret =3D dev_err_probe(dev, -EINVAL, "Failed to get clock rate\n"); + goto err_disable_clk; + } + /* + * To prevent u64 overflow in period calculations: + * mul_u64_u64_div_u64(period_ns, clk_rate, NSEC_PER_SEC) + * If clk_rate > 1 GHz, the result can overflow. + */ + if (clk_rate > HZ_PER_GHZ) { + ret =3D dev_err_probe(dev, -EINVAL, "Clock rate > 1 GHz is not supported= \n"); + goto err_disable_clk; + } + rp1->clk_rate =3D clk_rate; + + chip->ops =3D &rp1_pwm_ops; + + platform_set_drvdata(pdev, chip); + + ret =3D pwmchip_add(chip); + if (ret) { + dev_err_probe(dev, ret, "Failed to register PWM chip\n"); + goto err_disable_clk; + } + + return 0; + +err_disable_clk: + clk_disable_unprepare(rp1->clk); + + return ret; +} + +static void rp1_pwm_remove(struct platform_device *pdev) +{ + struct pwm_chip *chip =3D platform_get_drvdata(pdev); + struct rp1_pwm *rp1 =3D pwmchip_get_drvdata(chip); + + pwmchip_remove(chip); + + if (rp1->clk_enabled) { + clk_disable_unprepare(rp1->clk); + rp1->clk_enabled =3D false; + } +} + +static int rp1_pwm_suspend(struct device *dev) +{ + struct rp1_pwm *rp1 =3D dev_get_drvdata(dev); + + if (rp1->clk_enabled) { + clk_disable_unprepare(rp1->clk); + rp1->clk_enabled =3D false; + } + + return 0; +} + +static int rp1_pwm_resume(struct device *dev) +{ + struct rp1_pwm *rp1 =3D dev_get_drvdata(dev); + int ret; + + ret =3D clk_prepare_enable(rp1->clk); + if (ret) { + dev_err(dev, "Failed to enable clock on resume: %pe\n", ERR_PTR(ret)); + return ret; + } + + rp1->clk_enabled =3D true; + + return 0; +} + +static DEFINE_SIMPLE_DEV_PM_OPS(rp1_pwm_pm_ops, rp1_pwm_suspend, rp1_pwm_r= esume); + +static const struct of_device_id rp1_pwm_of_match[] =3D { + { .compatible =3D "raspberrypi,rp1-pwm" }, + { /* sentinel */ } +}; +MODULE_DEVICE_TABLE(of, rp1_pwm_of_match); + +static struct platform_driver rp1_pwm_driver =3D { + .probe =3D rp1_pwm_probe, + .remove =3D rp1_pwm_remove, + .driver =3D { + .name =3D "rp1-pwm", + .of_match_table =3D rp1_pwm_of_match, + .pm =3D pm_ptr(&rp1_pwm_pm_ops), + .suppress_bind_attrs =3D true, + }, +}; +module_platform_driver(rp1_pwm_driver); + +MODULE_DESCRIPTION("RP1 PWM driver"); +MODULE_AUTHOR("Naushir Patuck "); +MODULE_AUTHOR("Andrea della Porta "); +MODULE_LICENSE("GPL"); --=20 2.35.3 From nobody Wed Jun 17 06:02:50 2026 Received: from mail-wm1-f45.google.com (mail-wm1-f45.google.com [209.85.128.45]) (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 D993C3C4575 for ; Thu, 23 Apr 2026 08:27:32 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.45 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776932866; cv=none; b=i2vhW5azyATSErr3Hr+CU+QjqGmc3eLKQJAB079iBi6C2MJQmfCXf0UNJPCQZsvs2OK+9tIEEpFIZMvZAgJS7Yr3tJerTPFHCuhFUc1iVMG4TEIW/6UnwrNHo5W2r5jiRXZ7Hafm3x5149AnkBRRLKP3st4VXjgdEe+ZeHIc8aU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776932866; c=relaxed/simple; bh=fLM8M+exZKgQsFh5tdcGS1DmZreTyFRyr9bIXtCcplM=; h=From:To:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=X31hNG1+5KYgf5cME5jHprQJjEFAZnlCFtfmbvNuZmdDuNqRjqJ/OI3l+z2fydmaewj9SaIAugk6PNKdEI3UInWi7WzXdaCtIAY8sqDoV/KYzL5G9ynRCjWO0EYvzpEetrncKqfxeSpp+eURtvwPML1OGGJ4OxFa5q72GF8GF8g= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=suse.com; spf=pass smtp.mailfrom=suse.com; dkim=pass (2048-bit key) header.d=suse.com header.i=@suse.com header.b=HN4D0qJU; arc=none smtp.client-ip=209.85.128.45 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=suse.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=suse.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=suse.com header.i=@suse.com header.b="HN4D0qJU" Received: by mail-wm1-f45.google.com with SMTP id 5b1f17b1804b1-48a3e9862f0so28167215e9.1 for ; Thu, 23 Apr 2026 01:27:32 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.com; s=google; t=1776932851; x=1777537651; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:from:to:cc:subject:date:message-id :reply-to; bh=aUTaySjIgh6lfu9rWtVOEFr4avLmeO2LROURou8Y2uw=; b=HN4D0qJU1Vo2fsFKl+MMANnkIQ5Vs6TvZ2d7/BIT62H/KdDKJvulgIr6mhxvb41zDS 34rMZSnpPeBtVd76tkJAgsBD2banAvk/WkGAfBsfVGMwqitwQkgkMrCEbiG13IPzd333 MqQQ7XVwlQV5U93qSFrA/YQBdEsIY2FxfhnkrzcCQBpm1Er6J7sdgV5DClR+L6zRuqUc KIWtxNfMGfFs0NyeT32kL9Q1xsokneVUm4N8qqjTBNCNSV07Ass/CmXsTN0HlrPu8cKX AsofUdXPdoeBlBHVbY9Rpc1ISG/UxDYSA2fINgqQ8UmZVmsX51Mqh7HEm3fsWbqbOEaZ /kxQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1776932851; x=1777537651; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=aUTaySjIgh6lfu9rWtVOEFr4avLmeO2LROURou8Y2uw=; b=Hk5igKeLPpJxw0ISQb3cpYIEWg8TQ4q+6GqUgzsXmd5m5xEyUA9PpZeCkvCI9OEdT2 7EqqTBmg3aKwIZ012Pw66LhDqEEptPBPUi/yvsZwfUHM1KQtJkRJU3BOZrz+QSchStR4 oibVJ53B7SnDU72/V9JXOYo2AEriAHIXzzikAEv3nuInlxM4EXN2Pnv4t9jGSXJVvHnj OavR8DccTzU/1SAh9CJOzfjoYhL3FkIqz03WkmQ8WTPTDhiqv3stN+Nfd5c6YMauz/FU /eS6GJYQShsDT1iOylVxT+9aNb9EDudBUfYCF+9TOfj2drfvpnQInX5IZlG/D2wLNq4x lNCA== X-Forwarded-Encrypted: i=1; AFNElJ8YqhSMqRwWtYhKqIkO+rgIvAalNEEJtu6ebedfeWMluAgQgMp5Tj9SIZaszNYZuz0Sjj4u3JU/wkyud5Y=@vger.kernel.org X-Gm-Message-State: AOJu0YzurxzWYg0lC0Ogyhp6bYmr3aOIkqQyAwcWxkvDVYTfwpWnHu6c wNqA6fDCigjKnXd3v9wmRM8mlJxqknDQqZgoDN2fQz6zhOUwUQueAfhPD81ppTvjtqA= X-Gm-Gg: AeBDiev3TzRoHsJQnZMIN2t9JqNvILZoGhj8O+FLJjyatvcMdfjPsxQLVL35JMph1ok pJtqrR+Rg8MvC/nlhQkJFm00FAc8VoCwd0DaxlP5WDdm5WZl4UgtFv3jM9tE7JDRmZTdCJpfF63 awBCLBL0O5NKDLUP07wFYo6KktmgD07xEGJzjOM6i62WZcbqxoO53BirIG6fvHyjHxMmTx58JVh oH8Hli/v/57OcrI+Rknb4H3v7Hy9tmQZM9iLA8lY7gyQwl5tvJih0Sw6booR/30tA8vv2qRMqX0 ddQlWdXxlebavOQNTBd0LnyVrNHNc+KsCyLrQ1I0Me1Ri/fJlp6XullwNVRvVslV09sAwxCFzaA 9LGEb7hcMfWhkBvW7mg5F5K8opmjasogmPtvPEZejY41N7JRPzbeDbDiuonUSSgGCT+gEhHoolC wCuzh/bYOtSswMzppcf9c9/mybI39TGHEKY3pCVDvcw/t6Cc/3V4xKO87kq1+ej9+HypyrwZ7km po42rw= X-Received: by 2002:a05:600c:691:b0:488:9ec1:4976 with SMTP id 5b1f17b1804b1-488fb88b81emr223263245e9.8.1776932851294; Thu, 23 Apr 2026 01:27:31 -0700 (PDT) Received: from localhost (host-79-33-140-232.retail.telecomitalia.it. [79.33.140.232]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-43fe4cb135asm55901924f8f.6.2026.04.23.01.27.30 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 23 Apr 2026 01:27:31 -0700 (PDT) From: Andrea della Porta To: =?UTF-8?q?Uwe=20Kleine-K=C3=B6nig?= , linux-pwm@vger.kernel.org, Rob Herring , Krzysztof Kozlowski , Conor Dooley , Florian Fainelli , Broadcom internal kernel review list , Andrea della Porta , devicetree@vger.kernel.org, linux-rpi-kernel@lists.infradead.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Naushir Patuck , Stanimir Varbanov , mbrugger@suse.com Subject: [PATCH v3 3/3] arm64: dts: broadcom: rpi-5: Add RP1 PWM node Date: Thu, 23 Apr 2026 10:30:21 +0200 Message-ID: X-Mailer: git-send-email 2.51.0 In-Reply-To: References: 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" From: Stanimir Varbanov The RP1 chipset used on the Raspberry Pi 5 features an integrated PWM controller to drive the cooling fan. Add the corresponding DT node for this PWM controller. Signed-off-by: Stanimir Varbanov Co-developed-by: Andrea della Porta Signed-off-by: Andrea della Porta --- arch/arm64/boot/dts/broadcom/bcm2712-rpi-5-b.dts | 12 ++++++++++++ arch/arm64/boot/dts/broadcom/rp1-common.dtsi | 10 ++++++++++ 2 files changed, 22 insertions(+) diff --git a/arch/arm64/boot/dts/broadcom/bcm2712-rpi-5-b.dts b/arch/arm64/= boot/dts/broadcom/bcm2712-rpi-5-b.dts index 2856082814462..a4e5ba23bf536 100644 --- a/arch/arm64/boot/dts/broadcom/bcm2712-rpi-5-b.dts +++ b/arch/arm64/boot/dts/broadcom/bcm2712-rpi-5-b.dts @@ -64,12 +64,24 @@ phy1: ethernet-phy@1 { }; =20 &rp1_gpio { + fan_pwm_default_state: fan-pwm-default-state { + function =3D "pwm1"; + pins =3D "gpio45"; + bias-pull-down; + }; + usb_vbus_default_state: usb-vbus-default-state { function =3D "vbus1"; groups =3D "vbus1"; }; }; =20 +&rp1_pwm { + pinctrl-0 =3D <&fan_pwm_default_state>; + pinctrl-names =3D "default"; + status =3D "okay"; +}; + &rp1_usb0 { pinctrl-0 =3D <&usb_vbus_default_state>; pinctrl-names =3D "default"; diff --git a/arch/arm64/boot/dts/broadcom/rp1-common.dtsi b/arch/arm64/boot= /dts/broadcom/rp1-common.dtsi index 5a815c3797945..d0f4d6be75500 100644 --- a/arch/arm64/boot/dts/broadcom/rp1-common.dtsi +++ b/arch/arm64/boot/dts/broadcom/rp1-common.dtsi @@ -26,6 +26,16 @@ rp1_clocks: clocks@40018000 { <200000000>; // RP1_CLK_SYS }; =20 + rp1_pwm: pwm@4009c000 { + compatible =3D "raspberrypi,rp1-pwm"; + reg =3D <0x00 0x4009c000 0x0 0x100>; + clocks =3D <&rp1_clocks RP1_CLK_PWM1>; + assigned-clocks =3D <&rp1_clocks RP1_CLK_PWM1>; + assigned-clock-rates =3D <50000000>; + #pwm-cells =3D <3>; + status =3D "disabled"; + }; + rp1_gpio: pinctrl@400d0000 { compatible =3D "raspberrypi,rp1-gpio"; reg =3D <0x00 0x400d0000 0x0 0xc000>, --=20 2.35.3