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
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
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
07 Aug, 2018
1 commit
-
Use unsigned int, because it's preferred to unsigned.
Signed-off-by: Kitone Elvis Peter
Acked-by: Pavel Machek
Signed-off-by: Jacek Anaszewski
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 -
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 -
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 -
This removes some boilerplate from the driver.
Signed-off-by: Uwe Kleine-König
Acked-by: Pavel Machek
Signed-off-by: Jacek Anaszewski -
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 -
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 -
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 -
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 -
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 -
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 -
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 -
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 -
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
04 Jul, 2018
8 commits
-
The LM36922 has one output but can sync current to 2 LED
strings. The user may only use one sync so the other
syncs need to be disabled.The LM36923 has 3 LED syncs.
Signed-off-by: Dan Murphy
Signed-off-by: Jacek Anaszewski -
Update the code to use the fwnode calls as opposed
to ARM DT node api's.This allows the device to be used with either DT
configurations or ACPI definitions.Signed-off-by: Dan Murphy
Signed-off-by: Jacek Anaszewski -
Update the license header to the current
SPDX licensing format.Signed-off-by: Dan Murphy
Signed-off-by: Jacek Anaszewski -
Variable mode is assigned to pdata->led_pdata->mode[led->id] and yet
is not being used when calling function max8997_led_set_mode. Fix
this by using mode when calling max8997_led_set_mode.Cleans up clang warning:
warning: variable 'mode' set but not used [-Wunused-but-set-variable]Fixes: 8584cb82f151 ("leds: Add suuport for MAX8997-LED driver")
Signed-off-by: Colin Ian King
Signed-off-by: Jacek Anaszewski -
Update the email address in the module information and in the comments
and in the module information, and drop the existing boilerplate in
favor of a SPDX header.Also sync the module license information with the header.
Signed-off-by: Daniel Mack
Signed-off-by: Jacek Anaszewski -
The binding details are described in an earlier commit that adds the
documentation.Signed-off-by: Daniel Mack
Signed-off-by: Jacek Anaszewski -
Clean up the code a bit and transition over to the gpiod based interface.
Signed-off-by: Daniel Mack
Signed-off-by: Jacek Anaszewski -
In preparation to DT probe functionality, merge create_lt3593_led() into
its only call-site. The DT based setup code will be quite different, so this
internal helper function is of no help.This also changes the way the driver works by only handling one entry inside
'struct gpio_led_platform_data'. If multiple devices of the same type are
found in a design, there should be a platform device for each of them. The
only mainline user of this driver is not affected by this change.Last, use devm_led_classdev_register() instead of
led_classdev_register(), so the driver's remove callback can go away.Signed-off-by: Daniel Mack
Signed-off-by: Jacek Anaszewski
29 Jun, 2018
2 commits
-
All the triggers are defined in a big if LEDS_TRIGGERS...endif block.
So there is no need to let each driver depend on LEDS_TRIGGERS explicitly
once more.Signed-off-by: Uwe Kleine-König
Acked-by: Pavel Machek
Signed-off-by: Jacek Anaszewski -
PC Engines apu3 is an improved version of the apu2, using the same SoC
and almost everything else.This patch reuses as much as possible from the apu2 definitions, to
avoid redundancy.Signed-off-by: Raffaello D. Di Napoli
Acked-by: Pavel Machek
Signed-off-by: Jacek Anaszewski
20 Jun, 2018
1 commit
-
get_monotonic_boottime() is deprecated, so let's convert this to
the simpler ktime_get_boot_ns().Signed-off-by: Arnd Bergmann
Acked-by: Pavel Machek
Signed-off-by: Jacek Anaszewski
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
-
This case got missed by the earlier treewide struct_size() conversions.
Signed-off-by: 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
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/LM36011Signed-off-by: Dan Murphy
Reviewed-by: Andy Shevchenko
Signed-off-by: Jacek Anaszewski
23 May, 2018
1 commit
-
In case of error, the function dev_get_regmap() returns NULL pointer not
ERR_PTR(). The IS_ERR() test in the return value check should be
replaced with NULL test.Fixes: e081c49e30ec ("leds: Add Spreadtrum SC27xx breathing light controller driver")
Signed-off-by: Wei Yongjun
Signed-off-by: Jacek Anaszewski
15 May, 2018
1 commit
-
This patch adds Spreadtrum SC27xx PMIC series breathing light controller
driver, which can support 3 LEDs. Each LED can work at normal PWM mode
and breathing mode.Signed-off-by: Xiaotong Lu
Signed-off-by: Baolin Wang
Acked-by: Pavel Machek
Signed-off-by: Jacek Anaszewski
04 May, 2018
1 commit
-
Use sysfs_match_string() helper instead of open coded variant.
Signed-off-by: Andy Shevchenko
Acked-by: Pavel Machek
Signed-off-by: Jacek Anaszewski
17 Apr, 2018
1 commit
-
This patch adds a LED class driver for the RGB LEDs found on
the Crane Merchandising System CR0014114 LEDs board.Signed-off-by: Oleh Kravchenko
Acked-by: Pavel Machek
Signed-off-by: Jacek Anaszewski
21 Mar, 2018
1 commit
-
BIOS on APU board doesn't expose board_name property, and thus
we have to rely on the product_name instead.Signed-off-by: Hans Ulli Kroll
Signed-off-by: Jacek Anaszewski
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
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 -
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_onLED 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