linux-leds.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 0/3] leds: turris-omnia: updates
@ 2022-07-04 10:59 Marek Behún
  2022-07-04 10:59 ` [PATCH 1/3] leds: turris-omnia: support HW controlled mode via private trigger Marek Behún
                   ` (3 more replies)
  0 siblings, 4 replies; 6+ messages in thread
From: Marek Behún @ 2022-07-04 10:59 UTC (permalink / raw)
  To: Pavel Machek, linux-leds; +Cc: pali, Josef Schlehofer, Marek Behún

Hello Pavel,

the upstream leds-turris-omnia driver is disabled in upstream Omnia
device-tree and isn't used by TurrisOS because it does not support
enabling HW control. This is because I wanted to implement it via
netdev trigger transparent offloading, but I still wasn't able to
implement this satisfactorily (and truthfully haven't had much time
to look into this for almost half a year now).

Let's implement this in the meantime via the private trigger
mechanism that we added two years ago.

In the future if netdev offloading gets implemented, we can still
keep this implementation if backwards compatibility is desired, or
we can just drop it.

Marek

Marek Behún (3):
  leds: turris-omnia: support HW controlled mode via private trigger
  leds: turris-omnia: initialize multi-intensity to full
  leds: turris-omnia: change max brightness from 255 to 1

 drivers/leds/Kconfig             |  1 +
 drivers/leds/leds-turris-omnia.c | 46 +++++++++++++++++++++++++++++++-
 2 files changed, 46 insertions(+), 1 deletion(-)

-- 
2.35.1


^ permalink raw reply	[flat|nested] 6+ messages in thread

* [PATCH 1/3] leds: turris-omnia: support HW controlled mode via private trigger
  2022-07-04 10:59 [PATCH 0/3] leds: turris-omnia: updates Marek Behún
@ 2022-07-04 10:59 ` Marek Behún
  2022-07-04 10:59 ` [PATCH 2/3] leds: turris-omnia: initialize multi-intensity to full Marek Behún
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 6+ messages in thread
From: Marek Behún @ 2022-07-04 10:59 UTC (permalink / raw)
  To: Pavel Machek, linux-leds; +Cc: pali, Josef Schlehofer, Marek Behún

Add support for enabling MCU controlled mode of the Turris Omnia LEDs
via a LED private trigger called "omnia-mcu".

When in MCU controlled mode, the user can still set LED color, but the
blinking is done by MCU, which does different things for various LEDs:
- WAN LED is blinked according to the LED[0] pin of the WAN PHY
- LAN LEDs are blinked according to the LED[0] output of corresponding
  port of the LAN switch
- PCIe LEDs are blinked according to the logical OR of the MiniPCIe port
  LED pins

For a long time I wanted to actually do this differently: I wanted to
make the netdev trigger to transparently offload the blinking to the HW
if user set compatible settings for the netdev trigger.
There was some work on this, and hopefully we will be able to complete
it sometime, but since there are various complications, it will probably
not be soon.

In the meantime let's support HW controlled mode via this private LED
trigger. If, in the future, we manage to complete the netdev trigger
offloading, we can still keep this private trigger for backwards
compatiblity, if needed.

We also set "omnia-mcu" to cdev->default_trigger, so that the MCU keeps
control until the user first wants to take over it. If a different
default trigger is specified in device-tree via the
`linux,default-trigger` property, LED class will overwrite
cdev->default_trigger, and so the DT property will be respected.

Signed-off-by: Marek Behún <kabel@kernel.org>
---
 drivers/leds/Kconfig             |  1 +
 drivers/leds/leds-turris-omnia.c | 41 ++++++++++++++++++++++++++++++++
 2 files changed, 42 insertions(+)

diff --git a/drivers/leds/Kconfig b/drivers/leds/Kconfig
index a49979f41eee..bc148320416d 100644
--- a/drivers/leds/Kconfig
+++ b/drivers/leds/Kconfig
@@ -163,6 +163,7 @@ config LEDS_TURRIS_OMNIA
 	depends on I2C
 	depends on MACH_ARMADA_38X || COMPILE_TEST
 	depends on OF
