| .. | .. |
|---|
| 375 | 375 | struct xiic_i2c *i2c = dev_id; |
|---|
| 376 | 376 | u32 pend, isr, ier; |
|---|
| 377 | 377 | u32 clr = 0; |
|---|
| 378 | + int xfer_more = 0; |
|---|
| 379 | + int wakeup_req = 0; |
|---|
| 380 | + int wakeup_code = 0; |
|---|
| 378 | 381 | |
|---|
| 379 | 382 | /* Get the interrupt Status from the IPIF. There is no clearing of |
|---|
| 380 | 383 | * interrupts in the IPIF. Interrupts must be cleared at the source. |
|---|
| .. | .. |
|---|
| 411 | 414 | */ |
|---|
| 412 | 415 | xiic_reinit(i2c); |
|---|
| 413 | 416 | |
|---|
| 414 | | - if (i2c->rx_msg) |
|---|
| 415 | | - xiic_wakeup(i2c, STATE_ERROR); |
|---|
| 416 | | - if (i2c->tx_msg) |
|---|
| 417 | | - xiic_wakeup(i2c, STATE_ERROR); |
|---|
| 417 | + if (i2c->rx_msg) { |
|---|
| 418 | + wakeup_req = 1; |
|---|
| 419 | + wakeup_code = STATE_ERROR; |
|---|
| 420 | + } |
|---|
| 421 | + if (i2c->tx_msg) { |
|---|
| 422 | + wakeup_req = 1; |
|---|
| 423 | + wakeup_code = STATE_ERROR; |
|---|
| 424 | + } |
|---|
| 425 | + /* don't try to handle other events */ |
|---|
| 426 | + goto out; |
|---|
| 418 | 427 | } |
|---|
| 419 | 428 | if (pend & XIIC_INTR_RX_FULL_MASK) { |
|---|
| 420 | 429 | /* Receive register/FIFO is full */ |
|---|
| .. | .. |
|---|
| 448 | 457 | i2c->tx_msg++; |
|---|
| 449 | 458 | dev_dbg(i2c->adap.dev.parent, |
|---|
| 450 | 459 | "%s will start next...\n", __func__); |
|---|
| 451 | | - |
|---|
| 452 | | - __xiic_start_xfer(i2c); |
|---|
| 460 | + xfer_more = 1; |
|---|
| 453 | 461 | } |
|---|
| 454 | 462 | } |
|---|
| 455 | 463 | } |
|---|
| .. | .. |
|---|
| 463 | 471 | if (!i2c->tx_msg) |
|---|
| 464 | 472 | goto out; |
|---|
| 465 | 473 | |
|---|
| 466 | | - if ((i2c->nmsgs == 1) && !i2c->rx_msg && |
|---|
| 467 | | - xiic_tx_space(i2c) == 0) |
|---|
| 468 | | - xiic_wakeup(i2c, STATE_DONE); |
|---|
| 474 | + wakeup_req = 1; |
|---|
| 475 | + |
|---|
| 476 | + if (i2c->nmsgs == 1 && !i2c->rx_msg && |
|---|
| 477 | + xiic_tx_space(i2c) == 0) |
|---|
| 478 | + wakeup_code = STATE_DONE; |
|---|
| 469 | 479 | else |
|---|
| 470 | | - xiic_wakeup(i2c, STATE_ERROR); |
|---|
| 480 | + wakeup_code = STATE_ERROR; |
|---|
| 471 | 481 | } |
|---|
| 472 | 482 | if (pend & (XIIC_INTR_TX_EMPTY_MASK | XIIC_INTR_TX_HALF_MASK)) { |
|---|
| 473 | 483 | /* Transmit register/FIFO is empty or ½ empty */ |
|---|
| .. | .. |
|---|
| 491 | 501 | if (i2c->nmsgs > 1) { |
|---|
| 492 | 502 | i2c->nmsgs--; |
|---|
| 493 | 503 | i2c->tx_msg++; |
|---|
| 494 | | - __xiic_start_xfer(i2c); |
|---|
| 504 | + xfer_more = 1; |
|---|
| 495 | 505 | } else { |
|---|
| 496 | 506 | xiic_irq_dis(i2c, XIIC_INTR_TX_HALF_MASK); |
|---|
| 497 | 507 | |
|---|
| .. | .. |
|---|
| 509 | 519 | dev_dbg(i2c->adap.dev.parent, "%s clr: 0x%x\n", __func__, clr); |
|---|
| 510 | 520 | |
|---|
| 511 | 521 | xiic_setreg32(i2c, XIIC_IISR_OFFSET, clr); |
|---|
| 522 | + if (xfer_more) |
|---|
| 523 | + __xiic_start_xfer(i2c); |
|---|
| 524 | + if (wakeup_req) |
|---|
| 525 | + xiic_wakeup(i2c, wakeup_code); |
|---|
| 526 | + |
|---|
| 527 | + WARN_ON(xfer_more && wakeup_req); |
|---|
| 528 | + |
|---|
| 512 | 529 | mutex_unlock(&i2c->lock); |
|---|
| 513 | 530 | return IRQ_HANDLED; |
|---|
| 514 | 531 | } |
|---|