|
Lines 550-556
twsi_intr(void *arg)
Link Here
|
| 550 |
case TWSI_STATUS_RPTD_START: |
550 |
case TWSI_STATUS_RPTD_START: |
| 551 |
/* Transmit the address */ |
551 |
/* Transmit the address */ |
| 552 |
debugf(sc->dev, "Send the address (%x)", sc->msgs[sc->msg_idx].slave); |
552 |
debugf(sc->dev, "Send the address (%x)", sc->msgs[sc->msg_idx].slave); |
| 553 |
|
|
|
| 554 |
if (sc->msgs[sc->msg_idx].flags & IIC_M_RD) |
553 |
if (sc->msgs[sc->msg_idx].flags & IIC_M_RD) |
| 555 |
TWSI_WRITE(sc, sc->reg_data, |
554 |
TWSI_WRITE(sc, sc->reg_data, |
| 556 |
sc->msgs[sc->msg_idx].slave | LSB); |
555 |
sc->msgs[sc->msg_idx].slave | LSB); |
|
Lines 576-582
twsi_intr(void *arg)
Link Here
|
| 576 |
debugf(sc->dev, "Ack received after transmitting the address (read)\n"); |
575 |
debugf(sc->dev, "Ack received after transmitting the address (read)\n"); |
| 577 |
sc->recv_bytes = 0; |
576 |
sc->recv_bytes = 0; |
| 578 |
|
577 |
|
| 579 |
TWSI_WRITE(sc, sc->reg_control, sc->control_val); |
578 |
/* If we are expecting one byte, disable ACK now or else we will miss |
|
|
579 |
* TWSI_STATUS_DATA_RD_NOACK event. Per I2C standard the last data received |
| 580 |
* will not be acknowledged. */ |
| 581 |
if (sc->msgs[sc->msg_idx].len - sc->recv_bytes == 1){ |
| 582 |
debugf(sc->dev, "Expecting one byte to receive, disabling ACK bit...\n"); |
| 583 |
sc->control_val &= ~TWSI_CONTROL_ACK; |
| 584 |
TWSI_WRITE(sc, sc->reg_control, sc->control_val); |
| 585 |
/* Else, set ACK bit to acknowledge incoming data. |
| 586 |
* TWSI_STATUS_DATA_RD_ACK will handle succeeding received envents. */ |
| 587 |
} else { |
| 588 |
sc->control_val |= TWSI_CONTROL_ACK; |
| 589 |
TWSI_WRITE(sc, sc->reg_control, sc->control_val); |
| 590 |
} |
| 580 |
break; |
591 |
break; |
| 581 |
|
592 |
|
| 582 |
case TWSI_STATUS_ADDR_W_NACK: |
593 |
case TWSI_STATUS_ADDR_W_NACK: |
|
Lines 590-664
twsi_intr(void *arg)
Link Here
|
| 590 |
|
601 |
|
| 591 |
case TWSI_STATUS_DATA_WR_ACK: |
602 |
case TWSI_STATUS_DATA_WR_ACK: |
| 592 |
debugf(sc->dev, "Ack received after transmitting data\n"); |
603 |
debugf(sc->dev, "Ack received after transmitting data\n"); |
| 593 |
if (sc->sent_bytes == sc->msgs[sc->msg_idx].len) { |
604 |
/* Check if all data have been sent already.*/ |
|
|
605 |
if (sc->sent_bytes == sc->msgs[sc->msg_idx].len) { |
| 594 |
debugf(sc->dev, "Done sending all the bytes for msg %d\n", sc->msg_idx); |
606 |
debugf(sc->dev, "Done sending all the bytes for msg %d\n", sc->msg_idx); |
| 595 |
/* Send stop, no interrupts on stop */ |
607 |
|
| 596 |
if (!(sc->msgs[sc->msg_idx].flags & IIC_M_NOSTOP)) { |
608 |
/* Move to next message and decide the next operation to perform. */ |
| 597 |
debugf(sc->dev, "Done TX data, send stop\n"); |
|
|
| 598 |
TWSI_WRITE(sc, sc->reg_control, |
| 599 |
sc->control_val | TWSI_CONTROL_STOP); |
| 600 |
} else { |
| 601 |
debugf(sc->dev, "Done TX data with NO_STOP\n"); |
| 602 |
TWSI_WRITE(sc, sc->reg_control, sc->control_val | TWSI_CONTROL_START); |
| 603 |
} |
| 604 |
sc->msg_idx++; |
609 |
sc->msg_idx++; |
| 605 |
if (sc->msg_idx == sc->nmsgs) { |
610 |
sc->sent_bytes=0; /* Reset sent counter */ |
| 606 |
debugf(sc->dev, "transfer_done=1\n"); |
611 |
|
| 607 |
transfer_done = 1; |
612 |
if (sc->msg_idx == sc->nmsgs) { |
| 608 |
sc->error = 0; |
613 |
/* If we are done with all the messages, end the transfer. */ |
|
|
614 |
debugf(sc->dev, "Done all massages, sending STOP\n"); |
| 615 |
TWSI_WRITE(sc, sc->reg_control, sc->control_val | TWSI_CONTROL_STOP); |
| 616 |
transfer_done = 1; |
| 617 |
sc->transfer = 0; |
| 618 |
sc->error = 0; |
| 619 |
/* Else, process the next messages */ |
| 620 |
} else if (sc->msgs[sc->msg_idx].flags == IIC_M_RD) { |
| 621 |
/* If flag is IIC_M_RD, perform repeat START */ |
| 622 |
debugf(sc->dev, "Done with massages[%d], sending repeat START\n", sc->msg_idx-1 ); |
| 623 |
TWSI_WRITE(sc, sc->reg_control, sc->control_val | TWSI_CONTROL_START); |
| 624 |
TWSI_WRITE(sc, sc->reg_control, sc->control_val); |
| 609 |
} else { |
625 |
} else { |
| 610 |
debugf(sc->dev, "Send repeated start\n"); |
626 |
/* Otherwise, treat it as a continuation of write operation. |
| 611 |
TWSI_WRITE(sc, sc->reg_control, sc->control_val | TWSI_CONTROL_START); |
627 |
* Immediately send the first data of the next message. |
| 612 |
} |
628 |
* |
| 613 |
} else { |
629 |
* from i2c.c notes: |
| 614 |
debugf(sc->dev, "Sending byte %d (of %d) = %x\n", |
630 |
* If the transfer direction is write and we did a write of the offset |
| 615 |
sc->sent_bytes, |
631 |
* above, then we need to elide the start; this transfer is just more |
| 616 |
sc->msgs[sc->msg_idx].len, |
632 |
* writing that follows the one started above. */ |
| 617 |
sc->msgs[sc->msg_idx].buf[sc->sent_bytes]); |
633 |
|
| 618 |
TWSI_WRITE(sc, sc->reg_data, |
634 |
debugf(sc->dev, "Sending data=%x of msg[%d]\n", |
| 619 |
sc->msgs[sc->msg_idx].buf[sc->sent_bytes]); |
635 |
sc->msgs[sc->msg_idx].buf[sc->sent_bytes], sc->msg_idx); |
| 620 |
TWSI_WRITE(sc, sc->reg_control, |
636 |
TWSI_WRITE(sc, sc->reg_data, sc->msgs[sc->msg_idx].buf[sc->sent_bytes]); |
| 621 |
sc->control_val); |
637 |
TWSI_WRITE(sc, sc->reg_control, sc->control_val); |
| 622 |
sc->sent_bytes++; |
638 |
sc->sent_bytes++; |
|
|
639 |
} |
| 640 |
|
| 641 |
/* Send remaining data */ |
| 642 |
} else { |
| 643 |
debugf(sc->dev, "Sending data=%x of msg[%d]\n", sc->msgs[sc->msg_idx].buf[sc->sent_bytes], sc->msg_idx); |
| 644 |
TWSI_WRITE(sc, sc->reg_data, sc->msgs[sc->msg_idx].buf[sc->sent_bytes]); |
| 645 |
TWSI_WRITE(sc, sc->reg_control, sc->control_val); |
| 646 |
sc->sent_bytes++; |
| 623 |
} |
647 |
} |
| 624 |
break; |
648 |
break; |
|
|
649 |
|
| 625 |
|
650 |
|
| 626 |
case TWSI_STATUS_DATA_RD_ACK: |
651 |
case TWSI_STATUS_DATA_RD_ACK: |
| 627 |
debugf(sc->dev, "Ack received after receiving data\n"); |
652 |
debugf(sc->dev, "Ack received after receiving data\n"); |
| 628 |
sc->msgs[sc->msg_idx].buf[sc->recv_bytes++] = TWSI_READ(sc, sc->reg_data); |
653 |
sc->msgs[sc->msg_idx].buf[sc->recv_bytes++] = TWSI_READ(sc, sc->reg_data); |
| 629 |
debugf(sc->dev, "msg_len=%d recv_bytes=%d\n", sc->msgs[sc->msg_idx].len, sc->recv_bytes); |
654 |
debugf(sc->dev, "msg_len=%d recv_bytes=%d\n", sc->msgs[sc->msg_idx].len, sc->recv_bytes); |
| 630 |
|
655 |
|
| 631 |
/* If we only have one byte left, disable ACK */ |
656 |
/* If we only have one byte left to receive , disable ACK bit now * |
| 632 |
if (sc->msgs[sc->msg_idx].len - sc->recv_bytes == 1) |
657 |
* so that TWSI_STATUS_DATA_RD_NOACK for will be triggered for next event. */ |
|
|
658 |
if (sc->msgs[sc->msg_idx].len - sc->recv_bytes == 1){ |
| 659 |
debugf(sc->dev, "Last byte, disabling ACK bit...\n"); |
| 633 |
sc->control_val &= ~TWSI_CONTROL_ACK; |
660 |
sc->control_val &= ~TWSI_CONTROL_ACK; |
| 634 |
if (sc->msgs[sc->msg_idx].len == sc->recv_bytes) { |
661 |
TWSI_WRITE(sc, sc->reg_control, sc->control_val); |
| 635 |
debugf(sc->dev, "Done with msg %d\n", sc->msg_idx); |
662 |
} else { |
| 636 |
sc->msg_idx++; |
663 |
/* Ensure we ACK the next data we received */ |
| 637 |
if (sc->msg_idx == sc->nmsgs - 1) { |
664 |
sc->control_val |=TWSI_CONTROL_ACK; |
| 638 |
debugf(sc->dev, "No more msgs\n"); |
665 |
TWSI_WRITE(sc, sc->reg_control, sc->control_val); |
| 639 |
transfer_done = 1; |
|
|
| 640 |
sc->error = 0; |
| 641 |
} |
| 642 |
} |
666 |
} |
| 643 |
TWSI_WRITE(sc, sc->reg_control, sc->control_val); |
|
|
| 644 |
break; |
667 |
break; |
| 645 |
|
668 |
|
| 646 |
case TWSI_STATUS_DATA_RD_NOACK: |
669 |
case TWSI_STATUS_DATA_RD_NOACK: |
| 647 |
if (sc->msgs[sc->msg_idx].len - sc->recv_bytes == 1) { |
670 |
/* Put the data on the receive buffer. */ |
| 648 |
sc->msgs[sc->msg_idx].buf[sc->recv_bytes++] = TWSI_READ(sc, sc->reg_data); |
671 |
sc->msgs[sc->msg_idx].buf[sc->recv_bytes++] = TWSI_READ(sc, sc->reg_data); |
| 649 |
debugf(sc->dev, "Done RX data, send stop (2)\n"); |
672 |
debugf(sc->dev, "Done receiving all the byte(s) for msg %d\n", sc->msg_idx); |
| 650 |
if (!(sc->msgs[sc->msg_idx].flags & IIC_M_NOSTOP)) |
673 |
|
| 651 |
TWSI_WRITE(sc, sc->reg_control, |
674 |
sc->msg_idx++; /* Ready for next message */ |
| 652 |
sc->control_val | TWSI_CONTROL_STOP); |
675 |
sc->recv_bytes=0; /* Reset receive counter */ |
|
|
676 |
if (sc->msg_idx == sc->nmsgs) { |
| 677 |
debugf(sc->dev, "Done all massages, sending STOP\n"); |
| 678 |
TWSI_WRITE(sc, sc->reg_control, sc->control_val | TWSI_CONTROL_STOP); |
| 679 |
transfer_done = 1; |
| 680 |
sc->transfer = 0; |
| 681 |
sc->error = 0; |
| 653 |
} else { |
682 |
} else { |
| 654 |
debugf(sc->dev, "No ack when receiving data, sending stop anyway\n"); |
683 |
/* If we have more messages, start over. */ |
| 655 |
if (!(sc->msgs[sc->msg_idx].flags & IIC_M_NOSTOP)) |
684 |
debugf(sc->dev, "Done with massages[%d], sending repeat START\n", sc->msg_idx-1 ); |
| 656 |
TWSI_WRITE(sc, sc->reg_control, |
685 |
TWSI_WRITE(sc, sc->reg_control, sc->control_val | TWSI_CONTROL_START); |
| 657 |
sc->control_val | TWSI_CONTROL_STOP); |
686 |
TWSI_WRITE(sc, sc->reg_control, sc->control_val); |
| 658 |
} |
687 |
} |
| 659 |
sc->transfer = 0; |
|
|
| 660 |
transfer_done = 1; |
| 661 |
sc->error = 0; |
| 662 |
break; |
688 |
break; |
| 663 |
|
689 |
|
| 664 |
default: |
690 |
default: |