Lines Matching refs:chip
79 #define NBANK(chip) (chip->gpio_chip.ngpio / BANK_SZ) argument
106 static int pca953x_read_single(struct pca953x_chip *chip, int reg, u32 *val, in pca953x_read_single() argument
110 int bank_shift = fls((chip->gpio_chip.ngpio - 1) / BANK_SZ); in pca953x_read_single()
113 ret = i2c_smbus_read_byte_data(chip->client, in pca953x_read_single()
118 dev_err(&chip->client->dev, "failed reading register\n"); in pca953x_read_single()
125 static int pca953x_write_single(struct pca953x_chip *chip, int reg, u32 val, in pca953x_write_single() argument
129 int bank_shift = fls((chip->gpio_chip.ngpio - 1) / BANK_SZ); in pca953x_write_single()
132 ret = i2c_smbus_write_byte_data(chip->client, in pca953x_write_single()
136 dev_err(&chip->client->dev, "failed writing register\n"); in pca953x_write_single()
143 static int pca953x_write_regs(struct pca953x_chip *chip, int reg, u8 *val) in pca953x_write_regs() argument
147 if (chip->gpio_chip.ngpio <= 8) in pca953x_write_regs()
148 ret = i2c_smbus_write_byte_data(chip->client, reg, *val); in pca953x_write_regs()
149 else if (chip->gpio_chip.ngpio >= 24) { in pca953x_write_regs()
150 int bank_shift = fls((chip->gpio_chip.ngpio - 1) / BANK_SZ); in pca953x_write_regs()
151 ret = i2c_smbus_write_i2c_block_data(chip->client, in pca953x_write_regs()
153 NBANK(chip), val); in pca953x_write_regs()
155 switch (chip->chip_type) { in pca953x_write_regs()
157 ret = i2c_smbus_write_word_data(chip->client, in pca953x_write_regs()
161 ret = i2c_smbus_write_byte_data(chip->client, reg << 1, in pca953x_write_regs()
165 ret = i2c_smbus_write_byte_data(chip->client, in pca953x_write_regs()
173 dev_err(&chip->client->dev, "failed writing register\n"); in pca953x_write_regs()
180 static int pca953x_read_regs(struct pca953x_chip *chip, int reg, u8 *val) in pca953x_read_regs() argument
184 if (chip->gpio_chip.ngpio <= 8) { in pca953x_read_regs()
185 ret = i2c_smbus_read_byte_data(chip->client, reg); in pca953x_read_regs()
187 } else if (chip->gpio_chip.ngpio >= 24) { in pca953x_read_regs()
188 int bank_shift = fls((chip->gpio_chip.ngpio - 1) / BANK_SZ); in pca953x_read_regs()
190 ret = i2c_smbus_read_i2c_block_data(chip->client, in pca953x_read_regs()
192 NBANK(chip), val); in pca953x_read_regs()
194 ret = i2c_smbus_read_word_data(chip->client, reg << 1); in pca953x_read_regs()
199 dev_err(&chip->client->dev, "failed reading register\n"); in pca953x_read_regs()
208 struct pca953x_chip *chip = to_pca(gc); in pca953x_gpio_direction_input() local
212 mutex_lock(&chip->i2c_lock); in pca953x_gpio_direction_input()
213 reg_val = chip->reg_direction[off / BANK_SZ] | (1u << (off % BANK_SZ)); in pca953x_gpio_direction_input()
215 switch (chip->chip_type) { in pca953x_gpio_direction_input()
223 ret = pca953x_write_single(chip, offset, reg_val, off); in pca953x_gpio_direction_input()
227 chip->reg_direction[off / BANK_SZ] = reg_val; in pca953x_gpio_direction_input()
230 mutex_unlock(&chip->i2c_lock); in pca953x_gpio_direction_input()
237 struct pca953x_chip *chip = to_pca(gc); in pca953x_gpio_direction_output() local
241 mutex_lock(&chip->i2c_lock); in pca953x_gpio_direction_output()
244 reg_val = chip->reg_output[off / BANK_SZ] in pca953x_gpio_direction_output()
247 reg_val = chip->reg_output[off / BANK_SZ] in pca953x_gpio_direction_output()
250 switch (chip->chip_type) { in pca953x_gpio_direction_output()
258 ret = pca953x_write_single(chip, offset, reg_val, off); in pca953x_gpio_direction_output()
262 chip->reg_output[off / BANK_SZ] = reg_val; in pca953x_gpio_direction_output()
265 reg_val = chip->reg_direction[off / BANK_SZ] & ~(1u << (off % BANK_SZ)); in pca953x_gpio_direction_output()
266 switch (chip->chip_type) { in pca953x_gpio_direction_output()
274 ret = pca953x_write_single(chip, offset, reg_val, off); in pca953x_gpio_direction_output()
278 chip->reg_direction[off / BANK_SZ] = reg_val; in pca953x_gpio_direction_output()
281 mutex_unlock(&chip->i2c_lock); in pca953x_gpio_direction_output()
287 struct pca953x_chip *chip = to_pca(gc); in pca953x_gpio_get_value() local
291 mutex_lock(&chip->i2c_lock); in pca953x_gpio_get_value()
292 switch (chip->chip_type) { in pca953x_gpio_get_value()
300 ret = pca953x_read_single(chip, offset, ®_val, off); in pca953x_gpio_get_value()
301 mutex_unlock(&chip->i2c_lock); in pca953x_gpio_get_value()
315 struct pca953x_chip *chip = to_pca(gc); in pca953x_gpio_set_value() local
319 mutex_lock(&chip->i2c_lock); in pca953x_gpio_set_value()
321 reg_val = chip->reg_output[off / BANK_SZ] in pca953x_gpio_set_value()
324 reg_val = chip->reg_output[off / BANK_SZ] in pca953x_gpio_set_value()
327 switch (chip->chip_type) { in pca953x_gpio_set_value()
335 ret = pca953x_write_single(chip, offset, reg_val, off); in pca953x_gpio_set_value()
339 chip->reg_output[off / BANK_SZ] = reg_val; in pca953x_gpio_set_value()
341 mutex_unlock(&chip->i2c_lock); in pca953x_gpio_set_value()
344 static void pca953x_setup_gpio(struct pca953x_chip *chip, int gpios) in pca953x_setup_gpio() argument
348 gc = &chip->gpio_chip; in pca953x_setup_gpio()
356 gc->base = chip->gpio_start; in pca953x_setup_gpio()
358 gc->label = chip->client->name; in pca953x_setup_gpio()
359 gc->dev = &chip->client->dev; in pca953x_setup_gpio()
361 gc->names = chip->names; in pca953x_setup_gpio()
368 struct pca953x_chip *chip = to_pca(gc); in pca953x_irq_mask() local
370 chip->irq_mask[d->hwirq / BANK_SZ] &= ~(1 << (d->hwirq % BANK_SZ)); in pca953x_irq_mask()
376 struct pca953x_chip *chip = to_pca(gc); in pca953x_irq_unmask() local
378 chip->irq_mask[d->hwirq / BANK_SZ] |= 1 << (d->hwirq % BANK_SZ); in pca953x_irq_unmask()
384 struct pca953x_chip *chip = to_pca(gc); in pca953x_irq_bus_lock() local
386 mutex_lock(&chip->irq_lock); in pca953x_irq_bus_lock()
392 struct pca953x_chip *chip = to_pca(gc); in pca953x_irq_bus_sync_unlock() local
397 for (i = 0; i < NBANK(chip); i++) { in pca953x_irq_bus_sync_unlock()
398 new_irqs = chip->irq_trig_fall[i] | chip->irq_trig_raise[i]; in pca953x_irq_bus_sync_unlock()
399 new_irqs &= ~chip->reg_direction[i]; in pca953x_irq_bus_sync_unlock()
403 pca953x_gpio_direction_input(&chip->gpio_chip, in pca953x_irq_bus_sync_unlock()
409 mutex_unlock(&chip->irq_lock); in pca953x_irq_bus_sync_unlock()
415 struct pca953x_chip *chip = to_pca(gc); in pca953x_irq_set_type() local
420 dev_err(&chip->client->dev, "irq %d: unsupported type %d\n", in pca953x_irq_set_type()
426 chip->irq_trig_fall[bank_nb] |= mask; in pca953x_irq_set_type()
428 chip->irq_trig_fall[bank_nb] &= ~mask; in pca953x_irq_set_type()
431 chip->irq_trig_raise[bank_nb] |= mask; in pca953x_irq_set_type()
433 chip->irq_trig_raise[bank_nb] &= ~mask; in pca953x_irq_set_type()
447 static u8 pca953x_irq_pending(struct pca953x_chip *chip, u8 *pending) in pca953x_irq_pending() argument
455 switch (chip->chip_type) { in pca953x_irq_pending()
463 ret = pca953x_read_regs(chip, offset, cur_stat); in pca953x_irq_pending()
468 for (i = 0; i < NBANK(chip); i++) in pca953x_irq_pending()
469 cur_stat[i] &= chip->reg_direction[i]; in pca953x_irq_pending()
471 memcpy(old_stat, chip->irq_stat, NBANK(chip)); in pca953x_irq_pending()
473 for (i = 0; i < NBANK(chip); i++) { in pca953x_irq_pending()
474 trigger[i] = (cur_stat[i] ^ old_stat[i]) & chip->irq_mask[i]; in pca953x_irq_pending()
481 memcpy(chip->irq_stat, cur_stat, NBANK(chip)); in pca953x_irq_pending()
483 for (i = 0; i < NBANK(chip); i++) { in pca953x_irq_pending()
484 pending[i] = (old_stat[i] & chip->irq_trig_fall[i]) | in pca953x_irq_pending()
485 (cur_stat[i] & chip->irq_trig_raise[i]); in pca953x_irq_pending()
495 struct pca953x_chip *chip = devid; in pca953x_irq_handler() local
501 if (!pca953x_irq_pending(chip, pending)) in pca953x_irq_handler()
504 for (i = 0; i < NBANK(chip); i++) { in pca953x_irq_handler()
507 handle_nested_irq(irq_find_mapping(chip->gpio_chip.irqdomain, in pca953x_irq_handler()
517 static int pca953x_irq_setup(struct pca953x_chip *chip, in pca953x_irq_setup() argument
521 struct i2c_client *client = chip->client; in pca953x_irq_setup()
527 switch (chip->chip_type) { in pca953x_irq_setup()
535 ret = pca953x_read_regs(chip, offset, chip->irq_stat); in pca953x_irq_setup()
544 for (i = 0; i < NBANK(chip); i++) in pca953x_irq_setup()
545 chip->irq_stat[i] &= chip->reg_direction[i]; in pca953x_irq_setup()
546 mutex_init(&chip->irq_lock); in pca953x_irq_setup()
554 dev_name(&client->dev), chip); in pca953x_irq_setup()
561 ret = gpiochip_irqchip_add(&chip->gpio_chip, in pca953x_irq_setup()
577 static int pca953x_irq_setup(struct pca953x_chip *chip, in pca953x_irq_setup() argument
581 struct i2c_client *client = chip->client; in pca953x_irq_setup()
590 static int device_pca953x_init(struct pca953x_chip *chip, u32 invert) in device_pca953x_init() argument
595 ret = pca953x_read_regs(chip, PCA953X_OUTPUT, chip->reg_output); in device_pca953x_init()
599 ret = pca953x_read_regs(chip, PCA953X_DIRECTION, in device_pca953x_init()
600 chip->reg_direction); in device_pca953x_init()
606 memset(val, 0xFF, NBANK(chip)); in device_pca953x_init()
608 memset(val, 0, NBANK(chip)); in device_pca953x_init()
610 ret = pca953x_write_regs(chip, PCA953X_INVERT, val); in device_pca953x_init()
615 static int device_pca957x_init(struct pca953x_chip *chip, u32 invert) in device_pca957x_init() argument
620 ret = pca953x_read_regs(chip, PCA957X_OUT, chip->reg_output); in device_pca957x_init()
623 ret = pca953x_read_regs(chip, PCA957X_CFG, chip->reg_direction); in device_pca957x_init()
629 memset(val, 0xFF, NBANK(chip)); in device_pca957x_init()
631 memset(val, 0, NBANK(chip)); in device_pca957x_init()
632 pca953x_write_regs(chip, PCA957X_INVRT, val); in device_pca957x_init()
635 memset(val, 0x02, NBANK(chip)); in device_pca957x_init()
636 pca953x_write_regs(chip, PCA957X_BKEN, val); in device_pca957x_init()
647 struct pca953x_chip *chip; in pca953x_probe() local
652 chip = devm_kzalloc(&client->dev, in pca953x_probe()
654 if (chip == NULL) in pca953x_probe()
660 chip->gpio_start = pdata->gpio_base; in pca953x_probe()
662 chip->names = pdata->names; in pca953x_probe()
664 chip->gpio_start = -1; in pca953x_probe()
668 chip->client = client; in pca953x_probe()
670 chip->chip_type = id->driver_data & (PCA953X_TYPE | PCA957X_TYPE); in pca953x_probe()
672 mutex_init(&chip->i2c_lock); in pca953x_probe()
677 pca953x_setup_gpio(chip, id->driver_data & PCA_GPIO_MASK); in pca953x_probe()
679 if (chip->chip_type == PCA953X_TYPE) in pca953x_probe()
680 ret = device_pca953x_init(chip, invert); in pca953x_probe()
682 ret = device_pca957x_init(chip, invert); in pca953x_probe()
686 ret = gpiochip_add(&chip->gpio_chip); in pca953x_probe()
690 ret = pca953x_irq_setup(chip, id, irq_base); in pca953x_probe()
695 ret = pdata->setup(client, chip->gpio_chip.base, in pca953x_probe()
696 chip->gpio_chip.ngpio, pdata->context); in pca953x_probe()
701 i2c_set_clientdata(client, chip); in pca953x_probe()
708 struct pca953x_chip *chip = i2c_get_clientdata(client); in pca953x_remove() local
712 ret = pdata->teardown(client, chip->gpio_chip.base, in pca953x_remove()
713 chip->gpio_chip.ngpio, pdata->context); in pca953x_remove()
721 gpiochip_remove(&chip->gpio_chip); in pca953x_remove()