u8 pcf50633_reg_read(struct pcf50633 *pcf, u8 reg) { u8 val; mutex_lock(&pcf->lock); __pcf50633_read(pcf, reg, 1, &val); mutex_unlock(&pcf->lock); return val; }
static int __pcf50633_irq_mask_set(struct pcf50633 *pcf, int irq, u8 mask) { u8 reg, bits, tmp; int ret = 0, idx; idx = irq >> 3; reg = PCF50633_REG_INT1M + idx; bits = 1 << (irq & 0x07); mutex_lock(&pcf->lock); if (mask) { ret = __pcf50633_read(pcf, reg, 1, &tmp); if (ret < 0) goto out; tmp |= bits; ret = __pcf50633_write(pcf, reg, 1, &tmp); if (ret < 0) goto out; pcf->mask_regs[idx] &= ~bits; pcf->mask_regs[idx] |= bits; } else { ret = __pcf50633_read(pcf, reg, 1, &tmp); if (ret < 0) goto out; tmp &= ~bits; ret = __pcf50633_write(pcf, reg, 1, &tmp); if (ret < 0) goto out; pcf->mask_regs[idx] &= ~bits; } out: mutex_unlock(&pcf->lock); return ret; }
/* Read a block of upto 32 regs */ int pcf50633_read_block(struct pcf50633 *pcf, u8 reg, int nr_regs, u8 *data) { int ret; mutex_lock(&pcf->lock); ret = __pcf50633_read(pcf, reg, nr_regs, data); mutex_unlock(&pcf->lock); return ret; }
int pcf50633_reg_clear_bits(struct pcf50633 *pcf, u8 reg, u8 val) { int ret; u8 tmp; mutex_lock(&pcf->lock); ret = __pcf50633_read(pcf, reg, 1, &tmp); if (ret < 0) goto out; tmp &= ~val; ret = __pcf50633_write(pcf, reg, 1, &tmp); out: mutex_unlock(&pcf->lock); return ret; }
int pcf50633_reg_set_bit_mask(struct pcf50633 *pcf, u8 reg, u8 mask, u8 val) { int ret; u8 tmp; val &= mask; mutex_lock(&pcf->lock); ret = __pcf50633_read(pcf, reg, 1, &tmp); if (ret < 0) goto out; tmp &= ~mask; tmp |= val; ret = __pcf50633_write(pcf, reg, 1, &tmp); out: mutex_unlock(&pcf->lock); return ret; }