• Home
  • Raw
  • Download

Lines Matching refs:chip

89 #define NBANK(chip) DIV_ROUND_UP(chip->gpio_chip.ngpio, BANK_SZ)  argument
117 static int pca953x_read_single(struct pca953x_chip *chip, int reg, u32 *val, in pca953x_read_single() argument
121 int bank_shift = fls((chip->gpio_chip.ngpio - 1) / BANK_SZ); in pca953x_read_single()
124 ret = i2c_smbus_read_byte_data(chip->client, in pca953x_read_single()
129 dev_err(&chip->client->dev, "failed reading register\n"); in pca953x_read_single()
136 static int pca953x_write_single(struct pca953x_chip *chip, int reg, u32 val, in pca953x_write_single() argument
140 int bank_shift = fls((chip->gpio_chip.ngpio - 1) / BANK_SZ); in pca953x_write_single()
143 ret = i2c_smbus_write_byte_data(chip->client, in pca953x_write_single()
147 dev_err(&chip->client->dev, "failed writing register\n"); in pca953x_write_single()
154 static int pca953x_write_regs(struct pca953x_chip *chip, int reg, u8 *val) in pca953x_write_regs() argument
158 if (chip->gpio_chip.ngpio <= 8) in pca953x_write_regs()
159 ret = i2c_smbus_write_byte_data(chip->client, reg, *val); in pca953x_write_regs()
160 else if (chip->gpio_chip.ngpio >= 24) { in pca953x_write_regs()
161 int bank_shift = fls((chip->gpio_chip.ngpio - 1) / BANK_SZ); in pca953x_write_regs()
162 ret = i2c_smbus_write_i2c_block_data(chip->client, in pca953x_write_regs()
164 NBANK(chip), val); in pca953x_write_regs()
166 switch (chip->chip_type) { in pca953x_write_regs()
168 ret = i2c_smbus_write_word_data(chip->client, in pca953x_write_regs()
172 ret = i2c_smbus_write_byte_data(chip->client, reg << 1, in pca953x_write_regs()
176 ret = i2c_smbus_write_byte_data(chip->client, in pca953x_write_regs()
184 dev_err(&chip->client->dev, "failed writing register\n"); in pca953x_write_regs()
191 static int pca953x_read_regs(struct pca953x_chip *chip, int reg, u8 *val) in pca953x_read_regs() argument
195 if (chip->gpio_chip.ngpio <= 8) { in pca953x_read_regs()
196 ret = i2c_smbus_read_byte_data(chip->client, reg); in pca953x_read_regs()
198 } else if (chip->gpio_chip.ngpio >= 24) { in pca953x_read_regs()
199 int bank_shift = fls((chip->gpio_chip.ngpio - 1) / BANK_SZ); in pca953x_read_regs()
201 ret = i2c_smbus_read_i2c_block_data(chip->client, in pca953x_read_regs()
203 NBANK(chip), val); in pca953x_read_regs()
205 ret = i2c_smbus_read_word_data(chip->client, reg << 1); in pca953x_read_regs()
210 dev_err(&chip->client->dev, "failed reading register\n"); in pca953x_read_regs()
219 struct pca953x_chip *chip = to_pca(gc); in pca953x_gpio_direction_input() local
223 mutex_lock(&chip->i2c_lock); in pca953x_gpio_direction_input()
224 reg_val = chip->reg_direction[off / BANK_SZ] | (1u << (off % BANK_SZ)); in pca953x_gpio_direction_input()
226 switch (chip->chip_type) { in pca953x_gpio_direction_input()
234 ret = pca953x_write_single(chip, offset, reg_val, off); in pca953x_gpio_direction_input()
238 chip->reg_direction[off / BANK_SZ] = reg_val; in pca953x_gpio_direction_input()
241 mutex_unlock(&chip->i2c_lock); in pca953x_gpio_direction_input()
248 struct pca953x_chip *chip = to_pca(gc); in pca953x_gpio_direction_output() local
252 mutex_lock(&chip->i2c_lock); in pca953x_gpio_direction_output()
255 reg_val = chip->reg_output[off / BANK_SZ] in pca953x_gpio_direction_output()
258 reg_val = chip->reg_output[off / BANK_SZ] in pca953x_gpio_direction_output()
261 switch (chip->chip_type) { in pca953x_gpio_direction_output()
269 ret = pca953x_write_single(chip, offset, reg_val, off); in pca953x_gpio_direction_output()
273 chip->reg_output[off / BANK_SZ] = reg_val; in pca953x_gpio_direction_output()
276 reg_val = chip->reg_direction[off / BANK_SZ] & ~(1u << (off % BANK_SZ)); in pca953x_gpio_direction_output()
277 switch (chip->chip_type) { in pca953x_gpio_direction_output()
285 ret = pca953x_write_single(chip, offset, reg_val, off); in pca953x_gpio_direction_output()
289 chip->reg_direction[off / BANK_SZ] = reg_val; in pca953x_gpio_direction_output()
292 mutex_unlock(&chip->i2c_lock); in pca953x_gpio_direction_output()
298 struct pca953x_chip *chip = to_pca(gc); in pca953x_gpio_get_value() local
302 mutex_lock(&chip->i2c_lock); in pca953x_gpio_get_value()
303 switch (chip->chip_type) { in pca953x_gpio_get_value()
311 ret = pca953x_read_single(chip, offset, &reg_val, off); in pca953x_gpio_get_value()
312 mutex_unlock(&chip->i2c_lock); in pca953x_gpio_get_value()
326 struct pca953x_chip *chip = to_pca(gc); in pca953x_gpio_set_value() local
330 mutex_lock(&chip->i2c_lock); in pca953x_gpio_set_value()
332 reg_val = chip->reg_output[off / BANK_SZ] in pca953x_gpio_set_value()
335 reg_val = chip->reg_output[off / BANK_SZ] in pca953x_gpio_set_value()
338 switch (chip->chip_type) { in pca953x_gpio_set_value()
346 ret = pca953x_write_single(chip, offset, reg_val, off); in pca953x_gpio_set_value()
350 chip->reg_output[off / BANK_SZ] = reg_val; in pca953x_gpio_set_value()
352 mutex_unlock(&chip->i2c_lock); in pca953x_gpio_set_value()
355 static void pca953x_setup_gpio(struct pca953x_chip *chip, int gpios) in pca953x_setup_gpio() argument
359 gc = &chip->gpio_chip; in pca953x_setup_gpio()
367 gc->base = chip->gpio_start; in pca953x_setup_gpio()
369 gc->label = chip->client->name; in pca953x_setup_gpio()
370 gc->dev = &chip->client->dev; in pca953x_setup_gpio()
372 gc->names = chip->names; in pca953x_setup_gpio()
379 struct pca953x_chip *chip = to_pca(gc); in pca953x_irq_mask() local
381 chip->irq_mask[d->hwirq / BANK_SZ] &= ~(1 << (d->hwirq % BANK_SZ)); in pca953x_irq_mask()
387 struct pca953x_chip *chip = to_pca(gc); in pca953x_irq_unmask() local
389 chip->irq_mask[d->hwirq / BANK_SZ] |= 1 << (d->hwirq % BANK_SZ); in pca953x_irq_unmask()
395 struct pca953x_chip *chip = to_pca(gc); in pca953x_irq_bus_lock() local
397 mutex_lock(&chip->irq_lock); in pca953x_irq_bus_lock()
403 struct pca953x_chip *chip = to_pca(gc); in pca953x_irq_bus_sync_unlock() local
408 for (i = 0; i < NBANK(chip); i++) { in pca953x_irq_bus_sync_unlock()
409 new_irqs = chip->irq_trig_fall[i] | chip->irq_trig_raise[i]; in pca953x_irq_bus_sync_unlock()
410 new_irqs &= ~chip->reg_direction[i]; in pca953x_irq_bus_sync_unlock()
414 pca953x_gpio_direction_input(&chip->gpio_chip, in pca953x_irq_bus_sync_unlock()
420 mutex_unlock(&chip->irq_lock); in pca953x_irq_bus_sync_unlock()
426 struct pca953x_chip *chip = to_pca(gc); in pca953x_irq_set_type() local
431 dev_err(&chip->client->dev, "irq %d: unsupported type %d\n", in pca953x_irq_set_type()
437 chip->irq_trig_fall[bank_nb] |= mask; in pca953x_irq_set_type()
439 chip->irq_trig_fall[bank_nb] &= ~mask; in pca953x_irq_set_type()
442 chip->irq_trig_raise[bank_nb] |= mask; in pca953x_irq_set_type()
444 chip->irq_trig_raise[bank_nb] &= ~mask; in pca953x_irq_set_type()
458 static bool pca953x_irq_pending(struct pca953x_chip *chip, u8 *pending) in pca953x_irq_pending() argument
467 switch (chip->chip_type) { in pca953x_irq_pending()
475 ret = pca953x_read_regs(chip, offset, cur_stat); in pca953x_irq_pending()
480 for (i = 0; i < NBANK(chip); i++) in pca953x_irq_pending()
481 cur_stat[i] &= chip->reg_direction[i]; in pca953x_irq_pending()
483 memcpy(old_stat, chip->irq_stat, NBANK(chip)); in pca953x_irq_pending()
485 for (i = 0; i < NBANK(chip); i++) { in pca953x_irq_pending()
486 trigger[i] = (cur_stat[i] ^ old_stat[i]) & chip->irq_mask[i]; in pca953x_irq_pending()
494 memcpy(chip->irq_stat, cur_stat, NBANK(chip)); in pca953x_irq_pending()
496 for (i = 0; i < NBANK(chip); i++) { in pca953x_irq_pending()
497 pending[i] = (old_stat[i] & chip->irq_trig_fall[i]) | in pca953x_irq_pending()
498 (cur_stat[i] & chip->irq_trig_raise[i]); in pca953x_irq_pending()
509 struct pca953x_chip *chip = devid; in pca953x_irq_handler() local
515 if (!pca953x_irq_pending(chip, pending)) in pca953x_irq_handler()
518 for (i = 0; i < NBANK(chip); i++) { in pca953x_irq_handler()
521 handle_nested_irq(irq_find_mapping(chip->gpio_chip.irqdomain, in pca953x_irq_handler()
531 static int pca953x_irq_setup(struct pca953x_chip *chip, in pca953x_irq_setup() argument
534 struct i2c_client *client = chip->client; in pca953x_irq_setup()
538 && (chip->driver_data & PCA_INT)) { in pca953x_irq_setup()
540 switch (chip->chip_type) { in pca953x_irq_setup()
548 ret = pca953x_read_regs(chip, offset, chip->irq_stat); in pca953x_irq_setup()
557 for (i = 0; i < NBANK(chip); i++) in pca953x_irq_setup()
558 chip->irq_stat[i] &= chip->reg_direction[i]; in pca953x_irq_setup()
559 mutex_init(&chip->irq_lock); in pca953x_irq_setup()
567 dev_name(&client->dev), chip); in pca953x_irq_setup()
574 ret = gpiochip_irqchip_add(&chip->gpio_chip, in pca953x_irq_setup()
585 gpiochip_set_chained_irqchip(&chip->gpio_chip, in pca953x_irq_setup()
594 static int pca953x_irq_setup(struct pca953x_chip *chip, in pca953x_irq_setup() argument
597 struct i2c_client *client = chip->client; in pca953x_irq_setup()
599 if (irq_base != -1 && (chip->driver_data & PCA_INT)) in pca953x_irq_setup()
606 static int device_pca953x_init(struct pca953x_chip *chip, u32 invert) in device_pca953x_init() argument
611 ret = pca953x_read_regs(chip, PCA953X_OUTPUT, chip->reg_output); in device_pca953x_init()
615 ret = pca953x_read_regs(chip, PCA953X_DIRECTION, in device_pca953x_init()
616 chip->reg_direction); in device_pca953x_init()
622 memset(val, 0xFF, NBANK(chip)); in device_pca953x_init()
624 memset(val, 0, NBANK(chip)); in device_pca953x_init()
626 ret = pca953x_write_regs(chip, PCA953X_INVERT, val); in device_pca953x_init()
631 static int device_pca957x_init(struct pca953x_chip *chip, u32 invert) in device_pca957x_init() argument
636 ret = pca953x_read_regs(chip, PCA957X_OUT, chip->reg_output); in device_pca957x_init()
639 ret = pca953x_read_regs(chip, PCA957X_CFG, chip->reg_direction); in device_pca957x_init()
645 memset(val, 0xFF, NBANK(chip)); in device_pca957x_init()
647 memset(val, 0, NBANK(chip)); in device_pca957x_init()
648 ret = pca953x_write_regs(chip, PCA957X_INVRT, val); in device_pca957x_init()
653 memset(val, 0x02, NBANK(chip)); in device_pca957x_init()
654 ret = pca953x_write_regs(chip, PCA957X_BKEN, val); in device_pca957x_init()
667 struct pca953x_chip *chip; in pca953x_probe() local
672 chip = devm_kzalloc(&client->dev, in pca953x_probe()
674 if (chip == NULL) in pca953x_probe()
680 chip->gpio_start = pdata->gpio_base; in pca953x_probe()
682 chip->names = pdata->names; in pca953x_probe()
684 chip->gpio_start = -1; in pca953x_probe()
688 chip->client = client; in pca953x_probe()
691 chip->driver_data = id->driver_data; in pca953x_probe()
699 chip->driver_data = id->driver_data; in pca953x_probe()
702 chip->chip_type = PCA_CHIP_TYPE(chip->driver_data); in pca953x_probe()
704 mutex_init(&chip->i2c_lock); in pca953x_probe()
709 pca953x_setup_gpio(chip, chip->driver_data & PCA_GPIO_MASK); in pca953x_probe()
711 if (chip->chip_type == PCA953X_TYPE) in pca953x_probe()
712 ret = device_pca953x_init(chip, invert); in pca953x_probe()
714 ret = device_pca957x_init(chip, invert); in pca953x_probe()
718 ret = gpiochip_add(&chip->gpio_chip); in pca953x_probe()
722 ret = pca953x_irq_setup(chip, irq_base); in pca953x_probe()
727 ret = pdata->setup(client, chip->gpio_chip.base, in pca953x_probe()
728 chip->gpio_chip.ngpio, pdata->context); in pca953x_probe()
733 i2c_set_clientdata(client, chip); in pca953x_probe()
740 struct pca953x_chip *chip = i2c_get_clientdata(client); in pca953x_remove() local
744 ret = pdata->teardown(client, chip->gpio_chip.base, in pca953x_remove()
745 chip->gpio_chip.ngpio, pdata->context); in pca953x_remove()
753 gpiochip_remove(&chip->gpio_chip); in pca953x_remove()