Lines Matching +full:hw +full:- +full:blink

1 // SPDX-License-Identifier: (GPL-2.0 OR BSD-3-Clause)
16 #define MLXREG_LED_OFFSET_BLINK_3HZ 0x01 /* Offset from solid: 3Hz blink */
17 #define MLXREG_LED_OFFSET_BLINK_6HZ 0x02 /* Offset from solid: 6Hz blink */
22 #define MLXREG_LED_BLINK_3HZ 167 /* ~167 msec off/on - HW support */
23 #define MLXREG_LED_BLINK_6HZ 83 /* ~83 msec off/on - HW support */
27 * struct mlxreg_led_data - led control data:
46 * struct mlxreg_led_priv_data - platform private data:
61 struct mlxreg_led_priv_data *priv = led_data->data_parent; in mlxreg_led_store_hw()
62 struct mlxreg_core_platform_data *led_pdata = priv->pdata; in mlxreg_led_store_hw()
63 struct mlxreg_core_data *data = led_data->data; in mlxreg_led_store_hw()
72 * 0x6 for 3Hz blink red, 0xd for solid green, 0xe for 3Hz blink in mlxreg_led_store_hw()
75 * 0xf0 - lower nibble is to be used (bits from 0 to 3), mask 0x0f - in mlxreg_led_store_hw()
78 mutex_lock(&priv->access_lock); in mlxreg_led_store_hw()
80 ret = regmap_read(led_pdata->regmap, data->reg, &regval); in mlxreg_led_store_hw()
84 nib = (ror32(data->mask, data->bit) == 0xf0) ? rol32(vset, data->bit) : in mlxreg_led_store_hw()
85 rol32(vset, data->bit + 4); in mlxreg_led_store_hw()
86 regval = (regval & data->mask) | nib; in mlxreg_led_store_hw()
88 ret = regmap_write(led_pdata->regmap, data->reg, regval); in mlxreg_led_store_hw()
91 mutex_unlock(&priv->access_lock); in mlxreg_led_store_hw()
99 struct mlxreg_led_priv_data *priv = led_data->data_parent; in mlxreg_led_get_hw()
100 struct mlxreg_core_platform_data *led_pdata = priv->pdata; in mlxreg_led_get_hw()
101 struct mlxreg_core_data *data = led_data->data; in mlxreg_led_get_hw()
109 * 0x6 for 3Hz blink red, 0xd for solid green, 0xe for 3Hz blink in mlxreg_led_get_hw()
112 * 0xf0 - lower nibble is to be used (bits from 0 to 3), mask 0x0f - in mlxreg_led_get_hw()
115 err = regmap_read(led_pdata->regmap, data->reg, &regval); in mlxreg_led_get_hw()
117 dev_warn(led_data->led_cdev.dev, "Failed to get current brightness, error: %d\n", in mlxreg_led_get_hw()
123 regval = regval & ~data->mask; in mlxreg_led_get_hw()
124 regval = (ror32(data->mask, data->bit) == 0xf0) ? ror32(regval, in mlxreg_led_get_hw()
125 data->bit) : ror32(regval, data->bit + 4); in mlxreg_led_get_hw()
126 if (regval >= led_data->base_color && in mlxreg_led_get_hw()
127 regval <= (led_data->base_color + MLXREG_LED_OFFSET_BLINK_6HZ)) in mlxreg_led_get_hw()
139 return mlxreg_led_store_hw(led_data, led_data->base_color); in mlxreg_led_brightness_set()
160 * HW supports two types of blinking: full (6Hz) and half (3Hz). in mlxreg_led_blink_set()
169 return -EINVAL; in mlxreg_led_blink_set()
172 err = mlxreg_led_store_hw(led_data, led_data->base_color + in mlxreg_led_blink_set()
175 err = mlxreg_led_store_hw(led_data, led_data->base_color + in mlxreg_led_blink_set()
178 err = mlxreg_led_store_hw(led_data, led_data->base_color); in mlxreg_led_blink_set()
185 struct mlxreg_core_platform_data *led_pdata = priv->pdata; in mlxreg_led_config()
186 struct mlxreg_core_data *data = led_pdata->data; in mlxreg_led_config()
194 for (i = 0; i < led_pdata->counter; i++, data++) { in mlxreg_led_config()
195 led_data = devm_kzalloc(&priv->pdev->dev, sizeof(*led_data), in mlxreg_led_config()
198 return -ENOMEM; in mlxreg_led_config()
200 if (data->capability) { in mlxreg_led_config()
201 err = regmap_read(led_pdata->regmap, data->capability, in mlxreg_led_config()
204 dev_err(&priv->pdev->dev, "Failed to query capability register\n"); in mlxreg_led_config()
207 if (!(regval & data->bit)) in mlxreg_led_config()
211 * and offset bit in 1-3 bytes. Clear capability bit and in mlxreg_led_config()
214 data->bit &= MLXREG_LED_CAPABILITY_CLEAR; in mlxreg_led_config()
217 led_cdev = &led_data->led_cdev; in mlxreg_led_config()
218 led_data->data_parent = priv; in mlxreg_led_config()
219 if (strstr(data->label, "red") || in mlxreg_led_config()
220 strstr(data->label, "orange")) { in mlxreg_led_config()
222 led_data->base_color = MLXREG_LED_RED_SOLID; in mlxreg_led_config()
223 } else if (strstr(data->label, "amber")) { in mlxreg_led_config()
225 led_data->base_color = MLXREG_LED_AMBER_SOLID; in mlxreg_led_config()
228 led_data->base_color = MLXREG_LED_GREEN_SOLID; in mlxreg_led_config()
230 snprintf(led_data->led_cdev_name, sizeof(led_data->led_cdev_name), in mlxreg_led_config()
231 "mlxreg:%s", data->label); in mlxreg_led_config()
232 led_cdev->name = led_data->led_cdev_name; in mlxreg_led_config()
233 led_cdev->brightness = brightness; in mlxreg_led_config()
234 led_cdev->max_brightness = LED_ON; in mlxreg_led_config()
235 led_cdev->brightness_set_blocking = in mlxreg_led_config()
237 led_cdev->brightness_get = mlxreg_led_brightness_get; in mlxreg_led_config()
238 led_cdev->blink_set = mlxreg_led_blink_set; in mlxreg_led_config()
239 led_cdev->flags = LED_CORE_SUSPENDRESUME; in mlxreg_led_config()
240 led_data->data = data; in mlxreg_led_config()
241 err = devm_led_classdev_register(&priv->pdev->dev, led_cdev); in mlxreg_led_config()
245 if (led_cdev->brightness) in mlxreg_led_config()
247 led_cdev->brightness); in mlxreg_led_config()
248 dev_info(led_cdev->dev, "label: %s, mask: 0x%02x, offset:0x%02x\n", in mlxreg_led_config()
249 data->label, data->mask, data->reg); in mlxreg_led_config()
261 led_pdata = dev_get_platdata(&pdev->dev); in mlxreg_led_probe()
263 dev_err(&pdev->dev, "Failed to get platform data.\n"); in mlxreg_led_probe()
264 return -EINVAL; in mlxreg_led_probe()
267 priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL); in mlxreg_led_probe()
269 return -ENOMEM; in mlxreg_led_probe()
271 err = devm_mutex_init(&pdev->dev, &priv->access_lock); in mlxreg_led_probe()
275 priv->pdev = pdev; in mlxreg_led_probe()
276 priv->pdata = led_pdata; in mlxreg_led_probe()
283 .name = "leds-mlxreg",
293 MODULE_ALIAS("platform:leds-mlxreg");