struct aw2013 { struct mutex mutex; /* held when writing to registers */ struct regulator_bulk_data regulators[2]; struct i2c_client *client; struct aw2013_led leds[AW2013_MAX_LEDS]; struct regmap *regmap; int num_leds; bool enabled;
};
staticint aw2013_chip_init(struct aw2013 *chip)
{ int i, ret;
ret = regmap_write(chip->regmap, AW2013_GCR, AW2013_GCR_ENABLE); if (ret) {
dev_err(&chip->client->dev, "Failed to enable the chip: %d\n",
ret); return ret;
}
for (i = 0; i < chip->num_leds; i++) {
ret = regmap_update_bits(chip->regmap,
AW2013_LCFG(chip->leds[i].num),
AW2013_LCFG_IMAX_MASK,
chip->leds[i].imax); if (ret) {
dev_err(&chip->client->dev, "Failed to set maximum current for led %d: %d\n",
chip->leds[i].num, ret); return ret;
}
}
return ret;
}
staticvoid aw2013_chip_disable(struct aw2013 *chip)
{ int ret;
if (!chip->enabled) return;
regmap_write(chip->regmap, AW2013_GCR, 0);
ret = regulator_bulk_disable(ARRAY_SIZE(chip->regulators),
chip->regulators); if (ret) {
dev_err(&chip->client->dev, "Failed to disable regulators: %d\n", ret); return;
}
chip->enabled = false;
}
staticint aw2013_chip_enable(struct aw2013 *chip)
{ int ret;
if (chip->enabled) return 0;
ret = regulator_bulk_enable(ARRAY_SIZE(chip->regulators),
chip->regulators); if (ret) {
dev_err(&chip->client->dev, "Failed to enable regulators: %d\n", ret); return ret;
}
chip->enabled = true;
ret = aw2013_chip_init(chip); if (ret)
aw2013_chip_disable(chip);
return ret;
}
staticbool aw2013_chip_in_use(struct aw2013 *chip)
{ int i;
for (i = 0; i < chip->num_leds; i++) if (chip->leds[i].cdev.brightness) returntrue;
if (aw2013_chip_in_use(led->chip)) {
ret = aw2013_chip_enable(led->chip); if (ret) goto error;
}
num = led->num;
ret = regmap_write(led->chip->regmap, AW2013_REG_PWM(num), brightness); if (ret) goto error;
if (brightness) {
ret = regmap_update_bits(led->chip->regmap, AW2013_LCTR,
AW2013_LCTR_LE(num), 0xFF);
} else {
ret = regmap_update_bits(led->chip->regmap, AW2013_LCTR,
AW2013_LCTR_LE(num), 0); if (ret) goto error;
ret = regmap_update_bits(led->chip->regmap, AW2013_LCFG(num),
AW2013_LCFG_MD, 0);
} if (ret) goto error;
if (!aw2013_chip_in_use(led->chip))
aw2013_chip_disable(led->chip);
error:
mutex_unlock(&led->chip->mutex);
return ret;
}
staticint aw2013_blink_set(struct led_classdev *cdev, unsignedlong *delay_on, unsignedlong *delay_off)
{ struct aw2013_led *led = container_of(cdev, struct aw2013_led, cdev); int ret, num = led->num; unsignedlong off = 0, on = 0;
/* If no blink specified, default to 1 Hz. */ if (!*delay_off && !*delay_on) {
*delay_off = 500;
*delay_on = 500;
}
if (!led->cdev.brightness) {
led->cdev.brightness = LED_FULL;
ret = aw2013_brightness_set(&led->cdev, led->cdev.brightness); if (ret) return ret;
}
/* Never on - just set to off */ if (!*delay_on) {
led->cdev.brightness = LED_OFF; return aw2013_brightness_set(&led->cdev, LED_OFF);
}
mutex_lock(&led->chip->mutex);
/* Never off - brightness is already set, disable blinking */ if (!*delay_off) {
ret = regmap_update_bits(led->chip->regmap, AW2013_LCFG(num),
AW2013_LCFG_MD, 0); goto out;
}
/* Convert into values the HW will understand. */
off = min(5, ilog2((*delay_off - 1) / AW2013_TIME_STEP) + 1);
on = min(7, ilog2((*delay_on - 1) / AW2013_TIME_STEP) + 1);
/* Set timings */
ret = regmap_write(led->chip->regmap,
AW2013_LEDT0(num), AW2013_LEDT0_T2(on)); if (ret) goto out;
ret = regmap_write(led->chip->regmap,
AW2013_LEDT1(num), AW2013_LEDT1_T4(off)); if (ret) goto out;
/* Finally, enable the LED */
ret = regmap_update_bits(led->chip->regmap, AW2013_LCFG(num),
AW2013_LCFG_MD, 0xFF); if (ret) goto out;
ret = regmap_update_bits(led->chip->regmap, AW2013_LCTR,
AW2013_LCTR_LE(num), 0xFF);
out:
mutex_unlock(&led->chip->mutex);
return ret;
}
staticint aw2013_probe_dt(struct aw2013 *chip)
{ struct device_node *np = dev_of_node(&chip->client->dev); int count, ret = 0, i = 0; struct aw2013_led *led;
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.