hc
2024-02-20 102a0743326a03cd1a1202ceda21e175b7d3575c
kernel/drivers/leds/leds-mlxreg.c
....@@ -22,6 +22,7 @@
2222 #define MLXREG_LED_AMBER_SOLID 0x09 /* Solid amber */
2323 #define MLXREG_LED_BLINK_3HZ 167 /* ~167 msec off/on - HW support */
2424 #define MLXREG_LED_BLINK_6HZ 83 /* ~83 msec off/on - HW support */
25
+#define MLXREG_LED_CAPABILITY_CLEAR GENMASK(31, 8) /* Clear mask */
2526
2627 /**
2728 * struct mlxreg_led_data - led control data:
....@@ -187,6 +188,7 @@
187188 struct mlxreg_led_data *led_data;
188189 struct led_classdev *led_cdev;
189190 enum led_brightness brightness;
191
+ u32 regval;
190192 int i;
191193 int err;
192194
....@@ -196,6 +198,23 @@
196198 if (!led_data)
197199 return -ENOMEM;
198200
201
+ if (data->capability) {
202
+ err = regmap_read(led_pdata->regmap, data->capability,
203
+ &regval);
204
+ if (err) {
205
+ dev_err(&priv->pdev->dev, "Failed to query capability register\n");
206
+ return err;
207
+ }
208
+ if (!(regval & data->bit))
209
+ continue;
210
+ /*
211
+ * Field "bit" can contain one capability bit in 0 byte
212
+ * and offset bit in 1-3 bytes. Clear capability bit and
213
+ * keep only offset bit.
214
+ */
215
+ data->bit &= MLXREG_LED_CAPABILITY_CLEAR;
216
+ }
217
+
199218 led_cdev = &led_data->led_cdev;
200219 led_data->data_parent = priv;
201220 if (strstr(data->label, "red") ||