Lines Matching +full:te +full:- +full:gpios

1 // SPDX-License-Identifier: GPL-2.0
19 * cannot function as non-CIC system controller with SN7516x because
47 dev_dbg(board->gpib_dev, frm, ## __VA_ARGS__); } \
74 #define PINMAP_1 "gpib4pi-1.1"
82 * Raspberry-Pi connector and the GPIB bus *
85 * GPIB Pi-gpio GPIB -> RPi *
89 D01_pin_nr = 20, /* 1 -> 38 */
90 D02_pin_nr = 26, /* 2 -> 37 */
91 D03_pin_nr = 16, /* 3 -> 36 */
92 D04_pin_nr = 19, /* 4 -> 35 */
93 D05_pin_nr = 13, /* 13 -> 33 */
94 D06_pin_nr = 12, /* 14 -> 32 */
95 D07_pin_nr = 6, /* 15 -> 31 */
96 D08_pin_nr = 5, /* 16 -> 29 */
97 EOI_pin_nr = 9, /* 5 -> 21 */
98 DAV_pin_nr = 10, /* 6 -> 19 */
99 NRFD_pin_nr = 24, /* 7 -> 18 */
100 NDAC_pin_nr = 23, /* 8 -> 16 */
101 IFC_pin_nr = 22, /* 9 -> 15 */
102 SRQ_pin_nr = 11, /* 10 -> 23 */
103 _ATN_pin_nr = 25, /* 11 -> 22 */
104 REN_pin_nr = 27, /* 17 -> 13 */
118 PE_pin_nr = 7, /* 26 -> nc 11 Pullup Enable */
119 DC_pin_nr = 8, /* 24 -> 12 nc Direction control */
120 TE_pin_nr = 18, /* 12 -> 2 1 Talk Enable */
121 ACT_LED_pin_nr = 4, /* 7 -> LED */
131 * GPIO descriptors and pins - WARNING: STRICTLY KEEP ITEMS ORDER
169 #define TE all_descriptors[18] macro
172 /* YOGA adapter uses a global enable for the buffer chips, re-using the TE pin */
173 #define YOGA_ENABLE TE
200 /* Lookup table for general GPIOs */
275 int dav_mode; /* dav interrupt mode 0/1 -> edge/levels */
276 int nrfd_mode; /* nrfd interrupt mode 0/1 -> edge/levels */
277 int ndac_mode; /* nrfd interrupt mode 0/1 -> edge/levels */
353 struct bb_priv *priv = board->private_data; in bb_read()
361 board, mutex_is_locked(&board->user_mutex), length); in bb_read()
363 priv->end = 0; in bb_read()
364 priv->count = 0; in bb_read()
365 priv->rbuf = buffer; in bb_read()
368 priv->request = length; in bb_read()
369 priv->eos_check = (priv->eos_flags & REOS) == 0; /* do eos check */ in bb_read()
370 priv->eos_check_8 = priv->eos_flags & BIN; /* over 8 bits */ in bb_read()
371 priv->eos_mask_7 = priv->eos & 0x7f; /* with this 7 bit eos */ in bb_read()
375 spin_lock_irqsave(&priv->rw_lock, flags); in bb_read()
376 priv->dav_mode = 1; in bb_read()
377 priv->dav_rx = 1; in bb_read()
378 ENABLE_IRQ(priv->irq_DAV, IRQ_TYPE_LEVEL_LOW); in bb_read()
379 priv->end_flag = 0; in bb_read()
381 priv->r_busy = 1; in bb_read()
382 priv->phase = 100; in bb_read()
383 spin_unlock_irqrestore(&priv->rw_lock, flags); in bb_read()
387 retval = wait_event_interruptible(board->wait, in bb_read()
388 (priv->end_flag || board->status & TIMO)); in bb_read()
392 if (retval == 0 && board->status & TIMO) { in bb_read()
393 retval = -ETIMEDOUT; in bb_read()
396 retval = -ERESTARTSYS; in bb_read()
399 DISABLE_IRQ(priv->irq_DAV); in bb_read()
400 spin_lock_irqsave(&priv->rw_lock, flags); in bb_read()
402 priv->r_busy = 0; in bb_read()
403 spin_unlock_irqrestore(&priv->rw_lock, flags); in bb_read()
407 *bytes_read = priv->count; in bb_read()
408 *end = priv->end; in bb_read()
409 priv->r_busy = 0; in bb_read()
410 dbg_printk(2, "return: %d eoi|eos: %d count: %d\n\n", retval, priv->end, priv->count); in bb_read()
423 struct bb_priv *priv = board->private_data; in bb_DAV_interrupt()
427 spin_lock_irqsave(&priv->rw_lock, flags); in bb_DAV_interrupt()
429 priv->all_irqs++; in bb_DAV_interrupt()
431 if (priv->dav_mode) { in bb_DAV_interrupt()
432 ENABLE_IRQ(priv->irq_DAV, IRQ_TYPE_EDGE_BOTH); in bb_DAV_interrupt()
433 priv->dav_mode = 0; in bb_DAV_interrupt()
436 if (priv->r_busy == 0) { in bb_DAV_interrupt()
438 priv->count, priv->phase); in bb_DAV_interrupt()
439 priv->dav_idle++; in bb_DAV_interrupt()
440 priv->phase = 200; in bb_DAV_interrupt()
445 if (val == priv->dav_rx) { in bb_DAV_interrupt()
447 LINFMT ".\n", val, priv->dav_rx, priv->w_cnt, priv->length, in bb_DAV_interrupt()
448 priv->phase, priv->cmd, LINVAL); in bb_DAV_interrupt()
449 priv->dav_seq++; in bb_DAV_interrupt()
451 priv->dav_rx = val; in bb_DAV_interrupt()
454 irq, val, board->status, priv->direction, priv->r_busy, priv->w_busy); in bb_DAV_interrupt()
458 priv->rbuf[priv->count++] = get_data_lines(); in bb_DAV_interrupt()
459 priv->end = !gpiod_get_value(EOI); in bb_DAV_interrupt()
461 priv->end |= check_for_eos(priv, priv->rbuf[priv->count - 1]); in bb_DAV_interrupt()
462 priv->end_flag = ((priv->count >= priv->request) || priv->end); in bb_DAV_interrupt()
463 priv->phase = 210; in bb_DAV_interrupt()
466 if (priv->end_flag) { in bb_DAV_interrupt()
467 priv->r_busy = 0; in bb_DAV_interrupt()
468 wake_up_interruptible(&board->wait); in bb_DAV_interrupt()
469 priv->phase = 220; in bb_DAV_interrupt()
472 priv->phase = 230; in bb_DAV_interrupt()
477 spin_unlock_irqrestore(&priv->rw_lock, flags); in bb_DAV_interrupt()
478 dbg_printk(3, "< irq: %d count %d\n", irq, priv->count); in bb_DAV_interrupt()
494 struct bb_priv *priv = board->private_data; in bb_write()
498 priv->w_cnt = 0; in bb_write()
499 priv->w_buf = buffer; in bb_write()
501 board, mutex_is_locked(&board->user_mutex), length); in bb_write()
504 bb_buffer_print(board, buffer, length, priv->cmd, send_eoi); in bb_write()
505 priv->count = 0; in bb_write()
506 priv->phase = 300; in bb_write()
510 priv->end = send_eoi; in bb_write()
511 priv->length = length; in bb_write()
515 dbg_printk(2, "Enabling interrupts - NRFD: %d NDAC: %d\n", in bb_write()
519 retval = -ENOTCONN; in bb_write()
523 spin_lock_irqsave(&priv->rw_lock, flags); in bb_write()
524 priv->w_busy = 1; /* make the interrupt routines active */ in bb_write()
525 priv->write_done = 0; in bb_write()
526 priv->nrfd_mode = 1; in bb_write()
527 priv->ndac_mode = 1; in bb_write()
528 priv->dav_tx = 1; in bb_write()
529 ENABLE_IRQ(priv->irq_NDAC, IRQ_TYPE_LEVEL_HIGH); in bb_write()
530 ENABLE_IRQ(priv->irq_NRFD, IRQ_TYPE_LEVEL_HIGH); in bb_write()
531 spin_unlock_irqrestore(&priv->rw_lock, flags); in bb_write()
535 retval = wait_event_interruptible(board->wait, in bb_write()
536 priv->write_done || (board->status & TIMO)); in bb_write()
541 if (board->status & TIMO) { in bb_write()
542 retval = -ETIMEDOUT; in bb_write()
544 priv->w_cnt, length, priv->phase, LINVAL, send_eoi); in bb_write()
546 retval = priv->w_cnt; in bb_write()
549 retval = -ERESTARTSYS; in bb_write()
552 DISABLE_IRQ(priv->irq_NRFD); in bb_write()
553 DISABLE_IRQ(priv->irq_NDAC); in bb_write()
555 spin_lock_irqsave(&priv->rw_lock, flags); in bb_write()
556 priv->w_busy = 0; in bb_write()
558 gpiod_set_value(EOI, 1); // De-assert EOI (in case) in bb_write()
559 spin_unlock_irqrestore(&priv->rw_lock, flags); in bb_write()
562 *bytes_written = priv->w_cnt; in bb_write()
565 priv->phase = 310; in bb_write()
578 struct bb_priv *priv = board->private_data; in bb_NRFD_interrupt()
582 spin_lock_irqsave(&priv->rw_lock, flags); in bb_NRFD_interrupt()
585 priv->all_irqs++; in bb_NRFD_interrupt()
588 irq, nrfd, gpiod_get_value(NDAC), board->status, priv->direction, in bb_NRFD_interrupt()
589 priv->w_busy, priv->r_busy); in bb_NRFD_interrupt()
591 if (priv->nrfd_mode) { in bb_NRFD_interrupt()
592 ENABLE_IRQ(priv->irq_NRFD, IRQ_TYPE_EDGE_RISING); in bb_NRFD_interrupt()
593 priv->nrfd_mode = 0; in bb_NRFD_interrupt()
596 if (priv->w_busy == 0) { in bb_NRFD_interrupt()
598 priv->w_cnt, priv->length, priv->phase); in bb_NRFD_interrupt()
599 priv->nrfd_idle++; in bb_NRFD_interrupt()
604 priv->w_cnt, priv->length, priv->phase, priv->cmd, LINVAL); in bb_NRFD_interrupt()
605 priv->phase = 400; in bb_NRFD_interrupt()
606 priv->nrfd_seq++; in bb_NRFD_interrupt()
609 if (!priv->dav_tx) { in bb_NRFD_interrupt()
611 priv->w_cnt, priv->length, priv->cmd, LINVAL); in bb_NRFD_interrupt()
612 priv->dav_seq++; in bb_NRFD_interrupt()
616 if (priv->w_cnt >= priv->length) { // test for missed NDAC end of transfer in bb_NRFD_interrupt()
617 dev_err(board->gpib_dev, "Unexpected NRFD exit\n"); in bb_NRFD_interrupt()
618 priv->write_done = 1; in bb_NRFD_interrupt()
619 priv->w_busy = 0; in bb_NRFD_interrupt()
620 wake_up_interruptible(&board->wait); in bb_NRFD_interrupt()
624 dbg_printk(3, "sending %zu\n", priv->w_cnt); in bb_NRFD_interrupt()
626 set_data_lines(priv->w_buf[priv->w_cnt++]); // put the data on the lines in bb_NRFD_interrupt()
628 if (priv->w_cnt == priv->length && priv->end) { in bb_NRFD_interrupt()
634 priv->dav_tx = 0; in bb_NRFD_interrupt()
635 priv->phase = 410; in bb_NRFD_interrupt()
638 spin_unlock_irqrestore(&priv->rw_lock, flags); in bb_NRFD_interrupt()
652 struct bb_priv *priv = board->private_data; in bb_NDAC_interrupt()
656 spin_lock_irqsave(&priv->rw_lock, flags); in bb_NDAC_interrupt()
659 priv->all_irqs++; in bb_NDAC_interrupt()
661 irq, gpiod_get_value(NRFD), ndac, board->status, priv->direction, in bb_NDAC_interrupt()
662 priv->w_busy, priv->r_busy); in bb_NDAC_interrupt()
664 if (priv->ndac_mode) { in bb_NDAC_interrupt()
665 ENABLE_IRQ(priv->irq_NDAC, IRQ_TYPE_EDGE_RISING); in bb_NDAC_interrupt()
666 priv->ndac_mode = 0; in bb_NDAC_interrupt()
669 if (priv->w_busy == 0) { in bb_NDAC_interrupt()
671 priv->ndac_idle++; in bb_NDAC_interrupt()
675 dbg_printk(1, "out of order interrupt at %zu:%d.\n", priv->w_cnt, priv->phase); in bb_NDAC_interrupt()
676 priv->phase = 500; in bb_NDAC_interrupt()
677 priv->ndac_seq++; in bb_NDAC_interrupt()
680 if (priv->dav_tx) { in bb_NDAC_interrupt()
682 priv->w_cnt, priv->length, priv->cmd, LINVAL); in bb_NDAC_interrupt()
683 priv->dav_seq++; in bb_NDAC_interrupt()
687 dbg_printk(3, "accepted %zu\n", priv->w_cnt - 1); in bb_NDAC_interrupt()
690 priv->dav_tx = 1; in bb_NDAC_interrupt()
691 priv->phase = 510; in bb_NDAC_interrupt()
693 if (priv->w_cnt >= priv->length) { // test for end of transfer in bb_NDAC_interrupt()
694 priv->write_done = 1; in bb_NDAC_interrupt()
695 priv->w_busy = 0; in bb_NDAC_interrupt()
696 wake_up_interruptible(&board->wait); in bb_NDAC_interrupt()
700 spin_unlock_irqrestore(&priv->rw_lock, flags); in bb_NDAC_interrupt()
716 dbg_printk(3, "> %d st: %4lx\n", val, board->status); in bb_SRQ_interrupt()
719 set_bit(SRQI_NUM, &board->status); /* set_bit() is atomic */ in bb_SRQ_interrupt()
721 wake_up_interruptible(&board->wait); in bb_SRQ_interrupt()
730 struct bb_priv *priv = board->private_data; in bb_command()
733 dbg_printk(2, "%p %p\n", buffer, board->buffer); in bb_command()
737 priv->cmd = 1; in bb_command()
743 priv->talker_state = talker_idle; in bb_command()
746 priv->listener_state = listener_idle; in bb_command()
748 if (buffer[i] == (MTA(board->pad))) { in bb_command()
749 priv->talker_state = talker_addressed; in bb_command()
750 priv->listener_state = listener_idle; in bb_command()
751 } else if (buffer[i] == (MLA(board->pad))) { in bb_command()
752 priv->listener_state = listener_addressed; in bb_command()
753 priv->talker_state = talker_idle; in bb_command()
761 priv->cmd = 0; in bb_command()
831 dbg_printk(2, "%3d 0x%x->%c\n", i, buffer[i], printable(buffer[i])); in bb_buffer_print()
842 struct bb_priv *priv = board->private_data; in set_atn()
844 if (priv->listener_state != listener_idle && in set_atn()
845 priv->talker_state != talker_idle) { in set_atn()
846 dev_err(board->gpib_dev, "listener/talker state machine conflict\n"); in set_atn()
849 if (priv->listener_state == listener_active) in set_atn()
850 priv->listener_state = listener_addressed; in set_atn()
851 if (priv->talker_state == talker_active) in set_atn()
852 priv->talker_state = talker_addressed; in set_atn()
855 if (priv->listener_state == listener_addressed) { in set_atn()
856 priv->listener_state = listener_active; in set_atn()
859 if (priv->talker_state == talker_addressed) in set_atn()
860 priv->talker_state = talker_active; in set_atn()
881 struct bb_priv *priv = board->private_data; in bb_request_system_control()
885 return -EINVAL; in bb_request_system_control()
894 ENABLE_IRQ(priv->irq_SRQ, IRQ_TYPE_EDGE_FALLING); in bb_request_system_control()
901 struct bb_priv *priv = board->private_data; in bb_interface_clear()
906 priv->talker_state = talker_idle; in bb_interface_clear()
907 priv->listener_state = listener_idle; in bb_interface_clear()
908 set_bit(CIC_NUM, &board->status); in bb_interface_clear()
918 set_bit(REM_NUM, &board->status); in bb_remote_enable()
921 clear_bit(REM_NUM, &board->status); in bb_remote_enable()
928 struct bb_priv *priv = board->private_data; in bb_enable_eos()
931 priv->eos = eos_byte; in bb_enable_eos()
932 priv->eos_flags = REOS; in bb_enable_eos()
934 priv->eos_flags |= BIN; in bb_enable_eos()
941 struct bb_priv *priv = board->private_data; in bb_disable_eos()
944 priv->eos_flags &= ~REOS; in bb_disable_eos()
949 struct bb_priv *priv = board->private_data; in bb_update_status()
951 board->status &= ~clear_mask; in bb_update_status()
954 clear_bit(SRQI_NUM, &board->status); in bb_update_status()
956 set_bit(SRQI_NUM, &board->status); in bb_update_status()
958 clear_bit(ATN_NUM, &board->status); in bb_update_status()
960 set_bit(ATN_NUM, &board->status); in bb_update_status()
961 if (priv->talker_state == talker_active || in bb_update_status()
962 priv->talker_state == talker_addressed) in bb_update_status()
963 set_bit(TACS_NUM, &board->status); in bb_update_status()
965 clear_bit(TACS_NUM, &board->status); in bb_update_status()
967 if (priv->listener_state == listener_active || in bb_update_status()
968 priv->listener_state == listener_addressed) in bb_update_status()
969 set_bit(LACS_NUM, &board->status); in bb_update_status()
971 clear_bit(LACS_NUM, &board->status); in bb_update_status()
973 dbg_printk(2, "0x%lx mask 0x%x\n", board->status, clear_mask); in bb_update_status()
975 return board->status; in bb_update_status()
981 board->pad = address; in bb_primary_address()
989 board->sad = address; in bb_secondary_address()
995 return -ENOENT; in bb_parallel_poll()
1012 return 0; // -ENOENT; in bb_serial_poll_status()
1017 struct bb_priv *priv = board->private_data; in bb_t1_delay()
1020 priv->t1_delay = 350; in bb_t1_delay()
1022 priv->t1_delay = 1100; in bb_t1_delay()
1024 priv->t1_delay = 2000; in bb_t1_delay()
1026 dbg_printk(2, "t1 delay set to %d nanosec\n", priv->t1_delay); in bb_t1_delay()
1028 return priv->t1_delay; in bb_t1_delay()
1069 board->private_data = kzalloc(sizeof(struct bb_priv), GFP_KERNEL); in allocate_private()
1070 if (!board->private_data) in allocate_private()
1071 return -1; in allocate_private()
1077 kfree(board->private_data); in free_private()
1078 board->private_data = NULL; in free_private()
1086 return -1; in bb_get_irq()
1091 dev_err(board->gpib_dev, "can't get IRQ for %s\n", name); in bb_get_irq()
1092 return -1; in bb_get_irq()
1095 dev_err(board->gpib_dev, "can't request IRQ for %s %d\n", name, *irq); in bb_get_irq()
1097 return -1; in bb_get_irq()
1132 if (!board->gpib_dev) { in allocate_gpios()
1134 return -ENOENT; in allocate_gpios()
1138 lookup_table->dev_id = dev_name(board->gpib_dev); in allocate_gpios()
1140 dbg_printk(1, "Allocating gpios using table index %d\n", table_index); in allocate_gpios()
1149 desc = gpiod_get_index(board->gpib_dev, name, gpios_vector[j], GPIOD_IN); in allocate_gpios()
1156 dev_err(board->gpib_dev, "Unable to obtain gpio descriptor for pin %d error %ld\n", in allocate_gpios()
1161 lookup_table->dev_id = dev_name(board->gpib_dev); in allocate_gpios()
1174 return -1; in allocate_gpios()
1179 struct bb_priv *priv = board->private_data; in bb_detach()
1181 dbg_printk(2, "Enter with data %p\n", board->private_data); in bb_detach()
1182 if (!board->private_data) in bb_detach()
1185 bb_free_irq(board, &priv->irq_DAV, NAME "_DAV"); in bb_detach()
1186 bb_free_irq(board, &priv->irq_NRFD, NAME "_NRFD"); in bb_detach()
1187 bb_free_irq(board, &priv->irq_NDAC, NAME "_NDAC"); in bb_detach()
1188 bb_free_irq(board, &priv->irq_SRQ, NAME "_SRQ"); in bb_detach()
1196 dbg_printk(2, "detached board: %d\n", board->minor); in bb_detach()
1198 priv->nrfd_idle, priv->nrfd_seq, in bb_detach()
1199 priv->ndac_idle, priv->ndac_seq, in bb_detach()
1200 priv->dav_idle, priv->dav_seq, priv->all_irqs); in bb_detach()
1212 board->status = 0; in bb_attach()
1215 return -ENOMEM; in bb_attach()
1216 priv = board->private_data; in bb_attach()
1217 priv->direction = -1; in bb_attach()
1218 priv->t1_delay = 2000; in bb_attach()
1219 priv->listener_state = listener_idle; in bb_attach()
1220 priv->talker_state = talker_idle; in bb_attach()
1225 gpios_vector[&(PE) - &all_descriptors[0]] = -1; in bb_attach()
1226 gpios_vector[&(DC) - &all_descriptors[0]] = -1; in bb_attach()
1227 gpios_vector[&(TE) - &all_descriptors[0]] = -1; in bb_attach()
1231 gpios_vector[&(PE) - &all_descriptors[0]] = -1; in bb_attach()
1232 gpios_vector[&(DC) - &all_descriptors[0]] = -1; in bb_attach()
1233 gpios_vector[&(TE) - &all_descriptors[0]] = -1; in bb_attach()
1235 gpios_vector[&(REN) - &all_descriptors[0]] = 0; /* 27 -> 0 REN on GPIB pin 0 */ in bb_attach()
1238 gpios_vector[&(D03) - &all_descriptors[0]] = YOGA_D03_pin_nr; in bb_attach()
1239 gpios_vector[&(D04) - &all_descriptors[0]] = YOGA_D04_pin_nr; in bb_attach()
1240 gpios_vector[&(D05) - &all_descriptors[0]] = YOGA_D05_pin_nr; in bb_attach()
1241 gpios_vector[&(D06) - &all_descriptors[0]] = YOGA_D06_pin_nr; in bb_attach()
1242 gpios_vector[&(PE) - &all_descriptors[0]] = -1; in bb_attach()
1243 gpios_vector[&(DC) - &all_descriptors[0]] = -1; in bb_attach()
1245 dev_err(board->gpib_dev, "Unrecognized pin map %s\n", pin_map); in bb_attach()
1262 gpiod_direction_output(TE, 1); in bb_attach()
1274 spin_lock_init(&priv->rw_lock); in bb_attach()
1277 if (bb_get_irq(board, NAME "_DAV", DAV, &priv->irq_DAV, bb_DAV_interrupt, NULL, in bb_attach()
1282 if (bb_get_irq(board, NAME "_NRFD", NRFD, &priv->irq_NRFD, bb_NRFD_interrupt, NULL, in bb_attach()
1287 if (bb_get_irq(board, NAME "_NDAC", NDAC, &priv->irq_NDAC, bb_NDAC_interrupt, NULL, in bb_attach()
1292 if (bb_get_irq(board, NAME "_SRQ", SRQ, &priv->irq_SRQ, bb_SRQ_interrupt, NULL, in bb_attach()
1296 dbg_printk(0, "attached board %d\n", board->minor); in bb_attach()
1302 retval = -1; in bb_attach()
1361 return ((a->tv_sec - b->tv_sec) * 1000000 + in usec_diff()
1362 (a->tv_nsec - b->tv_nsec) / 1000); in usec_diff()
1367 if (priv->eos_check) in check_for_eos()
1370 if (priv->eos_check_8) { in check_for_eos()
1371 if (priv->eos == byte) in check_for_eos()
1374 if (priv->eos_mask_7 == (byte & 0x7f)) in check_for_eos()
1433 if (priv->direction == DIR_WRITE) in SET_DIR_WRITE()
1444 gpiod_set_value(TE, 1); /* set NDAC and NRFD to receive and DAV to transmit */ in SET_DIR_WRITE()
1447 priv->direction = DIR_WRITE; in SET_DIR_WRITE()
1452 if (priv->direction == DIR_READ) in SET_DIR_READ()
1462 gpiod_set_value(TE, 0); /* set NDAC and NRFD to transmit and DAV to receive */ in SET_DIR_READ()
1468 priv->direction = DIR_READ; in SET_DIR_READ()