diff options
-rw-r--r-- | drivers/i2c/busses/i2c-at91.c | 147 |
1 files changed, 130 insertions, 17 deletions
diff --git a/drivers/i2c/busses/i2c-at91.c b/drivers/i2c/busses/i2c-at91.c index abd93f3a05a0..9e54f97a9020 100644 --- a/drivers/i2c/busses/i2c-at91.c +++ b/drivers/i2c/busses/i2c-at91.c | |||
@@ -54,6 +54,8 @@ | |||
54 | #define AT91_TWI_THRCLR BIT(24) /* Transmit Holding Register Clear */ | 54 | #define AT91_TWI_THRCLR BIT(24) /* Transmit Holding Register Clear */ |
55 | #define AT91_TWI_RHRCLR BIT(25) /* Receive Holding Register Clear */ | 55 | #define AT91_TWI_RHRCLR BIT(25) /* Receive Holding Register Clear */ |
56 | #define AT91_TWI_LOCKCLR BIT(26) /* Lock Clear */ | 56 | #define AT91_TWI_LOCKCLR BIT(26) /* Lock Clear */ |
57 | #define AT91_TWI_FIFOEN BIT(28) /* FIFO Enable */ | ||
58 | #define AT91_TWI_FIFODIS BIT(29) /* FIFO Disable */ | ||
57 | 59 | ||
58 | #define AT91_TWI_MMR 0x0004 /* Master Mode Register */ | 60 | #define AT91_TWI_MMR 0x0004 /* Master Mode Register */ |
59 | #define AT91_TWI_IADRSZ_1 0x0100 /* Internal Device Address Size */ | 61 | #define AT91_TWI_IADRSZ_1 0x0100 /* Internal Device Address Size */ |
@@ -85,6 +87,22 @@ | |||
85 | #define AT91_TWI_ACR_DATAL(len) ((len) & 0xff) | 87 | #define AT91_TWI_ACR_DATAL(len) ((len) & 0xff) |
86 | #define AT91_TWI_ACR_DIR BIT(8) | 88 | #define AT91_TWI_ACR_DIR BIT(8) |
87 | 89 | ||
90 | #define AT91_TWI_FMR 0x0050 /* FIFO Mode Register */ | ||
91 | #define AT91_TWI_FMR_TXRDYM(mode) (((mode) & 0x3) << 0) | ||
92 | #define AT91_TWI_FMR_TXRDYM_MASK (0x3 << 0) | ||
93 | #define AT91_TWI_FMR_RXRDYM(mode) (((mode) & 0x3) << 4) | ||
94 | #define AT91_TWI_FMR_RXRDYM_MASK (0x3 << 4) | ||
95 | #define AT91_TWI_ONE_DATA 0x0 | ||
96 | #define AT91_TWI_TWO_DATA 0x1 | ||
97 | #define AT91_TWI_FOUR_DATA 0x2 | ||
98 | |||
99 | #define AT91_TWI_FLR 0x0054 /* FIFO Level Register */ | ||
100 | |||
101 | #define AT91_TWI_FSR 0x0060 /* FIFO Status Register */ | ||
102 | #define AT91_TWI_FIER 0x0064 /* FIFO Interrupt Enable Register */ | ||
103 | #define AT91_TWI_FIDR 0x0068 /* FIFO Interrupt Disable Register */ | ||
104 | #define AT91_TWI_FIMR 0x006c /* FIFO Interrupt Mask Register */ | ||
105 | |||
88 | #define AT91_TWI_VER 0x00fc /* Version Register */ | 106 | #define AT91_TWI_VER 0x00fc /* Version Register */ |
89 | 107 | ||
90 | struct at91_twi_pdata { | 108 | struct at91_twi_pdata { |
@@ -98,7 +116,7 @@ struct at91_twi_pdata { | |||
98 | struct at91_twi_dma { | 116 | struct at91_twi_dma { |
99 | struct dma_chan *chan_rx; | 117 | struct dma_chan *chan_rx; |
100 | struct dma_chan *chan_tx; | 118 | struct dma_chan *chan_tx; |
101 | struct scatterlist sg; | 119 | struct scatterlist sg[2]; |
102 | struct dma_async_tx_descriptor *data_desc; | 120 | struct dma_async_tx_descriptor *data_desc; |
103 | enum dma_data_direction direction; | 121 | enum dma_data_direction direction; |
104 | bool buf_mapped; | 122 | bool buf_mapped; |
@@ -121,6 +139,7 @@ struct at91_twi_dev { | |||
121 | struct at91_twi_pdata *pdata; | 139 | struct at91_twi_pdata *pdata; |
122 | bool use_dma; | 140 | bool use_dma; |
123 | bool recv_len_abort; | 141 | bool recv_len_abort; |
142 | u32 fifo_size; | ||
124 | struct at91_twi_dma dma; | 143 | struct at91_twi_dma dma; |
125 | }; | 144 | }; |
126 | 145 | ||
@@ -154,6 +173,9 @@ static void at91_init_twi_bus(struct at91_twi_dev *dev) | |||
154 | { | 173 | { |
155 | at91_disable_twi_interrupts(dev); | 174 | at91_disable_twi_interrupts(dev); |
156 | at91_twi_write(dev, AT91_TWI_CR, AT91_TWI_SWRST); | 175 | at91_twi_write(dev, AT91_TWI_CR, AT91_TWI_SWRST); |
176 | /* FIFO should be enabled immediately after the software reset */ | ||
177 | if (dev->fifo_size) | ||
178 | at91_twi_write(dev, AT91_TWI_CR, AT91_TWI_FIFOEN); | ||
157 | at91_twi_write(dev, AT91_TWI_CR, AT91_TWI_MSEN); | 179 | at91_twi_write(dev, AT91_TWI_CR, AT91_TWI_MSEN); |
158 | at91_twi_write(dev, AT91_TWI_CR, AT91_TWI_SVDIS); | 180 | at91_twi_write(dev, AT91_TWI_CR, AT91_TWI_SVDIS); |
159 | at91_twi_write(dev, AT91_TWI_CWGR, dev->twi_cwgr_reg); | 181 | at91_twi_write(dev, AT91_TWI_CWGR, dev->twi_cwgr_reg); |
@@ -200,7 +222,7 @@ static void at91_twi_dma_cleanup(struct at91_twi_dev *dev) | |||
200 | dma->xfer_in_progress = false; | 222 | dma->xfer_in_progress = false; |
201 | } | 223 | } |
202 | if (dma->buf_mapped) { | 224 | if (dma->buf_mapped) { |
203 | dma_unmap_single(dev->dev, sg_dma_address(&dma->sg), | 225 | dma_unmap_single(dev->dev, sg_dma_address(&dma->sg[0]), |
204 | dev->buf_len, dma->direction); | 226 | dev->buf_len, dma->direction); |
205 | dma->buf_mapped = false; | 227 | dma->buf_mapped = false; |
206 | } | 228 | } |
@@ -213,7 +235,8 @@ static void at91_twi_write_next_byte(struct at91_twi_dev *dev) | |||
213 | if (dev->buf_len <= 0) | 235 | if (dev->buf_len <= 0) |
214 | return; | 236 | return; |
215 | 237 | ||
216 | at91_twi_write(dev, AT91_TWI_THR, *dev->buf); | 238 | /* 8bit write works with and without FIFO */ |
239 | writeb_relaxed(*dev->buf, dev->base + AT91_TWI_THR); | ||
217 | 240 | ||
218 | /* send stop when last byte has been written */ | 241 | /* send stop when last byte has been written */ |
219 | if (--dev->buf_len == 0) | 242 | if (--dev->buf_len == 0) |
@@ -229,7 +252,7 @@ static void at91_twi_write_data_dma_callback(void *data) | |||
229 | { | 252 | { |
230 | struct at91_twi_dev *dev = (struct at91_twi_dev *)data; | 253 | struct at91_twi_dev *dev = (struct at91_twi_dev *)data; |
231 | 254 | ||
232 | dma_unmap_single(dev->dev, sg_dma_address(&dev->dma.sg), | 255 | dma_unmap_single(dev->dev, sg_dma_address(&dev->dma.sg[0]), |
233 | dev->buf_len, DMA_TO_DEVICE); | 256 | dev->buf_len, DMA_TO_DEVICE); |
234 | 257 | ||
235 | /* | 258 | /* |
@@ -250,6 +273,7 @@ static void at91_twi_write_data_dma(struct at91_twi_dev *dev) | |||
250 | struct dma_async_tx_descriptor *txdesc; | 273 | struct dma_async_tx_descriptor *txdesc; |
251 | struct at91_twi_dma *dma = &dev->dma; | 274 | struct at91_twi_dma *dma = &dev->dma; |
252 | struct dma_chan *chan_tx = dma->chan_tx; | 275 | struct dma_chan *chan_tx = dma->chan_tx; |
276 | unsigned int sg_len = 1; | ||
253 | 277 | ||
254 | if (dev->buf_len <= 0) | 278 | if (dev->buf_len <= 0) |
255 | return; | 279 | return; |
@@ -265,10 +289,43 @@ static void at91_twi_write_data_dma(struct at91_twi_dev *dev) | |||
265 | } | 289 | } |
266 | dma->buf_mapped = true; | 290 | dma->buf_mapped = true; |
267 | at91_twi_irq_restore(dev); | 291 | at91_twi_irq_restore(dev); |
268 | sg_dma_len(&dma->sg) = dev->buf_len; | ||
269 | sg_dma_address(&dma->sg) = dma_addr; | ||
270 | 292 | ||
271 | txdesc = dmaengine_prep_slave_sg(chan_tx, &dma->sg, 1, DMA_MEM_TO_DEV, | 293 | if (dev->fifo_size) { |
294 | size_t part1_len, part2_len; | ||
295 | struct scatterlist *sg; | ||
296 | unsigned fifo_mr; | ||
297 | |||
298 | sg_len = 0; | ||
299 | |||
300 | part1_len = dev->buf_len & ~0x3; | ||
301 | if (part1_len) { | ||
302 | sg = &dma->sg[sg_len++]; | ||
303 | sg_dma_len(sg) = part1_len; | ||
304 | sg_dma_address(sg) = dma_addr; | ||
305 | } | ||
306 | |||
307 | part2_len = dev->buf_len & 0x3; | ||
308 | if (part2_len) { | ||
309 | sg = &dma->sg[sg_len++]; | ||
310 | sg_dma_len(sg) = part2_len; | ||
311 | sg_dma_address(sg) = dma_addr + part1_len; | ||
312 | } | ||
313 | |||
314 | /* | ||
315 | * DMA controller is triggered when at least 4 data can be | ||
316 | * written into the TX FIFO | ||
317 | */ | ||
318 | fifo_mr = at91_twi_read(dev, AT91_TWI_FMR); | ||
319 | fifo_mr &= ~AT91_TWI_FMR_TXRDYM_MASK; | ||
320 | fifo_mr |= AT91_TWI_FMR_TXRDYM(AT91_TWI_FOUR_DATA); | ||
321 | at91_twi_write(dev, AT91_TWI_FMR, fifo_mr); | ||
322 | } else { | ||
323 | sg_dma_len(&dma->sg[0]) = dev->buf_len; | ||
324 | sg_dma_address(&dma->sg[0]) = dma_addr; | ||
325 | } | ||
326 | |||
327 | txdesc = dmaengine_prep_slave_sg(chan_tx, dma->sg, sg_len, | ||
328 | DMA_MEM_TO_DEV, | ||
272 | DMA_PREP_INTERRUPT | DMA_CTRL_ACK); | 329 | DMA_PREP_INTERRUPT | DMA_CTRL_ACK); |
273 | if (!txdesc) { | 330 | if (!txdesc) { |
274 | dev_err(dev->dev, "dma prep slave sg failed\n"); | 331 | dev_err(dev->dev, "dma prep slave sg failed\n"); |
@@ -293,7 +350,8 @@ static void at91_twi_read_next_byte(struct at91_twi_dev *dev) | |||
293 | if (dev->buf_len <= 0) | 350 | if (dev->buf_len <= 0) |
294 | return; | 351 | return; |
295 | 352 | ||
296 | *dev->buf = at91_twi_read(dev, AT91_TWI_RHR) & 0xff; | 353 | /* 8bit read works with and without FIFO */ |
354 | *dev->buf = readb_relaxed(dev->base + AT91_TWI_RHR); | ||
297 | --dev->buf_len; | 355 | --dev->buf_len; |
298 | 356 | ||
299 | /* return if aborting, we only needed to read RHR to clear RXRDY*/ | 357 | /* return if aborting, we only needed to read RHR to clear RXRDY*/ |
@@ -330,7 +388,7 @@ static void at91_twi_read_data_dma_callback(void *data) | |||
330 | struct at91_twi_dev *dev = (struct at91_twi_dev *)data; | 388 | struct at91_twi_dev *dev = (struct at91_twi_dev *)data; |
331 | unsigned ier = AT91_TWI_TXCOMP; | 389 | unsigned ier = AT91_TWI_TXCOMP; |
332 | 390 | ||
333 | dma_unmap_single(dev->dev, sg_dma_address(&dev->dma.sg), | 391 | dma_unmap_single(dev->dev, sg_dma_address(&dev->dma.sg[0]), |
334 | dev->buf_len, DMA_FROM_DEVICE); | 392 | dev->buf_len, DMA_FROM_DEVICE); |
335 | 393 | ||
336 | if (!dev->pdata->has_alt_cmd) { | 394 | if (!dev->pdata->has_alt_cmd) { |
@@ -362,10 +420,24 @@ static void at91_twi_read_data_dma(struct at91_twi_dev *dev) | |||
362 | } | 420 | } |
363 | dma->buf_mapped = true; | 421 | dma->buf_mapped = true; |
364 | at91_twi_irq_restore(dev); | 422 | at91_twi_irq_restore(dev); |
365 | dma->sg.dma_address = dma_addr; | ||
366 | sg_dma_len(&dma->sg) = buf_len; | ||
367 | 423 | ||
368 | rxdesc = dmaengine_prep_slave_sg(chan_rx, &dma->sg, 1, DMA_DEV_TO_MEM, | 424 | if (dev->fifo_size && IS_ALIGNED(buf_len, 4)) { |
425 | unsigned fifo_mr; | ||
426 | |||
427 | /* | ||
428 | * DMA controller is triggered when at least 4 data can be | ||
429 | * read from the RX FIFO | ||
430 | */ | ||
431 | fifo_mr = at91_twi_read(dev, AT91_TWI_FMR); | ||
432 | fifo_mr &= ~AT91_TWI_FMR_RXRDYM_MASK; | ||
433 | fifo_mr |= AT91_TWI_FMR_RXRDYM(AT91_TWI_FOUR_DATA); | ||
434 | at91_twi_write(dev, AT91_TWI_FMR, fifo_mr); | ||
435 | } | ||
436 | |||
437 | sg_dma_len(&dma->sg[0]) = buf_len; | ||
438 | sg_dma_address(&dma->sg[0]) = dma_addr; | ||
439 | |||
440 | rxdesc = dmaengine_prep_slave_sg(chan_rx, dma->sg, 1, DMA_DEV_TO_MEM, | ||
369 | DMA_PREP_INTERRUPT | DMA_CTRL_ACK); | 441 | DMA_PREP_INTERRUPT | DMA_CTRL_ACK); |
370 | if (!rxdesc) { | 442 | if (!rxdesc) { |
371 | dev_err(dev->dev, "dma prep slave sg failed\n"); | 443 | dev_err(dev->dev, "dma prep slave sg failed\n"); |
@@ -465,6 +537,21 @@ static int at91_do_twi_transfer(struct at91_twi_dev *dev) | |||
465 | reinit_completion(&dev->cmd_complete); | 537 | reinit_completion(&dev->cmd_complete); |
466 | dev->transfer_status = 0; | 538 | dev->transfer_status = 0; |
467 | 539 | ||
540 | if (dev->fifo_size) { | ||
541 | unsigned fifo_mr = at91_twi_read(dev, AT91_TWI_FMR); | ||
542 | |||
543 | /* Reset FIFO mode register */ | ||
544 | fifo_mr &= ~(AT91_TWI_FMR_TXRDYM_MASK | | ||
545 | AT91_TWI_FMR_RXRDYM_MASK); | ||
546 | fifo_mr |= AT91_TWI_FMR_TXRDYM(AT91_TWI_ONE_DATA); | ||
547 | fifo_mr |= AT91_TWI_FMR_RXRDYM(AT91_TWI_ONE_DATA); | ||
548 | at91_twi_write(dev, AT91_TWI_FMR, fifo_mr); | ||
549 | |||
550 | /* Flush FIFOs */ | ||
551 | at91_twi_write(dev, AT91_TWI_CR, | ||
552 | AT91_TWI_THRCLR | AT91_TWI_RHRCLR); | ||
553 | } | ||
554 | |||
468 | if (!dev->buf_len) { | 555 | if (!dev->buf_len) { |
469 | at91_twi_write(dev, AT91_TWI_CR, AT91_TWI_QUICK); | 556 | at91_twi_write(dev, AT91_TWI_CR, AT91_TWI_QUICK); |
470 | at91_twi_write(dev, AT91_TWI_IER, AT91_TWI_TXCOMP); | 557 | at91_twi_write(dev, AT91_TWI_IER, AT91_TWI_TXCOMP); |
@@ -536,7 +623,8 @@ static int at91_do_twi_transfer(struct at91_twi_dev *dev) | |||
536 | ret = -EIO; | 623 | ret = -EIO; |
537 | goto error; | 624 | goto error; |
538 | } | 625 | } |
539 | if (has_alt_cmd && (dev->transfer_status & AT91_TWI_LOCK)) { | 626 | if ((has_alt_cmd || dev->fifo_size) && |
627 | (dev->transfer_status & AT91_TWI_LOCK)) { | ||
540 | dev_err(dev->dev, "tx locked\n"); | 628 | dev_err(dev->dev, "tx locked\n"); |
541 | ret = -EIO; | 629 | ret = -EIO; |
542 | goto error; | 630 | goto error; |
@@ -555,7 +643,8 @@ error: | |||
555 | /* first stop DMA transfer if still in progress */ | 643 | /* first stop DMA transfer if still in progress */ |
556 | at91_twi_dma_cleanup(dev); | 644 | at91_twi_dma_cleanup(dev); |
557 | /* then flush THR/FIFO and unlock TX if locked */ | 645 | /* then flush THR/FIFO and unlock TX if locked */ |
558 | if (has_alt_cmd && (dev->transfer_status & AT91_TWI_LOCK)) { | 646 | if ((has_alt_cmd || dev->fifo_size) && |
647 | (dev->transfer_status & AT91_TWI_LOCK)) { | ||
559 | dev_dbg(dev->dev, "unlock tx\n"); | 648 | dev_dbg(dev->dev, "unlock tx\n"); |
560 | at91_twi_write(dev, AT91_TWI_CR, | 649 | at91_twi_write(dev, AT91_TWI_CR, |
561 | AT91_TWI_THRCLR | AT91_TWI_LOCKCLR); | 650 | AT91_TWI_THRCLR | AT91_TWI_LOCKCLR); |
@@ -750,13 +839,32 @@ static int at91_twi_configure_dma(struct at91_twi_dev *dev, u32 phy_addr) | |||
750 | int ret = 0; | 839 | int ret = 0; |
751 | struct dma_slave_config slave_config; | 840 | struct dma_slave_config slave_config; |
752 | struct at91_twi_dma *dma = &dev->dma; | 841 | struct at91_twi_dma *dma = &dev->dma; |
842 | enum dma_slave_buswidth addr_width = DMA_SLAVE_BUSWIDTH_1_BYTE; | ||
843 | |||
844 | /* | ||
845 | * The actual width of the access will be chosen in | ||
846 | * dmaengine_prep_slave_sg(): | ||
847 | * for each buffer in the scatter-gather list, if its size is aligned | ||
848 | * to addr_width then addr_width accesses will be performed to transfer | ||
849 | * the buffer. On the other hand, if the buffer size is not aligned to | ||
850 | * addr_width then the buffer is transferred using single byte accesses. | ||
851 | * Please refer to the Atmel eXtended DMA controller driver. | ||
852 | * When FIFOs are used, the TXRDYM threshold can always be set to | ||
853 | * trigger the XDMAC when at least 4 data can be written into the TX | ||
854 | * FIFO, even if single byte accesses are performed. | ||
855 | * However the RXRDYM threshold must be set to fit the access width, | ||
856 | * deduced from buffer length, so the XDMAC is triggered properly to | ||
857 | * read data from the RX FIFO. | ||
858 | */ | ||
859 | if (dev->fifo_size) | ||
860 | addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES; | ||
753 | 861 | ||
754 | memset(&slave_config, 0, sizeof(slave_config)); | 862 | memset(&slave_config, 0, sizeof(slave_config)); |
755 | slave_config.src_addr = (dma_addr_t)phy_addr + AT91_TWI_RHR; | 863 | slave_config.src_addr = (dma_addr_t)phy_addr + AT91_TWI_RHR; |
756 | slave_config.src_addr_width = DMA_SLAVE_BUSWIDTH_1_BYTE; | 864 | slave_config.src_addr_width = addr_width; |
757 | slave_config.src_maxburst = 1; | 865 | slave_config.src_maxburst = 1; |
758 | slave_config.dst_addr = (dma_addr_t)phy_addr + AT91_TWI_THR; | 866 | slave_config.dst_addr = (dma_addr_t)phy_addr + AT91_TWI_THR; |
759 | slave_config.dst_addr_width = DMA_SLAVE_BUSWIDTH_1_BYTE; | 867 | slave_config.dst_addr_width = addr_width; |
760 | slave_config.dst_maxburst = 1; | 868 | slave_config.dst_maxburst = 1; |
761 | slave_config.device_fc = false; | 869 | slave_config.device_fc = false; |
762 | 870 | ||
@@ -788,7 +896,7 @@ static int at91_twi_configure_dma(struct at91_twi_dev *dev, u32 phy_addr) | |||
788 | goto error; | 896 | goto error; |
789 | } | 897 | } |
790 | 898 | ||
791 | sg_init_table(&dma->sg, 1); | 899 | sg_init_table(dma->sg, 2); |
792 | dma->buf_mapped = false; | 900 | dma->buf_mapped = false; |
793 | dma->xfer_in_progress = false; | 901 | dma->xfer_in_progress = false; |
794 | dev->use_dma = true; | 902 | dev->use_dma = true; |
@@ -874,6 +982,11 @@ static int at91_twi_probe(struct platform_device *pdev) | |||
874 | return rc; | 982 | return rc; |
875 | } | 983 | } |
876 | 984 | ||
985 | if (!of_property_read_u32(pdev->dev.of_node, "atmel,fifo-size", | ||
986 | &dev->fifo_size)) { | ||
987 | dev_info(dev->dev, "Using FIFO (%u data)\n", dev->fifo_size); | ||
988 | } | ||
989 | |||
877 | rc = of_property_read_u32(dev->dev->of_node, "clock-frequency", | 990 | rc = of_property_read_u32(dev->dev->of_node, "clock-frequency", |
878 | &bus_clk_rate); | 991 | &bus_clk_rate); |
879 | if (rc) | 992 | if (rc) |