06 Apr, 2019

1 commit

  • [ Upstream commit 5ddb0869bfc1bca6cfc592c74c64a026f936638c ]

    I've stumbled upon a kernel crash and the logs
    pointed me towards the lp5562 driver:

    > [306013.841294] lp5562 0-0030: Direct firmware load for lp5562 failed with error -2
    > [306013.894990] lp5562 0-0030: Falling back to user helper
    > ...
    > [306073.924886] lp5562 0-0030: firmware request failed
    > [306073.939456] Unable to handle kernel NULL pointer dereference at virtual address 00000000
    > [306074.251011] PC is at _raw_spin_lock+0x1c/0x58
    > [306074.255539] LR is at release_firmware+0x6c/0x138
    > ...

    After taking a look I noticed firmware_release()
    could be called with either NULL or a dangling
    pointer.

    Fixes: 10c06d178df11 ("leds-lp55xx: support firmware interface")
    Signed-off-by: Michal Kazior
    Signed-off-by: Jacek Anaszewski
    Signed-off-by: Sasha Levin

    Michal Kazior
     

27 Feb, 2019

1 commit

  • [ Upstream commit 248b57015f35c94d4eae2fdd8c6febf5cd703900 ]

    When lp55xx_read() fails, "status" is an uninitialized variable and thus
    may contain random value; using it leads to undefined behaviors.

    The fix inserts a check for the return value of lp55xx_read: if it
    fails, returns with its error code.

    Signed-off-by: Kangjie Lu
    Signed-off-by: Jacek Anaszewski
    Signed-off-by: Sasha Levin

    Kangjie Lu
     

13 Jan, 2019

1 commit

  • commit 9aec30371fb095a0c9415f3f0146ae269c3713d8 upstream.

    When probing, if we fail to get the pwm due to probe deferal, we shouldn't
    print an error message. Just be silent in this case.

    Signed-off-by: Jerome Brunet
    Signed-off-by: Jacek Anaszewski
    Cc: Benjamin Drung
    Signed-off-by: Greg Kroah-Hartman

    Jerome Brunet
     

07 Aug, 2018

1 commit


06 Jul, 2018

