From nobody Tue Dec 2 01:27:28 2025 Received: from mail-wm1-f51.google.com (mail-wm1-f51.google.com [209.85.128.51]) (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 3872534DB4B for ; Fri, 21 Nov 2025 16:08:53 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.51 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763741337; cv=none; b=Cb/k0UtwNoWKhAauYhblBCjMIEM31S+k5G5X1JDPBThzbmdtOXfn0o2gejjVgss4IL3YQQdLy5s7zDYalj6XzJKH2AGzrtxNcI/xfj0qXrIkXb/ap/neCeM5y8xX1yVUib5Gpyxa8NBDfUFtOuQ4fwnhkkv+Kyy7tsfPsxv6Fsk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763741337; c=relaxed/simple; bh=8ZF3K5fZHfu8OJ0FjVbioizmnSP8gLtvioziN5zK+5g=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=ZRuhtOAujSZVhDAhPopTkEWU7RPElgxAcO3KsU16KZ0yioMmu3LdsWczZ8b3QvxJE3RR9lcdqgSPwxN2wHrqOygkoaYQBwYnlofj/owFE3jloIUxfufe0emV9DWcmIELNStJUDGxTvdHKfPueZbQWGqAmG/WWb7bACLemfBqhX0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=JRmzhu7g; arc=none smtp.client-ip=209.85.128.51 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="JRmzhu7g" Received: by mail-wm1-f51.google.com with SMTP id 5b1f17b1804b1-47775fb6cb4so15528635e9.0 for ; Fri, 21 Nov 2025 08:08:53 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1763741332; x=1764346132; 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=wBMzVmStt4iXY2kK48dRs2GNNttV+QfJh9K9JLJwKno=; b=JRmzhu7g7YMGh50Gra/SPfwvR7IHDsTDFrjTe1y5eJo+53JVCM76NClWwEuU9DCEeg g37k5F05t1z9eQMlsYgDbPASkuJcv2pYYBmHJBSE1B+EgbIgbELrmOTXfIQjfN44WoqM cme5c2hEvd0JaDBWe5ukft2dM7v7+UWang9zis9hpNhItDshzA0PX1HuSMK/7Xcu/bKq 5kT7mToBVN4xwIO8JshTxhMxqkPuRajnxcVXDivWm3WaeJ6qnkkoDr0WnKIh+Tic7YS2 z/vP8tAnnWgtMJRXayiF1K3Cxz/nAg0aH05XCbHXslH6dnoAUK05r34pMt439Nd3j9Vu bahA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1763741332; x=1764346132; 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=wBMzVmStt4iXY2kK48dRs2GNNttV+QfJh9K9JLJwKno=; b=t+7/817PxbKC1eE0qAnTv70ZQz0aD1KccxmbPWRPu0q1VegCuf3gl89l+rU6n1LkwF 1nNcE/eUqfCvutd6hdcSsF7eLOyZ9X4iLOc26xqWVDG/J7F+qrxCheCLSS6Otk2KXV+l /bedK+QBCOa64Kgzn5WuaqaTvMZ8SkJ4Ap0F8I1P81HRV/bCsZ/lEellG8EQFT0ItCzX FtWZ9+z8q6f2JBJAmf3Km6tqXQpOa/x8/JEC0zIp2PbB9tXgcVGTqyIPgj+wIOEJM1X5 UTW+7sAgY/ILnKLP7SJOlFOb0Ker6qsDZ1l9non2eoWbYQtVeMfAQEgS1+SqeXDSBxG0 R5Wg== X-Forwarded-Encrypted: i=1; AJvYcCXeDJxSJn3wFCdxZY+JVhUFbNK9g98MdGaMJflOkceY7E3GA97j3/T86/lJa1sQTNksROiKDdGZHnwo1MI=@vger.kernel.org X-Gm-Message-State: AOJu0YyUxNIm6WQIM/g/D1nl2Q2qBhO3gY4MopZNon6Xhf5r4DO8v4h2 ckv/Ane/mt/w037Fz7Z/iA3rdZV9vzH+1SvaZB9oqWpogWMqmUYhLONZ X-Gm-Gg: ASbGnctK5+J8zyZQh44p7oT1II8OC/XpbttuKXGCh6ubdfdxMBtRqO5tKF/ZNoakUHc jDtQjRyyeHsnerosftDX1zeyXjE2m8VWzLcZaPyqWquksuG0omxyBySBioCxK79TfMxslc0z9KT SxEtynYoHyL5WJa1Txx2yy8To4fYCHx0w9wRU4rqYsCMN8IiSfFERJvf6c0UBNwYHUu4c5kBOB6 TjtKTEKq7lqTippN/mEDTaEtMWsTlIbQ75XO2dvE22PpJg21laM5uVUWtKuNtxVfFPwW16ToV2/ f4/7G9Ndh0zNhNhdtABFTXYZ4G4/0KGY8+wZXzjg1HRPdkHQI+zdi+P9VEtE3z5Rv41/vNykopT 7jxbfz6L/bgdga10ZF98ogLPVS2FARtWdraBpIqvkZwDDUe3Bt4Jxi9X7sgWi5RAFucKbocTh+l kbaphMw0QKePh4v/YGgBEwlNYN/2i8Wo9cyXjbHI1rWPQ11BZWbxO9mioMPEke7dwcqBOTPP29m URGfkOsEw== X-Google-Smtp-Source: AGHT+IE+ZUdN+W37qG7IiBAeuKMl1Doki1B7HpdO5POm0Ccptffh0HTr4Xa5JOkE3W2dOvU9/wjFQQ== X-Received: by 2002:a05:600c:4591:b0:477:7925:f7f3 with SMTP id 5b1f17b1804b1-477c10e1cacmr26405905e9.14.1763741331535; Fri, 21 Nov 2025 08:08:51 -0800 (PST) Received: from biju.lan (host86-162-200-138.range86-162.btcentralplus.com. [86.162.200.138]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-477a9dea7fcsm89496195e9.8.2025.11.21.08.08.51 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 21 Nov 2025 08:08:51 -0800 (PST) From: Biju X-Google-Original-From: Biju To: =?UTF-8?q?Uwe=20Kleine-K=C3=B6nig?= , Geert Uytterhoeven , Linus Walleij Cc: Biju Das , linux-kernel@vger.kernel.org, linux-pwm@vger.kernel.org, Prabhakar Mahadev Lad , Biju Das , linux-renesas-soc@vger.kernel.org, linux-gpio@vger.kernel.org Subject: [DO NOT APPLY v8 09/15] pwm: rzg2l-gpt: Add support for output disable request from gpt Date: Fri, 21 Nov 2025 16:08:16 +0000 Message-ID: <20251121160842.371922-10-biju.das.jz@bp.renesas.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20251121160842.371922-1-biju.das.jz@bp.renesas.com> References: <20251121160842.371922-1-biju.das.jz@bp.renesas.com> 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: Biju Das When dead time error occurs or the GTIOCA pin output value is the same as the GTIOCB pin output value, output protection is required. GPT detects this condition and generates output disable requests to POEG based on the settings in the output disable request permission bits, such as GTINTAD.GRPDTE, GTINTAD.GRPABH, GTINTAD.GRPABL. After the POEG receives output disable requests from each channel and calculates external input using an OR operation, the POEG generates output disable requests to GPT. Add support for output disable request from gpt, when output level is high for both IOs at the same time. Signed-off-by: Biju Das --- drivers/pwm/pwm-rzg2l-gpt.c | 99 +++++++++++++++++++++++++++++++++++ include/linux/pwm/rzg2l-gpt.h | 33 ++++++++++++ 2 files changed, 132 insertions(+) create mode 100644 include/linux/pwm/rzg2l-gpt.h diff --git a/drivers/pwm/pwm-rzg2l-gpt.c b/drivers/pwm/pwm-rzg2l-gpt.c index aabd2d576231..8006c62068b6 100644 --- a/drivers/pwm/pwm-rzg2l-gpt.c +++ b/drivers/pwm/pwm-rzg2l-gpt.c @@ -29,6 +29,7 @@ #include #include #include +#include #include #include #include @@ -40,6 +41,7 @@ #define RZG2L_GTUDDTYC(ch) (0x30 + RZG2L_GET_CH_OFFS(ch)) #define RZG2L_GTIOR(ch) (0x34 + RZG2L_GET_CH_OFFS(ch)) #define RZG2L_GTINTAD(ch) (0x38 + RZG2L_GET_CH_OFFS(ch)) +#define RZG2L_GTST(ch) (0x3c + RZG2L_GET_CH_OFFS(ch)) #define RZG2L_GTBER(ch) (0x40 + RZG2L_GET_CH_OFFS(ch)) #define RZG2L_GTCNT(ch) (0x48 + RZG2L_GET_CH_OFFS(ch)) #define RZG2L_GTCCR(ch, sub_ch) (0x4c + RZG2L_GET_CH_OFFS(ch) + 4 * (sub_c= h)) @@ -82,6 +84,12 @@ RZG2L_GTIOR_GTIOA_OUT_HI_END_TOGGLE_CMP_MATCH) =20 #define RZG2L_GTINTAD_GRP_MASK GENMASK(25, 24) +#define RZG2L_GTINTAD_OUTPUT_DISABLE_SAME_LEVEL_HIGH BIT(29) + +#define RZG2L_GTST_OABHF BIT(29) +#define RZG2L_GTST_OABLF BIT(30) + +#define RZG2L_GTST_POEG_IRQ_MASK GENMASK(30, 28) =20 #define RZG2L_MAX_HW_CHANNELS 8 #define RZG2L_CHANNELS_PER_IO 2 @@ -395,6 +403,96 @@ static const struct pwm_ops rzg2l_gpt_ops =3D { .apply =3D rzg2l_gpt_apply, }; =20 +u32 rzg2l_gpt_poeg_disable_req_irq_status(void *dev, u8 grp) +{ + struct rzg2l_gpt_chip *rzg2l_gpt =3D dev_get_drvdata(dev); + u8 bitpos =3D grp * RZG2L_MAX_HW_CHANNELS; + unsigned int i; + u8 irq_bitpos; + u32 irq_bits; + u32 val =3D 0; + u32 reg; + + for (i =3D 0; i < RZG2L_MAX_HW_CHANNELS; i++) { + if (!test_bit(bitpos + i, rzg2l_gpt->poeg_gpt_link)) + continue; + else + irq_bitpos =3D (3 * i); + + reg =3D rzg2l_gpt_read(rzg2l_gpt, RZG2L_GTST(i)); + irq_bits =3D FIELD_GET(RZG2L_GTST_POEG_IRQ_MASK, reg); + val |=3D (irq_bits << irq_bitpos); + } + + return val; +} +EXPORT_SYMBOL_GPL(rzg2l_gpt_poeg_disable_req_irq_status); + +int rzg2l_gpt_poeg_disable_req_clr(void *dev, u8 grp) +{ + struct rzg2l_gpt_chip *rzg2l_gpt =3D dev_get_drvdata(dev); + u8 bitpos =3D grp * RZG2L_MAX_HW_CHANNELS; + unsigned int i; + u32 reg; + + for (i =3D 0; i < RZG2L_MAX_HW_CHANNELS; i++) { + if (!test_bit(bitpos + i, rzg2l_gpt->poeg_gpt_link)) + continue; + + reg =3D rzg2l_gpt_read(rzg2l_gpt, RZG2L_GTST(i)); + if (reg & (RZG2L_GTST_OABHF | RZG2L_GTST_OABLF)) + rzg2l_gpt_modify(rzg2l_gpt, RZG2L_GTIOR(i), + RZG2L_GTIOR_OBE, 0); + } + + return 0; +} +EXPORT_SYMBOL_GPL(rzg2l_gpt_poeg_disable_req_clr); + +int rzg2l_gpt_pin_reenable(void *dev, u8 grp) +{ + struct rzg2l_gpt_chip *rzg2l_gpt =3D dev_get_drvdata(dev); + u8 bitpos =3D grp * RZG2L_MAX_HW_CHANNELS; + unsigned int i; + + for (i =3D 0; i < RZG2L_MAX_HW_CHANNELS; i++) { + if (!test_bit(bitpos + i, rzg2l_gpt->poeg_gpt_link)) + continue; + + rzg2l_gpt_modify(rzg2l_gpt, RZG2L_GTIOR(i), + RZG2L_GTIOR_OBE, RZG2L_GTIOR_OBE); + } + return 0; +} +EXPORT_SYMBOL_GPL(rzg2l_gpt_pin_reenable); + +static int rzg2l_gpt_poeg_disable_req_endisable(void *dev, u8 grp, int op,= bool on) +{ + struct rzg2l_gpt_chip *rzg2l_gpt =3D dev_get_drvdata(dev); + u8 bitpos =3D grp * RZG2L_MAX_HW_CHANNELS; + unsigned int i; + + for (i =3D 0; i < RZG2L_MAX_HW_CHANNELS; i++) { + if (!test_bit(bitpos + i, rzg2l_gpt->poeg_gpt_link)) + continue; + + if (on) + rzg2l_gpt_modify(rzg2l_gpt, RZG2L_GTINTAD(i), op, op); + else + rzg2l_gpt_modify(rzg2l_gpt, RZG2L_GTINTAD(i), op, 0); + } + + return 0; +} + +int rzg2l_gpt_poeg_disable_req_both_high(void *dev, u8 grp, bool on) +{ + int id =3D RZG2L_GTINTAD_OUTPUT_DISABLE_SAME_LEVEL_HIGH; + + return rzg2l_gpt_poeg_disable_req_endisable(dev, grp, id, on); +} +EXPORT_SYMBOL_GPL(rzg2l_gpt_poeg_disable_req_both_high); + /* * This function links a poeg group{A,B,C,D} with a gpt channel{0..7} and * configure the pin for output disable. @@ -526,6 +624,7 @@ static int rzg2l_gpt_probe(struct platform_device *pdev) return dev_err_probe(dev, ret, "Failed to link gpt with poeg\n"); =20 mutex_init(&rzg2l_gpt->lock); + platform_set_drvdata(pdev, rzg2l_gpt); =20 chip->ops =3D &rzg2l_gpt_ops; ret =3D devm_pwmchip_add(dev, chip); diff --git a/include/linux/pwm/rzg2l-gpt.h b/include/linux/pwm/rzg2l-gpt.h new file mode 100644 index 000000000000..718aaeca39f2 --- /dev/null +++ b/include/linux/pwm/rzg2l-gpt.h @@ -0,0 +1,33 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +#ifndef __LINUX_PWM_RENESAS_RZG2L_GPT_H__ +#define __LINUX_PWM_RENESAS_RZG2L_GPT_H__ + +#if IS_ENABLED(CONFIG_PWM_RENESAS_RZG2L_GPT) +u32 rzg2l_gpt_poeg_disable_req_irq_status(void *dev, u8 grp); +int rzg2l_gpt_poeg_disable_req_clr(void *gpt_device, u8 grp); +int rzg2l_gpt_pin_reenable(void *gpt_device, u8 grp); +int rzg2l_gpt_poeg_disable_req_both_high(void *gpt_device, u8 grp, bool on= ); +#else +static inline u32 rzg2l_gpt_poeg_disable_req_irq_status(void *dev, u8 grp) +{ + return -ENODEV; +} + +static inline int rzg2l_gpt_poeg_disable_req_clr(void *gpt_device, u8 grp) +{ + return -ENODEV; +} + +static inline int rzg2l_gpt_pin_reenable(void *gpt_device, u8 grp) +{ + return -ENODEV; +} + +static inline int rzg2l_gpt_poeg_disable_req_both_high(void *gpt_device, u= 8 grp, bool on) +{ + return -ENODEV; +} + +#endif + +#endif /* __LINUX_PWM_RENESAS_RZG2L_GPT_H__ */ --=20 2.43.0