1 From ffec49d391c5f0195360912b216aa24dbc9b53c8 Mon Sep 17 00:00:00 2001
2 From: =?UTF-8?q?Marek=20Beh=C3=BAn?= <kabel@kernel.org>
3 Date: Mon, 16 Oct 2023 16:15:38 +0200
4 Subject: [PATCH] leds: turris-omnia: Fix brightness setting and trigger
7 Content-Type: text/plain; charset=UTF-8
8 Content-Transfer-Encoding: 8bit
10 I have improperly refactored commits
11 4d5ed2621c24 ("leds: turris-omnia: Make set_brightness() more efficient")
13 aaf38273cf76 ("leds: turris-omnia: Support HW controlled mode via private trigger")
14 after Lee requested a change in API semantics of the new functions I
16 28350bc0ac77 ("leds: turris-omnia: Do not use SMBUS calls").
18 Before the change, the function omnia_cmd_write_u8() returned 0 on
19 success, and afterwards it returned a positive value (number of bytes
20 written). The latter version was applied, but the following commits did
21 not properly account for this change.
23 This results in non-functional LED's .brightness_set_blocking() and
24 trigger's .activate() methods.
26 The main reasoning behind the semantics change was that read/write
27 methods should return the number of read/written bytes on success.
28 It was pointed to me [1] that this is not always true (for example the
29 regmap API does not do so), and since the driver never uses this number
30 of read/written bytes information, I decided to fix this issue by
31 changing the functions to the original semantics (return 0 on success).
33 [1] https://lore.kernel.org/linux-gpio/ZQnn+Gi0xVlsGCYA@smile.fi.intel.com/
35 Fixes: 28350bc0ac77 ("leds: turris-omnia: Do not use SMBUS calls")
36 Signed-off-by: Marek BehĂșn <kabel@kernel.org>
38 drivers/leds/leds-turris-omnia.c | 37 +++++++++++++++++---------------
39 1 file changed, 20 insertions(+), 17 deletions(-)
41 --- a/drivers/leds/leds-turris-omnia.c
42 +++ b/drivers/leds/leds-turris-omnia.c
43 @@ -60,8 +60,11 @@ struct omnia_leds {
44 static int omnia_cmd_write_u8(const struct i2c_client *client, u8 cmd, u8 val)
46 u8 buf[2] = { cmd, val };
49 + ret = i2c_master_send(client, buf, sizeof(buf));
51 - return i2c_master_send(client, buf, sizeof(buf));
52 + return ret < 0 ? ret : 0;
55 static int omnia_cmd_read_raw(struct i2c_adapter *adapter, u8 addr, u8 cmd,
56 @@ -81,7 +84,7 @@ static int omnia_cmd_read_raw(struct i2c
58 ret = i2c_transfer(adapter, msgs, ARRAY_SIZE(msgs));
59 if (likely(ret == ARRAY_SIZE(msgs)))
65 @@ -91,11 +94,11 @@ static int omnia_cmd_read_raw(struct i2c
66 static int omnia_cmd_read_u8(const struct i2c_client *client, u8 cmd)
72 - ret = omnia_cmd_read_raw(client->adapter, client->addr, cmd, &reply, 1);
75 + err = omnia_cmd_read_raw(client->adapter, client->addr, cmd, &reply, 1);
81 @@ -236,7 +239,7 @@ static void omnia_hwtrig_deactivate(stru
83 mutex_unlock(&leds->lock);
87 dev_err(cdev->dev, "Cannot put LED to software mode: %i\n",
90 @@ -302,7 +305,7 @@ static int omnia_led_register(struct i2c
91 ret = omnia_cmd_write_u8(client, CMD_LED_MODE,
92 CMD_LED_MODE_LED(led->reg) |
96 dev_err(dev, "Cannot set LED %pOF to software mode: %i\n", np,
99 @@ -311,7 +314,7 @@ static int omnia_led_register(struct i2c
100 /* disable the LED */
101 ret = omnia_cmd_write_u8(client, CMD_LED_STATE,
102 CMD_LED_STATE_LED(led->reg));
105 dev_err(dev, "Cannot set LED %pOF brightness: %i\n", np, ret);
108 @@ -364,7 +367,7 @@ static ssize_t brightness_store(struct d
110 struct i2c_client *client = to_i2c_client(dev);
111 unsigned long brightness;
115 if (kstrtoul(buf, 10, &brightness))
117 @@ -372,9 +375,9 @@ static ssize_t brightness_store(struct d
118 if (brightness > 100)
121 - ret = omnia_cmd_write_u8(client, CMD_LED_SET_BRIGHTNESS, brightness);
122 + err = omnia_cmd_write_u8(client, CMD_LED_SET_BRIGHTNESS, brightness);
124 - return ret < 0 ? ret : count;
125 + return err ?: count;
127 static DEVICE_ATTR_RW(brightness);
129 @@ -403,7 +406,7 @@ static ssize_t gamma_correction_store(st
130 struct i2c_client *client = to_i2c_client(dev);
131 struct omnia_leds *leds = i2c_get_clientdata(client);
136 if (!leds->has_gamma_correction)
138 @@ -411,9 +414,9 @@ static ssize_t gamma_correction_store(st
139 if (kstrtobool(buf, &val) < 0)
142 - ret = omnia_cmd_write_u8(client, CMD_SET_GAMMA_CORRECTION, val);
143 + err = omnia_cmd_write_u8(client, CMD_SET_GAMMA_CORRECTION, val);
145 - return ret < 0 ? ret : count;
146 + return err ?: count;
148 static DEVICE_ATTR_RW(gamma_correction);
150 @@ -431,7 +434,7 @@ static int omnia_mcu_get_features(const
152 err = omnia_cmd_read_raw(client->adapter, OMNIA_MCU_I2C_ADDR,
153 CMD_GET_STATUS_WORD, &reply, sizeof(reply));
158 /* Check whether MCU firmware supports the CMD_GET_FEAUTRES command */
159 @@ -440,7 +443,7 @@ static int omnia_mcu_get_features(const
161 err = omnia_cmd_read_raw(client->adapter, OMNIA_MCU_I2C_ADDR,
162 CMD_GET_FEATURES, &reply, sizeof(reply));
167 return le16_to_cpu(reply);