13 commits

  • The trigger core learned error handling for the activate callback and
    to handle device attributes. Also make use of the module_led_trigger()
    helper to simplify trigger registration.

    Signed-off-by: Uwe Kleine-König
    Acked-by: Pavel Machek
    Signed-off-by: Jacek Anaszewski

    Uwe Kleine-König
     
  • Use the new module_led_trigger() helper. Also use
    attribute support from the trigger core. Drop error message on
    allocation failure as kzalloc() already screams loudly when failing. Use
    wrappers to get and set trigger data.

    Signed-off-by: Uwe Kleine-König
    Acked-by: Pavel Machek
    Signed-off-by: Jacek Anaszewski

    Uwe Kleine-König
     
  • The trigger core learned error handling for the activate callback and
    can handle device attributes now. This allows simplifying the driver
    considerably. Note that .deactivate() is only called when .activate()
    succeeded, so the check for .activated can go away in .deactivate().

    Also make use of module_led_trigger() and the accessor function to get
    and set trigger_data.

    Signed-off-by: Uwe Kleine-König
    Acked-by: Pavel Machek
    Signed-off-by: Jacek Anaszewski

    Uwe Kleine-König
     
  • This removes some boilerplate from the driver.

    Signed-off-by: Uwe Kleine-König
    Acked-by: Pavel Machek
    Signed-off-by: Jacek Anaszewski

    Uwe Kleine-König
     
  • The trigger core learned error handling for the activate callback and
    can handle device attributes now. This allows simplifying the driver
    considerably. Note that .deactivate() is only called when .activate()
    succeeded, so the check for .activated can go away in .deactivate().

    Also make use of module_led_trigger() and the accessor function to get
    and set trigger_data.

    Signed-off-by: Uwe Kleine-König
    Acked-by: Pavel Machek
    Signed-off-by: Jacek Anaszewski

    Uwe Kleine-König
     
  • The trigger core learned error handling for the activate callback and
    can handle device attributes now. This allows simplifying the driver
    considerably. Note that .deactivate() is only called when .activate()
    succeeded, so the check for .activated can go away in .deactivate().

    Also make use of module_led_trigger() and do some minor coding style
    improvements.

    Signed-off-by: Uwe Kleine-König
    Acked-by: Pavel Machek
    Signed-off-by: Jacek Anaszewski

    Uwe Kleine-König
     
  • The trigger core learned error handling for the activate callback and
    can handle device attributes now. This allows simplifying the driver
    considerably. Note that .deactivate() is only called when .activate()
    succeeded, so the check for .activated can go away.

    Signed-off-by: Uwe Kleine-König
    Acked-by: Pavel Machek
    Signed-off-by: Jacek Anaszewski

    Uwe Kleine-König
     
  • The trigger core learned error handling for the activate callback and
    can handle device attributes now. This allows simplifying the driver
    considerably. Note that .deactivate() is only called when .activate()
    succeeded, so the check for .trigger_data being non-NULL can go away.

    Signed-off-by: Uwe Kleine-König
    Acked-by: Pavel Machek
    Signed-off-by: Jacek Anaszewski

    Uwe Kleine-König
     
  • The trigger core learned error handling for the activate callback and
    can handle device attributes now. This allows simplifying the driver
    considerably. Note that .deactivate() is only called when .activate()
    succeeded, so the check for trigger_data being non-NULL can go away.
    (It was broken before because the core didn't clear .trigger_data, so it
    might have been non-NULL even if .activate() failed before.)

    Signed-off-by: Uwe Kleine-König
    Acked-by: Pavel Machek
    Signed-off-by: Jacek Anaszewski

    Uwe Kleine-König
     
  • This helps keeping these two fields consistent and drivers don't need to
    care for this themselves any more.

    Note that .activated isn't set to true automatically because that might
    confuse some triggers when deactivating (e.g. ledtrig-gpio).

    Signed-off-by: Uwe Kleine-König
    Acked-by: Pavel Machek
    Signed-off-by: Jacek Anaszewski

    Uwe Kleine-König
     
  • As many triggers use device attributes, add support for these in
    led_trigger_set which allows simplifying the drivers accordingly.

    Signed-off-by: Uwe Kleine-König
    Acked-by: Pavel Machek
    Signed-off-by: Jacek Anaszewski

    Uwe Kleine-König
     
  • Given that activating a trigger can fail, let the callback return an
    indication. This prevents to have a trigger active according to the
    "trigger" sysfs attribute but not functional.

    All users are changed accordingly to return 0 for now. There is no intended
    change in behaviour.

    Signed-off-by: Uwe Kleine-König
    Acked-by: Pavel Machek
    Signed-off-by: Jacek Anaszewski

    Uwe Kleine-König
     
  • These files are licensed under GPL version 2 only. So use "GPL v2"
    instead of "GPL" (which means v2 or later).

    Also remove an empty (but commented) line at the end of the license
    header which nicely proves in the context that the drivers are really v2
    only :-)

    Signed-off-by: Uwe Kleine-König
    Signed-off-by: Jacek Anaszewski

    Uwe Kleine-König
     

04 Jul, 2018

8 commits


29 Jun, 2018

2 commits


20 Jun, 2018

1 commit


13 Jun, 2018

