static int adp5520_keys_notifier(struct notifier_block *nb, unsigned long event, void *data) { struct adp5520_keys *dev; uint8_t reg_val_lo, reg_val_hi; unsigned short keymask; dev = container_of(nb, struct adp5520_keys, notifier); if (event & ADP5520_KP_INT) { adp5520_read(dev->master, ADP5520_KP_INT_STAT_1, ®_val_lo); adp5520_read(dev->master, ADP5520_KP_INT_STAT_2, ®_val_hi); keymask = (reg_val_hi << 8) | reg_val_lo; /* Read twice to clear */ adp5520_read(dev->master, ADP5520_KP_INT_STAT_1, ®_val_lo); adp5520_read(dev->master, ADP5520_KP_INT_STAT_2, ®_val_hi); keymask |= (reg_val_hi << 8) | reg_val_lo; adp5520_keys_report_event(dev, keymask, 1); } if (event & ADP5520_KR_INT) { adp5520_read(dev->master, ADP5520_KR_INT_STAT_1, ®_val_lo); adp5520_read(dev->master, ADP5520_KR_INT_STAT_2, ®_val_hi); keymask = (reg_val_hi << 8) | reg_val_lo; /* Read twice to clear */ adp5520_read(dev->master, ADP5520_KR_INT_STAT_1, ®_val_lo); adp5520_read(dev->master, ADP5520_KR_INT_STAT_2, ®_val_hi); keymask |= (reg_val_hi << 8) | reg_val_lo; adp5520_keys_report_event(dev, keymask, 0); } return 0; }
static int adp5520_bl_get_brightness(struct backlight_device *bl) { struct adp5520_bl *data = bl_get_data(bl); int error; uint8_t reg_val; error = adp5520_read(data->master, ADP5520_BL_VALUE, ®_val); return error ? data->current_brightness : reg_val; }
static int adp5520_gpio_get_value(struct gpio_chip *chip, unsigned off) { struct adp5520_gpio *dev; uint8_t reg_val; dev = gpiochip_get_data(chip); /* * There are dedicated registers for GPIO IN/OUT. * Make sure we return the right value, even when configured as output */ if (test_bit(off, &dev->output)) adp5520_read(dev->master, ADP5520_GPIO_OUT, ®_val); else adp5520_read(dev->master, ADP5520_GPIO_IN, ®_val); return !!(reg_val & dev->lut[off]); }
static int adp5520_suspend(struct device *dev) { struct i2c_client *client = to_i2c_client(dev); struct adp5520_chip *chip = dev_get_drvdata(&client->dev); adp5520_read(chip->dev, ADP5520_MODE_STATUS, &chip->mode); /* All other bits are W1C */ chip->mode &= ADP5520_BL_EN | ADP5520_DIM_EN | ADP5520_nSTNBY; adp5520_write(chip->dev, ADP5520_MODE_STATUS, 0); return 0; }
static ssize_t adp5520_show(struct device *dev, char *buf, int reg) { struct adp5520_bl *data = dev_get_drvdata(dev); int error; uint8_t reg_val; mutex_lock(&data->lock); error = adp5520_read(data->master, reg, ®_val); mutex_unlock(&data->lock); return sprintf(buf, "%u\n", reg_val); }