Lines Matching refs:kpad
76 struct adp5588_kpad *kpad = container_of(chip, struct adp5588_kpad, gc); in adp5588_gpio_get_value() local
77 unsigned int bank = ADP5588_BANK(kpad->gpiomap[off]); in adp5588_gpio_get_value()
78 unsigned int bit = ADP5588_BIT(kpad->gpiomap[off]); in adp5588_gpio_get_value()
81 mutex_lock(&kpad->gpio_lock); in adp5588_gpio_get_value()
83 if (kpad->dir[bank] & bit) in adp5588_gpio_get_value()
84 val = kpad->dat_out[bank]; in adp5588_gpio_get_value()
86 val = adp5588_read(kpad->client, GPIO_DAT_STAT1 + bank); in adp5588_gpio_get_value()
88 mutex_unlock(&kpad->gpio_lock); in adp5588_gpio_get_value()
96 struct adp5588_kpad *kpad = container_of(chip, struct adp5588_kpad, gc); in adp5588_gpio_set_value() local
97 unsigned int bank = ADP5588_BANK(kpad->gpiomap[off]); in adp5588_gpio_set_value()
98 unsigned int bit = ADP5588_BIT(kpad->gpiomap[off]); in adp5588_gpio_set_value()
100 mutex_lock(&kpad->gpio_lock); in adp5588_gpio_set_value()
103 kpad->dat_out[bank] |= bit; in adp5588_gpio_set_value()
105 kpad->dat_out[bank] &= ~bit; in adp5588_gpio_set_value()
107 adp5588_write(kpad->client, GPIO_DAT_OUT1 + bank, in adp5588_gpio_set_value()
108 kpad->dat_out[bank]); in adp5588_gpio_set_value()
110 mutex_unlock(&kpad->gpio_lock); in adp5588_gpio_set_value()
115 struct adp5588_kpad *kpad = container_of(chip, struct adp5588_kpad, gc); in adp5588_gpio_direction_input() local
116 unsigned int bank = ADP5588_BANK(kpad->gpiomap[off]); in adp5588_gpio_direction_input()
117 unsigned int bit = ADP5588_BIT(kpad->gpiomap[off]); in adp5588_gpio_direction_input()
120 mutex_lock(&kpad->gpio_lock); in adp5588_gpio_direction_input()
122 kpad->dir[bank] &= ~bit; in adp5588_gpio_direction_input()
123 ret = adp5588_write(kpad->client, GPIO_DIR1 + bank, kpad->dir[bank]); in adp5588_gpio_direction_input()
125 mutex_unlock(&kpad->gpio_lock); in adp5588_gpio_direction_input()
133 struct adp5588_kpad *kpad = container_of(chip, struct adp5588_kpad, gc); in adp5588_gpio_direction_output() local
134 unsigned int bank = ADP5588_BANK(kpad->gpiomap[off]); in adp5588_gpio_direction_output()
135 unsigned int bit = ADP5588_BIT(kpad->gpiomap[off]); in adp5588_gpio_direction_output()
138 mutex_lock(&kpad->gpio_lock); in adp5588_gpio_direction_output()
140 kpad->dir[bank] |= bit; in adp5588_gpio_direction_output()
143 kpad->dat_out[bank] |= bit; in adp5588_gpio_direction_output()
145 kpad->dat_out[bank] &= ~bit; in adp5588_gpio_direction_output()
147 ret = adp5588_write(kpad->client, GPIO_DAT_OUT1 + bank, in adp5588_gpio_direction_output()
148 kpad->dat_out[bank]); in adp5588_gpio_direction_output()
149 ret |= adp5588_write(kpad->client, GPIO_DIR1 + bank, in adp5588_gpio_direction_output()
150 kpad->dir[bank]); in adp5588_gpio_direction_output()
152 mutex_unlock(&kpad->gpio_lock); in adp5588_gpio_direction_output()
157 static int adp5588_build_gpiomap(struct adp5588_kpad *kpad, in adp5588_build_gpiomap() argument
172 for (i = 0; i < kpad->gpimapsize; i++) in adp5588_build_gpiomap()
173 pin_used[kpad->gpimap[i].pin - GPI_PIN_BASE] = true; in adp5588_build_gpiomap()
177 kpad->gpiomap[n_unused++] = i; in adp5588_build_gpiomap()
182 static int adp5588_gpio_add(struct adp5588_kpad *kpad) in adp5588_gpio_add() argument
184 struct device *dev = &kpad->client->dev; in adp5588_gpio_add()
192 kpad->gc.ngpio = adp5588_build_gpiomap(kpad, pdata); in adp5588_gpio_add()
193 if (kpad->gc.ngpio == 0) { in adp5588_gpio_add()
198 kpad->export_gpio = true; in adp5588_gpio_add()
200 kpad->gc.direction_input = adp5588_gpio_direction_input; in adp5588_gpio_add()
201 kpad->gc.direction_output = adp5588_gpio_direction_output; in adp5588_gpio_add()
202 kpad->gc.get = adp5588_gpio_get_value; in adp5588_gpio_add()
203 kpad->gc.set = adp5588_gpio_set_value; in adp5588_gpio_add()
204 kpad->gc.can_sleep = 1; in adp5588_gpio_add()
206 kpad->gc.base = gpio_data->gpio_start; in adp5588_gpio_add()
207 kpad->gc.label = kpad->client->name; in adp5588_gpio_add()
208 kpad->gc.owner = THIS_MODULE; in adp5588_gpio_add()
209 kpad->gc.names = gpio_data->names; in adp5588_gpio_add()
211 mutex_init(&kpad->gpio_lock); in adp5588_gpio_add()
213 error = gpiochip_add(&kpad->gc); in adp5588_gpio_add()
220 kpad->dat_out[i] = adp5588_read(kpad->client, in adp5588_gpio_add()
222 kpad->dir[i] = adp5588_read(kpad->client, GPIO_DIR1 + i); in adp5588_gpio_add()
226 error = gpio_data->setup(kpad->client, in adp5588_gpio_add()
227 kpad->gc.base, kpad->gc.ngpio, in adp5588_gpio_add()
236 static void adp5588_gpio_remove(struct adp5588_kpad *kpad) in adp5588_gpio_remove() argument
238 struct device *dev = &kpad->client->dev; in adp5588_gpio_remove()
243 if (!kpad->export_gpio) in adp5588_gpio_remove()
247 error = gpio_data->teardown(kpad->client, in adp5588_gpio_remove()
248 kpad->gc.base, kpad->gc.ngpio, in adp5588_gpio_remove()
254 gpiochip_remove(&kpad->gc); in adp5588_gpio_remove()
257 static inline int adp5588_gpio_add(struct adp5588_kpad *kpad) in adp5588_gpio_add() argument
262 static inline void adp5588_gpio_remove(struct adp5588_kpad *kpad) in adp5588_gpio_remove() argument
267 static void adp5588_report_events(struct adp5588_kpad *kpad, int ev_cnt) in adp5588_report_events() argument
272 int key = adp5588_read(kpad->client, Key_EVENTA + i); in adp5588_report_events()
276 for (j = 0; j < kpad->gpimapsize; j++) { in adp5588_report_events()
277 if (key_val == kpad->gpimap[j].pin) { in adp5588_report_events()
278 input_report_switch(kpad->input, in adp5588_report_events()
279 kpad->gpimap[j].sw_evt, in adp5588_report_events()
285 input_report_key(kpad->input, in adp5588_report_events()
286 kpad->keycode[key_val - 1], in adp5588_report_events()
294 struct adp5588_kpad *kpad = container_of(work, in adp5588_work() local
296 struct i2c_client *client = kpad->client; in adp5588_work()
307 adp5588_report_events(kpad, ev_cnt); in adp5588_work()
308 input_sync(kpad->input); in adp5588_work()
316 struct adp5588_kpad *kpad = handle; in adp5588_irq() local
324 schedule_delayed_work(&kpad->work, kpad->delay); in adp5588_irq()
393 static void adp5588_report_switch_state(struct adp5588_kpad *kpad) in adp5588_report_switch_state() argument
395 int gpi_stat1 = adp5588_read(kpad->client, GPIO_DAT_STAT1); in adp5588_report_switch_state()
396 int gpi_stat2 = adp5588_read(kpad->client, GPIO_DAT_STAT2); in adp5588_report_switch_state()
397 int gpi_stat3 = adp5588_read(kpad->client, GPIO_DAT_STAT3); in adp5588_report_switch_state()
401 for (i = 0; i < kpad->gpimapsize; i++) { in adp5588_report_switch_state()
402 unsigned short pin = kpad->gpimap[i].pin; in adp5588_report_switch_state()
416 dev_err(&kpad->client->dev, in adp5588_report_switch_state()
422 input_report_switch(kpad->input, in adp5588_report_switch_state()
423 kpad->gpimap[i].sw_evt, in adp5588_report_switch_state()
427 input_sync(kpad->input); in adp5588_report_switch_state()
434 struct adp5588_kpad *kpad; in adp5588_probe() local
499 kpad = kzalloc(sizeof(*kpad), GFP_KERNEL); in adp5588_probe()
501 if (!kpad || !input) { in adp5588_probe()
506 kpad->client = client; in adp5588_probe()
507 kpad->input = input; in adp5588_probe()
508 INIT_DELAYED_WORK(&kpad->work, adp5588_work); in adp5588_probe()
518 kpad->delay = msecs_to_jiffies(30); in adp5588_probe()
524 input_set_drvdata(input, kpad); in adp5588_probe()
531 input->keycodesize = sizeof(kpad->keycode[0]); in adp5588_probe()
533 input->keycode = kpad->keycode; in adp5588_probe()
535 memcpy(kpad->keycode, pdata->keymap, in adp5588_probe()
538 kpad->gpimap = pdata->gpimap; in adp5588_probe()
539 kpad->gpimapsize = pdata->gpimapsize; in adp5588_probe()
548 if (kpad->keycode[i] <= KEY_MAX) in adp5588_probe()
549 __set_bit(kpad->keycode[i], input->keybit); in adp5588_probe()
552 if (kpad->gpimapsize) in adp5588_probe()
554 for (i = 0; i < kpad->gpimapsize; i++) in adp5588_probe()
555 __set_bit(kpad->gpimap[i].sw_evt, input->swbit); in adp5588_probe()
565 client->dev.driver->name, kpad); in adp5588_probe()
575 if (kpad->gpimapsize) in adp5588_probe()
576 adp5588_report_switch_state(kpad); in adp5588_probe()
578 error = adp5588_gpio_add(kpad); in adp5588_probe()
583 i2c_set_clientdata(client, kpad); in adp5588_probe()
589 free_irq(client->irq, kpad); in adp5588_probe()
590 cancel_delayed_work_sync(&kpad->work); in adp5588_probe()
596 kfree(kpad); in adp5588_probe()
603 struct adp5588_kpad *kpad = i2c_get_clientdata(client); in adp5588_remove() local
606 free_irq(client->irq, kpad); in adp5588_remove()
607 cancel_delayed_work_sync(&kpad->work); in adp5588_remove()
608 input_unregister_device(kpad->input); in adp5588_remove()
609 adp5588_gpio_remove(kpad); in adp5588_remove()
610 kfree(kpad); in adp5588_remove()
618 struct adp5588_kpad *kpad = dev_get_drvdata(dev); in adp5588_suspend() local
619 struct i2c_client *client = kpad->client; in adp5588_suspend()
622 cancel_delayed_work_sync(&kpad->work); in adp5588_suspend()
632 struct adp5588_kpad *kpad = dev_get_drvdata(dev); in adp5588_resume() local
633 struct i2c_client *client = kpad->client; in adp5588_resume()