2 commits

  • The devm_kzalloc() function has a 2-factor argument form, devm_kcalloc().
    This patch replaces cases of:

    devm_kzalloc(handle, a * b, gfp)

    with:
    devm_kcalloc(handle, a * b, gfp)

    as well as handling cases of:

    devm_kzalloc(handle, a * b * c, gfp)

    with:

    devm_kzalloc(handle, array3_size(a, b, c), gfp)

    as it's slightly less ugly than:

    devm_kcalloc(handle, array_size(a, b), c, gfp)

    This does, however, attempt to ignore constant size factors like:

    devm_kzalloc(handle, 4 * 1024, gfp)

    though any constants defined via macros get caught up in the conversion.

    Any factors with a sizeof() of "unsigned char", "char", and "u8" were
    dropped, since they're redundant.

    Some manual whitespace fixes were needed in this patch, as Coccinelle
    really liked to write "=devm_kcalloc..." instead of "= devm_kcalloc...".

    The Coccinelle script used for this was:

    // Fix redundant parens around sizeof().
    @@
    expression HANDLE;
    type TYPE;
    expression THING, E;
    @@

    (
    devm_kzalloc(HANDLE,
    - (sizeof(TYPE)) * E
    + sizeof(TYPE) * E
    , ...)
    |
    devm_kzalloc(HANDLE,
    - (sizeof(THING)) * E
    + sizeof(THING) * E
    , ...)
    )

    // Drop single-byte sizes and redundant parens.
    @@
    expression HANDLE;
    expression COUNT;
    typedef u8;
    typedef __u8;
    @@

    (
    devm_kzalloc(HANDLE,
    - sizeof(u8) * (COUNT)
    + COUNT
    , ...)
    |
    devm_kzalloc(HANDLE,
    - sizeof(__u8) * (COUNT)
    + COUNT
    , ...)
    |
    devm_kzalloc(HANDLE,
    - sizeof(char) * (COUNT)
    + COUNT
    , ...)
    |
    devm_kzalloc(HANDLE,
    - sizeof(unsigned char) * (COUNT)
    + COUNT
    , ...)
    |
    devm_kzalloc(HANDLE,
    - sizeof(u8) * COUNT
    + COUNT
    , ...)
    |
    devm_kzalloc(HANDLE,
    - sizeof(__u8) * COUNT
    + COUNT
    , ...)
    |
    devm_kzalloc(HANDLE,
    - sizeof(char) * COUNT
    + COUNT
    , ...)
    |
    devm_kzalloc(HANDLE,
    - sizeof(unsigned char) * COUNT
    + COUNT
    , ...)
    )

    // 2-factor product with sizeof(type/expression) and identifier or constant.
    @@
    expression HANDLE;
    type TYPE;
    expression THING;
    identifier COUNT_ID;
    constant COUNT_CONST;
    @@

    (
    - devm_kzalloc
    + devm_kcalloc
    (HANDLE,
    - sizeof(TYPE) * (COUNT_ID)
    + COUNT_ID, sizeof(TYPE)
    , ...)
    |
    - devm_kzalloc
    + devm_kcalloc
    (HANDLE,
    - sizeof(TYPE) * COUNT_ID
    + COUNT_ID, sizeof(TYPE)
    , ...)
    |
    - devm_kzalloc
    + devm_kcalloc
    (HANDLE,
    - sizeof(TYPE) * (COUNT_CONST)
    + COUNT_CONST, sizeof(TYPE)
    , ...)
    |
    - devm_kzalloc
    + devm_kcalloc
    (HANDLE,
    - sizeof(TYPE) * COUNT_CONST
    + COUNT_CONST, sizeof(TYPE)
    , ...)
    |
    - devm_kzalloc
    + devm_kcalloc
    (HANDLE,
    - sizeof(THING) * (COUNT_ID)
    + COUNT_ID, sizeof(THING)
    , ...)
    |
    - devm_kzalloc
    + devm_kcalloc
    (HANDLE,
    - sizeof(THING) * COUNT_ID
    + COUNT_ID, sizeof(THING)
    , ...)
    |
    - devm_kzalloc
    + devm_kcalloc
    (HANDLE,
    - sizeof(THING) * (COUNT_CONST)
    + COUNT_CONST, sizeof(THING)
    , ...)
    |
    - devm_kzalloc
    + devm_kcalloc
    (HANDLE,
    - sizeof(THING) * COUNT_CONST
    + COUNT_CONST, sizeof(THING)
    , ...)
    )

    // 2-factor product, only identifiers.
    @@
    expression HANDLE;
    identifier SIZE, COUNT;
    @@

    - devm_kzalloc
    + devm_kcalloc
    (HANDLE,
    - SIZE * COUNT
    + COUNT, SIZE
    , ...)

    // 3-factor product with 1 sizeof(type) or sizeof(expression), with
    // redundant parens removed.
    @@
    expression HANDLE;
    expression THING;
    identifier STRIDE, COUNT;
    type TYPE;
    @@

    (
    devm_kzalloc(HANDLE,
    - sizeof(TYPE) * (COUNT) * (STRIDE)
    + array3_size(COUNT, STRIDE, sizeof(TYPE))
    , ...)
    |
    devm_kzalloc(HANDLE,
    - sizeof(TYPE) * (COUNT) * STRIDE
    + array3_size(COUNT, STRIDE, sizeof(TYPE))
    , ...)
    |
    devm_kzalloc(HANDLE,
    - sizeof(TYPE) * COUNT * (STRIDE)
    + array3_size(COUNT, STRIDE, sizeof(TYPE))
    , ...)
    |
    devm_kzalloc(HANDLE,
    - sizeof(TYPE) * COUNT * STRIDE
    + array3_size(COUNT, STRIDE, sizeof(TYPE))
    , ...)
    |
    devm_kzalloc(HANDLE,
    - sizeof(THING) * (COUNT) * (STRIDE)
    + array3_size(COUNT, STRIDE, sizeof(THING))
    , ...)
    |
    devm_kzalloc(HANDLE,
    - sizeof(THING) * (COUNT) * STRIDE
    + array3_size(COUNT, STRIDE, sizeof(THING))
    , ...)
    |
    devm_kzalloc(HANDLE,
    - sizeof(THING) * COUNT * (STRIDE)
    + array3_size(COUNT, STRIDE, sizeof(THING))
    , ...)
    |
    devm_kzalloc(HANDLE,
    - sizeof(THING) * COUNT * STRIDE
    + array3_size(COUNT, STRIDE, sizeof(THING))
    , ...)
    )

    // 3-factor product with 2 sizeof(variable), with redundant parens removed.
    @@
    expression HANDLE;
    expression THING1, THING2;
    identifier COUNT;
    type TYPE1, TYPE2;
    @@

    (
    devm_kzalloc(HANDLE,
    - sizeof(TYPE1) * sizeof(TYPE2) * COUNT
    + array3_size(COUNT, sizeof(TYPE1), sizeof(TYPE2))
    , ...)
    |
    devm_kzalloc(HANDLE,
    - sizeof(TYPE1) * sizeof(THING2) * (COUNT)
    + array3_size(COUNT, sizeof(TYPE1), sizeof(TYPE2))
    , ...)
    |
    devm_kzalloc(HANDLE,
    - sizeof(THING1) * sizeof(THING2) * COUNT
    + array3_size(COUNT, sizeof(THING1), sizeof(THING2))
    , ...)
    |
    devm_kzalloc(HANDLE,
    - sizeof(THING1) * sizeof(THING2) * (COUNT)
    + array3_size(COUNT, sizeof(THING1), sizeof(THING2))
    , ...)
    |
    devm_kzalloc(HANDLE,
    - sizeof(TYPE1) * sizeof(THING2) * COUNT
    + array3_size(COUNT, sizeof(TYPE1), sizeof(THING2))
    , ...)
    |
    devm_kzalloc(HANDLE,
    - sizeof(TYPE1) * sizeof(THING2) * (COUNT)
    + array3_size(COUNT, sizeof(TYPE1), sizeof(THING2))
    , ...)
    )

    // 3-factor product, only identifiers, with redundant parens removed.
    @@
    expression HANDLE;
    identifier STRIDE, SIZE, COUNT;
    @@

    (
    devm_kzalloc(HANDLE,
    - (COUNT) * STRIDE * SIZE
    + array3_size(COUNT, STRIDE, SIZE)
    , ...)
    |
    devm_kzalloc(HANDLE,
    - COUNT * (STRIDE) * SIZE
    + array3_size(COUNT, STRIDE, SIZE)
    , ...)
    |
    devm_kzalloc(HANDLE,
    - COUNT * STRIDE * (SIZE)
    + array3_size(COUNT, STRIDE, SIZE)
    , ...)
    |
    devm_kzalloc(HANDLE,
    - (COUNT) * (STRIDE) * SIZE
    + array3_size(COUNT, STRIDE, SIZE)
    , ...)
    |
    devm_kzalloc(HANDLE,
    - COUNT * (STRIDE) * (SIZE)
    + array3_size(COUNT, STRIDE, SIZE)
    , ...)
    |
    devm_kzalloc(HANDLE,
    - (COUNT) * STRIDE * (SIZE)
    + array3_size(COUNT, STRIDE, SIZE)
    , ...)
    |
    devm_kzalloc(HANDLE,
    - (COUNT) * (STRIDE) * (SIZE)
    + array3_size(COUNT, STRIDE, SIZE)
    , ...)
    |
    devm_kzalloc(HANDLE,
    - COUNT * STRIDE * SIZE
    + array3_size(COUNT, STRIDE, SIZE)
    , ...)
    )

    // Any remaining multi-factor products, first at least 3-factor products,
    // when they're not all constants...
    @@
    expression HANDLE;
    expression E1, E2, E3;
    constant C1, C2, C3;
    @@

    (
    devm_kzalloc(HANDLE, C1 * C2 * C3, ...)
    |
    devm_kzalloc(HANDLE,
    - (E1) * E2 * E3
    + array3_size(E1, E2, E3)
    , ...)
    |
    devm_kzalloc(HANDLE,
    - (E1) * (E2) * E3
    + array3_size(E1, E2, E3)
    , ...)
    |
    devm_kzalloc(HANDLE,
    - (E1) * (E2) * (E3)
    + array3_size(E1, E2, E3)
    , ...)
    |
    devm_kzalloc(HANDLE,
    - E1 * E2 * E3
    + array3_size(E1, E2, E3)
    , ...)
    )

    // And then all remaining 2 factors products when they're not all constants,
    // keeping sizeof() as the second factor argument.
    @@
    expression HANDLE;
    expression THING, E1, E2;
    type TYPE;
    constant C1, C2, C3;
    @@

    (
    devm_kzalloc(HANDLE, sizeof(THING) * C2, ...)
    |
    devm_kzalloc(HANDLE, sizeof(TYPE) * C2, ...)
    |
    devm_kzalloc(HANDLE, C1 * C2 * C3, ...)
    |
    devm_kzalloc(HANDLE, C1 * C2, ...)
    |
    - devm_kzalloc
    + devm_kcalloc
    (HANDLE,
    - sizeof(TYPE) * (E2)
    + E2, sizeof(TYPE)
    , ...)
    |
    - devm_kzalloc
    + devm_kcalloc
    (HANDLE,
    - sizeof(TYPE) * E2
    + E2, sizeof(TYPE)
    , ...)
    |
    - devm_kzalloc
    + devm_kcalloc
    (HANDLE,
    - sizeof(THING) * (E2)
    + E2, sizeof(THING)
    , ...)
    |
    - devm_kzalloc
    + devm_kcalloc
    (HANDLE,
    - sizeof(THING) * E2
    + E2, sizeof(THING)
    , ...)
    |
    - devm_kzalloc
    + devm_kcalloc
    (HANDLE,
    - (E1) * E2
    + E1, E2
    , ...)
    |
    - devm_kzalloc
    + devm_kcalloc
    (HANDLE,
    - (E1) * (E2)
    + E1, E2
    , ...)
    |
    - devm_kzalloc
    + devm_kcalloc
    (HANDLE,
    - E1 * E2
    + E1, E2
    , ...)
    )

    Signed-off-by: Kees Cook

    Kees Cook
     
  • This case got missed by the earlier treewide struct_size() conversions.

    Signed-off-by: Kees Cook

    Kees Cook
     

