Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

leds: mt6360: Fix the second LED can not enable torch mode by V4L2

V4L2 will disable strobe mode of the LED device when enable torch mode,
but this logic will conflict with the "priv->fled_torch_used"
in "mt6360_strobe_set()". So after enabling torch mode of the first
LED, the second LED will not be able to enable torch mode correctly.

Therefore, at the beginning of "mt6360_strobe_set()", check whether the
state of the upcoming change and the current LED device state are the
same, so as to avoid the above problem.

Signed-off-by: ChiaEn Wu <chiaen_wu@richtek.com>
Link: https://lore.kernel.org/r/28FE6F1712799128000.chiaen_wu@richtek.com
Signed-off-by: Lee Jones <lee@kernel.org>

authored by

ChiaEn Wu and committed by
Lee Jones
fd05e369 fc3b23fa

+11 -1
+11 -1
drivers/leds/flash/leds-mt6360.c
··· 241 241 u32 enable_mask = MT6360_STROBEN_MASK | MT6360_FLCSEN_MASK(led->led_no); 242 242 u32 val = state ? MT6360_FLCSEN_MASK(led->led_no) : 0; 243 243 u32 prev = priv->fled_strobe_used, curr; 244 - int ret; 244 + int ret = 0; 245 245 246 246 mutex_lock(&priv->lock); 247 + 248 + /* 249 + * If the state of the upcoming change is the same as the current LED 250 + * device state, then skip the subsequent code to avoid conflict 251 + * with the flow of turning on LED torch mode in V4L2. 252 + */ 253 + if (state == !!(BIT(led->led_no) & prev)) { 254 + dev_info(lcdev->dev, "No change in strobe state [0x%x]\n", prev); 255 + goto unlock; 256 + } 247 257 248 258 /* 249 259 * Only one set of flash control logic, use the flag to avoid torch is