From nobody Tue Dec 2 01:27:27 2025 Received: from mail-wm1-f46.google.com (mail-wm1-f46.google.com [209.85.128.46]) (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 52E7C34F47C for ; Fri, 21 Nov 2025 16:08:56 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.46 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763741342; cv=none; b=N5vnqKieI7RzCZNV33kuVA47Ebr2mb9Wp5EXs+uSc/C9LIg1yGGbL7C+1RzPKF7k45zREAHiCDxQysp6eECPHgNZA5Gv+4ttt0WTml9bV4MsuOE8GlDal2NbUjF5eAYlMZxh7qK7W+i/0lTJ0XBE2AQTw5Z8azLGZCduG/7U/uE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763741342; c=relaxed/simple; bh=k9V7vI2bmW6KtNvIzvVHcp6NnBpVBCBYYGweS1ZnAJc=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=TNfATaQ63LNBnBOnB81cdGkfk8bmDqKRS+gb0xoXeeODE/URU4eeoypA6u3VnredSmhg/izs3rKKnpy3kWhu/FuN4cLuzRBKCKA8lh+R4UQJOCO/C2iScYeX0etvcY57iDx+27WkRTKzLw5Q+Go7zx6s5lySn3KUpyAHYDjGZ0E= 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=Eab7Ma+b; arc=none smtp.client-ip=209.85.128.46 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="Eab7Ma+b" Received: by mail-wm1-f46.google.com with SMTP id 5b1f17b1804b1-47778b23f64so12590175e9.0 for ; Fri, 21 Nov 2025 08:08:55 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1763741334; x=1764346134; 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=v72bzMxhTcm0nemU+D1UXJWTovPas4rWq7RJYN0fIWM=; b=Eab7Ma+b2fWVUGLj2yTjpM/P/dcQIwOembm3uHYuHeU3GfVMOsFM9Qq/DV4y0L3/ho inMv+jSayas1s86SqMC92sNLkMzlgNBZloqiNVcCggSR1O+N5eL0wuNeOgD84CD7YJI2 RuI17+KeS/YX0zdu7ga6qVZNgaxh+AN33RX4sUdWK44EgJQ3MtNctaGqAWIoswHP7Lxp kDlvCUjv7ofqQSpdOTK/oUDCSSaSJSMfgjNUo/VtZ9zF6R6HTuFr3qMPZFhCjIDZo9ad b8Jw6tc91RzyR4JM49Kfaq3LmtS9k80dk2QMQrD9KEJQdMjqaApQZq0549Uc/5FAVdV2 9W0A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1763741334; x=1764346134; 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=v72bzMxhTcm0nemU+D1UXJWTovPas4rWq7RJYN0fIWM=; b=Edg8DajZbLnwhJvsmghhz75L+bu/Zjb7phP1kqSQCfHKrBOHa5J2C76ekkshzOAdrJ TG1353YIT8VV6y0vSbrLgJwH/Ciy5oKPf1BkYaw9/3CqzcEmefwtUQZNxCt7xZgkGyzD wyiK4M0qSJYoSt1Mkjm3g/wEBTVj5kFIrA0JIXJXL45tKZGZSjL6pIGDd3ghGEqO8p7i DLlUHq5Zv6RD4RCNRw121nEgY9E9UXaZALg5LMYeYzpYKeXIKYikxjZz29jLI7m2fAaI Bq9iLA/l7Wk/lxLW5CRCf8wbJyjnGyF4jlGe40qcO+MvaxTsaV+XjeEvWM8m/5pOeEa1 mvyg== X-Forwarded-Encrypted: i=1; AJvYcCU8ZwGTVeIe08o4gjsC+o2DgzzZL5z05EDscQvhGg0PF6PYU9gL4VRtljYPZUtREYc87eg90u7QC9s8Fks=@vger.kernel.org X-Gm-Message-State: AOJu0YzKm5XNJt9zpk9O4gljzN5iuKJsPK6bBumIrrgp3UpHckw/vjJj ORgbgsXY0Bzpbd7JsREkrcrJHEejHXPQqaluf6My/sLTmKrdaBjTyHKH X-Gm-Gg: ASbGncutD9vTrqGWGURcY4RL22pHnpbkE71cIN/zh9sJJiv70PjsNDP4STm4DXDdMpc co1KjwKDelCldQyeI/TCCaydl6n5FBAh6BlXEX0NcNAki0mT1h0uqra5yfTGlHwi+Swos3WkH2X Bp2ylAFQvJBZahqgc9aKvRT4lAQvJqx/KSt918s9RgxdYHg+M1Tw6WJNqLY0qYjLOBdiaijTOH1 xQF6peab5PlTxhPvdToFz8hqNL3fD6io1Q/SSofB1Z/Y4S3cK0Geuib/0jpSfOU8qjcaiTcqxHM reczLqmphnSs43Rah3Xt7aWU43yKbaFT5eiLQk5TVNWvJ+L7wFhSAGf9FTwXTgFSlIfoFPut442 Cb6Zsg4ZU1F0TdJMYNuIUpHRz7m+GoAhxFQUtRkDmlpLS/XYHtT45beWELVCVsqNOnQ660rkAfT GbaEeGUCYkMlrPDNCov5usKM6ITZmY4hmgkeOsu4Rz2602FwVWPkh0Ok7SOua7tRPRsZNbsRU= X-Google-Smtp-Source: AGHT+IFuf3wu0Rs1U1IDvXOH69U2vml8ZSvlF+J7+ZymSNg5BzHRf17av6t68ABoEaSDJwvhDYtuQg== X-Received: by 2002:a05:600c:3589:b0:477:97c7:9be7 with SMTP id 5b1f17b1804b1-477c110262fmr28860765e9.1.1763741333408; Fri, 21 Nov 2025 08:08:53 -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.52 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 21 Nov 2025 08:08:53 -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 PATCH v8 12/15] pinctrl: renesas: rzg2l-poeg: Add support for GPT Output-Disable Request Date: Fri, 21 Nov 2025 16:08:19 +0000 Message-ID: <20251121160842.371922-13-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 Add support for output-disable requests from GPT. When both outputs are high, gpt detects the condition and triggers an interrupt to POEG. POEG handles the interrupt and send notification to userspace. userspace handles the fault and issue a write call to cancel the disable output request. Signed-off-by: Biju Das --- drivers/pinctrl/renesas/poeg/rzg2l-poeg.c | 86 ++++++++++++++++++++++- include/linux/pinctrl/rzg2l-poeg.h | 9 +++ 2 files changed, 94 insertions(+), 1 deletion(-) diff --git a/drivers/pinctrl/renesas/poeg/rzg2l-poeg.c b/drivers/pinctrl/re= nesas/poeg/rzg2l-poeg.c index 2a09888407d0..3dd8bc3465b1 100644 --- a/drivers/pinctrl/renesas/poeg/rzg2l-poeg.c +++ b/drivers/pinctrl/renesas/poeg/rzg2l-poeg.c @@ -14,6 +14,7 @@ #include #include #include +#include #include #include #include @@ -49,7 +50,10 @@ struct rzg2l_poeg_chip { struct device *gpt_dev; struct reset_control *rstc; void __iomem *mmio; + DECLARE_BITMAP(gpt_irq, 3); struct cdev poeg_cdev; + wait_queue_head_t events_wait; + DECLARE_KFIFO_PTR(events, struct poeg_event); u32 cfg; int minor_n; u8 gpt_channels[RZG2L_GPT_MAX_HW_CHANNELS]; @@ -81,12 +85,29 @@ static int rzg2l_poeg_output_disable_user(struct rzg2l_= poeg_chip *chip, bool ena return 0; } =20 +static void rzg2l_poeg_config_irq(struct rzg2l_poeg_chip *chip) +{ + if (test_bit(RZG2L_GPT_OABHF, chip->gpt_irq)) + rzg2l_gpt_poeg_disable_req_both_high(chip->gpt_dev, chip->index, true); +} + static irqreturn_t rzg2l_poeg_irq(int irq, void *ptr) { struct rzg2l_poeg_chip *chip =3D ptr; + struct poeg_event ev; u32 val; =20 + val =3D rzg2l_gpt_poeg_disable_req_irq_status(chip->gpt_dev, chip->index); + ev.channel =3D chip->index; + ev.gpt_disable_irq_status =3D val; + kfifo_in(&chip->events, &ev, 1); + wake_up_poll(&chip->events_wait, EPOLLIN); + + rzg2l_gpt_poeg_disable_req_clr(chip->gpt_dev, chip->index); val =3D rzg2l_poeg_read(chip); + if (val & POEGG_IOCF) + val &=3D ~POEGG_IOCF; + if (val & POEGG_PIDF) val &=3D ~POEGG_PIDF; =20 @@ -95,7 +116,50 @@ static irqreturn_t rzg2l_poeg_irq(int irq, void *ptr) return IRQ_HANDLED; } =20 -static ssize_t rzg2l_poeg_chrdev_write(struct file *filp, const char __use= r *buf, +static __poll_t rzg2l_poeg_chrdev_poll(struct file *filp, + struct poll_table_struct *pollt) +{ + struct rzg2l_poeg_chip *const chip =3D filp->private_data; + __poll_t events =3D 0; + + poll_wait(filp, &chip->events_wait, pollt); + if (!kfifo_is_empty(&chip->events)) + events =3D EPOLLIN | EPOLLRDNORM; + + return events; +} + +static ssize_t rzg2l_poeg_chrdev_read(struct file *filp, char __user *buf, + size_t len, loff_t *f_ps) +{ + struct rzg2l_poeg_chip *const chip =3D filp->private_data; + unsigned int copied; + int err; + + if (len < sizeof(struct poeg_event)) + return -EINVAL; + + do { + if (kfifo_is_empty(&chip->events)) { + if (filp->f_flags & O_NONBLOCK) + return -EAGAIN; + + err =3D wait_event_interruptible(chip->events_wait, + !kfifo_is_empty(&chip->events)); + if (err < 0) + return err; + } + + err =3D kfifo_to_user(&chip->events, buf, len, &copied); + if (err < 0) + return err; + } while (!copied); + + return copied; +} + +static ssize_t rzg2l_poeg_chrdev_write(struct file *filp, + const char __user *buf, size_t len, loff_t *f_ps) { struct rzg2l_poeg_chip *const chip =3D filp->private_data; @@ -111,6 +175,12 @@ static ssize_t rzg2l_poeg_chrdev_write(struct file *fi= lp, const char __user *buf case RZG2L_POEG_OUTPUT_DISABLE_USR_DISABLE_CMD: rzg2l_poeg_output_disable_user(chip, false); break; + case RZG2L_POEG_GPT_CFG_IRQ_CMD: + rzg2l_poeg_config_irq(chip); + break; + case RZG2L_POEG_GPT_FAULT_CLR_CMD: + rzg2l_gpt_pin_reenable(chip->gpt_dev, chip->index); + break; default: return -EINVAL; } @@ -137,7 +207,9 @@ static int rzg2l_poeg_chrdev_release(struct inode *inod= e, struct file *filp) =20 static const struct file_operations poeg_fops =3D { .owner =3D THIS_MODULE, + .read =3D rzg2l_poeg_chrdev_read, .write =3D rzg2l_poeg_chrdev_write, + .poll =3D rzg2l_poeg_chrdev_poll, .open =3D rzg2l_poeg_chrdev_open, .release =3D rzg2l_poeg_chrdev_release, }; @@ -272,6 +344,9 @@ static int rzg2l_poeg_probe(struct platform_device *pde= v) case POEG_USER_CTRL: rzg2l_poeg_write(chip, 0); break; + case POEG_GPT_BOTH_HIGH: + assign_bit(RZG2L_GPT_OABHF, chip->gpt_irq, true); + break; case POEG_EXT_PIN_CTRL: rzg2l_poeg_write(chip, POEGG_PIDE); break; @@ -280,8 +355,12 @@ static int rzg2l_poeg_probe(struct platform_device *pd= ev) goto err_pm; } =20 + if (cfg & POEG_GPT_ALL) + rzg2l_poeg_write(chip, POEGG_IOCE); + chip->cfg =3D cfg; =20 + init_waitqueue_head(&chip->events_wait); cdev_init(&chip->poeg_cdev, &poeg_fops); chip->poeg_cdev.owner =3D THIS_MODULE; ret =3D cdev_add(&chip->poeg_cdev, MKDEV(MAJOR(g_poeg_dev), chip->index),= 1); @@ -296,6 +375,10 @@ static int rzg2l_poeg_probe(struct platform_device *pd= ev) goto free_cdev; } =20 + ret =3D kfifo_alloc(&chip->events, 64, GFP_KERNEL); + if (ret) + goto free_cdev; + chip->minor_n =3D chip->index; =20 return ret; @@ -311,6 +394,7 @@ static void rzg2l_poeg_remove(struct platform_device *p= dev) { struct rzg2l_poeg_chip *chip =3D platform_get_drvdata(pdev); =20 + kfifo_free(&chip->events); device_destroy(poeg_class, MKDEV(MAJOR(g_poeg_dev), chip->minor_n)); cdev_del(&chip->poeg_cdev); pm_runtime_put(&pdev->dev); diff --git a/include/linux/pinctrl/rzg2l-poeg.h b/include/linux/pinctrl/rzg= 2l-poeg.h index a5392f956700..311405b0137e 100644 --- a/include/linux/pinctrl/rzg2l-poeg.h +++ b/include/linux/pinctrl/rzg2l-poeg.h @@ -6,6 +6,15 @@ =20 #define RZG2L_POEG_OUTPUT_DISABLE_USR_DISABLE_CMD 0 #define RZG2L_POEG_OUTPUT_DISABLE_USR_ENABLE_CMD 1 +#define RZG2L_POEG_GPT_CFG_IRQ_CMD 2 +#define RZG2L_POEG_GPT_FAULT_CLR_CMD 3 + +#define RZG2L_GPT_OABHF 1 + +struct poeg_event { + __u32 gpt_disable_irq_status; + __u8 channel; +}; =20 struct poeg_cmd { __u32 val; --=20 2.43.0