Hi Pavel,

On 25 June 2018 at 20:18, Pavel Machek <pa...@ucw.cz> wrote:
> On Mon 2018-06-25 13:03:19, Baolin Wang wrote:
>> From: Bjorn Andersson <bjorn.anders...@linaro.org>
>>
>> Some LED controllers have support for autonomously controlling
>> brightness over time, according to some preprogrammed pattern or
>> function.
>>
>> This adds a new optional operator that LED class drivers can implement
>> if they support such functionality as well as a new device attribute to
>> configure the pattern for a given LED.
>
> Thanks for doing this!
>
>> index 5f67f7a..fe90a12 100644
>> --- a/Documentation/ABI/testing/sysfs-class-led
>> +++ b/Documentation/ABI/testing/sysfs-class-led
>> @@ -61,3 +61,19 @@ Description:
>>               gpio and backlight triggers. In case of the backlight trigger,
>>               it is useful when driving a LED which is intended to indicate
>>               a device in a standby like state.
>> +
>> +What: /sys/class/leds/<led>/pattern
>> +Date: June 2018
>> +KernelVersion: 4.18
>> +Description:
>> +     Specify a pattern for the LED, for LED hardware that support
>> +     altering the brightness as a function of time.
>> +
>> +     The pattern is given by a series of tuples, of brightness and
>> +     duration (ms). The LED is expected to traverse the series and
>> +     each brightness value for the specified duration.
>> +
>> +     As LED hardware might have different capabilities and precision
>> +     the requested pattern might be slighly adjusted by the driver
>> +     and the resulting pattern of such operation should be returned
>> +     when this file is read.
>
> I'd add "Duration of 0 means brightness should immediately change to
> new value."

Sure.

>
>> +     struct led_classdev *led_cdev = dev_get_drvdata(dev);
>> +     struct led_pattern *pattern = NULL;
>> +     unsigned long val;
>> +     char *sbegin;
>> +     char *elem;
>> +     char *s;
>> +     int ret, len = 0;
>> +     bool odd = true;
>> +
>> +     s = sbegin = kstrndup(buf, size, GFP_KERNEL);
>> +     if (!s)
>> +             return -ENOMEM;
>> +
>> +     /* Trim trailing newline */
>> +     s[strcspn(s, "\n")] = '\0';
>
> Is substring function best to use here? Will it do the right thing
> when \n is not present?

We always have a '\n' to present the end of the string passed from
userspace. Or anything I missed here?

>
>> +     /* If the remaining string is empty, clear the pattern */
>> +     if (!s[0]) {
>> +             ret = led_cdev->pattern_clear(led_cdev);
>> +             goto out;
>> +     }
>> +
>> +     pattern = kcalloc(size, sizeof(*pattern), GFP_KERNEL);
>> +     if (!pattern) {
>> +             ret = -ENOMEM;
>> +             goto out;
>> +     }
>> +
>> +     /* Parse out the brightness & delta_t touples and check for repeat */
>> +     while ((elem = strsep(&s, " ")) != NULL) {
>> +             ret = kstrtoul(elem, 10, &val);
>> +             if (ret)
>> +                     goto out;
>> +
>> +             if (odd) {
>> +                     pattern[len].brightness = val;
>> +             } else {
>> +                     /* Ensure we don't have any delta_t == 0 */
>> +                     if (!val) {
>> +                             ret = -EINVAL;
>> +                             goto out;
>> +                     }
>
> I believe we should support delta_t of 0 for "change immediately".

OK. Thanks for your comments.

-- 
Baolin Wang
Best Regards

Reply via email to