Lines Matching refs:kpad
391 struct adp5589_kpad *kpad = gpiochip_get_data(chip); in adp5589_gpio_get_value() local
392 unsigned int bank = kpad->var->bank(kpad->gpiomap[off]); in adp5589_gpio_get_value()
393 unsigned int bit = kpad->var->bit(kpad->gpiomap[off]); in adp5589_gpio_get_value()
396 mutex_lock(&kpad->gpio_lock); in adp5589_gpio_get_value()
397 if (kpad->dir[bank] & bit) in adp5589_gpio_get_value()
398 val = kpad->dat_out[bank]; in adp5589_gpio_get_value()
400 val = adp5589_read(kpad->client, in adp5589_gpio_get_value()
401 kpad->var->reg(ADP5589_GPI_STATUS_A) + bank); in adp5589_gpio_get_value()
402 mutex_unlock(&kpad->gpio_lock); in adp5589_gpio_get_value()
410 struct adp5589_kpad *kpad = gpiochip_get_data(chip); in adp5589_gpio_set_value() local
411 unsigned int bank = kpad->var->bank(kpad->gpiomap[off]); in adp5589_gpio_set_value()
412 unsigned int bit = kpad->var->bit(kpad->gpiomap[off]); in adp5589_gpio_set_value()
414 mutex_lock(&kpad->gpio_lock); in adp5589_gpio_set_value()
417 kpad->dat_out[bank] |= bit; in adp5589_gpio_set_value()
419 kpad->dat_out[bank] &= ~bit; in adp5589_gpio_set_value()
421 adp5589_write(kpad->client, kpad->var->reg(ADP5589_GPO_DATA_OUT_A) + in adp5589_gpio_set_value()
422 bank, kpad->dat_out[bank]); in adp5589_gpio_set_value()
424 mutex_unlock(&kpad->gpio_lock); in adp5589_gpio_set_value()
429 struct adp5589_kpad *kpad = gpiochip_get_data(chip); in adp5589_gpio_direction_input() local
430 unsigned int bank = kpad->var->bank(kpad->gpiomap[off]); in adp5589_gpio_direction_input()
431 unsigned int bit = kpad->var->bit(kpad->gpiomap[off]); in adp5589_gpio_direction_input()
434 mutex_lock(&kpad->gpio_lock); in adp5589_gpio_direction_input()
436 kpad->dir[bank] &= ~bit; in adp5589_gpio_direction_input()
437 ret = adp5589_write(kpad->client, in adp5589_gpio_direction_input()
438 kpad->var->reg(ADP5589_GPIO_DIRECTION_A) + bank, in adp5589_gpio_direction_input()
439 kpad->dir[bank]); in adp5589_gpio_direction_input()
441 mutex_unlock(&kpad->gpio_lock); in adp5589_gpio_direction_input()
449 struct adp5589_kpad *kpad = gpiochip_get_data(chip); in adp5589_gpio_direction_output() local
450 unsigned int bank = kpad->var->bank(kpad->gpiomap[off]); in adp5589_gpio_direction_output()
451 unsigned int bit = kpad->var->bit(kpad->gpiomap[off]); in adp5589_gpio_direction_output()
454 mutex_lock(&kpad->gpio_lock); in adp5589_gpio_direction_output()
456 kpad->dir[bank] |= bit; in adp5589_gpio_direction_output()
459 kpad->dat_out[bank] |= bit; in adp5589_gpio_direction_output()
461 kpad->dat_out[bank] &= ~bit; in adp5589_gpio_direction_output()
463 ret = adp5589_write(kpad->client, kpad->var->reg(ADP5589_GPO_DATA_OUT_A) in adp5589_gpio_direction_output()
464 + bank, kpad->dat_out[bank]); in adp5589_gpio_direction_output()
465 ret |= adp5589_write(kpad->client, in adp5589_gpio_direction_output()
466 kpad->var->reg(ADP5589_GPIO_DIRECTION_A) + bank, in adp5589_gpio_direction_output()
467 kpad->dir[bank]); in adp5589_gpio_direction_output()
469 mutex_unlock(&kpad->gpio_lock); in adp5589_gpio_direction_output()
474 static int adp5589_build_gpiomap(struct adp5589_kpad *kpad, in adp5589_build_gpiomap() argument
483 for (i = 0; i < kpad->var->maxgpio; i++) in adp5589_build_gpiomap()
487 for (i = 0; i < kpad->gpimapsize; i++) in adp5589_build_gpiomap()
488 pin_used[kpad->gpimap[i].pin - kpad->var->gpi_pin_base] = true; in adp5589_build_gpiomap()
490 if (kpad->extend_cfg & R4_EXTEND_CFG) in adp5589_build_gpiomap()
493 if (kpad->extend_cfg & C4_EXTEND_CFG) in adp5589_build_gpiomap()
494 pin_used[kpad->var->c4_extend_cfg] = true; in adp5589_build_gpiomap()
496 if (!kpad->support_row5) in adp5589_build_gpiomap()
499 for (i = 0; i < kpad->var->maxgpio; i++) in adp5589_build_gpiomap()
501 kpad->gpiomap[n_unused++] = i; in adp5589_build_gpiomap()
506 static int adp5589_gpio_add(struct adp5589_kpad *kpad) in adp5589_gpio_add() argument
508 struct device *dev = &kpad->client->dev; in adp5589_gpio_add()
516 kpad->gc.parent = dev; in adp5589_gpio_add()
517 kpad->gc.ngpio = adp5589_build_gpiomap(kpad, pdata); in adp5589_gpio_add()
518 if (kpad->gc.ngpio == 0) { in adp5589_gpio_add()
523 kpad->gc.direction_input = adp5589_gpio_direction_input; in adp5589_gpio_add()
524 kpad->gc.direction_output = adp5589_gpio_direction_output; in adp5589_gpio_add()
525 kpad->gc.get = adp5589_gpio_get_value; in adp5589_gpio_add()
526 kpad->gc.set = adp5589_gpio_set_value; in adp5589_gpio_add()
527 kpad->gc.can_sleep = 1; in adp5589_gpio_add()
529 kpad->gc.base = gpio_data->gpio_start; in adp5589_gpio_add()
530 kpad->gc.label = kpad->client->name; in adp5589_gpio_add()
531 kpad->gc.owner = THIS_MODULE; in adp5589_gpio_add()
533 mutex_init(&kpad->gpio_lock); in adp5589_gpio_add()
535 error = devm_gpiochip_add_data(dev, &kpad->gc, kpad); in adp5589_gpio_add()
539 for (i = 0; i <= kpad->var->bank(kpad->var->maxgpio); i++) { in adp5589_gpio_add()
540 kpad->dat_out[i] = adp5589_read(kpad->client, kpad->var->reg( in adp5589_gpio_add()
542 kpad->dir[i] = adp5589_read(kpad->client, kpad->var->reg( in adp5589_gpio_add()
549 static inline int adp5589_gpio_add(struct adp5589_kpad *kpad) in adp5589_gpio_add() argument
555 static void adp5589_report_switches(struct adp5589_kpad *kpad, in adp5589_report_switches() argument
560 for (i = 0; i < kpad->gpimapsize; i++) { in adp5589_report_switches()
561 if (key_val == kpad->gpimap[i].pin) { in adp5589_report_switches()
562 input_report_switch(kpad->input, in adp5589_report_switches()
563 kpad->gpimap[i].sw_evt, in adp5589_report_switches()
570 static void adp5589_report_events(struct adp5589_kpad *kpad, int ev_cnt) in adp5589_report_events() argument
575 int key = adp5589_read(kpad->client, ADP5589_5_FIFO_1 + i); in adp5589_report_events()
578 if (key_val >= kpad->var->gpi_pin_base && in adp5589_report_events()
579 key_val <= kpad->var->gpi_pin_end) { in adp5589_report_events()
580 adp5589_report_switches(kpad, key, key_val); in adp5589_report_events()
582 input_report_key(kpad->input, in adp5589_report_events()
583 kpad->keycode[key_val - 1], in adp5589_report_events()
591 struct adp5589_kpad *kpad = handle; in adp5589_irq() local
592 struct i2c_client *client = kpad->client; in adp5589_irq()
603 adp5589_report_events(kpad, ev_cnt); in adp5589_irq()
604 input_sync(kpad->input); in adp5589_irq()
613 static int adp5589_get_evcode(struct adp5589_kpad *kpad, unsigned short key) in adp5589_get_evcode() argument
617 for (i = 0; i < kpad->var->keymapsize; i++) in adp5589_get_evcode()
618 if (key == kpad->keycode[i]) in adp5589_get_evcode()
621 dev_err(&kpad->client->dev, "RESET/UNLOCK key not in keycode map\n"); in adp5589_get_evcode()
626 static int adp5589_setup(struct adp5589_kpad *kpad) in adp5589_setup() argument
628 struct i2c_client *client = kpad->client; in adp5589_setup()
631 u8 (*reg) (u8) = kpad->var->reg; in adp5589_setup()
637 pdata->keypad_en_mask & kpad->var->row_mask); in adp5589_setup()
639 (pdata->keypad_en_mask >> kpad->var->col_shift) & in adp5589_setup()
640 kpad->var->col_mask); in adp5589_setup()
642 if (!kpad->is_adp5585) in adp5589_setup()
646 if (!kpad->is_adp5585 && pdata->en_keylock) { in adp5589_setup()
662 if (pin <= kpad->var->gpi_pin_row_end) { in adp5589_setup()
663 evt_mode1 |= BIT(pin - kpad->var->gpi_pin_row_base); in adp5589_setup()
666 BIT(pin - kpad->var->gpi_pin_col_base) & 0xFF; in adp5589_setup()
667 if (!kpad->is_adp5585) in adp5589_setup()
669 BIT(pin - kpad->var->gpi_pin_col_base) >> 8; in adp5589_setup()
678 if (!kpad->is_adp5585) in adp5589_setup()
688 for (i = 0; i <= kpad->var->max_row_num; i++) { in adp5589_setup()
701 if (i % 4 == 3 || i == kpad->var->max_row_num) { in adp5589_setup()
708 for (i = 0; i <= kpad->var->max_col_num; i++) { in adp5589_setup()
709 unsigned int val = 0, bit = BIT(i + kpad->var->col_shift); in adp5589_setup()
721 if (i % 4 == 3 || i == kpad->var->max_col_num) { in adp5589_setup()
731 adp5589_get_evcode(kpad, in adp5589_setup()
734 adp5589_get_evcode(kpad, in adp5589_setup()
737 adp5589_get_evcode(kpad, in adp5589_setup()
739 kpad->extend_cfg |= R4_EXTEND_CFG; in adp5589_setup()
744 adp5589_get_evcode(kpad, in adp5589_setup()
747 adp5589_get_evcode(kpad, in adp5589_setup()
749 kpad->extend_cfg |= C4_EXTEND_CFG; in adp5589_setup()
752 if (kpad->extend_cfg) { in adp5589_setup()
756 kpad->extend_cfg); in adp5589_setup()
760 pdata->debounce_dis_mask & kpad->var->row_mask); in adp5589_setup()
763 (pdata->debounce_dis_mask >> kpad->var->col_shift) in adp5589_setup()
764 & kpad->var->col_mask); in adp5589_setup()
766 if (!kpad->is_adp5585) in adp5589_setup()
773 (kpad->is_adp5585 ? 0 : LOGIC2_INT) | in adp5589_setup()
775 (kpad->is_adp5585 ? 0 : LOCK_INT) | in adp5589_setup()
791 static void adp5589_report_switch_state(struct adp5589_kpad *kpad) in adp5589_report_switch_state() argument
795 int gpi_stat1 = adp5589_read(kpad->client, in adp5589_report_switch_state()
796 kpad->var->reg(ADP5589_GPI_STATUS_A)); in adp5589_report_switch_state()
797 int gpi_stat2 = adp5589_read(kpad->client, in adp5589_report_switch_state()
798 kpad->var->reg(ADP5589_GPI_STATUS_B)); in adp5589_report_switch_state()
799 int gpi_stat3 = !kpad->is_adp5585 ? in adp5589_report_switch_state()
800 adp5589_read(kpad->client, ADP5589_GPI_STATUS_C) : 0; in adp5589_report_switch_state()
802 for (i = 0; i < kpad->gpimapsize; i++) { in adp5589_report_switch_state()
803 unsigned short pin = kpad->gpimap[i].pin; in adp5589_report_switch_state()
805 if (pin <= kpad->var->gpi_pin_row_end) { in adp5589_report_switch_state()
807 pin_loc = pin - kpad->var->gpi_pin_row_base; in adp5589_report_switch_state()
808 } else if ((pin - kpad->var->gpi_pin_col_base) < 8) { in adp5589_report_switch_state()
810 pin_loc = pin - kpad->var->gpi_pin_col_base; in adp5589_report_switch_state()
813 pin_loc = pin - kpad->var->gpi_pin_col_base - 8; in adp5589_report_switch_state()
817 dev_err(&kpad->client->dev, in adp5589_report_switch_state()
823 input_report_switch(kpad->input, in adp5589_report_switch_state()
824 kpad->gpimap[i].sw_evt, in adp5589_report_switch_state()
828 input_sync(kpad->input); in adp5589_report_switch_state()
831 static int adp5589_keypad_add(struct adp5589_kpad *kpad, unsigned int revid) in adp5589_keypad_add() argument
833 struct i2c_client *client = kpad->client; in adp5589_keypad_add()
840 if (!((pdata->keypad_en_mask & kpad->var->row_mask) && in adp5589_keypad_add()
841 (pdata->keypad_en_mask >> kpad->var->col_shift)) || in adp5589_keypad_add()
847 if (pdata->keymapsize != kpad->var->keymapsize) { in adp5589_keypad_add()
857 if (pdata->gpimapsize > kpad->var->gpimapsize_max) { in adp5589_keypad_add()
865 if (pin < kpad->var->gpi_pin_base || in adp5589_keypad_add()
866 pin > kpad->var->gpi_pin_end) { in adp5589_keypad_add()
871 if (BIT(pin - kpad->var->gpi_pin_row_base) & in adp5589_keypad_add()
887 kpad->input = input; in adp5589_keypad_add()
893 input_set_drvdata(input, kpad); in adp5589_keypad_add()
900 input->keycodesize = sizeof(kpad->keycode[0]); in adp5589_keypad_add()
902 input->keycode = kpad->keycode; in adp5589_keypad_add()
904 memcpy(kpad->keycode, pdata->keymap, in adp5589_keypad_add()
907 kpad->gpimap = pdata->gpimap; in adp5589_keypad_add()
908 kpad->gpimapsize = pdata->gpimapsize; in adp5589_keypad_add()
917 if (kpad->keycode[i] <= KEY_MAX) in adp5589_keypad_add()
918 __set_bit(kpad->keycode[i], input->keybit); in adp5589_keypad_add()
921 if (kpad->gpimapsize) in adp5589_keypad_add()
923 for (i = 0; i < kpad->gpimapsize; i++) in adp5589_keypad_add()
924 __set_bit(kpad->gpimap[i].sw_evt, input->swbit); in adp5589_keypad_add()
935 client->dev.driver->name, kpad); in adp5589_keypad_add()
946 struct adp5589_kpad *kpad = data; in adp5589_clear_config() local
948 adp5589_write(kpad->client, kpad->var->reg(ADP5589_GENERAL_CFG), 0); in adp5589_clear_config()
954 struct adp5589_kpad *kpad; in adp5589_probe() local
971 kpad = devm_kzalloc(&client->dev, sizeof(*kpad), GFP_KERNEL); in adp5589_probe()
972 if (!kpad) in adp5589_probe()
975 kpad->client = client; in adp5589_probe()
979 kpad->support_row5 = true; in adp5589_probe()
982 kpad->is_adp5585 = true; in adp5589_probe()
983 kpad->var = &const_adp5585; in adp5589_probe()
986 kpad->support_row5 = true; in adp5589_probe()
987 kpad->var = &const_adp5589; in adp5589_probe()
992 kpad); in adp5589_probe()
1003 error = adp5589_keypad_add(kpad, revid); in adp5589_probe()
1008 error = adp5589_setup(kpad); in adp5589_probe()
1012 if (kpad->gpimapsize) in adp5589_probe()
1013 adp5589_report_switch_state(kpad); in adp5589_probe()
1015 error = adp5589_gpio_add(kpad); in adp5589_probe()
1026 struct adp5589_kpad *kpad = i2c_get_clientdata(client); in adp5589_suspend() local
1028 if (kpad->input) in adp5589_suspend()
1037 struct adp5589_kpad *kpad = i2c_get_clientdata(client); in adp5589_resume() local
1039 if (kpad->input) in adp5589_resume()