+	select LEDS_TRIGGERS
 	help
 	  This option enables basic support for the LEDs found on the front
 	  side of CZ.NIC's Turris Omnia router. There are 12 RGB LEDs on the
diff --git a/drivers/leds/leds-turris-omnia.c b/drivers/leds/leds-turris-omnia.c
index 1adfed1c0619..c2dfb22d3065 100644
--- a/drivers/leds/leds-turris-omnia.c
+++ b/drivers/leds/leds-turris-omnia.c
@@ -41,6 +41,39 @@ struct omnia_leds {
 	struct omnia_led leds[];
 };
 
+static struct led_hw_trigger_type omnia_hw_trigger_type;
+
+static int omnia_hwtrig_activate(struct led_classdev *cdev)
+{
+	struct omnia_leds *leds = dev_get_drvdata(cdev->dev->parent);
+	struct omnia_led *led = to_omnia_led(lcdev_to_mccdev(cdev));
+
+	/* put the LED into MCU controlled mode */
+	return i2c_smbus_write_byte_data(leds->client, CMD_LED_MODE,
+					 CMD_LED_MODE_LED(led->reg));
+}
+
+static void omnia_hwtrig_deactivate(struct led_classdev *cdev)
+{
+	struct omnia_leds *leds = dev_get_drvdata(cdev->dev->parent);
+	struct omnia_led *led = to_omnia_led(lcdev_to_mccdev(cdev));
+	int ret;
+
+	/* put the LED into software mode */
+	ret = i2c_smbus_write_byte_data(leds->client, CMD_LED_MODE,
+					CMD_LED_MODE_LED(led->reg) |
+					CMD_LED_MODE_USER);
+	if (ret < 0)
+		dev_err(cdev->dev, "Cannot put to software mode: %i\n", ret);
+}
+
+static struct led_trigger omnia_hw_trigger = {
+	.name		= "omnia-mcu",
+	.activate	= omnia_hwtrig_activate,
+	.deactivate	= omnia_hwtrig_deactivate,
+	.trigger_type	= &omnia_hw_trigger_type,
+};
+
 static int omnia_led_brightness_set_blocking(struct led_classdev *cdev,
 					     enum led_brightness brightness)
 {
@@ -112,6 +145,8 @@ static int omnia_led_register(struct i2c_client *client, struct omnia_led *led,
 	cdev = &led->mc_cdev.led_cdev;
 	cdev->max_brightness = 255;
 	cdev->brightness_set_blocking = omnia_led_brightness_set_blocking;
+	cdev->trigger_type = &omnia_hw_trigger_type;
+	cdev->default_trigger = omnia_hw_trigger.name;
 
 	/* put the LED into software mode */
 	ret = i2c_smbus_write_byte_data(client, CMD_LED_MODE,
@@ -228,6 +263,12 @@ static int omnia_leds_probe(struct i2c_client *client,
 
 	mutex_init(&leds->lock);
 
+	ret = devm_led_trigger_register(dev, &omnia_hw_trigger);
+	if (ret < 0) {
+		dev_err(dev, "Cannot register private LED trigger: %d\n", ret);
+		return ret;
+	}
+
 	led = &leds->leds[0];
 	for_each_available_child_of_node(np, child) {
 		ret = omnia_led_register(client, led, child);
-- 
2.35.1


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PATCH 2/3] leds: turris-omnia: initialize multi-intensity to full
  2022-07-04 10:59 [PATCH 0/3] leds: turris-omnia: updates Marek Behún
  2022-07-04 10:59 ` [PATCH 1/3] leds: turris-omnia: support HW controlled mode via private trigger Marek Behún
@ 2022-07-04 10:59 ` Marek Behún
  2022-07-04 10:59 ` [PATCH 3/3] leds: turris-omnia: change max brightness from 255 to 1 Marek Behún
  2022-11-02  0:23 ` [PATCH 0/3] leds: turris-omnia: updates Pali Rohár
  3 siblings, 0 replies; 6+ messages in thread
From: Marek Behún @ 2022-07-04 10:59 UTC (permalink / raw)
  To: Pavel Machek, linux-leds; +Cc: pali, Josef Schlehofer, Marek Behún

The default color of each LED before driver probe (255, 255, 255).
Initialize multi_intensity to this value, so that it corresponds to the
reality.

Signed-off-by: Marek Behún <kabel@kernel.org>
---
 drivers/leds/leds-turris-omnia.c | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/drivers/leds/leds-turris-omnia.c b/drivers/leds/leds-turris-omnia.c
index c2dfb22d3065..fae155bd119c 100644
--- a/drivers/leds/leds-turris-omnia.c
+++ b/drivers/leds/leds-turris-omnia.c
@@ -131,10 +131,13 @@ static int omnia_led_register(struct i2c_client *client, struct omnia_led *led,
 	}
 
 	led->subled_info[0].color_index = LED_COLOR_ID_RED;
+	led->subled_info[0].intensity = 255;
 	led->subled_info[0].channel = 0;
 	led->subled_info[1].color_index = LED_COLOR_ID_GREEN;
+	led->subled_info[1].intensity = 255;
 	led->subled_info[1].channel = 1;
 	led->subled_info[2].color_index = LED_COLOR_ID_BLUE;
+	led->subled_info[2].intensity = 255;
 	led->subled_info[2].channel = 2;
 
 	led->mc_cdev.subled_info = led->subled_info;
-- 
2.35.1


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PATCH 3/3] leds: turris-omnia: change max brightness from 255 to 1
  2022-07-04 10:59 [PATCH 0/3] leds: turris-omnia: updates Marek Behún
  2022-07-04 10:59 ` [PATCH 1/3] leds: turris-omnia: support HW controlled mode via private trigger Marek Behún
  2022-07-04 10:59 ` [PATCH 2/3] leds: turris-omnia: initialize multi-intensity to full Marek Behún
@ 2022-07-04 10:59 ` Marek Behún
  2022-11-02  0:23 ` [PATCH 0/3] leds: turris-omnia: updates Pali Rohár
  3 siblings, 0 replies; 6+ messages in thread
From: Marek Behún @ 2022-07-04 10:59 UTC (permalink / raw)
  To: Pavel Machek, linux-leds; +Cc: pali, Josef Schlehofer, Marek Behún

Using binary brightness makes more sense for this controller, because
internally in the MCU it works that way: the LED has a color, and a
state whether it is ON or OFF.

The resulting brightness computation with led_mc_calc_color_components()
will now always result in either (0, 0, 0) or the multi_intensity value.

Signed-off-by: Marek Behún <kabel@kernel.org>
---
 drivers/leds/leds-turris-omnia.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/leds/leds-turris-omnia.c b/drivers/leds/leds-turris-omnia.c
index fae155bd119c..f53bdc3f4cea 100644
--- a/drivers/leds/leds-turris-omnia.c
+++ b/drivers/leds/leds-turris-omnia.c
@@ -146,7 +146,7 @@ static int omnia_led_register(struct i2c_client *client, struct omnia_led *led,
 	init_data.fwnode = &np->fwnode;
 
 	cdev = &led->mc_cdev.led_cdev;
-	cdev->max_brightness = 255;
+	cdev->max_brightness = 1;
 	cdev->brightness_set_blocking = omnia_led_brightness_set_blocking;
 	cdev->trigger_type = &omnia_hw_trigger_type;
 	cdev->default_trigger = omnia_hw_trigger.name;
-- 
2.35.1


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [PATCH 0/3] leds: turris-omnia: updates
  2022-07-04 10:59 [PATCH 0/3] leds: turris-omnia: updates Marek Behún
                   ` (2 preceding siblings ...)
  2022-07-04 10:59 ` [PATCH 3/3] leds: turris-omnia: change max brightness from 255 to 1 Marek Behún
@ 2022-11-02  0:23 ` Pali Rohár
  2023-03-04  7:25   ` Josef Schlehofer
  3 siblings, 1 reply; 6+ messages in thread
From: Pali Rohár @ 2022-11-02  0:23 UTC (permalink / raw)
  To: Marek Behún; +Cc: Pavel Machek, linux-leds, Josef Schlehofer

Ping? Gentle reminder.

On Monday 04 July 2022 12:59:52 Marek Behún wrote:
> Hello Pavel,
> 
> the upstream leds-turris-omnia driver is disabled in upstream Omnia
> device-tree and isn't used by TurrisOS because it does not support
> enabling HW control. This is because I wanted to implement it via
> netdev trigger transparent offloading, but I still wasn't able to
> implement this satisfactorily (and truthfully haven't had much time
> to look into this for almost half a year now).
> 
> Let's implement this in the meantime via the private trigger
> mechanism that we added two years ago.
> 
> In the future if netdev offloading gets implemented, we can still
> keep this implementation if backwards compatibility is desired, or
> we can just drop it.
> 
> Marek
> 
> Marek Behún (3):
>   leds: turris-omnia: support HW controlled mode via private trigger
>   leds: turris-omnia: initialize multi-intensity to full
>   leds: turris-omnia: change max brightness from 255 to 1
> 
>  drivers/leds/Kconfig             |  1 +
>  drivers/leds/leds-turris-omnia.c | 46 +++++++++++++++++++++++++++++++-
>  2 files changed, 46 insertions(+), 1 deletion(-)
> 
> -- 
> 2.35.1
> 

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH 0/3] leds: turris-omnia: updates
  2022-11-02  0:23 ` [PATCH 0/3] leds: turris-omnia: updates Pali Rohár
@ 2023-03-04  7:25   ` Josef Schlehofer
  0 siblings, 0 replies; 6+ messages in thread
From: Josef Schlehofer @ 2023-03-04  7:25 UTC (permalink / raw)
  To: Pali Rohár, Marek Behún; +Cc: Pavel Machek, linux-leds


[-- Attachment #1.1: Type: text/plain, Size: 1306 bytes --]

A kind reminder here.

On 02. 11. 22 1:23, Pali Rohár wrote:
> Ping? Gentle reminder.
>
> On Monday 04 July 2022 12:59:52 Marek Behún wrote:
>> Hello Pavel,
>>
>> the upstream leds-turris-omnia driver is disabled in upstream Omnia
>> device-tree and isn't used by TurrisOS because it does not support
>> enabling HW control. This is because I wanted to implement it via
>> netdev trigger transparent offloading, but I still wasn't able to
>> implement this satisfactorily (and truthfully haven't had much time
>> to look into this for almost half a year now).
>>
>> Let's implement this in the meantime via the private trigger
>> mechanism that we added two years ago.
>>
>> In the future if netdev offloading gets implemented, we can still
>> keep this implementation if backwards compatibility is desired, or
>> we can just drop it.
>>
>> Marek
>>
>> Marek Behún (3):
>>    leds: turris-omnia: support HW controlled mode via private trigger
>>    leds: turris-omnia: initialize multi-intensity to full
>>    leds: turris-omnia: change max brightness from 255 to 1
>>
>>   drivers/leds/Kconfig             |  1 +
>>   drivers/leds/leds-turris-omnia.c | 46 +++++++++++++++++++++++++++++++-
>>   2 files changed, 46 insertions(+), 1 deletion(-)
>>
>> -- 
>> 2.35.1
>>

[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 665 bytes --]

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2023-03-04  7:31 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2022-07-04 10:59 [PATCH 0/3] leds: turris-omnia: updates Marek Behún
2022-07-04 10:59 ` [PATCH 1/3] leds: turris-omnia: support HW controlled mode via private trigger Marek Behún
2022-07-04 10:59 ` [PATCH 2/3] leds: turris-omnia: initialize multi-intensity to full Marek Behún
2022-07-04 10:59 ` [PATCH 3/3] leds: turris-omnia: change max brightness from 255 to 1 Marek Behún
2022-11-02  0:23 ` [PATCH 0/3] leds: turris-omnia: updates Pali Rohár
2023-03-04  7:25   ` Josef Schlehofer

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).