Lines Matching refs:kpad
220 struct adp5588_kpad *kpad = gpiochip_get_data(chip); in adp5588_gpio_get_value() local
221 unsigned int bank = ADP5588_BANK(kpad->gpiomap[off]); in adp5588_gpio_get_value()
222 unsigned int bit = ADP5588_BIT(kpad->gpiomap[off]); in adp5588_gpio_get_value()
225 guard(mutex)(&kpad->gpio_lock); in adp5588_gpio_get_value()
227 if (kpad->dir[bank] & bit) in adp5588_gpio_get_value()
228 val = kpad->dat_out[bank]; in adp5588_gpio_get_value()
230 val = adp5588_read(kpad->client, GPIO_DAT_STAT1 + bank); in adp5588_gpio_get_value()
238 struct adp5588_kpad *kpad = gpiochip_get_data(chip); in adp5588_gpio_set_value() local
239 unsigned int bank = ADP5588_BANK(kpad->gpiomap[off]); in adp5588_gpio_set_value()
240 unsigned int bit = ADP5588_BIT(kpad->gpiomap[off]); in adp5588_gpio_set_value()
242 guard(mutex)(&kpad->gpio_lock); in adp5588_gpio_set_value()
245 kpad->dat_out[bank] |= bit; in adp5588_gpio_set_value()
247 kpad->dat_out[bank] &= ~bit; in adp5588_gpio_set_value()
249 adp5588_write(kpad->client, GPIO_DAT_OUT1 + bank, kpad->dat_out[bank]); in adp5588_gpio_set_value()
255 struct adp5588_kpad *kpad = gpiochip_get_data(chip); in adp5588_gpio_set_config() local
256 unsigned int bank = ADP5588_BANK(kpad->gpiomap[off]); in adp5588_gpio_set_config()
257 unsigned int bit = ADP5588_BIT(kpad->gpiomap[off]); in adp5588_gpio_set_config()
271 guard(mutex)(&kpad->gpio_lock); in adp5588_gpio_set_config()
274 kpad->pull_dis[bank] |= bit; in adp5588_gpio_set_config()
276 kpad->pull_dis[bank] &= bit; in adp5588_gpio_set_config()
278 return adp5588_write(kpad->client, GPIO_PULL1 + bank, in adp5588_gpio_set_config()
279 kpad->pull_dis[bank]); in adp5588_gpio_set_config()
284 struct adp5588_kpad *kpad = gpiochip_get_data(chip); in adp5588_gpio_direction_input() local
285 unsigned int bank = ADP5588_BANK(kpad->gpiomap[off]); in adp5588_gpio_direction_input()
286 unsigned int bit = ADP5588_BIT(kpad->gpiomap[off]); in adp5588_gpio_direction_input()
288 guard(mutex)(&kpad->gpio_lock); in adp5588_gpio_direction_input()
290 kpad->dir[bank] &= ~bit; in adp5588_gpio_direction_input()
291 return adp5588_write(kpad->client, GPIO_DIR1 + bank, kpad->dir[bank]); in adp5588_gpio_direction_input()
297 struct adp5588_kpad *kpad = gpiochip_get_data(chip); in adp5588_gpio_direction_output() local
298 unsigned int bank = ADP5588_BANK(kpad->gpiomap[off]); in adp5588_gpio_direction_output()
299 unsigned int bit = ADP5588_BIT(kpad->gpiomap[off]); in adp5588_gpio_direction_output()
302 guard(mutex)(&kpad->gpio_lock); in adp5588_gpio_direction_output()
304 kpad->dir[bank] |= bit; in adp5588_gpio_direction_output()
307 kpad->dat_out[bank] |= bit; in adp5588_gpio_direction_output()
309 kpad->dat_out[bank] &= ~bit; in adp5588_gpio_direction_output()
311 error = adp5588_write(kpad->client, GPIO_DAT_OUT1 + bank, in adp5588_gpio_direction_output()
312 kpad->dat_out[bank]); in adp5588_gpio_direction_output()
316 error = adp5588_write(kpad->client, GPIO_DIR1 + bank, kpad->dir[bank]); in adp5588_gpio_direction_output()
323 static int adp5588_build_gpiomap(struct adp5588_kpad *kpad) in adp5588_build_gpiomap() argument
331 for (i = 0; i < kpad->rows; i++) in adp5588_build_gpiomap()
334 for (i = 0; i < kpad->cols; i++) in adp5588_build_gpiomap()
339 kpad->gpiomap[n_unused++] = i; in adp5588_build_gpiomap()
347 struct adp5588_kpad *kpad = gpiochip_get_data(gc); in adp5588_irq_bus_lock() local
349 mutex_lock(&kpad->gpio_lock); in adp5588_irq_bus_lock()
355 struct adp5588_kpad *kpad = gpiochip_get_data(gc); in adp5588_irq_bus_sync_unlock() local
359 if (kpad->int_en[i] ^ kpad->irq_mask[i]) { in adp5588_irq_bus_sync_unlock()
360 kpad->int_en[i] = kpad->irq_mask[i]; in adp5588_irq_bus_sync_unlock()
361 adp5588_write(kpad->client, GPI_EM1 + i, kpad->int_en[i]); in adp5588_irq_bus_sync_unlock()
365 mutex_unlock(&kpad->gpio_lock); in adp5588_irq_bus_sync_unlock()
371 struct adp5588_kpad *kpad = gpiochip_get_data(gc); in adp5588_irq_mask() local
373 unsigned long real_irq = kpad->gpiomap[hwirq]; in adp5588_irq_mask()
375 kpad->irq_mask[ADP5588_BANK(real_irq)] &= ~ADP5588_BIT(real_irq); in adp5588_irq_mask()
382 struct adp5588_kpad *kpad = gpiochip_get_data(gc); in adp5588_irq_unmask() local
384 unsigned long real_irq = kpad->gpiomap[hwirq]; in adp5588_irq_unmask()
387 kpad->irq_mask[ADP5588_BANK(real_irq)] |= ADP5588_BIT(real_irq); in adp5588_irq_unmask()
411 static int adp5588_gpio_add(struct adp5588_kpad *kpad) in adp5588_gpio_add() argument
413 struct device *dev = &kpad->client->dev; in adp5588_gpio_add()
417 kpad->gc.ngpio = adp5588_build_gpiomap(kpad); in adp5588_gpio_add()
418 if (kpad->gc.ngpio == 0) { in adp5588_gpio_add()
423 kpad->gc.parent = &kpad->client->dev; in adp5588_gpio_add()
424 kpad->gc.direction_input = adp5588_gpio_direction_input; in adp5588_gpio_add()
425 kpad->gc.direction_output = adp5588_gpio_direction_output; in adp5588_gpio_add()
426 kpad->gc.get = adp5588_gpio_get_value; in adp5588_gpio_add()
427 kpad->gc.set = adp5588_gpio_set_value; in adp5588_gpio_add()
428 kpad->gc.set_config = adp5588_gpio_set_config; in adp5588_gpio_add()
429 kpad->gc.can_sleep = 1; in adp5588_gpio_add()
431 kpad->gc.base = -1; in adp5588_gpio_add()
432 kpad->gc.label = kpad->client->name; in adp5588_gpio_add()
433 kpad->gc.owner = THIS_MODULE; in adp5588_gpio_add()
436 if (!kpad->client->irq) { in adp5588_gpio_add()
441 girq = &kpad->gc.irq; in adp5588_gpio_add()
447 mutex_init(&kpad->gpio_lock); in adp5588_gpio_add()
449 error = devm_gpiochip_add_data(dev, &kpad->gc, kpad); in adp5588_gpio_add()
456 kpad->dat_out[i] = adp5588_read(kpad->client, in adp5588_gpio_add()
458 kpad->dir[i] = adp5588_read(kpad->client, GPIO_DIR1 + i); in adp5588_gpio_add()
459 kpad->pull_dis[i] = adp5588_read(kpad->client, GPIO_PULL1 + i); in adp5588_gpio_add()
481 static void adp5588_gpio_irq_handle(struct adp5588_kpad *kpad, int key_val, in adp5588_gpio_irq_handle() argument
485 struct i2c_client *client = kpad->client; in adp5588_gpio_irq_handle()
489 hwirq = adp5588_gpiomap_get_hwirq(&client->dev, kpad->gpiomap, in adp5588_gpio_irq_handle()
490 gpio, kpad->gc.ngpio); in adp5588_gpio_irq_handle()
496 irq = irq_find_mapping(kpad->gc.irq.domain, hwirq); in adp5588_gpio_irq_handle()
517 static void adp5588_report_events(struct adp5588_kpad *kpad, int ev_cnt) in adp5588_report_events() argument
522 int key = adp5588_read(kpad->client, KEY_EVENTA + i); in adp5588_report_events()
528 adp5588_gpio_irq_handle(kpad, key_val, key_press); in adp5588_report_events()
532 int code = MATRIX_SCAN_CODE(row, col, kpad->row_shift); in adp5588_report_events()
534 dev_dbg_ratelimited(&kpad->client->dev, in adp5588_report_events()
536 key_val, row, col, kpad->keycode[code]); in adp5588_report_events()
538 input_report_key(kpad->input, in adp5588_report_events()
539 kpad->keycode[code], key_press); in adp5588_report_events()
546 struct adp5588_kpad *kpad = handle; in adp5588_hard_irq() local
548 kpad->irq_time = ktime_get(); in adp5588_hard_irq()
555 struct adp5588_kpad *kpad = handle; in adp5588_thread_irq() local
556 struct i2c_client *client = kpad->client; in adp5588_thread_irq()
565 if (kpad->delay) { in adp5588_thread_irq()
566 target_time = ktime_add_ms(kpad->irq_time, kpad->delay); in adp5588_thread_irq()
582 adp5588_report_events(kpad, ev_cnt); in adp5588_thread_irq()
583 input_sync(kpad->input); in adp5588_thread_irq()
592 static int adp5588_setup(struct adp5588_kpad *kpad) in adp5588_setup() argument
594 struct i2c_client *client = kpad->client; in adp5588_setup()
597 ret = adp5588_write(client, KP_GPIO1, KP_SEL(kpad->rows)); in adp5588_setup()
601 ret = adp5588_write(client, KP_GPIO2, KP_SEL(kpad->cols) & 0xFF); in adp5588_setup()
605 ret = adp5588_write(client, KP_GPIO3, KP_SEL(kpad->cols) >> 8); in adp5588_setup()
609 for (i = 0; i < kpad->nkeys_unlock; i++) { in adp5588_setup()
610 ret = adp5588_write(client, UNLOCK1 + i, kpad->unlock_keys[i]); in adp5588_setup()
615 if (kpad->nkeys_unlock) { in adp5588_setup()
638 static int adp5588_fw_parse(struct adp5588_kpad *kpad) in adp5588_fw_parse() argument
640 struct i2c_client *client = kpad->client; in adp5588_fw_parse()
651 kpad->gpio_only = true; in adp5588_fw_parse()
655 ret = matrix_keypad_parse_properties(&client->dev, &kpad->rows, in adp5588_fw_parse()
656 &kpad->cols); in adp5588_fw_parse()
660 if (kpad->rows > ADP5588_ROWS_MAX || kpad->cols > ADP5588_COLS_MAX) { in adp5588_fw_parse()
662 kpad->rows, kpad->cols); in adp5588_fw_parse()
666 ret = matrix_keypad_build_keymap(NULL, NULL, kpad->rows, kpad->cols, in adp5588_fw_parse()
667 kpad->keycode, kpad->input); in adp5588_fw_parse()
671 kpad->row_shift = get_count_order(kpad->cols); in adp5588_fw_parse()
674 __set_bit(EV_REP, kpad->input->evbit); in adp5588_fw_parse()
676 kpad->nkeys_unlock = device_property_count_u32(&client->dev, in adp5588_fw_parse()
678 if (kpad->nkeys_unlock <= 0) { in adp5588_fw_parse()
680 kpad->nkeys_unlock = 0; in adp5588_fw_parse()
684 if (kpad->nkeys_unlock > ARRAY_SIZE(kpad->unlock_keys)) { in adp5588_fw_parse()
686 kpad->nkeys_unlock, ARRAY_SIZE(kpad->unlock_keys)); in adp5588_fw_parse()
691 kpad->unlock_keys, in adp5588_fw_parse()
692 kpad->nkeys_unlock); in adp5588_fw_parse()
696 for (i = 0; i < kpad->nkeys_unlock; i++) { in adp5588_fw_parse()
705 if (kpad->unlock_keys[i] >= kpad->cols * kpad->rows) { in adp5588_fw_parse()
707 kpad->unlock_keys[i]); in adp5588_fw_parse()
715 kpad->unlock_keys[i] += 1; in adp5588_fw_parse()
723 struct adp5588_kpad *kpad; in adp5588_probe() local
736 kpad = devm_kzalloc(&client->dev, sizeof(*kpad), GFP_KERNEL); in adp5588_probe()
737 if (!kpad) in adp5588_probe()
744 kpad->client = client; in adp5588_probe()
745 kpad->input = input; in adp5588_probe()
747 error = adp5588_fw_parse(kpad); in adp5588_probe()
771 kpad->delay = msecs_to_jiffies(WA_DELAYED_READOUT_TIME); in adp5588_probe()
776 input_set_drvdata(input, kpad); in adp5588_probe()
790 error = adp5588_setup(kpad); in adp5588_probe()
794 error = adp5588_gpio_add(kpad); in adp5588_probe()
802 client->dev.driver->name, kpad); in adp5588_probe()