Lines Matching refs:lr
517 static void linereq_put_event(struct linereq *lr,
522 spin_lock(&lr->wait.lock);
523 if (kfifo_is_full(&lr->events)) {
525 kfifo_skip(&lr->events);
527 kfifo_in(&lr->events, le, 1);
528 spin_unlock(&lr->wait.lock);
530 wake_up_poll(&lr->wait, EPOLLIN);
538 struct linereq *lr = line->req;
553 if (lr->num_lines != 1)
554 line->req_seqno = atomic_inc_return(&lr->seqno);
579 le.seqno = (lr->num_lines == 1) ? le.line_seqno : line->req_seqno;
582 linereq_put_event(lr, &le);
590 struct linereq *lr = line->req;
598 if (lr->num_lines != 1)
599 line->req_seqno = atomic_inc_return(&lr->seqno);
638 struct linereq *lr;
668 lr = line->req;
673 le.seqno = (lr->num_lines == 1) ?
674 le.line_seqno : atomic_inc_return(&lr->seqno);
683 linereq_put_event(lr, &le);
977 static long linereq_get_values(struct linereq *lr, void __user *ip)
990 for (num_get = 0, i = 0; i < lr->num_lines; i++) {
993 descs = &lr->lines[i].desc;
1004 for (didx = 0, i = 0; i < lr->num_lines; i++) {
1006 descs[didx] = lr->lines[i].desc;
1020 for (didx = 0, i = 0; i < lr->num_lines; i++) {
1022 if (lr->lines[i].sw_debounced)
1023 val = debounced_value(&lr->lines[i]);
1038 static long linereq_set_values_unlocked(struct linereq *lr,
1047 for (num_set = 0, i = 0; i < lr->num_lines; i++) {
1049 if (!test_bit(FLAG_IS_OUT, &lr->lines[i].desc->flags))
1054 descs = &lr->lines[i].desc;
1065 for (didx = 0, i = 0; i < lr->num_lines; i++) {
1067 descs[didx] = lr->lines[i].desc;
1080 static long linereq_set_values(struct linereq *lr, void __user *ip)
1088 mutex_lock(&lr->config_mutex);
1090 ret = linereq_set_values_unlocked(lr, &lv);
1092 mutex_unlock(&lr->config_mutex);
1097 static long linereq_set_config_unlocked(struct linereq *lr,
1106 for (i = 0; i < lr->num_lines; i++) {
1107 desc = lr->lines[i].desc;
1121 edge_detector_stop(&lr->lines[i]);
1130 ret = edge_detector_update(&lr->lines[i], lc, i,
1144 static long linereq_set_config(struct linereq *lr, void __user *ip)
1152 ret = gpio_v2_line_config_validate(&lc, lr->num_lines);
1156 mutex_lock(&lr->config_mutex);
1158 ret = linereq_set_config_unlocked(lr, &lc);
1160 mutex_unlock(&lr->config_mutex);
1168 struct linereq *lr = file->private_data;
1171 if (!lr->gdev->chip)
1176 return linereq_get_values(lr, ip);
1178 return linereq_set_values(lr, ip);
1180 return linereq_set_config(lr, ip);
1197 struct linereq *lr = file->private_data;
1200 if (!lr->gdev->chip)
1203 poll_wait(file, &lr->wait, wait);
1205 if (!kfifo_is_empty_spinlocked_noirqsave(&lr->events,
1206 &lr->wait.lock))
1217 struct linereq *lr = file->private_data;
1222 if (!lr->gdev->chip)
1229 spin_lock(&lr->wait.lock);
1230 if (kfifo_is_empty(&lr->events)) {
1232 spin_unlock(&lr->wait.lock);
1237 spin_unlock(&lr->wait.lock);
1241 ret = wait_event_interruptible_locked(lr->wait,
1242 !kfifo_is_empty(&lr->events));
1244 spin_unlock(&lr->wait.lock);
1249 ret = kfifo_out(&lr->events, &le, 1);
1250 spin_unlock(&lr->wait.lock);
1269 static void linereq_free(struct linereq *lr)
1273 for (i = 0; i < lr->num_lines; i++) {
1274 edge_detector_stop(&lr->lines[i]);
1275 if (lr->lines[i].desc)
1276 gpiod_free(lr->lines[i].desc);
1278 kfifo_free(&lr->events);
1279 kfree(lr->label);
1280 put_device(&lr->gdev->dev);
1281 kfree(lr);
1286 struct linereq *lr = file->private_data;
1288 linereq_free(lr);
1308 struct linereq *lr;
1328 lr = kzalloc(struct_size(lr, lines, ulr.num_lines), GFP_KERNEL);
1329 if (!lr)
1332 lr->gdev = gdev;
1336 lr->lines[i].req = lr;
1337 WRITE_ONCE(lr->lines[i].sw_debounced, 0);
1338 INIT_DELAYED_WORK(&lr->lines[i].work, debounce_work_func);
1343 lr->label = kstrndup(ulr.consumer, sizeof(ulr.consumer) - 1,
1345 if (!lr->label) {
1351 mutex_init(&lr->config_mutex);
1352 init_waitqueue_head(&lr->wait);
1353 lr->event_buffer_size = ulr.event_buffer_size;
1354 if (lr->event_buffer_size == 0)
1355 lr->event_buffer_size = ulr.num_lines * 16;
1356 else if (lr->event_buffer_size > GPIO_V2_LINES_MAX * 16)
1357 lr->event_buffer_size = GPIO_V2_LINES_MAX * 16;
1359 atomic_set(&lr->seqno, 0);
1360 lr->num_lines = ulr.num_lines;
1372 ret = gpiod_request(desc, lr->label);
1376 lr->lines[i].desc = desc;
1399 ret = edge_detector_setup(&lr->lines[i], lc, i,
1418 file = anon_inode_getfile("gpio-line", &line_fileops, lr,
1439 lr->num_lines);
1446 linereq_free(lr);