/** * struct mlxreg_led_data - led control data: * * @data: led configuration data; * @led_cdev: led class data; * @base_color: base led color (other colors have constant offset from base); * @data_parent: pointer to private device control data of parent; * @led_cdev_name: class device name
*/ struct mlxreg_led_data { struct mlxreg_core_data *data; struct led_classdev led_cdev;
u8 base_color; void *data_parent; char led_cdev_name[MLXREG_CORE_LABEL_MAX_SIZE];
};
/* * Each LED is controlled through low or high nibble of the relevant * register byte. Register offset is specified by off parameter. * Parameter vset provides color code: 0x0 for off, 0x5 for solid red, * 0x6 for 3Hz blink red, 0xd for solid green, 0xe for 3Hz blink * green. * Parameter mask specifies which nibble is used for specific LED: mask * 0xf0 - lower nibble is to be used (bits from 0 to 3), mask 0x0f - * higher nibble (bits from 4 to 7).
*/
mutex_lock(&priv->access_lock);
ret = regmap_read(led_pdata->regmap, data->reg, ®val); if (ret) goto access_error;
/* * Each LED is controlled through low or high nibble of the relevant * register byte. Register offset is specified by off parameter. * Parameter vset provides color code: 0x0 for off, 0x5 for solid red, * 0x6 for 3Hz blink red, 0xd for solid green, 0xe for 3Hz blink * green. * Parameter mask specifies which nibble is used for specific LED: mask * 0xf0 - lower nibble is to be used (bits from 0 to 3), mask 0x0f - * higher nibble (bits from 4 to 7).
*/
err = regmap_read(led_pdata->regmap, data->reg, ®val); if (err < 0) {
dev_warn(led_data->led_cdev.dev, "Failed to get current brightness, error: %d\n",
err); /* Assume the LED is OFF */ return LED_OFF;
}
/* * HW supports two types of blinking: full (6Hz) and half (3Hz). * For delay on/off zero LED is setting to solid color. For others * combination blinking is to be controlled by the software timer.
*/ if (!(*delay_on == 0 && *delay_off == 0) &&
!(*delay_on == MLXREG_LED_BLINK_3HZ &&
*delay_off == MLXREG_LED_BLINK_3HZ) &&
!(*delay_on == MLXREG_LED_BLINK_6HZ &&
*delay_off == MLXREG_LED_BLINK_6HZ)) return -EINVAL;
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;
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.