mediatek: support reading more than one byte of response
authorSven Wegener <sven.wegener@stealer.net>
Sat, 12 Jun 2021 19:56:21 +0000 (21:56 +0200)
committerDaniel Golle <daniel@makrotopia.org>
Sun, 18 Sep 2022 14:39:41 +0000 (15:39 +0100)
There are commands that return more than one byte of response.

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

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

index 8168391d7e7cd8c08890c220b00822d8ae565017..c62e233e6d385e22ebab480d22dddc9b7ffac05f 100644 (file)
@@ -41,16 +41,17 @@ struct ubnt_ledbar {
        struct gpio_desc *enable_gpio;
 };
 
-static int ubnt_ledbar_perform_transaction(struct ubnt_ledbar *ledbar,
-                                          char *transaction)
+static void ubnt_ledbar_perform_transaction(struct ubnt_ledbar *ledbar,
+                                          const char *transaction, int len,
+                                          char *result, int result_len)
 {
-       int ret;
        int i;
 
-       for (i = 0; i < UBNT_LEDBAR_TRANSACTION_LENGTH; i++)
+       for (i = 0; i < len; i++)
                i2c_smbus_write_byte(ledbar->client, transaction[i]);
 
-       return i2c_smbus_read_byte(ledbar->client);
+       for (i = 0; i < result_len; i++)
+               result[i] = i2c_smbus_read_byte(ledbar->client);
 }
 
 static int ubnt_ledbar_apply_state(struct ubnt_ledbar *ledbar)
@@ -72,14 +73,14 @@ static int ubnt_ledbar_apply_state(struct ubnt_ledbar *ledbar)
 
        msleep(10);
 
-       i2c_response = ubnt_ledbar_perform_transaction(ledbar, setup_msg);
+       ubnt_ledbar_perform_transaction(ledbar, setup_msg, sizeof(setup_msg), &i2c_response, sizeof(i2c_response));
        if (i2c_response != UBNT_LEDBAR_TRANSACTION_SUCCESS) {
                dev_err(&ledbar->client->dev, "Error initializing LED transaction: %02hhx\n", i2c_response);
                ret = -EINVAL;
                goto out_gpio;
        }
 
-       i2c_response = ubnt_ledbar_perform_transaction(ledbar, led_msg);
+       ubnt_ledbar_perform_transaction(ledbar, led_msg, sizeof(led_msg), &i2c_response, sizeof(i2c_response));
        if (i2c_response != UBNT_LEDBAR_TRANSACTION_SUCCESS) {
                dev_err(&ledbar->client->dev, "Failed LED transaction: %02hhx\n", i2c_response);
                ret = -EINVAL;