in leds-mlxreg.c [185:255]
static int mlxreg_led_config(struct mlxreg_led_priv_data *priv)
{
struct mlxreg_core_platform_data *led_pdata = priv->pdata;
struct mlxreg_core_data *data = led_pdata->data;
struct mlxreg_led_data *led_data;
struct led_classdev *led_cdev;
enum led_brightness brightness;
u32 regval;
int i;
int err;
for (i = 0; i < led_pdata->counter; i++, data++) {
led_data = devm_kzalloc(&priv->pdev->dev, sizeof(*led_data),
GFP_KERNEL);
if (!led_data)
return -ENOMEM;
if (data->capability) {
err = regmap_read(led_pdata->regmap, data->capability,
®val);
if (err) {
dev_err(&priv->pdev->dev, "Failed to query capability register\n");
return err;
}
if (!(regval & data->bit))
continue;
/*
* Field "bit" can contain one capability bit in 0 byte
* and offset bit in 1-3 bytes. Clear capability bit and
* keep only offset bit.
*/
data->bit &= MLXREG_LED_CAPABILITY_CLEAR;
}
led_cdev = &led_data->led_cdev;
led_data->data_parent = priv;
if (strstr(data->label, "red") ||
strstr(data->label, "orange")) {
brightness = LED_OFF;
led_data->base_color = MLXREG_LED_RED_SOLID;
} else if (strstr(data->label, "amber")) {
brightness = LED_OFF;
led_data->base_color = MLXREG_LED_AMBER_SOLID;
} else {
brightness = LED_OFF;
led_data->base_color = MLXREG_LED_GREEN_SOLID;
}
snprintf(led_data->led_cdev_name, sizeof(led_data->led_cdev_name),
"mlxreg:%s", data->label);
led_cdev->name = led_data->led_cdev_name;
led_cdev->brightness = brightness;
led_cdev->max_brightness = LED_ON;
led_cdev->brightness_set_blocking =
mlxreg_led_brightness_set;
led_cdev->brightness_get = mlxreg_led_brightness_get;
led_cdev->blink_set = mlxreg_led_blink_set;
led_cdev->flags = LED_CORE_SUSPENDRESUME;
led_data->data = data;
err = devm_led_classdev_register(&priv->pdev->dev, led_cdev);
if (err)
return err;
if (led_cdev->brightness)
mlxreg_led_brightness_set(led_cdev,
led_cdev->brightness);
dev_info(led_cdev->dev, "label: %s, mask: 0x%02x, offset:0x%02x\n",
data->label, data->mask, data->reg);
}
return 0;
}