Lines Matching refs:chip

187 static inline bool offset_is_oscio(struct sx150x_chip *chip, unsigned offset)  in offset_is_oscio()  argument
189 return (chip->dev_cfg->ngpios == offset); in offset_is_oscio()
220 static s32 sx150x_write_cfg(struct sx150x_chip *chip, in sx150x_write_cfg() argument
229 err = sx150x_i2c_read(chip->client, reg, &data); in sx150x_write_cfg()
235 return sx150x_i2c_write(chip->client, reg, data); in sx150x_write_cfg()
238 static int sx150x_get_io(struct sx150x_chip *chip, unsigned offset) in sx150x_get_io() argument
240 u8 reg = chip->dev_cfg->reg_data; in sx150x_get_io()
247 err = sx150x_i2c_read(chip->client, reg, &data); in sx150x_get_io()
254 static void sx150x_set_oscio(struct sx150x_chip *chip, int val) in sx150x_set_oscio() argument
256 sx150x_i2c_write(chip->client, in sx150x_set_oscio()
257 chip->dev_cfg->pri.x789.reg_clock, in sx150x_set_oscio()
261 static void sx150x_set_io(struct sx150x_chip *chip, unsigned offset, int val) in sx150x_set_io() argument
263 sx150x_write_cfg(chip, in sx150x_set_io()
266 chip->dev_cfg->reg_data, in sx150x_set_io()
270 static int sx150x_io_input(struct sx150x_chip *chip, unsigned offset) in sx150x_io_input() argument
272 return sx150x_write_cfg(chip, in sx150x_io_input()
275 chip->dev_cfg->reg_dir, in sx150x_io_input()
279 static int sx150x_io_output(struct sx150x_chip *chip, unsigned offset, int val) in sx150x_io_output() argument
283 err = sx150x_write_cfg(chip, in sx150x_io_output()
286 chip->dev_cfg->reg_data, in sx150x_io_output()
289 err = sx150x_write_cfg(chip, in sx150x_io_output()
292 chip->dev_cfg->reg_dir, in sx150x_io_output()
299 struct sx150x_chip *chip; in sx150x_gpio_get() local
302 chip = container_of(gc, struct sx150x_chip, gpio_chip); in sx150x_gpio_get()
304 if (!offset_is_oscio(chip, offset)) { in sx150x_gpio_get()
305 mutex_lock(&chip->lock); in sx150x_gpio_get()
306 status = sx150x_get_io(chip, offset); in sx150x_gpio_get()
307 mutex_unlock(&chip->lock); in sx150x_gpio_get()
315 struct sx150x_chip *chip; in sx150x_gpio_set() local
317 chip = container_of(gc, struct sx150x_chip, gpio_chip); in sx150x_gpio_set()
319 mutex_lock(&chip->lock); in sx150x_gpio_set()
320 if (offset_is_oscio(chip, offset)) in sx150x_gpio_set()
321 sx150x_set_oscio(chip, val); in sx150x_gpio_set()
323 sx150x_set_io(chip, offset, val); in sx150x_gpio_set()
324 mutex_unlock(&chip->lock); in sx150x_gpio_set()
329 struct sx150x_chip *chip; in sx150x_gpio_direction_input() local
332 chip = container_of(gc, struct sx150x_chip, gpio_chip); in sx150x_gpio_direction_input()
334 if (!offset_is_oscio(chip, offset)) { in sx150x_gpio_direction_input()
335 mutex_lock(&chip->lock); in sx150x_gpio_direction_input()
336 status = sx150x_io_input(chip, offset); in sx150x_gpio_direction_input()
337 mutex_unlock(&chip->lock); in sx150x_gpio_direction_input()
346 struct sx150x_chip *chip; in sx150x_gpio_direction_output() local
349 chip = container_of(gc, struct sx150x_chip, gpio_chip); in sx150x_gpio_direction_output()
351 if (!offset_is_oscio(chip, offset)) { in sx150x_gpio_direction_output()
352 mutex_lock(&chip->lock); in sx150x_gpio_direction_output()
353 status = sx150x_io_output(chip, offset, val); in sx150x_gpio_direction_output()
354 mutex_unlock(&chip->lock); in sx150x_gpio_direction_output()
361 struct sx150x_chip *chip = irq_data_get_irq_chip_data(d); in sx150x_irq_mask() local
364 chip->irq_masked |= (1 << n); in sx150x_irq_mask()
365 chip->irq_update = n; in sx150x_irq_mask()
370 struct sx150x_chip *chip = irq_data_get_irq_chip_data(d); in sx150x_irq_unmask() local
373 chip->irq_masked &= ~(1 << n); in sx150x_irq_unmask()
374 chip->irq_update = n; in sx150x_irq_unmask()
379 struct sx150x_chip *chip = irq_data_get_irq_chip_data(d); in sx150x_irq_set_type() local
392 chip->irq_sense &= ~(3UL << (n * 2)); in sx150x_irq_set_type()
393 chip->irq_sense |= val << (n * 2); in sx150x_irq_set_type()
394 chip->irq_update = n; in sx150x_irq_set_type()
400 struct sx150x_chip *chip = (struct sx150x_chip *)dev_id; in sx150x_irq_thread_fn() local
408 for (i = (chip->dev_cfg->ngpios / 8) - 1; i >= 0; --i) { in sx150x_irq_thread_fn()
409 err = sx150x_i2c_read(chip->client, in sx150x_irq_thread_fn()
410 chip->dev_cfg->reg_irq_src - i, in sx150x_irq_thread_fn()
415 sx150x_i2c_write(chip->client, in sx150x_irq_thread_fn()
416 chip->dev_cfg->reg_irq_src - i, in sx150x_irq_thread_fn()
421 chip->gpio_chip.irqdomain, in sx150x_irq_thread_fn()
434 struct sx150x_chip *chip = irq_data_get_irq_chip_data(d); in sx150x_irq_bus_lock() local
436 mutex_lock(&chip->lock); in sx150x_irq_bus_lock()
441 struct sx150x_chip *chip = irq_data_get_irq_chip_data(d); in sx150x_irq_bus_sync_unlock() local
444 if (chip->irq_update == NO_UPDATE_PENDING) in sx150x_irq_bus_sync_unlock()
447 n = chip->irq_update; in sx150x_irq_bus_sync_unlock()
448 chip->irq_update = NO_UPDATE_PENDING; in sx150x_irq_bus_sync_unlock()
451 if (chip->dev_sense == chip->irq_sense && in sx150x_irq_bus_sync_unlock()
452 chip->dev_masked == chip->irq_masked) in sx150x_irq_bus_sync_unlock()
455 chip->dev_sense = chip->irq_sense; in sx150x_irq_bus_sync_unlock()
456 chip->dev_masked = chip->irq_masked; in sx150x_irq_bus_sync_unlock()
458 if (chip->irq_masked & (1 << n)) { in sx150x_irq_bus_sync_unlock()
459 sx150x_write_cfg(chip, n, 1, chip->dev_cfg->reg_irq_mask, 1); in sx150x_irq_bus_sync_unlock()
460 sx150x_write_cfg(chip, n, 2, chip->dev_cfg->reg_sense, 0); in sx150x_irq_bus_sync_unlock()
462 sx150x_write_cfg(chip, n, 1, chip->dev_cfg->reg_irq_mask, 0); in sx150x_irq_bus_sync_unlock()
463 sx150x_write_cfg(chip, n, 2, chip->dev_cfg->reg_sense, in sx150x_irq_bus_sync_unlock()
464 chip->irq_sense >> (n * 2)); in sx150x_irq_bus_sync_unlock()
467 mutex_unlock(&chip->lock); in sx150x_irq_bus_sync_unlock()
470 static void sx150x_init_chip(struct sx150x_chip *chip, in sx150x_init_chip() argument
475 mutex_init(&chip->lock); in sx150x_init_chip()
477 chip->client = client; in sx150x_init_chip()
478 chip->dev_cfg = &sx150x_devices[driver_data]; in sx150x_init_chip()
479 chip->gpio_chip.dev = &client->dev; in sx150x_init_chip()
480 chip->gpio_chip.label = client->name; in sx150x_init_chip()
481 chip->gpio_chip.direction_input = sx150x_gpio_direction_input; in sx150x_init_chip()
482 chip->gpio_chip.direction_output = sx150x_gpio_direction_output; in sx150x_init_chip()
483 chip->gpio_chip.get = sx150x_gpio_get; in sx150x_init_chip()
484 chip->gpio_chip.set = sx150x_gpio_set; in sx150x_init_chip()
485 chip->gpio_chip.base = pdata->gpio_base; in sx150x_init_chip()
486 chip->gpio_chip.can_sleep = true; in sx150x_init_chip()
487 chip->gpio_chip.ngpio = chip->dev_cfg->ngpios; in sx150x_init_chip()
489 chip->gpio_chip.of_node = client->dev.of_node; in sx150x_init_chip()
490 chip->gpio_chip.of_gpio_n_cells = 2; in sx150x_init_chip()
493 ++chip->gpio_chip.ngpio; in sx150x_init_chip()
495 chip->irq_chip.name = client->name; in sx150x_init_chip()
496 chip->irq_chip.irq_mask = sx150x_irq_mask; in sx150x_init_chip()
497 chip->irq_chip.irq_unmask = sx150x_irq_unmask; in sx150x_init_chip()
498 chip->irq_chip.irq_set_type = sx150x_irq_set_type; in sx150x_init_chip()
499 chip->irq_chip.irq_bus_lock = sx150x_irq_bus_lock; in sx150x_init_chip()
500 chip->irq_chip.irq_bus_sync_unlock = sx150x_irq_bus_sync_unlock; in sx150x_init_chip()
501 chip->irq_summary = -1; in sx150x_init_chip()
502 chip->irq_base = -1; in sx150x_init_chip()
503 chip->irq_masked = ~0; in sx150x_init_chip()
504 chip->irq_sense = 0; in sx150x_init_chip()
505 chip->dev_masked = ~0; in sx150x_init_chip()
506 chip->dev_sense = 0; in sx150x_init_chip()
507 chip->irq_update = NO_UPDATE_PENDING; in sx150x_init_chip()
510 static int sx150x_init_io(struct sx150x_chip *chip, u8 base, u16 cfg) in sx150x_init_io() argument
515 for (n = 0; err >= 0 && n < (chip->dev_cfg->ngpios / 8); ++n) in sx150x_init_io()
516 err = sx150x_i2c_write(chip->client, base - n, cfg >> (n * 8)); in sx150x_init_io()
520 static int sx150x_reset(struct sx150x_chip *chip) in sx150x_reset() argument
524 err = i2c_smbus_write_byte_data(chip->client, in sx150x_reset()
525 chip->dev_cfg->pri.x789.reg_reset, in sx150x_reset()
530 err = i2c_smbus_write_byte_data(chip->client, in sx150x_reset()
531 chip->dev_cfg->pri.x789.reg_reset, in sx150x_reset()
536 static int sx150x_init_hw(struct sx150x_chip *chip, in sx150x_init_hw() argument
542 err = sx150x_reset(chip); in sx150x_init_hw()
547 if (chip->dev_cfg->model == SX150X_789) in sx150x_init_hw()
548 err = sx150x_i2c_write(chip->client, in sx150x_init_hw()
549 chip->dev_cfg->pri.x789.reg_misc, in sx150x_init_hw()
552 err = sx150x_i2c_write(chip->client, in sx150x_init_hw()
553 chip->dev_cfg->pri.x456.reg_advance, in sx150x_init_hw()
558 err = sx150x_init_io(chip, chip->dev_cfg->reg_pullup, in sx150x_init_hw()
563 err = sx150x_init_io(chip, chip->dev_cfg->reg_pulldn, in sx150x_init_hw()
568 if (chip->dev_cfg->model == SX150X_789) { in sx150x_init_hw()
569 err = sx150x_init_io(chip, in sx150x_init_hw()
570 chip->dev_cfg->pri.x789.reg_drain, in sx150x_init_hw()
575 err = sx150x_init_io(chip, in sx150x_init_hw()
576 chip->dev_cfg->pri.x789.reg_polarity, in sx150x_init_hw()
582 err = sx150x_init_io(chip, in sx150x_init_hw()
583 chip->dev_cfg->pri.x456.reg_pld_mode, in sx150x_init_hw()
591 sx150x_set_oscio(chip, 0); in sx150x_init_hw()
596 static int sx150x_install_irq_chip(struct sx150x_chip *chip, in sx150x_install_irq_chip() argument
602 chip->irq_summary = irq_summary; in sx150x_install_irq_chip()
603 chip->irq_base = irq_base; in sx150x_install_irq_chip()
606 err = gpiochip_irqchip_add(&chip->gpio_chip, in sx150x_install_irq_chip()
607 &chip->irq_chip, chip->irq_base, in sx150x_install_irq_chip()
610 dev_err(&chip->client->dev, in sx150x_install_irq_chip()
615 err = devm_request_threaded_irq(&chip->client->dev, in sx150x_install_irq_chip()
618 chip->irq_chip.name, chip); in sx150x_install_irq_chip()
620 chip->irq_summary = -1; in sx150x_install_irq_chip()
621 chip->irq_base = -1; in sx150x_install_irq_chip()
633 struct sx150x_chip *chip; in sx150x_probe() local
643 chip = devm_kzalloc(&client->dev, in sx150x_probe()
645 if (!chip) in sx150x_probe()
648 sx150x_init_chip(chip, client, id->driver_data, pdata); in sx150x_probe()
649 rc = sx150x_init_hw(chip, pdata); in sx150x_probe()
653 rc = gpiochip_add(&chip->gpio_chip); in sx150x_probe()
658 rc = sx150x_install_irq_chip(chip, in sx150x_probe()
665 i2c_set_clientdata(client, chip); in sx150x_probe()
669 gpiochip_remove(&chip->gpio_chip); in sx150x_probe()
675 struct sx150x_chip *chip; in sx150x_remove() local
677 chip = i2c_get_clientdata(client); in sx150x_remove()
678 gpiochip_remove(&chip->gpio_chip); in sx150x_remove()