All of lore.kernel.org
 help / color / mirror / Atom feed
From: Johannes Berg <johannes@sipsolutions.net>
To: Richard Purdie <rpurdie@rpsys.net>
Cc: Andrew Morton <akpm@linux-foundation.org>,
	LKML <linux-kernel@vger.kernel.org>
Subject: Re: [RFC] led-class: always implement blinking
Date: Wed, 22 Sep 2010 10:56:06 +0200	[thread overview]
Message-ID: <1285145766.3684.6.camel@jlt3.sipsolutions.net> (raw)
In-Reply-To: <1285104248.1290.551.camel@rex>

On Tue, 2010-09-21 at 22:24 +0100, Richard Purdie wrote:

> > Well, this function gets assigned to led_cdev->blink_set(), which is a
> > function pointer that takes pass-by-reference arguments. The comment
> > there says:
> > 
> >         /* Activate hardware accelerated blink, delays are in
> >          * miliseconds and if none is provided then a sensible default
> >          * should be chosen. The call can adjust the timings if it can't
> >          * match the values specified exactly. */
> >         int             (*blink_set)(struct led_classdev *led_cdev,
> >                                      unsigned long *delay_on,
> >                                      unsigned long *delay_off);
> > 
> > but the software implementation doesn't adjust the timings, of course. I
> > suppose the "adjust the timings" was also meant to update the values.
> 
> The idea was that hardware fallbacks would let the caller know what
> values it had actually fallen back to. The software fallback using
> timers is generic so doesn't need to change the values.
> 
> I've been meaning to look more closely at the patch but I haven't got to
> it yet, sorry :(.

Right. But I actually ran into problems here. I had to add another
"blink_stop" software function, because even though the _internal_ code
in led-class.c currently assumes calling blink_set(0, 0) will stop
blinking, the documentation says that then it should chose a
"user-friendly" blinking speed... So there are bugs in the current
implementation, and not all LEDs implement this either.

Additionally, blink_set() may return an error, in which case software
fallback should be used.

I solved this yesterday in a new version of my patch by adding new API

void led_classdev_blink_set(*dev, *on, *off)

that will use blink_set() and then fall back to software.

HOWEVER, if you use that, then just doing brightness_set(dev, LED_OFF)
will not turn off blinking because we cannot hook into that from the
software blinking implementation. There are two ways to solve this:

a) provide a wrapper for brightness_set() as well, that will disable
   software blink, and should be used in preference of calling the
   function pointer directly, it may be an inline.

b) provide a function led_classdev_blink_stop() that will turn off the
   LED and stop the blinking

Which one would you prefer?

johannes


  reply	other threads:[~2010-09-22  8:56 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-08-20  9:21 [RFC] led-class: always implement blinking Johannes Berg
2010-09-16 12:04 ` Johannes Berg
2010-09-21 19:44 ` Andrew Morton
2010-09-21 19:48   ` Johannes Berg
2010-09-21 19:51     ` Johannes Berg
2010-09-21 21:24     ` Richard Purdie
2010-09-22  8:56       ` Johannes Berg [this message]
2010-09-22  9:45       ` [PATCH v2] " Johannes Berg
2010-09-22 13:53         ` [PATCH v3] " Johannes Berg
2010-09-23 22:35           ` Andrew Morton
2010-09-24  9:29             ` Johannes Berg

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=1285145766.3684.6.camel@jlt3.sipsolutions.net \
    --to=johannes@sipsolutions.net \
    --cc=akpm@linux-foundation.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=rpurdie@rpsys.net \
    /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.