mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Baolin Wang <baolin.wang@linaro.org>
To: Jacek Anaszewski <jacek.anaszewski@gmail.com>
Cc: Pavel Machek <pavel@ucw.cz>,
	rteysseyre@gmail.com,
	Bjorn Andersson <bjorn.andersson@linaro.org>,
	Mark Brown <broonie@kernel.org>,
	Linux LED Subsystem <linux-leds@vger.kernel.org>,
	LKML <linux-kernel@vger.kernel.org>
Subject: Re: [PATCH v5 1/2] leds: core: Introduce LED pattern trigger
Date: Thu, 30 Aug 2018 15:39:14 +0800	[thread overview]
Message-ID: <CAMz4kuL1Wia-dWpqDNwzyLDtTag-Rpd0eXe2KLRPjK4ZGhhVRw@mail.gmail.com> (raw)
In-Reply-To: <CAMz4kuKT=zcH_Kjc5FnvX98vw-5aNQMxMTs4aeqqiM6F4QGEuA@mail.gmail.com>

Hi Jacek,

On 30 August 2018 at 11:26, Baolin Wang <baolin.wang@linaro.org> wrote:
> Hi Jacek,
>
> On 30 August 2018 at 03:15, Jacek Anaszewski <jacek.anaszewski@gmail.com> wrote:
>> Hi Baolin,
>>
>> On 08/29/2018 11:48 AM, Baolin Wang wrote:
>>> Hi Jacek,
>>>
>>> On 29 August 2018 at 04:25, Jacek Anaszewski <jacek.anaszewski@gmail.com> wrote:
>>>> On 08/25/2018 09:51 AM, Baolin Wang wrote:
>>>>> On 25 August 2018 at 04:44, Jacek Anaszewski <jacek.anaszewski@gmail.com> wrote:
>>>>>> On 08/24/2018 10:12 PM, Pavel Machek wrote:
>>>>>>> On Fri 2018-08-24 21:49:50, Jacek Anaszewski wrote:
>>>>>>>> Hi Pavel,
>>>>>>>>
>>>>>>>> On 08/24/2018 12:11 PM, Pavel Machek wrote:
>>>>>>>>> Hi!
>>>>>>>>>
>>>>>>>>>> I think that it would be more flexible if software pattern fallback
>>>>>>>>>> was applied in case of pattern_set failure. Otherwise, it would
>>>>>>>>>> lead to the situation where LED class devices that support hardware
>>>>>>>>>> blinking couldn't be applied the same set of patterns as LED class
>>>>>>>>>> devices that don't implement pattern_set. The latter will always have to
>>>>>>>>>> resort to using software pattern engine which will accept far greater
>>>>>>>>>> amount of pattern combinations.
>>>>>>>>>>
>>>>>>>>>> In this case we need to discuss on what basis the decision will be
>>>>>>>>>> made on whether hardware or software engine will be used.
>>>>>>>>>>
>>>>>>>>>> Possible options coming to mind:
>>>>>>>>>> - an interface will be provided to determine max difference between
>>>>>>>>>>   the settings supported by the hardware and the settings requested by
>>>>>>>>>>   the user, that will result in aligning user's setting to the hardware
>>>>>>>>>>   capabilities
>>>>>>>>>> - the above alignment rate will be predefined instead
>>>>>>>>>> - hardware engine will be used only if user requests supported settings
>>>>>>>>>>   on the whole span of the requested pattern
>>>>>>>>>> - in each of the above cases it would be worth to think of the
>>>>>>>>>>   interface to show the scope of the settings supported by hardware
>>>>>>>>>
>>>>>>>>> I'd recommend keeping it simple. We use hardware engine if driver
>>>>>>>>> author thinks pattern is "close enough".
>>>>>>>>
>>>>>>>> The thing is that in the ledtrig-pattern v5 implementation there
>>>>>>>> is no option of using software fallback if pattern_set op
>>>>>>>> is initialized:
>>>>>>>>
>>>>>>>> +    if (led_cdev->pattern_set) {
>>>>>>>> +            return led_cdev->pattern_set(led_cdev, data->patterns,
>>>>>>>> +                                         data->npatterns, data->repeat);
>>>>>>>> +    }
>>>>>>>
>>>>>>> Yeah, that sounds wrong. (Sorry I did not pay enough attention).
>>>>>>>
>>>>>>> It pattern_set() returns special error code, it should just continue
>>>>>>> and use software pattern fallback.
>>>>>>
>>>>>> And now we can get back to the issue I was concerned about in the
>>>>>> email you replied to, i.e. what series of [brightness delta_t] tuples
>>>>>> should be written to the pattern file to enable hardware breathing
>>>>>> engine.
>>>>>
>>>>> OK. So now we've made a consensus to use the software pattern fallback
>>>>> if failed to set hardware pattern. How about introduce one interface
>>>>> to convert hardware patterns to software patterns if necessary?
>>>>>
>>>>> diff --git a/drivers/leds/trigger/ledtrig-pattern.c
>>>>> b/drivers/leds/trigger/ledtrig-pattern.c
>>>>> index 63b94a2..d46a641 100644
>>>>> --- a/drivers/leds/trigger/ledtrig-pattern.c
>>>>> +++ b/drivers/leds/trigger/ledtrig-pattern.c
>>>>> @@ -66,8 +66,15 @@ static int pattern_trig_start_pattern(struct
>>>>> pattern_trig_data *data,
>>>>>                 return 0;
>>>>>
>>>>>         if (led_cdev->pattern_set) {
>>>>> -               return led_cdev->pattern_set(led_cdev, data->patterns,
>>>>> -                                            data->npatterns, data->repeat);
>>>>> +               ret = led_cdev->pattern_set(led_cdev, data->patterns,
>>>>> +                                           data->npatterns, data->repeat);
>>>>> +               if (!ret)
>>>>> +                       return 0;
>>>>> +
>>>>> +               dev_warn(led_cdev->dev, "Failed to set hardware pattern\n");
>>>>> +
>>>>> +               if (led_cdev->pattern_convert)
>>>>> +                       led_cdev->pattern_convert(led_cdev,
>>>>
>>>> I can't see how it could help to assess if hw pattern
>>>> engine can launch given pattern, and with what accuracy.
>>>>
>>>> Instead, I propose to add a means for defining whether the pattern
>>>> to be set is intended for hardware pattern engine or for software
>>>> fallback. It could be either separate sysfs file e.g. hw_pattern,
>>>> or a modifier to the pattern written to the pattern file, e,g,
>>>>
>>>> echo "hw 100 2 200 3 100 2" > pattern
>>>>
>>>> hw format expected by given driver would have to be described
>>>> in the per-driver ABI documentation. All patterns without
>>>> "hw" prefix would enable software pattern engine.
>>>
>>> OK. So I did some optimization based on v5 according to suggestion, if
>>> you think this is okay for you, then I will send out the formal v6
>>> patch set.
>>>
>>> 1. echo "hw 100 2 200 3 100 2" > pattern
>>> Only for hardware pattern, if failed,  we will return error number.
>>
>> After thinking more about it, I'd opt for a separate file
>> dedicated to hardware pattern, e.g. hw_pattern, which would
>> be created only if the LED class driver implemented pattern_set op.
>>
>>> 2. echo "100 2 200 3 100 2" > pattern
>>> Will try to set hardware pattern firstly, if failed, will use software
>>> pattern instead.
>>>
>>> diff --git a/drivers/leds/trigger/ledtrig-pattern.c
>>> b/drivers/leds/trigger/ledtrig-pattern.c
>>> index 63b94a2..f08e797 100644
>>> --- a/drivers/leds/trigger/ledtrig-pattern.c
>>> +++ b/drivers/leds/trigger/ledtrig-pattern.c
>>> @@ -26,6 +26,7 @@ struct pattern_trig_data {
>>>       u32 repeat;
>>>       u32 last_repeat;
>>>       bool is_indefinite;
>>> +     bool is_hw_pattern;
>>>       struct timer_list timer;
>>>  };
>>>
>>> @@ -62,12 +63,21 @@ static void pattern_trig_timer_function(struct
>>> timer_list *t)
>>>  static int pattern_trig_start_pattern(struct pattern_trig_data *data,
>>>                                     struct led_classdev *led_cdev)
>>>  {
>>> +     int ret;
>>> +
>>>       if (!data->npatterns)
>>>               return 0;
>>>
>>>       if (led_cdev->pattern_set) {
>>> -             return led_cdev->pattern_set(led_cdev, data->patterns,
>>> +             ret = led_cdev->pattern_set(led_cdev, data->patterns,
>>>                                            data->npatterns, data->repeat);
>>> +             if (!ret)
>>> +                     return 0;
>>> +
>>> +             dev_warn(led_cdev->dev, "Failed to set hardware patterns\n");
>>> +
>>> +             if (data->is_hw_pattern)
>>> +                     return ret;
>>
>> With separate pattern files we could get rid of this ambiguity and
>> attempt calling pattern_set only if requested via hw_pattern file.
>> No software fallback should be employed in case of failure then.
>>
>> Similarly in case of requests originating from pattern file -
>> the software engine should be set up.
>
> Please correct me if I understood you incorrectly.
>
> So we should create the hw_pattern file if the LED class driver
> implemented pattern_set op, then no need use software fallback if it
> failed to set hardware pattern.
>
> If the LED class driver did not implement pattern_set op, we just show
> up pattern file for users, and we always use software pattern now.
>
> But AFAICT the V5 has implemented the logics, but did not change the
> pattern file name according to if LED class driver implemented
> pattern_set op. So now we just change the pattern file to hw_pattern
> file if pattern_set op is set?
>

Sorry for misunderstanding your points, now I realized we will create
2 files for software pattern and hardware pattern if the pattern_set
op was implemented. I submitted v6 patch set according to your
suggestion. Please help to review. Thanks.

-- 
Baolin Wang
Best Regards

  reply	other threads:[~2018-08-30  7:39 UTC|newest]

Thread overview: 23+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-08-06 12:05 Baolin Wang
2018-08-06 12:06 ` [PATCH v5 2/2] leds: sc27xx: Add pattern_set/clear interfaces for LED controller Baolin Wang
2018-08-07 21:54 ` [PATCH v5 1/2] leds: core: Introduce LED pattern trigger Jacek Anaszewski
2018-08-08  6:01   ` Baolin Wang
2018-08-08 21:28     ` Jacek Anaszewski
2018-08-09  5:48       ` Baolin Wang
2018-08-09 13:21         ` Jacek Anaszewski
2018-08-10 15:26           ` Baolin Wang
2018-08-10 18:10             ` Jacek Anaszewski
2018-08-11  2:17               ` Baolin Wang
2018-08-24 10:11   ` Pavel Machek
2018-08-24 19:49     ` Jacek Anaszewski
2018-08-24 20:12       ` Pavel Machek
2018-08-24 20:44         ` Jacek Anaszewski
2018-08-25  7:51           ` Baolin Wang
2018-08-28 20:25             ` Jacek Anaszewski
2018-08-28 21:13               ` Bjorn Andersson
2018-08-29 18:55                 ` Jacek Anaszewski
2018-08-29  9:48               ` Baolin Wang
2018-08-29 19:15                 ` Jacek Anaszewski
2018-08-30  3:26                   ` Baolin Wang
2018-08-30  7:39                     ` Baolin Wang [this message]
2018-08-28 20:47             ` Bjorn Andersson

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=CAMz4kuL1Wia-dWpqDNwzyLDtTag-Rpd0eXe2KLRPjK4ZGhhVRw@mail.gmail.com \
    --to=baolin.wang@linaro.org \
    --cc=bjorn.andersson@linaro.org \
    --cc=broonie@kernel.org \
    --cc=jacek.anaszewski@gmail.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-leds@vger.kernel.org \
    --cc=pavel@ucw.cz \
    --cc=rteysseyre@gmail.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®