mediatek: add initialization after reset
authorSven Wegener <sven.wegener@stealer.net>
Sat, 12 Jun 2021 19:56:22 +0000 (21:56 +0200)
committerDaniel Golle <daniel@makrotopia.org>
Sun, 18 Sep 2022 14:39:41 +0000 (15:39 +0100)
During GPIO initialization the pin state flips and triggers a reset of
the ledbar MCU. It needs to be moved through an initialization sequence
before working correctly.

Signed-off-by: Sven Wegener <sven.wegener@stealer.net>
(cherry picked from commit 013a956f086dc5d88f6e9cbd852ed4d900d436e0)

target/linux/mediatek/files-5.10/drivers/leds/leds-ubnt-ledbar.c

index 1d687b76861c6f53523def44665ba3642ef9eec0..10d240d2bebd2c99564969c3ed184099136b8d42 100644 (file)
@@ -99,6 +99,12 @@ out_gpio:
 
 static void ubnt_ledbar_reset(struct ubnt_ledbar *ledbar)
 {
+       static const char init_msg[16] = {0x02, 0x81, 0xfd, 0x7e,
+                                         0x00, 0x00, 0x00, 0x00,
+                                         0x00, 0x00, 0x00, 0x00,
+                                         0x00, 0x00, 0x00, 0x00};
+       char init_response[4];
+
        if (!ledbar->reset_gpio)
                return;
 
@@ -108,6 +114,14 @@ static void ubnt_ledbar_reset(struct ubnt_ledbar *ledbar)
        msleep(10);
        gpiod_set_value(ledbar->reset_gpio, 0);
 
+       msleep(10);
+
+       gpiod_set_value(ledbar->enable_gpio, 1);
+       msleep(10);
+       ubnt_ledbar_perform_transaction(ledbar, init_msg, sizeof(init_msg), init_response, sizeof(init_response));
+       msleep(10);
+       gpiod_set_value(ledbar->enable_gpio, 0);
+
        mutex_unlock(&ledbar->lock);
 }