From: Lee Jones <lee@kernel.org>
To: Bastien Curutchet <bastien.curutchet@bootlin.com>
Cc: Riku Voipio <riku.voipio@iki.fi>, Pavel Machek <pavel@ucw.cz>,
linux-leds@vger.kernel.org, linux-kernel@vger.kernel.org,
Thomas Petazzoni <thomas.petazzoni@bootlin.com>,
herve.codina@bootlin.com, christophercordahi@nanometrics.ca
Subject: Re: [PATCH 1/3] leds: pca9532: Use PWM1 for hardware blinking
Date: Fri, 31 May 2024 15:55:23 +0100 [thread overview]
Message-ID: <20240531145523.GN1005600@google.com> (raw)
In-Reply-To: <20240527125940.155260-2-bastien.curutchet@bootlin.com>
On Mon, 27 May 2024, Bastien Curutchet wrote:
> PSC0/PWM0 are used by all leds for brightness and blinking. This causes
LEDs everywhere please.
> conflicts when you set a brightness of a new led while an other one is
> already using PWM0 for blinking.
>
> Use PSC1/PWM1 for blinking.
> Check that no other led is already blinking with a different PSC1/PWM1
> configuration to avoid conflict.
>
> Signed-off-by: Bastien Curutchet <bastien.curutchet@bootlin.com>
> ---
> drivers/leds/leds-pca9532.c | 49 ++++++++++++++++++++++++++++++-------
> 1 file changed, 40 insertions(+), 9 deletions(-)
>
> diff --git a/drivers/leds/leds-pca9532.c b/drivers/leds/leds-pca9532.c
> index bf8bb8fc007c..c210608ad336 100644
> --- a/drivers/leds/leds-pca9532.c
> +++ b/drivers/leds/leds-pca9532.c
> @@ -191,29 +191,60 @@ static int pca9532_set_brightness(struct led_classdev *led_cdev,
> return err;
> }
>
> +static int pca9532_update_hw_blink(struct pca9532_led *led,
> + unsigned long delay_on, unsigned long delay_off)
> +{
> + struct pca9532_data *data = i2c_get_clientdata(led->client);
> + unsigned int psc;
> + int i;
> +
> + /* Look for others leds that already use PWM1 */
> + for (i = 0; i < data->chip_info->num_leds; i++) {
> + struct pca9532_led *other = &data->leds[i];
> +
> + if (other == led)
> + continue;
Don't bunch things up please - new line here.
> + if (other->state == PCA9532_PWM1) {
> + if (other->ldev.blink_delay_on != delay_on ||
> + other->ldev.blink_delay_off != delay_off) {
> + dev_dbg(&led->client->dev,
> + "HW can handle only one blink configuration at a time\n");
> + return -EINVAL;
> + }
> + }
> + }
> +
> + psc = ((delay_on + delay_off) * 152 - 1) / 1000;
What are these funny magic numbers? Define them please.
> + if (psc > 255) {
And this.
> + dev_dbg(&led->client->dev, "Blink period too long to be handled by hardware\n");
If you're returning an error, this should be dev_err().
> + return -EINVAL;
> + }
> +
> + data->psc[1] = psc;
Can we define these indexes please?
> + data->pwm[1] = (delay_on * 255) / (delay_on + delay_off);
> +
> + return pca9532_setpwm(data->client, 1);
> +}
> +
> static int pca9532_set_blink(struct led_classdev *led_cdev,
> unsigned long *delay_on, unsigned long *delay_off)
> {
> struct pca9532_led *led = ldev_to_led(led_cdev);
> struct i2c_client *client = led->client;
> - int psc;
> - int err = 0;
> + struct pca9532_data *data = i2c_get_clientdata(client);
Did you build this with W=1? This looks unused.
> + int err;
>
> if (*delay_on == 0 && *delay_off == 0) {
> /* led subsystem ask us for a blink rate */
> *delay_on = 1000;
> *delay_off = 1000;
> }
> - if (*delay_on != *delay_off || *delay_on > 1690 || *delay_on < 6)
> - return -EINVAL;
>
> - /* Thecus specific: only use PSC/PWM 0 */
> - psc = (*delay_on * 152-1)/1000;
> - err = pca9532_calcpwm(client, 0, psc, led_cdev->brightness);
> + led->state = PCA9532_PWM1;
> + err = pca9532_update_hw_blink(led, *delay_on, *delay_off);
> if (err)
> return err;
> - if (led->state == PCA9532_PWM0)
> - pca9532_setpwm(led->client, 0);
> +
> pca9532_setled(led);
>
> return 0;
> --
> 2.44.0
>
--
Lee Jones [李琼斯]
next prev parent reply other threads:[~2024-05-31 14:55 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-05-27 12:59 [PATCH 0/3] leds: pca9532: Use hardware for blinking leds Bastien Curutchet
2024-05-27 12:59 ` [PATCH 1/3] leds: pca9532: Use PWM1 for hardware blinking Bastien Curutchet
2024-05-31 14:55 ` Lee Jones [this message]
2024-06-05 12:38 ` Bastien Curutchet
2024-05-27 12:59 ` [PATCH 2/3] leds: pca9532: Explicitly disable hardware blink when PWM1 is unavailable Bastien Curutchet
2024-05-27 12:59 ` [PATCH 3/3] leds: pca9532: Change default blinking frequency to 1Hz Bastien Curutchet
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=20240531145523.GN1005600@google.com \
--to=lee@kernel.org \
--cc=bastien.curutchet@bootlin.com \
--cc=christophercordahi@nanometrics.ca \
--cc=herve.codina@bootlin.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-leds@vger.kernel.org \
--cc=pavel@ucw.cz \
--cc=riku.voipio@iki.fi \
--cc=thomas.petazzoni@bootlin.com \
/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.