linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Jacek Anaszewski <jacek.anaszewski@gmail.com>
To: Pavel Machek <pavel@ucw.cz>, Luca Weiss <luca@z3ntu.xyz>
Cc: linux-leds@vger.kernel.org,
	~postmarketos/upstreaming@lists.sr.ht,
	Dan Murphy <dmurphy@ti.com>,
	linux-kernel@vger.kernel.org
Subject: Re: [RFC PATCH] leds: add sgm3140 driver
Date: Sun, 8 Mar 2020 18:07:04 +0100	[thread overview]
Message-ID: <1e28bc6e-3316-46b1-e8b3-6cf252b4939c@gmail.com> (raw)
In-Reply-To: <20200308120855.GA29321@duo.ucw.cz>

On 3/8/20 1:08 PM, Pavel Machek wrote:
> Hi!
> 
>> Add a driver for the SGMICRO SGM3140 Buck/Boost Charge Pump LED driver.
> 
> That's pinephone, right?
> 
>> This device is controller by two GPIO lines, one for enabling the LED
>> and the second one for switching between torch and flash mode.
>>
>> The device will automatically switch to torch mode after being in flash
>> mode for about 250-300ms, so after that time the driver will turn the
>> LED off again automatically.
> 
> I don't quite see how this is supposed to work.
> 
>> Hi, this driver is controllable via sysfs and v4l2 APIs (as documented
>> in Documentation/leds/leds-class-flash.rst).
>>
>> The following is possible:
>>
>> # Torch on
>> echo 1 > /sys/class/leds/white\:flash/brightness
>> # Torch off
>> echo 0 > /sys/class/leds/white\:flash/brightness
>> # Activate flash
>> echo 1 > /sys/class/leds/white\:flash/flash_strobe
> 
> So.. "activate flash" will turn the LED on in very bright mode, then
> put it back to previous brightness after a timeout?
> 
> What happens if some kind of malware does flash_strobe every 300msec?
> 
>> # Torch on
>> v4l2-ctl -d /dev/video1 -c led_mode=2
>> # Torch off
>> v4l2-ctl -d /dev/video1 -c led_mode=0
>> # Activate flash
>> v4l2-ctl -d /dev/video1 -c strobe=1
>>
>> Unfortunately the last command (enabling the 'flash' via v4l2 results in
>> the following being printed and nothing happening:
>>
>>   VIDIOC_S_EXT_CTRLS: failed: Resource busy
>>   strobe: Resource busy
>>
>> Unfortunately I couldn't figure out the reason so I'm hoping to get some
>> guidance for this. iirc it worked at some point but then stopped.
> 
> Actually, LED flash drivers are getting quite common. Having common
> code (so we could just say this is led flash, register it to both v4l
> and LED) might be quite interesting.
> 
> Unfortunately, some LED flashes also have integrated red LED for
> indication, further complicating stuff.

Everything you're talking about here is already implemented
and Luca makes use of that.

Indicator LEDs are covered as well.

>> diff --git a/drivers/leds/Makefile b/drivers/leds/Makefile
>> index 2da39e896ce8..38d57dd53e4b 100644
>> --- a/drivers/leds/Makefile
>> +++ b/drivers/leds/Makefile
>> @@ -85,6 +85,7 @@ obj-$(CONFIG_LEDS_LM3601X)		+= leds-lm3601x.o
>>  obj-$(CONFIG_LEDS_TI_LMU_COMMON)	+= leds-ti-lmu-common.o
>>  obj-$(CONFIG_LEDS_LM3697)		+= leds-lm3697.o
>>  obj-$(CONFIG_LEDS_LM36274)		+= leds-lm36274.o
>> +obj-$(CONFIG_LEDS_SGM3140)		+= leds-sgm3140.o
> 
> I would not mind "flash" drivers going to separate directory.
> 
>> +int sgm3140_brightness_set(struct led_classdev *led_cdev,
>> +			   enum led_brightness brightness)
>> +{
>> +	struct led_classdev_flash *fled_cdev = lcdev_to_flcdev(led_cdev);
>> +	struct sgm3140 *priv = flcdev_to_sgm3140(fled_cdev);
>> +
>> +	if (brightness == LED_OFF)
>> +		gpiod_set_value_cansleep(priv->enable_gpio, 0);
>> +	else
>> +		gpiod_set_value_cansleep(priv->enable_gpio, 1);
>> +
>> +	return 0;
>> +}
> 
> Umm. So this cancels running strobe?
> 
>> +static void sgm3140_powerdown_timer(struct timer_list *t)
>> +{
>> +	struct sgm3140 *priv = from_timer(priv, t, powerdown_timer);
>> +
>> +	gpiod_set_value_cansleep(priv->enable_gpio, 0);
>> +	gpiod_set_value_cansleep(priv->flash_gpio, 0);
>> +}
> 
> And this does not return to previous brightness.
> 
> Do we want to provide the "strobe" functionality through sysfs at all?
> Should we make it v4l-only, and independend of the LED stuff?

It was being discussed six years ago and the interface is in place.

Have you looked at drivers/leds/led-class-flash.c?

-- 
Best regards,
Jacek Anaszewski

  parent reply	other threads:[~2020-03-08 17:07 UTC|newest]

Thread overview: 14+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-02-27 18:50 [RFC PATCH] leds: add sgm3140 driver Luca Weiss
2020-02-27 19:50 ` Dan Murphy
2020-03-05 11:01   ` Luca Weiss
2020-03-05 12:54     ` Dan Murphy
2020-03-05 21:09 ` Jacek Anaszewski
2020-03-08 11:32   ` Luca Weiss
2020-03-08 16:47     ` Jacek Anaszewski
2020-03-08 16:55       ` Luca Weiss
2020-03-08 17:21         ` Jacek Anaszewski
2020-03-08 12:08 ` Pavel Machek
2020-03-08 12:31   ` Luca Weiss
2020-03-08 17:07   ` Jacek Anaszewski [this message]
2020-03-08 12:11 ` Pavel Machek
2020-03-08 12:37   ` Luca Weiss

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=1e28bc6e-3316-46b1-e8b3-6cf252b4939c@gmail.com \
    --to=jacek.anaszewski@gmail.com \
    --cc=dmurphy@ti.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-leds@vger.kernel.org \
    --cc=luca@z3ntu.xyz \
    --cc=pavel@ucw.cz \
    --cc=~postmarketos/upstreaming@lists.sr.ht \
    /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 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).