25 May, 2018

1 commit

  • An application can try to set brightness before all the initialization is
    done, in particular before the workqueue is initialized with the call to
    led_init_core(). Here's a WARNING easy to trigger:

    [ 36.780813] WARNING: CPU: 3 PID: 1411 at ../kernel/workqueue.c:1444 __queue_work+0x37b/0x420
    [ 36.780815] Modules linked in: ...
    [ 36.780868] CPU: 3 PID: 1411 Comm: systemd-backlig Not tainted 4.16.9-1-default #1 openSUSE Tumbleweed (unreleased)
    [ 36.780868] Hardware name: Dell Inc. Precision 5510/0N8J4R, BIOS 1.6.1 12/11/2017
    [ 36.780870] RIP: 0010:__queue_work+0x37b/0x420
    [ 36.780871] RSP: 0018:ffffaced048b7d78 EFLAGS: 00010086
    [ 36.780873] RAX: 0000000000000000 RBX: ffffffffb3f01440 RCX: 0000000000000000
    [ 36.780873] RDX: ffffffffc05a90d8 RSI: 0000000000000000 RDI: ffff8eac7dce2700
    [ 36.780874] RBP: ffff8ea547c16400 R08: ffff8ea547800000 R09: ffff8eac7dc22700
    [ 36.780875] R10: 0000000000000000 R11: 0000000000000040 R12: 0000000000000003
    [ 36.780876] R13: 0000000000000200 R14: ffffffffc05a90d0 R15: ffff8eac7dce8600
    [ 36.780877] FS: 00007f871e61cf40(0000) GS:ffff8eac7dcc0000(0000) knlGS:0000000000000000
    [ 36.780878] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
    [ 36.780879] CR2: 000055c91115e308 CR3: 0000000883ee0005 CR4: 00000000003606e0
    [ 36.780880] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
    [ 36.780880] DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400
    [ 36.780881] Call Trace:
    [ 36.780886] queue_work_on+0x81/0x90
    [ 36.780889] brightness_store+0x5d/0x90
    [ 36.780892] kernfs_fop_write+0x105/0x180
    [ 36.780894] __vfs_write+0x26/0x150
    [ 36.780897] ? common_file_perm+0x51/0x150
    [ 36.780900] ? security_file_permission+0x3c/0xb0
    [ 36.780901] vfs_write+0xad/0x1a0
    [ 36.780903] SyS_write+0x42/0x90
    [ 36.780906] do_syscall_64+0x76/0x140
    [ 36.780908] entry_SYSCALL_64_after_hwframe+0x42/0xb7
    [ 36.780910] RIP: 0033:0x7f871dd04c94
    [ 36.780910] RSP: 002b:00007ffeb3a57d38 EFLAGS: 00000246 ORIG_RAX: 0000000000000001
    [ 36.780912] RAX: ffffffffffffffda RBX: 000055c91115c810 RCX: 00007f871dd04c94
    [ 36.780912] RDX: 0000000000000001 RSI: 000055c91115c810 RDI: 0000000000000004
    [ 36.780913] RBP: 00007ffeb3a57e10 R08: 0000000000000003 R09: 0000000000000000
    [ 36.780914] R10: 0000000000000000 R11: 0000000000000246 R12: 0000000000000001
    [ 36.780914] R13: 000055c911158f30 R14: 000055c90f3a9a4e R15: 0000000000000004
    [ 36.780917] Code: 74 18 e8 49 80 00 00 48 85 c0 74 0e 48 8b 40 20 48 3b 68 08
    0f 84 c2 fc ff ff 0f 0b 48 83 c4 10 5b 5d 41 5c 41 5d 41 5e 41 5f c3 0b e9
    82 fd ff ff 83 cd 02 49 8d 57 60 e9 69 fd ff ff 80 3d
    [ 36.780942] ---[ end trace 1fce4edad54c4017 ]---

    This patch initializes and acquires the led_access mutex early in the
    of_led_classdev_register function, so that any application trying to write
    to sysfs to set brightness will block until initialization ends.

    Signed-off-by: Luis Henriques
    Acked-by: Pavel Machek
    Signed-off-by: Jacek Anaszewski

    Luis Henriques
     

