[Letux-kernel] [Kernel] Pyra: is31fl319x V2 driver (RGB-LEDs)
H. Nikolaus Schaller
hns at goldelico.com
Fri Jun 24 22:06:07 CEST 2016
> Am 23.06.2016 um 18:48 schrieb H. Nikolaus Schaller <hns at goldelico.com>:
>
> Hi,
> I did have this driver for a while on my to-do list time to finalise the feedbacks I got
> for V1 from LKML.
>
> The only unprocessed feedback was to use a regmap for optimizing the
> i2c traffic and solving the issue that we must read back all LED brightness
> values to determine if the chip can be shut down. But there is no i2c read
> response for this chip. So regmap should cache the last value written.
>
> With the lastest patch It - almost - works like with our own hacks of V1...
>
> Only problem seems how to correctly setup the regmap so that it never
> really tries to read the chip but return the last value that was written...
>
> If I return false for readable_reg I get an errno = -5 for all reads.
> If I return true, I get:
>
> [ 13.353654] leds-is31fl319x 4-0064: is31fl319x_brightness_set read ret=-11 [1]: 0
>
> [ 27.661668] leds-is31fl319x 4-0064: is31fl319x_brightness_set read ret=-110 [1]: 0
>
> which means that the regmap *is* trying to read the chip instead of the cache. This
> times out the bus:
>
> [ 27.641615] omap_i2c 4807c000.i2c: controller timed out
>
> Such timeouts lead to kernel stalls if there are led triggers (system is flooded
> by unprocessed write requests to the chip).
>
> 'top' revealed the highest activity process:
>
> PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
> 824 root -51 0 0 0 0 R 41.1 0.0 0:44.59 irq/299-4807c00
>
> which is indeed the i2c interrupt for the bus where the led driver is connected to.
>
> Please can someone look over the code to spot issues?
>
> http://git.goldelico.com/?p=gta04-kernel.git;a=blob;f=drivers/leds/leds-is31fl319x.c;h=05f89a27a568c1f9a5c55917ca72e34ce905760c;hb=0e74d2f7ab126d4a1b1a6cc2cd082b0a5fc96a5f
I think I have found the problem. regmap_read returns errno = -5 if the
register cache access fails.
And it fails if there is no cache and the register is marked as not readable.
What I didn't expect is that the default is to have *no cache*.
And some examples of regmap based drivers seem to run w/o cache on
i2c or I would have spotted this line:
.cache_type = REGCACHE_FLAT,
which makes the difference :)
I would give away a kingdom for better documentation and how-tos for kernel
APIs...
BR,
Nikolaus
More information about the Letux-kernel
mailing list