From: "Marek Behún" <kabel@kernel.org>
To: Lee Jones <lee@kernel.org>
Cc: "Pavel Machek" <pavel@ucw.cz>,
linux-leds@vger.kernel.org, "Arnd Bergmann" <arnd@arndb.de>,
soc@kernel.org, "Gregory CLEMENT" <gregory.clement@bootlin.com>,
arm@kernel.org, "Andy Shevchenko" <andy@kernel.org>,
"Hans de Goede" <hdegoede@redhat.com>,
"Ilpo Järvinen" <ilpo.jarvinen@linux.intel.com>,
"Andrew Lunn" <andrew@lunn.ch>,
"Sebastian Hesselbarth" <sebastian.hesselbarth@gmail.com>,
"Marek Behún" <kabel@kernel.org>
Subject: [PATCH leds v2 05/11] leds: turris-omnia: Notify sysfs on MCU global LEDs brightness change
Date: Tue, 3 Sep 2024 12:19:24 +0200 [thread overview]
Message-ID: <20240903101930.16251-6-kabel@kernel.org> (raw)
In-Reply-To: <20240903101930.16251-1-kabel@kernel.org>
Recall that on Turris Omnia, the LED controller has a global brightness
property, which allows the user to make the front LED panel dimmer.
There is also a button on the front panel, which by default is
configured so that pressing it changes the global brightness to a lower
value (unless it is at 0%, in which case pressing the button changes the
global brightness to 100%).
Newer versions of the MCU firmware support informing the SOC that the
brightness was changed by button press event via an interrupt.
Now that we have the turris-omnia-mcu driver, which adds support for MCU
interrupts, add the ability to inform the userspace (via a sysfs
notification) that the global brightness was changed.
Signed-off-by: Marek Behún <kabel@kernel.org>
---
drivers/leds/leds-turris-omnia.c | 37 ++++++++++++++++++++++++++++++++
1 file changed, 37 insertions(+)
diff --git a/drivers/leds/leds-turris-omnia.c b/drivers/leds/leds-turris-omnia.c
index 82cf58fbe946..51b13d3d7476 100644
--- a/drivers/leds/leds-turris-omnia.c
+++ b/drivers/leds/leds-turris-omnia.c
@@ -33,6 +33,7 @@ struct omnia_leds {
struct i2c_client *client;
struct mutex lock;
bool has_gamma_correction;
+ struct kernfs_node *brightness_kn;
struct omnia_led leds[];
};
@@ -357,6 +358,21 @@ static struct attribute *omnia_led_controller_attrs[] = {
};
ATTRIBUTE_GROUPS(omnia_led_controller);
+static irqreturn_t omnia_brightness_changed_handler(int irq, void *dev_id)
+{
+ struct omnia_leds *leds = dev_id;
+
+ if (unlikely(!leds->brightness_kn)) {
+ leds->brightness_kn = sysfs_get_dirent(leds->client->dev.kobj.sd, "brightness");
+ if (!leds->brightness_kn)
+ return IRQ_NONE;
+ }
+
+ sysfs_notify_dirent(leds->brightness_kn);
+
+ return IRQ_HANDLED;
+}
+
static int omnia_mcu_get_features(const struct i2c_client *client)
{
struct i2c_client mcu_client = *client;
@@ -420,6 +436,14 @@ static int omnia_leds_probe(struct i2c_client *client)
"Consider upgrading MCU firmware with the omnia-mcutool utility.\n");
}
+ if (ret & OMNIA_FEAT_BRIGHTNESS_INT) {
+ ret = devm_request_any_context_irq(dev, client->irq,
+ omnia_brightness_changed_handler, IRQF_ONESHOT,
+ "leds-turris-omnia", leds);
+ if (ret <= 0)
+ return dev_err_probe(dev, ret ?: -ENXIO, "Cannot request brightness IRQ\n");
+ }
+
mutex_init(&leds->lock);
ret = devm_led_trigger_register(dev, &omnia_hw_trigger);
@@ -442,6 +466,19 @@ static int omnia_leds_probe(struct i2c_client *client)
static void omnia_leds_remove(struct i2c_client *client)
{
+ struct omnia_leds *leds = i2c_get_clientdata(client);
+
+ /*
+ * We need to free the brightness IRQ here, before putting away the brightness sysfs node.
+ * Otherwise devres would free the interrupt only after the sysfs node is removed, and if
+ * an interrupt occurred between those two events, it would use a removed sysfs node.
+ */
+ devm_free_irq(&client->dev, client->irq, leds);
+
+ /* Now put away the sysfs node we got the first time the interrupt handler was called */
+ if (leds->brightness_kn)
+ sysfs_put(leds->brightness_kn);
+
/* put all LEDs into default (HW triggered) mode */
omnia_cmd_write_u8(client, OMNIA_CMD_LED_MODE, OMNIA_CMD_LED_MODE_LED(OMNIA_BOARD_LEDS));
--
2.44.2
next prev parent reply other threads:[~2024-09-03 10:19 UTC|newest]
Thread overview: 19+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-09-03 10:19 [PATCH leds v2 00/11] Turris Omnia LED driver changes Marek Behún
2024-09-03 10:19 ` [PATCH leds v2 01/11] turris-omnia-mcu-interface.h: Move command execution function to global header Marek Behún
2024-09-03 10:19 ` [PATCH leds v2 02/11] leds: turris-omnia: Use command execution functions from the MCU driver Marek Behún
2024-09-03 10:19 ` [PATCH leds v2 03/11] turris-omnia-mcu-interface.h: Add LED commands related definitions to global header Marek Behún
2024-09-03 10:19 ` [PATCH leds v2 04/11] leds: turris-omnia: Use global header for MCU command definitions Marek Behún
2024-09-03 10:19 ` Marek Behún [this message]
2024-09-03 10:19 ` [PATCH leds v2 06/11] platform: cznic: turris-omnia-mcu: Inform about missing LED panel brightness change interrupt feature Marek Behún
2024-09-03 10:19 ` [PATCH leds v2 07/11] leds: turris-omnia: Inform about missing LED gamma correction feature in the MCU driver Marek Behún
2024-09-03 10:19 ` [PATCH leds v2 08/11] leds: turris-omnia: Use dev_err_probe() where appropriate Marek Behún
2024-09-03 10:45 ` Andy Shevchenko
2024-09-03 15:56 ` Andrew Lunn
2024-09-03 16:28 ` Andy Shevchenko
2024-09-04 7:37 ` Marek Behún
2024-09-03 10:19 ` [PATCH leds v2 09/11] leds: turris-omnia: Use uppercase first letter in all comments Marek Behún
2024-09-03 10:19 ` [PATCH leds v2 10/11] leds: turris-omnia: Use 100 columns in the rest of the code Marek Behún
2024-09-03 13:21 ` Arnd Bergmann
2024-09-04 7:28 ` Marek Behún
2024-09-03 10:19 ` [PATCH leds v2 11/11] ARM: dts: turris-omnia: Add global LED brightness change interrupt Marek Behún
2024-09-03 14:26 ` [PATCH leds v2 00/11] Turris Omnia LED driver changes Rob Herring (Arm)
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20240903101930.16251-6-kabel@kernel.org \
--to=kabel@kernel.org \
--cc=andrew@lunn.ch \
--cc=andy@kernel.org \
--cc=arm@kernel.org \
--cc=arnd@arndb.de \
--cc=gregory.clement@bootlin.com \
--cc=hdegoede@redhat.com \
--cc=ilpo.jarvinen@linux.intel.com \
--cc=lee@kernel.org \
--cc=linux-leds@vger.kernel.org \
--cc=pavel@ucw.cz \
--cc=sebastian.hesselbarth@gmail.com \
--cc=soc@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.