24 May, 2018

1 commit

  • Introduce the family of LED devices that can
    drive a torch, strobe or IR LED.

    The LED driver can be configured with a strobe
    timer to execute a strobe flash. The IR LED
    brightness is controlled via the torch brightness
    register.

    The data sheet for each the LM36010 and LM36011
    LED drivers can be found here:
    http://www.ti.com/product/LM36010
    http://www.ti.com/product/LM36011

    Signed-off-by: Dan Murphy
    Reviewed-by: Andy Shevchenko
    Signed-off-by: Jacek Anaszewski

    Dan Murphy
     

23 May, 2018

1 commit


15 May, 2018

1 commit


04 May, 2018

1 commit


17 Apr, 2018

1 commit


21 Mar, 2018

1 commit


12 Mar, 2018

1 commit

  • This adds two new disk triggers for triggering on reads
    and writes respectively, named "disk-read" and "disk-write".

    The use case comes from working on the D-Link DNS-313 NAS
    box. This features an RGB LED for disk activity. with
    these two triggers I can couple the green LED to read
    activity and the red LED to write activity, which gives
    the appropriate user feedback about what is happening
    on the disk. When tested it gave exactly the feedback
    desired.

    The in-kernel interface is simply changed to pass a bool
    indicating if the activity is write activity and update
    each trigger (and the composite "disk-activity" trigger)
    depending on what is passed in.

    Signed-off-by: Linus Walleij
    Reviewed-by: Bartlomiej Zolnierkiewicz
    Acked-by: Pavel Machek
    Acked-by: Tejun Heo
    Acked-by: David S. Miller
    Signed-off-by: Jacek Anaszewski

    Linus Walleij
     

