Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 173861
b: refs/heads/master
c: 201d6a7
h: refs/heads/master
i:
  173859: effbcf4
v: v3
  • Loading branch information
Shinya Kuribayashi authored and Ben Dooks committed Dec 9, 2009
1 parent 896db3d commit 06020e9
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 10 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 41c4e35037337cfcd297322f3f60770955156683
refs/heads/master: 201d6a70b72d1e6ca5a8e03f5f41a7741241401a
26 changes: 17 additions & 9 deletions trunk/drivers/i2c/busses/i2c-designware.c
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,11 @@
#define DW_IC_INTR_START_DET 0x400
#define DW_IC_INTR_GEN_CALL 0x800

#define DW_IC_INTR_DEFAULT_MASK (DW_IC_INTR_RX_FULL | \
DW_IC_INTR_TX_EMPTY | \
DW_IC_INTR_TX_ABRT | \
DW_IC_INTR_STOP_DET)

#define DW_IC_STATUS_ACTIVITY 0x1

#define DW_IC_ERR_TX_ABRT 0x1
Expand Down Expand Up @@ -347,13 +352,16 @@ static void i2c_dw_xfer_init(struct dw_i2c_dev *dev)

/* Enable the adapter */
writel(1, dev->base + DW_IC_ENABLE);

/* Enable interrupts */
writel(DW_IC_INTR_DEFAULT_MASK, dev->base + DW_IC_INTR_MASK);
}

/*
* Initiate low level master read/write transaction.
* This function is called from i2c_dw_xfer when starting a transfer.
* This function is also called from i2c_dw_isr to continue a transfer
* that is longer than the size of the TX FIFO.
* Initiate (and continue) low level master read/write transaction.
* This function is only called from i2c_dw_isr, and pumping i2c_msg
* messages into the tx buffer. Even if the size of i2c_msg data is
* longer than the size of the tx buffer, it handles everything.
*/
static void
i2c_dw_xfer_msg(struct dw_i2c_dev *dev)
Expand All @@ -365,7 +373,7 @@ i2c_dw_xfer_msg(struct dw_i2c_dev *dev)
u32 buf_len = dev->tx_buf_len;
u8 *buf = dev->tx_buf;;

intr_mask = DW_IC_INTR_STOP_DET | DW_IC_INTR_TX_ABRT | DW_IC_INTR_RX_FULL;
intr_mask = DW_IC_INTR_DEFAULT_MASK;

for (; dev->msg_write_idx < dev->msgs_num; dev->msg_write_idx++) {
/* if target address has changed, we need to
Expand Down Expand Up @@ -405,11 +413,12 @@ i2c_dw_xfer_msg(struct dw_i2c_dev *dev)

if (buf_len > 0) {
/* more bytes to be written */
intr_mask |= DW_IC_INTR_TX_EMPTY;
dev->status |= STATUS_WRITE_IN_PROGRESS;
break;
} else
} else {
dev->status &= ~STATUS_WRITE_IN_PROGRESS;
intr_mask &= ~DW_IC_INTR_TX_EMPTY;
}
}

writel(intr_mask, dev->base + DW_IC_INTR_MASK);
Expand Down Expand Up @@ -479,7 +488,6 @@ i2c_dw_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[], int num)

/* start the transfers */
i2c_dw_xfer_init(dev);
i2c_dw_xfer_msg(dev);

/* wait for tx to complete */
ret = wait_for_completion_interruptible_timeout(&dev->cmd_complete, HZ);
Expand Down Expand Up @@ -687,7 +695,7 @@ static int __devinit dw_i2c_probe(struct platform_device *pdev)
i2c_dw_init(dev);

writel(0, dev->base + DW_IC_INTR_MASK); /* disable IRQ */
r = request_irq(dev->irq, i2c_dw_isr, 0, pdev->name, dev);
r = request_irq(dev->irq, i2c_dw_isr, IRQF_DISABLED, pdev->name, dev);
if (r) {
dev_err(&pdev->dev, "failure requesting irq %i\n", dev->irq);
goto err_iounmap;
Expand Down

0 comments on commit 06020e9

Please sign in to comment.