From nobody Sun Feb 8 06:56:15 2026 Received: from mx2.securetransport.de (mx2.securetransport.de [188.68.39.254]) by smtp.subspace.kernel.org (Postfix) with ESMTP id AACEB12D1F1; Fri, 4 Apr 2025 13:42:15 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=188.68.39.254 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1743774140; cv=none; b=RD/Cm0O5jsVl15K30XjwzPFAM1sbmN3A16t8o4JSs6ZSPWVvNztDj5JkTt44w+l2KIeabJH68oD6JqD0AB0AC0VPOMcvftkdKBw+UFwL7KRXOdz4RV/ToHfrNBRdQRCjpAm8aEBp+ISSca8Fky7/dXNkQduGSeELRbExgJMINXA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1743774140; c=relaxed/simple; bh=6SAs7ZiWvqWG3XPpQsQtnVyH6fMBaB/n6b1668EDrmw=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=TZrJHlkS5L/p8/nAOF3+IE+hzYINdpiS3HHKz4BVcf883VR/0J4JZQz+MgqyTTvZdeqQV0E1m13msu/jK66Sc4aTTv98dX2obM1nDAtAfMCzKlcAxfOXwFXKHvdS5umxmjWz9X/wQ0O7dUawjVhjco0naLJMLJkr4XEzZT6xwNI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=dh-electronics.com; spf=pass smtp.mailfrom=dh-electronics.com; dkim=pass (2048-bit key) header.d=dh-electronics.com header.i=@dh-electronics.com header.b=BwRXDgMb; arc=none smtp.client-ip=188.68.39.254 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=dh-electronics.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=dh-electronics.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=dh-electronics.com header.i=@dh-electronics.com header.b="BwRXDgMb" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=dh-electronics.com; s=dhelectronicscom; t=1743774104; bh=fy8WY+eU9dK+jaA1NumMddQBYAbhrFBEaD8MJdiHjGM=; h=From:To:CC:Subject:Date:In-Reply-To:References:From; b=BwRXDgMbbs8loO4tUgMIhxqSQHLV4AN1wy5ONt/s8y5vGULDMKD3ifMcWCBM+ILx8 OwYhL5E8VDxKJ+n8y+ZgkgvlUWW2LpL+qNEJomFNQd3lNwEG7CI2LPXZcbcA3d3i/U xSF8LWYY7G2j8/9HNCoag9hfSgUGs+GlodFJMKDjQWl2XufgM5V0UpECnuf5IcEyFQ tHokH/b3Jt9GjxdA/qa4X+2z9lwIKQkSzakm/7/l3+UpfVb8AGewkeCnEMXXzDvmOr rGTur2v6Rq6lbrGWXvXowh20+xBjvDmLDgjsgciLPy2kLuzue3+1JNBa1zIA6ExdCq jGX7WJumfBRqg== From: Johann Neuhauser To: , CC: Johann Neuhauser , Jonathan Corbet , Liam Girdwood , Mark Brown Subject: [PATCH 1/3] regulator: userspace-consumer: Add uevent reporting for regulator events Date: Fri, 4 Apr 2025 15:40:07 +0200 Message-ID: <20250404134009.2610460-2-jneuhauser@dh-electronics.com> X-klartext: yes In-Reply-To: <20250404134009.2610460-1-jneuhauser@dh-electronics.com> References: <20250404134009.2610460-1-jneuhauser@dh-electronics.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" Generate uevents when regulator events such as voltage changes, overcurrent, or enable/disable transitions occur. A separate uevent is emitted for each individual regulator event bit, allowing precise event handling in userspace via udev rules. The emitted uevent key `EVENT=3D` corresponds directly to the event types d= efined in include/uapi/regulator/regulator.h. This provides a flexible, user-friendly mechanism to monitor and handle regulator events from userspace. Signed-off-by: Johann Neuhauser --- Cc: Jonathan Corbet Cc: Liam Girdwood Cc: linux-doc@vger.kernel.org Cc: linux-kernel@vger.kernel.org Cc: Mark Brown --- drivers/regulator/userspace-consumer.c | 74 +++++++++++++++++++++++++- 1 file changed, 73 insertions(+), 1 deletion(-) diff --git a/drivers/regulator/userspace-consumer.c b/drivers/regulator/use= rspace-consumer.c index 72bb5ffb49a8..01cf07d42682 100644 --- a/drivers/regulator/userspace-consumer.c +++ b/drivers/regulator/userspace-consumer.c @@ -11,6 +11,7 @@ * Author: Mark Brown */ =20 +#include #include #include #include @@ -29,6 +30,9 @@ struct userspace_consumer_data { =20 int num_supplies; struct regulator_bulk_data *supplies; + + struct kobject *kobj; + struct notifier_block nb; }; =20 static ssize_t name_show(struct device *dev, @@ -115,12 +119,68 @@ static const struct attribute_group attr_group =3D { .is_visible =3D attr_visible, }; =20 +/* + * This should probably be placed elsewhere in the regulator framework... + */ +static const char *regulator_event_str(unsigned long event) +{ + switch (event) { + case REGULATOR_EVENT_ABORT_DISABLE: + return "ABORT_DISABLE"; + case REGULATOR_EVENT_ABORT_VOLTAGE_CHANGE: + return "ABORT_VOLTAGE_CHANGE"; + case REGULATOR_EVENT_DISABLE: + return "DISABLE"; + case REGULATOR_EVENT_ENABLE: + return "ENABLE"; + case REGULATOR_EVENT_FAIL: + return "FAIL"; + case REGULATOR_EVENT_FORCE_DISABLE: + return "FORCE_DISABLE"; + case REGULATOR_EVENT_OVER_CURRENT: + return "OVER_CURRENT"; + case REGULATOR_EVENT_OVER_TEMP: + return "OVER_TEMP"; + case REGULATOR_EVENT_PRE_DISABLE: + return "PRE_DISABLE"; + case REGULATOR_EVENT_PRE_VOLTAGE_CHANGE: + return "PRE_VOLTAGE_CHANGE"; + case REGULATOR_EVENT_REGULATION_OUT: + return "REGULATION_OUT"; + case REGULATOR_EVENT_UNDER_VOLTAGE: + return "UNDER_VOLTAGE"; + case REGULATOR_EVENT_VOLTAGE_CHANGE: + return "VOLTAGE_CHANGE"; + default: + return NULL; + } +} + +static int regulator_userspace_notify(struct notifier_block *nb, unsigned = long event, void *unused) +{ + struct userspace_consumer_data *drvdata =3D container_of(nb, struct users= pace_consumer_data, nb); + char env_buf[128]; + char *envp[] =3D { "NAME=3Devent", env_buf, NULL }; + unsigned int bit; + + for_each_set_bit(bit, &event, BITS_PER_TYPE(event)) { + const char *event_str =3D regulator_event_str(BIT(bit)); + + if (event_str && event_str[0] !=3D '\0') { + scnprintf(env_buf, sizeof(env_buf), "EVENT=3D%s", event_str); + kobject_uevent_env(drvdata->kobj, KOBJ_CHANGE, envp); + } + } + + return NOTIFY_OK; +} + static int regulator_userspace_consumer_probe(struct platform_device *pdev) { struct regulator_userspace_consumer_data tmpdata; struct regulator_userspace_consumer_data *pdata; struct userspace_consumer_data *drvdata; - int ret; + int i, ret; =20 pdata =3D dev_get_platdata(&pdev->dev); if (!pdata) { @@ -153,6 +213,7 @@ static int regulator_userspace_consumer_probe(struct pl= atform_device *pdev) drvdata->num_supplies =3D pdata->num_supplies; drvdata->supplies =3D pdata->supplies; drvdata->no_autoswitch =3D pdata->no_autoswitch; + drvdata->kobj =3D &pdev->dev.kobj; =20 mutex_init(&drvdata->lock); =20 @@ -184,6 +245,13 @@ static int regulator_userspace_consumer_probe(struct p= latform_device *pdev) } drvdata->enabled =3D !!ret; =20 + drvdata->nb.notifier_call =3D regulator_userspace_notify; + for (i =3D 0; i < drvdata->num_supplies; i++) { + ret =3D devm_regulator_register_notifier(drvdata->supplies[i].consumer, = &drvdata->nb); + if (ret) + goto err_enable; + } + return 0; =20 err_enable: @@ -195,6 +263,10 @@ static int regulator_userspace_consumer_probe(struct p= latform_device *pdev) static void regulator_userspace_consumer_remove(struct platform_device *pd= ev) { struct userspace_consumer_data *data =3D platform_get_drvdata(pdev); + int i; + + for (i =3D 0; i < data->num_supplies; i++) + devm_regulator_unregister_notifier(data->supplies[i].consumer, &data->nb= ); =20 sysfs_remove_group(&pdev->dev.kobj, &attr_group); =20 --=20 2.39.5 From nobody Sun Feb 8 06:56:15 2026 Received: from mx2.securetransport.de (mx2.securetransport.de [188.68.39.254]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 302EA12D1F1; Fri, 4 Apr 2025 13:42:31 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=188.68.39.254 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1743774153; cv=none; b=b3iLjxcpF3gfdDQlGx2XMvbyjISTr2bwQmyA58LWyh3GCQ7NicbT1loDFQ2KBAHwpnvN3Osyq65UFwKWIeJuAixsuKW4QxLX1DmgziG9LRgNIF0FzU7sjSVrxvlMhWw9PfUdbvc2tdNP45ZV1XQM10OCN5hCoarxTbL8HNPJnnU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1743774153; c=relaxed/simple; bh=m+p7eMnkKuhdy70SAUmOiT3zT3XpgZxgRzYdf5rk1J0=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=WitMaQ/ynTudxaOIv3Ga4QpZTKjI7cy0pSmqMaIpb9W926kLAWvmixWH6GM6RasWgnifZ3CXpU8cGiUfacGwWMhDvIMqV8/cBKnxCZ/1w86braC0FK/s4e0J4SNYbAKgmgMpg1r5h1eRaelIdVIXIHmrGwqw4Z4OdRJhFagT/Ws= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=dh-electronics.com; spf=pass smtp.mailfrom=dh-electronics.com; dkim=pass (2048-bit key) header.d=dh-electronics.com header.i=@dh-electronics.com header.b=QAjTQBam; arc=none smtp.client-ip=188.68.39.254 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=dh-electronics.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=dh-electronics.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=dh-electronics.com header.i=@dh-electronics.com header.b="QAjTQBam" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=dh-electronics.com; s=dhelectronicscom; t=1743774114; bh=RZ0jmwBFYdzhS3iHe4uxhfbTjqPPf5KQuSOU+fJ9O28=; h=From:To:CC:Subject:Date:In-Reply-To:References:From; b=QAjTQBam+uaeNnDDCQGS8FYV0KabuM7uLlPVjaSZWAkaqPYaIVJerLyr96DWmkb42 FkDtWhOCh5SWSXY1+++oLIFHHgAa55xFL46p29KmRsYt6WaZpZxu/TyA08WFdoTLn1 XhbRzF//7VZiCjOlpGj5jUyy+T2KzKmY3VIqxY6LNwp7NyCa3JkLLMNhiah3cpI9G2 rBOczeKhyKdGPRnAht3wVL7KGsOcx+ZGSv2iELc5Ba33zXb7IFdmI6OWOA/DlCA7t6 D/RXVV7oonP8cRHVk6B5KnRiHOFRTMFfhTH0HyTHnrc7nYQUYwtjUIKMpe+Krn/NVJ w4rGFHR3IIKjQ== From: Johann Neuhauser To: , CC: Johann Neuhauser , Jonathan Corbet , Liam Girdwood , Mark Brown Subject: [PATCH 2/3] ABI: sysfs-platform: Document uevent ABI for reg-userspace-consumer Date: Fri, 4 Apr 2025 15:40:08 +0200 Message-ID: <20250404134009.2610460-3-jneuhauser@dh-electronics.com> X-klartext: yes In-Reply-To: <20250404134009.2610460-1-jneuhauser@dh-electronics.com> References: <20250404134009.2610460-1-jneuhauser@dh-electronics.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" Document the new uevent-based ABI provided by the userspace-consumer regulator driver. These uevents expose regulator events such as OVER_CURREN= T, ENABLE, DISABLE, UNDER_VOLTAGE, and others to userspace. Clearly describe the ABI entries and possible event values to ensure stable and predictable userspace integration. Signed-off-by: Johann Neuhauser --- Cc: Jonathan Corbet Cc: Liam Girdwood Cc: linux-doc@vger.kernel.org Cc: linux-kernel@vger.kernel.org Cc: Mark Brown --- ...ysfs-platform-regulator-userspace-consumer | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 Documentation/ABI/testing/sysfs-platform-regulator-user= space-consumer diff --git a/Documentation/ABI/testing/sysfs-platform-regulator-userspace-c= onsumer b/Documentation/ABI/testing/sysfs-platform-regulator-userspace-cons= umer new file mode 100644 index 000000000000..2d518afb0d32 --- /dev/null +++ b/Documentation/ABI/testing/sysfs-platform-regulator-userspace-consumer @@ -0,0 +1,23 @@ +What: /devices/platform//uevent EVENT=3D +Date: April 2025 +Contact: Johann Neuhauser +Description: + Reports regulator events via uevents for platform devices + controlled by the userspace-consumer regulator driver. + =09 + Possible EVENT=3D values: + - ABORT_DISABLE + - ABORT_VOLTAGE_CHANGE + - DISABLE + - ENABLE + - FAIL + - FORCE_DISABLE + - OVER_CURRENT + - OVER_TEMP + - PRE_DISABLE + - PRE_VOLTAGE_CHANGE + - REGULATION_OUT + - UNDER_VOLTAGE + - VOLTAGE_CHANGE + +Userspace can monitor these events using udev and respond accordingly. --=20 2.39.5 From nobody Sun Feb 8 06:56:15 2026 Received: from mx2.securetransport.de (mx2.securetransport.de [188.68.39.254]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 11F8512D1F1; Fri, 4 Apr 2025 13:42:42 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=188.68.39.254 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1743774167; cv=none; b=XmoJR+/LGO7Qk8fXJ32rIR7voqae2EglZ77P9UVphQQeMc/a2PMBAwmy9jV9t5P1zx5/ul4f3gWZVx2u7HtP4L7XEvEEfjeC7PF/PJgo3M3pNzXx+wMYmQnCxvLt6wIbqHt16YdWngflDYt+t+OWgzmkYKjuFo/lPTZxTUDk+vU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1743774167; c=relaxed/simple; bh=u0SPVnMW7m9xp1q5Fto8u0ZT8lP0XSxKjLxGAkfDFcM=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=WfMw4nOkq4cG2o/iNikmGxyI/LxlZHpcw7CT93CdRGeRreSsYbgD7kV/LcSYgvswGVNV6es1GVT/tkmFIvvbucS3lNdX9Xi9hqbyAZLYc5irziAeoszufNGKbsT5TSR3ztoR5pQ8vVF/yPC3zMiBsd9qdy8r1g64s4QwGTvyr2k= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=dh-electronics.com; spf=pass smtp.mailfrom=dh-electronics.com; dkim=pass (2048-bit key) header.d=dh-electronics.com header.i=@dh-electronics.com header.b=i4RrI9dK; arc=none smtp.client-ip=188.68.39.254 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=dh-electronics.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=dh-electronics.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=dh-electronics.com header.i=@dh-electronics.com header.b="i4RrI9dK" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=dh-electronics.com; s=dhelectronicscom; t=1743774124; bh=mEWTFQi0x5I0T2Dvamc/ses98XmOTmvVCWZ+pb/lH5c=; h=From:To:CC:Subject:Date:In-Reply-To:References:From; b=i4RrI9dK1RsghyjTi4uJ/ikCIThxUd2xmZNgFuyrDqOCsETVlNS2SdKEVP3QWoGK/ PoKjj04RKs25xqe2xXxwoy+r2W6Uj9H5rheKaX+YdPlv45XCtgpt2Nm320jIZ1J05Q 7uEbySnWIm61SVx1LqnENQLUbddf/u14dyhBSjRZg4DogquJ8UylvYUWoCcgkMrl/Z gOM1soon6JyJeV9dwVhxwS9lBFdBczAn7fRkDPQfl5hx9iz57Q6W8NC1eZvS+kuevn SXJweNY/go1Wx3Hg9aoiLUAKiznMA+hyF92AIDMaPZf6PmMSeVO4jN0qJMo0j0MVx1 aoEsFUBXvKr9Q== From: Johann Neuhauser To: , CC: Johann Neuhauser , Jonathan Corbet , Liam Girdwood , Mark Brown Subject: [PATCH 3/3] docs: regulator: userspace-consumer: Add uevent-based regulator event reporting Date: Fri, 4 Apr 2025 15:40:09 +0200 Message-ID: <20250404134009.2610460-4-jneuhauser@dh-electronics.com> X-klartext: yes In-Reply-To: <20250404134009.2610460-1-jneuhauser@dh-electronics.com> References: <20250404134009.2610460-1-jneuhauser@dh-electronics.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" Add detailed documentation for the new uevent-based event reporting introduced in the regulator userspace-consumer driver. This documentation explains: - The new supported regulator events exposed via uevents. - Methods to monitor these events from userspace using `udevadm`. - Practical examples for creating udev rules and scripts. Signed-off-by: Johann Neuhauser --- Cc: Jonathan Corbet Cc: Liam Girdwood Cc: linux-doc@vger.kernel.org Cc: linux-kernel@vger.kernel.org Cc: Mark Brown --- .../regulator/userspace-consumer.rst | 92 +++++++++++++++++++ 1 file changed, 92 insertions(+) create mode 100644 Documentation/driver-api/regulator/userspace-consumer.r= st diff --git a/Documentation/driver-api/regulator/userspace-consumer.rst b/Do= cumentation/driver-api/regulator/userspace-consumer.rst new file mode 100644 index 000000000000..308873fd20cb --- /dev/null +++ b/Documentation/driver-api/regulator/userspace-consumer.rst @@ -0,0 +1,92 @@ +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D +Regulator Userspace Consumer +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D + +This document describes the Userspace Consumer Regulator Driver +(`drivers/regulator/userspace-consumer.c`) and its userspace interface. + +Introduction +------------ + +The Userspace Consumer Regulator provides userspace with direct control +and monitoring of regulator outputs. It now supports reporting regulator +events directly via uevents, enabling userspace to handle events such as +overcurrent, voltage changes, enabling/disabling regulators, and more. + +Supported Events +---------------- + +The driver emits uevents corresponding to the regulator events defined in +``include/uapi/regulator/regulator.h``. + +Currently supported regulator event uevents are: + +- ``EVENT=3DABORT_DISABLE`` +- ``EVENT=3DABORT_VOLTAGE_CHANGE`` +- ``EVENT=3DDISABLE`` +- ``EVENT=3DENABLE`` +- ``EVENT=3DFAIL`` +- ``EVENT=3DFORCE_DISABLE`` +- ``EVENT=3DOVER_CURRENT`` +- ``EVENT=3DOVER_TEMP`` +- ``EVENT=3DPRE_DISABLE`` +- ``EVENT=3DPRE_VOLTAGE_CHANGE`` +- ``EVENT=3DREGULATION_OUT`` +- ``EVENT=3DUNDER_VOLTAGE`` +- ``EVENT=3DVOLTAGE_CHANGE`` + +Monitoring Events from Userspace +-------------------------------- + +Userspace applications can monitor these regulator uevents using ``udevadm= ``: + +.. code-block:: bash + + udevadm monitor -pku + +Example output: + +.. code-block:: + + KERNEL[152.717414] change /devices/platform/output-usb3 (platform) + ACTION=3Dchange + DEVPATH=3D/devices/platform/output-usb3 + SUBSYSTEM=3Dplatform + NAME=3Devent + EVENT=3DOVER_CURRENT + DRIVER=3Dreg-userspace-consumer + +Handling Events with Udev Rules +------------------------------- + +Userspace can react to these events by creating udev rules. For example, +to trigger a script on an OVER_CURRENT event: + +.. code-block:: udev + + # /etc/udev/rules.d/99-regulator-events.rules + ACTION=3D=3D"change", SUBSYSTEM=3D=3D"platform", DRIVER=3D"reg-userspa= ce-consumer", ENV{EVENT}=3D=3D"OVER_CURRENT", RUN+=3D"/usr/local/bin/handle= -regulator-event.sh" + +A sample handler script: + +.. code-block:: bash + + #!/bin/sh + logger "Handle regulator ${EVENT} on ${DEVPATH}" + # Add additional handling logic here + case "${EVENT}" in + OVER_CURRENT) + echo disabled > /sys"${DEVPATH}"/state + esac + +API Stability +------------- + +This interface is considered stable. New regulator events may be added +in the future, with corresponding documentation updates. + +References +---------- + +- Kernel Header File: ``include/uapi/regulator/regulator.h`` +- Driver Source: ``drivers/regulator/userspace-consumer.c`` --=20 2.39.5