Lines Matching refs:dev

32 void at91_init_twi_bus_master(struct at91_twi_dev *dev)  in at91_init_twi_bus_master()  argument
35 if (dev->fifo_size) in at91_init_twi_bus_master()
36 at91_twi_write(dev, AT91_TWI_CR, AT91_TWI_FIFOEN); in at91_init_twi_bus_master()
37 at91_twi_write(dev, AT91_TWI_CR, AT91_TWI_MSEN); in at91_init_twi_bus_master()
38 at91_twi_write(dev, AT91_TWI_CR, AT91_TWI_SVDIS); in at91_init_twi_bus_master()
39 at91_twi_write(dev, AT91_TWI_CWGR, dev->twi_cwgr_reg); in at91_init_twi_bus_master()
46 static void at91_calc_twi_clock(struct at91_twi_dev *dev) in at91_calc_twi_clock() argument
49 struct at91_twi_pdata *pdata = dev->pdata; in at91_calc_twi_clock()
54 i2c_parse_fw_timings(dev->dev, t, true); in at91_calc_twi_clock()
56 div = max(0, (int)DIV_ROUND_UP(clk_get_rate(dev->clk), in at91_calc_twi_clock()
62 dev_warn(dev->dev, "%d exceeds ckdiv max value which is %d.\n", in at91_calc_twi_clock()
75 * (clk_get_rate(dev->clk) / 1000), 1000000); in at91_calc_twi_clock()
80 dev_warn(dev->dev, in at91_calc_twi_clock()
87 dev->twi_cwgr_reg = (ckdiv << 16) | (cdiv << 8) | cdiv in at91_calc_twi_clock()
90 dev_dbg(dev->dev, "cdiv %d ckdiv %d hold %d (%d ns)\n", in at91_calc_twi_clock()
94 static void at91_twi_dma_cleanup(struct at91_twi_dev *dev) in at91_twi_dma_cleanup() argument
96 struct at91_twi_dma *dma = &dev->dma; in at91_twi_dma_cleanup()
98 at91_twi_irq_save(dev); in at91_twi_dma_cleanup()
108 dma_unmap_single(dev->dev, sg_dma_address(&dma->sg[0]), in at91_twi_dma_cleanup()
109 dev->buf_len, dma->direction); in at91_twi_dma_cleanup()
113 at91_twi_irq_restore(dev); in at91_twi_dma_cleanup()
116 static void at91_twi_write_next_byte(struct at91_twi_dev *dev) in at91_twi_write_next_byte() argument
118 if (!dev->buf_len) in at91_twi_write_next_byte()
122 writeb_relaxed(*dev->buf, dev->base + AT91_TWI_THR); in at91_twi_write_next_byte()
125 if (--dev->buf_len == 0) { in at91_twi_write_next_byte()
126 if (!dev->use_alt_cmd) in at91_twi_write_next_byte()
127 at91_twi_write(dev, AT91_TWI_CR, AT91_TWI_STOP); in at91_twi_write_next_byte()
128 at91_twi_write(dev, AT91_TWI_IDR, AT91_TWI_TXRDY); in at91_twi_write_next_byte()
131 dev_dbg(dev->dev, "wrote 0x%x, to go %zu\n", *dev->buf, dev->buf_len); in at91_twi_write_next_byte()
133 ++dev->buf; in at91_twi_write_next_byte()
138 struct at91_twi_dev *dev = (struct at91_twi_dev *)data; in at91_twi_write_data_dma_callback() local
140 dma_unmap_single(dev->dev, sg_dma_address(&dev->dma.sg[0]), in at91_twi_write_data_dma_callback()
141 dev->buf_len, DMA_TO_DEVICE); in at91_twi_write_data_dma_callback()
150 at91_twi_write(dev, AT91_TWI_IER, AT91_TWI_TXCOMP); in at91_twi_write_data_dma_callback()
151 if (!dev->use_alt_cmd) in at91_twi_write_data_dma_callback()
152 at91_twi_write(dev, AT91_TWI_CR, AT91_TWI_STOP); in at91_twi_write_data_dma_callback()
155 static void at91_twi_write_data_dma(struct at91_twi_dev *dev) in at91_twi_write_data_dma() argument
159 struct at91_twi_dma *dma = &dev->dma; in at91_twi_write_data_dma()
163 if (!dev->buf_len) in at91_twi_write_data_dma()
168 at91_twi_irq_save(dev); in at91_twi_write_data_dma()
169 dma_addr = dma_map_single(dev->dev, dev->buf, dev->buf_len, in at91_twi_write_data_dma()
171 if (dma_mapping_error(dev->dev, dma_addr)) { in at91_twi_write_data_dma()
172 dev_err(dev->dev, "dma map failed\n"); in at91_twi_write_data_dma()
176 at91_twi_irq_restore(dev); in at91_twi_write_data_dma()
178 if (dev->fifo_size) { in at91_twi_write_data_dma()
185 part1_len = dev->buf_len & ~0x3; in at91_twi_write_data_dma()
192 part2_len = dev->buf_len & 0x3; in at91_twi_write_data_dma()
203 fifo_mr = at91_twi_read(dev, AT91_TWI_FMR); in at91_twi_write_data_dma()
206 at91_twi_write(dev, AT91_TWI_FMR, fifo_mr); in at91_twi_write_data_dma()
208 sg_dma_len(&dma->sg[0]) = dev->buf_len; in at91_twi_write_data_dma()
216 dev_err(dev->dev, "dma prep slave sg failed\n"); in at91_twi_write_data_dma()
221 txdesc->callback_param = dev; in at91_twi_write_data_dma()
230 at91_twi_dma_cleanup(dev); in at91_twi_write_data_dma()
233 static void at91_twi_read_next_byte(struct at91_twi_dev *dev) in at91_twi_read_next_byte() argument
239 if (!dev->buf_len) { in at91_twi_read_next_byte()
240 at91_twi_read(dev, AT91_TWI_RHR); in at91_twi_read_next_byte()
245 *dev->buf = readb_relaxed(dev->base + AT91_TWI_RHR); in at91_twi_read_next_byte()
246 --dev->buf_len; in at91_twi_read_next_byte()
249 if (dev->recv_len_abort) in at91_twi_read_next_byte()
253 if (unlikely(dev->msg->flags & I2C_M_RECV_LEN)) { in at91_twi_read_next_byte()
255 if (*dev->buf <= I2C_SMBUS_BLOCK_MAX && *dev->buf > 0) { in at91_twi_read_next_byte()
256 dev->msg->flags &= ~I2C_M_RECV_LEN; in at91_twi_read_next_byte()
257 dev->buf_len += *dev->buf; in at91_twi_read_next_byte()
258 dev->msg->len = dev->buf_len + 1; in at91_twi_read_next_byte()
259 dev_dbg(dev->dev, "received block length %zu\n", in at91_twi_read_next_byte()
260 dev->buf_len); in at91_twi_read_next_byte()
263 dev->recv_len_abort = true; in at91_twi_read_next_byte()
264 dev->buf_len = 1; in at91_twi_read_next_byte()
269 if (!dev->use_alt_cmd && dev->buf_len == 1) in at91_twi_read_next_byte()
270 at91_twi_write(dev, AT91_TWI_CR, AT91_TWI_STOP); in at91_twi_read_next_byte()
272 dev_dbg(dev->dev, "read 0x%x, to go %zu\n", *dev->buf, dev->buf_len); in at91_twi_read_next_byte()
274 ++dev->buf; in at91_twi_read_next_byte()
279 struct at91_twi_dev *dev = (struct at91_twi_dev *)data; in at91_twi_read_data_dma_callback() local
282 dma_unmap_single(dev->dev, sg_dma_address(&dev->dma.sg[0]), in at91_twi_read_data_dma_callback()
283 dev->buf_len, DMA_FROM_DEVICE); in at91_twi_read_data_dma_callback()
285 if (!dev->use_alt_cmd) { in at91_twi_read_data_dma_callback()
287 dev->buf += dev->buf_len - 2; in at91_twi_read_data_dma_callback()
288 dev->buf_len = 2; in at91_twi_read_data_dma_callback()
291 at91_twi_write(dev, AT91_TWI_IER, ier); in at91_twi_read_data_dma_callback()
294 static void at91_twi_read_data_dma(struct at91_twi_dev *dev) in at91_twi_read_data_dma() argument
298 struct at91_twi_dma *dma = &dev->dma; in at91_twi_read_data_dma()
302 buf_len = (dev->use_alt_cmd) ? dev->buf_len : dev->buf_len - 2; in at91_twi_read_data_dma()
306 at91_twi_irq_save(dev); in at91_twi_read_data_dma()
307 dma_addr = dma_map_single(dev->dev, dev->buf, buf_len, DMA_FROM_DEVICE); in at91_twi_read_data_dma()
308 if (dma_mapping_error(dev->dev, dma_addr)) { in at91_twi_read_data_dma()
309 dev_err(dev->dev, "dma map failed\n"); in at91_twi_read_data_dma()
313 at91_twi_irq_restore(dev); in at91_twi_read_data_dma()
315 if (dev->fifo_size && IS_ALIGNED(buf_len, 4)) { in at91_twi_read_data_dma()
322 fifo_mr = at91_twi_read(dev, AT91_TWI_FMR); in at91_twi_read_data_dma()
325 at91_twi_write(dev, AT91_TWI_FMR, fifo_mr); in at91_twi_read_data_dma()
334 dev_err(dev->dev, "dma prep slave sg failed\n"); in at91_twi_read_data_dma()
339 rxdesc->callback_param = dev; in at91_twi_read_data_dma()
348 at91_twi_dma_cleanup(dev); in at91_twi_read_data_dma()
353 struct at91_twi_dev *dev = dev_id; in atmel_twi_interrupt() local
354 const unsigned status = at91_twi_read(dev, AT91_TWI_SR); in atmel_twi_interrupt()
355 const unsigned irqstatus = status & at91_twi_read(dev, AT91_TWI_IMR); in atmel_twi_interrupt()
382 at91_twi_read_next_byte(dev); in atmel_twi_interrupt()
383 } while (at91_twi_read(dev, AT91_TWI_SR) & AT91_TWI_RXRDY); in atmel_twi_interrupt()
425 at91_disable_twi_interrupts(dev); in atmel_twi_interrupt()
426 complete(&dev->cmd_complete); in atmel_twi_interrupt()
428 at91_twi_write_next_byte(dev); in atmel_twi_interrupt()
432 dev->transfer_status |= status; in atmel_twi_interrupt()
437 static int at91_do_twi_transfer(struct at91_twi_dev *dev) in at91_do_twi_transfer() argument
441 bool has_unre_flag = dev->pdata->has_unre_flag; in at91_do_twi_transfer()
442 bool has_alt_cmd = dev->pdata->has_alt_cmd; in at91_do_twi_transfer()
487 dev_dbg(dev->dev, "transfer: %s %zu bytes.\n", in at91_do_twi_transfer()
488 (dev->msg->flags & I2C_M_RD) ? "read" : "write", dev->buf_len); in at91_do_twi_transfer()
490 reinit_completion(&dev->cmd_complete); in at91_do_twi_transfer()
491 dev->transfer_status = 0; in at91_do_twi_transfer()
494 at91_twi_read(dev, AT91_TWI_SR); in at91_do_twi_transfer()
496 if (dev->fifo_size) { in at91_do_twi_transfer()
497 unsigned fifo_mr = at91_twi_read(dev, AT91_TWI_FMR); in at91_do_twi_transfer()
504 at91_twi_write(dev, AT91_TWI_FMR, fifo_mr); in at91_do_twi_transfer()
507 at91_twi_write(dev, AT91_TWI_CR, in at91_do_twi_transfer()
511 if (!dev->buf_len) { in at91_do_twi_transfer()
512 at91_twi_write(dev, AT91_TWI_CR, AT91_TWI_QUICK); in at91_do_twi_transfer()
513 at91_twi_write(dev, AT91_TWI_IER, AT91_TWI_TXCOMP); in at91_do_twi_transfer()
514 } else if (dev->msg->flags & I2C_M_RD) { in at91_do_twi_transfer()
518 if (!dev->use_alt_cmd && dev->buf_len <= 1 && in at91_do_twi_transfer()
519 !(dev->msg->flags & I2C_M_RECV_LEN)) in at91_do_twi_transfer()
521 at91_twi_write(dev, AT91_TWI_CR, start_flags); in at91_do_twi_transfer()
531 if (dev->use_dma && (dev->buf_len > AT91_I2C_DMA_THRESHOLD)) { in at91_do_twi_transfer()
532 at91_twi_write(dev, AT91_TWI_IER, AT91_TWI_NACK); in at91_do_twi_transfer()
533 at91_twi_read_data_dma(dev); in at91_do_twi_transfer()
535 at91_twi_write(dev, AT91_TWI_IER, in at91_do_twi_transfer()
541 if (dev->use_dma && (dev->buf_len > AT91_I2C_DMA_THRESHOLD)) { in at91_do_twi_transfer()
542 at91_twi_write(dev, AT91_TWI_IER, AT91_TWI_NACK); in at91_do_twi_transfer()
543 at91_twi_write_data_dma(dev); in at91_do_twi_transfer()
545 at91_twi_write_next_byte(dev); in at91_do_twi_transfer()
546 at91_twi_write(dev, AT91_TWI_IER, in at91_do_twi_transfer()
548 (dev->buf_len ? AT91_TWI_TXRDY : 0)); in at91_do_twi_transfer()
552 time_left = wait_for_completion_timeout(&dev->cmd_complete, in at91_do_twi_transfer()
553 dev->adapter.timeout); in at91_do_twi_transfer()
555 dev->transfer_status |= at91_twi_read(dev, AT91_TWI_SR); in at91_do_twi_transfer()
556 dev_err(dev->dev, "controller timed out\n"); in at91_do_twi_transfer()
557 at91_init_twi_bus(dev); in at91_do_twi_transfer()
561 if (dev->transfer_status & AT91_TWI_NACK) { in at91_do_twi_transfer()
562 dev_dbg(dev->dev, "received nack\n"); in at91_do_twi_transfer()
566 if (dev->transfer_status & AT91_TWI_OVRE) { in at91_do_twi_transfer()
567 dev_err(dev->dev, "overrun while reading\n"); in at91_do_twi_transfer()
571 if (has_unre_flag && dev->transfer_status & AT91_TWI_UNRE) { in at91_do_twi_transfer()
572 dev_err(dev->dev, "underrun while writing\n"); in at91_do_twi_transfer()
576 if ((has_alt_cmd || dev->fifo_size) && in at91_do_twi_transfer()
577 (dev->transfer_status & AT91_TWI_LOCK)) { in at91_do_twi_transfer()
578 dev_err(dev->dev, "tx locked\n"); in at91_do_twi_transfer()
582 if (dev->recv_len_abort) { in at91_do_twi_transfer()
583 dev_err(dev->dev, "invalid smbus block length recvd\n"); in at91_do_twi_transfer()
588 dev_dbg(dev->dev, "transfer complete\n"); in at91_do_twi_transfer()
594 at91_twi_dma_cleanup(dev); in at91_do_twi_transfer()
596 if ((has_alt_cmd || dev->fifo_size) && in at91_do_twi_transfer()
597 (dev->transfer_status & AT91_TWI_LOCK)) { in at91_do_twi_transfer()
598 dev_dbg(dev->dev, "unlock tx\n"); in at91_do_twi_transfer()
599 at91_twi_write(dev, AT91_TWI_CR, in at91_do_twi_transfer()
607 struct at91_twi_dev *dev = i2c_get_adapdata(adap); in at91_twi_xfer() local
613 dev_dbg(&adap->dev, "at91_xfer: processing %d messages:\n", num); in at91_twi_xfer()
615 ret = pm_runtime_get_sync(dev->dev); in at91_twi_xfer()
631 at91_twi_write(dev, AT91_TWI_IADR, internal_address); in at91_twi_xfer()
634 dev->use_alt_cmd = false; in at91_twi_xfer()
636 if (dev->pdata->has_alt_cmd) { in at91_twi_xfer()
639 at91_twi_write(dev, AT91_TWI_CR, AT91_TWI_ACMEN); in at91_twi_xfer()
640 at91_twi_write(dev, AT91_TWI_ACR, in at91_twi_xfer()
643 dev->use_alt_cmd = true; in at91_twi_xfer()
645 at91_twi_write(dev, AT91_TWI_CR, AT91_TWI_ACMDIS); in at91_twi_xfer()
649 at91_twi_write(dev, AT91_TWI_MMR, in at91_twi_xfer()
652 ((!dev->use_alt_cmd && is_read) ? AT91_TWI_MREAD : 0)); in at91_twi_xfer()
654 dev->buf_len = m_start->len; in at91_twi_xfer()
655 dev->buf = m_start->buf; in at91_twi_xfer()
656 dev->msg = m_start; in at91_twi_xfer()
657 dev->recv_len_abort = false; in at91_twi_xfer()
659 ret = at91_do_twi_transfer(dev); in at91_twi_xfer()
663 pm_runtime_mark_last_busy(dev->dev); in at91_twi_xfer()
664 pm_runtime_put_autosuspend(dev->dev); in at91_twi_xfer()
689 static int at91_twi_configure_dma(struct at91_twi_dev *dev, u32 phy_addr) in at91_twi_configure_dma() argument
693 struct at91_twi_dma *dma = &dev->dma; in at91_twi_configure_dma()
711 if (dev->fifo_size) in at91_twi_configure_dma()
723 dma->chan_tx = dma_request_slave_channel_reason(dev->dev, "tx"); in at91_twi_configure_dma()
730 dma->chan_rx = dma_request_slave_channel_reason(dev->dev, "rx"); in at91_twi_configure_dma()
739 dev_err(dev->dev, "failed to configure tx channel\n"); in at91_twi_configure_dma()
746 dev_err(dev->dev, "failed to configure rx channel\n"); in at91_twi_configure_dma()
754 dev->use_dma = true; in at91_twi_configure_dma()
756 dev_info(dev->dev, "using %s (tx) and %s (rx) for DMA transfers\n", in at91_twi_configure_dma()
763 dev_info(dev->dev, "can't get DMA channel, continue without DMA support\n"); in at91_twi_configure_dma()
772 u32 phy_addr, struct at91_twi_dev *dev) in at91_twi_probe_master() argument
776 init_completion(&dev->cmd_complete); in at91_twi_probe_master()
778 rc = devm_request_irq(&pdev->dev, dev->irq, atmel_twi_interrupt, 0, in at91_twi_probe_master()
779 dev_name(dev->dev), dev); in at91_twi_probe_master()
781 dev_err(dev->dev, "Cannot get irq %d: %d\n", dev->irq, rc); in at91_twi_probe_master()
785 if (dev->dev->of_node) { in at91_twi_probe_master()
786 rc = at91_twi_configure_dma(dev, phy_addr); in at91_twi_probe_master()
791 if (!of_property_read_u32(pdev->dev.of_node, "atmel,fifo-size", in at91_twi_probe_master()
792 &dev->fifo_size)) { in at91_twi_probe_master()
793 dev_info(dev->dev, "Using FIFO (%u data)\n", dev->fifo_size); in at91_twi_probe_master()
796 at91_calc_twi_clock(dev); in at91_twi_probe_master()
798 dev->adapter.algo = &at91_twi_algorithm; in at91_twi_probe_master()
799 dev->adapter.quirks = &at91_twi_quirks; in at91_twi_probe_master()