Source
x
static int pca9551_led_set_blink_rate(int idx, struct pca9551_blink_rate rate)
// SPDX-License-Identifier: GPL-2.0+
/*
* Copyright (C) 2015 Stefan Roese <sr@denx.de>
*/
/* Input register (read only) */
/* Frequency prescaler 0 */
/* PWM0 */
/* Frequency prescaler 1 */
/* PWM1 */
/* LED0 to LED3 selector */
/* LED4 to LED7 selector */
/* Auto-increment flag */
struct pca9551_blink_rate {
u8 psc; /* Frequency preescaler, see PCA9551_7.pdf p. 6 */
u8 pwm; /* Pulse width modulation, see PCA9551_7.pdf p. 6 */
};
static int freq_last = -1;
static int mask_last = -1;
static int idx_last = -1;
static int mode_last;
static int pca9551_led_get_state(int led, int *state)
{
unsigned int reg;
u8 shift, buf;
int ret;
if (led < 0 || led > 7) {
return -EINVAL;
} else if (led < 4) {
reg = PCA9551_REG_LS0;
shift = led << 1;
} else {
reg = PCA9551_REG_LS1;
shift = (led - 4) << 1;
}
ret = i2c_read(CONFIG_PCA9551_I2C_ADDR, reg, 1, &buf, 1);
if (ret)
return ret;
*state = (buf >> shift) & 0x03;
return 0;
}
static int pca9551_led_set_state(int led, int state)
{
unsigned int reg;
u8 shift, buf, mask;
int ret;
if (led < 0 || led > 7) {
return -EINVAL;
} else if (led < 4) {
reg = PCA9551_REG_LS0;
shift = led << 1;
} else {
reg = PCA9551_REG_LS1;
shift = (led - 4) << 1;
}
mask = 0x03 << shift;
ret = i2c_read(CONFIG_PCA9551_I2C_ADDR, reg, 1, &buf, 1);
if (ret)
return ret;
buf = (buf & ~mask) | ((state & 0x03) << shift);
ret = i2c_write(CONFIG_PCA9551_I2C_ADDR, reg, 1, &buf, 1);
if (ret)
return ret;
return 0;
}