20 Feb, 2018

2 commits

  • PC Engines "legacy" coreboot 4.0.8 changed the product/board name
    from "APU2" to "apu2".
    PC Engines "mainline" coreboot uses, instead, "PC Engines apu2" as
    product/board name.

    This commit adds the 2 variants ("apu2" and "PC Engines apu2") of
    product/board name to be compatible with all the APU2 BIOSes.

    Fixes: 3faee9423ce0 ("leds: Add driver for PC Engines APU/APU2 LEDs")
    Signed-off-by: Timothy Redaelli
    Acked-by: Pavel Machek
    Signed-off-by: Jacek Anaszewski

    Timothy Redaelli
     
  • Driver obtains LED devices according to system configuration and creates
    devices in form: "devicename:color:function", like
    The full path is to be:
    /sys/class/leds/mlxreg\:status\:amber/brightness
    After timer trigger activation:
    echo timer > /sys/class/leds/mlxreg\:status\:amber/trigger
    Attributes for LED blinking will appaer in sysfs infrastructure:
    /sys/class/leds/mlxreg\:status\:amber/delay_off
    /sys/class/leds/mlxreg\:status\:amber/delay_on

    LED setting is controlled through the on-board programmable devices,
    which exports its register map. This device could be attached to any
    bus type, for which register mapping is supported.

    Signed-off-by: Vadim Pasternak
    Acked-by: Pavel Machek
    Signed-off-by: Jacek Anaszewski

    Vadim Pasternak