leds: mt6360: Fix the second LED can not enable torch mode by V4L2
authorChiaEn Wu <chiaen_wu@richtek.com>
Tue, 9 Apr 2024 10:21:54 +0000 (18:21 +0800)
committerLee Jones <lee@kernel.org>
Fri, 12 Apr 2024 08:47:17 +0000 (09:47 +0100)
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>
drivers/leds/flash/leds-mt6360.c

index a90de82f4568371fa0d88164778b2a12968648c3..1b75b4d368348631322c49f14f729bd953890f2f 100644 (file)
@@ -241,10 +241,20 @@ static int mt6360_strobe_set(struct led_classdev_flash *fl_cdev, bool state)
        u32 enable_mask = MT6360_STROBEN_MASK | MT6360_FLCSEN_MASK(led->led_no);
        u32 val = state ? MT6360_FLCSEN_MASK(led->led_no) : 0;
        u32 prev = priv->fled_strobe_used, curr;
-       int ret;
+       int ret = 0;
 
        mutex_lock(&priv->lock);
 
+       /*
+        * If the state of the upcoming change is the same as the current LED
+        * device state, then skip the subsequent code to avoid conflict
+        * with the flow of turning on LED torch mode in V4L2.
+        */
+       if (state == !!(BIT(led->led_no) & prev)) {
+               dev_info(lcdev->dev, "No change in strobe state [0x%x]\n", prev);
+               goto unlock;
+       }
+
        /*
         * Only one set of flash control logic, use the flag to avoid torch is
         * currently used