Lines Matching refs:chip

166 static int max732x_writeb(struct max732x_chip *chip, int group_a, uint8_t val)  in max732x_writeb()  argument
171 client = group_a ? chip->client_group_a : chip->client_group_b; in max732x_writeb()
181 static int max732x_readb(struct max732x_chip *chip, int group_a, uint8_t *val) in max732x_readb() argument
186 client = group_a ? chip->client_group_a : chip->client_group_b; in max732x_readb()
197 static inline int is_group_a(struct max732x_chip *chip, unsigned off) in is_group_a() argument
199 return (1u << off) & chip->mask_group_a; in is_group_a()
204 struct max732x_chip *chip = to_max732x(gc); in max732x_gpio_get_value() local
208 ret = max732x_readb(chip, is_group_a(chip, off), &reg_val); in max732x_gpio_get_value()
218 struct max732x_chip *chip = to_max732x(gc); in max732x_gpio_set_mask() local
222 mutex_lock(&chip->lock); in max732x_gpio_set_mask()
224 reg_out = (off > 7) ? chip->reg_out[1] : chip->reg_out[0]; in max732x_gpio_set_mask()
227 ret = max732x_writeb(chip, is_group_a(chip, off), reg_out); in max732x_gpio_set_mask()
233 chip->reg_out[1] = reg_out; in max732x_gpio_set_mask()
235 chip->reg_out[0] = reg_out; in max732x_gpio_set_mask()
237 mutex_unlock(&chip->lock); in max732x_gpio_set_mask()
262 struct max732x_chip *chip = to_max732x(gc); in max732x_gpio_direction_input() local
265 if ((mask & chip->dir_input) == 0) { in max732x_gpio_direction_input()
266 dev_dbg(&chip->client->dev, "%s port %d is output only\n", in max732x_gpio_direction_input()
267 chip->client->name, off); in max732x_gpio_direction_input()
275 if ((mask & chip->dir_output)) in max732x_gpio_direction_input()
284 struct max732x_chip *chip = to_max732x(gc); in max732x_gpio_direction_output() local
287 if ((mask & chip->dir_output) == 0) { in max732x_gpio_direction_output()
288 dev_dbg(&chip->client->dev, "%s port %d is input only\n", in max732x_gpio_direction_output()
289 chip->client->name, off); in max732x_gpio_direction_output()
298 static int max732x_writew(struct max732x_chip *chip, uint16_t val) in max732x_writew() argument
304 ret = i2c_master_send(chip->client_group_a, (char *)&val, 2); in max732x_writew()
306 dev_err(&chip->client_group_a->dev, "failed writing\n"); in max732x_writew()
313 static int max732x_readw(struct max732x_chip *chip, uint16_t *val) in max732x_readw() argument
317 ret = i2c_master_recv(chip->client_group_a, (char *)val, 2); in max732x_readw()
319 dev_err(&chip->client_group_a->dev, "failed reading\n"); in max732x_readw()
327 static void max732x_irq_update_mask(struct max732x_chip *chip) in max732x_irq_update_mask() argument
331 if (chip->irq_mask == chip->irq_mask_cur) in max732x_irq_update_mask()
334 chip->irq_mask = chip->irq_mask_cur; in max732x_irq_update_mask()
336 if (chip->irq_features == INT_NO_MASK) in max732x_irq_update_mask()
339 mutex_lock(&chip->lock); in max732x_irq_update_mask()
341 switch (chip->irq_features) { in max732x_irq_update_mask()
343 msg = (chip->irq_mask << 8) | chip->reg_out[0]; in max732x_irq_update_mask()
344 max732x_writew(chip, msg); in max732x_irq_update_mask()
348 msg = chip->irq_mask | chip->reg_out[0]; in max732x_irq_update_mask()
349 max732x_writeb(chip, 1, (uint8_t)msg); in max732x_irq_update_mask()
353 mutex_unlock(&chip->lock); in max732x_irq_update_mask()
359 struct max732x_chip *chip = to_max732x(gc); in max732x_irq_mask() local
361 chip->irq_mask_cur &= ~(1 << d->hwirq); in max732x_irq_mask()
367 struct max732x_chip *chip = to_max732x(gc); in max732x_irq_unmask() local
369 chip->irq_mask_cur |= 1 << d->hwirq; in max732x_irq_unmask()
375 struct max732x_chip *chip = to_max732x(gc); in max732x_irq_bus_lock() local
377 mutex_lock(&chip->irq_lock); in max732x_irq_bus_lock()
378 chip->irq_mask_cur = chip->irq_mask; in max732x_irq_bus_lock()
384 struct max732x_chip *chip = to_max732x(gc); in max732x_irq_bus_sync_unlock() local
388 max732x_irq_update_mask(chip); in max732x_irq_bus_sync_unlock()
390 new_irqs = chip->irq_trig_fall | chip->irq_trig_raise; in max732x_irq_bus_sync_unlock()
393 max732x_gpio_direction_input(&chip->gpio_chip, level); in max732x_irq_bus_sync_unlock()
397 mutex_unlock(&chip->irq_lock); in max732x_irq_bus_sync_unlock()
403 struct max732x_chip *chip = to_max732x(gc); in max732x_irq_set_type() local
407 if (!(mask & chip->dir_input)) { in max732x_irq_set_type()
408 dev_dbg(&chip->client->dev, "%s port %d is output only\n", in max732x_irq_set_type()
409 chip->client->name, off); in max732x_irq_set_type()
414 dev_err(&chip->client->dev, "irq %d: unsupported type %d\n", in max732x_irq_set_type()
420 chip->irq_trig_fall |= mask; in max732x_irq_set_type()
422 chip->irq_trig_fall &= ~mask; in max732x_irq_set_type()
425 chip->irq_trig_raise |= mask; in max732x_irq_set_type()
427 chip->irq_trig_raise &= ~mask; in max732x_irq_set_type()
441 static uint8_t max732x_irq_pending(struct max732x_chip *chip) in max732x_irq_pending() argument
450 ret = max732x_readw(chip, &status); in max732x_irq_pending()
455 trigger &= chip->irq_mask; in max732x_irq_pending()
461 cur_stat &= chip->irq_mask; in max732x_irq_pending()
465 pending = (old_stat & chip->irq_trig_fall) | in max732x_irq_pending()
466 (cur_stat & chip->irq_trig_raise); in max732x_irq_pending()
474 struct max732x_chip *chip = devid; in max732x_irq_handler() local
478 pending = max732x_irq_pending(chip); in max732x_irq_handler()
485 handle_nested_irq(irq_find_mapping(chip->gpio_chip.irqdomain, in max732x_irq_handler()
494 static int max732x_irq_setup(struct max732x_chip *chip, in max732x_irq_setup() argument
497 struct i2c_client *client = chip->client; in max732x_irq_setup()
507 chip->irq_features = has_irq; in max732x_irq_setup()
508 mutex_init(&chip->irq_lock); in max732x_irq_setup()
515 dev_name(&client->dev), chip); in max732x_irq_setup()
521 ret = gpiochip_irqchip_add(&chip->gpio_chip, in max732x_irq_setup()
531 gpiochip_set_chained_irqchip(&chip->gpio_chip, in max732x_irq_setup()
541 static int max732x_irq_setup(struct max732x_chip *chip, in max732x_irq_setup() argument
544 struct i2c_client *client = chip->client; in max732x_irq_setup()
555 static int max732x_setup_gpio(struct max732x_chip *chip, in max732x_setup_gpio() argument
559 struct gpio_chip *gc = &chip->gpio_chip; in max732x_setup_gpio()
568 chip->dir_output |= mask; in max732x_setup_gpio()
571 chip->dir_input |= mask; in max732x_setup_gpio()
574 chip->dir_output |= mask; in max732x_setup_gpio()
575 chip->dir_input |= mask; in max732x_setup_gpio()
582 chip->mask_group_a |= mask; in max732x_setup_gpio()
586 if (chip->dir_input) in max732x_setup_gpio()
588 if (chip->dir_output) { in max732x_setup_gpio()
598 gc->label = chip->client->name; in max732x_setup_gpio()
622 struct max732x_chip *chip; in max732x_probe() local
638 chip = devm_kzalloc(&client->dev, sizeof(*chip), GFP_KERNEL); in max732x_probe()
639 if (chip == NULL) in max732x_probe()
641 chip->client = client; in max732x_probe()
643 nr_port = max732x_setup_gpio(chip, id, pdata->gpio_base); in max732x_probe()
644 chip->gpio_chip.dev = &client->dev; in max732x_probe()
651 chip->client_group_a = client; in max732x_probe()
654 chip->client_group_b = chip->client_dummy = c; in max732x_probe()
658 chip->client_group_b = client; in max732x_probe()
661 chip->client_group_a = chip->client_dummy = c; in max732x_probe()
671 if (nr_port > 8 && !chip->client_dummy) { in max732x_probe()
678 mutex_init(&chip->lock); in max732x_probe()
680 max732x_readb(chip, is_group_a(chip, 0), &chip->reg_out[0]); in max732x_probe()
682 max732x_readb(chip, is_group_a(chip, 8), &chip->reg_out[1]); in max732x_probe()
684 ret = gpiochip_add(&chip->gpio_chip); in max732x_probe()
688 ret = max732x_irq_setup(chip, id); in max732x_probe()
690 gpiochip_remove(&chip->gpio_chip); in max732x_probe()
695 ret = pdata->setup(client, chip->gpio_chip.base, in max732x_probe()
696 chip->gpio_chip.ngpio, pdata->context); in max732x_probe()
701 i2c_set_clientdata(client, chip); in max732x_probe()
705 if (chip->client_dummy) in max732x_probe()
706 i2c_unregister_device(chip->client_dummy); in max732x_probe()
713 struct max732x_chip *chip = i2c_get_clientdata(client); in max732x_remove() local
718 ret = pdata->teardown(client, chip->gpio_chip.base, in max732x_remove()
719 chip->gpio_chip.ngpio, pdata->context); in max732x_remove()
727 gpiochip_remove(&chip->gpio_chip); in max732x_remove()
730 if (chip->client_dummy) in max732x_remove()
731 i2c_unregister_device(chip->client_dummy); in max732x_remove()